Last Updated: 09/07/2024

1 Course Title

PSY:3170 – Fantasy Football: Predictive Analytics and Empiricism (Fall 2025)

2 Course Meeting Time and Place

INSERT

3 Course Website

https://icon.uiowa.edu

To access the course site, log into Iowa Courses Online (ICON) using your Hawk ID and password.

4 Course Home

The College of Liberal Arts and Sciences (CLAS) is the home of this course, and CLAS governs the add and drop deadlines, academic misconduct policies, and other policies and procedures. Other UI colleges may have different policies.

5 Instructor Contact Information

Professor Petersen
Office: 175 Psychological and Brain Sciences Building (PBSB)
E-mail: isaac-t-petersen@uiowa.edu
Office Phone: 467-1014
Student drop-in hours: INSERT
Note: I’m here to help you learn and succeed. Please come to my office hours to ask questions about course material, assignments, exams, or professional development (career-related issues), for instance. I welcome you to discuss any concerns you might have about the class. I am also available to meet with you by appointment, although I would appreciate your making every effort to see me during office hours. The best way to reach me outside of class is by email.

6 Departmental Resources

Department of Psychological and Brain Sciences: https://psychology.uiowa.edu
Department of Psychological and Brain Sciences Main Office: G60 Psychological and Brain Sciences Building (335-2406)
Coordinator of Undergraduate Studies: Professor Windschitl (paul-windschitl@uiowa.edu; 335-3681)
Academic Coordinator: Janeil Page-Jamison (janeil-page@uiowa.edu; 384-3657)
Chair of Department: Professor Blumberg (mark-blumberg@uiowa.edu; 335-2424)

7 Prerequisites

The Department of Psychological and Brain Sciences has a hierarchical course structure that requires students to complete certain prerequisite courses before taking upper-level courses. This course requires successful completion (C- or higher) of any of the following statistics courses (or AP Statistics from high school): PSY 2811, PSQF 1020, PSQF 4143, STAT 1010, STAT 1015, STAT 1020, STAT 1030, STAT 3510, STAT 4143 The department will check student records to ensure completion of course prerequisites.

Any of the following courses with a minimum grade of C- (or AP stats from high school): PSY 2811, PSQF 1020, PSQF 4143, STAT 1010, STAT 1015, STAT 1020, STAT 1030, STAT 3510, STAT 4143

8 Description of Course

How can we use information to make predictions about uncertain events? This course is about empiricism (basing theories on observed data) and judgment, prediction, and decision making in the context of uncertainty. Students will be introduced to modern analytical techniques used to make informed predictions, test theories, and draw conclusions from a given dataset. But this is no ordinary course…

Rather than memorizing these empirical approaches in abstraction, students will employ these methods in the active, immersive, hands-on learning laboratory of Fantasy Football. In this way, the course will weave together two contiguous threads: an introductory overview of data analysis techniques, and a captivating application of these techniques through a semester-long experience in Fantasy Football with their classmates.1

The class involves reading primary source material, applying statistical programming (using R software), conducting data analysis, and composing written work on a weekly basis.

To be clear, this is a statistics and empiricism course. It merely uses fantasy football as a lens and application through which to learn about statistics and empiricism. The class does not assume that students know anything about (or care about) football or fantasy football. The class is welcome to all, assuming the student meets the prerequisites and that they are interested in learning about empiricism (basing theories on observed data), statistics, and judgment, prediction, and decision making in the context of uncertainty.

Take this class if:

  • you want to learn more advanced skills in 1) empiricism, 2) statistics, 3) programming (using R software), and 4) judgment, prediction, and decision making in the context of uncertainty;
  • you are interested in learning statistics through the lens of a fun sports domain (fantasy football); or
  • you are interested in applying psychological and statistical concepts to fantasy football, to gain a strong understanding of critical thinking and decision making in sports.

Do not take this class if:

  • you are just looking for an “easy” class (the class is not easy);
  • you are reluctant to examine fantasy football topics in a scientific manner;
  • you do not want to write public blog articles as part of the class; or
  • you do not want to learn statistics and programming, and do not want to persist through inevitable challenges along the way.

8.1 What is Fantasy Football? And Why Focus on Fantasy Football?

Fantasy football is an online game where participants assemble (i.e., “draft”) imaginary teams composed of real-life National Football League (NFL) players. In the game of fantasy football, participants compete against others, accumulating “fantasy” points based on players’ actual statistical performances in games (and the goal is to outscore one’s opponent each week to win matches and ultimately claim victory in the league). Fantasy football relies heavily on prediction—trying to predict which players will perform best and selecting them accordingly. In this way, fantasy football provides a plethora of decision making opportunities in the face of uncertainty, and a wealth of data for analyzing these decisions. However, unlike many other applied domains in psychology, fantasy football (1) allows a person to see the accuracy of their predictions on a timely basis and (2) provides a safe environment for friendly competition. Thus, it provides a unique domain to evaluate—and improve—the accuracy of various prediction models.

9 Learning Objectives

By the end of the course, successful students will be able to:

  • Apply empirical inference and appreciate the value it provides over speculative supposition.
  • Ask educated questions when confronted with decisions in the face of uncertainty.
  • Understand human decision making, including common heuristics and cognitive biases and how to mitigate them analytically.
  • Engage in critical thinking about causality, including devising plausible alternative explanations for observed effects.
  • Understand causal inference including confounding, causal pathways, and counterfactuals.
  • Think empirically about human behavior and performance.
  • Describe the strengths and weaknesses of humans versus computers in prediction scenarios.
  • Apply basic skills in statistical programming using R to manipulate and summarize datasets and to conduct data analysis.
  • Critically evaluate the strengths and limitations of different statistical models and methodologies used in predicting uncertain events, enhancing their understanding of statistical inference and model selection.
  • Use various analytical techniques for predicting the outcome of uncertain events, and for uncovering latent causes of patterns in observed data.
  • Interpret findings from various statistical approaches and evaluate the accuracy of predictions.
  • Engage in iterative problem-solving processes, refining analytical approaches based on feedback and outcomes, and adapting strategies accordingly.
  • Communicate statistical findings and analyses in both written and oral formats, demonstrating proficiency in presenting complex information to diverse audiences.
  • Make sense of big data.
  • Use practical analytical skills that can be applied in future research and job settings.

10 Textbook

The cost of textbooks has become so high that I do not feel comfortable requiring students to purchase a textbook. Thus, I created a textbook for this course. The textbook for this course is available for free online: https://isaactpetersen.github.io/Fantasy-Football-Analytics-Textbook

11 Required Materials

For the class, you will be required to have access to a computer that allows you to install and run software (including R, git, and GitHub Desktop). A laptop is preferable, so you can bring it to class and work through examples in class.

12 Academic Honesty and Misconduct

All students in CLAS courses are expected to abide by the college’s standards of academic honesty. Academic misconduct must be reported by instructors to CLAS according to these procedures. Please note that collaboration with other classmates on quizzes, writing assignments, and during exams is not permitted. However, I do encourage you to collaborate with classmates to to learn R, statistics, and programming, and to prepare for exams (e.g., informal study groups). Because writing, analytical, and critical thinking skills are part of the learning outcomes of this course, all work submitted by students should be prepared by the student. Developing strong competencies in these domains will prepare you for a competitive workplace. Therefore, AI-generated submissions are not permitted and will be treated as plagiarism.

13 Course Requirements and Policies

13.1 Lecture

We will meet two times weekly for lectures, at the time and location described above. My powerpoint presentations for the lectures will be posted on ICON no later than noon on the day before the lecture (though I may continue to refine the slides up until the time of lecture). Please note: powerpoint presentations are an outline of my points. It is your responsibility to take notes during class. If you have questions about the lecture notes or need clarification of any of the points, please ask in class or meet with Professor Petersen during office hours. If you miss a lecture, get and review notes with a peer and watch the lecture recording. Then, come to office hours if you have specific questions.

13.1.1 Lecture Recordings

My intention is to record lectures so that you may review them. Recorded lectures will be posted on the “UICapture” tab in ICON. However, please do not count on recordings being available, in case I accidentally forget to initiate the recording or there is a technical malfunction.

13.2 Attendance and Participation

Attendance at lectures is required and will be factored into final grades (see grading section below). There are 29 lectures during the semester (excluding the examinations). You will receive one point for attendance at each lecture up to 27 points (i.e., you will not receive extra credit for attending all 29 lectures). Thus, you will not be penalized for missing up to 2 lectures. However, you will be responsible for learning any material missed for quizzes and exams, and I strongly encourage you to attend all lectures. Poor lecture attendance is likely to affect the quality of students’ work and success in the course.

Students who miss more than 2 lectures due to participation in University activities must give the instructor a statement before the absence signed by a responsible official that specifies the dates and times the student will miss class. Authorized activities include participation in athletic teams, the marching band or pep band, debate teams, and other recognized University groups, as well as participation in University field trips, service with the National Guard, and jury duty. Absences due to illnesses or emergencies (that go over 2 lectures) must be documented with the University of Iowa Absence Explanation Form and sent to Professor Petersen within 48 hours of the absence. Per university policy, if a student will be absent 5 or more consecutive days and the absence is due to illness or other emergency, please contact the Registrar Service Center at (319) 384-4300 or .

13.3 Blog Articles

As part of the class, you will post blog articles (see the course schedule for deadlines). The blog articles are public; do not take this course if you do not feel comfortable posting blog articles with your full name in a public forum. There will be a penalty of 20% for all blog articles turned in late. Your lowest score will be dropped. A blog article is not considered “submitted” until you (a) post the blog article so that it is live and publicly available, AND (b) submit the assignment on ICON with the URL link to your blog article. All blog articles should be submitted to ICON by 11:59 p.m. on the due date.

You are encouraged to submit your blog article well before the deadline. You can expect to run into technical issues (e.g., errors when running your code, issues getting the blog post to compile etc.). Thus, you should give yourself plenty of time to troubleshoot (see below) so that you can submit your blog article on time.

13.3.1 Troubleshooting

If you run into issues related to R, GitHub, or your code, I encourage you to try one (or more) of the following:

  • Perform a Google search for the error/issue
  • Ask a peer
  • Post on forums dedicated to R
  • Come to office hours

I am quite busy, and I appreciate your making every effort to solve the issue on your own or using one of the aforementioned ways before emailing me. I do not often respond to emails during evenings or weekends, and I cannot be expected to solve last-minute issues that you could have solved earlier.

13.4 Readings & Quizzes

Readings and other materials will be posted on ICON. You are expected to do the readings before class. You will have an online quiz on the readings to complete in ICON, on your own, before each lecture. The quizzes are meant to help you come to class prepared to contribute so you are best-positioned to learn and to help others learn. The quizzes are not timed (you can spend as much time as you need on each quiz up until the deadline). The deadline for each quiz is 30 minutes before class starts. Late responses and multiple submissions will not be accepted. Your lowest quiz score will be dropped. We will not accept excused absences for quizzes because (a) you have a week to complete the quiz (and can submit it at any point during that week), and (b) we drop your lowest quiz score. Each quiz will be weighted the same in the final grade. Quiz answers will be viewable at the end of the week (i.e., after the last discussion section has taken their quiz).

Past experience has shown that in order to do well in this class, you should read the required material, participate actively in class, and go over your notes each week. There is too much material being covered in this class to try to study only by frantic preparation immediately before exams. Note that lecture will not cover all relevant material for the course; you will be expected to know the required readings for exams.

13.5 Workload

This is a 3 semester hour course. Students should therefore expect to spend 6 additional hours per week (outside of class) reading the articles, reviewing material from lecture and discussion section, and preparing for quizzes and exams.

13.6 Examinations

There will be 2 exams; one mid-term exam and one non-cumulative final exam. Each exam will emphasize information presented for the half of the class that precedes it. However, some integration of information across sections will be required for questions on the second and third exams. The exams will include multiple-choice questions. Exam questions can come from any of the following sources: lectures or required readings. For suggested study tips for this class, meet with Professor Petersen during office hours.

13.6.1 Missing Exams

University regulations require that students be allowed to make up examinations that have been missed due to illness, religious holy days, military service obligations (including service-related medical appointments), or other unavoidable circumstances or University-sponsored activities. Students with UI-authorized activities must discuss their absences with the instructor as soon as possible. Religious obligations must be communicated within the first three weeks of classes. See below for the documentation necessary for an absence to be excused and to be eligible to take a make-up exam.

Students are allowed to make up exams that have been missed due to illness, mandatory religious observations, official University activities, or other unavoidable circumstances. Note: the format of the make-up exam may differ from the original exam. If you know that you must be away at the time of an exam for one of these reasons, Professor Petersen must be contacted in advance whenever possible to schedule a make-up exam. In order to take a make-up exam, you must provide acceptable documentation to be eligible to take it: including documentation for any report of illness; any other circumstances must be documented by the University of Iowa Absence Explanation Form and must be approved by Professor Petersen. In sum, to be eligible for a make-up exam, Professor Petersen must be contacted before the examination whenever possible, and you must send acceptable form of documentation to Professor Petersen.

14 Grading

Final grades will be assigned at the end of semester on the basis of your total percentage of points earned on exams, quizzes, attendance, and writing assignments, as detailed below. Grades will be assigned on an absolute scale (criterion-referenced grading); course grades will not be curved. Please note: As a matter of fairness to all students, I assign grades based on performance and do not negotiate grades. Final grades will be assigned based on the following ranges:

Grade Percent
A+ 97–100%
A 93–96
A- 90–92
B+ 87–89
B 83–86
B- 80–82
C+ 75–79
C 70–74
C- 65–69
D+ 60–64
D 55–59
D- 50–54
F < 50%

I round up from .5 when determining final grades. For example, a course percent of 79.50 would receive a B-, whereas a course percent of 79.49 would receive a C+.

15 Course Grades

Final course grades will be assessed based on your performance in the activities below. The relative contribution of each component to your final grade is as follows:

  • 25% Examination #1
  • 25% Examination #2 (administered only during the class’s Final Exam time slot)
  • 10% Attendance/Participation
  • 10% Reading Quizzes
  • 30% Writing Assignments

15.1 Extra Credit

I will give you 0.5 point extra credit if you 1) identify an issue in the course textbook that needs to be fixed or 2) make a specific suggestion for a way to improve the textbook and its usefulness to you or other students. For instance, to identify an issue that needs to be addressed, you could identify a typo, misspelling, grammatical issue, or (gasp), a mistake/error. To receive the extra credit, create a new issue in the textbook’s GitHub repository, and email me after doing so. I will give you an additional 0.5 point extra credit (for 1-point extra in total) if you implement the fixes/suggestions you specify. To receive the extra credit for implementing the fix/suggestion, create a pull request with your changes, and email me after doing so. For instructions regarding how to create a pull request, see here. If you are going to implement a change, I strongly encourage you to discuss with me before doing so, so I can verify that the change is worth implementing. I reserve the right to determine whether the “fix”, suggestion, or implementation warrants extra credit! The extra credit must be completed by the last day of class.

In addition, the winner(s) of the class fantasy football league will get 1 point extra credit. No additional extra-credit opportunities are available for this course.

16 Tentative Course Outline (exam dates fixed)

