1. PREPARE

Our Unit 4 Case Study: Hashtag Common Core is inspired by the work of Jonathan Supovitz, Alan Daly, Miguel del Fresno and Christian Kolouch who examined the intense debate surrounding the Common Core State Standards education reform as it played out on Twitter. As noted on their expansive and interactive website for the #COMMONCORE Project, the Common Core was a major education policy initiative of the early 21st century. A primary aim of the Common Core was to strengthen education systems across the United States through a set of specific and challenging education standards. Although these standards once enjoyed bipartisan support, we saw in our previous case study how these standards have become a political punching bag.

In Unit 4, we continue our investigation of tweets around the these controversial state standards through social network analysis. Specifically, this case study will cover the following topics pertaining to each data-intensive workflow process:

  1. Prepare: Prior to analysis, we’ll take a look at the context from which our data came, formulate some research questions, and get introduced the {tidygraph} and {ggraph} packages for analyzing relational data.

  2. Wrangle: In the wrangling section of our case study, we will learn some basic techniques for manipulating, cleaning, transforming, and merging network data.

  3. Explore: With our network data tidied, we learn to calculate some key network measures and to illustrate some of these stats through network visualization.

  4. Model: We conclude our analysis by introducing community detection algorithms for identifying groups and revisiting sentiment about the common core.

  5. Communicate: We briefly reflect on our walkthrough in and what we learned from our analysis.

1a. Review the Research

Recall from Social Network Analysis and Education: Theory, Methods & Applications that Carolyn (2013) cited the following four features used by Freeman (2004) to define the social network perspective:

  1. Social network analysis is motivated by a relational intuition based on ties connecting social actors.

  2. It is firmly grounded in systematic empirical data.

  3. It makes use of graphic imagery to represent actors and their relations with one another.

  4. It relies on mathematical and/or computational models to succinctly represent the complexity of social life.

The #COMMONCORE Project that we’ll examine next is an exemplary illustration of these four defining features of the social network perspective.

The #commoncore Project

Supovitz, J., Daly, A.J., del Fresno, M., & Kolouch, C. (2017). #commoncore Project. Retrieved from http://www.hashtagcommoncore.com.

Prologue

As noted by Supovitz et al. (2017), the Common Core State Standards have been a “persistent flashpoint in the debate over the direction of American education.” The #commoncore Project explores the Common Core debate on Twitter using a combination of social network analyses and psychological investigations which help to reveal both the underlying social structure of the conversation and the motivations of the participants.

The central question guiding this investigation was:

How are social media-enabled social networks changing the discourse in American politics that produces and sustains education policy?

Data Sources & Analyses

The methods page of the #COMMONCORE Project provides a detailed discussion of the data and analyses used to arrive at the conclusions in #commoncore: How social media is changing the politics of education. Provided below is a summary of how authors retrieved data from Twitter and the analyses applied for each of the five acts in the website. I highly encourage you to take a look at this section if you’d like to learn more about their approach and in particular if you’re unfamiliar with how users can interact and communicate on Twitter.

Data Collection

To collect data on keywords related to the Common Core, the project used a customized data collection tool developed by two of our co-authors, Miguel del Fresno and Alan J. Daly, called Social Runner LabTM. Similar to an approach we used in Unit 3, the authors downloaded data in real time directly from Twitter’s Application Programming Interface (API) based on tweets using specified keywords, keyphrases, or hashtags and then restricted their analysis to the following terms: commoncore, ccss and stopcommoncore. They also captured Twitter profile names, or user names, as well as the tweets, retweets, and mentions posted. Data included messages that are public on twitter, but not private direct messages between individuals, nor from accounts which users have made private.

Analyses

In order to address their research question, the authors applied social network analysis techniques in addition to qualitative and automated text mining approaches. For social network analyses, each node is an individual Twitter user (person, group, institution, etc.) and the connection between each node is the tweet, retweet, or mention/reply. After retrieving data from the Twitter API, the authors created a file that could be analyzed in Gephi, an open-source software program which depicts the relations as networks and provides metrics for describing features of the network.

In addition to data visualization and network descriptives, the authors examined group development and lexical tendencies among users. For group development, they used a community detection algorithm to identify and represent structural sub-communities, or “factions,” which they describe as a group with more ties within than across group even those group boundaries are somewhat porous). For lexical tendencies, the authors used the Linguistic Inquiry and Word Count (LIWC) lexicons to determine psychological drive, diagnose their level of conviction, make inferences about thinking styles, and even determine sentiment similar to what we examined in Unit 2.

For a nice summary of the data used for the analysis, as well as the samples of actors and tweets, the keywords, and the methods that were utilized, see Table 1. Data and Method for Each Act in the Methods section of the #commoncore website.

Key Findings

In the #commoncore Project, analyses of almost 1 million tweets sent by about 190,000 distinct actors over a period of 32 months revealed the following:

  • In Act 1, The Giant Network, the authors identified five major sub-communities, or factions, in the Twitter debate surrounding the Common Core, including: (1) supporters of the Common Core, (2) opponents of the standards from inside education, and (3) opponents from outside of education.
  • In Act 2, Central Actors, they noted that most of these participants were casual contributors – almost 95% of them made fewer than 10 tweets in any given six-month period. They also distinguished between two types of influence on Twitter: Transmitters who tweeted a lot, regardless of the extent of their followership; and Transceivers, those who gained their influence by being frequently retweeted and mentioned.
  • In Act 3, Key Events, the authors identified issues driving the major spikes in the conversation, like when Secretary of Education Duncan spoke about white suburban moms’ opposition to the Common Core, or the debate over the authorization of the Every Student Succeeds Act in November 2015. They also offended evidence of manufactured controversies spurred by sensationalizing minor issues and outright fake news stories.
  • In Act 4, Lexical Tendencies, the authors examined the linguistic tendencies of the three major factions and found that Common Core supporters used the highest number of conviction words, tended to use more achievement-oriented language, and used more words associated with a formal and analytic thinking style. By contrast, opponents of the Common Core from within education tended to use more words associated with sadness, and used more narrative thinking style language. Opponents of the Common Core from outside of education made the highest use of words associated with peer affiliation, used the largest number of angry words, and exhibited the lowest level of conviction in their word choices.
  • In Act 5, The Tweet Machine, examined five frames that opponents of the Common Core used to appeal to values of particular subgroups including the government frame, business frame, war frame, experiment frame, and propaganda frame. By combining these constituencies, the authors illustrated how the Common Core developed a strong transpartisan coalition of opposition.

👉 Your Turn

For our Unit 4 Walkthrough, we’ll apply some of the same techniques used by this study including calculating some basic network measures of centrality. For example, take a look at the Explore the Networks section from Act 2: Central Actors and the Transmitters, Transceivers and Transcenders.

Click on each of the boxes for a select time period and in the space below list a couple Twitter users identified by their analysis as the following:

  • Transmitters:

  • Transceivers:

  • Transcenders:

Now visit Act 2 of the methods section and In the space below, identify the network measure used for the first two central actors (hint: it’s italicized) and copy their definition used. Note, Transcenders has been completed for you.

  • Transmitters

  • Transceivers

  • Transcenders is measured by degree and consists of actors (i.e. Twitter uers) who have both high out-degree, as well as having high in-degree.

1b. Identify a Question(s)

Recall from above that the central question guiding the #COMMONCORE Project was:

How are social media-enabled social networks changing the discourse in American politics that produces and sustains education policy?

For Unit 4, we are going to focus our questions on something a bit less ambitious but inspired by this work:

  1. Who are the transmitters, transceivers, and transcenders in our Common Core Twitter network?
  2. What subgroups, or factions, exist in our network?
  3. Which actors in our network tend to be more opposed to the Common Core?

To address the last question, we’ll revisit our techniques we learned from our Unit 3 VADER sentiment analysis.

👉 Your Turn

Based on what you know about networks and the context so far, what other research question(s) might ask we ask in this context that a social network perspective might be able to answer?

In the space below, type a brief response to the following questions:

  • YOUR RESPONSE HERE

1c. Set Up Project

As highlighted in Chapter 6 of Data Science in Education Using R (DSIEUR), one of the first steps of every workflow should be to set up your “Project” within RStudio. Recall that:

A Project is the home for all of the files, images, reports, and code that are used in any given project

Since we are working in RStudio Cloud, a Project has already been set up for you as indicated by the .Rproj file in your main directory in the Files pane.

Load Libraries

In Unit 1, we also learned about packages, or libraries, which are shareable collections of R code that can contain functions, data, and/or documentation and extend the functionality of R. You can always check to see which packages have already been installed and loaded into RStudio Cloud by looking at the the Files, Plots, & Packages Pane in the lower right hand corner.

👉 Your Turn

First, load the {tidyverse}, {tidytext} and {vader} packages from previous case studies. We’ll be using several of these packages to wrangling and explore our data later sections:

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.3     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   2.0.1     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(tidytext)
library(vader)

Next, we will introduce a few new packages that will help us with our social network analyses.

tidygraph 📦

The {tidygraph} package is a huge package that exports 280 different functions and methods, including access to almost all of the dplyr verbs plus a few more, developed for use with relational data. While network data itself is not tidy, it can be envisioned as two tidy tables, one for node data and one for edge data. The {tidygraph} package provides a way to switch between the two tables and uses dplyr verbs to manipulate them. Furthermore it provides access to a lot of graph algorithms with return values that facilitate their use in a tidy workflow.

Let’s go ahead and load the {tidygraph} library:

library(tidygraph)
## 
## Attaching package: 'tidygraph'
## The following object is masked from 'package:stats':
## 
##     filter

ggraph 📦

Created by the same developer as {tidygraph}, {ggraph} – pronounced gg-raph or g-giraffe hence the logo – is an extension of {ggplot} aimed at supporting relational data structures such as networks, graphs, and trees. Both packages are more modern and widely adopted approaches data visualization in R.

While ggraph builds upon the foundation of ggplot and its API, it comes with its own self-contained set of geoms, facets, etc., as well as adding the concept of layouts to the grammar of graphics, i.e. the “gg” in ggplot and ggraph.

Let’s go ahead and load the {ggraph} library:

library(ggraph)

igraph Package 📦

Both {tidygraph} and {ggraph} depend heavily igraph network analysis package. The main goals of the igraph package and the collection of network analysis tools it contains are to provide a set of data types and functions for:

  1. pain-free implementation of graph algorithms,

  2. fast handling of large graphs, with millions of vertices (i.e., actors or nodes) and edges,

  3. allowing rapid prototyping via high level languages like R.

Run the code chunk below to load the {igraph} library:

library(igraph)
## 
## Attaching package: 'igraph'
## The following object is masked from 'package:tidygraph':
## 
##     groups
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:purrr':
## 
##     compose, simplify
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following object is masked from 'package:tibble':
## 
##     as_data_frame
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union

Import Data

Finally, we’ll be using a fresh data download from twitter that only includes relatively small set of tweets from the past week to help keep things simple. Network graphs can quickly get unwieldy as the nodes in your network grow. The #commoncore project does an excellent job visualizing large networks using advanced techniques. We’ll focus on a relatively small network since we’ll be introduce some very basic techniques for visualization.

👉 Your Turn

Use the read_csv() function from the {readr} package to read the ccss-tweets-fresh.csv file from the data folder and assign to a new data frame named ccss_tweets:

ccss_tweets <- read_csv("data/ccss-tweets-fresh.csv")
## Rows: 48 Columns: 90
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (49): screen_name, text, source, reply_to_screen_name, hashtags, urls_u...
## dbl  (26): user_id, status_id, display_text_width, reply_to_status_id, reply...
## lgl  (11): is_quote, is_retweet, quote_count, reply_count, symbols, ext_medi...
## dttm  (4): created_at, quoted_created_at, retweet_created_at, account_create...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

2. WRANGLE

In general, data wrangling involves some combination of cleaning, reshaping, transforming, and merging data (Wickham and Grolemund 2016). As highlighted in Estrellado et al. (2020), wrangling network data can be even more challenging than other data sources since network data often includes variables about both individuals and their relationships.

For our data wrangling this week, we’re keeping it simple since working with relational data is a bit of a departure from our working with rectangular data frames. Our primary goals for Unit 1 are learning how to:

  1. Create an Edgelist. In this section, we introduce a new tidy data format call the “edgelist” which contains information about each edge (i.e. connections or ties between actors) in our network.

  2. Format Network Data. We learn to shape our data files into two common formats for storing network data: edgelists and nodelists.

  3. Create a Network Object. Finally, we’ll need to convert our data frames into special data format, an R network object, for working with relational data.

2b. Format Network Data

Recall from Chapter 1 of Carolan (2014) that ties, or relations, are what connect actors to one another. These ties are often referred to as “edges” when formatting and graphing network data and the range of ties in a network can be extensive. Some of the more common ties, or edges, used to denote connections among actors in educational research include:

  • Behavioral interaction (e.g., talking to each other or sending messages)

  • Physical connection (e.g., sitting together at lunch, living in the same neighborhood)

  • Association or affiliation (e.g., taking the same courses, belonging to the same peer group)

  • Evaluation of one person by another (e.g., considering someone a friend or enemy)

  • Formal relations (e.g., knowing who has authority over whom)

  • Moving between places or status (e.g., school choice preferences, dating patterns among adolescents)

Create Edgelist

The edgelist format is slightly different than other formats you have likely worked with in that the values in the first two columns of each row represent a dyad, or tie between two nodes in a network. An edge-list can also contain other information regarding the strength, duration, or frequency of the relationship, sometime called weight, in addition to other “edge attributes.”

For our analysis of tweets in this case study, we’ll use an approach similar to that used by Supovitz et al. (2017). Specifically, each node is an individual Twitter user (person, group, institution, etc.) and the connection between each node is the tweet, retweet, or mention/reply.

👉 Your Turn

Use the code chunk below to look at the data we just imported using one of your favorite methods for inspecting data. In the space that follows, identify the columns you think could be used to construct an edge list.

view(ccss_tweets)
  • YOUR RESPONSE HERE

Extract Edges and Nodes

If one of the columns you indicated in your response above included screen_name nice work! You may also have noticed that the mentions_screen_name column includes the names of those in the reply column, as well as those “mentioned” in each tweet, i.e. whose username was included in a post.

As noted above, an edgelist includes the nodes that make up a tie or dyad. Since the only two columns we need to construct our edgelist is the screen_name of the tweet author and the screen names of those included in the mentions, let’s:

  1. relocate() and rename those columns to sender and target to indicate the “direction” of the tweet;

  2. select() those columns along with any attributes that we think might be useful for analysis later on, like the timestamp or content of the tweet, i.e. text;

  3. assign our new data frame to ties_1.

ties_1 <-  ccss_tweets %>%
  relocate(sender = screen_name, # rename scree_name to sender
           target = mentions_screen_name) %>% # rename to receiver
  select(sender,
         target,
         created_at,
         text)

ties_1
## # A tibble: 48 × 4
##    sender          target              created_at          text                 
##    <chr>           <chr>               <dttm>              <chr>                
##  1 ben_combes      <NA>                2021-11-08 07:26:01 "I never got the gas…
##  2 NYSCER2021      TeachLiberty1 nana… 2021-11-08 01:49:17 "@TeachLiberty1 @nan…
##  3 SchnauzieLover  <NA>                2021-11-07 21:41:16 "Education Failures …
##  4 2bux15cents     <NA>                2021-11-07 17:32:08 "At what point will …
##  5 AlexiosAsText   MaggieEThornton     2021-11-07 15:22:14 "@MaggieEThornton If…
##  6 tx_granny       BanjoTanJoe Millen… 2021-11-06 19:29:41 "@MillennialOther @R…
##  7 PaprBagPrincss  <NA>                2021-11-05 20:31:28 "#CCChat (Common Cor…
##  8 Tech4Learning   <NA>                2021-11-05 18:01:00 "6 ways to incorpora…
##  9 listland        <NA>                2021-11-05 12:30:40 "Top 10 Reasons Why …
## 10 CapitolAdvocate <NA>                2021-11-05 12:28:25 "\"I’ve had students…
## # … with 38 more rows

Our edgelist with attributes is almost ready, but we have a couple of issues we still need to deal with.

As you may have noticed, our receiver column contains the names of multiple Twitter users, but a dyad or tie can only be between two actors or nodes.

“Unnest” User Names

In order to place each target user in a separate row that corresponds with each sender of the tweet, we will need to “unnest” these names using the {tidytext} package from Unit 3.

In Unit 3 we used the unnest_tokens() function to extract individual words from tweets. This time we’ll use it to place target of each tweet into separate rows corresponding to the sender of each tweet.

Run the following code and take a look at the new data frame to make sure it looks as expect and to spot any potential issues:

ties_2 <- ties_1 %>%
  unnest_tokens(input = target,
                output = receiver,
                to_lower = FALSE) %>%
  relocate(sender, receiver)

ties_2
## # A tibble: 166 × 4
##    sender         receiver        created_at          text                      
##    <chr>          <chr>           <dttm>              <chr>                     
##  1 ben_combes     <NA>            2021-11-08 07:26:01 I never got the gas bridg…
##  2 NYSCER2021     TeachLiberty1   2021-11-08 01:49:17 @TeachLiberty1 @nanalatin…
##  3 NYSCER2021     nanalatinaAA    2021-11-08 01:49:17 @TeachLiberty1 @nanalatin…
##  4 NYSCER2021     rweingarten     2021-11-08 01:49:17 @TeachLiberty1 @nanalatin…
##  5 NYSCER2021     AFTunion        2021-11-08 01:49:17 @TeachLiberty1 @nanalatin…
##  6 SchnauzieLover <NA>            2021-11-07 21:41:16 Education Failures since …
##  7 2bux15cents    <NA>            2021-11-07 17:32:08 At what point will the #c…
##  8 AlexiosAsText  MaggieEThornton 2021-11-07 15:22:14 @MaggieEThornton If enoug…
##  9 tx_granny      BanjoTanJoe     2021-11-06 19:29:41 @MillennialOther @Richard…
## 10 tx_granny      MillennialOther 2021-11-06 19:29:41 @MillennialOther @Richard…
## # … with 156 more rows

You probably notice one issue that we could deal with in a couple different ways. Specifically, many tweets are not directed at other users and hence the value for receiver is NA. We could keep these users as “isolates” in our network, but let’s simply remove them since our primary goal is to identify transmitters, transceivers and transcenders.

👉 Your Turn

In the code chunk below, use the drop_na() function to remove the rows with missing values from our receiver column in our ties-2 data frame since they are incomplete dyads. Save your final edgelist as ties using the <- assignment operator.

ties <- ties_2 %>%
  drop_na(receiver)

Now use the code chunk below to take a quick look at our final edgelist and answer the questions that follow:

ties
  1. How many edges are in our CCSS network?

    • YOUR RESPONSE HERE
  2. What do these ties/edges/connections represent?

    • YOUR RESPONSE HERE
  3. When do they start and end?

    • YOUR RESPONSE HERE

Create Nodelist

The second file we need to create is a data frame that contains all the nodes, often referred to as actors, in our network. This list sometimes includes attributes that we might want to examine as part of our analysis as well, like the number of Twitter followers, demographic group, country, gender, etc. This file or data frame is sometimes referred to as a nodelist or node attribute file.

To construct our basic nodelist, we will use the pivot_longer() function from the {dplyr} package, an updated version of the gather() function introduced in the RStudio Reshape Data Primer.

Run the following code to select the usernames form our ties edgelist, merge our sender and receiver columns into a single column, and take a quick look at our new data frame.

actors_1 <- ties %>%
  select(sender, receiver) %>%
  pivot_longer(cols = c(sender,receiver))

actors_1
## # A tibble: 286 × 2
##    name     value          
##    <chr>    <chr>          
##  1 sender   NYSCER2021     
##  2 receiver TeachLiberty1  
##  3 sender   NYSCER2021     
##  4 receiver nanalatinaAA   
##  5 sender   NYSCER2021     
##  6 receiver rweingarten    
##  7 sender   NYSCER2021     
##  8 receiver AFTunion       
##  9 sender   AlexiosAsText  
## 10 receiver MaggieEThornton
## # … with 276 more rows

As you can see, our sender and receiver usernames have been combined into a single column called value with a new column indicating whether they were a sender or receiver called name by default.

Since we’re only interested in usernames for our nodelist, and since we have a number of duplicate names, let’s select just the value column, rename it to actors, and use the distinct() function from {dplyr} to keep only unique names and remove duplicates:

actors <- actors_1 %>%
  select(value) %>%
  rename(actors = value) %>% 
  distinct()

👉 Your Turn

Use the code chunk below to take a quick look at our final actors data frame and answer question that follows:

actors

How many unique node/actors are in our CCSS network?

  • YOUR RESPONSE HERE

2c. Create Network Object

Before we can begin using many of the functions from the {tidygraph} and {ggraph} packages for summarizing and visualizing our Common Core Twitter network, we first need to convert our node and edge lists into network object.

Combine Edges & Nodes

The {tidygraph} package contains a tbl_graph() function that includes the following arguments:

  • edges = expects a data frame, in our case ties, containing information about the edges in the graph. The nodes of each edge must either be in a to and from column, or in the two first columns like the data frame we provided.

  • nodes = expects a data frame, in our case actors, containing information about the nodes in the graph. If to and/or from are characters or names, like in our data frames, then they will be matched to the column named according to node_key in nodes, if it exists, or matched to the first column in the node list.

  • directed = specifies whether the constructed graph should be directed, i.e. include information about whether each node is the sender or target of a connection. By default this is set to TRUE.

Let’s go ahead and create our network graph, name it network and print the output:

ccss_network_1 <- tbl_graph(edges = ties, 
                            nodes = actors)

ccss_network_1
## # A tbl_graph: 94 nodes and 143 edges
## #
## # A directed multigraph with 13 components
## #
## # Node Data: 94 × 1 (active)
##   actors       
##   <chr>        
## 1 NYSCER2021   
## 2 TeachLiberty1
## 3 nanalatinaAA 
## 4 rweingarten  
## 5 AFTunion     
## 6 AlexiosAsText
## # … with 88 more rows
## #
## # Edge Data: 143 × 4
##    from    to created_at          text                                          
##   <int> <int> <dttm>              <chr>                                         
## 1     1     2 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 2     1     3 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 3     1     4 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## # … with 140 more rows

👉 Your Turn

Take a look at the output for our simple graph above and answer the following questions:

  1. Are the numbers and names of nodes and actors consistent with our actors and ties data frames? What about the integers included in the from and to columns of the Edge Data?

    • YOUR RESPONSE HERE
  2. What do you think “components” refers to? Hint: see Chapter 6 of (Carolan 2014).

    • YOUR RESPONSE HERE
  3. Is our network directed or undirected?

    • YOUR RESPONSE HERE

A quick note about “directed” networks. A directed network indicates that a connection or tie is not necessarily reciprocated or mutual. For example, our network is directed because even though a user may follow, mention or reply to someone else, they may not necessarily receive a follow, mention or reply back. A facebook friendship network is undirected, however, since someone can not “friend” someone on Facebook without them also indicating a “friend” relationship, so the friendship is mutual or reciprocated.


3. EXPLORE

As noted in in our course readings, exploratory data analysis involves the processes of describing your data (such as by calculating the means and standard deviations of numeric variables, or counting the frequency of categorical variables) and, often, visualizing your data prior to modeling.

In Section 3, we use the {tidygraph} package for retrieving network descriptives and introduce the {ggraph} package to create a network visualization to help illustrate these metrics. Specifically, in this section we’ll learn to:

  1. Examine Basic Descriptives. We focus primarily on actors and edges in this walkthrough, including the edges wights we added in the previous section as well as node degree, and import and fairly intuitive measure of centrality.

  2. Make a Sociogram. Finally, we wrap up the explore phases by learning to plot a network and tweak key elements like the size, shape, and position of nodes and edges to better at communicating key findings.

3a. Examine Basic Descriptives

Many analyses of social networks are primarily descriptive. As Carolan (2014) notes, these descriptive studies aim either to:

  1. represent the network’s underlying social structure through data-reduction techniques; or,

  2. characterize network properties through network measures.

Centrality

A key structural property of networks is the concept of centralization. A network that is highly centralized is one in which relations are focused on a small number of actors or even a single actor in a network, whereas ties in a decentralized network are diffuse and spread over a number of actors. One of the most common descriptives reported in network studies and a primary measure of centralization is degree.

Degree is the number of ties to and from an ego. In a directed network, in-degree is the number of ties received, whereas out-degree is the number of ties sent.

Node Degree

The {tidygraph} package has an unique function called activate() that allows us to treat the nodes in our network object as if they were a typical data frame to which we can then apply standard tidyverse functions like select(), filter(), and mutate().

The latter function, mutate(), we can use to create new variables for nodes such as measures of degree, in-degree, and out-degree used by Supovitz et al. (2017) to identify transcenders, tranceivers, and transmitters respectively. These measures can be added by using the centrality_degree() function in the {tidygraph} package.

