“Via dynamic and interactive graphics, today’s technology allows students to visualize externally what they have difficulty representing mentally.”

David Moreau (2015), p. 2.



Research on human perception have taught us a lot about how to better communicate data through illustrations and graphics. Visualizing data-driven results continues to improve through psychological research and technological innovations. Today, researchers have greater capacity to collect better-quality data and in larger quantities (e.g., online surveys, cell phone applications, wearable technologies, social media, Google Analytics, etc.). In order to preserve the integrity and purpose of our graphs, data visualizations must be able to accommodate this surge in information volume and complexity of the digital age. Yet, despite the exponential growth in computing power and software tools, psychology researchers continue to rely mostly on static data visualizations.

The (Optical) Illusion of Current Data Visualization Practices

Static visualizations are entirely acceptable and appropriate for many purposes (as I hope the figures in this paper), however, as we transition into the big data era, relying only on static graphics may not be enough (Heer & Kandel, 2012). Static graphs can limit the type and amount of information one wishes to communicate, or the speed and comprehension of details the reader is meant to perceive; certain types of static graphs can often be no more than “visual tables” (Weissgerber et al., 2015, p. 1). In a 2014 systematic review of research articles published in the top 25% physiology journals, the authors found that the most common type of data visualizations are static graphs. And specifically, static bar graphs (Weissgerber et al., 2015). Although a recent1 systematic review in psychological research has yet to be published (to my knowledge), it appears that psychology suffers from the same graph use issues as physiology and other disciplines. The #barbarplots project (2017) examined 131 research articles from the first six month of 2016 in four high impact psychology journals and found that there is a substantial presence of static bar graphs. Particularly, from a total of 104 graphs presented, 55% of figures were static bar graphs.

Static bar graphs have been heavily criticized (especially with continuous data) for increasing the risk of misinterpreting research findings and providing limited information (Cooper et al., 2002; Gelman, 2017; Lane & Sándor, 2009; Schriger et al., 2006; Saxon, 2015; Weissgerber et al., 2015). For example, a static bar graph can portray potentially countless different distributions (e.g., bimodal, skewed, containing outliers, difference in sample size) the same way if their means and variability are similar (see Figure 1).

Figure 1. Many different datasets can lead to the same static bar graph. The full data may suggest different conclusions from the summary statistics. The means and standard errors (SEs) for the four example datasets shown in Panels B–E are all within 0.5 units of the means and SEs shown in the bar graph (Panel A). In Panel B, the distribution in both groups appears symmetric. Although the data suggest a small difference between groups, there is substantial overlap between groups. In Panel C, the apparent difference between groups is driven by an outlier. Panel D suggests a possible bimodal distribution. Additional data are needed to confirm that the distribution is bimodal and to determine whether this effect is explained by a covariate. In Panel E, the smaller range of values in group two may simply be because there are only three observations. Additional data for group two would be needed to determine whether the groups are different. Figure and caption adapted from Weissgerber et al. (2015).

This can mislead readers to make a certain set of assumptions (e.g., normality, equal sample size and variability, no outliers, etc.) which in reality might have never been met. In addition, if non-independent – or paired – data are presented using static bar graphs, readers might falsely infer independence and ignore within-subject differences (or lack thereof; see Figure 2).

Figure 2. Additional problems with using static bar graphs to show paired data. The bar graph (mean ± SE) suggests that the groups are independent and provides no information about whether changes are consistent across individuals (Panel A). The scatterplots shown in the Panels B–D clearly demonstrate that the data are paired. Each scatterplot reveals very different patterns of change, even though the means and SEs differ by less than 0.3 units. The lower scatterplots showing the differences between measurements allow readers to quickly assess the direction, magnitude, and distribution of the changes. The solid lines show the median difference. In Panel B, values for every subject are higher in the second condition. In Panel C, there are no consistent differences between the two conditions. Panel D suggests that there may be distinct subgroups of “responders” and “non-responders.” Figure and caption taken from Weissgerber et al. (2015)..

Of course, there are numerous types of static data visualizations, other than bar graphs, that might be better suited for the researcher or data scientist’s needs (e.g., scatterplots, line graphs, violin plots). Yet, static graphs (unintentionally) force the reader to look at the data through a single lens – only the one that the authors intended. The authors have complete and utter control over the type of graph, which variables go in, the scaling or truncation of axes, the angle or point of view (e.g., in a 3D plot), the colours, sizes, and more. Many static graphs can also be inaccessible to some readers. For example, readers who are colour blind or have difficulty with depth perception, graphs that include very small or too many labels, etc.

Furthermore, static figures prevent readers from exploring the visualized data independently and assessing data-driven conclusions impartially: readers cannot manipulate the graph, inspect particular observations, rescale the axes, or visualize different analyses. By doing so, we unintentionally limit the information presented and therefore transparency. This might sound normal; it is the default after all, we have been seeing static figures in academic journals for decades. But we now have the capacity to allow readers to share control over how the data is visualized, so why do we not make it the new “normal?”

This unintentional lack of transparency is problematic in data visualization as it is in other research aspects such as reporting practices (e.g., limited/ambiguous reporting, excluding analyses due to lack of statistical significance, etc.). Reporting practices, among other research facets, have been directly addressed and are improving thanks to various taskforces, the open science framework (OSF), and more. Given recent concerns about the replication crisis, publication bias, and lack of transparency in psychological research, a reform in data visualization should also be considered.

Enter Beyond-Static Graphics

Interactive and dynamic data visualizations can accommodate virtually endless amount and types of information. In fact, with interactive dynamic visualizations, readers can tailor and modify the graphic to display the details of their choosing. But, before we go deeper into why we should implement these data visualization methods, we first need to define what are interactive and dynamic visualizations. In this paper, I define three types of non-static data visualizations: interactive, dynamic, and interactive dynamic data visualizations. However, I will mostly focus on the latter type, interactive dynamic, due its advanced features and benefits.

In an interactive data visualization (IDV) the user2 can probe the presentation to view certain aspects of the data (e.g., value on another variable), and thus interact with the display directly instead of using menus or cross-referencing a table (Ward et al., 2015). Other interactive features may include scaling or zooming in and out on a particular slice of data, highlighting certain categories or values, rotating (in 3D graphics) or panning over, and more. An example of IDV is presented in Figure 3 and can be accessed here.

Figure 3. Interactive data visualization. This is a 3D scatter plot with interactive features. The dataset presented is ‘mtcars’ from the ‘datasets’ R package (R Core Team, 2022). The plot displays the relationship between different vehicle types (i.e., automatic in red and manual in blue), weight (x axis), time it takes to drive a quarter of a mile in minutes (y axis), and horsepower (z axis). The user can rotate the plot 360°, zoom in and out, pan the “camera” over, highlight one or more categories (e.g., red; automatic), hover over any individual observations to see its coordinates, and download a snapshot of the current position of the plot.

Dynamic data visualizations (DDV) are representations of data that can change their graphical make-up while presented (Ploetzner & Lowe, 2004; Schnotz et al., 1999). Kaput (1992) considered time as a dimension in DDV. This is, of course, true when visualizing time-series, hierarchical, or longitudinal designs, or to depict a process (e.g., neuron firing). However, in other designs, I argue, any variable – whether categorical or continuous – can serve as a dimension in DDV (e.g., treatment condition, IQ, etc.). In DDV, displayed values of the outcome can change (while still presented) as a function of another variable (e.g., time, group). In a linear, or automatic DDV, changes transpire on their own and cannot be altered by the user or reader. An example of DDV is presented in Figure 4 and is available here.

Figure 4. Dynamic data visualization. This is a scatter plot with dynamic features. The dataset presented comes from the ‘gapminder’ R package (Bryan, 2017). The plot displays the relationship between gross domestic product per capita (gdpPercap; x axis) and life expectancy in years (lifeExp; y axis) across different times, from 1952 to 2007 (bottom scale). The user can zoom in and out, highlight one or more categories (e.g., blue; Europe), hover over any individual observations to see specific details (as seen in the red box), and when the “play” button is pressed (bottom left corner), changes across the years can be seen via animation.

Lastly, as its name suggests, interactive dynamic data visualizations (IDDV) combine elements from both IDV and DDV and is therefore the best of both worlds. In IDDV, any change in the graphical structure follows a direct action from the user. This way, users have control over – or, can manipulate – how the data is displayed (Ploetzner & Lowe, 2004). In many cases, the viewer even has control over how the data is analyzed (see below example by Ellis & Merdian, 2015). Schwan and Riempp (2004) noted that IDDV “enable the user to adapt the presentation to [their] individual cognitive needs” (p. 296). An example of IDDV is presented in Figure 5 and is available here.

Figure 5. Interactive dynamic data visualization. This app allows users to visualize and analyze COVID-19 and SARS geographic and descriptive data across time using both interactive and dynamic features created by Parker (2022). Users can browse the different tabs at the top, adjust the date on the left blue scale, hover over any region or observation, apply filters/masks, pan over, zoom, view the raw data, and create a customized line graph.

Although there are mixed conclusions about the effectiveness of IDV and DDV (e.g., Hegarty, 2004; Hood et al., 2019; Ploetzner & Lowe, 2004; Rolfes et al., 2020; Schnotz et al., 1999; Schwan & Riempp, 2004), there is a growing body of literature advocating for the use of IDDV in both education and research settings (e.g., Ellis & Merdian, 2015; Heer, & Shneiderman, 2012; Rolfes et al., 2020; Ward et al., 2015).

Why We Should Use Interactive Dynamic Graphics in Psychology

There are many clear advantages to incorporating IDDV in academic articles and teaching. In this paper, I focus only on a few key reasons relating to open research practices, live data updates after visualization deployment, and effective data communication:

IDDV Incite Transparent Research Practices

Concerns about the credibility of previously published results in psychological research inspired new standards of recommended practices such as preregistration, registered reports, open data, shared analyses, etc. IDDV are much more aligned with the new standards of transparent research than static graphs. Thoughtful IDDV allow careful inspection of every dimension of the data, whereas with static visualizations, this is usually impossible or can make the graph too complex to comprehend. More advanced IDDV can even grant the reader the ability to explore and reanalyze the data on their own. This is perhaps one of the highest levels of open research practices. For example, in the IDDV example created by Ellis and Merdian (2015) using R Shiny app, the user can select the variables of their choice, differentiate by group, apply different filters or masks, and recalculate the regression equation and correlation coefficient (see Figure 6).

Figure 6. Interactive dynamic example with exploratory data analysis applications. This interactive dynamic figure allows the user to select the variables of their choice (from the dropdown menus at the top left), differentiate by group (male, female), apply different filters or masks (previous victim, not previous victim), and recalculate the regression equation and correlation coefficient (bottom right table). The user can also inspect the data using a different graph type (e.g., boxplot) by switching to the Boxplot tab above the figure.