This is a tentative course outline. Changes will be discussed in class. There are 15 weeks in the semester, and class meets twice per week (30 sections). We will have one exam during the semester and one final exam during finals week.

Section Day Date Content Reading Assignment
1 T 08/26 Overview of Class; Overview of Fantasy Football Ch 1–2
2 Th 08/28 Statistical Programming: Using R for Statistical Analysis Ch 3
3 T 09/02 Player Evaluation Ch 6; Den Hartigh et al. (2018) Set up blog; post welcome article
4 Th 09/04 The Draft Ch 7; Lee & Liu (2022)
5 T 09/09 Statistical Programming in R Ch 4
6 Th 09/11 Basic Statistics Ch 8–9 Blog article 1 due!
7 T 09/16 Data Visualization and Interpretation Ch 5; Schwabish (2021)
8 Th 09/18 Correlation Analysis Ch 10; Goodwin & Leech (2006) Blog article 2 due!
9 T 09/23 Multiple Regression and Mixed Models Ch 11–12; Osborne & Waters (2002)
10 Th 09/25 Mixed Models Ch 13; Brauer & Kurtin (2018)
11 T 09/30 Causal Inference Ch 13; D’Onofrio et al. (2020) Blog article 3 due!
12 Th 10/02 Heuristics and Cognitive Biases in Prediction Ch 14; Tversky & Kahneman (1974)
13 T 10/07 Human Judgment vs Actuarial Approaches to Prediction Ch 15; Grove et al. (2000)
14 Th 10/09 Base Rates Ch 16 Blog article 4 due!
15 T 10/14 Midterm Exam
16 Th 10/16 Evaluation of Prediction/Forecasting Accuracy: Binary Classification Ch 17 (Section 17.1–17.16.5)
17 T 10/21 Evaluation of Prediction/Forecasting Accuracy: Binary Classification Ch 17 (Section 17.6.6–17.6.8)
18 Th 10/23 Evaluation of Prediction/Forecasting Accuracy: Continuous Outcomes Ch 17 (Section 17.7–end of chapter) Blog article 5 due!
19 T 10/28 Calibration Accuracy: Overconfidence Bias Kahneman & Tversky (1996); Massey & Thaler (2013)
20 Th 10/30 Machine Learning Ch 19 Blog article 6 due!
21 T 11/04 Mythbusters: Putting Fantasy Football Beliefs/Anecdotes to the Test Ch 18; White & Sheldon (2014)
22 Th 11/06 Modern Portfolio Theory Ch 20 Blog article 7 due!
23 T 11/11 Cluster Analysis Ch 21
24 Th 11/13 Factor Analysis Ch 22 Blog article 8 due!
25 T 11/18 Data Reduction: Principal Component Analysis Ch 23
26 Th 11/20 Simulation and the Monte Carlo Method Ch 24 Blog article 9 due!
11/24–11/27 FALL BREAK – NO CLASSES
27 T 12/02 Time Series Analysis Ch 25
28 Th 12/04 Decision Making in the Context of Uncertainty Ch 26; Larrick et al. (2024) Blog article 10 due!
29 T 12/09 Sports and Cognitive Psychology: Coaching and Risk Aversion Ch 27
30 Th 12/11 Sports and Cognitive Psychology: Psychological Factors in Player Performance; Expert Performance and Automaticity Ch 27 Blog article 11 due!
Finals Week TBD (week of 12/15) Final Exam

17 Date and Time of the Final Exam

The final examination date and time will be announced by the Registrar generally by the fifth week of classes, and it will be announced on the course ICON site once it is known. Do not plan your end of the semester travel plans until the final exam schedule is made public. It is your responsibility to know the date, time, and place of the final exam. According to Registrar’s final exam policy, students have a maximum of two weeks after the announced final exam schedule to request a change if an exam conflict exists or if a student has more than two exams in one day (see the policy here).

18 Course Resources

There are many course resources available to help you succeed in the class, including:

19 Drop Deadline for this Course

You may drop an individual course before the drop deadline; after this deadline you will need collegiate approval. You can look up the drop deadline for this course here. When you drop a course, a “W” will appear on your transcript. The mark of “W” is a neutral mark that does not affect your GPA. To discuss how dropping (or staying in) a course might affect your academic goals, please contact your Academic Advisor. Directions for adding or dropping a course and other registration changes can be found on the Registrar’s website. Students can find policies on dropping CLAS courses here. Students should adhere to the academic deadlines and policies set by the Graduate College.

20 Feedback about the Course

I welcome feedback at any point during the class. If you have comments on the class or my teaching, please feel free to meet with me during office hours.

20.1 Student Complaints

Students with a complaint about a grade or a related matter should first discuss the situation with the instructor, finally with the DEO (Chair) of the department, school or program offering the course. Sometimes students will be referred to the department or program’s Director of Undergraduate Studies (DUS) or Director of Graduate Studies (DGS). Students should contact CLAS Undergraduate Programs for support when the matter is not resolved at the previous level.

21 Communication: UI Email

Students are responsible for all official correspondences sent to their UI email address (uiowa.edu) and must use this address for any communication with instructors or staff in the UI community. For the privacy and the protection of student records, UI faculty and staff can only correspond with UI email addresses.

21.1 Other Expectations of Student Performance

Students have the right to a distraction-free learning environment. You have the responsibility to help create such a classroom environment. Please treat other students in the class and the instructor with respect. Students are expected to help each other learn and to contribute overall to the learning environment of the course. Arriving prepared for class is part of this expectation.

22 University Policies

University Policies

Accommodations for Students with Disabilities
The University is committed to providing an educational experience that is accessible to all students. If a student has a diagnosed disability or other disabling condition that may impact the student’s ability to complete the course requirements as stated in the syllabus, the student may seek accommodations through Student Disability Services (SDS). SDS is responsible for making Letters of Accommodation (LOA) available to the student. The student must provide an LOA to the instructor as early in the semester as possible, but requests not made at least two weeks prior to the scheduled activity for which an accommodation is sought may not be accommodated. The LOA will specify what reasonable course accommodations the student is eligible for and those the instructor should provide.

23 Where to Get Academic Support for This Course

24 Mental Health Resources and Student Support

Students are encouraged to be mindful of their mental health and seek help as a preventive measure or if feeling overwhelmed and/or struggling to meet course expectations. Students are encouraged to talk to their instructor for assistance with course-related concerns. For additional mental health support, please see the guidance and resources at mentalhealth.uiowa.edu, including the 24-7 UI Support and Crisis Line.

Additionally, the Office of the Dean of Students can help students navigate personal crisis situations. They can provide one-on-one support, help with identifying options, and access to basic needs resources (such as food, rent, childcare, etc.). Student Care and Assistance: 132 IMU, dos-assistance@uiowa.edu, or 319-335-1162 and more info: dos.uiowa.edu/assistance

If you feel that you or someone you know may be struggling with an academic, emotional, or psychological problem, the following organizations are available for assistance:

Service Contact Info
University of Iowa Academic Advising Center 353-5700, https://advisingcenter.uiowa.edu
University Counseling Services 335-7294, https://www.uiowa.edu/ucs
Student Health Service - Mental Health 335-8394, https://studenthealth.uiowa.edu/services/psychiatry
University of Iowa Hospitals and Clinics Adult Psychiatry Services Clinic 353-6314, https://www.uihealthcare.org/Psychiatry
Seashore Clinic (in the UI Department of Psychological and Brain Sciences) 335-2467, https://psychology.uiowa.edu/resources/seashore-clinic
Women’s Resource and Action Center 335-1486, https://wrac.uiowa.edu
Rape Victim Advocacy Program 319-335-6000 or 800-228-1625, https://www.uiowa.edu/~rvap
Office of Sexual Misconduct 319-335-6200, https://osmrc.uiowa.edu
CommUnity 855-325-4296, https://builtbycommunity.org/crisis
Community & Family Resources 351-4357, https://www.cfrhelps.org/

If you or someone you know is contemplating suicide, either call or text the Suicide and Crisis Lifeline at 988, or call 911.

25 Disclosures

I am the Owner of Fantasy Football Analytics, LLC, which operates https://fantasyfootballanalytics.net. I do not require or encourage students to use my website, and I do not promote or endorse any specific content or services offered by Fantasy Football Analytics.

26 Disclaimer

This material probably won’t win you fantasy football championships. You could take what we learn and apply it to fantasy football and you might become 5 percent more likely to win. Or… Consider the broader relevance of this. You could learn data analysis and figure out ways to apply it to other systems. And you could be making a six-figure salary within the next five years.” – Benjamin Motz, Ph.D.

This syllabus is subject to change. Any changes will be discussed in class, via email, and/or on ICON.


  1. Elements of this syllabus and course were borrowed and adapted (with permission) from a similar course by Benjamin Motz.↩︎