Run the following code to add degree measures to each of our nodes and print the output for inspection:

ccss_network <- ccss_network_1 %>%
  activate(nodes) %>%
  mutate(degree = centrality_degree(mode = "all")) %>%
  mutate(in_degree = centrality_degree(mode = "in"))

ccss_network
## # A tbl_graph: 94 nodes and 143 edges
## #
## # A directed multigraph with 13 components
## #
## # Node Data: 94 × 3 (active)
##   actors        degree in_degree
##   <chr>          <dbl>     <dbl>
## 1 NYSCER2021         4         0
## 2 TeachLiberty1      1         1
## 3 nanalatinaAA       1         1
## 4 rweingarten        1         1
## 5 AFTunion           1         1
## 6 AlexiosAsText      1         0
## # … with 88 more rows
## #
## # Edge Data: 143 × 4
##    from    to created_at          text                                          
##   <int> <int> <dttm>              <chr>                                         
## 1     1     2 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 2     1     3 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 3     1     4 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## # … with 140 more rows

We now see that these simple measures of centrality have been added to the nodes in our network.

👉 Your Turn

As you may have noted above, we forgot to include out-degree in our measures of centrality. Copy the code from above and add an out-degree measure to each node and print the output:

ccss_network <- ccss_network_1 %>%
  activate(nodes) %>%
  mutate(degree = centrality_degree(mode = "all")) %>%
  mutate(in_degree = centrality_degree(mode = "in")) %>%
  mutate(out_degree = centrality_degree(mode = "out"))

ccss_network
## # A tbl_graph: 94 nodes and 143 edges
## #
## # A directed multigraph with 13 components
## #
## # Node Data: 94 × 4 (active)
##   actors        degree in_degree out_degree
##   <chr>          <dbl>     <dbl>      <dbl>
## 1 NYSCER2021         4         0          4
## 2 TeachLiberty1      1         1          0
## 3 nanalatinaAA       1         1          0
## 4 rweingarten        1         1          0
## 5 AFTunion           1         1          0
## 6 AlexiosAsText      1         0          1
## # … with 88 more rows
## #
## # Edge Data: 143 × 4
##    from    to created_at          text                                          
##   <int> <int> <dttm>              <chr>                                         
## 1     1     2 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 2     1     3 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 3     1     4 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## # … with 140 more rows

Summarize Centrality Measures

We can also use the activate() function combined with the data.frame() function to extract our new measures to a separate data frame so we inspect our nodes individually and create some summary statistics using the handy summary() function.

node_measures <- ccss_network %>% 
  activate(nodes) %>%
  data.frame()

summary(node_measures)
##     actors              degree         in_degree       out_degree    
##  Length:94          Min.   : 1.000   Min.   :0.000   Min.   : 0.000  
##  Class :character   1st Qu.: 1.000   1st Qu.:1.000   1st Qu.: 0.000  
##  Mode  :character   Median : 2.000   Median :2.000   Median : 0.000  
##                     Mean   : 3.043   Mean   :1.521   Mean   : 1.521  
##                     3rd Qu.: 2.000   3rd Qu.:2.000   3rd Qu.: 0.000  
##                     Max.   :99.000   Max.   :6.000   Max.   :99.000

We see that typical nodes in this network are connected on average with 3 other Twitter users and have received on average mentions or replies from 1.5 users.

👉 Your Turn

Recall from the Prepare section that one of the questions guiding this analysis was:

Who are the transmitters, transceivers, and transcenders in our Common Core Twitter network?

Use the code chunk below to view() your node_measures data frame and answer the questions that follow:

view(node_measures)

Identify the Twitter user with the highest value for each of the following types of central actors:

  • Transmitters:

  • Transceivers:

  • Transcenders:

3b. Make a Sociogram

If you recall from 1a. Review the Research section, one of the defining characteristics of the social network perspective is its use of graphic imagery to represent actors and their relations with one another. To emphasize this point, Carolan (2014) reported that:

The visualization of social networks has been a core practice since its foundation more than 90 years ago and remains a hallmark of contemporary social network analysis. 

Network visualization can be used for a variety of purposes, ranging from highlighting key actors to even serving as works of art.

This excellent figure from Katya Ognyanova’s also excellent tutorial on Static and Dynamic Network Visualization with R helps illustrate the variety of goals a good network visualization can accomplish:

These visual representations of the actors and their relations, i.e. the network, are called a sociogram. Actors who are most central to the network, such as those with higher node degrees, are usually placed in the center of the sociogram and their ties are placed near them. As we’ll see in just a bit, those two actors with hundreds of ties will be placed by most graph layout algorithms in the center of the graph.

👉 Your Turn

The plot() function from R’s built in {graphics} package can be used to make a simple sociogram, but as you’ll see, it’s a bit lacking.

In the code chunk below, use the plot() function with your ccss_network object to see what the basic plot function produces:

plot(ccss_network)

If this had been a smaller network like one generated from a single classroom, this might have been a little more useful, but for larger networks like our Twitter data, this doesn’t communicate much. In fact, it’s visualizations like these that give sociograms the unflattering nickname of “hair ball” plots!

Fortunately, the {ggraph} package includes a plethora of plotting parameters for graph layouts, edges and nodes to improve the visual design of network graphs.

For the remainder of this section, we’re going to focus on creating a sociogram that highlights the main “transmitters” in our network.

Build a network

One thing to keep in mind when building a network viz with {ggraph}, is that just like it’s ggplot() counterpart, the ggraph() function takes care of setting up the plot object along with creating the layout for the plot based on the network object and the layout specification provided.

Let’s first pass our ccss_network object to ggraph and see what happens.

ggraph(ccss_network)
## Using `stress` as default layout

As you can see, just like the ggplot() function, this didn’t produce much on it’s own. All that the ggraph() function does is set up the network object to make a sociogram, and create a layout for our network, in this case the default “stress” layout.

Add Nodes

Very similar to how ggplot() uses the + operator to “layer” functions together to progressively build graphs, ggraph use the + operator progressively build a sociogram.

To add our nodes, we’ll added the geom_node_point() function. Again, just like with {ggplot2}, the “geom” in the geom_non_point() functions stands for “Geometric elements,” or geoms for short, and represents what you actually see in the plot.

👉 Your Turn

Now “add” the geom_node_point() function to our code using the + operator:

ggraph(ccss_network) + 
  geom_node_point() 
## Using `stress` as default layout

Well, at least we have our nodes now! But the default “stress” layout for our sociogram is not so great. Let’s fix that.

Add Layout

One of the major advances in visualization since the first hand-drawn sociograms developed by Jacob Moreno (1934) to represent relations among children in school is the use of software and algorithms to automatically layout networks on a grid.

There are may different layout methods, but we’ll start with the Fruchterman-Reingold (FR) layout, which is one of the most used layout algorithms for network visualization. These types of force-directed algorithms generally work well with large networks and try to layout graphs in “an aesthetically-pleasing way” by making edges roughly equal in length and minimizing overlap.

Let’s go ahead and include the layout argument, which in addition to including its own unique layouts, can incorporate layouts form {igraph} package like fr for the Fruchterman-Reingold (FR) layout:

ggraph(ccss_network, layout = "fr") +
  geom_node_point()

That’s a little better. We can also start to make out our separate network “components” as distinct groups, with one larger connected group in the center. In our Model section, we’ll introduce community detection algorithms to automatically identify groups and use color to show group membership.

Tweak Nodes

Also like {ggplot2}, geoms can include aesthetics, or aes for short, such as alpha for transparency, as well as color, shape and size.

Let’s now add some “aesthetics” to our points by including the aes() function and arguments such as size = and color =, which we can set to our out_degree measures to help highlight our primary transmitters:

ggraph(ccss_network, layout = "fr") + 
geom_node_point(aes(size = out_degree,
                    color = out_degree))

We can clearly see we have one main transmitter in this network! Unfortunately, without labels we don’t know who this Twitter users is.

Let’s fix that by adding another layer with some node text and labels. Since node labels are a geometric element, we can apply aesthetics to them as well, like color and size. Let’s also include the repel = argument that when set to TRUE will avoid overlapping text.

ggraph(ccss_network, layout = "fr") + 
  geom_node_point(aes(size = out_degree,
                      color = out_degree)) +
  geom_node_text(aes(label = actors,
                     size = out_degree/2,
                     color = out_degree),
                 repel=TRUE)

Much better! Even without the edges, using size and color have helped to highlight the main “transmitter” in our network.

Add Edges

Now, let’s connect the dots and add some edges using the geom_edge_link() function. We’ll also include some arguments like arrow = to include some arrows 1mm in length, an end_cap = around each node to keep arrows from overlapping the them, and set the transparency of our edges to alpha = .2 so our edges fade more into the background and help keep the focus on our nodes:

ggraph(ccss_network, layout = "fr") + 
  geom_node_point(aes(size = out_degree,
                      color = out_degree)) +
  geom_node_text(aes(label = actors,
                     size = out_degree/2,
                     color = out_degree),
                 repel=TRUE) +
  geom_edge_link(arrow = arrow(length = unit(1, 'mm')), 
                 end_cap = circle(3, 'mm'),
                 alpha = .2)

Add a Theme

Finally, let’s add a theme, which controls the finer points of display, like the font size and background color. The theme_graph() function add a theme specially tuned for graph visualizations. This function removes redundant elements in order to put focus on the data and if you type ?theme_graph in the console you will get a sense of the level of fine tuning you can do if desired.

Let’s add theme_graph() to our sociogram, remove the legends since they are not especially useful, and call it good for now:

ggraph(ccss_network, layout = "fr") + 
  geom_node_point(aes(size = out_degree,
                      color = out_degree),
                  show.legend = FALSE) +
  geom_node_text(aes(label = actors,
                     size = out_degree/2,
                     color = out_degree),
                 repel=TRUE,
                 show.legend = FALSE) +
  geom_edge_link(arrow = arrow(length = unit(1, 'mm')), 
                 end_cap = circle(3, 'mm'),
                 alpha = .2) + 
  theme_graph()

Note: If you’re having difficulty seeing the sociogram in the small R Markdown code chunk, you can copy and paste the code in the console and it will show in the viewpane and then you can enlarge and even save as an image file.

👉 Your Turn

Try modifying the code below by tweaking the included function/arguments or adding new ones for layouts, nodes, and edges to highlight the main “transenders” or “tranceivers” in our network. See if you can also make your plot either more “aesthetically pleasing” and/or more purposeful in what it’s trying to communicate.

There are no right or wrong answers, just have some fun trying out different approaches!

ggraph(ccss_network, layout = "fr") + 
  geom_node_point(aes(size = out_degree,
                      color = out_degree),
                  show.legend = FALSE) +
  geom_node_text(aes(label = actors,
                     size = out_degree/2,
                     color = out_degree),
                 repel=TRUE,
                 show.legend = FALSE) +
  geom_edge_link(arrow = arrow(length = unit(1, 'mm')), 
                 end_cap = circle(3, 'mm'),
                 alpha = .2) + 
  theme_graph()

Congrats! You made it to the end of the Explore section and are ready to learn a little about network modeling! Before proceeding further, knit your document and check to see if you encounter any errors.


4. MODEL

As highlighted in Chapter 3 of Data Science in Education Using R, the Model step of the data science process entails “using statistical models, from simple to complex, to understand trends and patterns in the data.”

4a. Identify Groups

Chapter 6: Groups and Positions in Complete Networks of SNA and Education (Carolan 2014) introduces both “bottom up” and “top down” approaches for identifying groups in a network, as well as why researchers may be interested in exploring these groups. He also notes that:

Unlike most social science, the idea is to identify these groups through their relational data, not an exogenous attribute such as grade level, departmental affiliation, or years of experience. 

In this section, we’ll briefly explore a “top down” approach to identifying these groups through the use of community detection algorithms.

Community Detection

Similar to the range of functions included for calculating node and edge centrality, the {tidygraph} package includes various clustering functions provided by the {igraph} package. Some of these algorithms are designed for directed graphs, while others are for undirected graphs.

Also similar to calculating centrality measures, we need to activate() our nodes first before applying these community detection algorithms to assign our nodes to groups.

For the sake of simplicity, and because there seem to be some obvious groups based on network components, let’s group our nodes using the group_components() along with the mutate() function from {dplyr} to create a new group variable to our nodelist that provides a value based on the component to which each node belongs.

Run the following code to group our nodes and print our new cccss_network_groups object and take a quick look:

ccss_network_groups <- ccss_network %>%
  activate(nodes) %>%
  mutate(group = group_components())
  
ccss_network_groups
## # A tbl_graph: 94 nodes and 143 edges
## #
## # A directed multigraph with 13 components
## #
## # Node Data: 94 × 5 (active)
##   actors        degree in_degree out_degree group
##   <chr>          <dbl>     <dbl>      <dbl> <int>
## 1 NYSCER2021         4         0          4     3
## 2 TeachLiberty1      1         1          0     3
## 3 nanalatinaAA       1         1          0     3
## 4 rweingarten        1         1          0     3
## 5 AFTunion           1         1          0     3
## 6 AlexiosAsText      1         0          1    11
## # … with 88 more rows
## #
## # Edge Data: 143 × 4
##    from    to created_at          text                                          
##   <int> <int> <dttm>              <chr>                                         
## 1     1     2 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 2     1     3 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## 3     1     4 2021-11-08 01:49:17 @TeachLiberty1 @nanalatinaAA We are happy to …
## # … with 140 more rows

Now that we’ve assigned our nodes to a group, let’s add one final layer to our sociogram from above by using the geom_node_voronoi() function to color our nodes by group assignment and changing our group numbers to factors so each group is a distinct color:

ccss_network_groups %>%
  ggraph(layout = "fr") + 
  geom_node_point(aes(size = out_degree, 
                      color = out_degree),
                  show.legend = FALSE) +
  geom_node_text(aes(label = actors, 
                     color = out_degree,
                     size = out_degree), 
                     repel=TRUE,
                 show.legend = FALSE) +
  geom_edge_link(arrow = arrow(length = unit(1, 'mm')), 
                 end_cap = circle(3, 'mm'),
                 alpha = .2) + 
  theme_graph() + 
  geom_node_voronoi(aes(fill = factor(group),
                         alpha = .05), 
                    max.radius = .5,
                    show.legend = FALSE) 
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

I’m not entirely sure this was an improvement to our sociogram but it definitely is colorful!!

4b. Identify Sentiment

Recall from the Prepare section that the final question guiding this analysis was:

Which actors in our network tend to be more opposed to the Common Core?

In this section, we’ll use the {vader} package for sentiment analysis introduce in Unit 3 to help answer this question.

👉 Your Turn

In the code chunk below, use the vader_df() function to perform sentiment analysis on the text in our ccss_tweets data frame created above, save as summary_vader and inspect the results. Hint: You will need to use the $ operator to select the text column containing our tweets.

summary_vader <- vader_df(ccss_tweets$text)

summary_vader
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                text
## 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     I never got the gas bridge argument for new #gas plants … who would invest billions in new CCGT plants to then only use them for half their productive life as deep #decarbonization, on the road to #NetZero, takes hold. I suppose there is always the elusive carbon capture #CCSS https://t.co/wUk4xHXnSt
## 2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @TeachLiberty1 @nanalatinaAA We are happy to support teachers but will NEVER support teacher unions any longer.  The screwed our kids during #CommonCore and .@rweingarten   .@AFTunion did the same with the mask mandates.  They only talk about our kids when they need something.  No more
## 3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           Education Failures since 2012 can be traced back to #CommonCore and we MUST abolish it!! Our children are becoming STUPID and parents are unable to assist their children with this warped way of teaching. It’s NOT a way to learn! #AbolishCommonCore
## 4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          At what point will the #commoncore integrate #compsci and #netizenship into curriculums for countries that are deeply dependent on #technology as a learning ‘solution’?
## 5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               @MaggieEThornton If enough were gathered could run a discourse analysis, but the gold standard would be to do something like Supovitz's #CommonCore project https://t.co/qROBwDpJCZ
## 6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   @MillennialOther @Richard_Harambe @RepMikeJohnson This is the result of a #commoncore education
## 7                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             #CCChat (Common Core Chat)\n90) #CCSS (Common Core State Standards)\n91) #CommonCore\n92) #EdPolicy\n93) #EdReform\n94) #ESSA https://t.co/IRYo2HCr41
## 8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    6 ways to incorporate digital writing across the curriculum https://t.co/ISp4J9Pwnk #ccss #eBooks #digitalstorytelling https://t.co/tJpBZCdbMf
## 9                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       Top 10 Reasons Why Standardized Testing Is Here to Stay https://t.co/5cSYQragyv #commoncore
## 10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              "I’ve had students who take home essays and they will misspell ‘American’ and forget to capitalize it.” Thanks #commoncore! https://t.co/3b4ZRrI6pj
## 11                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              "Again, I can’t be sure that I’m right. Maybe it was #CommonCore" @MichaelPetrilli \n"It was #commoncore." @CapitolAdvocate https://t.co/bKFbvxElDX
## 12                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  @MillennialOther @Richard_Harambe @RepMikeJohnson This is the result of a #commoncore education
## 13                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 @4Patrick7 @BookerSparticus What an ignoramus. What possible excuse is there for someone too old to blame #commoncore? Willful blindness, partisanship and tearing the social fabric of America.
## 14                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           A lot of the crt debate reminds me of the common core math debate. Parents just upset something is new and different combined with isolated examples of bad lesson plans. Been a while since I heard complaints about common core math....  #CRT #commoncore #teaching
## 15                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          #Republicans have been uniting us around #Florida #CommonCore for over 10 years now and #NewMexico launched "it" @ the grassroots level so not sure why #CRTinschools would be a threat to the #energy holding the #Anonymous #QANON Attack the Capitol agct #DNA connections together?
## 16                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Listen to "Episode 19: Big Lies in K-12"  (Nov. 3, 2021) at  https://t.co/UWaMsLUGAt \n#phonics   #constructivism   #commoncore  #dumbingdown  #socialism
## 17                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              The Shrewd Administrator\n#E320CannabisStudy\n#E320Leadership \n#E320Education \n#NVACS #CCSS #NGSS #ISTE \nhttps://t.co/eUGV6whHGv
## 18                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Never forget #CommonCore! https://t.co/co0UCdphI5
## 19                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         @Tori_Sachs @GovWhitmer Charter backers hold no moral high ground \n\n@MiGOP's (@onetoughnerd @MISenate @MI_Republicans @pjcolbeck ) had an opportunity to give parents a voice - primarily by removing DC's &amp; Lansing's stranglehold over local curriculum\n\nBut they threw #StopCommonCore advocates #UnderTheBus
## 20                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      🥜 job #AWFL on airplane doesn’t want to breathe the “unvaccinated oxygen”of the passenger next to her.  \n#commoncore #Science #edumacation #education #COVIDIOTS #COVID19
## 21                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     If you replace "harvest the blood of children" with "indoctrinates children with socialist propaganda" it's little more than a rerun of the vacuous hysterics we saw in response to #CommonCore. #edreform #politics https://t.co/QOd6skgSuH
## 22                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Is #commoncore math delaying the counting in #NewJersey?  Get it done! 🔥
## 23                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           Dear Dems, please be careful not to pass that 100% mark!!! #CommonCore
## 24                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              In the past couple of elections, the Dirty Democrats have proved that teaching &amp; learning #CommonCore math is screwing up the vote counting counters. Weird that the “discrepancies” always happen in key areas. #VirginiaVotes
## 25                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Someone at FadeawayWorld doesn't know how to count. They put L.James at 3 &amp; K.A.Jabbar at 4. Both have 10 appearances w/ KAJ winning 6 rings &amp; LJ winning 4 rings. Shouldn't KAJ be ranked 3rd and LJ be 4th?? Is this due to common core math?? #fadeawayworld #commoncore #CommonSense
## 26                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              groups attempt ban"true history.#commoncore #Tennessee Nowhere instructed to make students feel less than as retired #teacher I initiated learning promoted critical thinking so history wouldn't repeat itself \n #TheView https://t.co/Ra54AYmnjO
## 27                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Trump: "#CommonCore is gone [when I'm electd]." #IACaucus https://t.co/Rb7UrTIEtc
## 28                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        @jonrappoport How the #CommonCore technocrats take your future-adult children's guns by taking their privacy now. https://t.co/CZmGf4qod5
## 29                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Trump: "#CommonCore is gone [when I'm electd]." #IACaucus https://t.co/Rb7UrTIEtc
## 30                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       Michael acts like the captain of a titanic know as #commoncore. Defends it even after it sunk. Tells people it wasn't the ships fault despite the overwhelming evidence that it was a complete and utter #failure. https://t.co/Fl7j4LeMRE
## 31                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       Why are we still accepting #commoncore #math? It was created by a dozen money grabbing fools who never taught math in a K-12 setting. \n\nThis has me absolutely murderous right now. And I love math god damn it. https://t.co/QjOsjZ0y69
## 32                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      There's more to learning than ABC's &amp; 123's https://t.co/qrHcv0JY2P no #commoncore #playmatters https://t.co/gZi3zcSPcB
## 33                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           @unusual_whales stable.. what? is that something to do with the vaccines? #CBDC #CCSS #BuildBackBetter
## 34                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  @NorthmanTrader also it was unable to collect the taxes.. thats why they need #WEFagenda, cashless payments, #CBDC #CCSS  #GreenPass #GreenDeal\nand minorities type socialism like #MeToo etc.. and #COVID19 to #DigitalTransformation #ID2020 \n#ToPayHisTaxes\n#BuildBackBetter #BBB https://t.co/iaKOOMsZTb
## 35                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       @zerohedge #CCSS China Credit Score System\n🥕💉🏏🍆🥒🥕💉🏏🥒🍆🇪🇺🌈🦄🍭🌈🍭🌈 #DoNotComply #LetsGoBrandon
## 36                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      There's more to learning than ABC's &amp; 123's https://t.co/qrHcv0JY2P no #commoncore #playmatters https://t.co/gZi3zcSPcB
## 37                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Sending your child to a public school is like telling them walk across the road during rush hour traffic. Nothing good can come from it! #Parents #CRT #CommonCore\n#Indoctrination \n#Pastors #Church https://t.co/P1Cnw0iyEU
## 38                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        @johnpavlovitz @nazuzuwin Similar to their fear of #CommonCore. Knowledge terrifies them.
## 39                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Cape Coral schools, Chesterfield Public Schools, #commoncore\nCity of Falls Church, Colts Neck School District\n(K/DRA 3) Read Aloud for Small and Large\nFREE activity at\nhttps://t.co/48MLi94V7C\nCheck out our site: https://t.co/t6LySc6rZ3 https://t.co/iEZMwZbbof
## 40                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/vOEvx0aE5h
## 41                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/DjT45PZOBq
## 42                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/fEO7VEDsfM
## 43                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/vOEvx0aE5h
## 44                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/DjT45PZOBq
## 45                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I LOVE being in the classroom with the students, but completing the @danielson_group questionnaire is burn out central.  \n#danielsonframework #teacher #teachertwitter #administration #life #over #content #motivator #inspirer #education #commoncore https://t.co/fEO7VEDsfM
## 46                 @EatAtJoes7 @upperleftwino @TosoFlash @BDemocratsfor @manifesto2000 @DynastyEnd @pixfiber @Dallas4Bernie @BySallyAlbright @MiddleMolly @BobForDinner @TruthRuththe @shelly_laughing @Sailing_fool @SaginawsSong @banquet_beggars @BubblesToBurst @CyborgBjorn @elevenstars @pepper26potts @itsjustkay0k @darealwiles @FatherOfTheBir9 @McCadeMiller2 @prettynobodyco @ulcerative @M4M4ALL @ReadeAlexandra @TaraReadeTruth @glennkirschner2 @DNC @TaranaBurke @RTAmericaNews @ChrisLynnHedges @maxkeiser @LeeCamp @GovJVentura @JohnRalstonSaul @OurRevolutionPR @OurRevolution @ProudSocialist @TRNshow @ninaturner @Bioregional @kthalps @EdProgress @bc_disability @candisability @GSVteam @NewsHour Still holding a candle for #BillGates' Corporate, er, I mean Common Core State Standards? That's too bad, because the white supremacist #CCSS trash is essentially dead. https://t.co/IRX2ZUf7jf\n\n#JoeBiden \n#Bidenflation \n#BidenIsAFailure \n#JoeBidensAmerica \n#JimCrowJoe #Biden
## 47 @EatAtJoes7 @BDemocratsfor @manifesto2000 @upperleftwino @DynastyEnd @pixfiber @Dallas4Bernie @BySallyAlbright @MiddleMolly @BobForDinner @TruthRuththe @shelly_laughing @Sailing_fool @SaginawsSong @banquet_beggars @BubblesToBurst @CyborgBjorn @elevenstars @pepper26potts @itsjustkay0k @darealwiles @FatherOfTheBir9 @McCadeMiller2 @prettynobodyco @ulcerative @M4M4ALL @ReadeAlexandra @TaraReadeTruth @glennkirschner2 @DNC @TaranaBurke @RTAmericaNews @ChrisLynnHedges @maxkeiser @LeeCamp @GovJVentura @JohnRalstonSaul @OurRevolutionPR @OurRevolution @ProudSocialist @TRNshow @ninaturner @Bioregional @kthalps @EdProgress @bc_disability @candisability @GSVteam @NewsHour LOL. Yeah, my opposition to a white supremacist, corporate curriculum (#CCSS) based on the "great man" theory of history and a literature list that intentionally eschewed POC really drives home your point #BidenBoi.\n\n#JoeBiden \n#Bidenflation \n#BidenIsAFailure \n#JimCrowJoe #Biden https://t.co/ztrG8yx07i
## 48                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Check out Common Core Math in Action Book Grades K-2 Catherine Jones Kuhns Marrie Lasater  https://t.co/BQd6VYWDJS via @eBay #math #commoncore #commoncoremath #classroom #homeschool #classroom
##                                                                                                                                                                                                                                                                           word_scores
## 1                                                                                                                        {0, 0, 0, 0, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 2                                                                                                                               {0, 0, 0, 0, 1.35, 0, 0.85, 0, 0, 0, 0, -1.887, 0, 0, 0, 0, 0, -3.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.8, 0}
## 3                                                                                                                                                   {0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 4                                                                                                                                                                                                          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.3}
## 5                                                                                                                                                                                                         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.25, 0, 0, 0, 0}
## 6                                                                                                                                                                                                                                                   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 7                                                                                                                                                                                                                                                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 8                                                                                                                                                                                                                                          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 9                                                                                                                                                                                                                                              {0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 10                                                                                                                                                                                                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9, 0, 0, 0, 1.9, 0, 0}
## 11                                                                                                                                                                                                                           {0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 12                                                                                                                                                                                                                                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 13                                                                                                                                                                                          {0, 0, 0, 0, -1.9, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0, -1.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 14                                                                                                                                   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.6, 0, 0, 0, 0, 0, 0, 0, -1.3, 0, 0, -2.5, 0, 0, 0, 0, 0, 0, 0, 0, -1.7, 0, 0, 0, 0, 0, 0, 0}
## 15                                                                                                                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, -1.167979, 0, 0, 0, 0, 0, -2.4, 0, 0, 1.1, 0, 0, 0, 0, -2.1, 0, 0, 0, 0, 0, 0}
## 16                                                                                                                                                                                                                          {0, 0, 0, 0, 0, -1.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 17                                                                                                                                                                                                                                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 18                                                                                                                                                                                                                                                                   {0, 0.666, 0, 0}
## 19                                                                                                                                                      {0, 0, 0, 0, 0, -0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 20                                                                                                                                                                                                            {0, 0, 0, 0, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 21                                                                                                                                                                         {0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 22                                                                                                                                                                                                                                               {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 23                                                                                                                                                                                                                                         {1.6, 0, 1.3, 0, 0.6, 0, 0, 0, 0, 0, 0, 0}
## 24                                                                                                                                                                    {0, 0, 0, 0, 0, 0, 0, -1.9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9, 0, 0, 0, 0, 0, -0.7, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 25                                                                                                                         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.4, 0, 0, 0, 0, 2.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 26                                                                                                                                                                                       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.8, -1.3, 0, 0, 0, 0, 0, 0, 0, 0}
## 27                                                                                                                                                                                                                                                        {0, 0, 0, 0, 0, 0, 0, 0, 0}
## 28                                                                                                                                                                                                                                   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 29                                                                                                                                                                                                                                                        {0, 0, 0, 0, 0, 0, 0, 0, 0}
## 30                                                                                                                                                         {0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.593, 0}
## 31                                                                                                                                             {0, 0, 0, 0, 1.6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -2.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.493, 0, 0, 0, 0, 3.2, 0, 1.1, -1.7, 0, 0}
## 32                                                                                                                                                                                                                                         {0, 0, 0, 0, 0, 0, 0, 0, 0, -1.2, 0, 0, 0}
## 33                                                                                                                                                                                                                                       {0, 1.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 34                                                                                                                                                                     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 35                                                                                                                                                                                                                                                      {0, 0, 0, 1.6, 0, 0, 0, 0, 0}
## 36                                                                                                                                                                                                                                         {0, 0, 0, 0, 0, 0, 0, 0, 0, -1.2, 0, 0, 0}
## 37                                                                                                                                                                            {0, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 38                                                                                                                                                                                                                                            {0, 0, 0, 0, 0, -2.2, 0, 0, 0, -2.6, 0}
## 39                                                                                                                                                                            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.033, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 40                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 41                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 42                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 43                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 44                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 45                                                                                                                                                                                  {0, 1.9665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3, 0, 0, 0}
## 46                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.5, 0, 0, 0, 0.5, 0, 0, 0, 0, -3.3, 0, 0, 0, 0, 0, 0, 0}
## 47 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.083, 1.2, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 3.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
## 48                                                                                                                                                                                                           {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
##    compound   pos   neu   neg but_count
## 1    -0.361 0.000 0.952 0.048         0
## 2    -0.777 0.079 0.733 0.188         1
## 3    -0.841 0.000 0.830 0.170         0
## 4     0.318 0.091 0.909 0.000         0
## 5     0.502 0.124 0.876 0.000         1
## 6     0.000 0.000 1.000 0.000         0
## 7     0.000 0.000 1.000 0.000         0
## 8     0.000 0.000 1.000 0.000         0
## 9     0.202 0.141 0.859 0.000         0
## 10    0.316 0.138 0.779 0.082         0
## 11    0.318 0.119 0.881 0.000         0
## 12    0.000 0.000 1.000 0.000         0
## 13   -0.612 0.042 0.784 0.173         0
## 14   -0.878 0.000 0.783 0.217         0
## 15   -0.724 0.070 0.761 0.169         0
## 16   -0.421 0.000 0.859 0.141         0
## 17    0.000 0.000 1.000 0.000         0
## 18    0.240 0.395 0.605 0.000         0
## 19    0.077 0.046 0.916 0.039         1
## 20    0.077 0.056 0.944 0.000         0
## 21   -0.660 0.000 0.824 0.176         0
## 22    0.000 0.000 1.000 0.000         0
## 23    0.749 0.450 0.550 0.000         0
## 24   -0.670 0.000 0.827 0.173         0
## 25    0.830 0.139 0.861 0.000         0
## 26    0.128 0.087 0.841 0.072         0
## 27    0.000 0.000 1.000 0.000         0
## 28    0.000 0.000 1.000 0.000         0
## 29    0.000 0.000 1.000 0.000         0
## 30    0.043 0.112 0.803 0.085         0
## 31   -0.126 0.205 0.600 0.195         0
## 32   -0.296 0.000 0.845 0.155         0
## 33    0.374 0.165 0.835 0.000         0
## 34    0.361 0.067 0.933 0.000         0
## 35    0.382 0.245 0.755 0.000         0
## 36   -0.296 0.000 0.845 0.155         0
## 37    0.099 0.079 0.852 0.068         0
## 38   -0.778 0.000 0.570 0.430         0
## 39    0.617 0.112 0.888 0.000         0
## 40    0.806 0.206 0.794 0.000         1
## 41    0.806 0.206 0.794 0.000         1
## 42    0.806 0.206 0.794 0.000         1
## 43    0.806 0.206 0.794 0.000         1
## 44    0.806 0.206 0.794 0.000         1
## 45    0.806 0.206 0.794 0.000         1
## 46   -0.807 0.017 0.896 0.087         0
## 47    0.898 0.124 0.876 0.000         0
## 48    0.000 0.000 1.000 0.000         0