Furthermore, with tools such as R Shiny, where the data and analyses are stored on the author’s server, users can have all the benefits of having access to the full dataset without compromising participant confidentiality. One of the main factors preventing researchers from making their data openly available to external evaluators is the risk of breaching ethical protocols and exposing private information. However, using IDDV, the data can still be investigated and reanalyzed by the user without actually having to share the data. Note that we could explore and visualize data in the Ellis and Merdian (2015) example above without having access to the Fear of Crime dataset.

Live Data Visualizations

IDDV can continue to receive new data and update its visual structure accordingly, even after its deployment. Normally, once a static plot or graph are produced, the figure cannot be changed. This can influence our conclusions, too; once a paper is finalized, the figures are produced, scientists publish their paper and (usually) never look back. However, in the current era of big data and cloud technology, it is possible and often useful to stream and visualize our data live as it is being collected. Imagine you are conducting a study looking at various transactions on a social media platform (e.g., Facebook, Twitter, Instagram). Using IDDV, researchers can follow and visualize their data in real-time as social transactions take place. For example, there is an existing dashboard visualizing a livestream downloads of R packages from CRAN (Sievert et al., 2022; see Figure 7). A similar app was attempted by Hadley Wickham (2019). This novel approach opens a lot of investigative avenues and provides useful tools to expend the arsenal of data visualization and research capabilities.

Figure 7. Interactive dynamic Live Data Visualization. livestream of download logs from cran.rstudio.com. This Shiny app illustrates the names and frequencies of R packages downloaded by users. Viewers can also manipulate the rate and capacity of the visualization, scan the raw logs in the top tab, review the source code, and share this app on various social media platforms.

IDDV are More Effective at Communicating Data

As Moreau beautifully put it, “[v]ia dynamic and interactive graphics, today’s technology allows students to visualize externally what they have difficulty representing mentally” (2015, p. 2). In a recent study, Hood and colleagues (2020) found that IDDV figures in digital publications were more effective at communicating main effects and null relationships than static graphs. In another study by Rolfes et al. (2020), students who were given materials visualized using IDDV performed significantly better than students in the static visualization group. These results suggest that IDDV might be more effective in communicating data. Furthermore, IDDV make active exploration possible where readers are free to interact with their data rather than trying to absorb it passively; functional engagement improves learning, interest, and comprehension (Bodemer et al., 2004). This is particularly helpful because direct interaction with visual content facilitates the involvement of the motor system (Wraga et al., 2003), which is essential for achieving deeper levels of understanding (Moreau, 2015).

Concluding Remarks

Designing and creating IDDV used to be a software developer’s job and required extensive programming skills in Java, HTML, or CSS. This certainly might have been an obstacle and deterrent for many. Fortunately, however, this is no longer the case. Nowadays, scientists and authors with working knowledge of R (R Core Team, 2022) can generate their own free IDDV using packages such as Shiny (RStudio Team, 2022), flexdashboard (Sievert et al., 2022) and esquisse (Meyer & Perrier, 2022) relatively easily. Of course, making IDDV is also possible without programming at all when using Tableau, Figma, and more. Though, these platforms might include fees.

IDDV also make graphs and figures much more accessible. IDDV allow users without prior software knowledge or fee-dependent license to explore and analyze data. The user-friendly interface implemented in most IDDV does not require programming abilities or downloading/purchasing software, which are otherwise required to manipulate and analyze data. In addition, shifting the control of various visual features (e.g., colour, position, size, speed) to the user can make graphs more convenient. Each user can tailor the graph to their own individual needs. To that extent, IDDV can accommodate wider range of abilities (e.g., colour blind, short sightedness, slow/quick processing speed, etc.).

That said, it is important to note that IDDV are not a silver bullet. Incorporating interactive and dynamic features to your graphs carelessly will not make them better. Designing your IDDV requires a lot of thought, planning, and work, probably even more than static graphs. For this reason, as with static graphics, it is useful for individuals to follow recommend practices and familiarize themselves with taxonomy and techniques (e.g., Heer & Schneiderman, 2012).

Incorporating IDDV into mainstream academia will not be easy, it certainly will require a long adjustment period and a steep learning curve (pun not intended). However, continuing to integrate new technologies into the field of data visualization is inevitable: it will happen in academia as it is happening in industry where large corporations have already begun applying the “fourth paradigm” (Tansley & Tolle, 2009) of advanced computing and (big) data-driven scientific breakthroughs.

Finally, the examples, reasons, and topics in this paper only begin to scratch the surface. Dynamic and interactive data visualizations are not entirely new. In fact, one occurrence of an interactive system for visualizing probability plots dates back to the late 1960s (Fowlkes, 1969, as cited in Friendly, 2008). Still, there is much more to learn about how interactive and dynamic features affect our perception and how we can harness these tools to improve data communication.


  1. Some less recent systematic reviews exist, see Best et al. (2001) and Cleveland (1984). Results from these reviews do not differ dramatically from those of the #barbarplots project (2017) and Weissgerber et al. (2015).↩︎

  2. I will use the terms user, reader, and viewer interchangeably from now on when referring to the “audience” or consumers of the graphics, as opposed to the researcher, author, or scientists who design/produce the graphics.↩︎