LS0tCnRpdGxlOiAiQ291cnNlIFN5bGxhYnVzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAiIikKYGBgCgpMYXN0IFVwZGF0ZWQ6IGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJW0vJWQvJVkiKWAKCiMgQ291cnNlIFRpdGxlIHsjdGl0bGV9CgpQU1k6MzE3MCDigJMgRmFudGFzeSBGb290YmFsbDogUHJlZGljdGl2ZSBBbmFseXRpY3MgYW5kIEVtcGlyaWNpc20gKEZhbGwgMjAyNSkKCiMgQ291cnNlIE1lZXRpbmcgVGltZSBhbmQgUGxhY2UgeyNsZWN0dXJlVGltZX0KCjxtYXJrPklOU0VSVDwvbWFyaz4KCiMgQ291cnNlIFdlYnNpdGUgeyN3ZWJzaXRlfQoKaHR0cHM6Ly9pY29uLnVpb3dhLmVkdQoKVG8gYWNjZXNzIHRoZSBjb3Vyc2Ugc2l0ZSwgbG9nIGludG8gW0lvd2EgQ291cnNlcyBPbmxpbmUgKElDT04pXShodHRwczovL2ljb24udWlvd2EuZWR1KSB1c2luZyB5b3VyIEhhd2sgSUQgYW5kIHBhc3N3b3JkLgoKIyBDb3Vyc2UgSG9tZSB7I2hvbWV9CgpUaGUgQ29sbGVnZSBvZiBMaWJlcmFsIEFydHMgYW5kIFNjaWVuY2VzIChDTEFTKSBpcyB0aGUgaG9tZSBvZiB0aGlzIGNvdXJzZSwgYW5kIENMQVMgZ292ZXJucyB0aGUgYWRkIGFuZCBkcm9wIGRlYWRsaW5lcywgYWNhZGVtaWMgbWlzY29uZHVjdCBwb2xpY2llcywgYW5kIG90aGVyIHBvbGljaWVzIGFuZCBwcm9jZWR1cmVzLgpPdGhlciBVSSBjb2xsZWdlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcG9saWNpZXMuCgojIEluc3RydWN0b3IgQ29udGFjdCBJbmZvcm1hdGlvbiB7I2luc3RydWN0b3J9CgpbUHJvZmVzc29yIFBldGVyc2VuXShodHRwczovL3BzeWNob2xvZ3kudWlvd2EuZWR1L3Blb3BsZS9pc2FhYy1wZXRlcnNlbilcCk9mZmljZTogMTc1IFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIEJ1aWxkaW5nIChQQlNCKVwKRS1tYWlsOiBbaXNhYWMtdC1wZXRlcnNlbkB1aW93YS5lZHVdKG1haWx0bzppc2FhYy10LXBldGVyc2VuQHVpb3dhLmVkdSlcCk9mZmljZSBQaG9uZTogNDY3LTEwMTRcClN0dWRlbnQgZHJvcC1pbiBob3VyczogPG1hcms+SU5TRVJUPC9tYXJrPlwKTm90ZTogSSdtIGhlcmUgdG8gaGVscCB5b3UgbGVhcm4gYW5kIHN1Y2NlZWQuClBsZWFzZSBjb21lIHRvIG15IG9mZmljZSBob3VycyB0byBhc2sgcXVlc3Rpb25zIGFib3V0IGNvdXJzZSBtYXRlcmlhbCwgYXNzaWdubWVudHMsIGV4YW1zLCBvciBwcm9mZXNzaW9uYWwgZGV2ZWxvcG1lbnQgKGNhcmVlci1yZWxhdGVkIGlzc3VlcyksIGZvciBpbnN0YW5jZS4KSSB3ZWxjb21lIHlvdSB0byBkaXNjdXNzIGFueSBjb25jZXJucyB5b3UgbWlnaHQgaGF2ZSBhYm91dCB0aGUgY2xhc3MuCkkgYW0gYWxzbyBhdmFpbGFibGUgdG8gbWVldCB3aXRoIHlvdSBieSBhcHBvaW50bWVudCwgYWx0aG91Z2ggSSB3b3VsZCBhcHByZWNpYXRlIHlvdXIgbWFraW5nIGV2ZXJ5IGVmZm9ydCB0byBzZWUgbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KVGhlIGJlc3Qgd2F5IHRvIHJlYWNoIG1lIG91dHNpZGUgb2YgY2xhc3MgaXMgYnkgZW1haWwuCgojIERlcGFydG1lbnRhbCBSZXNvdXJjZXMgeyNkZXB0UmVzb3VyY2VzfQoKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlczogW2h0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHVdKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUpXApEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIE1haW4gT2ZmaWNlOiBHNjAgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKDMzNS0yNDA2KVwKQ29vcmRpbmF0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzOiBQcm9mZXNzb3IgV2luZHNjaGl0bCAoW3BhdWwtd2luZHNjaGl0bEB1aW93YS5lZHVdKG1haWx0bzpwYXVsLXdpbmRzY2hpdGxAdWlvd2EuZWR1KTsgMzM1LTM2ODEpXApBY2FkZW1pYyBDb29yZGluYXRvcjogSmFuZWlsIFBhZ2UtSmFtaXNvbiAoW2phbmVpbC1wYWdlQHVpb3dhLmVkdV0obWFpbHRvOmphbmVpbC1wYWdlQHVpb3dhLmVkdSk7IDM4NC0zNjU3KVwKQ2hhaXIgb2YgRGVwYXJ0bWVudDogUHJvZmVzc29yIEJsdW1iZXJnIChbbWFyay1ibHVtYmVyZ0B1aW93YS5lZHVdKG1haWx0bzptYXJrLWJsdW1iZXJnQHVpb3dhLmVkdSk7IDMzNS0yNDI0KQoKIyBQcmVyZXF1aXNpdGVzIHsjcHJlcmVxc30KClRoZSBEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIGhhcyBhIGhpZXJhcmNoaWNhbCBjb3Vyc2Ugc3RydWN0dXJlIHRoYXQgcmVxdWlyZXMgc3R1ZGVudHMgdG8gY29tcGxldGUgY2VydGFpbiBwcmVyZXF1aXNpdGUgY291cnNlcyBiZWZvcmUgdGFraW5nIHVwcGVyLWxldmVsIGNvdXJzZXMuClRoaXMgY291cnNlIHJlcXVpcmVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiAoQy0gb3IgaGlnaGVyKSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGNvdXJzZXMgKG9yIEFQIFN0YXRpc3RpY3MgZnJvbSBoaWdoIHNjaG9vbCk6ClBTWSAyODExLCBQU1FGIDEwMjAsIFBTUUYgNDE0MywgU1RBVCAxMDEwLCBTVEFUIDEwMTUsIFNUQVQgMTAyMCwgU1RBVCAxMDMwLCBTVEFUIDM1MTAsIFNUQVQgNDE0MwpUaGUgZGVwYXJ0bWVudCB3aWxsIGNoZWNrIHN0dWRlbnQgcmVjb3JkcyB0byBlbnN1cmUgY29tcGxldGlvbiBvZiBjb3Vyc2UgcHJlcmVxdWlzaXRlcy4KCkFueSBvZiB0aGUgZm9sbG93aW5nIGNvdXJzZXMgd2l0aCBhIG1pbmltdW0gZ3JhZGUgb2YgQy0gKG9yIEFQIHN0YXRzIGZyb20gaGlnaCBzY2hvb2wpOgpQU1kgMjgxMSwgUFNRRiAxMDIwLCBQU1FGIDQxNDMsIFNUQVQgMTAxMCwgU1RBVCAxMDE1LCBTVEFUIDEwMjAsIFNUQVQgMTAzMCwgU1RBVCAzNTEwLCBTVEFUIDQxNDMKCiMgRGVzY3JpcHRpb24gb2YgQ291cnNlIHsjZGVzY3JpcHRpb259CgpIb3cgY2FuIHdlIHVzZSBpbmZvcm1hdGlvbiB0byBtYWtlIHByZWRpY3Rpb25zIGFib3V0IHVuY2VydGFpbiBldmVudHM/ClRoaXMgY291cnNlIGlzIGFib3V0IGVtcGlyaWNpc20gKGJhc2luZyB0aGVvcmllcyBvbiBvYnNlcnZlZCBkYXRhKSBhbmQganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHkuClN0dWRlbnRzIHdpbGwgYmUgaW50cm9kdWNlZCB0byBtb2Rlcm4gYW5hbHl0aWNhbCB0ZWNobmlxdWVzIHVzZWQgdG8gbWFrZSBpbmZvcm1lZCBwcmVkaWN0aW9ucywgdGVzdCB0aGVvcmllcywgYW5kIGRyYXcgY29uY2x1c2lvbnMgZnJvbSBhIGdpdmVuIGRhdGFzZXQuCkJ1dCB0aGlzIGlzIG5vIG9yZGluYXJ5IGNvdXJzZS4uLgoKUmF0aGVyIHRoYW4gbWVtb3JpemluZyB0aGVzZSBlbXBpcmljYWwgYXBwcm9hY2hlcyBpbiBhYnN0cmFjdGlvbiwgc3R1ZGVudHMgd2lsbCBlbXBsb3kgdGhlc2UgbWV0aG9kcyBpbiB0aGUgYWN0aXZlLCBpbW1lcnNpdmUsIGhhbmRzLW9uIGxlYXJuaW5nIGxhYm9yYXRvcnkgb2YgRmFudGFzeSBGb290YmFsbC4KSW4gdGhpcyB3YXksIHRoZSBjb3Vyc2Ugd2lsbCB3ZWF2ZSB0b2dldGhlciB0d28gY29udGlndW91cyB0aHJlYWRzOiBhbiBpbnRyb2R1Y3Rvcnkgb3ZlcnZpZXcgb2YgZGF0YSBhbmFseXNpcyB0ZWNobmlxdWVzLCBhbmQgYSBjYXB0aXZhdGluZyBhcHBsaWNhdGlvbiBvZiB0aGVzZSB0ZWNobmlxdWVzIHRocm91Z2ggYSBzZW1lc3Rlci1sb25nIGV4cGVyaWVuY2UgaW4gRmFudGFzeSBGb290YmFsbCB3aXRoIHRoZWlyIGNsYXNzbWF0ZXMuW15hZGFwdGVkXQoKVGhlIGNsYXNzIGludm9sdmVzIHJlYWRpbmcgcHJpbWFyeSBzb3VyY2UgbWF0ZXJpYWwsIGFwcGx5aW5nIHN0YXRpc3RpY2FsIHByb2dyYW1taW5nICh1c2luZyBgUmAgc29mdHdhcmUpLCBjb25kdWN0aW5nIGRhdGEgYW5hbHlzaXMsIGFuZCBjb21wb3Npbmcgd3JpdHRlbiB3b3JrIG9uIGEgd2Vla2x5IGJhc2lzLgoKVG8gYmUgY2xlYXIsIDx1PnRoaXMgaXMgYSBzdGF0aXN0aWNzIGFuZCBlbXBpcmljaXNtIGNvdXJzZTwvdT4uCkl0IG1lcmVseSB1c2VzIGZhbnRhc3kgZm9vdGJhbGwgYXMgYSBsZW5zIGFuZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHdoaWNoIHRvIGxlYXJuIGFib3V0IHN0YXRpc3RpY3MgYW5kIGVtcGlyaWNpc20uClRoZSBjbGFzcyBkb2VzIG5vdCBhc3N1bWUgdGhhdCBzdHVkZW50cyBrbm93IGFueXRoaW5nIGFib3V0IChvciBjYXJlIGFib3V0KSBmb290YmFsbCBvciBmYW50YXN5IGZvb3RiYWxsLgpUaGUgY2xhc3MgaXMgd2VsY29tZSB0byBhbGwsIGFzc3VtaW5nIHRoZSBzdHVkZW50IG1lZXRzIHRoZSBwcmVyZXF1aXNpdGVzIGFuZCB0aGF0IHRoZXkgYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgYWJvdXQgZW1waXJpY2lzbSAoYmFzaW5nIHRoZW9yaWVzIG9uIG9ic2VydmVkIGRhdGEpLCBzdGF0aXN0aWNzLCBhbmQganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHkuCgpUYWtlIHRoaXMgY2xhc3MgaWY6CgotIHlvdSB3YW50IHRvIGxlYXJuIG1vcmUgYWR2YW5jZWQgc2tpbGxzIGluIDEpIGVtcGlyaWNpc20sIDIpIHN0YXRpc3RpY3MsIDMpIHByb2dyYW1taW5nICh1c2luZyBgUmAgc29mdHdhcmUpLCBhbmQgNCkganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHk7Ci0geW91IGFyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIHN0YXRpc3RpY3MgdGhyb3VnaCB0aGUgbGVucyBvZiBhIGZ1biBzcG9ydHMgZG9tYWluIChmYW50YXN5IGZvb3RiYWxsKTsgb3IKLSB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYXBwbHlpbmcgcHN5Y2hvbG9naWNhbCBhbmQgc3RhdGlzdGljYWwgY29uY2VwdHMgdG8gZmFudGFzeSBmb290YmFsbCwgdG8gZ2FpbiBhIHN0cm9uZyB1bmRlcnN0YW5kaW5nIG9mIGNyaXRpY2FsIHRoaW5raW5nIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gc3BvcnRzLgoKKkRvIG5vdCB0YWtlIHRoaXMgY2xhc3MgaWYqOgoKLSB5b3UgYXJlIGp1c3QgbG9va2luZyBmb3IgYW4gImVhc3kiIGNsYXNzICh0aGUgY2xhc3MgaXMgbm90IGVhc3kpOwotIHlvdSBhcmUgcmVsdWN0YW50IHRvIGV4YW1pbmUgZmFudGFzeSBmb290YmFsbCB0b3BpY3MgaW4gYSBzY2llbnRpZmljIG1hbm5lcjsKLSB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgcHVibGljIGJsb2cgYXJ0aWNsZXMgYXMgcGFydCBvZiB0aGUgY2xhc3M7IG9yCi0geW91IGRvIG5vdCB3YW50IHRvIGxlYXJuIHN0YXRpc3RpY3MgYW5kIHByb2dyYW1taW5nLCBhbmQgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCB0aHJvdWdoIGluZXZpdGFibGUgY2hhbGxlbmdlcyBhbG9uZyB0aGUgd2F5LgoKW15hZGFwdGVkXToKICAgIEVsZW1lbnRzIG9mIHRoaXMgc3lsbGFidXMgYW5kIGNvdXJzZSB3ZXJlIGJvcnJvd2VkIGFuZCBhZGFwdGVkICh3aXRoIHBlcm1pc3Npb24pIGZyb20gYSBzaW1pbGFyIGNvdXJzZSBieSBCZW5qYW1pbiBNb3R6LgoKIyMgV2hhdCBpcyBGYW50YXN5IEZvb3RiYWxsPyBBbmQgV2h5IEZvY3VzIG9uIEZhbnRhc3kgRm9vdGJhbGw/IHsjZmFudGFzeUZvb3RiYWxsfQoKRmFudGFzeSBmb290YmFsbCBpcyBhbiBvbmxpbmUgZ2FtZSB3aGVyZSBwYXJ0aWNpcGFudHMgYXNzZW1ibGUgKGkuZS4sICJkcmFmdCIpIGltYWdpbmFyeSB0ZWFtcyBjb21wb3NlZCBvZiByZWFsLWxpZmUgTmF0aW9uYWwgRm9vdGJhbGwgTGVhZ3VlIChORkwpIHBsYXllcnMuCkluIHRoZSBnYW1lIG9mIGZhbnRhc3kgZm9vdGJhbGwsIHBhcnRpY2lwYW50cyBjb21wZXRlIGFnYWluc3Qgb3RoZXJzLCBhY2N1bXVsYXRpbmcgImZhbnRhc3kiIHBvaW50cyBiYXNlZCBvbiBwbGF5ZXJzJyBhY3R1YWwgc3RhdGlzdGljYWwgcGVyZm9ybWFuY2VzIGluIGdhbWVzIChhbmQgdGhlIGdvYWwgaXMgdG8gb3V0c2NvcmUgb25l4oCZcyBvcHBvbmVudCBlYWNoIHdlZWsgdG8gd2luIG1hdGNoZXMgYW5kIHVsdGltYXRlbHkgY2xhaW0gdmljdG9yeSBpbiB0aGUgbGVhZ3VlKS4KRmFudGFzeSBmb290YmFsbCByZWxpZXMgaGVhdmlseSBvbiBwcmVkaWN0aW9u4oCUdHJ5aW5nIHRvIHByZWRpY3Qgd2hpY2ggcGxheWVycyB3aWxsIHBlcmZvcm0gYmVzdCBhbmQgc2VsZWN0aW5nIHRoZW0gYWNjb3JkaW5nbHkuCkluIHRoaXMgd2F5LCBmYW50YXN5IGZvb3RiYWxsIHByb3ZpZGVzIGEgcGxldGhvcmEgb2YgZGVjaXNpb24gbWFraW5nIG9wcG9ydHVuaXRpZXMgaW4gdGhlIGZhY2Ugb2YgdW5jZXJ0YWludHksIGFuZCBhIHdlYWx0aCBvZiBkYXRhIGZvciBhbmFseXppbmcgdGhlc2UgZGVjaXNpb25zLgpIb3dldmVyLCB1bmxpa2UgbWFueSBvdGhlciBhcHBsaWVkIGRvbWFpbnMgaW4gcHN5Y2hvbG9neSwgZmFudGFzeSBmb290YmFsbCAoMSkgYWxsb3dzIGEgcGVyc29uIHRvIHNlZSB0aGUgYWNjdXJhY3kgb2YgdGhlaXIgcHJlZGljdGlvbnMgb24gYSB0aW1lbHkgYmFzaXMgYW5kICgyKSBwcm92aWRlcyBhIHNhZmUgZW52aXJvbm1lbnQgZm9yIGZyaWVuZGx5IGNvbXBldGl0aW9uLgpUaHVzLCBpdCBwcm92aWRlcyBhIHVuaXF1ZSBkb21haW4gdG8gZXZhbHVhdGXigJRhbmQgaW1wcm92ZeKAlHRoZSBhY2N1cmFjeSBvZiB2YXJpb3VzIHByZWRpY3Rpb24gbW9kZWxzLgoKIyBMZWFybmluZyBPYmplY3RpdmVzIHsjb2JqZWN0aXZlc30KCkJ5IHRoZSBlbmQgb2YgdGhlIGNvdXJzZSwgc3VjY2Vzc2Z1bCBzdHVkZW50cyB3aWxsIGJlIGFibGUgdG86CgotIEFwcGx5IGVtcGlyaWNhbCBpbmZlcmVuY2UgYW5kIGFwcHJlY2lhdGUgdGhlIHZhbHVlIGl0IHByb3ZpZGVzIG92ZXIgc3BlY3VsYXRpdmUgc3VwcG9zaXRpb24uCi0gQXNrIGVkdWNhdGVkIHF1ZXN0aW9ucyB3aGVuIGNvbmZyb250ZWQgd2l0aCBkZWNpc2lvbnMgaW4gdGhlIGZhY2Ugb2YgdW5jZXJ0YWludHkuCi0gVW5kZXJzdGFuZCBodW1hbiBkZWNpc2lvbiBtYWtpbmcsIGluY2x1ZGluZyBjb21tb24gaGV1cmlzdGljcyBhbmQgY29nbml0aXZlIGJpYXNlcyBhbmQgaG93IHRvIG1pdGlnYXRlIHRoZW0gYW5hbHl0aWNhbGx5LgotIEVuZ2FnZSBpbiBjcml0aWNhbCB0aGlua2luZyBhYm91dCBjYXVzYWxpdHksIGluY2x1ZGluZyBkZXZpc2luZyBwbGF1c2libGUgYWx0ZXJuYXRpdmUgZXhwbGFuYXRpb25zIGZvciBvYnNlcnZlZCBlZmZlY3RzLgotIFVuZGVyc3RhbmQgY2F1c2FsIGluZmVyZW5jZSBpbmNsdWRpbmcgY29uZm91bmRpbmcsIGNhdXNhbCBwYXRod2F5cywgYW5kIGNvdW50ZXJmYWN0dWFscy4KLSBUaGluayBlbXBpcmljYWxseSBhYm91dCBodW1hbiBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UuCi0gRGVzY3JpYmUgdGhlIHN0cmVuZ3RocyBhbmQgd2Vha25lc3NlcyBvZiBodW1hbnMgdmVyc3VzIGNvbXB1dGVycyBpbiBwcmVkaWN0aW9uIHNjZW5hcmlvcy4KLSBBcHBseSBiYXNpYyBza2lsbHMgaW4gc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgdXNpbmcgYFJgIHRvIG1hbmlwdWxhdGUgYW5kIHN1bW1hcml6ZSBkYXRhc2V0cyBhbmQgdG8gY29uZHVjdCBkYXRhIGFuYWx5c2lzLgotIENyaXRpY2FsbHkgZXZhbHVhdGUgdGhlIHN0cmVuZ3RocyBhbmQgbGltaXRhdGlvbnMgb2YgZGlmZmVyZW50IHN0YXRpc3RpY2FsIG1vZGVscyBhbmQgbWV0aG9kb2xvZ2llcyB1c2VkIGluIHByZWRpY3RpbmcgdW5jZXJ0YWluIGV2ZW50cywgZW5oYW5jaW5nIHRoZWlyIHVuZGVyc3RhbmRpbmcgb2Ygc3RhdGlzdGljYWwgaW5mZXJlbmNlIGFuZCBtb2RlbCBzZWxlY3Rpb24uCi0gVXNlIHZhcmlvdXMgYW5hbHl0aWNhbCB0ZWNobmlxdWVzIGZvciBwcmVkaWN0aW5nIHRoZSBvdXRjb21lIG9mIHVuY2VydGFpbiBldmVudHMsIGFuZCBmb3IgdW5jb3ZlcmluZyBsYXRlbnQgY2F1c2VzIG9mIHBhdHRlcm5zIGluIG9ic2VydmVkIGRhdGEuCi0gSW50ZXJwcmV0IGZpbmRpbmdzIGZyb20gdmFyaW91cyBzdGF0aXN0aWNhbCBhcHByb2FjaGVzIGFuZCBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgcHJlZGljdGlvbnMuCi0gRW5nYWdlIGluIGl0ZXJhdGl2ZSBwcm9ibGVtLXNvbHZpbmcgcHJvY2Vzc2VzLCByZWZpbmluZyBhbmFseXRpY2FsIGFwcHJvYWNoZXMgYmFzZWQgb24gZmVlZGJhY2sgYW5kIG91dGNvbWVzLCBhbmQgYWRhcHRpbmcgc3RyYXRlZ2llcyBhY2NvcmRpbmdseS4KLSBDb21tdW5pY2F0ZSBzdGF0aXN0aWNhbCBmaW5kaW5ncyBhbmQgYW5hbHlzZXMgaW4gYm90aCB3cml0dGVuIGFuZCBvcmFsIGZvcm1hdHMsIGRlbW9uc3RyYXRpbmcgcHJvZmljaWVuY3kgaW4gcHJlc2VudGluZyBjb21wbGV4IGluZm9ybWF0aW9uIHRvIGRpdmVyc2UgYXVkaWVuY2VzLgotIE1ha2Ugc2Vuc2Ugb2YgYmlnIGRhdGEuCi0gVXNlIHByYWN0aWNhbCBhbmFseXRpY2FsIHNraWxscyB0aGF0IGNhbiBiZSBhcHBsaWVkIGluIGZ1dHVyZSByZXNlYXJjaCBhbmQgam9iIHNldHRpbmdzLgoKIyBUZXh0Ym9vayB7I3RleHRib29rfQoKVGhlIGNvc3Qgb2YgdGV4dGJvb2tzIGhhcyBiZWNvbWUgc28gaGlnaCB0aGF0IEkgZG8gbm90IGZlZWwgY29tZm9ydGFibGUgcmVxdWlyaW5nIHN0dWRlbnRzIHRvIHB1cmNoYXNlIGEgdGV4dGJvb2suClRodXMsIEkgY3JlYXRlZCBhIHRleHRib29rIGZvciB0aGlzIGNvdXJzZS4KVGhlIHRleHRib29rIGZvciB0aGlzIGNvdXJzZSBpcyBhdmFpbGFibGUgPHU+Zm9yIGZyZWU8L3U+IG9ubGluZToKaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2sKCiMgUmVxdWlyZWQgTWF0ZXJpYWxzIHsjcmVxdWlyZWRNYXRlcmlhbHN9CgpGb3IgdGhlIGNsYXNzLCB5b3Ugd2lsbCBiZSByZXF1aXJlZCB0byBoYXZlIGFjY2VzcyB0byBhIGNvbXB1dGVyIHRoYXQgYWxsb3dzIHlvdSB0byBpbnN0YWxsIGFuZCBydW4gc29mdHdhcmUgKGluY2x1ZGluZyBgUmAsIGBnaXRgLCBhbmQgYEdpdEh1YiBEZXNrdG9wYCkuCkEgbGFwdG9wIGlzIHByZWZlcmFibGUsIHNvIHlvdSBjYW4gYnJpbmcgaXQgdG8gY2xhc3MgYW5kIHdvcmsgdGhyb3VnaCBleGFtcGxlcyBpbiBjbGFzcy4KCiMgQWNhZGVtaWMgSG9uZXN0eSBhbmQgTWlzY29uZHVjdCB7I2FjYWRlbWljSG9uZXN0eX0KCkFsbCBzdHVkZW50cyBpbiBDTEFTIGNvdXJzZXMgYXJlIGV4cGVjdGVkIHRvIGFiaWRlIGJ5IHRoZSBbY29sbGVnZSdzIHN0YW5kYXJkcyBvZiBhY2FkZW1pYyBob25lc3R5XShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL2hhbmRib29rL2FjYWRlbWljLWZyYXVkLWhvbm9yLWNvZGUpLgpBY2FkZW1pYyBtaXNjb25kdWN0IG11c3QgYmUgcmVwb3J0ZWQgYnkgaW5zdHJ1Y3RvcnMgdG8gQ0xBUyBhY2NvcmRpbmcgdG8gW3RoZXNlIHByb2NlZHVyZXNdKGh0dHBzOi8vcG9saWN5LmNsYXMudWlvd2EuZWR1L2NsYXMtcG9saWNpZXMtYW5kLXByb2NlZHVyZXMvdW5kZXJncmFkdWF0ZS1lZHVjYXRpb24vYWNhZGVtaWMtbWlzY29uZHVjdC11bmRlcmdyYWR1YXRlKS4KUGxlYXNlIG5vdGUgdGhhdCBjb2xsYWJvcmF0aW9uIHdpdGggb3RoZXIgY2xhc3NtYXRlcyBvbiA8dT5xdWl6emVzLCB3cml0aW5nIGFzc2lnbm1lbnRzLCBhbmQgZHVyaW5nIGV4YW1zPC91PiBpcyBub3QgcGVybWl0dGVkLgpIb3dldmVyLCBJIGRvIGVuY291cmFnZSB5b3UgdG8gY29sbGFib3JhdGUgd2l0aCBjbGFzc21hdGVzIHRvIHRvIGxlYXJuIGBSYCwgc3RhdGlzdGljcywgYW5kIHByb2dyYW1taW5nLCBhbmQgdG8gKnByZXBhcmUqIGZvciBleGFtcyAoZS5nLiwgaW5mb3JtYWwgc3R1ZHkgZ3JvdXBzKS4KQmVjYXVzZSB3cml0aW5nLCBhbmFseXRpY2FsLCBhbmQgY3JpdGljYWwgdGhpbmtpbmcgc2tpbGxzIGFyZSBwYXJ0IG9mIHRoZSBsZWFybmluZyBvdXRjb21lcyBvZiB0aGlzIGNvdXJzZSwgYWxsIHdvcmsgc3VibWl0dGVkIGJ5IHN0dWRlbnRzIHNob3VsZCBiZSBwcmVwYXJlZCBieSB0aGUgc3R1ZGVudC4KRGV2ZWxvcGluZyBzdHJvbmcgY29tcGV0ZW5jaWVzIGluIHRoZXNlIGRvbWFpbnMgd2lsbCBwcmVwYXJlIHlvdSBmb3IgYSBjb21wZXRpdGl2ZSB3b3JrcGxhY2UuClRoZXJlZm9yZSwgQUktZ2VuZXJhdGVkIHN1Ym1pc3Npb25zIGFyZSBub3QgcGVybWl0dGVkIGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMgcGxhZ2lhcmlzbS4KCiMgQ291cnNlIFJlcXVpcmVtZW50cyBhbmQgUG9saWNpZXMgeyNyZXF1aXJlbWVudHN9CgojIyBMZWN0dXJlIHsjbGVjdHVyZX0KCldlIHdpbGwgbWVldCB0d28gdGltZXMgd2Vla2x5IGZvciBsZWN0dXJlcywgYXQgdGhlIHRpbWUgYW5kIGxvY2F0aW9uIGRlc2NyaWJlZCBbYWJvdmVdKCNsZWN0dXJlVGltZSkuCk15IHBvd2VycG9pbnQgcHJlc2VudGF0aW9ucyBmb3IgdGhlIGxlY3R1cmVzIHdpbGwgYmUgcG9zdGVkIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBubyBsYXRlciB0aGFuIG5vb24gb24gdGhlIGRheSBiZWZvcmUgdGhlIGxlY3R1cmUgKHRob3VnaCBJIG1heSBjb250aW51ZSB0byByZWZpbmUgdGhlIHNsaWRlcyB1cCB1bnRpbCB0aGUgdGltZSBvZiBsZWN0dXJlKS4KPHU+UGxlYXNlIG5vdGU6PC91PiBwb3dlcnBvaW50IHByZXNlbnRhdGlvbnMgYXJlIGFuIG91dGxpbmUgb2YgbXkgcG9pbnRzLiAKPHU+SXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byB0YWtlIG5vdGVzIGR1cmluZyBjbGFzcy48L3U+CklmIHlvdSBoYXZlIHF1ZXN0aW9ucyBhYm91dCB0aGUgbGVjdHVyZSBub3RlcyBvciBuZWVkIGNsYXJpZmljYXRpb24gb2YgYW55IG9mIHRoZSBwb2ludHMsIHBsZWFzZSBhc2sgaW4gY2xhc3Mgb3IgbWVldCB3aXRoIFByb2Zlc3NvciBQZXRlcnNlbiBkdXJpbmcgb2ZmaWNlIGhvdXJzLgpJZiB5b3UgbWlzcyBhIGxlY3R1cmUsIGdldCBhbmQgcmV2aWV3IG5vdGVzIHdpdGggYSBwZWVyIGFuZCB3YXRjaCB0aGUgbGVjdHVyZSByZWNvcmRpbmcuClRoZW4sIGNvbWUgdG8gb2ZmaWNlIGhvdXJzIGlmIHlvdSBoYXZlIHNwZWNpZmljIHF1ZXN0aW9ucy4KCiMjIyBMZWN0dXJlIFJlY29yZGluZ3MgeyNyZWNvcmRpbmdzfQoKTXkgaW50ZW50aW9uIGlzIHRvIHJlY29yZCBsZWN0dXJlcyBzbyB0aGF0IHlvdSBtYXkgcmV2aWV3IHRoZW0uClJlY29yZGVkIGxlY3R1cmVzIHdpbGwgYmUgcG9zdGVkIG9uIHRoZSAiVUlDYXB0dXJlIiB0YWIgaW4gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpLgpIb3dldmVyLCA8dT5wbGVhc2UgZG8gbm90IGNvdW50IG9uIHJlY29yZGluZ3MgYmVpbmcgYXZhaWxhYmxlPC91PiwgaW4gY2FzZSBJIGFjY2lkZW50YWxseSBmb3JnZXQgdG8gaW5pdGlhdGUgdGhlIHJlY29yZGluZyBvciB0aGVyZSBpcyBhIHRlY2huaWNhbCBtYWxmdW5jdGlvbi4KCiMjIEF0dGVuZGFuY2UgYW5kIFBhcnRpY2lwYXRpb24geyNhdHRlbmRhbmNlUGFydGljaXBhdGlvbn0KCkF0dGVuZGFuY2UgYXQgbGVjdHVyZXMgaXMgcmVxdWlyZWQgYW5kIHdpbGwgYmUgZmFjdG9yZWQgaW50byBmaW5hbCBncmFkZXMgKHNlZSBncmFkaW5nIHNlY3Rpb24gW2JlbG93XSgjY291cnNlR3JhZGVzKSkuClRoZXJlIGFyZSAyOSBsZWN0dXJlcyBkdXJpbmcgdGhlIHNlbWVzdGVyIChleGNsdWRpbmcgdGhlIGV4YW1pbmF0aW9ucykuCllvdSB3aWxsIHJlY2VpdmUgb25lIHBvaW50IGZvciBhdHRlbmRhbmNlIGF0IGVhY2ggbGVjdHVyZSB1cCB0byAyNyBwb2ludHMgKGkuZS4sIHlvdSB3aWxsIG5vdCByZWNlaXZlIGV4dHJhIGNyZWRpdCBmb3IgYXR0ZW5kaW5nIGFsbCAyOSBsZWN0dXJlcykuCjx1PlRodXMsIHlvdSB3aWxsIG5vdCBiZSBwZW5hbGl6ZWQgZm9yIG1pc3NpbmcgdXAgdG8gMiBsZWN0dXJlcy4KSG93ZXZlciwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGxlYXJuaW5nIGFueSBtYXRlcmlhbCBtaXNzZWQgZm9yIHF1aXp6ZXMgYW5kIGV4YW1zLCBhbmQgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGF0dGVuZCBhbGwgbGVjdHVyZXMuClBvb3IgbGVjdHVyZSBhdHRlbmRhbmNlIGlzIGxpa2VseSB0byBhZmZlY3QgdGhlIHF1YWxpdHkgb2Ygc3R1ZGVudHMnIHdvcmsgYW5kIHN1Y2Nlc3MgaW4gdGhlIGNvdXJzZS48L3U+CgpTdHVkZW50cyB3aG8gbWlzcyA8dT5tb3JlIHRoYW4gMiBsZWN0dXJlczwvdT4gZHVlIHRvIHBhcnRpY2lwYXRpb24gaW4gVW5pdmVyc2l0eSBhY3Rpdml0aWVzIG11c3QgZ2l2ZSB0aGUgaW5zdHJ1Y3RvciBhIHN0YXRlbWVudCA8dT5iZWZvcmUgdGhlIGFic2VuY2U8L3U+IHNpZ25lZCBieSBhIHJlc3BvbnNpYmxlIG9mZmljaWFsIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRlcyBhbmQgdGltZXMgdGhlIHN0dWRlbnQgd2lsbCBtaXNzIGNsYXNzLgpBdXRob3JpemVkIGFjdGl2aXRpZXMgaW5jbHVkZSBwYXJ0aWNpcGF0aW9uIGluIGF0aGxldGljIHRlYW1zLCB0aGUgbWFyY2hpbmcgYmFuZCBvciBwZXAgYmFuZCwgZGViYXRlIHRlYW1zLCBhbmQgb3RoZXIgcmVjb2duaXplZCBVbml2ZXJzaXR5IGdyb3VwcywgYXMgd2VsbCBhcyBwYXJ0aWNpcGF0aW9uIGluIFVuaXZlcnNpdHkgZmllbGQgdHJpcHMsIHNlcnZpY2Ugd2l0aCB0aGUgTmF0aW9uYWwgR3VhcmQsIGFuZCBqdXJ5IGR1dHkuCkFic2VuY2VzIGR1ZSB0byBpbGxuZXNzZXMgb3IgZW1lcmdlbmNpZXMgKHRoYXQgZ28gb3ZlciAyIGxlY3R1cmVzKSBtdXN0IGJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgc2VudCB0byBQcm9mZXNzb3IgUGV0ZXJzZW4gd2l0aGluIDQ4IGhvdXJzIG9mIHRoZSBhYnNlbmNlLgpQZXIgdW5pdmVyc2l0eSBwb2xpY3ksIGlmIGEgc3R1ZGVudCB3aWxsIGJlIGFic2VudCA8dT41IG9yIG1vcmUgY29uc2VjdXRpdmUgZGF5cyBhbmQgdGhlIGFic2VuY2UgaXMgZHVlIHRvIGlsbG5lc3Mgb3Igb3RoZXIgZW1lcmdlbmN5PC91PiwgcGxlYXNlIGNvbnRhY3QgdGhlIFJlZ2lzdHJhciBTZXJ2aWNlIENlbnRlciBhdCAoMzE5KSAzODQtNDMwMCBvciByZWdpc3RyYXJAdWlvd2EuZWR1LgoKIyMgQmxvZyBBcnRpY2xlcyB7I2Jsb2dBcnRpY2xlc30KCkFzIHBhcnQgb2YgdGhlIGNsYXNzLCB5b3Ugd2lsbCBwb3N0IGJsb2cgYXJ0aWNsZXMgKHNlZSB0aGUgW2NvdXJzZSBzY2hlZHVsZV0oI291dGxpbmUpIGZvciBkZWFkbGluZXMpLgo8dT5UaGUgYmxvZyBhcnRpY2xlcyBhcmUgcHVibGljPC91PjsgPHU+ZG8gbm90IHRha2UgdGhpcyBjb3Vyc2UgaWYgeW91IGRvIG5vdCBmZWVsIGNvbWZvcnRhYmxlIHBvc3RpbmcgYmxvZyBhcnRpY2xlcyB3aXRoIHlvdXIgZnVsbCBuYW1lIGluIGEgcHVibGljIGZvcnVtPC91Pi4KVGhlcmUgd2lsbCBiZSBhIHBlbmFsdHkgb2YgMjAlIGZvciBhbGwgYmxvZyBhcnRpY2xlcyB0dXJuZWQgaW4gbGF0ZS4KWW91ciBsb3dlc3Qgc2NvcmUgd2lsbCBiZSBkcm9wcGVkLgpBIGJsb2cgYXJ0aWNsZSBpcyBub3QgY29uc2lkZXJlZCAic3VibWl0dGVkIiB1bnRpbCB5b3UgKGEpIHBvc3QgdGhlIGJsb2cgYXJ0aWNsZSBzbyB0aGF0IGl0IGlzIGxpdmUgYW5kIHB1YmxpY2x5IGF2YWlsYWJsZSwgQU5EIChiKSBzdWJtaXQgdGhlIGFzc2lnbm1lbnQgb24gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIHdpdGggdGhlIFVSTCBsaW5rIHRvIHlvdXIgYmxvZyBhcnRpY2xlLgpBbGwgYmxvZyBhcnRpY2xlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBieSAxMTo1OSBwLm0uIG9uIHRoZSBkdWUgZGF0ZS4KCllvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgeW91ciBibG9nIGFydGljbGUgPHU+d2VsbCBiZWZvcmU8L3U+IHRoZSBkZWFkbGluZS4KPHU+WW91IGNhbiBleHBlY3QgdG8gcnVuIGludG8gdGVjaG5pY2FsIGlzc3VlczwvdT4gKGUuZy4sIGVycm9ycyB3aGVuIHJ1bm5pbmcgeW91ciBjb2RlLCBpc3N1ZXMgZ2V0dGluZyB0aGUgYmxvZyBwb3N0IHRvIGNvbXBpbGUgZXRjLikuClRodXMsIHlvdSBzaG91bGQgZ2l2ZSB5b3Vyc2VsZiBwbGVudHkgb2YgdGltZSB0byBbdHJvdWJsZXNob290XSgjdHJvdWJsZXNob290aW5nKSAoc2VlIGJlbG93KSBzbyB0aGF0IHlvdSBjYW4gc3VibWl0IHlvdXIgYmxvZyBhcnRpY2xlIG9uIHRpbWUuCgojIyMgVHJvdWJsZXNob290aW5nIHsjdHJvdWJsZXNob290aW5nfQoKSWYgeW91IHJ1biBpbnRvIGlzc3VlcyByZWxhdGVkIHRvIGBSYCwgYEdpdEh1YmAsIG9yIHlvdXIgY29kZSwgSSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBmb2xsb3dpbmc6CgotIFBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWUKLSBBc2sgYSBwZWVyCi0gUG9zdCBvbiBbZm9ydW1zIGRlZGljYXRlZCB0byBgUmBdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2dldHRpbmctc3RhcnRlZC5odG1sI3NlYy1nZXR0aW5nSGVscFIpCi0gQ29tZSB0byBvZmZpY2UgaG91cnMKCkkgYW0gcXVpdGUgYnVzeSwgYW5kIEkgYXBwcmVjaWF0ZSB5b3VyIG1ha2luZyBldmVyeSBlZmZvcnQgdG8gc29sdmUgdGhlIGlzc3VlIG9uIHlvdXIgb3duIG9yIHVzaW5nIG9uZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgd2F5cyBiZWZvcmUgZW1haWxpbmcgbWUuCkkgZG8gbm90IG9mdGVuIHJlc3BvbmQgdG8gZW1haWxzIGR1cmluZyBldmVuaW5ncyBvciB3ZWVrZW5kcywgYW5kIEkgY2Fubm90IGJlIGV4cGVjdGVkIHRvIHNvbHZlIGxhc3QtbWludXRlIGlzc3VlcyB0aGF0IHlvdSBjb3VsZCBoYXZlIHNvbHZlZCBlYXJsaWVyLgoKIyMgUmVhZGluZ3MgJiBRdWl6emVzIHsjcmVhZGluZ1F1aXp6ZXN9CgpSZWFkaW5ncyBhbmQgb3RoZXIgbWF0ZXJpYWxzIHdpbGwgYmUgcG9zdGVkIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KS4KWW91IGFyZSBleHBlY3RlZCB0byBkbyB0aGUgcmVhZGluZ3MgYmVmb3JlIGNsYXNzLgpZb3Ugd2lsbCBoYXZlIGFuIG9ubGluZSBxdWl6IG9uIHRoZSByZWFkaW5ncyB0byBjb21wbGV0ZSBpbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSksIG9uIHlvdXIgb3duLCA8dT5iZWZvcmU8L3U+IGVhY2ggbGVjdHVyZS4KVGhlIHF1aXp6ZXMgYXJlIG1lYW50IHRvIGhlbHAgeW91IGNvbWUgdG8gY2xhc3MgcHJlcGFyZWQgdG8gY29udHJpYnV0ZSBzbyB5b3UgYXJlIGJlc3QtcG9zaXRpb25lZCB0byBsZWFybiBhbmQgdG8gaGVscCBvdGhlcnMgbGVhcm4uClRoZSBxdWl6emVzIGFyZSBub3QgdGltZWQgKHlvdSBjYW4gc3BlbmQgYXMgbXVjaCB0aW1lIGFzIHlvdSBuZWVkIG9uIGVhY2ggcXVpeiB1cCB1bnRpbCB0aGUgZGVhZGxpbmUpLgpUaGUgZGVhZGxpbmUgZm9yIGVhY2ggcXVpeiBpcyAzMCBtaW51dGVzIGJlZm9yZSBjbGFzcyBzdGFydHMuCkxhdGUgcmVzcG9uc2VzIGFuZCBtdWx0aXBsZSBzdWJtaXNzaW9ucyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4KWW91ciBsb3dlc3QgcXVpeiBzY29yZSB3aWxsIGJlIGRyb3BwZWQuCldlIHdpbGwgbm90IGFjY2VwdCBleGN1c2VkIGFic2VuY2VzIGZvciBxdWl6emVzIGJlY2F1c2UgKGEpIHlvdSBoYXZlIGEgd2VlayB0byBjb21wbGV0ZSB0aGUgcXVpeiAoYW5kIGNhbiBzdWJtaXQgaXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGF0IHdlZWspLCBhbmQgKGIpIHdlIGRyb3AgeW91ciBsb3dlc3QgcXVpeiBzY29yZS4KRWFjaCBxdWl6IHdpbGwgYmUgd2VpZ2h0ZWQgdGhlIHNhbWUgaW4gdGhlIGZpbmFsIGdyYWRlLgpRdWl6IGFuc3dlcnMgd2lsbCBiZSB2aWV3YWJsZSBhdCB0aGUgZW5kIG9mIHRoZSB3ZWVrIChpLmUuLCBhZnRlciB0aGUgbGFzdCBkaXNjdXNzaW9uIHNlY3Rpb24gaGFzIHRha2VuIHRoZWlyIHF1aXopLgoKUGFzdCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGluIG9yZGVyIHRvIGRvIHdlbGwgaW4gdGhpcyBjbGFzcywgeW91IHNob3VsZCByZWFkIHRoZSByZXF1aXJlZCBtYXRlcmlhbCwgcGFydGljaXBhdGUgYWN0aXZlbHkgaW4gY2xhc3MsIGFuZCBnbyBvdmVyIHlvdXIgbm90ZXMgPHU+ZWFjaCB3ZWVrPC91Pi4KVGhlcmUgaXMgdG9vIG11Y2ggbWF0ZXJpYWwgYmVpbmcgY292ZXJlZCBpbiB0aGlzIGNsYXNzIHRvIHRyeSB0byBzdHVkeSBvbmx5IGJ5IGZyYW50aWMgcHJlcGFyYXRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIGV4YW1zLgpOb3RlIHRoYXQgbGVjdHVyZSB3aWxsIDx1Pm5vdDwvdT4gY292ZXIgYWxsIHJlbGV2YW50IG1hdGVyaWFsIGZvciB0aGUgY291cnNlOyB5b3Ugd2lsbCBiZSBleHBlY3RlZCB0byBrbm93IHRoZSA8dT5yZXF1aXJlZDwvdT4gcmVhZGluZ3MgZm9yIGV4YW1zLgoKIyMgV29ya2xvYWQgeyN3b3JrbG9hZH0KClRoaXMgaXMgYSAzIHNlbWVzdGVyIGhvdXIgY291cnNlLgpTdHVkZW50cyBzaG91bGQgdGhlcmVmb3JlIGV4cGVjdCB0byBzcGVuZCBbNiBhZGRpdGlvbmFsIGhvdXJzIHBlciB3ZWVrXShodHRwczovL2NsYXMudWlvd2EuZWR1L2ZhY3VsdHkvc3R1ZGVudC13b3JrbG9hZC1ndWlkZWxpbmVzKSAob3V0c2lkZSBvZiBjbGFzcykgcmVhZGluZyB0aGUgYXJ0aWNsZXMsIHJldmlld2luZyBtYXRlcmlhbCBmcm9tIGxlY3R1cmUgYW5kIGRpc2N1c3Npb24gc2VjdGlvbiwgYW5kIHByZXBhcmluZyBmb3IgcXVpenplcyBhbmQgZXhhbXMuCgojIyBFeGFtaW5hdGlvbnMgeyNleGFtc30KClRoZXJlIHdpbGwgYmUgMiBleGFtczsgb25lIG1pZC10ZXJtIGV4YW0gYW5kIG9uZSBub24tY3VtdWxhdGl2ZSBmaW5hbCBleGFtLgpFYWNoIGV4YW0gd2lsbCBlbXBoYXNpemUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGZvciB0aGUgaGFsZiBvZiB0aGUgY2xhc3MgdGhhdCBwcmVjZWRlcyBpdC4KSG93ZXZlciwgc29tZSBpbnRlZ3JhdGlvbiBvZiBpbmZvcm1hdGlvbiBhY3Jvc3Mgc2VjdGlvbnMgd2lsbCBiZSByZXF1aXJlZCBmb3IgcXVlc3Rpb25zIG9uIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGV4YW1zLgpUaGUgZXhhbXMgd2lsbCBpbmNsdWRlIG11bHRpcGxlLWNob2ljZSBxdWVzdGlvbnMuCkV4YW0gcXVlc3Rpb25zIGNhbiBjb21lIGZyb20gPHU+YW55IG9mIHRoZSBmb2xsb3dpbmcgc291cmNlczogbGVjdHVyZXMgb3IgcmVxdWlyZWQgcmVhZGluZ3M8L3U+LgpGb3Igc3VnZ2VzdGVkIHN0dWR5IHRpcHMgZm9yIHRoaXMgY2xhc3MsIG1lZXQgd2l0aCBQcm9mZXNzb3IgUGV0ZXJzZW4gZHVyaW5nIG9mZmljZSBob3Vycy4KCiMjIyBNaXNzaW5nIEV4YW1zIHsjbWlzc2luZ0V4YW1zfQoKW1VuaXZlcnNpdHkgcmVndWxhdGlvbnMgcmVxdWlyZSB0aGF0IHN0dWRlbnRzIGJlIGFsbG93ZWQgdG8gbWFrZSB1cCBleGFtaW5hdGlvbnNdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdS9zdHVkZW50cy9hYnNlbmNlcy1jbGFzcykgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBpbGxuZXNzLCByZWxpZ2lvdXMgaG9seSBkYXlzLCBtaWxpdGFyeSBzZXJ2aWNlIG9ibGlnYXRpb25zIChpbmNsdWRpbmcgc2VydmljZS1yZWxhdGVkIG1lZGljYWwgYXBwb2ludG1lbnRzKSwgb3Igb3RoZXIgdW5hdm9pZGFibGUgY2lyY3Vtc3RhbmNlcyBvciBVbml2ZXJzaXR5LXNwb25zb3JlZCBhY3Rpdml0aWVzLgpTdHVkZW50cyB3aXRoIFVJLWF1dGhvcml6ZWQgYWN0aXZpdGllcyBtdXN0IGRpc2N1c3MgdGhlaXIgYWJzZW5jZXMgd2l0aCB0aGUgaW5zdHJ1Y3RvciBhcyBzb29uIGFzIHBvc3NpYmxlLgpSZWxpZ2lvdXMgb2JsaWdhdGlvbnMgbXVzdCBiZSBjb21tdW5pY2F0ZWQgd2l0aGluIHRoZSBmaXJzdCB0aHJlZSB3ZWVrcyBvZiBjbGFzc2VzLgpTZWUgYmVsb3cgZm9yIHRoZSBkb2N1bWVudGF0aW9uIG5lY2Vzc2FyeSBmb3IgYW4gYWJzZW5jZSB0byBiZSBleGN1c2VkIGFuZCB0byBiZSBlbGlnaWJsZSB0byB0YWtlIGEgbWFrZS11cCBleGFtLgoKU3R1ZGVudHMgYXJlIGFsbG93ZWQgdG8gbWFrZSB1cCBleGFtcyB0aGF0IGhhdmUgYmVlbiBtaXNzZWQgZHVlIHRvIGlsbG5lc3MsIG1hbmRhdG9yeSByZWxpZ2lvdXMgb2JzZXJ2YXRpb25zLCBvZmZpY2lhbCBVbml2ZXJzaXR5IGFjdGl2aXRpZXMsIG9yIG90aGVyIHVuYXZvaWRhYmxlIGNpcmN1bXN0YW5jZXMuCk5vdGU6IHRoZSBmb3JtYXQgb2YgdGhlIG1ha2UtdXAgZXhhbSBtYXkgZGlmZmVyIGZyb20gdGhlIG9yaWdpbmFsIGV4YW0uCklmIHlvdSBrbm93IHRoYXQgeW91IG11c3QgYmUgYXdheSBhdCB0aGUgdGltZSBvZiBhbiBleGFtIGZvciBvbmUgb2YgdGhlc2UgcmVhc29ucywgUHJvZmVzc29yIFBldGVyc2VuIG11c3QgYmUgY29udGFjdGVkIGluIGFkdmFuY2Ugd2hlbmV2ZXIgcG9zc2libGUgdG8gc2NoZWR1bGUgYSBtYWtlLXVwIGV4YW0uCkluIG9yZGVyIHRvIHRha2UgYSBtYWtlLXVwIGV4YW0sIHlvdSBtdXN0IHByb3ZpZGUgYWNjZXB0YWJsZSBkb2N1bWVudGF0aW9uIHRvIGJlIGVsaWdpYmxlIHRvIHRha2UgaXQ6IGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcmVwb3J0IG9mIGlsbG5lc3M7IGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIG11c3QgYmUgZG9jdW1lbnRlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgbXVzdCBiZSBhcHByb3ZlZCBieSBQcm9mZXNzb3IgUGV0ZXJzZW4uCjx1PkluIHN1bSwgdG8gYmUgZWxpZ2libGUgZm9yIGEgbWFrZS11cCBleGFtLCBQcm9mZXNzb3IgUGV0ZXJzZW4gbXVzdCBiZSBjb250YWN0ZWQgYmVmb3JlIHRoZSBleGFtaW5hdGlvbiB3aGVuZXZlciBwb3NzaWJsZSwgYW5kIHlvdSBtdXN0IHNlbmQgYWNjZXB0YWJsZSBmb3JtIG9mIGRvY3VtZW50YXRpb24gdG8gUHJvZmVzc29yIFBldGVyc2VuPC91Pi4KCiMgR3JhZGluZyB7I2dyYWRpbmd9CgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHNlbWVzdGVyIG9uIHRoZSBiYXNpcyBvZiB5b3VyIHRvdGFsIHBlcmNlbnRhZ2Ugb2YgcG9pbnRzIGVhcm5lZCBvbiBleGFtcywgcXVpenplcywgYXR0ZW5kYW5jZSwgYW5kIHdyaXRpbmcgYXNzaWdubWVudHMsIGFzIGRldGFpbGVkIGJlbG93LgpHcmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBvbiBhbiBhYnNvbHV0ZSBzY2FsZSAoY3JpdGVyaW9uLXJlZmVyZW5jZWQgZ3JhZGluZyk7IGNvdXJzZSBncmFkZXMgd2lsbCBub3QgYmUgY3VydmVkLgpQbGVhc2Ugbm90ZTogQXMgYSBtYXR0ZXIgb2YgZmFpcm5lc3MgdG8gYWxsIHN0dWRlbnRzLCBJIGFzc2lnbiBncmFkZXMgYmFzZWQgb24gcGVyZm9ybWFuY2UgYW5kIGRvIG5vdCBuZWdvdGlhdGUgZ3JhZGVzLgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKCnwgR3JhZGUgfCBQZXJjZW50IHwKfDotLS0tLS18Oi0tLS0tLS0tfAp8IEErICAgIHwgOTfigJMxMDAlIHwgCnwgQSAgICAgfCA5M+KAkzk2ICAgfAp8IEEtICAgIHwgOTDigJM5MiAgIHwKfCBCKyAgICB8IDg34oCTODkgICB8CnwgQiAgICAgfCA4M+KAkzg2ICAgfAp8IEItICAgIHwgODDigJM4MiAgIHwKfCBDKyAgICB8IDc14oCTNzkgICB8CnwgQyAgICAgfCA3MOKAkzc0ICAgfAp8IEMtICAgIHwgNjXigJM2OSAgIHwKfCBEKyAgICB8IDYw4oCTNjQgICB8CnwgRCAgICAgfCA1NeKAkzU5ICAgfAp8IEQtICAgIHwgNTDigJM1NCAgIHwKfCBGICAgICB8IDwgNTAlICAgfAoKSSByb3VuZCB1cCBmcm9tIC41IHdoZW4gZGV0ZXJtaW5pbmcgZmluYWwgZ3JhZGVzLgpGb3IgZXhhbXBsZSwgYSBjb3Vyc2UgcGVyY2VudCBvZiA3OS41MCB3b3VsZCByZWNlaXZlIGEgQi0sIHdoZXJlYXMgYSBjb3Vyc2UgcGVyY2VudCBvZiA3OS40OSB3b3VsZCByZWNlaXZlIGEgQysuCgojIENvdXJzZSBHcmFkZXMgeyNjb3Vyc2VHcmFkZXN9CgpGaW5hbCBjb3Vyc2UgZ3JhZGVzIHdpbGwgYmUgYXNzZXNzZWQgYmFzZWQgb24geW91ciBwZXJmb3JtYW5jZSBpbiB0aGUgYWN0aXZpdGllcyBiZWxvdy4KVGhlIHJlbGF0aXZlIGNvbnRyaWJ1dGlvbiBvZiBlYWNoIGNvbXBvbmVudCB0byB5b3VyIGZpbmFsIGdyYWRlIGlzIGFzIGZvbGxvd3M6CgogLSAyNSUJRXhhbWluYXRpb24gIzEKIC0gMjUlCUV4YW1pbmF0aW9uICMyIChhZG1pbmlzdGVyZWQgb25seSBkdXJpbmcgdGhlIGNsYXNzJ3MgRmluYWwgRXhhbSB0aW1lIHNsb3QpCiAtIDEwJSAJQXR0ZW5kYW5jZS9QYXJ0aWNpcGF0aW9uCiAtIDEwJSAJUmVhZGluZyBRdWl6emVzCiAtIDMwJSAgV3JpdGluZyBBc3NpZ25tZW50cwoKIyMgRXh0cmEgQ3JlZGl0IHsjZXh0cmFDcmVkaXR9CgpJIHdpbGwgZ2l2ZSB5b3UgMC41IHBvaW50IGV4dHJhIGNyZWRpdCBpZiB5b3UgMSkgaWRlbnRpZnkgYW4gaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIG9yIDIpIG1ha2UgYSA8dT5zcGVjaWZpYzwvdT4gc3VnZ2VzdGlvbiBmb3IgYSB3YXkgdG8gaW1wcm92ZSB0aGUgW3RleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGl0cyB1c2VmdWxuZXNzIHRvIHlvdSBvciBvdGhlciBzdHVkZW50cy4KRm9yIGluc3RhbmNlLCB0byBpZGVudGlmeSBhbiBpc3N1ZSB0aGF0IG5lZWRzIHRvIGJlIGFkZHJlc3NlZCwgeW91IGNvdWxkIGlkZW50aWZ5IGEgdHlwbywgbWlzc3BlbGxpbmcsIGdyYW1tYXRpY2FsIGlzc3VlLCBvciAoZ2FzcCksIGEgbWlzdGFrZS9lcnJvci4KVG8gcmVjZWl2ZSB0aGUgZXh0cmEgY3JlZGl0LCBbY3JlYXRlIGEgbmV3IGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vaXNhYWN0cGV0ZXJzZW4vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svaXNzdWVzKSBpbiB0aGUgW3RleHRib29rJ3MgR2l0SHViIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vayksIGFuZCBlbWFpbCBtZSBhZnRlciBkb2luZyBzby4KSSB3aWxsIGdpdmUgeW91IGFuIGFkZGl0aW9uYWwgMC41IHBvaW50IGV4dHJhIGNyZWRpdCAoZm9yIDEtcG9pbnQgZXh0cmEgaW4gdG90YWwpIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGZpeGVzL3N1Z2dlc3Rpb25zIHlvdSBzcGVjaWZ5LgpUbyByZWNlaXZlIHRoZSBleHRyYSBjcmVkaXQgZm9yIGltcGxlbWVudGluZyB0aGUgZml4L3N1Z2dlc3Rpb24sIFtjcmVhdGUgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wdWxscykgd2l0aCB5b3VyIGNoYW5nZXMsIGFuZCBlbWFpbCBtZSBhZnRlciBkb2luZyBzby4KRm9yIGluc3RydWN0aW9ucyByZWdhcmRpbmcgaG93IHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCwgc2VlIFtoZXJlXShodHRwczovL2RldnBzeWxhYi5naXRodWIuaW8vRGF0YUFuYWx5c2lzL2dpdC5odG1sI3B1bGwtcmVxdWVzdCkuCklmIHlvdSBhcmUgZ29pbmcgdG8gaW1wbGVtZW50IGEgY2hhbmdlLCBJIHN0cm9uZ2x5IGVuY291cmFnZSB5b3UgdG8gZGlzY3VzcyB3aXRoIG1lIGJlZm9yZSBkb2luZyBzbywgc28gSSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGNoYW5nZSBpcyB3b3J0aCBpbXBsZW1lbnRpbmcuCkkgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlICJmaXgiLCBzdWdnZXN0aW9uLCBvciBpbXBsZW1lbnRhdGlvbiB3YXJyYW50cyBleHRyYSBjcmVkaXQhClRoZSBleHRyYSBjcmVkaXQgbXVzdCBiZSBjb21wbGV0ZWQgYnkgdGhlIGxhc3QgZGF5IG9mIGNsYXNzLgoKSW4gYWRkaXRpb24sIHRoZSB3aW5uZXIocykgb2YgdGhlIGNsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlIHdpbGwgZ2V0IDEgcG9pbnQgZXh0cmEgY3JlZGl0LgpObyBhZGRpdGlvbmFsIGV4dHJhLWNyZWRpdCBvcHBvcnR1bml0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLgoKIyBUZW50YXRpdmUgQ291cnNlIE91dGxpbmUgKGV4YW0gZGF0ZXMgZml4ZWQpIHsjb3V0bGluZX0KClRoaXMgaXMgYSAqdGVudGF0aXZlKiBjb3Vyc2Ugb3V0bGluZS4KQ2hhbmdlcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBjbGFzcy4KVGhlcmUgYXJlIDE1IHdlZWtzIGluIHRoZSBzZW1lc3RlciwgYW5kIGNsYXNzIG1lZXRzIHR3aWNlIHBlciB3ZWVrICgzMCBzZWN0aW9ucykuCldlIHdpbGwgaGF2ZSBvbmUgZXhhbSBkdXJpbmcgdGhlIHNlbWVzdGVyIGFuZCBvbmUgZmluYWwgZXhhbSBkdXJpbmcgZmluYWxzIHdlZWsuCgp8ICoqU2VjdGlvbioqICAgICAgfCAqKkRheSoqIHwgKipEYXRlKiogfCAqKkNvbnRlbnQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVhZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBc3NpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfDotLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS18Oi0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgWzFdKCNzZWN0aW9uMSkgICB8IFQgICAgICAgfCAwOC8yNiAgICB8IE92ZXJ2aWV3IG9mIENsYXNzOyBPdmVydmlldyBvZiBGYW50YXN5IEZvb3RiYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAx4oCTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzJdKCNzZWN0aW9uMikgICB8IFRoICAgICAgfCAwOC8yOCAgICB8IFN0YXRpc3RpY2FsIFByb2dyYW1taW5nOiBVc2luZyBgUmAgZm9yIFN0YXRpc3RpY2FsIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgfCBDaCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFszXSgjc2VjdGlvbjMpICAgfCBUICAgICAgIHwgMDkvMDIgICAgfCBQbGF5ZXIgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggNjsgRGVuIEhhcnRpZ2ggZXQgYWwuICgyMDE4KSAgICAgfCAqKlNldCB1cCBibG9nOyBwb3N0IHdlbGNvbWUgYXJ0aWNsZSoqIHwKfCBbNF0oI3NlY3Rpb240KSAgIHwgVGggICAgICB8IDA5LzA0ICAgIHwgVGhlIERyYWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDc7IExlZSAmIExpdSAoMjAyMikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzVdKCNzZWN0aW9uNSkgICB8IFQgICAgICAgfCAwOS8wOSAgICB8IFN0YXRpc3RpY2FsIFByb2dyYW1taW5nIGluIGBSYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFs2XSgjc2VjdGlvbjYpICAgfCBUaCAgICAgIHwgMDkvMTEgICAgfCBCYXNpYyBTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggOOKAkzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqQmxvZyBhcnRpY2xlIDEgZHVlISoqICAgICAgICAgICAgICAgfAp8IFs3XSgjc2VjdGlvbjcpICAgfCBUICAgICAgIHwgMDkvMTYgICAgfCBEYXRhIFZpc3VhbGl6YXRpb24gYW5kIEludGVycHJldGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggNTsgU2Nod2FiaXNoICgyMDIxKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbOF0oI3NlY3Rpb244KSAgIHwgVGggICAgICB8IDA5LzE4ICAgIHwgQ29ycmVsYXRpb24gQW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDEwOyBHb29kd2luICYgTGVlY2ggKDIwMDYpICAgICAgIHwgKipCbG9nIGFydGljbGUgMiBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzldKCNzZWN0aW9uOSkgICB8IFQgICAgICAgfCAwOS8yMyAgICB8IE11bHRpcGxlIFJlZ3Jlc3Npb24gYW5kIE1peGVkIE1vZGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxMeKAkzEyOyBPc2Jvcm5lICYgV2F0ZXJzICgyMDAyKSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEwXSgjc2VjdGlvbjEwKSB8IFRoICAgICAgfCAwOS8yNSAgICB8IE1peGVkIE1vZGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxMzsgQnJhdWVyICYgS3VydGluICgyMDE4KSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxMV0oI3NlY3Rpb24xMSkgfCBUICAgICAgIHwgMDkvMzAgICAgfCBDYXVzYWwgSW5mZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTM7IEQnT25vZnJpbyBldCBhbC4gKDIwMjApICAgICAgfCAqKkJsb2cgYXJ0aWNsZSAzIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMTJdKCNzZWN0aW9uMTIpIHwgVGggICAgICB8IDEwLzAyICAgIHwgSGV1cmlzdGljcyBhbmQgQ29nbml0aXZlIEJpYXNlcyBpbiBQcmVkaWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDE0OyBUdmVyc2t5ICYgS2FobmVtYW4gKDE5NzQpICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEzXSgjc2VjdGlvbjEzKSB8IFQgICAgICAgfCAxMC8wNyAgICB8IEh1bWFuIEp1ZGdtZW50IHZzIEFjdHVhcmlhbCBBcHByb2FjaGVzIHRvIFByZWRpY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxNTsgR3JvdmUgZXQgYWwuICgyMDAwKSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNF0oI3NlY3Rpb24xNCkgfCBUaCAgICAgIHwgMTAvMDkgICAgfCBCYXNlIFJhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA0IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMTVdKCNzZWN0aW9uMTUpIHwgVCAgICAgICB8IDEwLzE0ICAgIHwgKipNaWR0ZXJtIEV4YW0qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE2XSgjc2VjdGlvbjE2KSB8IFRoICAgICAgfCAxMC8xNiAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy4x4oCTMTcuMTYuNSkgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE3XSgjc2VjdGlvbjE3KSB8IFQgICAgICAgfCAxMC8yMSAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy42LjbigJMxNy42LjgpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE4XSgjc2VjdGlvbjE4KSB8IFRoICAgICAgfCAxMC8yMyAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQ29udGludW91cyBPdXRjb21lcyAgICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy434oCTZW5kIG9mIGNoYXB0ZXIpIHwgKipCbG9nIGFydGljbGUgNSBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE5XSgjc2VjdGlvbjE5KSB8IFQgICAgICAgfCAxMC8yOCAgICB8IENhbGlicmF0aW9uIEFjY3VyYWN5OiBPdmVyY29uZmlkZW5jZSBCaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLYWhuZW1hbiAmIFR2ZXJza3kgKDE5OTYpOyBNYXNzZXkgJiBUaGFsZXIgKDIwMTMpIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyMF0oI3NlY3Rpb24yMCkgfCBUaCAgICAgIHwgMTAvMzAgICAgfCBNYWNoaW5lIExlYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA2IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMjFdKCNzZWN0aW9uMjEpIHwgVCAgICAgICB8IDExLzA0ICAgIHwgTXl0aGJ1c3RlcnM6IFB1dHRpbmcgRmFudGFzeSBGb290YmFsbCBCZWxpZWZzL0FuZWNkb3RlcyB0byB0aGUgVGVzdCAgICAgICAgICB8IENoIDE4OyBXaGl0ZSAmIFNoZWxkb24gKDIwMTQpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzIyXSgjc2VjdGlvbjIyKSB8IFRoICAgICAgfCAxMS8wNiAgICB8IE1vZGVybiBQb3J0Zm9saW8gVGhlb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqQmxvZyBhcnRpY2xlIDcgZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyM10oI3NlY3Rpb24yMykgfCBUICAgICAgIHwgMTEvMTEgICAgfCBDbHVzdGVyIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjRdKCNzZWN0aW9uMjQpIHwgVGggICAgICB8IDExLzEzICAgIHwgRmFjdG9yIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipCbG9nIGFydGljbGUgOCBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzI1XSgjc2VjdGlvbjI1KSB8IFQgICAgICAgfCAxMS8xOCAgICB8IERhdGEgUmVkdWN0aW9uOiBQcmluY2lwYWwgQ29tcG9uZW50IEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyNl0oI3NlY3Rpb24yNikgfCBUaCAgICAgIHwgMTEvMjAgICAgfCBTaW11bGF0aW9uIGFuZCB0aGUgTW9udGUgQ2FybG8gTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA5IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8IDExLzI04oCTMTEvMjcgfCAqKkZBTEwgQlJFQUsg4oCTIE5PIENMQVNTRVMqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyN10oI3NlY3Rpb24yNykgfCBUICAgICAgIHwgMTIvMDIgICAgfCBUaW1lIFNlcmllcyBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjhdKCNzZWN0aW9uMjgpIHwgVGggICAgICB8IDEyLzA0ICAgIHwgRGVjaXNpb24gTWFraW5nIGluIHRoZSBDb250ZXh0IG9mIFVuY2VydGFpbnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDI2OyBMYXJyaWNrIGV0IGFsLiAoMjAyNCkgICAgICAgIHwgKipCbG9nIGFydGljbGUgMTAgZHVlISoqICAgICAgICAgICAgICB8CnwgWzI5XSgjc2VjdGlvbjI5KSB8IFQgICAgICAgfCAxMi8wOSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IENvYWNoaW5nIGFuZCBSaXNrIEF2ZXJzaW9uICAgICAgICAgICAgICAgICAgfCBDaCAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFszMF0oI3NlY3Rpb24zMCkgfCBUaCAgICAgIHwgMTIvMTEgICAgfCBTcG9ydHMgYW5kIENvZ25pdGl2ZSBQc3ljaG9sb2d5OiBQc3ljaG9sb2dpY2FsIEZhY3RvcnMgaW4gUGxheWVyIFBlcmZvcm1hbmNlOyBFeHBlcnQgUGVyZm9ybWFuY2UgYW5kIEF1dG9tYXRpY2l0eSB8IENoIDI3IHwgKipCbG9nIGFydGljbGUgMTEgZHVlISoqICAgICAgIHwKfCBGaW5hbHMgV2VlayAgICAgIHwgICAgICAgICB8IFRCRCAod2VlayBvZiAxMi8xNSkgfCAqKkZpbmFsIEV4YW0qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIERhdGUgYW5kIFRpbWUgb2YgdGhlIEZpbmFsIEV4YW0geyNmaW5hbEV4YW19CgpUaGUgW2ZpbmFsIGV4YW1pbmF0aW9uIGRhdGUgYW5kIHRpbWVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9maW5hbC1leGFtLXNjaGVkdWxlcykgd2lsbCBiZSBhbm5vdW5jZWQgYnkgdGhlIFJlZ2lzdHJhciBnZW5lcmFsbHkgYnkgdGhlIGZpZnRoIHdlZWsgb2YgY2xhc3NlcywgYW5kIGl0IHdpbGwgYmUgYW5ub3VuY2VkIG9uIHRoZSBjb3Vyc2UgSUNPTiBzaXRlIG9uY2UgaXQgaXMga25vd24uCjx1PkRvIG5vdCBwbGFuIHlvdXIgZW5kIG9mIHRoZSBzZW1lc3RlciB0cmF2ZWwgcGxhbnMgdW50aWwgdGhlIGZpbmFsIGV4YW0gc2NoZWR1bGUgaXMgbWFkZSBwdWJsaWMuCkl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8ga25vdyB0aGUgZGF0ZSwgdGltZSwgYW5kIHBsYWNlIG9mIHRoZSBmaW5hbCBleGFtLjwvdT4KQWNjb3JkaW5nIHRvIFJlZ2lzdHJhcidzIGZpbmFsIGV4YW0gcG9saWN5LCBzdHVkZW50cyA8dT5oYXZlIGEgbWF4aW11bSBvZiB0d28gd2Vla3MgYWZ0ZXIgdGhlIGFubm91bmNlZCBmaW5hbCBleGFtIHNjaGVkdWxlPC91PiB0byByZXF1ZXN0IGEgY2hhbmdlIGlmIGFuIGV4YW0gY29uZmxpY3QgZXhpc3RzIG9yIGlmIGEgc3R1ZGVudCBoYXMgbW9yZSB0aGFuIHR3byBleGFtcyBpbiBvbmUgZGF5IChzZWUgdGhlIFtwb2xpY3ldKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9tYWtldXAtZmluYWwtZXhhbWluYXRpb24tcG9saWNpZXMpIGhlcmUpLgoKIyBDb3Vyc2UgUmVzb3VyY2VzIHsjY291cnNlUmVzb3VyY2VzfQoKVGhlcmUgYXJlIG1hbnkgY291cnNlIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugc3VjY2VlZCBpbiB0aGUgY2xhc3MsIGluY2x1ZGluZzoKCi0gUG93ZXJwb2ludCBzbGlkZXMgZm9yIGxlY3R1cmUKLSBnZXR0aW5nIGFuZCByZXZpZXdpbmcgbWlzc2VkIG5vdGVzIGZyb20gYSBwZWVyCi0gW2xlY3R1cmUgcmVjb3JkaW5nc10oI3JlY29yZGluZ3MpCi0gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSBhbmQgYXNzaWduZWQgcmVhZGluZ3MKLSByZXZpZXcgeW91ciByZWFkaW5nIHF1aXp6ZXMgYW5kIHRoZSBhbnN3ZXJzCi0gaW5zdHJ1Y3RvciBvZmZpY2UgaG91cnMKLSBwZWVyIHN0dWR5IGdyb3VwcwotIFR1dG9yIElvd2E6IGh0dHBzOi8vdHV0b3IudWlvd2EuZWR1CgojIERyb3AgRGVhZGxpbmUgZm9yIHRoaXMgQ291cnNlIHsjZHJvcERlYWRsaW5lfQoKWW91IG1heSBkcm9wIGFuIGluZGl2aWR1YWwgY291cnNlIGJlZm9yZSB0aGUgZHJvcCBkZWFkbGluZTsgYWZ0ZXIgdGhpcyBkZWFkbGluZSB5b3Ugd2lsbCBuZWVkIGNvbGxlZ2lhdGUgYXBwcm92YWwuCllvdSBjYW4gbG9vayB1cCB0aGUgZHJvcCBkZWFkbGluZSBmb3IgdGhpcyBjb3Vyc2UgW2hlcmVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9jb3Vyc2UtZGVhZGxpbmVzKS4KV2hlbiB5b3UgZHJvcCBhIGNvdXJzZSwgYSAiVyIgd2lsbCBhcHBlYXIgb24geW91ciB0cmFuc2NyaXB0LgpUaGUgbWFyayBvZiAiVyIgaXMgYSBuZXV0cmFsIG1hcmsgdGhhdCBkb2VzIG5vdCBhZmZlY3QgeW91ciBHUEEuClRvIGRpc2N1c3MgaG93IGRyb3BwaW5nIChvciBzdGF5aW5nIGluKSBhIGNvdXJzZSBtaWdodCBhZmZlY3QgeW91ciBhY2FkZW1pYyBnb2FscywgcGxlYXNlIGNvbnRhY3QgeW91ciBBY2FkZW1pYyBBZHZpc29yLgpEaXJlY3Rpb25zIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgYSBjb3Vyc2UgYW5kIG90aGVyIHJlZ2lzdHJhdGlvbiBjaGFuZ2VzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW1JlZ2lzdHJhcidzIHdlYnNpdGVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9jaGFuZ2UtcmVnaXN0cmF0aW9uLW15dWkpLgpTdHVkZW50cyBjYW4gZmluZCBwb2xpY2llcyBvbiBkcm9wcGluZyBDTEFTIGNvdXJzZXMgW2hlcmVdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvc3R1ZGVudHMvc3R1ZGVudHMtYWNhZGVtaWMtcG9saWNpZXMvcmVnaXN0cmF0aW9uLXBvbGljaWVzI2Ryb3BwaW5nKS4KU3R1ZGVudHMgc2hvdWxkIGFkaGVyZSB0byB0aGUgW2FjYWRlbWljIGRlYWRsaW5lc10oaHR0cHM6Ly9ncmFkLnVpb3dhLmVkdS9hY2FkZW1pY3MvZGVhZGxpbmVzKSBhbmQgcG9saWNpZXMgc2V0IGJ5IHRoZSBHcmFkdWF0ZSBDb2xsZWdlLgoKIyBGZWVkYmFjayBhYm91dCB0aGUgQ291cnNlIHsjZmVlZGJhY2t9CgpJIHdlbGNvbWUgZmVlZGJhY2sgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgY2xhc3MuCklmIHlvdSBoYXZlIGNvbW1lbnRzIG9uIHRoZSBjbGFzcyBvciBteSB0ZWFjaGluZywgcGxlYXNlIGZlZWwgZnJlZSB0byBtZWV0IHdpdGggbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KCiMjIFN0dWRlbnQgQ29tcGxhaW50cyB7I2NvbXBsYWludHN9CgpTdHVkZW50cyB3aXRoIGEgY29tcGxhaW50IGFib3V0IGEgZ3JhZGUgb3IgYSByZWxhdGVkIG1hdHRlciBzaG91bGQgZmlyc3QgZGlzY3VzcyB0aGUgc2l0dWF0aW9uIHdpdGggdGhlIGluc3RydWN0b3IsIGZpbmFsbHkgd2l0aCB0aGUgREVPIChDaGFpcikgb2YgdGhlIGRlcGFydG1lbnQsIHNjaG9vbCBvciBwcm9ncmFtIG9mZmVyaW5nIHRoZSBjb3Vyc2UuClNvbWV0aW1lcyBzdHVkZW50cyB3aWxsIGJlIHJlZmVycmVkIHRvIHRoZSBkZXBhcnRtZW50IG9yIHByb2dyYW0ncyBEaXJlY3RvciBvZiBVbmRlcmdyYWR1YXRlIFN0dWRpZXMgKERVUykgb3IgRGlyZWN0b3Igb2YgR3JhZHVhdGUgU3R1ZGllcyAoREdTKS4KU3R1ZGVudHMgc2hvdWxkIGNvbnRhY3QgW0NMQVMgVW5kZXJncmFkdWF0ZSBQcm9ncmFtc10oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9zdHVkZW50LXJpZ2h0cy1yZXNwb25zaWJpbGl0aWVzI3JpZ2h0cykgZm9yIHN1cHBvcnQgd2hlbiB0aGUgbWF0dGVyIGlzIG5vdCByZXNvbHZlZCBhdCB0aGUgcHJldmlvdXMgbGV2ZWwuCgojIENvbW11bmljYXRpb246IFVJIEVtYWlsIHsjZW1haWx9CgpTdHVkZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGFsbCBvZmZpY2lhbCBjb3JyZXNwb25kZW5jZXMgc2VudCB0byB0aGVpciBVSSBlbWFpbCBhZGRyZXNzICh1aW93YS5lZHUpIGFuZCBtdXN0IHVzZSB0aGlzIGFkZHJlc3MgZm9yIGFueSBjb21tdW5pY2F0aW9uIHdpdGggaW5zdHJ1Y3RvcnMgb3Igc3RhZmYgaW4gdGhlIFVJIGNvbW11bml0eS4KRm9yIHRoZSBwcml2YWN5IGFuZCB0aGUgcHJvdGVjdGlvbiBvZiBzdHVkZW50IHJlY29yZHMsIFVJIGZhY3VsdHkgYW5kIHN0YWZmIGNhbiBvbmx5IGNvcnJlc3BvbmQgd2l0aCBVSSBlbWFpbCBhZGRyZXNzZXMuCgojIyBPdGhlciBFeHBlY3RhdGlvbnMgb2YgU3R1ZGVudCBQZXJmb3JtYW5jZSB7I290aGVyRXhwZWN0YXRpb25zfQoKU3R1ZGVudHMgaGF2ZSB0aGUgcmlnaHQgdG8gYSBkaXN0cmFjdGlvbi1mcmVlIGxlYXJuaW5nIGVudmlyb25tZW50LgpZb3UgaGF2ZSB0aGUgcmVzcG9uc2liaWxpdHkgdG8gaGVscCBjcmVhdGUgc3VjaCBhIGNsYXNzcm9vbSBlbnZpcm9ubWVudC4KUGxlYXNlIHRyZWF0IG90aGVyIHN0dWRlbnRzIGluIHRoZSBjbGFzcyBhbmQgdGhlIGluc3RydWN0b3Igd2l0aCByZXNwZWN0LgpTdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gaGVscCBlYWNoIG90aGVyIGxlYXJuIGFuZCB0byBjb250cmlidXRlIG92ZXJhbGwgdG8gdGhlIGxlYXJuaW5nIGVudmlyb25tZW50IG9mIHRoZSBjb3Vyc2UuCkFycml2aW5nIHByZXBhcmVkIGZvciBjbGFzcyBpcyBwYXJ0IG9mIHRoaXMgZXhwZWN0YXRpb24uCgojIFVuaXZlcnNpdHkgUG9saWNpZXMgeyNVSW93YVBvbGljaWVzfQoKW1VuaXZlcnNpdHkgUG9saWNpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCgpbQWNjb21tb2RhdGlvbnMgZm9yIFN0dWRlbnRzIHdpdGggRGlzYWJpbGl0aWVzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhY2NvbW1vZGF0aW9ucy1mb3Itc3R1ZGVudHMtd2l0aC1kaXNhYmlsaXRpZXMpXApUaGUgVW5pdmVyc2l0eSBpcyBjb21taXR0ZWQgdG8gcHJvdmlkaW5nIGFuIGVkdWNhdGlvbmFsIGV4cGVyaWVuY2UgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvIGFsbCBzdHVkZW50cy4KSWYgYSBzdHVkZW50IGhhcyBhIGRpYWdub3NlZCBkaXNhYmlsaXR5IG9yIG90aGVyIGRpc2FibGluZyBjb25kaXRpb24gdGhhdCBtYXkgaW1wYWN0IHRoZSBzdHVkZW50J3MgYWJpbGl0eSB0byBjb21wbGV0ZSB0aGUgY291cnNlIHJlcXVpcmVtZW50cyBhcyBzdGF0ZWQgaW4gdGhlIHN5bGxhYnVzLCB0aGUgc3R1ZGVudCBtYXkgc2VlayBhY2NvbW1vZGF0aW9ucyB0aHJvdWdoIFtTdHVkZW50IERpc2FiaWxpdHkgU2VydmljZXNdKGh0dHBzOi8vc2RzLnN0dWRlbnRsaWZlLnVpb3dhLmVkdS9zdHVkZW50cykgKFNEUykuClNEUyBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIExldHRlcnMgb2YgQWNjb21tb2RhdGlvbiAoTE9BKSBhdmFpbGFibGUgdG8gdGhlIHN0dWRlbnQuCjx1PlRoZSBzdHVkZW50IG11c3QgcHJvdmlkZSBhbiBMT0EgdG8gdGhlIGluc3RydWN0b3IgYXMgZWFybHkgaW4gdGhlIHNlbWVzdGVyIGFzIHBvc3NpYmxlLCBidXQgcmVxdWVzdHMgbm90IG1hZGUgYXQgbGVhc3QgdHdvIHdlZWtzIHByaW9yIHRvIHRoZSBzY2hlZHVsZWQgYWN0aXZpdHkgZm9yIHdoaWNoIGFuIGFjY29tbW9kYXRpb24gaXMgc291Z2h0IG1heSBub3QgYmUgYWNjb21tb2RhdGVkLjwvdT4KVGhlIExPQSB3aWxsIHNwZWNpZnkgd2hhdCByZWFzb25hYmxlIGNvdXJzZSBhY2NvbW1vZGF0aW9ucyB0aGUgc3R1ZGVudCBpcyBlbGlnaWJsZSBmb3IgYW5kIHRob3NlIHRoZSBpbnN0cnVjdG9yIHNob3VsZCBwcm92aWRlLgoKLSBbRnJlZSBTcGVlY2ggYW5kIEV4cHJlc3Npb25dKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI2ZyZWUtc3BlZWNoLWFuZC1leHByZXNzaW9uKQotIFtOb24tRGlzY3JpbWluYXRpb25dKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI25vbi1kaXNjcmltaW5hdGlvbi1zdGF0ZW1lbnQpCi0gW0FjY29tbW9kYXRpb25zIGZvciBTdHVkZW50cyB3aXRoIERpc2FiaWxpdGllc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jYWNjb21tb2RhdGlvbnMtZm9yLXN0dWRlbnRzLXdpdGgtZGlzYWJpbGl0aWVzKQotIFtBYnNlbmNlcyBmcm9tIENsYXNzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhYnNlbmNlcy1mcm9tLWNsYXNzKQotIFtBYnNlbmNlcyBmb3IgUmVsaWdpb3VzIEhvbHkgRGF5c10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jYWJzZW5jZXMtZm9yLXJlbGlnaW91cy1ob2x5LWRheXMpCi0gW0Fic2VuY2VzIGZvciBNaWxpdGFyeSBTZXJ2aWNlIE9ibGlnYXRpb25zXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhYnNlbmNlcy1mb3ItbWlsaXRhcnktc2VydmljZS1vYmxpZ2F0aW9ucykKLSBbQ2xhc3Nyb29tIEV4cGVjdGF0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jY2xhc3Nyb29tLWV4cGVjdGF0aW9ucykKLSBbU2V4dWFsIEhhcmFzc21lbnQvTWlzY29uZHVjdCBhbmQgU3VwcG9ydGl2ZSBNZWFzdXJlc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jc2V4dWFsLWhhcmFzc21lbnQtLXNleHVhbC1taXNjb25kdWN0LWFuZC1zdXBwb3J0aXZlLW1lYXN1cmVzKQotIFtDb25mbGljdCBSZXNvbHV0aW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNjb25mbGljdC1yZXNvbHV0aW9uKQotIFtNZW50YWwgSGVhbHRoXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNtZW50YWwtaGVhbHRoKQotIFtCYXNpYyBOZWVkcyBhbmQgU3R1ZGVudCBTdXBwb3J0XShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNiYXNpYy1uZWVkcy1hbmQtc3R1ZGVudC1zdXBwb3J0KQotIFtTaGFyaW5nIG9mIENsYXNzIFJlY29yZGluZ3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI3NoYXJpbmctb2YtY2xhc3MtcmVjb3JkaW5ncy1pZi1hcHByb3ByaWF0ZSkKCiMgV2hlcmUgdG8gR2V0IEFjYWRlbWljIFN1cHBvcnQgZm9yIFRoaXMgQ291cnNlIHsjYWNhZGVtaWMtc3VwcG9ydH0KCi0gRHJvcC1pbiBzdHVkeSBncm91cHMgYW5kIG9uZS1vbi1vbmUgdHV0b3Jpbmc6IGRyb3AtaW4gc3R1ZGVudCBob3VycyBvZiB0aGUgPHU+dW5kZXJncmFkdWF0ZSBUQSwgZ3JhZHVhdGUgVEEsIGFuZDwvdT4gaW5zdHJ1Y3RvcgotIEZvcm1hbCB0dXRvcmluZzogVHV0b3IgSW93YTogaHR0cHM6Ly90dXRvci51aW93YS5lZHUKLSBVSSBXcml0aW5nIENlbnRlcjogaHR0cHM6Ly93cml0aW5nY2VudGVyLnVpb3dhLmVkdQotIEFjYWRlbWljIGFjY29tbW9kYXRpb25zOiBodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUKCiMgTWVudGFsIEhlYWx0aCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgU3VwcG9ydCB7I21lbnRhbC1oZWFsdGh9CgpTdHVkZW50cyBhcmUgZW5jb3VyYWdlZCB0byBiZSBtaW5kZnVsIG9mIHRoZWlyIG1lbnRhbCBoZWFsdGggYW5kIHNlZWsgaGVscCBhcyBhIHByZXZlbnRpdmUgbWVhc3VyZSBvciBpZiBmZWVsaW5nIG92ZXJ3aGVsbWVkIGFuZC9vciBzdHJ1Z2dsaW5nIHRvIG1lZXQgY291cnNlIGV4cGVjdGF0aW9ucy4KU3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gdGFsayB0byB0aGVpciBpbnN0cnVjdG9yIGZvciBhc3Npc3RhbmNlIHdpdGggY291cnNlLXJlbGF0ZWQgY29uY2VybnMuCkZvciBhZGRpdGlvbmFsIG1lbnRhbCBoZWFsdGggc3VwcG9ydCwgcGxlYXNlIHNlZSB0aGUgZ3VpZGFuY2UgYW5kIHJlc291cmNlcyBhdCBbbWVudGFsaGVhbHRoLnVpb3dhLmVkdV0oaHR0cDovL21lbnRhbGhlYWx0aC51aW93YS5lZHUpLCBpbmNsdWRpbmcgdGhlIDI0LTcgW1VJIFN1cHBvcnQgYW5kIENyaXNpcyBMaW5lXShodHRwczovL21lbnRhbGhlYWx0aC51aW93YS5lZHUvdWktc3VwcG9ydC1hbmQtY3Jpc2lzLWxpbmUpLiAgCgpBZGRpdGlvbmFsbHksIHRoZSBPZmZpY2Ugb2YgdGhlIERlYW4gb2YgU3R1ZGVudHMgY2FuIGhlbHAgc3R1ZGVudHMgbmF2aWdhdGUgcGVyc29uYWwgY3Jpc2lzIHNpdHVhdGlvbnMuClRoZXkgY2FuIHByb3ZpZGUgb25lLW9uLW9uZSBzdXBwb3J0LCBoZWxwIHdpdGggaWRlbnRpZnlpbmcgb3B0aW9ucywgYW5kIGFjY2VzcyB0byBbYmFzaWMgbmVlZHMgcmVzb3VyY2VzIChzdWNoIGFzIGZvb2QsIHJlbnQsIGNoaWxkY2FyZSwgZXRjLildKGh0dHA6Ly9iYXNpY25lZWRzLnVpb3dhLmVkdSkuClN0dWRlbnQgQ2FyZSBhbmQgQXNzaXN0YW5jZTogMTMyIElNVSwgW2Rvcy1hc3Npc3RhbmNlQHVpb3dhLmVkdV0obWFpbHRvOmRvcy1hc3Npc3RhbmNlQHVpb3dhLmVkdSksIG9yIDMxOS0zMzUtMTE2MiBhbmQgbW9yZSBpbmZvOiBbZG9zLnVpb3dhLmVkdS9hc3Npc3RhbmNlXShodHRwczovL2Rvcy51aW93YS5lZHUvYXNzaXN0YW5jZSkKCklmIHlvdSBmZWVsIHRoYXQgeW91IG9yIHNvbWVvbmUgeW91IGtub3cgbWF5IGJlIHN0cnVnZ2xpbmcgd2l0aCBhbiBhY2FkZW1pYywgZW1vdGlvbmFsLCBvciBwc3ljaG9sb2dpY2FsIHByb2JsZW0sIHRoZSBmb2xsb3dpbmcgb3JnYW5pemF0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhc3Npc3RhbmNlOgoKfCBTZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRhY3QgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgVW5pdmVyc2l0eSBvZiBJb3dhIEFjYWRlbWljIEFkdmlzaW5nIENlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNTMtNTcwMCwgaHR0cHM6Ly9hZHZpc2luZ2NlbnRlci51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgIHwKfCBVbml2ZXJzaXR5IENvdW5zZWxpbmcgU2VydmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMzNS03Mjk0LCBodHRwczovL3d3dy51aW93YS5lZHUvdWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFN0dWRlbnQgSGVhbHRoIFNlcnZpY2UgLSBNZW50YWwgSGVhbHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTgzOTQsIGh0dHBzOi8vc3R1ZGVudGhlYWx0aC51aW93YS5lZHUvc2VydmljZXMvcHN5Y2hpYXRyeSAgICB8CnwgVW5pdmVyc2l0eSBvZiBJb3dhIEhvc3BpdGFscyBhbmQgQ2xpbmljcyBBZHVsdCBQc3ljaGlhdHJ5IFNlcnZpY2VzIENsaW5pYyAgfCAzNTMtNjMxNCwgaHR0cHM6Ly93d3cudWloZWFsdGhjYXJlLm9yZy9Qc3ljaGlhdHJ5ICAgICAgICAgICAgICAgIHwKfCBTZWFzaG9yZSBDbGluaWMgKGluIHRoZSBVSSBEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzKSB8IDMzNS0yNDY3LCBodHRwczovL3BzeWNob2xvZ3kudWlvd2EuZWR1L3Jlc291cmNlcy9zZWFzaG9yZS1jbGluaWMgfAp8IFdvbWVuJ3MgUmVzb3VyY2UgYW5kIEFjdGlvbiBDZW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTE0ODYsIGh0dHBzOi8vd3JhYy51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgUmFwZSBWaWN0aW0gQWR2b2NhY3kgUHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMTktMzM1LTYwMDAgb3IgODAwLTIyOC0xNjI1LCBodHRwczovL3d3dy51aW93YS5lZHUvfnJ2YXAgICAgICAgIHwKfCBPZmZpY2Ugb2YgU2V4dWFsIE1pc2NvbmR1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMxOS0zMzUtNjIwMCwgaHR0cHM6Ly9vc21yYy51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IENvbW1Vbml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgODU1LTMyNS00Mjk2LCBodHRwczovL2J1aWx0Ynljb21tdW5pdHkub3JnL2NyaXNpcyAgICAgICAgICAgICAgICB8CnwgQ29tbXVuaXR5ICYgRmFtaWx5IFJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNTEtNDM1NywgaHR0cHM6Ly93d3cuY2ZyaGVscHMub3JnLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCjx1PklmIHlvdSBvciBzb21lb25lIHlvdSBrbm93IGlzIGNvbnRlbXBsYXRpbmcgc3VpY2lkZTwvdT4sIGVpdGhlciBjYWxsIG9yIHRleHQgdGhlIFN1aWNpZGUgYW5kIENyaXNpcyBMaWZlbGluZSBhdCA5ODgsIG9yIGNhbGwgOTExLgoKIyBEaXNjbG9zdXJlcyB7I2Rpc2Nsb3N1cmVzfQoKSSBhbSB0aGUgT3duZXIgb2YgRmFudGFzeSBGb290YmFsbCBBbmFseXRpY3MsIExMQywgd2hpY2ggb3BlcmF0ZXMgaHR0cHM6Ly9mYW50YXN5Zm9vdGJhbGxhbmFseXRpY3MubmV0LgpJIGRvIG5vdCByZXF1aXJlIG9yIGVuY291cmFnZSBzdHVkZW50cyB0byB1c2UgbXkgd2Vic2l0ZSwgYW5kIEkgZG8gbm90IHByb21vdGUgb3IgZW5kb3JzZSBhbnkgc3BlY2lmaWMgY29udGVudCBvciBzZXJ2aWNlcyBvZmZlcmVkIGJ5IEZhbnRhc3kgRm9vdGJhbGwgQW5hbHl0aWNzLgoKIyBEaXNjbGFpbWVyIHsjZGlzY2xhaW1lcn0KCiIqVGhpcyBtYXRlcmlhbCBwcm9iYWJseSB3b24ndCB3aW4geW91IGZhbnRhc3kgZm9vdGJhbGwgY2hhbXBpb25zaGlwcy4KWW91IGNvdWxkIHRha2Ugd2hhdCB3ZSBsZWFybiBhbmQgYXBwbHkgaXQgdG8gZmFudGFzeSBmb290YmFsbCBhbmQgeW91IG1pZ2h0IGJlY29tZSA1IHBlcmNlbnQgbW9yZSBsaWtlbHkgdG8gd2luLgpPci4uLgpDb25zaWRlciB0aGUgYnJvYWRlciByZWxldmFuY2Ugb2YgdGhpcy4KWW91IGNvdWxkIGxlYXJuIGRhdGEgYW5hbHlzaXMgYW5kIGZpZ3VyZSBvdXQgd2F5cyB0byBhcHBseSBpdCB0byBvdGhlciBzeXN0ZW1zLgpBbmQgeW91IGNvdWxkIGJlIG1ha2luZyBhIHNpeC1maWd1cmUgc2FsYXJ5IHdpdGhpbiB0aGUgbmV4dCBmaXZlIHllYXJzLioiCuKAkyBCZW5qYW1pbiBNb3R6LCBQaC5ELgoKVGhpcyBzeWxsYWJ1cyBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KQW55IGNoYW5nZXMgd2lsbCBiZSBkaXNjdXNzZWQgaW4gY2xhc3MsIHZpYSBlbWFpbCwgYW5kL29yIG9uIElDT04uCg==