Recall that the compound score is the one most commonly used for sentiment analysis by most researchers, and is computed by summing the valence scores of each word in the lexicon, adjusted according to the rules, and then normalized to be between -1 (most extreme negative) and +1 (most extreme positive).

Now use the inner_join() function introduced in the Join Data Sets Primer to add these sentiment scores values back to our tweets by joining summary_vader and ccss_tweets and using by = "text" as the key for matching both data frames:

tweet_sentiment <-inner_join(summary_vader, 
                             ccss_tweets,
                             by = "text") %>%
  select(screen_name, compound, )

Summarize Sentiment

Now that you have these joined, let’s group our data by each user’s screen_name and summarize their mean compound sentiment score:

user_sentiment <- tweet_sentiment %>%
  group_by(screen_name) %>%
  summarise(sentiment = mean(compound))

Note that we have effectively just created some new node and edge “attributes” that could be incorporated into our network visualization to potentially help understand why groups may have formed as they did.

👉 Your Turn

Recall from the Prepare section that the final question guiding this analysis was:

Which actors in our network tend to be more opposed to the Common Core?

Use the code chunk below to inspect our data frame and answer the question above in the space below:

user_sentiment
  • YOUR RESPONSE HERE

5. COMMUNICATE

In this case study, we focused on the literature guiding our analysis; wrangling our data into a network object; examining basic network centrality measures; and identifying groups and sentiment in tweets about the CCSS curriculum standards.

In response to the following research questions driving this analysis, write a 2-3 sentences summarizing our findings:

  1. Who are the main transmitters, transceivers, and transcenders in our Common Core Twitter network?

  2. What subgroups, or factions, existed in our network?

  3. Which actors in our network tended to be more opposed to the Common Core?

Finally, add 1-2 sentences in response to the following prompts:

  1. One important thing I took away from this unit about network network analysis:

  2. One thing about network analysis I want to learn more about:

🧶 Knit & Check ✅

Congratulations - you’ve completed your first text mining case study! To complete your work, you can click the drop down arrow at the top of the file, then select “Knit top HTML.” This will create a report in your Files pane that serves as a record of your code and its output you can open or share.

References