LS0tCnRpdGxlOiAiUmFpc2luZyB0aGUgQmFyIEdyYXBoOiBVcGdyYWRpbmcgdG8gSW50ZXJhY3RpdmUgRHluYW1pYyBEYXRhIFZpc3VhbGl6YXRpb25zIGluIFBzeWNob2xvZ3kiCmF1dGhvcjogIlVkaSBBbHRlciIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDYKICAgIHRvY19mbG9hdDogeWVzCiAgICB0aGVtZTogcmVhZGFibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKPGJyPgoKPiDigJxWaWEgZHluYW1pYyBhbmQgaW50ZXJhY3RpdmUgZ3JhcGhpY3MsIHRvZGF54oCZcyB0ZWNobm9sb2d5IGFsbG93cyBzdHVkZW50cyB0byB2aXN1YWxpemUgZXh0ZXJuYWxseSB3aGF0IHRoZXkgaGF2ZSBkaWZmaWN1bHR5IHJlcHJlc2VudGluZyBtZW50YWxseS7igJ0KPgoKIC0tLSA8Y2l0ZT5bRGF2aWQgTW9yZWF1ICgyMDE1KSwgcC4gMi5dKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTUuMDAzNDIpPC9jaXRlPgoKPGJyPjxicj4KCgpSZXNlYXJjaCBvbiBodW1hbiBwZXJjZXB0aW9uIGhhdmUgdGF1Z2h0IHVzIGEgbG90IGFib3V0IGhvdyB0byBiZXR0ZXIgY29tbXVuaWNhdGUgZGF0YSB0aHJvdWdoIGlsbHVzdHJhdGlvbnMgYW5kIGdyYXBoaWNzLiBWaXN1YWxpemluZyBkYXRhLWRyaXZlbiByZXN1bHRzIGNvbnRpbnVlcyB0byBpbXByb3ZlIHRocm91Z2ggcHN5Y2hvbG9naWNhbCByZXNlYXJjaCBhbmQgdGVjaG5vbG9naWNhbCBpbm5vdmF0aW9ucy4gVG9kYXksIHJlc2VhcmNoZXJzIGhhdmUgZ3JlYXRlciBjYXBhY2l0eSB0byBjb2xsZWN0IGJldHRlci1xdWFsaXR5IGRhdGEgYW5kIGluIGxhcmdlciBxdWFudGl0aWVzIChlLmcuLCBvbmxpbmUgc3VydmV5cywgY2VsbCBwaG9uZSBhcHBsaWNhdGlvbnMsIHdlYXJhYmxlIHRlY2hub2xvZ2llcywgc29jaWFsIG1lZGlhLCBHb29nbGUgQW5hbHl0aWNzLCBldGMuKS4gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGludGVncml0eSBhbmQgcHVycG9zZSBvZiBvdXIgZ3JhcGhzLCBkYXRhIHZpc3VhbGl6YXRpb25zIG11c3QgYmUgYWJsZSB0byBhY2NvbW1vZGF0ZSB0aGlzIHN1cmdlIGluIGluZm9ybWF0aW9uIHZvbHVtZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgZGlnaXRhbCBhZ2UuIFlldCwgZGVzcGl0ZSB0aGUgZXhwb25lbnRpYWwgZ3Jvd3RoIGluIGNvbXB1dGluZyBwb3dlciBhbmQgc29mdHdhcmUgdG9vbHMsIHBzeWNob2xvZ3kgcmVzZWFyY2hlcnMgY29udGludWUgdG8gcmVseSBtb3N0bHkgb24gc3RhdGljIGRhdGEgdmlzdWFsaXphdGlvbnMuCgojIyBUaGUgKE9wdGljYWwpIElsbHVzaW9uIG9mIEN1cnJlbnQgRGF0YSBWaXN1YWxpemF0aW9uIFByYWN0aWNlcwoKU3RhdGljIHZpc3VhbGl6YXRpb25zIGFyZSBlbnRpcmVseSBhY2NlcHRhYmxlIGFuZCBhcHByb3ByaWF0ZSBmb3IgbWFueSBwdXJwb3NlcyAoYXMgSSBob3BlIHRoZSBmaWd1cmVzIGluIHRoaXMgcGFwZXIpLCBob3dldmVyLCBhcyB3ZSB0cmFuc2l0aW9uIGludG8gdGhlIGJpZyBkYXRhIGVyYSwgcmVseWluZyBvbmx5IG9uIHN0YXRpYyBncmFwaGljcyBtYXkgbm90IGJlIGVub3VnaCAoW0hlZXIgJiBLYW5kZWwsIDIwMTJdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTQ1LzIzMzEwNDIuMjMzMTA1OCApKS4gU3RhdGljIGdyYXBocyBjYW4gbGltaXQgdGhlIHR5cGUgYW5kIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBvbmUgd2lzaGVzIHRvIGNvbW11bmljYXRlLCBvciB0aGUgc3BlZWQgYW5kIGNvbXByZWhlbnNpb24gb2YgZGV0YWlscyB0aGUgcmVhZGVyIGlzIG1lYW50IHRvIHBlcmNlaXZlOyBjZXJ0YWluIHR5cGVzIG9mIHN0YXRpYyBncmFwaHMgY2FuIG9mdGVuIGJlIG5vIG1vcmUgdGhhbiDigJx2aXN1YWwgdGFibGVz4oCdIChbV2Vpc3NnZXJiZXIgZXQgYWwuLCAyMDE1LCBwLiAxXShodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBiaW8uMTAwMjEyOCkpLiBJbiBhIDIwMTQgc3lzdGVtYXRpYyByZXZpZXcgb2YgcmVzZWFyY2ggYXJ0aWNsZXMgcHVibGlzaGVkIGluIHRoZSB0b3AgMjUlIHBoeXNpb2xvZ3kgam91cm5hbHMsIHRoZSBhdXRob3JzIGZvdW5kIHRoYXQgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGF0YSB2aXN1YWxpemF0aW9ucyBhcmUgc3RhdGljIGdyYXBocy4gQW5kIHNwZWNpZmljYWxseSwgc3RhdGljIGJhciBncmFwaHMgKFtXZWlzc2dlcmJlciBldCBhbC4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KSkuIEFsdGhvdWdoIGEgcmVjZW50XltTb21lIGxlc3MgcmVjZW50IHN5c3RlbWF0aWMgcmV2aWV3cyBleGlzdCwgc2VlIFtCZXN0IGV0IGFsLiAoMjAwMSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L3MwMzc2LTYzNTcoMDEpMDAxNTYtNSApIGFuZCBbQ2xldmVsYW5kICgxOTg0KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjIzMDcvMjY4MzQwMCkuIFJlc3VsdHMgZnJvbSB0aGVzZSByZXZpZXdzIGRvIG5vdCBkaWZmZXIgZHJhbWF0aWNhbGx5IGZyb20gdGhvc2Ugb2YgdGhlIFsjYmFyYmFycGxvdHMgcHJvamVjdCAoMjAxNyldKGh0dHBzOi8vd3d3LmtpY2tzdGFydGVyLmNvbS9wcm9qZWN0cy8xNDc0NTg4NDczL2JhcmJhcnBsb3RzKSBhbmQgW1dlaXNzZ2VyYmVyIGV0IGFsLiAoMjAxNSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KS5dICBzeXN0ZW1hdGljIHJldmlldyBpbiBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoIGhhcyB5ZXQgdG8gYmUgcHVibGlzaGVkICh0byBteSBrbm93bGVkZ2UpLCBpdCBhcHBlYXJzIHRoYXQgcHN5Y2hvbG9neSBzdWZmZXJzIGZyb20gdGhlIHNhbWUgZ3JhcGggdXNlIGlzc3VlcyBhcyBwaHlzaW9sb2d5IGFuZCBvdGhlciBkaXNjaXBsaW5lcy4gVGhlIFsjYmFyYmFycGxvdHMgcHJvamVjdCAoMjAxNyldKGh0dHBzOi8vd3d3LmtpY2tzdGFydGVyLmNvbS9wcm9qZWN0cy8xNDc0NTg4NDczL2JhcmJhcnBsb3RzKSBleGFtaW5lZCAxMzEgcmVzZWFyY2ggYXJ0aWNsZXMgZnJvbSB0aGUgZmlyc3Qgc2l4IG1vbnRoIG9mIDIwMTYgaW4gZm91ciBoaWdoIGltcGFjdCBwc3ljaG9sb2d5IGpvdXJuYWxzIGFuZCBmb3VuZCB0aGF0IHRoZXJlIGlzIGEgc3Vic3RhbnRpYWwgcHJlc2VuY2Ugb2Ygc3RhdGljIGJhciBncmFwaHMuIFBhcnRpY3VsYXJseSwgZnJvbSBhIHRvdGFsIG9mIDEwNCBncmFwaHMgcHJlc2VudGVkLCA1NSUgb2YgZmlndXJlcyB3ZXJlIHN0YXRpYyBiYXIgZ3JhcGhzLgo8YnI+PGJyPgpTdGF0aWMgYmFyIGdyYXBocyBoYXZlIGJlZW4gaGVhdmlseSBjcml0aWNpemVkIChlc3BlY2lhbGx5IHdpdGggY29udGludW91cyBkYXRhKSBmb3IgaW5jcmVhc2luZyB0aGUgcmlzayBvZiBtaXNpbnRlcnByZXRpbmcgcmVzZWFyY2ggZmluZGluZ3MgYW5kIHByb3ZpZGluZyBsaW1pdGVkIGluZm9ybWF0aW9uIChbQ29vcGVyIGV0IGFsLiwgMjAwMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwNjcvbWVtLjIwMDIuMTI3MzI3KTsgW0dlbG1hbiwgMjAxN10oaHR0cDovL2FuZHJld2dlbG1hbi5jb20vMjAxNy8wNy8xNi9ncmFwaHMtY29tcGFyaXNvbnMtY2FzZS1zdHVkeSk7IFtMYW5lICYgU8OhbmRvciwgMjAwOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzcvYTAwMTY2MjApOyBbU2NocmlnZXIgZXQgYWwuLCAyMDA2XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmFubmVtZXJnbWVkLjIwMDYuMDYuMDE3KTsgW1NheG9uLCAyMDE1XShodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTI5MTUtMDE1LTAxNjktNik7IFtXZWlzc2dlcmJlciBldCBhbC4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KSkuIEZvciBleGFtcGxlLCBhIHN0YXRpYyBiYXIgZ3JhcGggY2FuIHBvcnRyYXkgcG90ZW50aWFsbHkgY291bnRsZXNzIGRpZmZlcmVudCBkaXN0cmlidXRpb25zIChlLmcuLCBiaW1vZGFsLCBza2V3ZWQsIGNvbnRhaW5pbmcgb3V0bGllcnMsIGRpZmZlcmVuY2UgaW4gc2FtcGxlIHNpemUpIHRoZSBzYW1lIHdheSBpZiB0aGVpciBtZWFucyBhbmQgdmFyaWFiaWxpdHkgYXJlIHNpbWlsYXIgKHNlZSBGaWd1cmUgMSkuIAoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+IAohWyoqRmlndXJlIDEuIE1hbnkgZGlmZmVyZW50IGRhdGFzZXRzIGNhbiBsZWFkIHRvIHRoZSBzYW1lIHN0YXRpYyBiYXIgZ3JhcGguKiogVGhlIGZ1bGwgZGF0YSBtYXkgc3VnZ2VzdCBkaWZmZXJlbnQgY29uY2x1c2lvbnMgZnJvbSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzLiBUaGUgbWVhbnMgYW5kIHN0YW5kYXJkIGVycm9ycyAoU0VzKSBmb3IgdGhlIGZvdXIgZXhhbXBsZSBkYXRhc2V0cyBzaG93biBpbiBQYW5lbHMgQuKAk0UgYXJlIGFsbCB3aXRoaW4gMC41IHVuaXRzIG9mIHRoZSBtZWFucyBhbmQgU0VzIHNob3duIGluIHRoZSBiYXIgZ3JhcGggKFBhbmVsIEEpLiBJbiBQYW5lbCBCLCB0aGUgZGlzdHJpYnV0aW9uIGluIGJvdGggZ3JvdXBzIGFwcGVhcnMgc3ltbWV0cmljLiBBbHRob3VnaCB0aGUgZGF0YSBzdWdnZXN0IGEgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyb3VwcywgdGhlcmUgaXMgc3Vic3RhbnRpYWwgb3ZlcmxhcCBiZXR3ZWVuIGdyb3Vwcy4gSW4gUGFuZWwgQywgdGhlIGFwcGFyZW50IGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cHMgaXMgZHJpdmVuIGJ5IGFuIG91dGxpZXIuIFBhbmVsIEQgc3VnZ2VzdHMgYSBwb3NzaWJsZSBiaW1vZGFsIGRpc3RyaWJ1dGlvbi4gQWRkaXRpb25hbCBkYXRhIGFyZSBuZWVkZWQgdG8gY29uZmlybSB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgYmltb2RhbCBhbmQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBlZmZlY3QgaXMgZXhwbGFpbmVkIGJ5IGEgY292YXJpYXRlLiBJbiBQYW5lbCBFLCB0aGUgc21hbGxlciByYW5nZSBvZiB2YWx1ZXMgaW4gZ3JvdXAgdHdvIG1heSBzaW1wbHkgYmUgYmVjYXVzZSB0aGVyZSBhcmUgb25seSB0aHJlZSBvYnNlcnZhdGlvbnMuIEFkZGl0aW9uYWwgZGF0YSBmb3IgZ3JvdXAgdHdvIHdvdWxkIGJlIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ3JvdXBzIGFyZSBkaWZmZXJlbnQuIEZpZ3VyZSBhbmQgY2FwdGlvbiBhZGFwdGVkIGZyb20gV2Vpc3NnZXJiZXIgZXQgYWwuICgyMDE1KS5dKEZpZzEucG5nKXt3aWR0aD0xMDAlfQo8L2Rpdj4KClRoaXMgY2FuIG1pc2xlYWQgcmVhZGVycyB0byBtYWtlIGEgY2VydGFpbiBzZXQgb2YgYXNzdW1wdGlvbnMgKGUuZy4sIG5vcm1hbGl0eSwgZXF1YWwgc2FtcGxlIHNpemUgYW5kIHZhcmlhYmlsaXR5LCBubyBvdXRsaWVycywgZXRjLikgd2hpY2ggaW4gcmVhbGl0eSBtaWdodCBoYXZlIG5ldmVyIGJlZW4gbWV0LiBJbiBhZGRpdGlvbiwgaWYgbm9uLWluZGVwZW5kZW50IOKAkyBvciBwYWlyZWQg4oCTIGRhdGEgYXJlIHByZXNlbnRlZCB1c2luZyBzdGF0aWMgYmFyIGdyYXBocywgcmVhZGVycyBtaWdodCBmYWxzZWx5IGluZmVyIGluZGVwZW5kZW5jZSBhbmQgaWdub3JlIHdpdGhpbi1zdWJqZWN0IGRpZmZlcmVuY2VzIChvciBsYWNrIHRoZXJlb2Y7IHNlZSBGaWd1cmUgMikuCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4gCiFbKipGaWd1cmUgMi4gQWRkaXRpb25hbCBwcm9ibGVtcyB3aXRoIHVzaW5nIHN0YXRpYyBiYXIgZ3JhcGhzIHRvIHNob3cgcGFpcmVkIGRhdGEuKiogVGhlIGJhciBncmFwaCAobWVhbiDCsSBTRSkgc3VnZ2VzdHMgdGhhdCB0aGUgZ3JvdXBzIGFyZSBpbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBjaGFuZ2VzIGFyZSBjb25zaXN0ZW50IGFjcm9zcyBpbmRpdmlkdWFscyAoUGFuZWwgQSkuIFRoZSBzY2F0dGVycGxvdHMgc2hvd24gaW4gdGhlIFBhbmVscyBC4oCTRCBjbGVhcmx5IGRlbW9uc3RyYXRlIHRoYXQgdGhlIGRhdGEgYXJlIHBhaXJlZC4gRWFjaCBzY2F0dGVycGxvdCByZXZlYWxzIHZlcnkgZGlmZmVyZW50IHBhdHRlcm5zIG9mIGNoYW5nZSwgZXZlbiB0aG91Z2ggdGhlIG1lYW5zIGFuZCBTRXMgZGlmZmVyIGJ5IGxlc3MgdGhhbiAwLjMgdW5pdHMuIFRoZSBsb3dlciBzY2F0dGVycGxvdHMgc2hvd2luZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBtZWFzdXJlbWVudHMgYWxsb3cgcmVhZGVycyB0byBxdWlja2x5IGFzc2VzcyB0aGUgZGlyZWN0aW9uLCBtYWduaXR1ZGUsIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIGNoYW5nZXMuIFRoZSBzb2xpZCBsaW5lcyBzaG93IHRoZSBtZWRpYW4gZGlmZmVyZW5jZS4gSW4gUGFuZWwgQiwgdmFsdWVzIGZvciBldmVyeSBzdWJqZWN0IGFyZSBoaWdoZXIgaW4gdGhlIHNlY29uZCBjb25kaXRpb24uIEluIFBhbmVsIEMsIHRoZXJlIGFyZSBubyBjb25zaXN0ZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBjb25kaXRpb25zLiBQYW5lbCBEIHN1Z2dlc3RzIHRoYXQgdGhlcmUgbWF5IGJlIGRpc3RpbmN0IHN1Ymdyb3VwcyBvZiDigJxyZXNwb25kZXJz4oCdIGFuZCDigJxub24tcmVzcG9uZGVycy7igJ0gRmlndXJlIGFuZCBjYXB0aW9uIHRha2VuIGZyb20gV2Vpc3NnZXJiZXIgZXQgYWwuICgyMDE1KS4uXShGaWcyLnBuZyl7d2lkdGg9MTAwJX0KPC9kaXY+CgpPZiBjb3Vyc2UsIHRoZXJlIGFyZSBudW1lcm91cyB0eXBlcyBvZiBzdGF0aWMgZGF0YSB2aXN1YWxpemF0aW9ucywgb3RoZXIgdGhhbiBiYXIgZ3JhcGhzLCB0aGF0IG1pZ2h0IGJlIGJldHRlciBzdWl0ZWQgZm9yIHRoZSByZXNlYXJjaGVyIG9yIGRhdGEgc2NpZW50aXN04oCZcyBuZWVkcyAoZS5nLiwgc2NhdHRlcnBsb3RzLCBsaW5lIGdyYXBocywgdmlvbGluIHBsb3RzKS4gWWV0LCBzdGF0aWMgZ3JhcGhzICh1bmludGVudGlvbmFsbHkpIGZvcmNlIHRoZSByZWFkZXIgdG8gbG9vayBhdCB0aGUgZGF0YSB0aHJvdWdoIGEgc2luZ2xlIGxlbnMg4oCTIG9ubHkgdGhlIG9uZSB0aGF0IHRoZSBhdXRob3JzIGludGVuZGVkLiBUaGUgYXV0aG9ycyBoYXZlIGNvbXBsZXRlIGFuZCB1dHRlciBjb250cm9sIG92ZXIgdGhlIHR5cGUgb2YgZ3JhcGgsIHdoaWNoIHZhcmlhYmxlcyBnbyBpbiwgdGhlIHNjYWxpbmcgb3IgdHJ1bmNhdGlvbiBvZiBheGVzLCB0aGUgYW5nbGUgb3IgcG9pbnQgb2YgdmlldyAoZS5nLiwgaW4gYSAzRCBwbG90KSwgdGhlIGNvbG91cnMsIHNpemVzLCBhbmQgbW9yZS4gTWFueSBzdGF0aWMgZ3JhcGhzIGNhbiBhbHNvIGJlIGluYWNjZXNzaWJsZSB0byBzb21lIHJlYWRlcnMuIEZvciBleGFtcGxlLCByZWFkZXJzIHdobyBhcmUgY29sb3VyIGJsaW5kIG9yIGhhdmUgZGlmZmljdWx0eSB3aXRoIGRlcHRoIHBlcmNlcHRpb24sIGdyYXBocyB0aGF0IGluY2x1ZGUgdmVyeSBzbWFsbCBvciB0b28gbWFueSBsYWJlbHMsIGV0Yy4gCjxicj48YnI+CkZ1cnRoZXJtb3JlLCBzdGF0aWMgZmlndXJlcyBwcmV2ZW50IHJlYWRlcnMgZnJvbSBleHBsb3JpbmcgdGhlIHZpc3VhbGl6ZWQgZGF0YSBpbmRlcGVuZGVudGx5IGFuZCBhc3Nlc3NpbmcgZGF0YS1kcml2ZW4gY29uY2x1c2lvbnMgaW1wYXJ0aWFsbHk6IHJlYWRlcnMgY2Fubm90IG1hbmlwdWxhdGUgdGhlIGdyYXBoLCBpbnNwZWN0IHBhcnRpY3VsYXIgb2JzZXJ2YXRpb25zLCByZXNjYWxlIHRoZSBheGVzLCBvciB2aXN1YWxpemUgZGlmZmVyZW50IGFuYWx5c2VzLiBCeSBkb2luZyBzbywgd2UgdW5pbnRlbnRpb25hbGx5IGxpbWl0IHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgYW5kIHRoZXJlZm9yZSB0cmFuc3BhcmVuY3kuIFRoaXMgbWlnaHQgc291bmQgbm9ybWFsOyBpdCBpcyB0aGUgZGVmYXVsdCBhZnRlciBhbGwsIHdlIGhhdmUgYmVlbiBzZWVpbmcgc3RhdGljIGZpZ3VyZXMgaW4gYWNhZGVtaWMgam91cm5hbHMgZm9yIGRlY2FkZXMuIEJ1dCB3ZSBub3cgaGF2ZSB0aGUgY2FwYWNpdHkgdG8gYWxsb3cgcmVhZGVycyB0byBzaGFyZSBjb250cm9sIG92ZXIgaG93IHRoZSBkYXRhIGlzIHZpc3VhbGl6ZWQsIHNvIHdoeSBkbyB3ZSBub3QgbWFrZSBpdCB0aGUgbmV3IOKAnG5vcm1hbD/igJ0KPGJyPjxicj4KVGhpcyB1bmludGVudGlvbmFsIGxhY2sgb2YgdHJhbnNwYXJlbmN5IGlzIHByb2JsZW1hdGljIGluIGRhdGEgdmlzdWFsaXphdGlvbiBhcyBpdCBpcyBpbiBvdGhlciByZXNlYXJjaCBhc3BlY3RzIHN1Y2ggYXMgcmVwb3J0aW5nIHByYWN0aWNlcyAoZS5nLiwgbGltaXRlZC9hbWJpZ3VvdXMgcmVwb3J0aW5nLCBleGNsdWRpbmcgYW5hbHlzZXMgZHVlIHRvIGxhY2sgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLCBldGMuKS4gUmVwb3J0aW5nIHByYWN0aWNlcywgYW1vbmcgb3RoZXIgcmVzZWFyY2ggZmFjZXRzLCBoYXZlIGJlZW4gZGlyZWN0bHkgYWRkcmVzc2VkIGFuZCBhcmUgaW1wcm92aW5nIHRoYW5rcyB0byB2YXJpb3VzIHRhc2tmb3JjZXMsIHRoZSBbb3BlbiBzY2llbmNlIGZyYW1ld29yayAoT1NGKV0oaHR0cHM6Ly9vc2YuaW8vKSwgYW5kIG1vcmUuIEdpdmVuIHJlY2VudCBjb25jZXJucyBhYm91dCB0aGUgcmVwbGljYXRpb24gY3Jpc2lzLCBwdWJsaWNhdGlvbiBiaWFzLCBhbmQgbGFjayBvZiB0cmFuc3BhcmVuY3kgaW4gcHN5Y2hvbG9naWNhbCByZXNlYXJjaCwgYSByZWZvcm0gaW4gZGF0YSB2aXN1YWxpemF0aW9uIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQuIAoKCiMjIEVudGVyIEJleW9uZC1TdGF0aWMgR3JhcGhpY3MKCkludGVyYWN0aXZlIGFuZCBkeW5hbWljIGRhdGEgdmlzdWFsaXphdGlvbnMgY2FuIGFjY29tbW9kYXRlIHZpcnR1YWxseSBlbmRsZXNzIGFtb3VudCBhbmQgdHlwZXMgb2YgaW5mb3JtYXRpb24uIEluIGZhY3QsIHdpdGggaW50ZXJhY3RpdmUgZHluYW1pYyB2aXN1YWxpemF0aW9ucywgcmVhZGVycyBjYW4gdGFpbG9yIGFuZCBtb2RpZnkgdGhlIGdyYXBoaWMgdG8gZGlzcGxheSB0aGUgZGV0YWlscyBvZiB0aGVpciBjaG9vc2luZy4gQnV0LCBiZWZvcmUgd2UgZ28gZGVlcGVyIGludG8gd2h5IHdlIHNob3VsZCBpbXBsZW1lbnQgdGhlc2UgZGF0YSB2aXN1YWxpemF0aW9uIG1ldGhvZHMsIHdlIGZpcnN0IG5lZWQgdG8gZGVmaW5lIHdoYXQgYXJlIGludGVyYWN0aXZlIGFuZCBkeW5hbWljIHZpc3VhbGl6YXRpb25zLiBJbiB0aGlzIHBhcGVyLCBJIGRlZmluZSB0aHJlZSB0eXBlcyBvZiBub24tc3RhdGljIGRhdGEgdmlzdWFsaXphdGlvbnM6IGludGVyYWN0aXZlLCBkeW5hbWljLCBhbmQgaW50ZXJhY3RpdmUgZHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb25zLiBIb3dldmVyLCBJIHdpbGwgbW9zdGx5IGZvY3VzIG9uIHRoZSBsYXR0ZXIgdHlwZSwgaW50ZXJhY3RpdmUgZHluYW1pYywgZHVlIGl0cyBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgYmVuZWZpdHMuCjxicj48YnI+CkluIGFuICoqaW50ZXJhY3RpdmUgZGF0YSB2aXN1YWxpemF0aW9uIChJRFYpKiogdGhlIHVzZXJeW0kgd2lsbCB1c2UgdGhlIHRlcm1zIHVzZXIsIHJlYWRlciwgYW5kIHZpZXdlciBpbnRlcmNoYW5nZWFibHkgZnJvbSBub3cgb24gd2hlbiByZWZlcnJpbmcgdG8gdGhlIOKAnGF1ZGllbmNl4oCdIG9yIGNvbnN1bWVycyBvZiB0aGUgZ3JhcGhpY3MsIGFzIG9wcG9zZWQgdG8gdGhlIHJlc2VhcmNoZXIsIGF1dGhvciwgb3Igc2NpZW50aXN0cyB3aG8gZGVzaWduL3Byb2R1Y2UgdGhlIGdyYXBoaWNzLl0gIGNhbiBwcm9iZSB0aGUgcHJlc2VudGF0aW9uIHRvIHZpZXcgY2VydGFpbiBhc3BlY3RzIG9mIHRoZSBkYXRhIChlLmcuLCB2YWx1ZSBvbiBhbm90aGVyIHZhcmlhYmxlKSwgYW5kIHRodXMgaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIG1lbnVzIG9yIGNyb3NzLXJlZmVyZW5jaW5nIGEgdGFibGUgKFtXYXJkIGV0IGFsLiwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEyMDEvOTc4MDQyOTEwODQzMykpLiBPdGhlciBpbnRlcmFjdGl2ZSBmZWF0dXJlcyBtYXkgaW5jbHVkZSBzY2FsaW5nIG9yIHpvb21pbmcgaW4gYW5kIG91dCBvbiBhIHBhcnRpY3VsYXIgc2xpY2Ugb2YgZGF0YSwgaGlnaGxpZ2h0aW5nIGNlcnRhaW4gY2F0ZWdvcmllcyBvciB2YWx1ZXMsIHJvdGF0aW5nIChpbiAzRCBncmFwaGljcykgb3IgcGFubmluZyBvdmVyLCBhbmQgbW9yZS4gQW4gZXhhbXBsZSBvZiBJRFYgaXMgcHJlc2VudGVkIGluIEZpZ3VyZSAzIGFuZCBjYW4gYmUgYWNjZXNzZWQgW2hlcmVdKGh0dHBzOi8vcGxvdGx5LmNvbS9yLzNkLXNjYXR0ZXItcGxvdHMvKS4KCgpgYGB7ciBGaWd1cmUgMywgZWNobz1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMCldIDwtICdBdXRvbWF0aWMnCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMSldIDwtICdNYW51YWwnCm10Y2FycyRhbSA8LSBhcy5mYWN0b3IobXRjYXJzJGFtKQoKZmlnIDwtIHBsb3RfbHkobXRjYXJzLCB4ID0gfnd0LCB5ID0gfmhwLCB6ID0gfnFzZWMsIGNvbG9yID0gfmFtLCBjb2xvcnMgPSBjKCcjQkYzODJBJywgJyMwQzRCOEUnKSkKZmlnIDwtIGZpZyAlPiUgYWRkX21hcmtlcnMoKQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdXZWlnaHQnKSwKICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0dyb3NzIGhvcnNlcG93ZXInKSwKICAgICAgICAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gJzEvNCBtaWxlIHRpbWUnKSkpCgpmaWcKYGBgCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLWRlZmF1bHQiPgoqKkZpZ3VyZSAzLiBJbnRlcmFjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb24uKiogVGhpcyBpcyBhIDNEIHNjYXR0ZXIgcGxvdCB3aXRoIGludGVyYWN0aXZlIGZlYXR1cmVzLiBUaGUgZGF0YXNldCBwcmVzZW50ZWQgaXMg4oCYbXRjYXJz4oCZIGZyb20gdGhlIOKAmGRhdGFzZXRz4oCZIFIgcGFja2FnZSAoW1IgQ29yZSBUZWFtLCAyMDIyXShodHRwczovL3d3dy5SLXByb2plY3Qub3JnLykpLiBUaGUgcGxvdCBkaXNwbGF5cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZGlmZmVyZW50IHZlaGljbGUgdHlwZXMgKGkuZS4sIGF1dG9tYXRpYyBpbiByZWQgYW5kIG1hbnVhbCBpbiBibHVlKSwgd2VpZ2h0ICh4IGF4aXMpLCB0aW1lIGl0IHRha2VzIHRvIGRyaXZlIGEgcXVhcnRlciBvZiBhIG1pbGUgaW4gbWludXRlcyAoeSBheGlzKSwgYW5kIGhvcnNlcG93ZXIgKHogYXhpcykuIFRoZSB1c2VyIGNhbiByb3RhdGUgdGhlIHBsb3QgMzYwwrAsIHpvb20gaW4gYW5kIG91dCwgcGFuIHRoZSDigJxjYW1lcmHigJ0gb3ZlciwgaGlnaGxpZ2h0IG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgKGUuZy4sIHJlZDsgYXV0b21hdGljKSwgaG92ZXIgb3ZlciBhbnkgaW5kaXZpZHVhbCBvYnNlcnZhdGlvbnMgdG8gc2VlIGl0cyBjb29yZGluYXRlcywgYW5kIGRvd25sb2FkIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBsb3QuCjwvZGl2PgoqKkR5bmFtaWMgZGF0YSB2aXN1YWxpemF0aW9ucyAoRERWKSoqIGFyZSByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSB0aGF0IGNhbiBjaGFuZ2UgdGhlaXIgZ3JhcGhpY2FsIG1ha2UtdXAgd2hpbGUgcHJlc2VudGVkIChbUGxvZXR6bmVyICYgTG93ZSwgMjAwNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5sZWFybmluc3RydWMuMjAwNC4wNi4wMDEpOyBbU2Nobm90eiBldCBhbC4sIDE5OTldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L0JGMDMxNzI5NjgpKS4gW0thcHV0ICgxOTkyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjIzMDcvNzQ5NTc5KSBjb25zaWRlcmVkIHRpbWUgYXMgYSBkaW1lbnNpb24gaW4gRERWLiBUaGlzIGlzLCBvZiBjb3Vyc2UsIHRydWUgd2hlbiB2aXN1YWxpemluZyB0aW1lLXNlcmllcywgaGllcmFyY2hpY2FsLCBvciBsb25naXR1ZGluYWwgZGVzaWducywgb3IgdG8gZGVwaWN0IGEgcHJvY2VzcyAoZS5nLiwgbmV1cm9uIGZpcmluZykuIEhvd2V2ZXIsIGluIG90aGVyIGRlc2lnbnMsIEkgYXJndWUsIGFueSB2YXJpYWJsZSDigJMgd2hldGhlciBjYXRlZ29yaWNhbCBvciBjb250aW51b3VzIOKAkyBjYW4gc2VydmUgYXMgYSBkaW1lbnNpb24gaW4gRERWIChlLmcuLCB0cmVhdG1lbnQgY29uZGl0aW9uLCBJUSwgZXRjLikuIEluIEREViwgZGlzcGxheWVkIHZhbHVlcyBvZiB0aGUgb3V0Y29tZSBjYW4gY2hhbmdlICh3aGlsZSBzdGlsbCBwcmVzZW50ZWQpIGFzIGEgZnVuY3Rpb24gb2YgYW5vdGhlciB2YXJpYWJsZSAoZS5nLiwgdGltZSwgZ3JvdXApLiBJbiBhIGxpbmVhciwgb3IgYXV0b21hdGljIEREViwgY2hhbmdlcyB0cmFuc3BpcmUgb24gdGhlaXIgb3duIGFuZCBjYW5ub3QgYmUgYWx0ZXJlZCBieSB0aGUgdXNlciBvciByZWFkZXIuIEFuIGV4YW1wbGUgb2YgRERWIGlzIHByZXNlbnRlZCBpbiBGaWd1cmUgNCBhbmQgaXMgYXZhaWxhYmxlIFtoZXJlXShodHRwczovL3Bsb3RseS5jb20vZ2dwbG90Mi9hbmltYXRpb25zLyM6fjp0ZXh0PVBsYXktLE11bGl0cGxlJTIwVHJhY2UlMjBBbmltYXRpb25zLC1saWJyYXJ5KHBsb3RseSklMEFsaWJyYXJ5KS4KCgpgYGB7ciBGaWd1cmUgNCwgZWNobz1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdhcG1pbmRlcikKCgpwIDwtIGdncGxvdChnYXBtaW5kZXIsIGFlcyhnZHBQZXJjYXAsIGxpZmVFeHAsIGNvbG9yID0gY29udGluZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwb3AsIGZyYW1lID0geWVhciwgaWRzID0gY291bnRyeSkpICsKICBzY2FsZV94X2xvZzEwKCkKCmdncGxvdGx5KHApCmBgYAo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4KKipGaWd1cmUgNC4gRHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb24uKiogVGhpcyBpcyBhIHNjYXR0ZXIgcGxvdCB3aXRoIGR5bmFtaWMgZmVhdHVyZXMuIFRoZSBkYXRhc2V0IHByZXNlbnRlZCBjb21lcyBmcm9tIHRoZSDigJhnYXBtaW5kZXLigJkgUiBwYWNrYWdlIChbQnJ5YW4sIDIwMTddKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2dhcG1pbmRlcikpLiBUaGUgcGxvdCBkaXNwbGF5cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ3Jvc3MgZG9tZXN0aWMgcHJvZHVjdCBwZXIgY2FwaXRhIChnZHBQZXJjYXA7IHggYXhpcykgYW5kIGxpZmUgZXhwZWN0YW5jeSBpbiB5ZWFycyAobGlmZUV4cDsgeSBheGlzKSBhY3Jvc3MgZGlmZmVyZW50IHRpbWVzLCBmcm9tIDE5NTIgdG8gMjAwNyAoYm90dG9tIHNjYWxlKS4gVGhlIHVzZXIgY2FuIHpvb20gaW4gYW5kIG91dCwgaGlnaGxpZ2h0IG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgKGUuZy4sIGJsdWU7IEV1cm9wZSksIGhvdmVyIG92ZXIgYW55IGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zIHRvIHNlZSBzcGVjaWZpYyBkZXRhaWxzIChhcyBzZWVuIGluIHRoZSByZWQgYm94KSwgYW5kIHdoZW4gdGhlIOKAnHBsYXnigJ0gYnV0dG9uIGlzIHByZXNzZWQgKGJvdHRvbSBsZWZ0IGNvcm5lciksIGNoYW5nZXMgYWNyb3NzIHRoZSB5ZWFycyBjYW4gYmUgc2VlbiB2aWEgYW5pbWF0aW9uLgo8L2Rpdj4KCkxhc3RseSwgYXMgaXRzIG5hbWUgc3VnZ2VzdHMsICoqaW50ZXJhY3RpdmUgZHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb25zIChJRERWKSoqIGNvbWJpbmUgZWxlbWVudHMgZnJvbSBib3RoIElEViBhbmQgRERWIGFuZCBpcyB0aGVyZWZvcmUgdGhlIGJlc3Qgb2YgYm90aCB3b3JsZHMuIEluIElERFYsIGFueSBjaGFuZ2UgaW4gdGhlIGdyYXBoaWNhbCBzdHJ1Y3R1cmUgZm9sbG93cyBhIGRpcmVjdCBhY3Rpb24gZnJvbSB0aGUgdXNlci4gVGhpcyB3YXksIHVzZXJzIGhhdmUgY29udHJvbCBvdmVyIOKAkyBvciwgIGNhbiBtYW5pcHVsYXRlIOKAkyBob3cgdGhlIGRhdGEgaXMgZGlzcGxheWVkIChbUGxvZXR6bmVyICYgTG93ZSwgMjAwNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5sZWFybmluc3RydWMuMjAwNC4wNi4wMDEpKS4gSW4gbWFueSBjYXNlcywgdGhlIHZpZXdlciBldmVuIGhhcyBjb250cm9sIG92ZXIgaG93IHRoZSBkYXRhIGlzIGFuYWx5emVkIChzZWUgYmVsb3cgW2V4YW1wbGUgYnkgRWxsaXMgJiBNZXJkaWFuLCAyMDE1KV0oaHR0cHM6Ly9wc3ljaG9sb2d5LnNoaW55YXBwcy5pby9leGFtcGxlMy8pLiBbU2Nod2FuIGFuZCBSaWVtcHAgKDIwMDQpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmxlYXJuaW5zdHJ1Yy4yMDA0LjA2LjAwNSkgbm90ZWQgdGhhdCBJRERWIOKAnGVuYWJsZSB0aGUgdXNlciB0byBhZGFwdCB0aGUgcHJlc2VudGF0aW9uIHRvIFt0aGVpcl0gaW5kaXZpZHVhbCBjb2duaXRpdmUgbmVlZHPigJ0gKHAuIDI5NikuIEFuIGV4YW1wbGUgb2YgSUREViBpcyBwcmVzZW50ZWQgaW4gRmlndXJlIDUgYW5kIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9oYW96aHUyMzMuc2hpbnlhcHBzLmlvL3NoaW55TVJJLWNvbnRlc3QvKS4KPGJyPjxicj4KCmBgYHtyIEZpZ3VyZSA1LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aCA9ICcxMDAlJ30KbGlicmFyeShzaGlueSkKa25pdHI6OmluY2x1ZGVfYXBwKCJodHRwczovL3ZhYy1sc2h0bS5zaGlueWFwcHMuaW8vbmNvdl90cmFja2VyLyIpCmBgYAoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+CioqRmlndXJlIDUuIEludGVyYWN0aXZlIGR5bmFtaWMgZGF0YSB2aXN1YWxpemF0aW9uLioqIFRoaXMgYXBwIGFsbG93cyB1c2VycyB0byB2aXN1YWxpemUgYW5kIGFuYWx5emUgQ09WSUQtMTkgYW5kIFNBUlMgZ2VvZ3JhcGhpYyBhbmQgZGVzY3JpcHRpdmUgZGF0YSBhY3Jvc3MgdGltZSB1c2luZyBib3RoIGludGVyYWN0aXZlIGFuZCBkeW5hbWljIGZlYXR1cmVzIGNyZWF0ZWQgYnkgW1BhcmtlciAoMjAyMildKGh0dHBzOi8vdmFjLWxzaHRtLnNoaW55YXBwcy5pby9uY292X3RyYWNrZXIvKS4gVXNlcnMgY2FuIGJyb3dzZSB0aGUgZGlmZmVyZW50IHRhYnMgYXQgdGhlIHRvcCwgYWRqdXN0IHRoZSBkYXRlIG9uIHRoZSBsZWZ0IGJsdWUgc2NhbGUsIGhvdmVyIG92ZXIgYW55IHJlZ2lvbiBvciBvYnNlcnZhdGlvbiwgYXBwbHkgZmlsdGVycy9tYXNrcywgcGFuIG92ZXIsIHpvb20sIHZpZXcgdGhlIHJhdyBkYXRhLCBhbmQgY3JlYXRlIGEgY3VzdG9taXplZCBsaW5lIGdyYXBoLgo8L2Rpdj4KCkFsdGhvdWdoIHRoZXJlIGFyZSBtaXhlZCBjb25jbHVzaW9ucyBhYm91dCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBJRFYgYW5kIEREViAoZS5nLiwgW0hlZ2FydHksIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDA3KTsgW0hvb2QgZXQgYWwuLCAyMDE5XShodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDE5LjAyOTg2KTsgW1Bsb2V0em5lciAmIExvd2UsIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDAxKTsgW1JvbGZlcyBldCBhbC4sIDIwMjBdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMjAuMDA2OTMpOyBbU2Nobm90eiBldCBhbC4sIDE5OTldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L0JGMDMxNzI5NjgpOyBbU2Nod2FuICYgUmllbXBwLCAyMDA0XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmxlYXJuaW5zdHJ1Yy4yMDA0LjA2LjAwNSkpLCB0aGVyZSBpcyBhIGdyb3dpbmcgYm9keSBvZiBsaXRlcmF0dXJlIGFkdm9jYXRpbmcgZm9yIHRoZSB1c2Ugb2YgSUREViBpbiBib3RoIGVkdWNhdGlvbiBhbmQgcmVzZWFyY2ggc2V0dGluZ3MgKGUuZy4sIFtFbGxpcyAmIE1lcmRpYW4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTUuMDE3ODIpOyBbSGVlciwgJiBTaG5laWRlcm1hbiwgMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMjEzMzgwNi4yMTMzODIxKTsgW1JvbGZlcyBldCBhbC4sIDIwMjBdKChodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDIwLjAwNjkzKSk7IFtXYXJkIGV0IGFsLiwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEyMDEvOTc4MDQyOTEwODQzMykpLiAKPGJyPgoKIyMgV2h5IFdlIFNob3VsZCBVc2UgSW50ZXJhY3RpdmUgRHluYW1pYyBHcmFwaGljcyBpbiBQc3ljaG9sb2d5CgoKClRoZXJlIGFyZSBtYW55IGNsZWFyIGFkdmFudGFnZXMgdG8gaW5jb3Jwb3JhdGluZyBJRERWIGluIGFjYWRlbWljIGFydGljbGVzIGFuZCB0ZWFjaGluZy4gSW4gdGhpcyBwYXBlciwgSSBmb2N1cyBvbmx5IG9uIGEgZmV3IGtleSByZWFzb25zIHJlbGF0aW5nIHRvIG9wZW4gcmVzZWFyY2ggcHJhY3RpY2VzLCBsaXZlIGRhdGEgdXBkYXRlcyBhZnRlciB2aXN1YWxpemF0aW9uIGRlcGxveW1lbnQsIGFuZCBlZmZlY3RpdmUgZGF0YSBjb21tdW5pY2F0aW9uOgo8YnI+CgojIyMgSUREViBJbmNpdGUgVHJhbnNwYXJlbnQgUmVzZWFyY2ggUHJhY3RpY2VzCgoKCgpDb25jZXJucyBhYm91dCB0aGUgY3JlZGliaWxpdHkgb2YgcHJldmlvdXNseSBwdWJsaXNoZWQgcmVzdWx0cyBpbiBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoIGluc3BpcmVkIG5ldyBzdGFuZGFyZHMgb2YgcmVjb21tZW5kZWQgcHJhY3RpY2VzIHN1Y2ggYXMgcHJlcmVnaXN0cmF0aW9uLCByZWdpc3RlcmVkIHJlcG9ydHMsIG9wZW4gZGF0YSwgc2hhcmVkIGFuYWx5c2VzLCBldGMuIElERFYgYXJlIG11Y2ggbW9yZSBhbGlnbmVkIHdpdGggdGhlIG5ldyBzdGFuZGFyZHMgb2YgdHJhbnNwYXJlbnQgcmVzZWFyY2ggdGhhbiBzdGF0aWMgZ3JhcGhzLiBUaG91Z2h0ZnVsIElERFYgYWxsb3cgY2FyZWZ1bCBpbnNwZWN0aW9uIG9mIGV2ZXJ5IGRpbWVuc2lvbiBvZiB0aGUgZGF0YSwgd2hlcmVhcyB3aXRoIHN0YXRpYyB2aXN1YWxpemF0aW9ucywgdGhpcyBpcyB1c3VhbGx5IGltcG9zc2libGUgb3IgY2FuIG1ha2UgdGhlIGdyYXBoIHRvbyBjb21wbGV4IHRvIGNvbXByZWhlbmQuIE1vcmUgYWR2YW5jZWQgSUREViBjYW4gZXZlbiBncmFudCB0aGUgcmVhZGVyIHRoZSBhYmlsaXR5IHRvIGV4cGxvcmUgYW5kIHJlYW5hbHl6ZSB0aGUgZGF0YSBvbiB0aGVpciBvd24uIFRoaXMgaXMgcGVyaGFwcyBvbmUgb2YgdGhlIGhpZ2hlc3QgbGV2ZWxzIG9mIG9wZW4gcmVzZWFyY2ggcHJhY3RpY2VzLiBGb3IgZXhhbXBsZSwgaW4gdGhlIElERFYgW2V4YW1wbGUgY3JlYXRlZCBieSBFbGxpcyBhbmQgTWVyZGlhbiAoMjAxNSldKGh0dHBzOi8vcHN5Y2hvbG9neS5zaGlueWFwcHMuaW8vZXhhbXBsZTMvKSB1c2luZyBSIFNoaW55IGFwcCwgdGhlIHVzZXIgY2FuIHNlbGVjdCB0aGUgdmFyaWFibGVzIG9mIHRoZWlyIGNob2ljZSwgZGlmZmVyZW50aWF0ZSBieSBncm91cCwgYXBwbHkgZGlmZmVyZW50IGZpbHRlcnMgb3IgbWFza3MsIGFuZCByZWNhbGN1bGF0ZSB0aGUgcmVncmVzc2lvbiBlcXVhdGlvbiBhbmQgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKHNlZSBGaWd1cmUgNikuCjxicj48YnI+CmBgYHtyIEZpZ3VyZSA2LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aCA9ICcxMDAlJ30KbGlicmFyeShzaGlueSkKa25pdHI6OmluY2x1ZGVfYXBwKCJodHRwczovL3BzeWNob2xvZ3kuc2hpbnlhcHBzLmlvL2V4YW1wbGUzLyIpCmBgYAo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4KKipGaWd1cmUgNi4gSW50ZXJhY3RpdmUgZHluYW1pYyBleGFtcGxlIHdpdGggZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBhcHBsaWNhdGlvbnMuKiogVGhpcyBpbnRlcmFjdGl2ZSBkeW5hbWljIGZpZ3VyZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSB2YXJpYWJsZXMgb2YgdGhlaXIgY2hvaWNlIChmcm9tIHRoZSBkcm9wZG93biBtZW51cyBhdCB0aGUgdG9wIGxlZnQpLCBkaWZmZXJlbnRpYXRlIGJ5IGdyb3VwIChtYWxlLCBmZW1hbGUpLCBhcHBseSBkaWZmZXJlbnQgZmlsdGVycyBvciBtYXNrcyAocHJldmlvdXMgdmljdGltLCBub3QgcHJldmlvdXMgdmljdGltKSwgYW5kIHJlY2FsY3VsYXRlIHRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGFuZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoYm90dG9tIHJpZ2h0IHRhYmxlKS4gVGhlIHVzZXIgY2FuIGFsc28gaW5zcGVjdCB0aGUgZGF0YSB1c2luZyBhIGRpZmZlcmVudCBncmFwaCB0eXBlIChlLmcuLCBib3hwbG90KSBieSBzd2l0Y2hpbmcgdG8gdGhlIEJveHBsb3QgdGFiIGFib3ZlIHRoZSBmaWd1cmUuCjwvZGl2PgpGdXJ0aGVybW9yZSwgd2l0aCB0b29scyBzdWNoIGFzIFIgU2hpbnksIHdoZXJlIHRoZSBkYXRhIGFuZCBhbmFseXNlcyBhcmUgc3RvcmVkIG9uIHRoZSBhdXRob3LigJlzIHNlcnZlciwgdXNlcnMgY2FuIGhhdmUgYWxsIHRoZSBiZW5lZml0cyBvZiBoYXZpbmcgYWNjZXNzIHRvIHRoZSBmdWxsIGRhdGFzZXQgd2l0aG91dCBjb21wcm9taXNpbmcgcGFydGljaXBhbnQgY29uZmlkZW50aWFsaXR5LiBPbmUgb2YgdGhlIG1haW4gZmFjdG9ycyBwcmV2ZW50aW5nIHJlc2VhcmNoZXJzIGZyb20gbWFraW5nIHRoZWlyIGRhdGEgb3Blbmx5IGF2YWlsYWJsZSB0byBleHRlcm5hbCBldmFsdWF0b3JzIGlzIHRoZSByaXNrIG9mIGJyZWFjaGluZyBldGhpY2FsIHByb3RvY29scyBhbmQgZXhwb3NpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbi4gSG93ZXZlciwgdXNpbmcgSUREViwgdGhlIGRhdGEgY2FuIHN0aWxsIGJlIGludmVzdGlnYXRlZCBhbmQgcmVhbmFseXplZCBieSB0aGUgdXNlciB3aXRob3V0IGFjdHVhbGx5IGhhdmluZyB0byBzaGFyZSB0aGUgZGF0YS4gTm90ZSB0aGF0IHdlIGNvdWxkIGV4cGxvcmUgYW5kIHZpc3VhbGl6ZSBkYXRhIGluIHRoZSBbRWxsaXMgYW5kIE1lcmRpYW4gKDIwMTUpIGV4YW1wbGVdKGh0dHBzOi8vcHN5Y2hvbG9neS5zaGlueWFwcHMuaW8vZXhhbXBsZTMvKSBhYm92ZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gdGhlIEZlYXIgb2YgQ3JpbWUgZGF0YXNldC4KPGJyPgoKCiMjIyBMaXZlIERhdGEgVmlzdWFsaXphdGlvbnMKCgoKCklERFYgY2FuIGNvbnRpbnVlIHRvIHJlY2VpdmUgbmV3IGRhdGEgYW5kIHVwZGF0ZSBpdHMgdmlzdWFsIHN0cnVjdHVyZSBhY2NvcmRpbmdseSwgZXZlbiBhZnRlciBpdHMgZGVwbG95bWVudC4gTm9ybWFsbHksIG9uY2UgYSBzdGF0aWMgcGxvdCBvciBncmFwaCBhcmUgcHJvZHVjZWQsIHRoZSBmaWd1cmUgY2Fubm90IGJlIGNoYW5nZWQuIFRoaXMgY2FuIGluZmx1ZW5jZSBvdXIgY29uY2x1c2lvbnMsIHRvbzsgb25jZSBhIHBhcGVyIGlzIGZpbmFsaXplZCwgdGhlIGZpZ3VyZXMgYXJlIHByb2R1Y2VkLCBzY2llbnRpc3RzIHB1Ymxpc2ggdGhlaXIgcGFwZXIgYW5kICh1c3VhbGx5KSBuZXZlciBsb29rIGJhY2suIEhvd2V2ZXIsIGluIHRoZSBjdXJyZW50IGVyYSBvZiBiaWcgZGF0YSBhbmQgY2xvdWQgdGVjaG5vbG9neSwgaXQgaXMgcG9zc2libGUgYW5kIG9mdGVuIHVzZWZ1bCB0byBzdHJlYW0gYW5kIHZpc3VhbGl6ZSBvdXIgZGF0YSBsaXZlIGFzIGl0IGlzIGJlaW5nIGNvbGxlY3RlZC4gSW1hZ2luZSB5b3UgYXJlIGNvbmR1Y3RpbmcgYSBzdHVkeSBsb29raW5nIGF0IHZhcmlvdXMgdHJhbnNhY3Rpb25zIG9uIGEgc29jaWFsIG1lZGlhIHBsYXRmb3JtIChlLmcuLCBGYWNlYm9vaywgVHdpdHRlciwgSW5zdGFncmFtKS4gVXNpbmcgSUREViwgcmVzZWFyY2hlcnMgY2FuIGZvbGxvdyBhbmQgdmlzdWFsaXplIHRoZWlyIGRhdGEgaW4gcmVhbC10aW1lIGFzIHNvY2lhbCB0cmFuc2FjdGlvbnMgdGFrZSBwbGFjZS4gRm9yIGV4YW1wbGUsIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGRhc2hib2FyZCB2aXN1YWxpemluZyBhIGxpdmVzdHJlYW0gZG93bmxvYWRzIG9mIFIgcGFja2FnZXMgZnJvbSBDUkFOIChbU2lldmVydCBldCBhbC4sIDIwMjJdKGh0dHBzOi8vcGtncy5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkLyk7IHNlZSBGaWd1cmUgNykuIEEgc2ltaWxhciBhcHAgd2FzIGF0dGVtcHRlZCBieSBbSGFkbGV5IFdpY2toYW0gKDIwMTkpXShodHRwczovL2hhZGxleS5zaGlueWFwcHMuaW8vY3Jhbi1kb3dubG9hZHMvKS4gVGhpcyBub3ZlbCBhcHByb2FjaCBvcGVucyBhIGxvdCBvZiBpbnZlc3RpZ2F0aXZlIGF2ZW51ZXMgYW5kIHByb3ZpZGVzIHVzZWZ1bCB0b29scyB0byBleHBlbmQgdGhlIGFyc2VuYWwgb2YgZGF0YSB2aXN1YWxpemF0aW9uIGFuZCByZXNlYXJjaCBjYXBhYmlsaXRpZXMuIAo8YnI+PGJyPgoKYGBge3IgRmlndXJlIDcsIGVjaG89RkFMU0UsIHdhcm5pbmc9RiwgbWVzc2FnZT1GQUxTRSwgb3V0LndpZHRoID0gJzEwMCUnfQpsaWJyYXJ5KHNoaW55KQprbml0cjo6aW5jbHVkZV9hcHAoImh0dHBzOi8vamphbGxhaXJlLnNoaW55YXBwcy5pby9zaGlueS1jcmFuZGFzaC8iKQpgYGAKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+CioqRmlndXJlIDcuIEludGVyYWN0aXZlIGR5bmFtaWMgTGl2ZSBEYXRhIFZpc3VhbGl6YXRpb24uKiogbGl2ZXN0cmVhbSBvZiBkb3dubG9hZCBsb2dzIGZyb20gW2NyYW4ucnN0dWRpby5jb21dKGh0dHBzOi8vY3Jhbi5yc3R1ZGlvLmNvbS8pLiBUaGlzIFNoaW55IGFwcCBpbGx1c3RyYXRlcyB0aGUgbmFtZXMgYW5kIGZyZXF1ZW5jaWVzIG9mIFIgcGFja2FnZXMgZG93bmxvYWRlZCBieSB1c2Vycy4gVmlld2VycyBjYW4gYWxzbyBtYW5pcHVsYXRlIHRoZSByYXRlIGFuZCBjYXBhY2l0eSBvZiB0aGUgdmlzdWFsaXphdGlvbiwgc2NhbiB0aGUgcmF3IGxvZ3MgaW4gdGhlIHRvcCB0YWIsIHJldmlldyB0aGUgc291cmNlIGNvZGUsIGFuZCBzaGFyZSB0aGlzIGFwcCBvbiB2YXJpb3VzIHNvY2lhbCBtZWRpYSBwbGF0Zm9ybXMuCjwvZGl2PgoKCgoKCgojIyMgSUREViBhcmUgTW9yZSBFZmZlY3RpdmUgYXQgQ29tbXVuaWNhdGluZyBEYXRhCgoKCgpBcyBbTW9yZWF1XShodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDE1LjAwMzQyKSBiZWF1dGlmdWxseSBwdXQgaXQsICrigJxbdl1pYSBkeW5hbWljIGFuZCBpbnRlcmFjdGl2ZSBncmFwaGljcywgdG9kYXnigJlzIHRlY2hub2xvZ3kgYWxsb3dzIHN0dWRlbnRzIHRvIHZpc3VhbGl6ZSBleHRlcm5hbGx5IHdoYXQgdGhleSBoYXZlIGRpZmZpY3VsdHkgcmVwcmVzZW50aW5nIG1lbnRhbGx54oCdKiAoMjAxNSwgcC4gMikuIEluIGEgcmVjZW50IHN0dWR5LCBbSG9vZCBhbmQgY29sbGVhZ3VlcyAoMjAyMCldKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTkuMDI5ODYgKSBmb3VuZCB0aGF0IElERFYgZmlndXJlcyBpbiBkaWdpdGFsIHB1YmxpY2F0aW9ucyB3ZXJlIG1vcmUgZWZmZWN0aXZlIGF0IGNvbW11bmljYXRpbmcgbWFpbiBlZmZlY3RzIGFuZCBudWxsIHJlbGF0aW9uc2hpcHMgdGhhbiBzdGF0aWMgZ3JhcGhzLiBJbiBhbm90aGVyIHN0dWR5IGJ5IFtSb2xmZXMgZXQgYWwuICgyMDIwKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeWcuMjAyMC4wMDY5MyksIHN0dWRlbnRzIHdobyB3ZXJlIGdpdmVuIG1hdGVyaWFscyB2aXN1YWxpemVkIHVzaW5nIElERFYgcGVyZm9ybWVkIHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gc3R1ZGVudHMgaW4gdGhlIHN0YXRpYyB2aXN1YWxpemF0aW9uIGdyb3VwLiBUaGVzZSByZXN1bHRzIHN1Z2dlc3QgdGhhdCBJRERWIG1pZ2h0IGJlIG1vcmUgZWZmZWN0aXZlIGluIGNvbW11bmljYXRpbmcgZGF0YS4gRnVydGhlcm1vcmUsIElERFYgbWFrZSBhY3RpdmUgZXhwbG9yYXRpb24gcG9zc2libGUgd2hlcmUgcmVhZGVycyBhcmUgZnJlZSB0byBpbnRlcmFjdCB3aXRoIHRoZWlyIGRhdGEgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFic29yYiBpdCBwYXNzaXZlbHk7IGZ1bmN0aW9uYWwgZW5nYWdlbWVudCBpbXByb3ZlcyBsZWFybmluZywgaW50ZXJlc3QsIGFuZCBjb21wcmVoZW5zaW9uIChbQm9kZW1lciBldCBhbC4sIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDA2KSkuIFRoaXMgaXMgcGFydGljdWxhcmx5IGhlbHBmdWwgYmVjYXVzZSBkaXJlY3QgaW50ZXJhY3Rpb24gd2l0aCB2aXN1YWwgY29udGVudCBmYWNpbGl0YXRlcyB0aGUgaW52b2x2ZW1lbnQgb2YgdGhlIG1vdG9yIHN5c3RlbSAoW1dyYWdhIGV0IGFsLiwgMjAwM10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvUzAyNzgtMjYyNigwMykwMDAzMy0yKSksIHdoaWNoIGlzIGVzc2VudGlhbCBmb3IgYWNoaWV2aW5nIGRlZXBlciBsZXZlbHMgb2YgdW5kZXJzdGFuZGluZyAoW01vcmVhdSwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeWcuMjAxNS4wMDM0MikpLgo8YnI+CgojIyBDb25jbHVkaW5nIFJlbWFya3MKCgoKRGVzaWduaW5nIGFuZCBjcmVhdGluZyBJRERWIHVzZWQgdG8gYmUgYSBzb2Z0d2FyZSBkZXZlbG9wZXLigJlzIGpvYiBhbmQgcmVxdWlyZWQgZXh0ZW5zaXZlIHByb2dyYW1taW5nIHNraWxscyBpbiBKYXZhLCBIVE1MLCBvciBDU1MuIFRoaXMgY2VydGFpbmx5IG1pZ2h0IGhhdmUgYmVlbiBhbiBvYnN0YWNsZSBhbmQgZGV0ZXJyZW50IGZvciBtYW55LiBGb3J0dW5hdGVseSwgaG93ZXZlciwgdGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuIE5vd2FkYXlzLCBzY2llbnRpc3RzIGFuZCBhdXRob3JzIHdpdGggd29ya2luZyBrbm93bGVkZ2Ugb2YgUiAoW1IgQ29yZSBUZWFtLCAyMDIyXShodHRwczovL3d3dy5SLXByb2plY3Qub3JnLykpIGNhbiBnZW5lcmF0ZSB0aGVpciBvd24gZnJlZSBJRERWIHVzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgYFNoaW55YCAoW1JTdHVkaW8gVGVhbSwgMjAyMl0oaHR0cDovL3d3dy5yc3R1ZGlvLmNvbS8pKSwgYGZsZXhkYXNoYm9hcmRgIChbU2lldmVydCBldCBhbC4sIDIwMjJdKGh0dHBzOi8vcGtncy5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkLykpIGFuZCBgZXNxdWlzc2VgIChbTWV5ZXIgJiBQZXJyaWVyLCAyMDIyXShodHRwczovL2dpdGh1Yi5jb20vZHJlYW1Scy9lc3F1aXNzZSkpIHJlbGF0aXZlbHkgZWFzaWx5LiBPZiBjb3Vyc2UsIG1ha2luZyBJRERWIGlzIGFsc28gcG9zc2libGUgd2l0aG91dCBwcm9ncmFtbWluZyBhdCBhbGwgd2hlbiB1c2luZyBbVGFibGVhdV0oaHR0cHM6Ly93d3cudGFibGVhdS5jb20vKSwgW0ZpZ21hXShodHRwczovL3d3dy5maWdtYS5jb20vKSwgYW5kIG1vcmUuIFRob3VnaCwgdGhlc2UgcGxhdGZvcm1zIG1pZ2h0IGluY2x1ZGUgZmVlcy4KPGJyPjxicj4KSUREViBhbHNvIG1ha2UgZ3JhcGhzIGFuZCBmaWd1cmVzIG11Y2ggbW9yZSBhY2Nlc3NpYmxlLiBJRERWIGFsbG93IHVzZXJzIHdpdGhvdXQgcHJpb3Igc29mdHdhcmUga25vd2xlZGdlIG9yIGZlZS1kZXBlbmRlbnQgbGljZW5zZSB0byBleHBsb3JlIGFuZCBhbmFseXplIGRhdGEuIFRoZSB1c2VyLWZyaWVuZGx5IGludGVyZmFjZSBpbXBsZW1lbnRlZCBpbiBtb3N0IElERFYgZG9lcyBub3QgcmVxdWlyZSBwcm9ncmFtbWluZyBhYmlsaXRpZXMgb3IgZG93bmxvYWRpbmcvcHVyY2hhc2luZyBzb2Z0d2FyZSwgd2hpY2ggYXJlIG90aGVyd2lzZSByZXF1aXJlZCB0byBtYW5pcHVsYXRlIGFuZCBhbmFseXplIGRhdGEuIEluIGFkZGl0aW9uLCBzaGlmdGluZyB0aGUgY29udHJvbCBvZiB2YXJpb3VzIHZpc3VhbCBmZWF0dXJlcyAoZS5nLiwgY29sb3VyLCBwb3NpdGlvbiwgc2l6ZSwgc3BlZWQpIHRvIHRoZSB1c2VyIGNhbiBtYWtlIGdyYXBocyBtb3JlIGNvbnZlbmllbnQuIEVhY2ggdXNlciBjYW4gdGFpbG9yIHRoZSBncmFwaCB0byB0aGVpciBvd24gaW5kaXZpZHVhbCBuZWVkcy4gVG8gdGhhdCBleHRlbnQsIElERFYgY2FuIGFjY29tbW9kYXRlIHdpZGVyIHJhbmdlIG9mIGFiaWxpdGllcyAoZS5nLiwgY29sb3VyIGJsaW5kLCBzaG9ydCBzaWdodGVkbmVzcywgc2xvdy9xdWljayBwcm9jZXNzaW5nIHNwZWVkLCBldGMuKS4KPGJyPjxicj4KVGhhdCBzYWlkLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IElERFYgYXJlIG5vdCBhIHNpbHZlciBidWxsZXQuIEluY29ycG9yYXRpbmcgaW50ZXJhY3RpdmUgYW5kIGR5bmFtaWMgZmVhdHVyZXMgdG8geW91ciBncmFwaHMgY2FyZWxlc3NseSB3aWxsIG5vdCBtYWtlIHRoZW0gYmV0dGVyLiBEZXNpZ25pbmcgeW91ciBJRERWIHJlcXVpcmVzIGEgbG90IG9mIHRob3VnaHQsIHBsYW5uaW5nLCBhbmQgd29yaywgcHJvYmFibHkgZXZlbiBtb3JlIHRoYW4gc3RhdGljIGdyYXBocy4gRm9yIHRoaXMgcmVhc29uLCBhcyB3aXRoIHN0YXRpYyBncmFwaGljcywgaXQgaXMgdXNlZnVsIGZvciBpbmRpdmlkdWFscyB0byBmb2xsb3cgcmVjb21tZW5kIHByYWN0aWNlcyBhbmQgZmFtaWxpYXJpemUgdGhlbXNlbHZlcyB3aXRoIHRheG9ub215IGFuZCB0ZWNobmlxdWVzIChlLmcuLCBbSGVlciAmIFNjaG5laWRlcm1hbiwgMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMjEzMzgwNi4yMTMzODIxKSkuCjxicj48YnI+CkluY29ycG9yYXRpbmcgSUREViBpbnRvIG1haW5zdHJlYW0gYWNhZGVtaWEgd2lsbCBub3QgYmUgZWFzeSwgaXQgY2VydGFpbmx5IHdpbGwgcmVxdWlyZSBhIGxvbmcgYWRqdXN0bWVudCBwZXJpb2QgYW5kIGEgc3RlZXAgbGVhcm5pbmcgY3VydmUgKHB1biBub3QgaW50ZW5kZWQpLiBIb3dldmVyLCBjb250aW51aW5nIHRvIGludGVncmF0ZSBuZXcgdGVjaG5vbG9naWVzIGludG8gdGhlIGZpZWxkIG9mIGRhdGEgdmlzdWFsaXphdGlvbiBpcyBpbmV2aXRhYmxlOiBpdCB3aWxsIGhhcHBlbiBpbiBhY2FkZW1pYSBhcyBpdCBpcyBoYXBwZW5pbmcgaW4gaW5kdXN0cnkgd2hlcmUgbGFyZ2UgY29ycG9yYXRpb25zIGhhdmUgYWxyZWFkeSBiZWd1biBhcHBseWluZyB0aGUg4oCcZm91cnRoIHBhcmFkaWdt4oCdIChUYW5zbGV5ICYgVG9sbGUsIDIwMDkpIG9mIGFkdmFuY2VkIGNvbXB1dGluZyBhbmQgKGJpZykgZGF0YS1kcml2ZW4gc2NpZW50aWZpYyBicmVha3Rocm91Z2hzLgo8YnI+PGJyPgpGaW5hbGx5LCB0aGUgZXhhbXBsZXMsIHJlYXNvbnMsIGFuZCB0b3BpY3MgaW4gdGhpcyBwYXBlciBvbmx5IGJlZ2luIHRvIHNjcmF0Y2ggdGhlIHN1cmZhY2UuIER5bmFtaWMgYW5kIGludGVyYWN0aXZlIGRhdGEgdmlzdWFsaXphdGlvbnMgYXJlIG5vdCBlbnRpcmVseSBuZXcuIEluIGZhY3QsIG9uZSBvY2N1cnJlbmNlIG9mIGFuIGludGVyYWN0aXZlIHN5c3RlbSBmb3IgdmlzdWFsaXppbmcgcHJvYmFiaWxpdHkgcGxvdHMgZGF0ZXMgYmFjayB0byB0aGUgbGF0ZSAxOTYwcyAoRm93bGtlcywgMTk2OSwgYXMgY2l0ZWQgaW4gW0ZyaWVuZGx5LCAyMDA4XShodHRwczovL2RvaS5vcmcvMTAuMTAwNy85NzgtMy01NDAtMzMwMzctMF8yKSkuIFN0aWxsLCB0aGVyZSBpcyBtdWNoIG1vcmUgdG8gbGVhcm4gYWJvdXQgaG93IGludGVyYWN0aXZlIGFuZCBkeW5hbWljIGZlYXR1cmVzIGFmZmVjdCBvdXIgcGVyY2VwdGlvbiBhbmQgaG93IHdlIGNhbiBoYXJuZXNzIHRoZXNlIHRvb2xzIHRvIGltcHJvdmUgZGF0YSBjb21tdW5pY2F0aW9uLiAKCg==