Carolan, Brian. 2014. “Social Network Analysis and Education: Theory, Methods & Applications.” https://doi.org/10.4135/9781452270104.
Estrellado, Ryan A., Emily A. Freer, Jesse Mostipak, Joshua M. Rosenberg, and Isabella C. Velásquez. 2020. Data Science in Education Using r. Routledge. https://doi.org/10.4324/9780367822842.
Supovitz, Jonathan, Alan J Daly, Miguel del Fresno, and Christian Kolouch. 2017. “Commoncore Project.” Retrieved April 3: 2019. http://www.hashtagcommoncore.com/.
Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. " O’Reilly Media, Inc.". https://r4ds.had.co.nz.
LS0tCnRpdGxlOiAnVW5pdCA0IENhc2UgU3R1ZHk6IEhhc2h0YWcgQ29tbW9uIENvcmUnCnN1YnRpdGxlOiAiRUNJIDU4NiBJbnRyb2R1Y3Rpb24gdG8gTGVhcm5pbmcgQW5hbHl0aWNzIgphdXRob3I6ICJEci4gU2hhdW4gS2VsbG9nZyIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCclQiAlZSwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogVFJVRQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCmJpYmxpb2dyYXBoeTogbGl0L3JlZmVyZW5jZXMuYmliCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIDEuIFBSRVBBUkUKCk91ciBVbml0IDQgQ2FzZSBTdHVkeTogSGFzaHRhZyBDb21tb24gQ29yZSBpcyBpbnNwaXJlZCBieSB0aGUgd29yayBvZgpKb25hdGhhbiBTdXBvdml0eiwgQWxhbiBEYWx5LCBNaWd1ZWwgZGVsIEZyZXNubyBhbmQgQ2hyaXN0aWFuIEtvbG91Y2gKd2hvIGV4YW1pbmVkIHRoZSBpbnRlbnNlIGRlYmF0ZSBzdXJyb3VuZGluZyB0aGUgQ29tbW9uIENvcmUgU3RhdGUKU3RhbmRhcmRzIGVkdWNhdGlvbiByZWZvcm0gYXMgaXQgcGxheWVkIG91dCBvbiBUd2l0dGVyLiBBcyBub3RlZCBvbgp0aGVpciBleHBhbnNpdmUgYW5kIGludGVyYWN0aXZlIHdlYnNpdGUgZm9yIHRoZSBbXCNDT01NT05DT1JFClByb2plY3RdKGh0dHBzOi8vd3d3Lmhhc2h0YWdjb21tb25jb3JlLmNvbSksIHRoZSBDb21tb24gQ29yZSB3YXMgYSBtYWpvcgplZHVjYXRpb24gcG9saWN5IGluaXRpYXRpdmUgb2YgdGhlIGVhcmx5IDIxc3QgY2VudHVyeS4gQSBwcmltYXJ5IGFpbSBvZgp0aGUgQ29tbW9uIENvcmUgd2FzIHRvIHN0cmVuZ3RoZW4gZWR1Y2F0aW9uIHN5c3RlbXMgYWNyb3NzIHRoZSBVbml0ZWQKU3RhdGVzIHRocm91Z2ggYSBzZXQgb2Ygc3BlY2lmaWMgYW5kIGNoYWxsZW5naW5nIGVkdWNhdGlvbiBzdGFuZGFyZHMuCkFsdGhvdWdoIHRoZXNlIHN0YW5kYXJkcyBvbmNlIGVuam95ZWQgYmlwYXJ0aXNhbiBzdXBwb3J0LCB3ZSBzYXcgaW4gb3VyCnByZXZpb3VzIGNhc2Ugc3R1ZHkgaG93IHRoZXNlIHN0YW5kYXJkcyBoYXZlIGJlY29tZSBhIHBvbGl0aWNhbCBwdW5jaGluZwpiYWcuCgpJbiBVbml0IDQsIHdlIGNvbnRpbnVlIG91ciBpbnZlc3RpZ2F0aW9uIG9mIHR3ZWV0cyBhcm91bmQgdGhlIHRoZXNlCmNvbnRyb3ZlcnNpYWwgc3RhdGUgc3RhbmRhcmRzIHRocm91Z2ggc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMuClNwZWNpZmljYWxseSwgdGhpcyBjYXNlIHN0dWR5IHdpbGwgY292ZXIgdGhlIGZvbGxvd2luZyB0b3BpY3MgcGVydGFpbmluZwp0byBlYWNoIGRhdGEtaW50ZW5zaXZlIHdvcmtmbG93IHByb2Nlc3M6CgoxLiAgKipQcmVwYXJlKio6IFByaW9yIHRvIGFuYWx5c2lzLCB3ZSdsbCB0YWtlIGEgbG9vayBhdCB0aGUgY29udGV4dAogICAgZnJvbSB3aGljaCBvdXIgZGF0YSBjYW1lLCBmb3JtdWxhdGUgc29tZSByZXNlYXJjaCBxdWVzdGlvbnMsIGFuZCBnZXQKICAgIGludHJvZHVjZWQgdGhlIHt0aWR5Z3JhcGh9IGFuZCB7Z2dyYXBofSBwYWNrYWdlcyBmb3IgYW5hbHl6aW5nCiAgICByZWxhdGlvbmFsIGRhdGEuCgoyLiAgKipXcmFuZ2xlKio6IEluIHRoZSB3cmFuZ2xpbmcgc2VjdGlvbiBvZiBvdXIgY2FzZSBzdHVkeSwgd2Ugd2lsbAogICAgbGVhcm4gc29tZSBiYXNpYyB0ZWNobmlxdWVzIGZvciBtYW5pcHVsYXRpbmcsIGNsZWFuaW5nLAogICAgdHJhbnNmb3JtaW5nLCBhbmQgbWVyZ2luZyBuZXR3b3JrIGRhdGEuCgozLiAgKipFeHBsb3JlKio6IFdpdGggb3VyIG5ldHdvcmsgZGF0YSB0aWRpZWQsIHdlIGxlYXJuIHRvIGNhbGN1bGF0ZQogICAgc29tZSBrZXkgbmV0d29yayBtZWFzdXJlcyBhbmQgdG8gaWxsdXN0cmF0ZSBzb21lIG9mIHRoZXNlIHN0YXRzCiAgICB0aHJvdWdoIG5ldHdvcmsgdmlzdWFsaXphdGlvbi4KCjQuICAqKk1vZGVsKio6IFdlIGNvbmNsdWRlIG91ciBhbmFseXNpcyBieSBpbnRyb2R1Y2luZyBjb21tdW5pdHkKICAgIGRldGVjdGlvbiBhbGdvcml0aG1zIGZvciBpZGVudGlmeWluZyBncm91cHMgYW5kIHJldmlzaXRpbmcgc2VudGltZW50CiAgICBhYm91dCB0aGUgY29tbW9uIGNvcmUuCgo1LiAgKipDb21tdW5pY2F0ZSoqOiBXZSBicmllZmx5IHJlZmxlY3Qgb24gb3VyIHdhbGt0aHJvdWdoIGluIGFuZCB3aGF0CiAgICB3ZSBsZWFybmVkIGZyb20gb3VyIGFuYWx5c2lzLgoKIyMgMWEuIFJldmlldyB0aGUgUmVzZWFyY2gKClJlY2FsbCBmcm9tIFtTb2NpYWwgTmV0d29yayBBbmFseXNpcyBhbmQgRWR1Y2F0aW9uOiBUaGVvcnksIE1ldGhvZHMgJgpBcHBsaWNhdGlvbnNdKGh0dHBzOi8vbWV0aG9kcy5zYWdlcHViLmNvbS9ib29rL3NvY2lhbC1uZXR3b3JrLWFuYWx5c2lzLWFuZC1lZHVjYXRpb24pCnRoYXQgQ2Fyb2x5biAoMjAxMykgY2l0ZWQgdGhlIGZvbGxvd2luZyBmb3VyIGZlYXR1cmVzIHVzZWQgYnkgRnJlZW1hbgooMjAwNCkgdG8gZGVmaW5lIHRoZSBzb2NpYWwgbmV0d29yayBwZXJzcGVjdGl2ZToKCjEuICBTb2NpYWwgbmV0d29yayBhbmFseXNpcyBpcyAqKm1vdGl2YXRlZCBieSBhIHJlbGF0aW9uYWwgaW50dWl0aW9uKioKICAgIGJhc2VkIG9uIHRpZXMgY29ubmVjdGluZyBzb2NpYWwgYWN0b3JzLgoKMi4gIEl0IGlzIGZpcm1seSAqKmdyb3VuZGVkIGluIHN5c3RlbWF0aWMgZW1waXJpY2FsIGRhdGEqKi4KCjMuICBJdCAqKm1ha2VzKiogKip1c2Ugb2YgZ3JhcGhpYyBpbWFnZXJ5KiogdG8gcmVwcmVzZW50IGFjdG9ycyBhbmQKICAgIHRoZWlyIHJlbGF0aW9ucyB3aXRoIG9uZSBhbm90aGVyLgoKNC4gIEl0ICoqcmVsaWVzKiogKipvbioqICoqbWF0aGVtYXRpY2FsIGFuZC9vciBjb21wdXRhdGlvbmFsIG1vZGVscyoqIHRvCiAgICBzdWNjaW5jdGx5IHJlcHJlc2VudCB0aGUgY29tcGxleGl0eSBvZiBzb2NpYWwgbGlmZS4KClRoZSBbXCNDT01NT05DT1JFIFByb2plY3RdKGh0dHBzOi8vd3d3Lmhhc2h0YWdjb21tb25jb3JlLmNvbSkgdGhhdCB3ZSdsbApleGFtaW5lIG5leHQgaXMgYW4gZXhlbXBsYXJ5IGlsbHVzdHJhdGlvbiBvZiB0aGVzZSBmb3VyIGRlZmluaW5nCmZlYXR1cmVzIG9mIHRoZSBzb2NpYWwgbmV0d29yayBwZXJzcGVjdGl2ZS4KCiMjIyBUaGUgXCNjb21tb25jb3JlIFByb2plY3QKCiFbXShpbWcvY29tbW9uY29yZS5qcGVnKXt3aWR0aD0iNTAlIn0KClN1cG92aXR6LCBKLiwgRGFseSwgQS5KLiwgZGVsIEZyZXNubywgTS4sICYgS29sb3VjaCwgQy4KKDIwMTcpLsKgKlwjY29tbW9uY29yZSBQcm9qZWN0LiogUmV0cmlldmVkIGZyb20KW2h0dHA6Ly93d3cuaGFzaHRhZ2NvbW1vbmNvcmUuY29tXShodHRwOi8vd3d3Lmhhc2h0YWdjb21tb25jb3JlLmNvbS8pLgoKIyMjIyBQcm9sb2d1ZQoKQXMgbm90ZWQgYnkgQHN1cG92aXR6MjAxN2NvbW1vbmNvcmUsIHRoZSBDb21tb24gQ29yZSBTdGF0ZSBTdGFuZGFyZHMKaGF2ZSBiZWVuIGEgInBlcnNpc3RlbnQgZmxhc2hwb2ludCBpbiB0aGUgZGViYXRlIG92ZXIgdGhlIGRpcmVjdGlvbiBvZgpBbWVyaWNhbiBlZHVjYXRpb24uIiBUaGUgXCNjb21tb25jb3JlIFByb2plY3QgZXhwbG9yZXMgdGhlIENvbW1vbiBDb3JlCmRlYmF0ZSBvbiBUd2l0dGVyIHVzaW5nIGEgY29tYmluYXRpb24gb2Ygc29jaWFsIG5ldHdvcmsgYW5hbHlzZXMgYW5kCnBzeWNob2xvZ2ljYWwgaW52ZXN0aWdhdGlvbnMgd2hpY2ggaGVscCB0byByZXZlYWwgYm90aCB0aGUgdW5kZXJseWluZwpzb2NpYWwgc3RydWN0dXJlIG9mIHRoZSBjb252ZXJzYXRpb24gYW5kIHRoZSBtb3RpdmF0aW9ucyBvZiB0aGUKcGFydGljaXBhbnRzLgoKVGhlIGNlbnRyYWwgcXVlc3Rpb24gZ3VpZGluZyB0aGlzIGludmVzdGlnYXRpb24gd2FzOgoKPiBIb3cgYXJlIHNvY2lhbCBtZWRpYS1lbmFibGVkIHNvY2lhbCBuZXR3b3JrcyBjaGFuZ2luZyB0aGUgZGlzY291cnNlIGluCj4gQW1lcmljYW4gcG9saXRpY3MgdGhhdCBwcm9kdWNlcyBhbmQgc3VzdGFpbnMgZWR1Y2F0aW9uIHBvbGljeT8KCiMjIyMgRGF0YSBTb3VyY2VzICYgQW5hbHlzZXMKClRoZSBbbWV0aG9kcwpwYWdlXShodHRwczovL3d3dy5oYXNodGFnY29tbW9uY29yZS5jb20vcHJvamVjdC9tZXRob2RvbG9neSkgb2YgdGhlClwjQ09NTU9OQ09SRSBQcm9qZWN0IHByb3ZpZGVzIGEgZGV0YWlsZWQgZGlzY3Vzc2lvbiBvZiB0aGUgZGF0YSBhbmQKYW5hbHlzZXMgdXNlZCB0byBhcnJpdmUgYXQgdGhlIGNvbmNsdXNpb25zIGluICpcI2NvbW1vbmNvcmU6IEhvdyBzb2NpYWwKbWVkaWEgaXMgY2hhbmdpbmcgdGhlIHBvbGl0aWNzIG9mIGVkdWNhdGlvbiouIFByb3ZpZGVkIGJlbG93IGlzIGEKc3VtbWFyeSBvZiBob3cgYXV0aG9ycyByZXRyaWV2ZWQgZGF0YSBmcm9tIFR3aXR0ZXIgYW5kIHRoZSBhbmFseXNlcwphcHBsaWVkIGZvciBlYWNoIG9mIHRoZSBmaXZlIGFjdHMgaW4gdGhlIHdlYnNpdGUuIEkgaGlnaGx5IGVuY291cmFnZSB5b3UKdG8gdGFrZSBhIGxvb2sgYXQgdGhpcyBzZWN0aW9uIGlmIHlvdSdkIGxpa2UgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGVpcgphcHByb2FjaCBhbmQgaW4gcGFydGljdWxhciBpZiB5b3UncmUgdW5mYW1pbGlhciB3aXRoIGhvdyB1c2VycyBjYW4KaW50ZXJhY3QgYW5kIGNvbW11bmljYXRlIG9uIFR3aXR0ZXIuCgojIyMjIERhdGEgQ29sbGVjdGlvbgoKVG8gY29sbGVjdCBkYXRhIG9uIGtleXdvcmRzIHJlbGF0ZWQgdG8gdGhlIENvbW1vbiBDb3JlLCB0aGUgcHJvamVjdCB1c2VkCmEgY3VzdG9taXplZCBkYXRhIGNvbGxlY3Rpb24gdG9vbCBkZXZlbG9wZWQgYnkgdHdvIG9mIG91ciBjby1hdXRob3JzLApNaWd1ZWwgZGVsIEZyZXNubyBhbmQgQWxhbiBKLiBEYWx5LCBjYWxsZWTCoCpTb2NpYWwgUnVubmVyCkxhYl5UTV4qLsKgU2ltaWxhciB0byBhbiBhcHByb2FjaCB3ZSB1c2VkIGluIFVuaXQgMywgdGhlIGF1dGhvcnMKZG93bmxvYWRlZCBkYXRhIGluIHJlYWwgdGltZSBkaXJlY3RseSBmcm9tIFR3aXR0ZXIncyBBcHBsaWNhdGlvbgpQcm9ncmFtbWluZyBJbnRlcmZhY2UgKEFQSSkgYmFzZWQgb24gdHdlZXRzIHVzaW5nIHNwZWNpZmllZCBrZXl3b3JkcywKa2V5cGhyYXNlcywgb3IgaGFzaHRhZ3MgYW5kIHRoZW4gcmVzdHJpY3RlZCB0aGVpciBhbmFseXNpcyB0byB0aGUKZm9sbG93aW5nIHRlcm1zOiAqY29tbW9uY29yZSosICpjY3NzKiBhbmQgKnN0b3Bjb21tb25jb3JlLiogVGhleSBhbHNvCmNhcHR1cmVkIFR3aXR0ZXIgcHJvZmlsZSBuYW1lcywgb3IgdXNlciBuYW1lcywgYXMgd2VsbCBhcyB0aGUgdHdlZXRzLApyZXR3ZWV0cywgYW5kIG1lbnRpb25zIHBvc3RlZC4gRGF0YSBpbmNsdWRlZCBtZXNzYWdlcyB0aGF0IGFyZSBwdWJsaWMgb24KdHdpdHRlciwgYnV0IG5vdCBwcml2YXRlIGRpcmVjdCBtZXNzYWdlcyBiZXR3ZWVuIGluZGl2aWR1YWxzLCBub3IgZnJvbQphY2NvdW50cyB3aGljaCB1c2VycyBoYXZlIG1hZGUgcHJpdmF0ZS4KCiMjIyMgQW5hbHlzZXMKCkluIG9yZGVyIHRvIGFkZHJlc3MgdGhlaXIgcmVzZWFyY2ggcXVlc3Rpb24sIHRoZSBhdXRob3JzIGFwcGxpZWQgc29jaWFsCm5ldHdvcmsgYW5hbHlzaXMgdGVjaG5pcXVlcyBpbiBhZGRpdGlvbiB0byBxdWFsaXRhdGl2ZSBhbmQgYXV0b21hdGVkCnRleHQgbWluaW5nIGFwcHJvYWNoZXMuIEZvciBzb2NpYWwgbmV0d29yayBhbmFseXNlcywgZWFjaCBub2RlIGlzIGFuCmluZGl2aWR1YWwgVHdpdHRlciB1c2VyIChwZXJzb24sIGdyb3VwLCBpbnN0aXR1dGlvbiwgZXRjLikgYW5kIHRoZQpjb25uZWN0aW9uIGJldHdlZW4gZWFjaCBub2RlIGlzIHRoZSB0d2VldCwgcmV0d2VldCwgb3IgbWVudGlvbi9yZXBseS4KQWZ0ZXIgcmV0cmlldmluZyBkYXRhIGZyb20gdGhlIFR3aXR0ZXIgQVBJLCB0aGUgYXV0aG9ycyBjcmVhdGVkIGEgZmlsZQp0aGF0IGNvdWxkIGJlIGFuYWx5emVkIGluIEdlcGhpLCBhbiBvcGVuLXNvdXJjZSBzb2Z0d2FyZSBwcm9ncmFtIHdoaWNoCmRlcGljdHMgdGhlIHJlbGF0aW9ucyBhcyBuZXR3b3JrcyBhbmQgcHJvdmlkZXMgbWV0cmljcyBmb3IgZGVzY3JpYmluZwpmZWF0dXJlcyBvZiB0aGUgbmV0d29yay4KCkluIGFkZGl0aW9uIHRvIGRhdGEgdmlzdWFsaXphdGlvbiBhbmQgbmV0d29yayBkZXNjcmlwdGl2ZXMsIHRoZSBhdXRob3JzCmV4YW1pbmVkIGdyb3VwIGRldmVsb3BtZW50IGFuZCBsZXhpY2FsIHRlbmRlbmNpZXMgYW1vbmcgdXNlcnMuIEZvciBncm91cApkZXZlbG9wbWVudCwgdGhleSB1c2VkIGEgY29tbXVuaXR5IGRldGVjdGlvbiBhbGdvcml0aG0gdG8gaWRlbnRpZnkgYW5kCnJlcHJlc2VudCBzdHJ1Y3R1cmFsIHN1Yi1jb21tdW5pdGllcywgb3IgImZhY3Rpb25zIiwgd2hpY2ggdGhleSBkZXNjcmliZQphcyBhIGdyb3VwIHdpdGggbW9yZSB0aWVzIHdpdGhpbiB0aGFuIGFjcm9zcyBncm91cCBldmVuIHRob3NlIGdyb3VwCmJvdW5kYXJpZXMgYXJlIHNvbWV3aGF0IHBvcm91cykuIEZvciBsZXhpY2FsIHRlbmRlbmNpZXMsIHRoZSBhdXRob3JzCnVzZWQgdGhlIExpbmd1aXN0aWMgSW5xdWlyeSBhbmQgV29yZCBDb3VudCAoTElXQykgbGV4aWNvbnMgdG8gZGV0ZXJtaW5lCnBzeWNob2xvZ2ljYWwgZHJpdmUsIGRpYWdub3NlIHRoZWlyIGxldmVsIG9mIGNvbnZpY3Rpb24sIG1ha2UgaW5mZXJlbmNlcwphYm91dCB0aGlua2luZyBzdHlsZXMsIGFuZCBldmVuIGRldGVybWluZSBzZW50aW1lbnQgc2ltaWxhciB0byB3aGF0IHdlCmV4YW1pbmVkIGluIFVuaXQgMi4KCkZvciBhIG5pY2Ugc3VtbWFyeSBvZiB0aGUgZGF0YSB1c2VkIGZvciB0aGUgYW5hbHlzaXMsIGFzIHdlbGwgYXMgdGhlCnNhbXBsZXMgb2YgYWN0b3JzIGFuZCB0d2VldHMsIHRoZSBrZXl3b3JkcywgYW5kIHRoZSBtZXRob2RzIHRoYXQgd2VyZQp1dGlsaXplZCwgc2VlIFtUYWJsZSAxLiBEYXRhIGFuZCBNZXRob2QgZm9yIEVhY2gKQWN0XShodHRwczovL3d3dy5oYXNodGFnY29tbW9uY29yZS5jb20vcHJvamVjdC9tZXRob2RvbG9neSkgaW4gdGhlCk1ldGhvZHMgc2VjdGlvbiBvZiB0aGUgXCNjb21tb25jb3JlIHdlYnNpdGUuCgojIyMjIEtleSBGaW5kaW5ncwoKSW4gdGhlIFwjY29tbW9uY29yZSBQcm9qZWN0LCBhbmFseXNlcyBvZiBhbG1vc3QgMSBtaWxsaW9uIHR3ZWV0cyBzZW50IGJ5CmFib3V0IDE5MCwwMDAgZGlzdGluY3QgYWN0b3JzIG92ZXIgYSBwZXJpb2Qgb2YgMzIgbW9udGhzIHJldmVhbGVkIHRoZQpmb2xsb3dpbmc6CgotICAgSW4gKipBY3QgMSoqLCAqKlRoZSBHaWFudCBOZXR3b3JrKiosIHRoZSBhdXRob3JzIGlkZW50aWZpZWQgZml2ZQogICAgbWFqb3Igc3ViLWNvbW11bml0aWVzLCBvciBmYWN0aW9ucywgaW4gdGhlIFR3aXR0ZXIgZGViYXRlCiAgICBzdXJyb3VuZGluZyB0aGUgQ29tbW9uIENvcmUsIGluY2x1ZGluZzogKDEpIHN1cHBvcnRlcnMgb2YgdGhlIENvbW1vbgogICAgQ29yZSwgKDIpIG9wcG9uZW50cyBvZiB0aGUgc3RhbmRhcmRzIGZyb20gaW5zaWRlIGVkdWNhdGlvbiwgYW5kICgzKQogICAgb3Bwb25lbnRzIGZyb20gb3V0c2lkZSBvZiBlZHVjYXRpb24uCi0gICBJbiAqKkFjdCAyKiosICoqQ2VudHJhbCBBY3RvcnMqKiwgdGhleSBub3RlZCB0aGF0IG1vc3Qgb2YgdGhlc2UKICAgIHBhcnRpY2lwYW50cyB3ZXJlIGNhc3VhbCBjb250cmlidXRvcnMgLS0gYWxtb3N0IDk1JSBvZiB0aGVtIG1hZGUKICAgIGZld2VyIHRoYW4gMTAgdHdlZXRzIGluIGFueSBnaXZlbiBzaXgtbW9udGggcGVyaW9kLiBUaGV5IGFsc28KICAgIGRpc3Rpbmd1aXNoZWQgYmV0d2VlbiB0d28gdHlwZXMgb2YgaW5mbHVlbmNlIG9uCiAgICBUd2l0dGVyOsKgKlRyYW5zbWl0dGVycyrCoHdobyB0d2VldGVkIGEgbG90LCByZWdhcmRsZXNzIG9mIHRoZSBleHRlbnQKICAgIG9mIHRoZWlyIGZvbGxvd2Vyc2hpcDsgYW5kwqAqVHJhbnNjZWl2ZXJzKiwgdGhvc2Ugd2hvIGdhaW5lZCB0aGVpcgogICAgaW5mbHVlbmNlIGJ5IGJlaW5nIGZyZXF1ZW50bHkgcmV0d2VldGVkIGFuZCBtZW50aW9uZWQuCi0gICBJbiAqKkFjdCAzKiosICoqS2V5IEV2ZW50cywqKsKgdGhlIGF1dGhvcnMgaWRlbnRpZmllZCBpc3N1ZXMgZHJpdmluZwogICAgdGhlIG1ham9yIHNwaWtlcyBpbiB0aGUgY29udmVyc2F0aW9uLCBsaWtlIHdoZW4gU2VjcmV0YXJ5IG9mCiAgICBFZHVjYXRpb24gRHVuY2FuIHNwb2tlIGFib3V0IHdoaXRlIHN1YnVyYmFuIG1vbXMnIG9wcG9zaXRpb24gdG8gdGhlCiAgICBDb21tb24gQ29yZSwgb3IgdGhlIGRlYmF0ZSBvdmVyIHRoZSBhdXRob3JpemF0aW9uIG9mIHRoZSBFdmVyeQogICAgU3R1ZGVudCBTdWNjZWVkcyBBY3QgaW4gTm92ZW1iZXIgMjAxNS4gVGhleSBhbHNvIG9mZmVuZGVkIGV2aWRlbmNlCiAgICBvZiBtYW51ZmFjdHVyZWQgY29udHJvdmVyc2llcyBzcHVycmVkIGJ5IHNlbnNhdGlvbmFsaXppbmcgbWlub3IKICAgIGlzc3VlcyBhbmQgb3V0cmlnaHQgZmFrZSBuZXdzIHN0b3JpZXMuCi0gICBJbiAqKkFjdCA0KiosICoqTGV4aWNhbCBUZW5kZW5jaWVzKiosIHRoZSBhdXRob3JzIGV4YW1pbmVkIHRoZQogICAgbGluZ3Vpc3RpYyB0ZW5kZW5jaWVzIG9mIHRoZSB0aHJlZSBtYWpvciBmYWN0aW9ucyBhbmQgZm91bmQgdGhhdAogICAgQ29tbW9uIENvcmUgc3VwcG9ydGVycyB1c2VkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb252aWN0aW9uIHdvcmRzLAogICAgdGVuZGVkIHRvIHVzZSBtb3JlIGFjaGlldmVtZW50LW9yaWVudGVkIGxhbmd1YWdlLCBhbmQgdXNlZCBtb3JlCiAgICB3b3JkcyBhc3NvY2lhdGVkIHdpdGggYSBmb3JtYWwgYW5kIGFuYWx5dGljIHRoaW5raW5nIHN0eWxlLiBCeQogICAgY29udHJhc3QsIG9wcG9uZW50cyBvZiB0aGUgQ29tbW9uIENvcmUgZnJvbSB3aXRoaW4gZWR1Y2F0aW9uIHRlbmRlZAogICAgdG8gdXNlIG1vcmUgd29yZHMgYXNzb2NpYXRlZCB3aXRoIHNhZG5lc3MsIGFuZCB1c2VkIG1vcmUgbmFycmF0aXZlCiAgICB0aGlua2luZyBzdHlsZSBsYW5ndWFnZS4gT3Bwb25lbnRzIG9mIHRoZSBDb21tb24gQ29yZSBmcm9tIG91dHNpZGUKICAgIG9mIGVkdWNhdGlvbiBtYWRlIHRoZSBoaWdoZXN0IHVzZSBvZiB3b3JkcyBhc3NvY2lhdGVkIHdpdGggcGVlcgogICAgYWZmaWxpYXRpb24sIHVzZWQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGFuZ3J5IHdvcmRzLCBhbmQgZXhoaWJpdGVkCiAgICB0aGUgbG93ZXN0IGxldmVsIG9mIGNvbnZpY3Rpb24gaW4gdGhlaXIgd29yZCBjaG9pY2VzLgotICAgSW4gKipBY3QgNSoqLCAqKlRoZSBUd2VldCBNYWNoaW5lKiosIGV4YW1pbmVkIGZpdmUgZnJhbWVzIHRoYXQKICAgIG9wcG9uZW50cyBvZiB0aGUgQ29tbW9uIENvcmUgdXNlZCB0byBhcHBlYWwgdG8gdmFsdWVzIG9mIHBhcnRpY3VsYXIKICAgIHN1Ymdyb3VwcyBpbmNsdWRpbmcgdGhlIGdvdmVybm1lbnQgZnJhbWUsIGJ1c2luZXNzIGZyYW1lLCB3YXIgZnJhbWUsCiAgICBleHBlcmltZW50IGZyYW1lLCBhbmQgcHJvcGFnYW5kYSBmcmFtZS4gQnkgY29tYmluaW5nIHRoZXNlCiAgICBjb25zdGl0dWVuY2llcywgdGhlIGF1dGhvcnMgaWxsdXN0cmF0ZWQgaG93IHRoZSBDb21tb24gQ29yZQogICAgZGV2ZWxvcGVkIGEgc3Ryb25nIHRyYW5zcGFydGlzYW4gY29hbGl0aW9uIG9mIG9wcG9zaXRpb24uCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKCkZvciBvdXIgVW5pdCA0IFdhbGt0aHJvdWdoLCB3ZSdsbCBhcHBseSBzb21lIG9mIHRoZSBzYW1lIHRlY2huaXF1ZXMgdXNlZApieSB0aGlzIHN0dWR5IGluY2x1ZGluZyBjYWxjdWxhdGluZyBzb21lIGJhc2ljIG5ldHdvcmsgbWVhc3VyZXMgb2YKY2VudHJhbGl0eS4gRm9yIGV4YW1wbGUsIHRha2UgYSBsb29rIGF0IHRoZSBbKkV4cGxvcmUgdGhlCk5ldHdvcmtzKl0oaHR0cHM6Ly93d3cuaGFzaHRhZ2NvbW1vbmNvcmUuY29tLyMyLTEpe3N0eWxlPSJmb250LXNpemU6IDEwcHQ7In0Kc2VjdGlvbiBmcm9tIEFjdCAyOiBDZW50cmFsIEFjdG9ycyBhbmQgdGhlIFRyYW5zbWl0dGVycywgVHJhbnNjZWl2ZXJzCmFuZCBUcmFuc2NlbmRlcnMuCgpDbGljayBvbiBlYWNoIG9mIHRoZSBib3hlcyBmb3IgYSBzZWxlY3QgdGltZSBwZXJpb2QgYW5kIGluIHRoZSBzcGFjZQpiZWxvdyBsaXN0IGEgY291cGxlIFR3aXR0ZXIgdXNlcnMgaWRlbnRpZmllZCBieSB0aGVpciBhbmFseXNpcyBhcyB0aGUKZm9sbG93aW5nOgoKLSAgICoqVHJhbnNtaXR0ZXJzOioqCgotICAgKipUcmFuc2NlaXZlcnM6KioKCi0gICAqKlRyYW5zY2VuZGVyczoqKgoKTm93IHZpc2l0IEFjdCAyIG9mIHRoZSBtZXRob2RzIHNlY3Rpb24gYW5kIEluIHRoZSBzcGFjZSBiZWxvdywgaWRlbnRpZnkKdGhlIG5ldHdvcmsgbWVhc3VyZSB1c2VkIGZvciB0aGUgZmlyc3QgdHdvIGNlbnRyYWwgYWN0b3JzIChoaW50OiBpdCdzCml0YWxpY2l6ZWQpIGFuZCBjb3B5IHRoZWlyIGRlZmluaXRpb24gdXNlZC4gTm90ZSwgVHJhbnNjZW5kZXJzIGhhcyBiZWVuCmNvbXBsZXRlZCBmb3IgeW91LgoKLSAgICoqKlRyYW5zbWl0dGVycyoqKgoKLSAgICoqKlRyYW5zY2VpdmVycyoqKgoKLSAgICoqKlRyYW5zY2VuZGVycyoqKiBpcyBtZWFzdXJlZCBieSAqZGVncmVlKiBhbmQgY29uc2lzdHMgb2YgYWN0b3JzCiAgICAoaS5lLiBUd2l0dGVyIHVlcnMpIHdobyBoYXZlIGJvdGggaGlnaCBvdXQtZGVncmVlLCBhcyB3ZWxsIGFzCiAgICBoYXZpbmfCoGhpZ2ggaW4tZGVncmVlLgoKIyMgMWIuIElkZW50aWZ5IGEgUXVlc3Rpb24ocykKClJlY2FsbCBmcm9tIGFib3ZlIHRoYXQgdGhlIGNlbnRyYWwgcXVlc3Rpb24gZ3VpZGluZyB0aGUgXCNDT01NT05DT1JFClByb2plY3Qgd2FzOgoKPiBIb3cgYXJlIHNvY2lhbCBtZWRpYS1lbmFibGVkIHNvY2lhbCBuZXR3b3JrcyBjaGFuZ2luZyB0aGUgZGlzY291cnNlIGluCj4gQW1lcmljYW4gcG9saXRpY3MgdGhhdCBwcm9kdWNlcyBhbmQgc3VzdGFpbnMgZWR1Y2F0aW9uIHBvbGljeT8KCkZvciBVbml0IDQsIHdlIGFyZSBnb2luZyB0byBmb2N1cyBvdXIgcXVlc3Rpb25zIG9uIHNvbWV0aGluZyBhIGJpdCBsZXNzCmFtYml0aW91cyBidXQgaW5zcGlyZWQgYnkgdGhpcyB3b3JrOgoKMS4gIFdobyBhcmUgdGhlIHRyYW5zbWl0dGVycywgdHJhbnNjZWl2ZXJzLCBhbmQgdHJhbnNjZW5kZXJzIGluIG91cgogICAgQ29tbW9uIENvcmUgVHdpdHRlciBuZXR3b3JrPwoyLiAgV2hhdCBzdWJncm91cHMsIG9yIGZhY3Rpb25zLCBleGlzdCBpbiBvdXIgbmV0d29yaz8KMy4gIFdoaWNoIGFjdG9ycyBpbiBvdXIgbmV0d29yayB0ZW5kIHRvIGJlIG1vcmUgb3Bwb3NlZCB0byB0aGUgQ29tbW9uCiAgICBDb3JlPwoKVG8gYWRkcmVzcyB0aGUgbGFzdCBxdWVzdGlvbiwgd2UnbGwgcmV2aXNpdCBvdXIgdGVjaG5pcXVlcyB3ZSBsZWFybmVkCmZyb20gb3VyIFVuaXQgMyBWQURFUiBzZW50aW1lbnQgYW5hbHlzaXMuCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKCkJhc2VkIG9uIHdoYXQgeW91IGtub3cgYWJvdXQgbmV0d29ya3MgYW5kIHRoZSBjb250ZXh0IHNvIGZhciwgd2hhdCBvdGhlcgpyZXNlYXJjaCBxdWVzdGlvbihzKSBtaWdodCBhc2sgd2UgYXNrIGluIHRoaXMgY29udGV4dCB0aGF0IGEgc29jaWFsCm5ldHdvcmsgcGVyc3BlY3RpdmUgbWlnaHQgYmUgYWJsZSB0byBhbnN3ZXI/CgpJbiB0aGUgc3BhY2UgYmVsb3csIHR5cGUgYSBicmllZiByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczoKCi0gICBZT1VSIFJFU1BPTlNFIEhFUkUKCiMjIDFjLiBTZXQgVXAgUHJvamVjdAoKQXMgaGlnaGxpZ2h0ZWQgaW7CoFtDaGFwdGVyIDYgb2YgRGF0YSBTY2llbmNlIGluIEVkdWNhdGlvbiBVc2luZwpSXShodHRwczovL2RhdGFzY2llbmNlaW5lZHVjYXRpb24uY29tL2MwNi5odG1sKcKgKERTSUVVUiksIG9uZSBvZiB0aGUKZmlyc3Qgc3RlcHMgb2YgZXZlcnkgd29ya2Zsb3cgc2hvdWxkIGJlIHRvIHNldCB1cCB5b3VyICJQcm9qZWN0IiB3aXRoaW4KUlN0dWRpby4gUmVjYWxsIHRoYXQ6Cgo+IEEgKipQcm9qZWN0KiogaXMgdGhlIGhvbWUgZm9yIGFsbCBvZiB0aGUgZmlsZXMsIGltYWdlcywgcmVwb3J0cywgYW5kCj4gY29kZSB0aGF0IGFyZSB1c2VkIGluIGFueSBnaXZlbiBwcm9qZWN0CgpTaW5jZSB3ZSBhcmUgd29ya2luZyBpbiBSU3R1ZGlvIENsb3VkLCBhIFByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBzZXQgdXAKZm9yIHlvdSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGAuUnByb2pgIGZpbGUgaW4geW91ciBtYWluIGRpcmVjdG9yeSBpbiB0aGUKRmlsZXMgcGFuZS4KCiMjIyBMb2FkIExpYnJhcmllcwoKSW4gVW5pdCAxLCB3ZSBhbHNvIGxlYXJuZWQgYWJvdXQgKipwYWNrYWdlcyoqLCBvciBsaWJyYXJpZXMsIHdoaWNoIGFyZQpzaGFyZWFibGUgY29sbGVjdGlvbnMgb2YgUiBjb2RlIHRoYXQgY2FuIGNvbnRhaW4gZnVuY3Rpb25zLCBkYXRhLCBhbmQvb3IKZG9jdW1lbnRhdGlvbiBhbmQgZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFIuIFlvdSBjYW4gYWx3YXlzIGNoZWNrIHRvCnNlZSB3aGljaCBwYWNrYWdlcyBoYXZlIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQgYW5kIGxvYWRlZCBpbnRvIFJTdHVkaW8KQ2xvdWQgYnkgbG9va2luZyBhdCB0aGUgdGhlIEZpbGVzLCBQbG90cywgJiBQYWNrYWdlcyBQYW5lIGluIHRoZSBsb3dlcgpyaWdodCBoYW5kIGNvcm5lci4KCiMjIyAqKvCfkYkgWW91ciBUdXJuKiogKiripLUqKgoKRmlyc3QsIGxvYWQgdGhlIHt0aWR5dmVyc2V9LCB7dGlkeXRleHR9IGFuZCB7dmFkZXJ9IHBhY2thZ2VzIGZyb20KcHJldmlvdXMgY2FzZSBzdHVkaWVzLiBXZSdsbCBiZSB1c2luZyBzZXZlcmFsIG9mIHRoZXNlIHBhY2thZ2VzIHRvCndyYW5nbGluZyBhbmQgZXhwbG9yZSBvdXIgZGF0YSBsYXRlciBzZWN0aW9uczoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh2YWRlcikKYGBgCgpOZXh0LCB3ZSB3aWxsIGludHJvZHVjZSBhIGZldyBuZXcgcGFja2FnZXMgdGhhdCB3aWxsIGhlbHAgdXMgd2l0aCBvdXIKc29jaWFsIG5ldHdvcmsgYW5hbHlzZXMuCgojIyMgdGlkeWdyYXBoIPCfk6YKCiFbXShpbWcvdGlkeWdyYXBoLnBuZyl7d2lkdGg9IjIwJSJ9CgpUaGUge1t0aWR5Z3JhcGhdKGh0dHBzOi8vdGlkeWdyYXBoLmRhdGEtaW1hZ2luaXN0LmNvbSl9IHBhY2thZ2UgaXMgYQpodWdlIHBhY2thZ2UgdGhhdCBleHBvcnRzIDI4MCBkaWZmZXJlbnQgZnVuY3Rpb25zIGFuZCBtZXRob2RzLCBpbmNsdWRpbmcKYWNjZXNzIHRvIGFsbW9zdCBhbGwgb2YgdGhlwqBgZHBseXJgwqB2ZXJicyBwbHVzIGEgZmV3IG1vcmUsIGRldmVsb3BlZCBmb3IKdXNlIHdpdGggcmVsYXRpb25hbCBkYXRhLiBXaGlsZSBuZXR3b3JrIGRhdGEgaXRzZWxmIGlzIG5vdCB0aWR5LCBpdCBjYW4KYmUgZW52aXNpb25lZCBhcyB0d28gdGlkeSB0YWJsZXMsIG9uZSBmb3Igbm9kZSBkYXRhIGFuZCBvbmUgZm9yIGVkZ2UKZGF0YS4gVGhlIHt0aWR5Z3JhcGh9IHBhY2thZ2UgcHJvdmlkZXMgYSB3YXkgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHR3bwp0YWJsZXMgYW5kIHVzZXMgYGRwbHlyYCB2ZXJicyB0byBtYW5pcHVsYXRlIHRoZW0uIEZ1cnRoZXJtb3JlIGl0CnByb3ZpZGVzIGFjY2VzcyB0byBhIGxvdCBvZiBncmFwaCBhbGdvcml0aG1zIHdpdGggcmV0dXJuIHZhbHVlcyB0aGF0CmZhY2lsaXRhdGUgdGhlaXIgdXNlIGluIGEgdGlkeSB3b3JrZmxvdy4KCkxldCdzIGdvIGFoZWFkIGFuZCBsb2FkIHRoZSB7dGlkeWdyYXBofSBsaWJyYXJ5OgoKYGBge3J9CmxpYnJhcnkodGlkeWdyYXBoKQpgYGAKCiMjIyBnZ3JhcGgg8J+TpgoKIVtdKGltZy9nZ3JhcGgucG5nKXt3aWR0aD0iMjAlIn0KCkNyZWF0ZWQgYnkgdGhlIHNhbWUgZGV2ZWxvcGVyIGFzIHt0aWR5Z3JhcGh9LAp7W2dncmFwaF0oaHR0cHM6Ly9nZ3JhcGguZGF0YS1pbWFnaW5pc3QuY29tL2luZGV4Lmh0bWwpfSAtLSBwcm9ub3VuY2VkCmdnLXJhcGggb3IgZy1naXJhZmZlIGhlbmNlIHRoZSBsb2dvIC0tIGlzIGFuIGV4dGVuc2lvbiBvZgp7W2dncGxvdF0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcpfSBhaW1lZCBhdCBzdXBwb3J0aW5nIHJlbGF0aW9uYWwKZGF0YSBzdHJ1Y3R1cmVzIHN1Y2ggYXMgbmV0d29ya3MsIGdyYXBocywgYW5kIHRyZWVzLiBCb3RoIHBhY2thZ2VzIGFyZQptb3JlIG1vZGVybiBhbmQgd2lkZWx5IGFkb3B0ZWQgYXBwcm9hY2hlcyBkYXRhIHZpc3VhbGl6YXRpb24gaW4gUi4KCldoaWxlIGdncmFwaCBidWlsZHMgdXBvbiB0aGUgZm91bmRhdGlvbiBvZiBnZ3Bsb3QgYW5kIGl0cyBBUEksIGl0IGNvbWVzCndpdGggaXRzIG93biBzZWxmLWNvbnRhaW5lZCBzZXQgb2YgZ2VvbXMsIGZhY2V0cywgZXRjLiwgYXMgd2VsbCBhcwphZGRpbmcgdGhlIGNvbmNlcHQgb2bCoCpsYXlvdXRzKsKgdG8gdGhlIFtncmFtbWFyIG9mCmdyYXBoaWNzXShodHRwczovL2dncGxvdDItYm9vay5vcmcvaW50cm9kdWN0aW9uLmh0bWw/cT1ncmFtbWFyI3doYXQtaXMtdGhlLWdyYW1tYXItb2YtZ3JhcGhpY3MpLAppLmUuIHRoZSAiZ2ciIGluIGdncGxvdCBhbmQgZ2dyYXBoLgoKTGV0J3MgZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHtnZ3JhcGh9IGxpYnJhcnk6CgpgYGB7cn0KbGlicmFyeShnZ3JhcGgpCmBgYAoKIyMjIGlncmFwaCBQYWNrYWdlICoq8J+TpioqCgohW10oaW1nL2lncmFwaC5wbmcpe3dpZHRoPSIyMCUifQoKQm90aCB7dGlkeWdyYXBofSBhbmQge2dncmFwaH0gZGVwZW5kIGhlYXZpbHkgW2lncmFwaCBuZXR3b3JrIGFuYWx5c2lzCnBhY2thZ2VdKGh0dHBzOi8vaWdyYXBoLm9yZykuIFRoZSBtYWluIGdvYWxzIG9mIHRoZSBpZ3JhcGggcGFja2FnZSBhbmQKdGhlIGNvbGxlY3Rpb24gb2YgbmV0d29yayBhbmFseXNpcyB0b29scyBpdCBjb250YWlucyBhcmUgdG8gcHJvdmlkZSBhCnNldCBvZiBkYXRhIHR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yOgoKMS4gIHBhaW4tZnJlZSBpbXBsZW1lbnRhdGlvbiBvZiBncmFwaCBhbGdvcml0aG1zLAoKMi4gIGZhc3QgaGFuZGxpbmcgb2YgbGFyZ2UgZ3JhcGhzLCB3aXRoIG1pbGxpb25zIG9mIHZlcnRpY2VzIChpLmUuLAogICAgYWN0b3JzIG9yIG5vZGVzKSBhbmQgZWRnZXMsCgozLiAgYWxsb3dpbmcgcmFwaWQgcHJvdG90eXBpbmcgdmlhIGhpZ2ggbGV2ZWwgbGFuZ3VhZ2VzIGxpa2UgUi4KClJ1biB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBsb2FkIHRoZSB7aWdyYXBofSBsaWJyYXJ5OgoKYGBge3J9CmxpYnJhcnkoaWdyYXBoKQpgYGAKCiMjIyBJbXBvcnQgRGF0YQoKRmluYWxseSwgd2UnbGwgYmUgdXNpbmcgYSBmcmVzaCBkYXRhIGRvd25sb2FkIGZyb20gdHdpdHRlciB0aGF0IG9ubHkKaW5jbHVkZXMgcmVsYXRpdmVseSBzbWFsbCBzZXQgb2YgdHdlZXRzIGZyb20gdGhlIHBhc3Qgd2VlayB0byBoZWxwIGtlZXAKdGhpbmdzIHNpbXBsZS4gTmV0d29yayBncmFwaHMgY2FuIHF1aWNrbHkgZ2V0IHVud2llbGR5IGFzIHRoZSBub2RlcyBpbgp5b3VyIG5ldHdvcmsgZ3Jvdy4gVGhlIFwjY29tbW9uY29yZSBwcm9qZWN0IGRvZXMgYW4gZXhjZWxsZW50IGpvYgp2aXN1YWxpemluZyBsYXJnZSBuZXR3b3JrcyB1c2luZyBhZHZhbmNlZCB0ZWNobmlxdWVzLiBXZSdsbCBmb2N1cyBvbiBhCnJlbGF0aXZlbHkgc21hbGwgbmV0d29yayBzaW5jZSB3ZSdsbCBiZSBpbnRyb2R1Y2Ugc29tZSB2ZXJ5IGJhc2ljCnRlY2huaXF1ZXMgZm9yIHZpc3VhbGl6YXRpb24uCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKClVzZSB0aGUgYHJlYWRfY3N2KClgIGZ1bmN0aW9uIGZyb20gdGhlIHtyZWFkcn0gcGFja2FnZSB0byByZWFkIHRoZQpgY2Nzcy10d2VldHMtZnJlc2guY3N2YCBmaWxlIGZyb20gdGhlIGRhdGEgZm9sZGVyIGFuZCBhc3NpZ24gdG8gYSBuZXcKZGF0YSBmcmFtZSBuYW1lZCBgY2Nzc190d2VldHNgOgoKYGBge3J9CmNjc3NfdHdlZXRzIDwtIHJlYWRfY3N2KCJkYXRhL2Njc3MtdHdlZXRzLWZyZXNoLmNzdiIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIDIuIFdSQU5HTEUKCkluIGdlbmVyYWwsIGRhdGEgd3JhbmdsaW5nIGludm9sdmVzIHNvbWUgY29tYmluYXRpb24gb2YgY2xlYW5pbmcsCnJlc2hhcGluZywgdHJhbnNmb3JtaW5nLCBhbmQgbWVyZ2luZyBkYXRhIFtAd2lja2hhbTIwMTZyXS4gQXMKaGlnaGxpZ2h0ZWQgaW4gQGVzdHJlbGxhZG8yMDIwZSwgd3JhbmdsaW5nIG5ldHdvcmsgZGF0YSBjYW4gYmUgZXZlbiBtb3JlCmNoYWxsZW5naW5nIHRoYW4gb3RoZXIgZGF0YSBzb3VyY2VzIHNpbmNlIG5ldHdvcmsgZGF0YSBvZnRlbiBpbmNsdWRlcwp2YXJpYWJsZXMgYWJvdXQgYm90aCBpbmRpdmlkdWFscyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcy4KCkZvciBvdXIgZGF0YSB3cmFuZ2xpbmcgdGhpcyB3ZWVrLCB3ZSdyZSBrZWVwaW5nIGl0IHNpbXBsZSBzaW5jZSB3b3JraW5nCndpdGggcmVsYXRpb25hbCBkYXRhIGlzIGEgYml0IG9mIGEgZGVwYXJ0dXJlIGZyb20gb3VyIHdvcmtpbmcgd2l0aApyZWN0YW5ndWxhciBkYXRhIGZyYW1lcy4gT3VyIHByaW1hcnkgZ29hbHMgZm9yIFVuaXQgMSBhcmUgbGVhcm5pbmcgaG93CnRvOgoKYS4gICoqQ3JlYXRlIGFuIEVkZ2VsaXN0KiouIEluIHRoaXMgc2VjdGlvbiwgd2UgaW50cm9kdWNlIGEgbmV3IHRpZHkKICAgIGRhdGEgZm9ybWF0IGNhbGwgdGhlICJlZGdlbGlzdCIgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICAgIGVhY2ggZWRnZSAoaS5lLiBjb25uZWN0aW9ucyBvciB0aWVzIGJldHdlZW4gYWN0b3JzKSBpbiBvdXIgbmV0d29yay4KCmIuICAqKkZvcm1hdCBOZXR3b3JrIERhdGEqKi4gV2UgbGVhcm4gdG8gc2hhcGUgb3VyIGRhdGEgZmlsZXMgaW50byB0d28KICAgIGNvbW1vbiBmb3JtYXRzIGZvciBzdG9yaW5nIG5ldHdvcmsgZGF0YTogZWRnZWxpc3RzIGFuZCBub2RlbGlzdHMuCgpjLiAgKipDcmVhdGUgYSBOZXR3b3JrIE9iamVjdCoqLiBGaW5hbGx5LCB3ZSdsbCBuZWVkIHRvIGNvbnZlcnQgb3VyIGRhdGEKICAgIGZyYW1lcyBpbnRvIHNwZWNpYWwgZGF0YSBmb3JtYXQsIGFuIFIgbmV0d29yayBvYmplY3QsIGZvciB3b3JraW5nCiAgICB3aXRoIHJlbGF0aW9uYWwgZGF0YS4KCiMjIDJiLiBGb3JtYXQgTmV0d29yayBEYXRhCgpSZWNhbGwgZnJvbSBDaGFwdGVyIDEgb2YgQGNhcm9sYW4yMDE0IHRoYXQgdGllcywgb3IgcmVsYXRpb25zLCBhcmUgd2hhdApjb25uZWN0IGFjdG9ycyB0byBvbmUgYW5vdGhlci4gVGhlc2UgdGllcyBhcmUgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMKImVkZ2VzIiB3aGVuIGZvcm1hdHRpbmcgYW5kIGdyYXBoaW5nIG5ldHdvcmsgZGF0YSBhbmQgdGhlIHJhbmdlIG9mIHRpZXMKaW4gYSBuZXR3b3JrIGNhbiBiZSBleHRlbnNpdmUuIFNvbWUgb2YgdGhlIG1vcmUgY29tbW9uIHRpZXMsIG9yIGVkZ2VzLAp1c2VkIHRvIGRlbm90ZSBjb25uZWN0aW9ucyBhbW9uZyBhY3RvcnMgaW4gZWR1Y2F0aW9uYWwgcmVzZWFyY2ggaW5jbHVkZToKCi0gICBCZWhhdmlvcmFsIGludGVyYWN0aW9uIChlLmcuLCB0YWxraW5nIHRvIGVhY2ggb3RoZXIgb3Igc2VuZGluZwogICAgbWVzc2FnZXMpCgotICAgUGh5c2ljYWwgY29ubmVjdGlvbiAoZS5nLiwgc2l0dGluZyB0b2dldGhlciBhdCBsdW5jaCwgbGl2aW5nIGluIHRoZQogICAgc2FtZSBuZWlnaGJvcmhvb2QpCgotICAgQXNzb2NpYXRpb24gb3IgYWZmaWxpYXRpb24gKGUuZy4sIHRha2luZyB0aGUgc2FtZSBjb3Vyc2VzLCBiZWxvbmdpbmcKICAgIHRvIHRoZSBzYW1lIHBlZXIgZ3JvdXApCgotICAgRXZhbHVhdGlvbiBvZiBvbmUgcGVyc29uIGJ5IGFub3RoZXIgKGUuZy4sIGNvbnNpZGVyaW5nIHNvbWVvbmUgYQogICAgZnJpZW5kIG9yIGVuZW15KQoKLSAgIEZvcm1hbCByZWxhdGlvbnMgKGUuZy4sIGtub3dpbmcgd2hvIGhhcyBhdXRob3JpdHkgb3ZlciB3aG9tKQoKLSAgIE1vdmluZyBiZXR3ZWVuIHBsYWNlcyBvciBzdGF0dXMgKGUuZy4sIHNjaG9vbCBjaG9pY2UgcHJlZmVyZW5jZXMsCiAgICBkYXRpbmcgcGF0dGVybnMgYW1vbmcgYWRvbGVzY2VudHMpCgojIyMgQ3JlYXRlIEVkZ2VsaXN0CgpUaGUgKiplZGdlbGlzdCoqIGZvcm1hdCBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBvdGhlciBmb3JtYXRzIHlvdQpoYXZlIGxpa2VseSB3b3JrZWQgd2l0aCBpbiB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0IHR3byBjb2x1bW5zIG9mCmVhY2ggcm93IHJlcHJlc2VudCBhIGR5YWQsIG9yIHRpZSBiZXR3ZWVuIHR3byBub2RlcyBpbiBhIG5ldHdvcmsuIEFuCmVkZ2UtbGlzdCBjYW4gYWxzbyBjb250YWluIG90aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3RyZW5ndGgsCmR1cmF0aW9uLCBvciBmcmVxdWVuY3kgb2YgdGhlIHJlbGF0aW9uc2hpcCwgc29tZXRpbWUgY2FsbGVkIHdlaWdodCwgaW4KYWRkaXRpb24gdG8gb3RoZXIgImVkZ2UgYXR0cmlidXRlcy4iCgpGb3Igb3VyIGFuYWx5c2lzIG9mIHR3ZWV0cyBpbiB0aGlzIGNhc2Ugc3R1ZHksIHdlJ2xsIHVzZSBhbiBhcHByb2FjaApzaW1pbGFyIHRvIHRoYXQgdXNlZCBieSBAc3Vwb3ZpdHoyMDE3Y29tbW9uY29yZS4gU3BlY2lmaWNhbGx5LCBlYWNoIG5vZGUKaXMgYW4gaW5kaXZpZHVhbCBUd2l0dGVyIHVzZXIgKHBlcnNvbiwgZ3JvdXAsIGluc3RpdHV0aW9uLCBldGMuKSBhbmQgdGhlCmNvbm5lY3Rpb24gYmV0d2VlbiBlYWNoIG5vZGUgaXMgdGhlIHR3ZWV0LCByZXR3ZWV0LCBvciBtZW50aW9uL3JlcGx5LgoKIyMjICoq8J+RiSBZb3VyIFR1cm4qKiAqKuKktSoqCgpVc2UgdGhlIGNvZGUgY2h1bmsgYmVsb3cgdG8gbG9vayBhdCB0aGUgZGF0YSB3ZSBqdXN0IGltcG9ydGVkIHVzaW5nIG9uZQpvZiB5b3VyIGZhdm9yaXRlIG1ldGhvZHMgZm9yIGluc3BlY3RpbmcgZGF0YS4gSW4gdGhlIHNwYWNlIHRoYXQgZm9sbG93cywKaWRlbnRpZnkgdGhlIGNvbHVtbnMgeW91IHRoaW5rIGNvdWxkIGJlIHVzZWQgdG8gY29uc3RydWN0IGFuIGVkZ2UgbGlzdC4KCmBgYHtyLCBldmFsPUZBTFNFfQp2aWV3KGNjc3NfdHdlZXRzKQpgYGAKCi0gICBZT1VSIFJFU1BPTlNFIEhFUkUKCiMjIyMgRXh0cmFjdCBFZGdlcyBhbmQgTm9kZXMKCklmIG9uZSBvZiB0aGUgY29sdW1ucyB5b3UgaW5kaWNhdGVkIGluIHlvdXIgcmVzcG9uc2UgYWJvdmUgaW5jbHVkZWQKYHNjcmVlbl9uYW1lYCBuaWNlIHdvcmshIFlvdSBtYXkgYWxzbyBoYXZlIG5vdGljZWQgdGhhdCB0aGUKYG1lbnRpb25zX3NjcmVlbl9uYW1lYCBjb2x1bW4gaW5jbHVkZXMgdGhlIG5hbWVzIG9mIHRob3NlIGluIHRoZSByZXBseQpjb2x1bW4sIGFzIHdlbGwgYXMgdGhvc2UgIm1lbnRpb25lZCIgaW4gZWFjaCB0d2VldCwgaS5lLiB3aG9zZSB1c2VybmFtZQp3YXMgaW5jbHVkZWQgaW4gYSBwb3N0LgoKQXMgbm90ZWQgYWJvdmUsIGFuIGVkZ2VsaXN0IGluY2x1ZGVzIHRoZSBub2RlcyB0aGF0IG1ha2UgdXAgYSB0aWUgb3IKZHlhZC4gU2luY2UgdGhlIG9ubHkgdHdvIGNvbHVtbnMgd2UgbmVlZCB0byBjb25zdHJ1Y3Qgb3VyIGVkZ2VsaXN0IGlzCnRoZSBgc2NyZWVuX25hbWVgIG9mIHRoZSB0d2VldCBhdXRob3IgYW5kIHRoZSBzY3JlZW4gbmFtZXMgb2YgdGhvc2UKaW5jbHVkZWQgaW4gdGhlIG1lbnRpb25zLCBsZXQnczoKCjEuICBgcmVsb2NhdGUoKWAgYW5kIHJlbmFtZSB0aG9zZSBjb2x1bW5zIHRvIGBzZW5kZXJgIGFuZCBgdGFyZ2V0YCB0bwogICAgaW5kaWNhdGUgdGhlICJkaXJlY3Rpb24iIG9mIHRoZSB0d2VldDsKCjIuICBgc2VsZWN0KClgIHRob3NlIGNvbHVtbnMgYWxvbmcgd2l0aCBhbnkgYXR0cmlidXRlcyB0aGF0IHdlIHRoaW5rCiAgICBtaWdodCBiZSB1c2VmdWwgZm9yIGFuYWx5c2lzIGxhdGVyIG9uLCBsaWtlIHRoZSB0aW1lc3RhbXAgb3IgY29udGVudAogICAgb2YgdGhlIHR3ZWV0LCBpLmUuIGB0ZXh0YDsKCjMuICBhc3NpZ24gb3VyIG5ldyBkYXRhIGZyYW1lIHRvIGB0aWVzXzFgLgoKYGBge3J9CnRpZXNfMSA8LSAgY2Nzc190d2VldHMgJT4lCiAgcmVsb2NhdGUoc2VuZGVyID0gc2NyZWVuX25hbWUsICMgcmVuYW1lIHNjcmVlX25hbWUgdG8gc2VuZGVyCiAgICAgICAgICAgdGFyZ2V0ID0gbWVudGlvbnNfc2NyZWVuX25hbWUpICU+JSAjIHJlbmFtZSB0byByZWNlaXZlcgogIHNlbGVjdChzZW5kZXIsCiAgICAgICAgIHRhcmdldCwKICAgICAgICAgY3JlYXRlZF9hdCwKICAgICAgICAgdGV4dCkKCnRpZXNfMQpgYGAKCk91ciBlZGdlbGlzdCB3aXRoIGF0dHJpYnV0ZXMgaXMgYWxtb3N0IHJlYWR5LCBidXQgd2UgaGF2ZSBhIGNvdXBsZSBvZgppc3N1ZXMgd2Ugc3RpbGwgbmVlZCB0byBkZWFsIHdpdGguCgpBcyB5b3UgbWF5IGhhdmUgbm90aWNlZCwgb3VyIHJlY2VpdmVyIGNvbHVtbiBjb250YWlucyB0aGUgbmFtZXMgb2YKbXVsdGlwbGUgVHdpdHRlciB1c2VycywgYnV0IGEgZHlhZCBvciB0aWUgY2FuIG9ubHkgYmUgYmV0d2VlbiB0d28gYWN0b3JzCm9yIG5vZGVzLgoKIyMjIyAiVW5uZXN0IiBVc2VyIE5hbWVzCgpJbiBvcmRlciB0byBwbGFjZSBlYWNoIHRhcmdldCB1c2VyIGluIGEgc2VwYXJhdGUgcm93IHRoYXQgY29ycmVzcG9uZHMKd2l0aCBlYWNoIHNlbmRlciBvZiB0aGUgdHdlZXQsIHdlIHdpbGwgbmVlZCB0byAidW5uZXN0IiB0aGVzZSBuYW1lcwp1c2luZyB0aGUge3RpZHl0ZXh0fSBwYWNrYWdlIGZyb20gVW5pdCAzLgoKSW4gVW5pdCAzIHdlIHVzZWQgdGhlIGB1bm5lc3RfdG9rZW5zKClgIGZ1bmN0aW9uIHRvIGV4dHJhY3QgaW5kaXZpZHVhbAp3b3JkcyBmcm9tIHR3ZWV0cy4gVGhpcyB0aW1lIHdlJ2xsIHVzZSBpdCB0byBwbGFjZSB0YXJnZXQgb2YgZWFjaCB0d2VldAppbnRvIHNlcGFyYXRlIHJvd3MgY29ycmVzcG9uZGluZyB0byB0aGUgc2VuZGVyIG9mIGVhY2ggdHdlZXQuCgpSdW4gdGhlIGZvbGxvd2luZyBjb2RlIGFuZCB0YWtlIGEgbG9vayBhdCB0aGUgbmV3IGRhdGEgZnJhbWUgdG8gbWFrZQpzdXJlIGl0IGxvb2tzIGFzIGV4cGVjdCBhbmQgdG8gc3BvdCBhbnkgcG90ZW50aWFsIGlzc3VlczoKCmBgYHtyfQp0aWVzXzIgPC0gdGllc18xICU+JQogIHVubmVzdF90b2tlbnMoaW5wdXQgPSB0YXJnZXQsCiAgICAgICAgICAgICAgICBvdXRwdXQgPSByZWNlaXZlciwKICAgICAgICAgICAgICAgIHRvX2xvd2VyID0gRkFMU0UpICU+JQogIHJlbG9jYXRlKHNlbmRlciwgcmVjZWl2ZXIpCgp0aWVzXzIKYGBgCgpZb3UgcHJvYmFibHkgbm90aWNlIG9uZSBpc3N1ZSB0aGF0IHdlIGNvdWxkIGRlYWwgd2l0aCBpbiBhIGNvdXBsZQpkaWZmZXJlbnQgd2F5cy4gU3BlY2lmaWNhbGx5LCBtYW55IHR3ZWV0cyBhcmUgbm90IGRpcmVjdGVkIGF0IG90aGVyCnVzZXJzIGFuZCBoZW5jZSB0aGUgdmFsdWUgZm9yIHJlY2VpdmVyIGlzICpgTkFgKi4gV2UgY291bGQga2VlcCB0aGVzZQp1c2VycyBhcyAiaXNvbGF0ZXMiIGluIG91ciBuZXR3b3JrLCBidXQgbGV0J3Mgc2ltcGx5IHJlbW92ZSB0aGVtIHNpbmNlCm91ciBwcmltYXJ5IGdvYWwgaXMgdG8gaWRlbnRpZnkgdHJhbnNtaXR0ZXJzLCB0cmFuc2NlaXZlcnMgYW5kCnRyYW5zY2VuZGVycy4KCiMjIyAqKvCfkYkgWW91ciBUdXJuKiogKiripLUqKgoKSW4gdGhlIGNvZGUgY2h1bmsgYmVsb3csIHVzZSB0aGUgYGRyb3BfbmEoKWAgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSByb3dzCndpdGggbWlzc2luZyB2YWx1ZXMgZnJvbSBvdXIgYHJlY2VpdmVyYCBjb2x1bW4gaW4gb3VyIGB0aWVzLTJgIGRhdGEKZnJhbWUgc2luY2UgdGhleSBhcmUgaW5jb21wbGV0ZSBkeWFkcy4gU2F2ZSB5b3VyIGZpbmFsIGVkZ2VsaXN0IGFzCmB0aWVzYCB1c2luZyB0aGUgYDwtYCBhc3NpZ25tZW50IG9wZXJhdG9yLgoKYGBge3J9CnRpZXMgPC0gdGllc18yICU+JQogIGRyb3BfbmEocmVjZWl2ZXIpCmBgYAoKTm93IHVzZSB0aGUgY29kZSBjaHVuayBiZWxvdyB0byB0YWtlIGEgcXVpY2sgbG9vayBhdCBvdXIgZmluYWwgZWRnZWxpc3QKYW5kIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgZm9sbG93OgoKYGBge3IsIGV2YWw9RkFMU0V9CnRpZXMKYGBgCgoxLiAgSG93IG1hbnkgZWRnZXMgYXJlIGluIG91ciBDQ1NTIG5ldHdvcms/CgogICAgLSAgIFlPVVIgUkVTUE9OU0UgSEVSRQoKMi4gIFdoYXQgZG8gdGhlc2UgdGllcy9lZGdlcy9jb25uZWN0aW9ucyByZXByZXNlbnQ/CgogICAgLSAgIFlPVVIgUkVTUE9OU0UgSEVSRQoKMy4gIFdoZW4gZG8gdGhleSBzdGFydCBhbmQgZW5kPwoKICAgIC0gICBZT1VSIFJFU1BPTlNFIEhFUkUKCiMjIyBDcmVhdGUgTm9kZWxpc3QKClRoZSBzZWNvbmQgZmlsZSB3ZSBuZWVkIHRvIGNyZWF0ZSBpcyBhIGRhdGEgZnJhbWUgdGhhdCBjb250YWlucyBhbGwgdGhlCm5vZGVzLCBvZnRlbiByZWZlcnJlZCB0byBhcyBhY3RvcnMsIGluIG91ciBuZXR3b3JrLiBUaGlzIGxpc3Qgc29tZXRpbWVzCmluY2x1ZGVzIGF0dHJpYnV0ZXMgdGhhdCB3ZSBtaWdodCB3YW50IHRvIGV4YW1pbmUgYXMgcGFydCBvZiBvdXIKYW5hbHlzaXMgYXMgd2VsbCwgbGlrZSB0aGUgbnVtYmVyIG9mIFR3aXR0ZXIgZm9sbG93ZXJzLCBkZW1vZ3JhcGhpYwpncm91cCwgY291bnRyeSwgZ2VuZGVyLCBldGMuIFRoaXMgZmlsZSBvciBkYXRhIGZyYW1lIGlzIHNvbWV0aW1lcwpyZWZlcnJlZCB0byBhcyBhICoqbm9kZWxpc3QqKiBvciBub2RlIGF0dHJpYnV0ZSBmaWxlLgoKVG8gY29uc3RydWN0IG91ciBiYXNpYyBub2RlbGlzdCwgd2Ugd2lsbCB1c2UgdGhlIGBwaXZvdF9sb25nZXIoKWAKZnVuY3Rpb24gZnJvbSB0aGUge2RwbHlyfSBwYWNrYWdlLCBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhlIGBnYXRoZXIoKWAKZnVuY3Rpb24gaW50cm9kdWNlZCBpbiB0aGUgW1JTdHVkaW8gUmVzaGFwZSBEYXRhClByaW1lcl0oaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkL2xlYXJuL3ByaW1lcnMvNC4xKS4KClJ1biB0aGUgZm9sbG93aW5nIGNvZGUgdG8gc2VsZWN0IHRoZSB1c2VybmFtZXMgZm9ybSBvdXIgYHRpZXNgIGVkZ2VsaXN0LAptZXJnZSBvdXIgc2VuZGVyIGFuZCByZWNlaXZlciBjb2x1bW5zIGludG8gYSBzaW5nbGUgY29sdW1uLCBhbmQgdGFrZSBhCnF1aWNrIGxvb2sgYXQgb3VyIG5ldyBkYXRhIGZyYW1lLgoKYGBge3J9CmFjdG9yc18xIDwtIHRpZXMgJT4lCiAgc2VsZWN0KHNlbmRlciwgcmVjZWl2ZXIpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhzZW5kZXIscmVjZWl2ZXIpKQoKYWN0b3JzXzEKYGBgCgpBcyB5b3UgY2FuIHNlZSwgb3VyIHNlbmRlciBhbmQgcmVjZWl2ZXIgdXNlcm5hbWVzIGhhdmUgYmVlbiBjb21iaW5lZAppbnRvIGEgc2luZ2xlIGNvbHVtbiBjYWxsZWQgYHZhbHVlYCB3aXRoIGEgbmV3IGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIKdGhleSB3ZXJlIGEgc2VuZGVyIG9yIHJlY2VpdmVyIGNhbGxlZCBgbmFtZWAgYnkgZGVmYXVsdC4KClNpbmNlIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB1c2VybmFtZXMgZm9yIG91ciBub2RlbGlzdCwgYW5kIHNpbmNlIHdlCmhhdmUgYSBudW1iZXIgb2YgZHVwbGljYXRlIG5hbWVzLCBsZXQncyBzZWxlY3QganVzdCB0aGUgYHZhbHVlYCBjb2x1bW4sCnJlbmFtZSBpdCB0byBhY3RvcnMsIGFuZCB1c2UgdGhlIGBkaXN0aW5jdCgpYCBmdW5jdGlvbiBmcm9tIHtkcGx5cn0gdG8Ka2VlcCBvbmx5IHVuaXF1ZSBuYW1lcyBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXM6CgpgYGB7cn0KYWN0b3JzIDwtIGFjdG9yc18xICU+JQogIHNlbGVjdCh2YWx1ZSkgJT4lCiAgcmVuYW1lKGFjdG9ycyA9IHZhbHVlKSAlPiUgCiAgZGlzdGluY3QoKQpgYGAKCiMjIyAqKvCfkYkgWW91ciBUdXJuKiogKiripLUqKgoKVXNlIHRoZSBjb2RlIGNodW5rIGJlbG93IHRvIHRha2UgYSBxdWljayBsb29rIGF0IG91ciBmaW5hbCBgYWN0b3JzYCBkYXRhCmZyYW1lIGFuZCBhbnN3ZXIgcXVlc3Rpb24gdGhhdCBmb2xsb3dzOgoKYGBge3IsIGV2YWw9RkFMU0V9CmFjdG9ycwpgYGAKCkhvdyBtYW55IHVuaXF1ZSBub2RlL2FjdG9ycyBhcmUgaW4gb3VyIENDU1MgbmV0d29yaz8KCi0gICBZT1VSIFJFU1BPTlNFIEhFUkUKCiMjIDJjLiBDcmVhdGUgTmV0d29yayBPYmplY3QKCkJlZm9yZSB3ZSBjYW4gYmVnaW4gdXNpbmcgbWFueSBvZiB0aGUgZnVuY3Rpb25zIGZyb20gdGhlIHt0aWR5Z3JhcGh9IGFuZAp7Z2dyYXBofSBwYWNrYWdlcyBmb3Igc3VtbWFyaXppbmcgYW5kIHZpc3VhbGl6aW5nIG91ciBDb21tb24gQ29yZQpUd2l0dGVyIG5ldHdvcmssIHdlIGZpcnN0IG5lZWQgdG8gY29udmVydCBvdXIgbm9kZSBhbmQgZWRnZSBsaXN0cyBpbnRvCm5ldHdvcmsgb2JqZWN0LgoKIyMjIENvbWJpbmUgRWRnZXMgJiBOb2RlcwoKVGhlIHt0aWR5Z3JhcGh9IHBhY2thZ2UgY29udGFpbnMgYSBgdGJsX2dyYXBoKClgIGZ1bmN0aW9uIHRoYXQgaW5jbHVkZXMKdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CgotICAgYGVkZ2VzID1gIGV4cGVjdHMgYSBkYXRhIGZyYW1lLCBpbiBvdXIgY2FzZSBgdGllc2AsIGNvbnRhaW5pbmcKICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlZGdlcyBpbiB0aGUgZ3JhcGguIFRoZSBub2RlcyBvZiBlYWNoIGVkZ2UKICAgIG11c3QgZWl0aGVyIGJlIGluIGEgYHRvYCBhbmQgYGZyb21gIGNvbHVtbiwgb3IgaW4gdGhlIHR3byBmaXJzdAogICAgY29sdW1ucyBsaWtlIHRoZSBkYXRhIGZyYW1lIHdlIHByb3ZpZGVkLgoKLSAgIGBub2RlcyA9YCBleHBlY3RzIGEgZGF0YSBmcmFtZSwgaW4gb3VyIGNhc2UgYGFjdG9yc2AsIGNvbnRhaW5pbmcKICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguIElmIGB0b2AgYW5kL29yIGBmcm9tYCBhcmUKICAgIGNoYXJhY3RlcnMgb3IgbmFtZXMsIGxpa2UgaW4gb3VyIGRhdGEgZnJhbWVzLCB0aGVuIHRoZXkgd2lsbCBiZQogICAgbWF0Y2hlZCB0byB0aGUgY29sdW1uIG5hbWVkIGFjY29yZGluZyB0byBgbm9kZV9rZXlgIGluIG5vZGVzLCBpZiBpdAogICAgZXhpc3RzLCBvciBtYXRjaGVkIHRvIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIG5vZGUgbGlzdC4KCi0gICBgZGlyZWN0ZWQgPWAgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnN0cnVjdGVkIGdyYXBoIHNob3VsZCBiZQogICAgZGlyZWN0ZWQsIGkuZS4gaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIGVhY2ggbm9kZSBpcyB0aGUKICAgIHNlbmRlciBvciB0YXJnZXQgb2YgYSBjb25uZWN0aW9uLiBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvIGBUUlVFYC4KCkxldCdzIGdvIGFoZWFkIGFuZCBjcmVhdGUgb3VyIG5ldHdvcmsgZ3JhcGgsIG5hbWUgaXQgYG5ldHdvcmtgIGFuZCBwcmludAp0aGUgb3V0cHV0OgoKYGBge3J9CmNjc3NfbmV0d29ya18xIDwtIHRibF9ncmFwaChlZGdlcyA9IHRpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMgPSBhY3RvcnMpCgpjY3NzX25ldHdvcmtfMQpgYGAKCiMjIyAqKvCfkYkgWW91ciBUdXJuKiogKiripLUqKgoKVGFrZSBhIGxvb2sgYXQgdGhlIG91dHB1dCBmb3Igb3VyIHNpbXBsZSBncmFwaCBhYm92ZSBhbmQgYW5zd2VyIHRoZQpmb2xsb3dpbmcgcXVlc3Rpb25zOgoKMS4gIEFyZSB0aGUgbnVtYmVycyBhbmQgbmFtZXMgb2Ygbm9kZXMgYW5kIGFjdG9ycyBjb25zaXN0ZW50IHdpdGggb3VyCiAgICBgYWN0b3JzYCBhbmQgYHRpZXNgIGRhdGEgZnJhbWVzPyBXaGF0IGFib3V0IHRoZSBpbnRlZ2VycyBpbmNsdWRlZCBpbgogICAgdGhlIGBmcm9tYCBhbmQgYHRvYCBjb2x1bW5zIG9mIHRoZSBFZGdlIERhdGE/CgogICAgLSAgIFlPVVIgUkVTUE9OU0UgSEVSRQoKMi4gIFdoYXQgZG8geW91IHRoaW5rICJjb21wb25lbnRzIiByZWZlcnMgdG8/ICoqSGludDoqKiBzZWUgQ2hhcHRlciA2IG9mCiAgICBbQGNhcm9sYW4yMDE0XS4KCiAgICAtICAgWU9VUiBSRVNQT05TRSBIRVJFCgozLiAgSXMgb3VyIG5ldHdvcmsgZGlyZWN0ZWQgb3IgdW5kaXJlY3RlZD8KCiAgICAtICAgWU9VUiBSRVNQT05TRSBIRVJFCgpBIHF1aWNrIG5vdGUgYWJvdXQgImRpcmVjdGVkIiBuZXR3b3Jrcy4gQSAqKmRpcmVjdGVkIG5ldHdvcmsqKiBpbmRpY2F0ZXMKdGhhdCBhIGNvbm5lY3Rpb24gb3IgdGllIGlzIG5vdCBuZWNlc3NhcmlseSByZWNpcHJvY2F0ZWQgb3IgbXV0dWFsLiBGb3IKZXhhbXBsZSwgb3VyIG5ldHdvcmsgaXMgZGlyZWN0ZWQgYmVjYXVzZSBldmVuIHRob3VnaCBhIHVzZXIgbWF5IGZvbGxvdywKbWVudGlvbiBvciByZXBseSB0byBzb21lb25lIGVsc2UsIHRoZXkgbWF5IG5vdCBuZWNlc3NhcmlseSByZWNlaXZlIGEKZm9sbG93LCBtZW50aW9uIG9yIHJlcGx5IGJhY2suIEEgZmFjZWJvb2sgZnJpZW5kc2hpcCBuZXR3b3JrIGlzCnVuZGlyZWN0ZWQsIGhvd2V2ZXIsIHNpbmNlIHNvbWVvbmUgY2FuIG5vdCAiZnJpZW5kIiBzb21lb25lIG9uIEZhY2Vib29rCndpdGhvdXQgdGhlbSBhbHNvIGluZGljYXRpbmcgYSAiZnJpZW5kIiByZWxhdGlvbnNoaXAsIHNvIHRoZSBmcmllbmRzaGlwCmlzIG11dHVhbCBvciByZWNpcHJvY2F0ZWQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgMy4gRVhQTE9SRQoKQXMgbm90ZWQgaW4gaW4gb3VyIGNvdXJzZSByZWFkaW5ncywgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBpbnZvbHZlcwp0aGUgcHJvY2Vzc2VzIG9mIGRlc2NyaWJpbmcgeW91ciBkYXRhIChzdWNoIGFzIGJ5IGNhbGN1bGF0aW5nIHRoZSBtZWFucwphbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBudW1lcmljIHZhcmlhYmxlcywgb3IgY291bnRpbmcgdGhlIGZyZXF1ZW5jeQpvZiBjYXRlZ29yaWNhbCB2YXJpYWJsZXMpIGFuZCwgb2Z0ZW4sIHZpc3VhbGl6aW5nIHlvdXIgZGF0YSBwcmlvciB0bwptb2RlbGluZy4KCkluIFNlY3Rpb24gMywgd2UgdXNlIHRoZSB7dGlkeWdyYXBofSBwYWNrYWdlIGZvciByZXRyaWV2aW5nIG5ldHdvcmsKZGVzY3JpcHRpdmVzIGFuZCBpbnRyb2R1Y2UgdGhlIHtnZ3JhcGh9IHBhY2thZ2UgdG8gY3JlYXRlIGEgbmV0d29yawp2aXN1YWxpemF0aW9uIHRvIGhlbHAgaWxsdXN0cmF0ZSB0aGVzZSBtZXRyaWNzLiBTcGVjaWZpY2FsbHksIGluIHRoaXMKc2VjdGlvbiB3ZSdsbCBsZWFybiB0bzoKCmEuICAqKkV4YW1pbmUgQmFzaWMgRGVzY3JpcHRpdmVzKiouIFdlIGZvY3VzIHByaW1hcmlseSBvbiBhY3RvcnMgYW5kCiAgICBlZGdlcyBpbiB0aGlzIHdhbGt0aHJvdWdoLCBpbmNsdWRpbmcgdGhlIGVkZ2VzIHdpZ2h0cyB3ZSBhZGRlZCBpbgogICAgdGhlIHByZXZpb3VzIHNlY3Rpb24gYXMgd2VsbCBhcyBub2RlIGRlZ3JlZSwgYW5kIGltcG9ydCBhbmQgZmFpcmx5CiAgICBpbnR1aXRpdmUgbWVhc3VyZSBvZiBjZW50cmFsaXR5LgoKYi4gICoqTWFrZSBhIFNvY2lvZ3JhbSoqLiBGaW5hbGx5LCB3ZSB3cmFwIHVwIHRoZSBleHBsb3JlIHBoYXNlcyBieQogICAgbGVhcm5pbmcgdG8gcGxvdCBhIG5ldHdvcmsgYW5kIHR3ZWFrIGtleSBlbGVtZW50cyBsaWtlIHRoZSBzaXplLAogICAgc2hhcGUsIGFuZCBwb3NpdGlvbiBvZiBub2RlcyBhbmQgZWRnZXMgdG8gYmV0dGVyIGF0IGNvbW11bmljYXRpbmcKICAgIGtleSBmaW5kaW5ncy4KCiMjIDNhLiBFeGFtaW5lIEJhc2ljIERlc2NyaXB0aXZlcwoKTWFueSBhbmFseXNlcyBvZiBzb2NpYWwgbmV0d29ya3MgYXJlIHByaW1hcmlseSBkZXNjcmlwdGl2ZS4gQXMKQGNhcm9sYW4yMDE0IG5vdGVzLCB0aGVzZSBkZXNjcmlwdGl2ZSBzdHVkaWVzIGFpbSBlaXRoZXIgdG86CgoxLiAgcmVwcmVzZW50IHRoZSBuZXR3b3JrJ3MgdW5kZXJseWluZyBzb2NpYWwgc3RydWN0dXJlIHRocm91Z2gKICAgIGRhdGEtcmVkdWN0aW9uIHRlY2huaXF1ZXM7IG9yLAoKMi4gIGNoYXJhY3Rlcml6ZSBuZXR3b3JrIHByb3BlcnRpZXMgdGhyb3VnaCBuZXR3b3JrIG1lYXN1cmVzLgoKIyMjIENlbnRyYWxpdHkKCkEga2V5IHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgbmV0d29ya3MgaXMgdGhlIGNvbmNlcHQgb2YgY2VudHJhbGl6YXRpb24uCkEgbmV0d29yayB0aGF0IGlzIGhpZ2hseSBjZW50cmFsaXplZCBpcyBvbmUgaW4gd2hpY2ggcmVsYXRpb25zIGFyZQpmb2N1c2VkIG9uIGEgc21hbGwgbnVtYmVyIG9mIGFjdG9ycyBvciBldmVuIGEgc2luZ2xlIGFjdG9yIGluIGEgbmV0d29yaywKd2hlcmVhcyB0aWVzIGluIGEgZGVjZW50cmFsaXplZCBuZXR3b3JrIGFyZSBkaWZmdXNlIGFuZCBzcHJlYWQgb3ZlciBhCm51bWJlciBvZiBhY3RvcnMuIE9uZSBvZiB0aGUgbW9zdCBjb21tb24gZGVzY3JpcHRpdmVzIHJlcG9ydGVkIGluCm5ldHdvcmsgc3R1ZGllcyBhbmQgYSBwcmltYXJ5IG1lYXN1cmUgb2YgY2VudHJhbGl6YXRpb24gaXMgKipkZWdyZWUqKi4KCj4gKipEZWdyZWUqKiBpcyB0aGUgbnVtYmVyIG9mIHRpZXMgdG8gYW5kIGZyb20gYW4gZWdvLiBJbiBhIGRpcmVjdGVkCj4gbmV0d29yaywgaW4tZGVncmVlIGlzIHRoZSBudW1iZXIgb2YgdGllcyByZWNlaXZlZCwgd2hlcmVhcyBvdXQtZGVncmVlCj4gaXMgdGhlIG51bWJlciBvZiB0aWVzIHNlbnQuCgojIyMjIE5vZGUgRGVncmVlCgpUaGUge3RpZHlncmFwaH0gcGFja2FnZSBoYXMgYW4gdW5pcXVlIGZ1bmN0aW9uIGNhbGxlZCBgYWN0aXZhdGUoKWAgdGhhdAphbGxvd3MgdXMgdG8gdHJlYXQgdGhlIG5vZGVzIGluIG91ciBuZXR3b3JrIG9iamVjdCBhcyBpZiB0aGV5IHdlcmUgYQp0eXBpY2FsIGRhdGEgZnJhbWUgdG8gd2hpY2ggd2UgY2FuIHRoZW4gYXBwbHkgc3RhbmRhcmQgdGlkeXZlcnNlCmZ1bmN0aW9ucyBsaWtlIGBzZWxlY3QoKWAsIGBmaWx0ZXIoKWAsIGFuZCBgbXV0YXRlKClgLgoKVGhlIGxhdHRlciBmdW5jdGlvbiwgYG11dGF0ZSgpYCwgd2UgY2FuIHVzZSB0byBjcmVhdGUgbmV3IHZhcmlhYmxlcyBmb3IKbm9kZXMgc3VjaCBhcyBtZWFzdXJlcyBvZiBkZWdyZWUsIGluLWRlZ3JlZSwgYW5kIG91dC1kZWdyZWUgdXNlZCBieQpAc3Vwb3ZpdHoyMDE3Y29tbW9uY29yZSB0byBpZGVudGlmeSB0cmFuc2NlbmRlcnMsIHRyYW5jZWl2ZXJzLCBhbmQKdHJhbnNtaXR0ZXJzIHJlc3BlY3RpdmVseS4gVGhlc2UgbWVhc3VyZXMgY2FuIGJlIGFkZGVkIGJ5IHVzaW5nIHRoZQpgY2VudHJhbGl0eV9kZWdyZWUoKWAgZnVuY3Rpb24gaW4gdGhlIHt0aWR5Z3JhcGh9IHBhY2thZ2UuCgpSdW4gdGhlIGZvbGxvd2luZyBjb2RlIHRvIGFkZCBkZWdyZWUgbWVhc3VyZXMgdG8gZWFjaCBvZiBvdXIgbm9kZXMgYW5kCnByaW50IHRoZSBvdXRwdXQgZm9yIGluc3BlY3Rpb246CgpgYGB7cn0KY2Nzc19uZXR3b3JrIDwtIGNjc3NfbmV0d29ya18xICU+JQogIGFjdGl2YXRlKG5vZGVzKSAlPiUKICBtdXRhdGUoZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUobW9kZSA9ICJhbGwiKSkgJT4lCiAgbXV0YXRlKGluX2RlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKG1vZGUgPSAiaW4iKSkKCmNjc3NfbmV0d29yawpgYGAKCldlIG5vdyBzZWUgdGhhdCB0aGVzZSBzaW1wbGUgbWVhc3VyZXMgb2YgY2VudHJhbGl0eSBoYXZlIGJlZW4gYWRkZWQgdG8KdGhlIG5vZGVzIGluIG91ciBuZXR3b3JrLgoKIyMjICoq8J+RiSBZb3VyIFR1cm4qKiAqKuKktSoqCgpBcyB5b3UgbWF5IGhhdmUgbm90ZWQgYWJvdmUsIHdlIGZvcmdvdCB0byBpbmNsdWRlIG91dC1kZWdyZWUgaW4gb3VyCm1lYXN1cmVzIG9mIGNlbnRyYWxpdHkuIENvcHkgdGhlIGNvZGUgZnJvbSBhYm92ZSBhbmQgYWRkIGFuIG91dC1kZWdyZWUKbWVhc3VyZSB0byBlYWNoIG5vZGUgYW5kIHByaW50IHRoZSBvdXRwdXQ6CgpgYGB7cn0KY2Nzc19uZXR3b3JrIDwtIGNjc3NfbmV0d29ya18xICU+JQogIGFjdGl2YXRlKG5vZGVzKSAlPiUKICBtdXRhdGUoZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUobW9kZSA9ICJhbGwiKSkgJT4lCiAgbXV0YXRlKGluX2RlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKG1vZGUgPSAiaW4iKSkgJT4lCiAgbXV0YXRlKG91dF9kZWdyZWUgPSBjZW50cmFsaXR5X2RlZ3JlZShtb2RlID0gIm91dCIpKQoKY2Nzc19uZXR3b3JrCmBgYAoKIyMjIyBTdW1tYXJpemUgQ2VudHJhbGl0eSBNZWFzdXJlcwoKV2UgY2FuIGFsc28gdXNlIHRoZSBgYWN0aXZhdGUoKWAgZnVuY3Rpb24gY29tYmluZWQgd2l0aCB0aGUKYGRhdGEuZnJhbWUoKWAgZnVuY3Rpb24gdG8gZXh0cmFjdCBvdXIgbmV3IG1lYXN1cmVzIHRvIGEgc2VwYXJhdGUgZGF0YQpmcmFtZSBzbyB3ZSBpbnNwZWN0IG91ciBub2RlcyBpbmRpdmlkdWFsbHkgYW5kIGNyZWF0ZSBzb21lIHN1bW1hcnkKc3RhdGlzdGljcyB1c2luZyB0aGUgaGFuZHkgYHN1bW1hcnkoKWAgZnVuY3Rpb24uCgpgYGB7cn0Kbm9kZV9tZWFzdXJlcyA8LSBjY3NzX25ldHdvcmsgJT4lIAogIGFjdGl2YXRlKG5vZGVzKSAlPiUKICBkYXRhLmZyYW1lKCkKCnN1bW1hcnkobm9kZV9tZWFzdXJlcykKYGBgCgpXZSBzZWUgdGhhdCB0eXBpY2FsIG5vZGVzIGluIHRoaXMgbmV0d29yayBhcmUgY29ubmVjdGVkIG9uIGF2ZXJhZ2Ugd2l0aAozIG90aGVyIFR3aXR0ZXIgdXNlcnMgYW5kIGhhdmUgcmVjZWl2ZWQgb24gYXZlcmFnZSBtZW50aW9ucyBvciByZXBsaWVzCmZyb20gMS41IHVzZXJzLgoKIyMjICoq8J+RiSBZb3VyIFR1cm4qKiAqKuKktSoqCgpSZWNhbGwgZnJvbSB0aGUgUHJlcGFyZSBzZWN0aW9uIHRoYXQgb25lIG9mIHRoZSBxdWVzdGlvbnMgZ3VpZGluZyB0aGlzCmFuYWx5c2lzIHdhczoKCj4gV2hvIGFyZSB0aGUgdHJhbnNtaXR0ZXJzLCB0cmFuc2NlaXZlcnMsIGFuZCB0cmFuc2NlbmRlcnMgaW4gb3VyIENvbW1vbgo+IENvcmUgVHdpdHRlciBuZXR3b3JrPwoKVXNlIHRoZSBjb2RlIGNodW5rIGJlbG93IHRvIGB2aWV3KClgIHlvdXIgYG5vZGVfbWVhc3VyZXNgIGRhdGEgZnJhbWUgYW5kCmFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgZm9sbG93OgoKYGBge3IsIGV2YWw9RkFMU0V9CnZpZXcobm9kZV9tZWFzdXJlcykKYGBgCgpJZGVudGlmeSB0aGUgVHdpdHRlciB1c2VyIHdpdGggdGhlIGhpZ2hlc3QgdmFsdWUgZm9yIGVhY2ggb2YgdGhlCmZvbGxvd2luZyB0eXBlcyBvZiBjZW50cmFsIGFjdG9yczoKCi0gICAqKlRyYW5zbWl0dGVyczoqKgoKLSAgICoqVHJhbnNjZWl2ZXJzOioqCgotICAgKipUcmFuc2NlbmRlcnM6KioKCiMjIDNiLiBNYWtlIGEgU29jaW9ncmFtCgpJZiB5b3UgcmVjYWxsIGZyb20gWzFhLiBSZXZpZXcgdGhlIFJlc2VhcmNoXSBzZWN0aW9uLCBvbmUgb2YgdGhlCmRlZmluaW5nIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc29jaWFsIG5ldHdvcmsgcGVyc3BlY3RpdmUgaXMgaXRzIHVzZSBvZgpncmFwaGljIGltYWdlcnkgdG8gcmVwcmVzZW50IGFjdG9ycyBhbmQgdGhlaXIgcmVsYXRpb25zIHdpdGggb25lCmFub3RoZXIuIFRvIGVtcGhhc2l6ZSB0aGlzIHBvaW50LCBAY2Fyb2xhbjIwMTQgcmVwb3J0ZWQgdGhhdDoKCj4gVGhlIHZpc3VhbGl6YXRpb24gb2Ygc29jaWFsIG5ldHdvcmtzIGhhcyBiZWVuIGEgY29yZSBwcmFjdGljZSBzaW5jZQo+IGl0cyBmb3VuZGF0aW9uIG1vcmUgdGhhbiA5MCB5ZWFycyBhZ28gYW5kIHJlbWFpbnMgYSBoYWxsbWFyayBvZgo+IGNvbnRlbXBvcmFyeSBzb2NpYWwgbmV0d29yayBhbmFseXNpcy7CoAoKTmV0d29yayB2aXN1YWxpemF0aW9uIGNhbiBiZSB1c2VkIGZvciBhIHZhcmlldHkgb2YgcHVycG9zZXMsIHJhbmdpbmcKZnJvbSBoaWdobGlnaHRpbmcga2V5IGFjdG9ycyB0byBldmVuIHNlcnZpbmcgYXMgd29ya3Mgb2YgYXJ0LgoKVGhpcyBleGNlbGxlbnQgZmlndXJlIGZyb20gS2F0eWEgT2dueWFub3ZhJ3MgYWxzbyBleGNlbGxlbnQgdHV0b3JpYWwgb24KW1N0YXRpYyBhbmQgRHluYW1pYyBOZXR3b3JrIFZpc3VhbGl6YXRpb24gd2l0aApSXShodHRwczovL2thdGV0by5uZXQvbmV0d29yay12aXN1YWxpemF0aW9uLykgaGVscHMgaWxsdXN0cmF0ZSB0aGUKdmFyaWV0eSBvZiBnb2FscyBhIGdvb2QgbmV0d29yayB2aXN1YWxpemF0aW9uIGNhbiBhY2NvbXBsaXNoOgoKIVtdKGltZy92aXotZ29hbHMuanBlZyl7d2lkdGg9IjgwJSJ9CgpUaGVzZSB2aXN1YWwgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBhY3RvcnMgYW5kIHRoZWlyIHJlbGF0aW9ucywgaS5lLiB0aGUKbmV0d29yaywgYXJlIGNhbGxlZCBhIHNvY2lvZ3JhbS4gQWN0b3JzIHdobyBhcmUgbW9zdCBjZW50cmFsIHRvIHRoZQpuZXR3b3JrLCBzdWNoIGFzIHRob3NlIHdpdGggaGlnaGVyIG5vZGUgZGVncmVlcywgYXJlIHVzdWFsbHkgcGxhY2VkIGluCnRoZSBjZW50ZXIgb2YgdGhlIHNvY2lvZ3JhbSBhbmQgdGhlaXIgdGllcyBhcmUgcGxhY2VkIG5lYXIgdGhlbS4gQXMKd2UnbGwgc2VlIGluIGp1c3QgYSBiaXQsIHRob3NlIHR3byBhY3RvcnMgd2l0aCBodW5kcmVkcyBvZiB0aWVzIHdpbGwgYmUKcGxhY2VkIGJ5IG1vc3QgZ3JhcGggbGF5b3V0IGFsZ29yaXRobXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgZ3JhcGguCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKClRoZSBgcGxvdCgpYCBmdW5jdGlvbiBmcm9tIFIncyBidWlsdCBpbiB7Z3JhcGhpY3N9IHBhY2thZ2UgY2FuIGJlIHVzZWQKdG8gbWFrZSBhIHNpbXBsZSBzb2Npb2dyYW0sIGJ1dCBhcyB5b3UnbGwgc2VlLCBpdCdzIGEgYml0IGxhY2tpbmcuCgpJbiB0aGUgY29kZSBjaHVuayBiZWxvdywgdXNlIHRoZSBgcGxvdCgpYCBmdW5jdGlvbiB3aXRoIHlvdXIKYGNjc3NfbmV0d29ya2Agb2JqZWN0IHRvIHNlZSB3aGF0IHRoZSBiYXNpYyBwbG90IGZ1bmN0aW9uIHByb2R1Y2VzOgoKYGBge3J9CnBsb3QoY2Nzc19uZXR3b3JrKQpgYGAKCklmIHRoaXMgaGFkIGJlZW4gYSBzbWFsbGVyIG5ldHdvcmsgbGlrZSBvbmUgZ2VuZXJhdGVkIGZyb20gYSBzaW5nbGUKY2xhc3Nyb29tLCB0aGlzIG1pZ2h0IGhhdmUgYmVlbiBhIGxpdHRsZSBtb3JlIHVzZWZ1bCwgYnV0IGZvciBsYXJnZXIKbmV0d29ya3MgbGlrZSBvdXIgVHdpdHRlciBkYXRhLCB0aGlzIGRvZXNuJ3QgY29tbXVuaWNhdGUgbXVjaC4gSW4gZmFjdCwKaXQncyB2aXN1YWxpemF0aW9ucyBsaWtlIHRoZXNlIHRoYXQgZ2l2ZSBzb2Npb2dyYW1zIHRoZSB1bmZsYXR0ZXJpbmcKbmlja25hbWUgb2YgImhhaXIgYmFsbCIgcGxvdHMhCgpGb3J0dW5hdGVseSwgdGhlIHtnZ3JhcGh9IHBhY2thZ2UgaW5jbHVkZXMgYSBwbGV0aG9yYSBvZiBwbG90dGluZwpwYXJhbWV0ZXJzIGZvciBncmFwaApbbGF5b3V0c10oaHR0cHM6Ly9nZ3JhcGguZGF0YS1pbWFnaW5pc3QuY29tL2FydGljbGVzL0xheW91dHMuaHRtbCksCltlZGdlc10oaHR0cHM6Ly9nZ3JhcGguZGF0YS1pbWFnaW5pc3QuY29tL2FydGljbGVzL0VkZ2VzLmh0bWwpIGFuZApbbm9kZXNdKGh0dHBzOi8vZ2dyYXBoLmRhdGEtaW1hZ2luaXN0LmNvbS9hcnRpY2xlcy9Ob2Rlcy5odG1sKSB0bwppbXByb3ZlIHRoZSB2aXN1YWwgZGVzaWduIG9mIG5ldHdvcmsgZ3JhcGhzLgoKRm9yIHRoZSByZW1haW5kZXIgb2YgdGhpcyBzZWN0aW9uLCB3ZSdyZSBnb2luZyB0byBmb2N1cyBvbiBjcmVhdGluZyBhCnNvY2lvZ3JhbSB0aGF0IGhpZ2hsaWdodHMgdGhlIG1haW4gInRyYW5zbWl0dGVycyIgaW4gb3VyIG5ldHdvcmsuCgojIyMgQnVpbGQgYSBuZXR3b3JrCgpPbmUgdGhpbmcgdG8ga2VlcCBpbiBtaW5kIHdoZW4gYnVpbGRpbmcgYSBuZXR3b3JrIHZpeiB3aXRoIHtnZ3JhcGh9LCBpcwp0aGF0IGp1c3QgbGlrZSBpdCdzIGBnZ3Bsb3QoKWAgY291bnRlcnBhcnQsIHRoZSBgZ2dyYXBoKClgIGZ1bmN0aW9uCnRha2VzIGNhcmUgb2Ygc2V0dGluZyB1cCB0aGUgcGxvdCBvYmplY3QgYWxvbmcgd2l0aCBjcmVhdGluZyB0aGUgbGF5b3V0CmZvciB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgbmV0d29yayBvYmplY3QgYW5kIHRoZSBsYXlvdXQgc3BlY2lmaWNhdGlvbgpwcm92aWRlZC4KCkxldCdzIGZpcnN0IHBhc3Mgb3VyIGBjY3NzX25ldHdvcmtgIG9iamVjdCB0byBnZ3JhcGggYW5kIHNlZSB3aGF0CmhhcHBlbnMuCgpgYGB7cn0KZ2dyYXBoKGNjc3NfbmV0d29yaykKYGBgCgpBcyB5b3UgY2FuIHNlZSwganVzdCBsaWtlIHRoZSBgZ2dwbG90KClgIGZ1bmN0aW9uLCB0aGlzIGRpZG4ndCBwcm9kdWNlCm11Y2ggb24gaXQncyBvd24uIEFsbCB0aGF0IHRoZSBgZ2dyYXBoKClgIGZ1bmN0aW9uIGRvZXMgaXMgc2V0IHVwIHRoZQpuZXR3b3JrIG9iamVjdCB0byBtYWtlIGEgc29jaW9ncmFtLCBhbmQgY3JlYXRlIGEgbGF5b3V0IGZvciBvdXIgbmV0d29yaywKaW4gdGhpcyBjYXNlIHRoZSBkZWZhdWx0ICJzdHJlc3MiIGxheW91dC4KCiMjIyMgQWRkIE5vZGVzCgpWZXJ5IHNpbWlsYXIgdG8gaG93IGBnZ3Bsb3QoKWAgdXNlcyB0aGUgYCtgIG9wZXJhdG9yIHRvICJsYXllciIKZnVuY3Rpb25zIHRvZ2V0aGVyIHRvIHByb2dyZXNzaXZlbHkgYnVpbGQgZ3JhcGhzLCBgZ2dyYXBoYCB1c2UgdGhlIGArYApvcGVyYXRvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkIGEgc29jaW9ncmFtLgoKVG8gYWRkIG91ciBub2Rlcywgd2UnbGwgYWRkZWQgdGhlIGBnZW9tX25vZGVfcG9pbnQoKWAgZnVuY3Rpb24uIEFnYWluLApqdXN0IGxpa2Ugd2l0aCB7Z2dwbG90Mn0sIHRoZSAiZ2VvbSIgaW4gdGhlIGBnZW9tX25vbl9wb2ludCgpYCBmdW5jdGlvbnMKc3RhbmRzIGZvciAiR2VvbWV0cmljIGVsZW1lbnRzIiwgb3IgZ2VvbXMgZm9yIHNob3J0LCBhbmQgcmVwcmVzZW50cyB3aGF0CnlvdSBhY3R1YWxseSBzZWUgaW4gdGhlIHBsb3QuCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKCk5vdyAiYWRkIiB0aGUgYGdlb21fbm9kZV9wb2ludCgpYCBmdW5jdGlvbiB0byBvdXIgY29kZSB1c2luZyB0aGUgYCtgCm9wZXJhdG9yOgoKYGBge3J9CmdncmFwaChjY3NzX25ldHdvcmspICsgCiAgZ2VvbV9ub2RlX3BvaW50KCkgCmBgYAoKV2VsbCwgYXQgbGVhc3Qgd2UgaGF2ZSBvdXIgbm9kZXMgbm93ISBCdXQgdGhlIGRlZmF1bHQgInN0cmVzcyIgbGF5b3V0CmZvciBvdXIgc29jaW9ncmFtIGlzIG5vdCBzbyBncmVhdC4gTGV0J3MgZml4IHRoYXQuCgojIyMjIEFkZCBMYXlvdXQKCk9uZSBvZiB0aGUgbWFqb3IgYWR2YW5jZXMgaW4gdmlzdWFsaXphdGlvbiBzaW5jZSB0aGUgZmlyc3QgaGFuZC1kcmF3bgpzb2Npb2dyYW1zIGRldmVsb3BlZCBieSBKYWNvYiBNb3Jlbm8gKDE5MzQpIHRvIHJlcHJlc2VudCByZWxhdGlvbnMgYW1vbmcKY2hpbGRyZW4gaW4gc2Nob29sIGlzIHRoZSB1c2Ugb2Ygc29mdHdhcmUgYW5kIGFsZ29yaXRobXMgdG8KYXV0b21hdGljYWxseSBsYXlvdXQgbmV0d29ya3Mgb24gYSBncmlkLgoKVGhlcmUgYXJlIG1heSBkaWZmZXJlbnQgW2xheW91dAptZXRob2RzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmFwaF9kcmF3aW5nI0xheW91dF9tZXRob2RzKSwKYnV0IHdlJ2xsIHN0YXJ0IHdpdGggdGhlIEZydWNodGVybWFuLVJlaW5nb2xkIChGUikgbGF5b3V0LCB3aGljaCBpcyBvbmUKb2YgdGhlIG1vc3QgdXNlZCBsYXlvdXQgYWxnb3JpdGhtcyBmb3IgbmV0d29yayB2aXN1YWxpemF0aW9uLiBUaGVzZQp0eXBlcyBvZiBmb3JjZS1kaXJlY3RlZCBhbGdvcml0aG1zIGdlbmVyYWxseSB3b3JrIHdlbGwgd2l0aCBsYXJnZQpuZXR3b3JrcyBhbmQgdHJ5IHRvIGxheW91dCBncmFwaHMgaW4gImFuIGFlc3RoZXRpY2FsbHktcGxlYXNpbmcgd2F5IiBieQptYWtpbmcgZWRnZXMgcm91Z2hseSBlcXVhbCBpbiBsZW5ndGggYW5kIG1pbmltaXppbmcgb3ZlcmxhcC4KCkxldCdzIGdvIGFoZWFkIGFuZCBpbmNsdWRlIHRoZSBsYXlvdXQgYXJndW1lbnQsIHdoaWNoIGluIGFkZGl0aW9uIHRvCmluY2x1ZGluZyBpdHMgb3duIHVuaXF1ZSBsYXlvdXRzLCBjYW4gaW5jb3Jwb3JhdGUgbGF5b3V0cyBmb3JtIHtpZ3JhcGh9CnBhY2thZ2UgbGlrZSBgZnJgIGZvciB0aGUgRnJ1Y2h0ZXJtYW4tUmVpbmdvbGQgKEZSKSBsYXlvdXQ6CgpgYGB7cn0KZ2dyYXBoKGNjc3NfbmV0d29yaywgbGF5b3V0ID0gImZyIikgKwogIGdlb21fbm9kZV9wb2ludCgpCmBgYAoKVGhhdCdzIGEgbGl0dGxlIGJldHRlci4gV2UgY2FuIGFsc28gc3RhcnQgdG8gbWFrZSBvdXQgb3VyIHNlcGFyYXRlCm5ldHdvcmsgImNvbXBvbmVudHMiIGFzIGRpc3RpbmN0IGdyb3Vwcywgd2l0aCBvbmUgbGFyZ2VyIGNvbm5lY3RlZCBncm91cAppbiB0aGUgY2VudGVyLiBJbiBvdXIgTW9kZWwgc2VjdGlvbiwgd2UnbGwgaW50cm9kdWNlIGNvbW11bml0eSBkZXRlY3Rpb24KYWxnb3JpdGhtcyB0byBhdXRvbWF0aWNhbGx5IGlkZW50aWZ5IGdyb3VwcyBhbmQgdXNlIGNvbG9yIHRvIHNob3cgZ3JvdXAKbWVtYmVyc2hpcC4KCiMjIyMgVHdlYWsgTm9kZXMKCkFsc28gbGlrZSB7Z2dwbG90Mn0sIGdlb21zIGNhbiBpbmNsdWRlIGFlc3RoZXRpY3MsIG9yIGFlcyBmb3Igc2hvcnQsCnN1Y2ggYXMgYGFscGhhYCBmb3IgdHJhbnNwYXJlbmN5LCBhcyB3ZWxsIGFzIGBjb2xvcmAsIGBzaGFwZWAgYW5kCmBzaXplYC4KCkxldCdzIG5vdyBhZGQgc29tZSAiYWVzdGhldGljcyIgdG8gb3VyIHBvaW50cyBieSBpbmNsdWRpbmcgdGhlIGBhZXMoKWAKZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBzdWNoIGFzIGBzaXplID1gIGFuZCBgY29sb3IgPWAsIHdoaWNoIHdlIGNhbiBzZXQKdG8gb3VyIGBvdXRfZGVncmVlYCBtZWFzdXJlcyB0byBoZWxwIGhpZ2hsaWdodCBvdXIgcHJpbWFyeSB0cmFuc21pdHRlcnM6CgpgYGB7cn0KZ2dyYXBoKGNjc3NfbmV0d29yaywgbGF5b3V0ID0gImZyIikgKyAKZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplID0gb3V0X2RlZ3JlZSwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG91dF9kZWdyZWUpKQpgYGAKCldlIGNhbiBjbGVhcmx5IHNlZSB3ZSBoYXZlIG9uZSBtYWluIHRyYW5zbWl0dGVyIGluIHRoaXMgbmV0d29yayEKVW5mb3J0dW5hdGVseSwgd2l0aG91dCBsYWJlbHMgd2UgZG9uJ3Qga25vdyB3aG8gdGhpcyBUd2l0dGVyIHVzZXJzIGlzLgoKTGV0J3MgZml4IHRoYXQgYnkgYWRkaW5nIGFub3RoZXIgbGF5ZXIgd2l0aCBzb21lIG5vZGUgdGV4dCBhbmQgbGFiZWxzLgpTaW5jZSBub2RlIGxhYmVscyBhcmUgYSBnZW9tZXRyaWMgZWxlbWVudCwgd2UgY2FuIGFwcGx5IGFlc3RoZXRpY3MgdG8KdGhlbSBhcyB3ZWxsLCBsaWtlIGNvbG9yIGFuZCBzaXplLiBMZXQncyBhbHNvIGluY2x1ZGUgdGhlIGByZXBlbCA9YAphcmd1bWVudCB0aGF0IHdoZW4gc2V0IHRvwqBgVFJVRWDCoHdpbGwgYXZvaWQgb3ZlcmxhcHBpbmcgdGV4dC4KCmBgYHtyfQpnZ3JhcGgoY2Nzc19uZXR3b3JrLCBsYXlvdXQgPSAiZnIiKSArIAogIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IG91dF9kZWdyZWUsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG91dF9kZWdyZWUpKSArCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsID0gYWN0b3JzLAogICAgICAgICAgICAgICAgICAgICBzaXplID0gb3V0X2RlZ3JlZS8yLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG91dF9kZWdyZWUpLAogICAgICAgICAgICAgICAgIHJlcGVsPVRSVUUpCmBgYAoKTXVjaCBiZXR0ZXIhIEV2ZW4gd2l0aG91dCB0aGUgZWRnZXMsIHVzaW5nIHNpemUgYW5kIGNvbG9yIGhhdmUgaGVscGVkIHRvCmhpZ2hsaWdodCB0aGUgbWFpbiAidHJhbnNtaXR0ZXIiIGluIG91ciBuZXR3b3JrLgoKIyMjIyBBZGQgRWRnZXMKCk5vdywgbGV0J3MgY29ubmVjdCB0aGUgZG90cyBhbmQgYWRkIHNvbWUKW2VkZ2VzXShodHRwczovL2dncmFwaC5kYXRhLWltYWdpbmlzdC5jb20vYXJ0aWNsZXMvRWRnZXMuaHRtbCkgdXNpbmcgdGhlCmBnZW9tX2VkZ2VfbGluaygpYCBmdW5jdGlvbi4gV2UnbGwgYWxzbyBpbmNsdWRlIHNvbWUgYXJndW1lbnRzIGxpa2UKYGFycm93ID1gIHRvIGluY2x1ZGUgc29tZSBhcnJvd3MgMW1tIGluIGxlbmd0aCwgYW4gYGVuZF9jYXAgPWAgYXJvdW5kCmVhY2ggbm9kZSB0byBrZWVwIGFycm93cyBmcm9tIG92ZXJsYXBwaW5nIHRoZSB0aGVtLCBhbmQgc2V0IHRoZQp0cmFuc3BhcmVuY3kgb2Ygb3VyIGVkZ2VzIHRvIGBhbHBoYSA9IC4yYCBzbyBvdXIgZWRnZXMgZmFkZSBtb3JlIGludG8KdGhlIGJhY2tncm91bmQgYW5kIGhlbHAga2VlcCB0aGUgZm9jdXMgb24gb3VyIG5vZGVzOgoKYGBge3J9CmdncmFwaChjY3NzX25ldHdvcmssIGxheW91dCA9ICJmciIpICsgCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplID0gb3V0X2RlZ3JlZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3V0X2RlZ3JlZSkpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBhY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBvdXRfZGVncmVlLzIsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3V0X2RlZ3JlZSksCiAgICAgICAgICAgICAgICAgcmVwZWw9VFJVRSkgKwogIGdlb21fZWRnZV9saW5rKGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLCAnbW0nKSksIAogICAgICAgICAgICAgICAgIGVuZF9jYXAgPSBjaXJjbGUoMywgJ21tJyksCiAgICAgICAgICAgICAgICAgYWxwaGEgPSAuMikKYGBgCgojIyMjIEFkZCBhIFRoZW1lCgpGaW5hbGx5LCBsZXQncyBhZGQgYSAqKnRoZW1lLCoqIHdoaWNoIGNvbnRyb2xzIHRoZSBmaW5lciBwb2ludHMgb2YKZGlzcGxheSwgbGlrZSB0aGUgZm9udCBzaXplIGFuZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgYHRoZW1lX2dyYXBoKClgCmZ1bmN0aW9uIGFkZCBhIHRoZW1lIHNwZWNpYWxseSB0dW5lZCBmb3IgZ3JhcGggdmlzdWFsaXphdGlvbnMuIFRoaXMKZnVuY3Rpb24gcmVtb3ZlcyByZWR1bmRhbnQgZWxlbWVudHMgaW4gb3JkZXIgdG8gcHV0IGZvY3VzIG9uIHRoZSBkYXRhCmFuZCBpZiB5b3UgdHlwZSBgP3RoZW1lX2dyYXBoYCBpbiB0aGUgY29uc29sZSB5b3Ugd2lsbCBnZXQgYSBzZW5zZSBvZgp0aGUgbGV2ZWwgb2YgZmluZSB0dW5pbmcgeW91IGNhbiBkbyBpZiBkZXNpcmVkLgoKTGV0J3MgYWRkIGB0aGVtZV9ncmFwaCgpYCB0byBvdXIgc29jaW9ncmFtLCByZW1vdmUgdGhlIGxlZ2VuZHMgc2luY2UKdGhleSBhcmUgbm90IGVzcGVjaWFsbHkgdXNlZnVsLCBhbmQgY2FsbCBpdCBnb29kIGZvciBub3c6CgpgYGB7cn0KZ2dyYXBoKGNjc3NfbmV0d29yaywgbGF5b3V0ID0gImZyIikgKyAKICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBvdXRfZGVncmVlLAogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBvdXRfZGVncmVlKSwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IGFjdG9ycywKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG91dF9kZWdyZWUvMiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBvdXRfZGVncmVlKSwKICAgICAgICAgICAgICAgICByZXBlbD1UUlVFLAogICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2VkZ2VfbGluayhhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMSwgJ21tJykpLCAKICAgICAgICAgICAgICAgICBlbmRfY2FwID0gY2lyY2xlKDMsICdtbScpLAogICAgICAgICAgICAgICAgIGFscGhhID0gLjIpICsgCiAgdGhlbWVfZ3JhcGgoKQpgYGAKCioqTm90ZToqKiBJZiB5b3UncmUgaGF2aW5nIGRpZmZpY3VsdHkgc2VlaW5nIHRoZSBzb2Npb2dyYW0gaW4gdGhlIHNtYWxsClIgTWFya2Rvd24gY29kZSBjaHVuaywgeW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgY29kZSBpbiB0aGUgY29uc29sZQphbmQgaXQgd2lsbCBzaG93IGluIHRoZSB2aWV3cGFuZSBhbmQgdGhlbiB5b3UgY2FuIGVubGFyZ2UgYW5kIGV2ZW4gc2F2ZQphcyBhbiBpbWFnZSBmaWxlLgoKIyMjICoq8J+RiSBZb3VyIFR1cm4qKiAqKuKktSoqCgpUcnkgbW9kaWZ5aW5nIHRoZSBjb2RlIGJlbG93IGJ5IHR3ZWFraW5nIHRoZSBpbmNsdWRlZCBmdW5jdGlvbi9hcmd1bWVudHMKb3IgYWRkaW5nIG5ldyBvbmVzIGZvcgpbbGF5b3V0c10oaHR0cHM6Ly9nZ3JhcGguZGF0YS1pbWFnaW5pc3QuY29tL2FydGljbGVzL0xheW91dHMuaHRtbCksCltub2Rlc10oaHR0cHM6Ly9nZ3JhcGguZGF0YS1pbWFnaW5pc3QuY29tL2FydGljbGVzL05vZGVzLmh0bWwpLCBhbmQKW2VkZ2VzXShodHRwczovL2dncmFwaC5kYXRhLWltYWdpbmlzdC5jb20vYXJ0aWNsZXMvRWRnZXMuaHRtbCkgdG8KaGlnaGxpZ2h0IHRoZSBtYWluICJ0cmFuc2VuZGVycyIgb3IgInRyYW5jZWl2ZXJzIiBpbiBvdXIgbmV0d29yay4gU2VlIGlmCnlvdSBjYW4gYWxzbyBtYWtlIHlvdXIgcGxvdCBlaXRoZXIgbW9yZSAiYWVzdGhldGljYWxseSBwbGVhc2luZyIgYW5kL29yCm1vcmUgcHVycG9zZWZ1bCBpbiB3aGF0IGl0J3MgdHJ5aW5nIHRvIGNvbW11bmljYXRlLgoKVGhlcmUgYXJlIG5vIHJpZ2h0IG9yIHdyb25nIGFuc3dlcnMsIGp1c3QgaGF2ZSBzb21lIGZ1biB0cnlpbmcgb3V0CmRpZmZlcmVudCBhcHByb2FjaGVzIQoKYGBge3J9CmdncmFwaChjY3NzX25ldHdvcmssIGxheW91dCA9ICJmciIpICsgCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplID0gb3V0X2RlZ3JlZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3V0X2RlZ3JlZSksCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBhY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBvdXRfZGVncmVlLzIsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3V0X2RlZ3JlZSksCiAgICAgICAgICAgICAgICAgcmVwZWw9VFJVRSwKICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lZGdlX2xpbmsoYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEsICdtbScpKSwgCiAgICAgICAgICAgICAgICAgZW5kX2NhcCA9IGNpcmNsZSgzLCAnbW0nKSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IC4yKSArIAogIHRoZW1lX2dyYXBoKCkKYGBgCgpDb25ncmF0cyEgWW91IG1hZGUgaXQgdG8gdGhlIGVuZCBvZiB0aGUgRXhwbG9yZSBzZWN0aW9uIGFuZCBhcmUgcmVhZHkgdG8KbGVhcm4gYSBsaXR0bGUgYWJvdXQgbmV0d29yayBtb2RlbGluZyEgQmVmb3JlIHByb2NlZWRpbmcgZnVydGhlciwga25pdAp5b3VyIGRvY3VtZW50IGFuZCBjaGVjayB0byBzZWUgaWYgeW91IGVuY291bnRlciBhbnkgZXJyb3JzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIDQuIE1PREVMCgpBcyBoaWdobGlnaHRlZCBpbsKgW0NoYXB0ZXIgMyBvZiBEYXRhIFNjaWVuY2UgaW4gRWR1Y2F0aW9uIFVzaW5nClJdKGh0dHBzOi8vZGF0YXNjaWVuY2VpbmVkdWNhdGlvbi5jb20vYzAzLmh0bWwpLCB0aGXCoCoqTW9kZWwqKsKgc3RlcCBvZgp0aGUgZGF0YSBzY2llbmNlIHByb2Nlc3MgZW50YWlscyAidXNpbmcgc3RhdGlzdGljYWwgbW9kZWxzLCBmcm9tIHNpbXBsZQp0byBjb21wbGV4LCB0byB1bmRlcnN0YW5kIHRyZW5kcyBhbmQgcGF0dGVybnMgaW4gdGhlIGRhdGEuIgoKIyMgNGEuIElkZW50aWZ5IEdyb3VwcwoKQ2hhcHRlciA2OiBHcm91cHMgYW5kIFBvc2l0aW9ucyBpbiBDb21wbGV0ZSBOZXR3b3JrcyBvZiBTTkEgYW5kCkVkdWNhdGlvbiBbQGNhcm9sYW4yMDE0XSBpbnRyb2R1Y2VzIGJvdGggImJvdHRvbSB1cCIgYW5kICJ0b3AgZG93biIKYXBwcm9hY2hlcyBmb3IgaWRlbnRpZnlpbmcgZ3JvdXBzIGluIGEgbmV0d29yaywgYXMgd2VsbCBhcyB3aHkKcmVzZWFyY2hlcnMgbWF5IGJlIGludGVyZXN0ZWQgaW4gZXhwbG9yaW5nIHRoZXNlIGdyb3Vwcy4gSGUgYWxzbyBub3Rlcwp0aGF0OgoKPiBVbmxpa2UgbW9zdCBzb2NpYWwgc2NpZW5jZSwgdGhlIGlkZWEgaXMgdG8gaWRlbnRpZnkgdGhlc2UgZ3JvdXBzCj4gdGhyb3VnaCB0aGVpciByZWxhdGlvbmFsIGRhdGEsIG5vdCBhbiBleG9nZW5vdXMgYXR0cmlidXRlIHN1Y2ggYXMKPiBncmFkZSBsZXZlbCwgZGVwYXJ0bWVudGFsIGFmZmlsaWF0aW9uLCBvciB5ZWFycyBvZiBleHBlcmllbmNlLsKgCgpJbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGJyaWVmbHkgZXhwbG9yZSBhICJ0b3AgZG93biIgYXBwcm9hY2ggdG8KaWRlbnRpZnlpbmcgdGhlc2UgZ3JvdXBzIHRocm91Z2ggdGhlIHVzZSBvZiBjb21tdW5pdHkgZGV0ZWN0aW9uCmFsZ29yaXRobXMuCgojIyMgQ29tbXVuaXR5IERldGVjdGlvbgoKU2ltaWxhciB0byB0aGUgcmFuZ2Ugb2YgZnVuY3Rpb25zIGluY2x1ZGVkIGZvciBjYWxjdWxhdGluZyBub2RlIGFuZCBlZGdlCmNlbnRyYWxpdHksIHRoZSB7dGlkeWdyYXBofSBwYWNrYWdlIGluY2x1ZGVzIHZhcmlvdXMgY2x1c3RlcmluZwpmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHtpZ3JhcGh9IHBhY2thZ2UuIFNvbWUgb2YgdGhlc2UgYWxnb3JpdGhtcyBhcmUKZGVzaWduZWQgZm9yIGRpcmVjdGVkIGdyYXBocywgd2hpbGUgb3RoZXJzIGFyZSBmb3IgdW5kaXJlY3RlZCBncmFwaHMuCgpBbHNvIHNpbWlsYXIgdG8gY2FsY3VsYXRpbmcgY2VudHJhbGl0eSBtZWFzdXJlcywgd2UgbmVlZCB0byBgYWN0aXZhdGUoKWAKb3VyIG5vZGVzIGZpcnN0IGJlZm9yZSBhcHBseWluZyB0aGVzZSBjb21tdW5pdHkgZGV0ZWN0aW9uIGFsZ29yaXRobXMgdG8KYXNzaWduIG91ciBub2RlcyB0byBncm91cHMuCgpGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgYW5kIGJlY2F1c2UgdGhlcmUgc2VlbSB0byBiZSBzb21lIG9idmlvdXMKZ3JvdXBzIGJhc2VkIG9uIG5ldHdvcmsgY29tcG9uZW50cywgbGV0J3MgZ3JvdXAgb3VyIG5vZGVzIHVzaW5nIHRoZQpgZ3JvdXBfY29tcG9uZW50cygpYCBhbG9uZyB3aXRoIHRoZSBgbXV0YXRlKClgIGZ1bmN0aW9uIGZyb20ge2RwbHlyfSB0bwpjcmVhdGUgYSBuZXcgYGdyb3VwYCB2YXJpYWJsZSB0byBvdXIgbm9kZWxpc3QgdGhhdCBwcm92aWRlcyBhIHZhbHVlCmJhc2VkIG9uIHRoZSBjb21wb25lbnQgdG8gd2hpY2ggZWFjaCBub2RlIGJlbG9uZ3MuCgpSdW4gdGhlIGZvbGxvd2luZyBjb2RlIHRvIGdyb3VwIG91ciBub2RlcyBhbmQgcHJpbnQgb3VyIG5ldwpgY2Njc3NfbmV0d29ya19ncm91cHNgIG9iamVjdCBhbmQgdGFrZSBhIHF1aWNrIGxvb2s6CgpgYGB7cn0KY2Nzc19uZXR3b3JrX2dyb3VwcyA8LSBjY3NzX25ldHdvcmsgJT4lCiAgYWN0aXZhdGUobm9kZXMpICU+JQogIG11dGF0ZShncm91cCA9IGdyb3VwX2NvbXBvbmVudHMoKSkKICAKY2Nzc19uZXR3b3JrX2dyb3VwcwpgYGAKCk5vdyB0aGF0IHdlJ3ZlIGFzc2lnbmVkIG91ciBub2RlcyB0byBhIGdyb3VwLCBsZXQncyBhZGQgb25lIGZpbmFsIGxheWVyCnRvIG91ciBzb2Npb2dyYW0gZnJvbSBhYm92ZSBieSB1c2luZyB0aGUgYGdlb21fbm9kZV92b3Jvbm9pKClgIGZ1bmN0aW9uCnRvIGNvbG9yIG91ciBub2RlcyBieSBncm91cCBhc3NpZ25tZW50IGFuZCBjaGFuZ2luZyBvdXIgZ3JvdXAgbnVtYmVycyB0bwpmYWN0b3JzIHNvIGVhY2ggZ3JvdXAgaXMgYSBkaXN0aW5jdCBjb2xvcjoKCmBgYHtyfQpjY3NzX25ldHdvcmtfZ3JvdXBzICU+JQogIGdncmFwaChsYXlvdXQgPSAiZnIiKSArIAogIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IG91dF9kZWdyZWUsIAogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBvdXRfZGVncmVlKSwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IGFjdG9ycywgCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3V0X2RlZ3JlZSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG91dF9kZWdyZWUpLCAKICAgICAgICAgICAgICAgICAgICAgcmVwZWw9VFJVRSwKICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lZGdlX2xpbmsoYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEsICdtbScpKSwgCiAgICAgICAgICAgICAgICAgZW5kX2NhcCA9IGNpcmNsZSgzLCAnbW0nKSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IC4yKSArIAogIHRoZW1lX2dyYXBoKCkgKyAKICBnZW9tX25vZGVfdm9yb25vaShhZXMoZmlsbCA9IGZhY3Rvcihncm91cCksCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC4wNSksIAogICAgICAgICAgICAgICAgICAgIG1heC5yYWRpdXMgPSAuNSwKICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSAKYGBgCgpJJ20gbm90IGVudGlyZWx5IHN1cmUgdGhpcyB3YXMgYW4gaW1wcm92ZW1lbnQgdG8gb3VyIHNvY2lvZ3JhbSBidXQgaXQKZGVmaW5pdGVseSBpcyBjb2xvcmZ1bCEhCgojIyA0Yi4gSWRlbnRpZnkgU2VudGltZW50CgpSZWNhbGwgZnJvbSB0aGUgUHJlcGFyZSBzZWN0aW9uIHRoYXQgdGhlIGZpbmFsIHF1ZXN0aW9uIGd1aWRpbmcgdGhpcwphbmFseXNpcyB3YXM6Cgo+IFdoaWNoIGFjdG9ycyBpbiBvdXIgbmV0d29yayB0ZW5kIHRvIGJlIG1vcmUgb3Bwb3NlZCB0byB0aGUgQ29tbW9uCj4gQ29yZT8KCkluIHRoaXMgc2VjdGlvbiwgd2UnbGwgdXNlIHRoZSB7dmFkZXJ9IHBhY2thZ2UgZm9yIHNlbnRpbWVudCBhbmFseXNpcwppbnRyb2R1Y2UgaW4gVW5pdCAzIHRvIGhlbHAgYW5zd2VyIHRoaXMgcXVlc3Rpb24uCgojIyMgKirwn5GJIFlvdXIgVHVybioqICoq4qS1KioKCkluIHRoZSBjb2RlIGNodW5rIGJlbG93LCB1c2UgdGhlIGB2YWRlcl9kZigpYCBmdW5jdGlvbiB0byBwZXJmb3JtCnNlbnRpbWVudCBhbmFseXNpcyBvbiB0aGUgYHRleHRgIGluIG91ciBgY2Nzc190d2VldHNgIGRhdGEgZnJhbWUgY3JlYXRlZAphYm92ZSwgc2F2ZSBhcyBgc3VtbWFyeV92YWRlcmAgYW5kIGluc3BlY3QgdGhlIHJlc3VsdHMuICoqSGludDoqKiBZb3UKd2lsbCBuZWVkIHRvIHVzZSB0aGUgYCRgIG9wZXJhdG9yIHRvIHNlbGVjdCB0aGUgYHRleHRgIGNvbHVtbiBjb250YWluaW5nCm91ciB0d2VldHMuCgpgYGB7cn0Kc3VtbWFyeV92YWRlciA8LSB2YWRlcl9kZihjY3NzX3R3ZWV0cyR0ZXh0KQoKc3VtbWFyeV92YWRlcgpgYGAKClJlY2FsbCB0aGF0IHRoZSBgY29tcG91bmRgwqBzY29yZSBpcyB0aGUgb25lIG1vc3QgY29tbW9ubHkgdXNlZCBmb3IKc2VudGltZW50IGFuYWx5c2lzIGJ5IG1vc3QgcmVzZWFyY2hlcnMsIGFuZCBpcyBjb21wdXRlZCBieSBzdW1taW5nIHRoZQp2YWxlbmNlIHNjb3JlcyBvZiBlYWNoIHdvcmQgaW4gdGhlIGxleGljb24sIGFkanVzdGVkIGFjY29yZGluZyB0byB0aGUKcnVsZXMsIGFuZCB0aGVuIG5vcm1hbGl6ZWQgdG8gYmUgYmV0d2VlbiAtMSAobW9zdCBleHRyZW1lIG5lZ2F0aXZlKSBhbmQKKzEgKG1vc3QgZXh0cmVtZSBwb3NpdGl2ZSkuCgpOb3cgdXNlIHRoZSBgaW5uZXJfam9pbigpYCBmdW5jdGlvbiBpbnRyb2R1Y2VkIGluIHRoZSBbSm9pbiBEYXRhIFNldHMKUHJpbWVyXShodHRwczovL3JzdHVkaW8uY2xvdWQvbGVhcm4vcHJpbWVycy80LjMpIHRvIGFkZCB0aGVzZSBzZW50aW1lbnQKc2NvcmVzIHZhbHVlcyBiYWNrIHRvIG91ciB0d2VldHMgYnkgam9pbmluZyBgc3VtbWFyeV92YWRlcmAgYW5kCmBjY3NzX3R3ZWV0c2AgYW5kIHVzaW5nIGBieSA9ICJ0ZXh0ImAgYXMgdGhlIGtleSBmb3IgbWF0Y2hpbmcgYm90aCBkYXRhCmZyYW1lczoKCmBgYHtyfQp0d2VldF9zZW50aW1lbnQgPC1pbm5lcl9qb2luKHN1bW1hcnlfdmFkZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjc3NfdHdlZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gInRleHQiKSAlPiUKICBzZWxlY3Qoc2NyZWVuX25hbWUsIGNvbXBvdW5kLCApCmBgYAoKIyMjIyBTdW1tYXJpemUgU2VudGltZW50CgpOb3cgdGhhdCB5b3UgaGF2ZSB0aGVzZSBqb2luZWQsIGxldCdzIGdyb3VwIG91ciBkYXRhIGJ5IGVhY2ggdXNlcidzCmBzY3JlZW5fbmFtZWAgYW5kIHN1bW1hcml6ZSB0aGVpciBtZWFuIGBjb21wb3VuZGAgc2VudGltZW50IHNjb3JlOgoKYGBge3J9CnVzZXJfc2VudGltZW50IDwtIHR3ZWV0X3NlbnRpbWVudCAlPiUKICBncm91cF9ieShzY3JlZW5fbmFtZSkgJT4lCiAgc3VtbWFyaXNlKHNlbnRpbWVudCA9IG1lYW4oY29tcG91bmQpKQpgYGAKCk5vdGUgdGhhdCB3ZSBoYXZlIGVmZmVjdGl2ZWx5IGp1c3QgY3JlYXRlZCBzb21lIG5ldyBub2RlIGFuZCBlZGdlCiJhdHRyaWJ1dGVzIiB0aGF0IGNvdWxkIGJlIGluY29ycG9yYXRlZCBpbnRvIG91ciBuZXR3b3JrIHZpc3VhbGl6YXRpb24KdG8gcG90ZW50aWFsbHkgaGVscCB1bmRlcnN0YW5kIHdoeSBncm91cHMgbWF5IGhhdmUgZm9ybWVkIGFzIHRoZXkgZGlkLgoKIyMjICoq8J+RiSBZb3VyIFR1cm4qKiAqKuKktSoqCgpSZWNhbGwgZnJvbSB0aGUgUHJlcGFyZSBzZWN0aW9uIHRoYXQgdGhlIGZpbmFsIHF1ZXN0aW9uIGd1aWRpbmcgdGhpcwphbmFseXNpcyB3YXM6Cgo+IFdoaWNoIGFjdG9ycyBpbiBvdXIgbmV0d29yayB0ZW5kIHRvIGJlIG1vcmUgb3Bwb3NlZCB0byB0aGUgQ29tbW9uCj4gQ29yZT8KClVzZSB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBpbnNwZWN0IG91ciBkYXRhIGZyYW1lIGFuZCBhbnN3ZXIgdGhlCnF1ZXN0aW9uIGFib3ZlIGluIHRoZSBzcGFjZSBiZWxvdzoKCmBgYHtyLCBldmFsPUZBTFNFfQp1c2VyX3NlbnRpbWVudApgYGAKCi0gICBZT1VSIFJFU1BPTlNFIEhFUkUKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyA1LiBDT01NVU5JQ0FURQoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSBmb2N1c2VkIG9uIHRoZSBsaXRlcmF0dXJlIGd1aWRpbmcgb3VyIGFuYWx5c2lzOwp3cmFuZ2xpbmcgb3VyIGRhdGEgaW50byBhIG5ldHdvcmsgb2JqZWN0OyBleGFtaW5pbmcgYmFzaWMgbmV0d29yawpjZW50cmFsaXR5IG1lYXN1cmVzOyBhbmQgaWRlbnRpZnlpbmcgZ3JvdXBzIGFuZCBzZW50aW1lbnQgaW4gdHdlZXRzCmFib3V0IHRoZSBDQ1NTIGN1cnJpY3VsdW0gc3RhbmRhcmRzLgoKSW4gcmVzcG9uc2UgdG8gdGhlIGZvbGxvd2luZyByZXNlYXJjaCBxdWVzdGlvbnMgZHJpdmluZyB0aGlzIGFuYWx5c2lzLAp3cml0ZSBhIDItMyBzZW50ZW5jZXMgc3VtbWFyaXppbmcgb3VyIGZpbmRpbmdzOgoKMS4gIFdobyBhcmUgdGhlIG1haW4gdHJhbnNtaXR0ZXJzLCB0cmFuc2NlaXZlcnMsIGFuZCB0cmFuc2NlbmRlcnMgaW4gb3VyCiAgICBDb21tb24gQ29yZSBUd2l0dGVyIG5ldHdvcms/CgogICAgLSAgIAoKMi4gIFdoYXQgc3ViZ3JvdXBzLCBvciBmYWN0aW9ucywgZXhpc3RlZCBpbiBvdXIgbmV0d29yaz8KCiAgICAtICAgCgozLiAgV2hpY2ggYWN0b3JzIGluIG91ciBuZXR3b3JrIHRlbmRlZCB0byBiZSBtb3JlIG9wcG9zZWQgdG8gdGhlIENvbW1vbgogICAgQ29yZT8KCiAgICAtICAgCgpGaW5hbGx5LCBhZGQgMS0yIHNlbnRlbmNlcyBpbiByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIHByb21wdHM6CgoxLiAgT25lIGltcG9ydGFudCB0aGluZyBJIHRvb2sgYXdheSBmcm9tIHRoaXMgdW5pdCBhYm91dCBuZXR3b3JrIG5ldHdvcmsKICAgIGFuYWx5c2lzOgoKICAgIC0gICAKCjIuICBPbmUgdGhpbmcgYWJvdXQgbmV0d29yayBhbmFseXNpcyBJIHdhbnQgdG8gbGVhcm4gbW9yZSBhYm91dDoKCiAgICAtICAgCgojIyMg8J+ntiBLbml0ICYgQ2hlY2sg4pyFCgpDb25ncmF0dWxhdGlvbnMgLSB5b3UndmUgY29tcGxldGVkIHlvdXIgZmlyc3QgdGV4dCBtaW5pbmcgY2FzZSBzdHVkeSEgVG8KY29tcGxldGUgeW91ciB3b3JrLCB5b3UgY2FuIGNsaWNrIHRoZSBkcm9wIGRvd24gYXJyb3cgYXQgdGhlIHRvcCBvZiB0aGUKZmlsZSwgdGhlbiBzZWxlY3QgIktuaXQgdG9wIEhUTUwiLiBUaGlzIHdpbGwgY3JlYXRlIGEgcmVwb3J0IGluIHlvdXIKRmlsZXMgcGFuZSB0aGF0IHNlcnZlcyBhcyBhIHJlY29yZCBvZiB5b3VyIGNvZGUgYW5kIGl0cyBvdXRwdXQgeW91IGNhbgpvcGVuIG9yIHNoYXJlLgoKIyMjIFJlZmVyZW5jZXMK