Welcome!

Welcome to the Notebook accompanying the research project “Performing an Invisibility Spell”. This notebook is a way of adding transparency to said project by showing the code and procedures that yielded several data visualizations used in the aforementioned paper. For the operations made using Cortex, kindly refer to the link provided in the paper. In order to make this notebook as transparent as possible, each snip of code is explained, either before the code itself or using comments next to the code (the latter are introduced by a Hashtag)

Introductory Steps

We start by loading the extension “tidyverse”, which will aid us throughout the project (providing syntactic expressions like the pipeline operators "%>% as well as the ggplot and grepl functions that we will use to produce graphs and search for particular occurrences in our corpus).

library(tidyverse)
package 㤼㸱tidyverse㤼㸲 was built under R version 4.0.2Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.2     v purrr   0.3.4
v tibble  3.0.3     v dplyr   1.0.2
v tidyr   1.1.2     v stringr 1.4.0
v readr   1.4.0     v forcats 0.5.0
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.2package 㤼㸱tibble㤼㸲 was built under R version 4.0.2package 㤼㸱tidyr㤼㸲 was built under R version 4.0.2package 㤼㸱readr㤼㸲 was built under R version 4.0.2package 㤼㸱purrr㤼㸲 was built under R version 4.0.2package 㤼㸱dplyr㤼㸲 was built under R version 4.0.2package 㤼㸱stringr㤼㸲 was built under R version 4.0.2package 㤼㸱forcats㤼㸲 was built under R version 4.0.2-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

Afterwards, we are telling R to read our 252 articles. They are formatted in a tabular way using the tsv format. Please do note that this is a simplification of the results gathered from Factiva. It does not contain some of the rich meta-data indexed by Factiva (ex: regions mentioned in the article) simply because we will not use them in this exploration. Furthermore, in order to make our visualizations readable, I decided to re-code the column “Publicatio” (the publication date of a given article) and assign months (format: Year/Month) rather than the day when an article was published.

article_by_month = read_tsv("252good.tsv")

-- Column specification --------------------------------------------------------
cols(
  Headline = col_character(),
  article_fu = col_character(),
  Publicatio = col_character()
)

The next command allows us to manually explore our corpus.

view(article_by_month)

We can see that our corpus contains the headlines of a given article (column “Headline”), the full text of the article (column “article_fu”) and their publication dates (column “Publicatio”)

Basic Exploration of our corpus: Frequencies of Publication

The next piece of code will produce a bar chart showing the frequency of our articles over time.

ggplot(article_by_month)+ #We are asking the ggplot function to take our corpus as the data to graph
  aes(Publicatio) + #The X axis should be the publication date
  geom_bar(colour = 'green', alpha=0.2) + #We want a green bar chart
  labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about migration and the Kerala Floods/Landslides (August 2019-May 2020)") #These are the labels we want

In the graph above, we can see that the media focused on publishing articles on human migration in the context on the Kerala floods and landslides of 2019 chiefly in August and September 2019. The immediate months during/after the disaster. Indeed, most of our articles belong to this time period (around 200). The publication of articles on human mobility and the Kerala floods/disaster never died off. However, it decreased from October 2019 onwards and experienced a surge in March 2020 that continues throughout April 2020. Lastly, the month of May 2020 should be taken with a pinch of salt since we only have data for the articles published on the first 11 days of May (hence, it makes sense for the number of articles contained in our corpus to be smaller).

Now, just to visualize our data differently, let’s create a new graph, this time we will ignore the limited data we have for May 2020.

We start by selecting the articles published from August 2019 to April 2020

articles_August_April = article_by_month %>%
  select(Publicatio) %>%
  filter(grepl("2019/08|2019/09|2019/10|2019/11|2019/12|2020/01|2020/02|2020/03|2020/04", Publicatio))

And we create a new graph

ggplot(articles_August_April)+ #We are asking the ggplot function to take our corpus as the data to graph
  aes(Publicatio) + #The X axis should be the publication date
  geom_bar(colour = 'blue', alpha=0.2) + #We want a blue bar chart to differentiate it from our previous graph
  labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about migration and the Kerala Floods/Landslides (August 2019-April 2020)") #These are the labels we want

articles_August_September = article_by_month %>%
  select(Publicatio) %>%
  filter(grepl("2019/08|2019/09", Publicatio))
  count(articles_August_September)

Lastly, since we would like to tell exactly how many articles were published in the two months with the highest frequencies, we will run the following script.

articles_August_September = article_by_month %>%
  select(Publicatio) %>% #We are asking R to select the date of publication as our variable of interest
  filter(grepl("2019/08|2019/09", Publicatio)) #Now, we are searching for articles published either on August 2019 or September 2019
  count(articles_August_September)

A total of 183 articles were published during the first two months.

Checking for mentions of the Adivasi communities

We understand that saying that articles talking about human mobility in the context of the Kerala floods and landslides in 2019 did not portray adivasi communities is a bold claim. Therefore, we would not be surprised if readers are unconvinced by just saying that Adivasis were not represented by the anglophone media on the basis that no mention of these communities appeared on our extracted list of the 500 most frequent terms.

This script is a rudimentary qualification of that claim, we are searching for any reference to adivasis made by the media when they talked about human migration in the context of the Kerala floods and landslides from August 2019 to May 2020

articles_adivasis = article_by_month %>%
  select(Headline, article_fu, Publicatio) %>% #We are asking R to select the full text of our articles and the headlines
  mutate(article_fu = tolower(article_fu)) %>% # Here, we are mutating the full text of our articles into lower cases to go around the case sensitivity of our next function.
  filter(grepl("adivasi|adivasis|tribal|tribe|tribes|forest dwelling|forest dweller|forest dwellers", article_fu)) #Now, we are searching for articles that mention adivasis in anyway collected in our dictionary. Note: The term forest dwelling and forest dwellers is a legalistic term used by the Indian government to refer to Adivasis in laws like the "The Scheduled Tribes and Other Traditional Forest Dwellers Act"
  view(articles_adivasis)
  count(articles_adivasis)

The count of articles shows that only 8 out of 252 articles mentioned Adivasis. A minor number of articles indeed. Out of those 8 articles, 5 talked about Adivasis in a passing way. For those five articles published in throughout August and September 2019, the main topic was the visit of Rahul Gandhi (the leader of the Congress Party) to his constituency, Wayanad in Northern Kerala, were he “patiently heard the woes of the people who were displaced” (The Week, September 2019). Two mentions of adivasis were done on specialized media like “Economic and Political Weekly”. A weekly journal of the social sciences were one article mentioned the case of adivasis as an example of how vulnerable migrants carry out informal jobs in New Delhi and, another article, of how the credibility of official statistics needs to be increased. The last article that our search query identified as talking about Adivasis was a letter to the editor of the newspaper “Scroll In” where the author talked about tribal communities in the Narmada valley (North India). Thus, we can say not only that only a minor number of articles used words like “Adivasi”, “tribal” or “forest dweller” but that, when they did so they were passing mentions where the main focus of interest was not the Adivasis.

Discerning between two discourses: Checking for mentions of COVID 19

As shown in our first bar chart, there was a resurgences of articles talking about human mobility in the context of the Kerala floods and landslides in March 2020.

Following our distant reading conducted on Cortext, we suspect that said surge is due to the COVID epidemic and instances that used the Kerala floods and landslides of 2019 as a reference point to human migration related to COVID-19. We will check for this in the next section.

We will start by finding mentions of COVID 19 in our corpus.

covid_ocurrances = article_by_month %>% 
  select(article_fu, Publicatio) %>% # We are selection our fields of interest, the full text of a given article and its publication date
  mutate(article_fu = tolower(article_fu)) %>% # Here, we are mutating the full text of our articles into lower cases to go around the case sensitivity of our next function.
  filter(grepl("covid|corona|coronavirus|covid-19|covid 19", article_fu)) #Lastly, we are asking R to find articles that used words referring to COVID-19 in their full texts.
  view(covid_ocurrances)
  count(covid_ocurrances)

We have a total of 35 articles that talk about COVID 19. Let’s graph their distribution across time next

ggplot(covid_ocurrances)+ #We are asking the ggplot function to take our search for mentions of COVID-19 as the data to graph
  aes(Publicatio) + #We specify that the X axis should be the publication date
  geom_bar(colour = 'deeppink3', alpha=0.2) + #We want a pink graph chart, the alpha of 0.2 refers to the background color
  labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about COVID-19 in the context of migration and the Kerala Floods and Landslides (August 2019-May 2020)") #Lastly, we are labeling our graph

This is all well and good, but a curious reader might ask him/herself how does the frequency of articles talking about COVID 19 compares to those who do not. Fear not, we will take care of it now by searching for how many articles were published from February 2020 onwards.

articles_from_april_onwards = article_by_month %>%
  select(Publicatio) %>% #This time we are focusing on the publication date rather than the text of articles
  filter(grepl("2020/02|2020/03|2020/04|2020/05", Publicatio)) #Now, we are searching for articles in our corpus published from the first mention of COVID 19 (February 2020) onward.
view(articles_from_april_onwards) #This command allows us to manually explore our results
count(articles_from_april_onwards)

In total, 43 articles were published from February 2020 onwards. Comparing this figure to the 35 articles than included COVID 19 we can say that from February onwards, COVID-19 reigned in the media’s discourse surrounding human mobility and the Kerala floods/landslides of 2019.

LS0tDQp0aXRsZTogIk5vdGVib29rIFBlcmZvcm1pbmcgYW4gSW52aXNpYmlsaXR5IFNwZWxsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBXZWxjb21lIQ0KV2VsY29tZSB0byB0aGUgTm90ZWJvb2sgYWNjb21wYW55aW5nIHRoZSByZXNlYXJjaCBwcm9qZWN0ICJQZXJmb3JtaW5nIGFuIA0KSW52aXNpYmlsaXR5IFNwZWxsIi4gVGhpcyBub3RlYm9vayBpcyBhIHdheSBvZiBhZGRpbmcgdHJhbnNwYXJlbmN5IHRvIHNhaWQNCnByb2plY3QgYnkgc2hvd2luZyB0aGUgY29kZSBhbmQgcHJvY2VkdXJlcyB0aGF0IHlpZWxkZWQgc2V2ZXJhbCBkYXRhDQp2aXN1YWxpemF0aW9ucyB1c2VkIGluIHRoZSBhZm9yZW1lbnRpb25lZCBwYXBlci4gRm9yIHRoZSBvcGVyYXRpb25zDQptYWRlIHVzaW5nIENvcnRleCwga2luZGx5IHJlZmVyIHRvIHRoZSBsaW5rIHByb3ZpZGVkIGluIHRoZSBwYXBlci4NCkluIG9yZGVyIHRvIG1ha2UgdGhpcyBub3RlYm9vayBhcyB0cmFuc3BhcmVudCBhcyBwb3NzaWJsZSwgZWFjaCBzbmlwIG9mIGNvZGUNCmlzIGV4cGxhaW5lZCwgZWl0aGVyIGJlZm9yZSB0aGUgY29kZSBpdHNlbGYgb3IgdXNpbmcgY29tbWVudHMgbmV4dCB0byB0aGUgY29kZQ0KKHRoZSBsYXR0ZXIgYXJlIGludHJvZHVjZWQgYnkgYSBIYXNodGFnKQ0KDQojIEludHJvZHVjdG9yeSBTdGVwcw0KV2Ugc3RhcnQgYnkgbG9hZGluZyB0aGUgZXh0ZW5zaW9uICJ0aWR5dmVyc2UiLCB3aGljaCB3aWxsIGFpZCB1cyB0aHJvdWdob3V0DQp0aGUgcHJvamVjdCAocHJvdmlkaW5nIHN5bnRhY3RpYyBleHByZXNzaW9ucyBsaWtlIHRoZSBwaXBlbGluZSBvcGVyYXRvcnMgDQoiJT4lIGFzIHdlbGwgYXMgdGhlIGdncGxvdCBhbmQgZ3JlcGwgZnVuY3Rpb25zIHRoYXQgd2Ugd2lsbCB1c2UgdG8gcHJvZHVjZSBncmFwaHMgYW5kDQpzZWFyY2ggZm9yIHBhcnRpY3VsYXIgb2NjdXJyZW5jZXMgaW4gb3VyIGNvcnB1cykuDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KQWZ0ZXJ3YXJkcywgd2UgYXJlIHRlbGxpbmcgUiB0byByZWFkIG91ciAyNTIgYXJ0aWNsZXMuIFRoZXkgYXJlIGZvcm1hdHRlZA0KaW4gYSB0YWJ1bGFyIHdheSB1c2luZyB0aGUgdHN2IGZvcm1hdC4gUGxlYXNlIGRvIG5vdGUgdGhhdCB0aGlzIGlzIGENCnNpbXBsaWZpY2F0aW9uIG9mIHRoZSByZXN1bHRzIGdhdGhlcmVkIGZyb20gRmFjdGl2YS4gSXQgZG9lcyBub3QgY29udGFpbiBzb21lDQpvZiB0aGUgcmljaCBtZXRhLWRhdGEgaW5kZXhlZCBieSBGYWN0aXZhIChleDogcmVnaW9ucyBtZW50aW9uZWQgaW4gdGhlIGFydGljbGUpDQpzaW1wbHkgYmVjYXVzZSB3ZSB3aWxsIG5vdCB1c2UgdGhlbSBpbiB0aGlzIGV4cGxvcmF0aW9uLiBGdXJ0aGVybW9yZSwgaW4gb3JkZXINCnRvIG1ha2Ugb3VyIHZpc3VhbGl6YXRpb25zIHJlYWRhYmxlLCBJIGRlY2lkZWQgdG8gcmUtY29kZSB0aGUgY29sdW1uICJQdWJsaWNhdGlvIg0KKHRoZSBwdWJsaWNhdGlvbiBkYXRlIG9mIGEgZ2l2ZW4gYXJ0aWNsZSkgYW5kIGFzc2lnbiBtb250aHMgKGZvcm1hdDogWWVhci9Nb250aCkNCnJhdGhlciB0aGFuIHRoZSBkYXkgd2hlbiBhbiBhcnRpY2xlIHdhcyBwdWJsaXNoZWQuDQoNCmBgYHtyfQ0KYXJ0aWNsZV9ieV9tb250aCA9IHJlYWRfdHN2KCIyNTJnb29kLnRzdiIpDQoNCmBgYA0KVGhlIG5leHQgY29tbWFuZCBhbGxvd3MgdXMgdG8gbWFudWFsbHkgZXhwbG9yZSBvdXIgY29ycHVzLg0KDQpgYGB7cn0NCnZpZXcoYXJ0aWNsZV9ieV9tb250aCkNCmBgYA0KDQpXZSBjYW4gc2VlIHRoYXQgb3VyIGNvcnB1cyBjb250YWlucyB0aGUgaGVhZGxpbmVzIG9mIGEgZ2l2ZW4gYXJ0aWNsZSAoY29sdW1uICAgICAiSGVhZGxpbmUiKSwgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgYXJ0aWNsZSAoY29sdW1uICJhcnRpY2xlX2Z1IikgYW5kIHRoZWlyDQpwdWJsaWNhdGlvbiBkYXRlcyAoY29sdW1uICJQdWJsaWNhdGlvIikNCg0KIyBCYXNpYyBFeHBsb3JhdGlvbiBvZiBvdXIgY29ycHVzOiBGcmVxdWVuY2llcyBvZiBQdWJsaWNhdGlvbg0KDQpUaGUgbmV4dCBwaWVjZSBvZiBjb2RlICB3aWxsIHByb2R1Y2UgYSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgZnJlcXVlbmN5IG9mIG91cg0KYXJ0aWNsZXMgb3ZlciB0aW1lLg0KDQpgYGB7cn0NCmdncGxvdChhcnRpY2xlX2J5X21vbnRoKSsgI1dlIGFyZSBhc2tpbmcgdGhlIGdncGxvdCBmdW5jdGlvbiB0byB0YWtlIG91ciBjb3JwdXMgYXMgdGhlIGRhdGEgdG8gZ3JhcGgNCiAgYWVzKFB1YmxpY2F0aW8pICsgI1RoZSBYIGF4aXMgc2hvdWxkIGJlIHRoZSBwdWJsaWNhdGlvbiBkYXRlDQogIGdlb21fYmFyKGNvbG91ciA9ICdncmVlbicsIGFscGhhPTAuMikgKyAjV2Ugd2FudCBhIGdyZWVuIGJhciBjaGFydA0KICBsYWJzKHg9Ik1vbnRoIG9mIFB1YmxpY2F0aW9uIiwgeT0iTnVtYmVyIG9mIEFydGljbGVzIiwgdGl0bGUgPSAiQXJ0aWNsZXMgdGFsa2luZyBhYm91dCBtaWdyYXRpb24gYW5kIHRoZSBLZXJhbGEgRmxvb2RzL0xhbmRzbGlkZXMgKEF1Z3VzdCAyMDE5LU1heSAyMDIwKSIpICNUaGVzZSBhcmUgdGhlIGxhYmVscyB3ZSB3YW50DQpgYGANCg0KSW4gdGhlIGdyYXBoIGFib3ZlLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIG1lZGlhIGZvY3VzZWQgb24gcHVibGlzaGluZyBhcnRpY2xlcyBvbg0KaHVtYW4gbWlncmF0aW9uIGluIHRoZSBjb250ZXh0IG9uIHRoZSBLZXJhbGEgZmxvb2RzIGFuZCBsYW5kc2xpZGVzIG9mIDIwMTkNCmNoaWVmbHkgaW4gQXVndXN0IGFuZCBTZXB0ZW1iZXIgMjAxOS4gVGhlIGltbWVkaWF0ZSBtb250aHMgZHVyaW5nL2FmdGVyIHRoZQ0KZGlzYXN0ZXIuIEluZGVlZCwgbW9zdCBvZiBvdXIgYXJ0aWNsZXMgYmVsb25nIHRvIHRoaXMgdGltZSBwZXJpb2QgKGFyb3VuZCAyMDApLg0KVGhlIHB1YmxpY2F0aW9uIG9mIGFydGljbGVzIG9uIGh1bWFuIG1vYmlsaXR5IGFuZCB0aGUgS2VyYWxhIGZsb29kcy9kaXNhc3Rlcg0KbmV2ZXIgZGllZCBvZmYuIEhvd2V2ZXIsIGl0IGRlY3JlYXNlZCBmcm9tIE9jdG9iZXIgMjAxOSBvbndhcmRzIGFuZCBleHBlcmllbmNlZA0KYSBzdXJnZSBpbiBNYXJjaCAyMDIwIHRoYXQgY29udGludWVzIHRocm91Z2hvdXQgQXByaWwgMjAyMC4gTGFzdGx5LCB0aGUgbW9udGggb2YNCk1heSAyMDIwIHNob3VsZCBiZSB0YWtlbiB3aXRoIGEgcGluY2ggb2Ygc2FsdCBzaW5jZSB3ZSBvbmx5IGhhdmUgZGF0YSBmb3IgdGhlDQphcnRpY2xlcyBwdWJsaXNoZWQgb24gdGhlIGZpcnN0IDExIGRheXMgb2YgTWF5IChoZW5jZSwgaXQgbWFrZXMgc2Vuc2UgZm9yIHRoZQ0KbnVtYmVyIG9mIGFydGljbGVzIGNvbnRhaW5lZCBpbiBvdXIgY29ycHVzIHRvIGJlIHNtYWxsZXIpLg0KDQpOb3csIGp1c3QgdG8gdmlzdWFsaXplIG91ciBkYXRhIGRpZmZlcmVudGx5LCBsZXQncyBjcmVhdGUgYSBuZXcgZ3JhcGgsIHRoaXMgdGltZQ0Kd2Ugd2lsbCBpZ25vcmUgdGhlIGxpbWl0ZWQgZGF0YSB3ZSBoYXZlIGZvciBNYXkgMjAyMC4NCg0KV2Ugc3RhcnQgYnkgc2VsZWN0aW5nIHRoZSBhcnRpY2xlcyBwdWJsaXNoZWQgZnJvbSBBdWd1c3QgMjAxOSB0byBBcHJpbCAyMDIwDQoNCmBgYHtyfQ0KYXJ0aWNsZXNfQXVndXN0X0FwcmlsID0gYXJ0aWNsZV9ieV9tb250aCAlPiUNCiAgc2VsZWN0KFB1YmxpY2F0aW8pICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIjIwMTkvMDh8MjAxOS8wOXwyMDE5LzEwfDIwMTkvMTF8MjAxOS8xMnwyMDIwLzAxfDIwMjAvMDJ8MjAyMC8wM3wyMDIwLzA0IiwgUHVibGljYXRpbykpDQpgYGANCkFuZCB3ZSBjcmVhdGUgYSBuZXcgZ3JhcGgNCg0KYGBge3J9DQpnZ3Bsb3QoYXJ0aWNsZXNfQXVndXN0X0FwcmlsKSsgI1dlIGFyZSBhc2tpbmcgdGhlIGdncGxvdCBmdW5jdGlvbiB0byB0YWtlIG91ciBjb3JwdXMgYXMgdGhlIGRhdGEgdG8gZ3JhcGgNCiAgYWVzKFB1YmxpY2F0aW8pICsgI1RoZSBYIGF4aXMgc2hvdWxkIGJlIHRoZSBwdWJsaWNhdGlvbiBkYXRlDQogIGdlb21fYmFyKGNvbG91ciA9ICdibHVlJywgYWxwaGE9MC4yKSArICNXZSB3YW50IGEgYmx1ZSBiYXIgY2hhcnQgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIG91ciBwcmV2aW91cyBncmFwaA0KICBsYWJzKHg9Ik1vbnRoIG9mIFB1YmxpY2F0aW9uIiwgeT0iTnVtYmVyIG9mIEFydGljbGVzIiwgdGl0bGUgPSAiQXJ0aWNsZXMgdGFsa2luZyBhYm91dCBtaWdyYXRpb24gYW5kIHRoZSBLZXJhbGEgRmxvb2RzL0xhbmRzbGlkZXMgKEF1Z3VzdCAyMDE5LUFwcmlsIDIwMjApIikgI1RoZXNlIGFyZSB0aGUgbGFiZWxzIHdlIHdhbnQNCmBgYA0KDQpgYGB7cn0NCmFydGljbGVzX0F1Z3VzdF9TZXB0ZW1iZXIgPSBhcnRpY2xlX2J5X21vbnRoICU+JQ0KICBzZWxlY3QoUHVibGljYXRpbykgJT4lDQogIGZpbHRlcihncmVwbCgiMjAxOS8wOHwyMDE5LzA5IiwgUHVibGljYXRpbykpDQogIGNvdW50KGFydGljbGVzX0F1Z3VzdF9TZXB0ZW1iZXIpDQpgYGANCg0KDQpMYXN0bHksIHNpbmNlIHdlIHdvdWxkIGxpa2UgdG8gdGVsbCBleGFjdGx5IGhvdyBtYW55IGFydGljbGVzIHdlcmUgcHVibGlzaGVkDQppbiB0aGUgdHdvIG1vbnRocyB3aXRoIHRoZSBoaWdoZXN0IGZyZXF1ZW5jaWVzLCB3ZSB3aWxsIHJ1biB0aGUgZm9sbG93aW5nDQpzY3JpcHQuDQoNCmBgYHtyfQ0KYXJ0aWNsZXNfQXVndXN0X1NlcHRlbWJlciA9IGFydGljbGVfYnlfbW9udGggJT4lDQogIHNlbGVjdChQdWJsaWNhdGlvKSAlPiUgI1dlIGFyZSBhc2tpbmcgUiB0byBzZWxlY3QgdGhlIGRhdGUgb2YgcHVibGljYXRpb24gYXMgb3VyIHZhcmlhYmxlIG9mIGludGVyZXN0DQogIGZpbHRlcihncmVwbCgiMjAxOS8wOHwyMDE5LzA5IiwgUHVibGljYXRpbykpICNOb3csIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGFydGljbGVzIHB1Ymxpc2hlZCBlaXRoZXIgb24gQXVndXN0IDIwMTkgb3IgU2VwdGVtYmVyIDIwMTkNCiAgY291bnQoYXJ0aWNsZXNfQXVndXN0X1NlcHRlbWJlcikNCmBgYA0KDQoNCkEgdG90YWwgb2YgMTgzIGFydGljbGVzIHdlcmUgcHVibGlzaGVkIGR1cmluZyB0aGUgZmlyc3QgdHdvIG1vbnRocy4NCg0KIyBDaGVja2luZyBmb3IgbWVudGlvbnMgb2YgdGhlIEFkaXZhc2kgY29tbXVuaXRpZXMNCg0KV2UgdW5kZXJzdGFuZCB0aGF0IHNheWluZyB0aGF0IGFydGljbGVzIHRhbGtpbmcgYWJvdXQgaHVtYW4gbW9iaWxpdHkgaW4gdGhlIA0KY29udGV4dCBvZiB0aGUgS2VyYWxhIGZsb29kcyBhbmQgbGFuZHNsaWRlcyBpbiAyMDE5IGRpZCBub3QgcG9ydHJheSBhZGl2YXNpDQpjb21tdW5pdGllcyBpcyBhIGJvbGQgY2xhaW0uIFRoZXJlZm9yZSwgd2Ugd291bGQgbm90IGJlIHN1cnByaXNlZCBpZiByZWFkZXJzDQphcmUgdW5jb252aW5jZWQgYnkganVzdCBzYXlpbmcgdGhhdCBBZGl2YXNpcyB3ZXJlIG5vdCByZXByZXNlbnRlZCBieSB0aGUNCmFuZ2xvcGhvbmUgbWVkaWEgb24gdGhlIGJhc2lzIHRoYXQgbm8gbWVudGlvbiBvZiB0aGVzZSBjb21tdW5pdGllcyBhcHBlYXJlZA0Kb24gb3VyIGV4dHJhY3RlZCBsaXN0IG9mIHRoZSA1MDAgbW9zdCBmcmVxdWVudCB0ZXJtcy4NCg0KVGhpcyBzY3JpcHQgaXMgYSBydWRpbWVudGFyeSBxdWFsaWZpY2F0aW9uIG9mIHRoYXQgY2xhaW0sIHdlIGFyZSBzZWFyY2hpbmcNCmZvciBhbnkgcmVmZXJlbmNlIHRvIGFkaXZhc2lzIG1hZGUgYnkgdGhlIG1lZGlhIHdoZW4gdGhleSB0YWxrZWQgYWJvdXQNCmh1bWFuIG1pZ3JhdGlvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgS2VyYWxhIGZsb29kcyBhbmQgbGFuZHNsaWRlcw0KZnJvbSBBdWd1c3QgMjAxOSB0byBNYXkgMjAyMA0KDQpgYGB7cn0NCmFydGljbGVzX2FkaXZhc2lzID0gYXJ0aWNsZV9ieV9tb250aCAlPiUNCiAgc2VsZWN0KEhlYWRsaW5lLCBhcnRpY2xlX2Z1LCBQdWJsaWNhdGlvKSAlPiUgI1dlIGFyZSBhc2tpbmcgUiB0byBzZWxlY3QgdGhlIGZ1bGwgdGV4dCBvZiBvdXIgYXJ0aWNsZXMgYW5kIHRoZSBoZWFkbGluZXMNCiAgbXV0YXRlKGFydGljbGVfZnUgPSB0b2xvd2VyKGFydGljbGVfZnUpKSAlPiUgIyBIZXJlLCB3ZSBhcmUgbXV0YXRpbmcgdGhlIGZ1bGwgdGV4dCBvZiBvdXIgYXJ0aWNsZXMgaW50byBsb3dlciBjYXNlcyB0byBnbyBhcm91bmQgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2Ygb3VyIG5leHQgZnVuY3Rpb24uDQogIGZpbHRlcihncmVwbCgiYWRpdmFzaXxhZGl2YXNpc3x0cmliYWx8dHJpYmV8dHJpYmVzfGZvcmVzdCBkd2VsbGluZ3xmb3Jlc3QgZHdlbGxlcnxmb3Jlc3QgZHdlbGxlcnMiLCBhcnRpY2xlX2Z1KSkgI05vdywgd2UgYXJlIHNlYXJjaGluZyBmb3IgYXJ0aWNsZXMgdGhhdCBtZW50aW9uIGFkaXZhc2lzIGluIGFueXdheSBjb2xsZWN0ZWQgaW4gb3VyIGRpY3Rpb25hcnkuIE5vdGU6IFRoZSB0ZXJtIGZvcmVzdCBkd2VsbGluZyBhbmQgZm9yZXN0IGR3ZWxsZXJzIGlzIGEgbGVnYWxpc3RpYyB0ZXJtIHVzZWQgYnkgdGhlIEluZGlhbiBnb3Zlcm5tZW50IHRvIHJlZmVyIHRvIEFkaXZhc2lzIGluIGxhd3MgbGlrZSB0aGUgIlRoZSBTY2hlZHVsZWQgVHJpYmVzIGFuZCBPdGhlciBUcmFkaXRpb25hbCBGb3Jlc3QgRHdlbGxlcnMgQWN0Ig0KICB2aWV3KGFydGljbGVzX2FkaXZhc2lzKQ0KICBjb3VudChhcnRpY2xlc19hZGl2YXNpcykNCmBgYA0KDQpUaGUgY291bnQgb2YgYXJ0aWNsZXMgc2hvd3MgdGhhdCBvbmx5IDggb3V0IG9mIDI1MiBhcnRpY2xlcyBtZW50aW9uZWQgQWRpdmFzaXMuIA0KQSBtaW5vciBudW1iZXIgb2YgYXJ0aWNsZXMgaW5kZWVkLiBPdXQgb2YgdGhvc2UgOCBhcnRpY2xlcywgNSB0YWxrZWQgYWJvdXQgQWRpdmFzaXMgaW4gYSBwYXNzaW5nIHdheS4gRm9yIHRob3NlIGZpdmUgYXJ0aWNsZXMgcHVibGlzaGVkIGluIHRocm91Z2hvdXQgQXVndXN0IGFuZCBTZXB0ZW1iZXIgMjAxOSwgdGhlIG1haW4gdG9waWMgd2FzIHRoZSB2aXNpdCBvZiBSYWh1bCBHYW5kaGkgKHRoZSBsZWFkZXIgb2YgdGhlIENvbmdyZXNzIFBhcnR5KSB0byBoaXMgY29uc3RpdHVlbmN5LCBXYXlhbmFkIGluIE5vcnRoZXJuIEtlcmFsYSwgd2VyZSBoZSAicGF0aWVudGx5IGhlYXJkIHRoZSB3b2VzIG9mIHRoZSBwZW9wbGUgd2hvIHdlcmUgZGlzcGxhY2VkIiAoVGhlIFdlZWssIFNlcHRlbWJlciAyMDE5KS4gVHdvIG1lbnRpb25zIG9mIGFkaXZhc2lzIHdlcmUgZG9uZSBvbiBzcGVjaWFsaXplZCBtZWRpYSBsaWtlICJFY29ub21pYyBhbmQgUG9saXRpY2FsIFdlZWtseSIuIEEgd2Vla2x5IGpvdXJuYWwgb2YgdGhlIHNvY2lhbCBzY2llbmNlcyB3ZXJlIG9uZSBhcnRpY2xlIG1lbnRpb25lZCB0aGUgY2FzZSBvZiBhZGl2YXNpcyBhcyBhbiBleGFtcGxlIG9mIGhvdyB2dWxuZXJhYmxlIG1pZ3JhbnRzIGNhcnJ5IG91dCBpbmZvcm1hbCBqb2JzIGluIE5ldyBEZWxoaSBhbmQsIGFub3RoZXIgYXJ0aWNsZSwgb2YgaG93IHRoZSBjcmVkaWJpbGl0eSBvZiBvZmZpY2lhbCBzdGF0aXN0aWNzIG5lZWRzIHRvIGJlIGluY3JlYXNlZC4gVGhlIGxhc3QgYXJ0aWNsZSB0aGF0IG91ciBzZWFyY2ggcXVlcnkgaWRlbnRpZmllZCBhcyB0YWxraW5nIGFib3V0IEFkaXZhc2lzIHdhcyBhIGxldHRlciB0byB0aGUgZWRpdG9yIG9mIHRoZSBuZXdzcGFwZXIgIlNjcm9sbCBJbiIgd2hlcmUgdGhlIGF1dGhvciB0YWxrZWQgYWJvdXQgdHJpYmFsIGNvbW11bml0aWVzIGluIHRoZSBOYXJtYWRhIHZhbGxleSAoTm9ydGggSW5kaWEpLiBUaHVzLCB3ZSBjYW4gc2F5IG5vdCBvbmx5IHRoYXQgb25seSBhIG1pbm9yIG51bWJlciBvZiBhcnRpY2xlcyB1c2VkIHdvcmRzIGxpa2UgIkFkaXZhc2kiLCAidHJpYmFsIiBvciAiZm9yZXN0IGR3ZWxsZXIiIGJ1dCB0aGF0LCB3aGVuIHRoZXkgZGlkIHNvIHRoZXkgd2VyZSBwYXNzaW5nIG1lbnRpb25zIHdoZXJlIHRoZSBtYWluIGZvY3VzIG9mIGludGVyZXN0IHdhcyBub3QgdGhlIEFkaXZhc2lzLg0KDQojIERpc2Nlcm5pbmcgYmV0d2VlbiB0d28gZGlzY291cnNlczogQ2hlY2tpbmcgZm9yIG1lbnRpb25zIG9mIENPVklEIDE5DQoNCkFzIHNob3duIGluIG91ciBmaXJzdCBiYXIgY2hhcnQsIHRoZXJlIHdhcyBhIHJlc3VyZ2VuY2VzIG9mIGFydGljbGVzDQp0YWxraW5nIGFib3V0IGh1bWFuIG1vYmlsaXR5IGluIHRoZSBjb250ZXh0IG9mIHRoZSBLZXJhbGEgZmxvb2RzDQphbmQgbGFuZHNsaWRlcyBpbiBNYXJjaCAyMDIwLiANCg0KRm9sbG93aW5nIG91ciBkaXN0YW50IHJlYWRpbmcgY29uZHVjdGVkIG9uIENvcnRleHQsIHdlIHN1c3BlY3QgdGhhdCBzYWlkIHN1cmdlIA0KaXMgZHVlIHRvIHRoZSBDT1ZJRCBlcGlkZW1pYyBhbmQgaW5zdGFuY2VzIHRoYXQgdXNlZCB0aGUgS2VyYWxhIGZsb29kcyBhbmQgDQpsYW5kc2xpZGVzIG9mIDIwMTkgYXMgYSByZWZlcmVuY2UgcG9pbnQgdG8gaHVtYW4gbWlncmF0aW9uIHJlbGF0ZWQgdG8gIENPVklELTE5Lg0KV2Ugd2lsbCBjaGVjayBmb3IgdGhpcyBpbiB0aGUgbmV4dCBzZWN0aW9uLg0KDQpXZSB3aWxsIHN0YXJ0IGJ5IGZpbmRpbmcgbWVudGlvbnMgb2YgQ09WSUQgMTkgaW4gb3VyIGNvcnB1cy4NCmBgYHtyfQ0KY292aWRfb2N1cnJhbmNlcyA9IGFydGljbGVfYnlfbW9udGggJT4lIA0KICBzZWxlY3QoYXJ0aWNsZV9mdSwgUHVibGljYXRpbykgJT4lICMgV2UgYXJlIHNlbGVjdGluZyBvdXIgZmllbGRzIG9mIGludGVyZXN0LCB0aGUgZnVsbCB0ZXh0IG9mIGEgZ2l2ZW4gYXJ0aWNsZSBhbmQgaXRzIHB1YmxpY2F0aW9uIGRhdGUNCiAgbXV0YXRlKGFydGljbGVfZnUgPSB0b2xvd2VyKGFydGljbGVfZnUpKSAlPiUgIyBIZXJlLCB3ZSBhcmUgbXV0YXRpbmcgdGhlIGZ1bGwgdGV4dCBvZiBvdXIgYXJ0aWNsZXMgaW50byBsb3dlciBjYXNlcyB0byBnbyBhcm91bmQgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2Ygb3VyIG5leHQgZnVuY3Rpb24uDQogIGZpbHRlcihncmVwbCgiY292aWR8Y29yb25hfGNvcm9uYXZpcnVzfGNvdmlkLTE5fGNvdmlkIDE5IiwgYXJ0aWNsZV9mdSkpICNMYXN0bHksIHdlIGFyZSBhc2tpbmcgUiB0byBmaW5kIGFydGljbGVzIHRoYXQgdXNlZCB3b3JkcyByZWZlcnJpbmcgdG8gQ09WSUQtMTkgaW4gdGhlaXIgZnVsbCB0ZXh0cy4NCiAgdmlldyhjb3ZpZF9vY3VycmFuY2VzKQ0KICBjb3VudChjb3ZpZF9vY3VycmFuY2VzKQ0KYGBgDQoNCldlIGhhdmUgYSB0b3RhbCBvZiAzNSBhcnRpY2xlcyB0aGF0IHRhbGsgYWJvdXQgQ09WSUQgMTkuIExldCdzIGdyYXBoIHRoZWlyDQpkaXN0cmlidXRpb24gYWNyb3NzIHRpbWUgbmV4dA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGNvdmlkX29jdXJyYW5jZXMpKyAjV2UgYXJlIGFza2luZyB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIHRha2Ugb3VyIHNlYXJjaCBmb3IgbWVudGlvbnMgb2YgQ09WSUQtMTkgYXMgdGhlIGRhdGEgdG8gZ3JhcGgNCiAgYWVzKFB1YmxpY2F0aW8pICsgI1dlIHNwZWNpZnkgdGhhdCB0aGUgWCBheGlzIHNob3VsZCBiZSB0aGUgcHVibGljYXRpb24gZGF0ZQ0KICBnZW9tX2Jhcihjb2xvdXIgPSAnZGVlcHBpbmszJywgYWxwaGE9MC4yKSArICNXZSB3YW50IGEgcGluayBncmFwaCBjaGFydCwgdGhlIGFscGhhIG9mIDAuMiByZWZlcnMgdG8gdGhlIGJhY2tncm91bmQgY29sb3INCiAgbGFicyh4PSJNb250aCBvZiBQdWJsaWNhdGlvbiIsIHk9Ik51bWJlciBvZiBBcnRpY2xlcyIsIHRpdGxlID0gIkFydGljbGVzIHRhbGtpbmcgYWJvdXQgQ09WSUQtMTkgaW4gdGhlIGNvbnRleHQgb2YgbWlncmF0aW9uIGFuZCB0aGUgS2VyYWxhIEZsb29kcyBhbmQgTGFuZHNsaWRlcyAoQXVndXN0IDIwMTktTWF5IDIwMjApIikgI0xhc3RseSwgd2UgYXJlIGxhYmVsaW5nIG91ciBncmFwaA0KYGBgDQoNClRoaXMgaXMgYWxsIHdlbGwgYW5kIGdvb2QsIGJ1dCBhIGN1cmlvdXMgcmVhZGVyIG1pZ2h0IGFzayBoaW0vaGVyc2VsZiBob3cgZG9lcw0KdGhlIGZyZXF1ZW5jeSBvZiBhcnRpY2xlcyB0YWxraW5nIGFib3V0IENPVklEIDE5IGNvbXBhcmVzIHRvIHRob3NlIHdobyBkbyBub3QuDQpGZWFyIG5vdCwgd2Ugd2lsbCB0YWtlIGNhcmUgb2YgaXQgbm93IGJ5IHNlYXJjaGluZyBmb3IgaG93IG1hbnkgYXJ0aWNsZXMNCndlcmUgcHVibGlzaGVkIGZyb20gRmVicnVhcnkgMjAyMCBvbndhcmRzLg0KDQoNCmBgYHtyfQ0KYXJ0aWNsZXNfZnJvbV9hcHJpbF9vbndhcmRzID0gYXJ0aWNsZV9ieV9tb250aCAlPiUNCiAgc2VsZWN0KFB1YmxpY2F0aW8pICU+JSAjVGhpcyB0aW1lIHdlIGFyZSBmb2N1c2luZyBvbiB0aGUgcHVibGljYXRpb24gZGF0ZSByYXRoZXIgdGhhbiB0aGUgdGV4dCBvZiBhcnRpY2xlcw0KICBmaWx0ZXIoZ3JlcGwoIjIwMjAvMDJ8MjAyMC8wM3wyMDIwLzA0fDIwMjAvMDUiLCBQdWJsaWNhdGlvKSkgI05vdywgd2UgYXJlIHNlYXJjaGluZyBmb3IgYXJ0aWNsZXMgaW4gb3VyIGNvcnB1cyBwdWJsaXNoZWQgZnJvbSB0aGUgZmlyc3QgbWVudGlvbiBvZiBDT1ZJRCAxOSAoRmVicnVhcnkgMjAyMCkgb253YXJkLg0KdmlldyhhcnRpY2xlc19mcm9tX2FwcmlsX29ud2FyZHMpICNUaGlzIGNvbW1hbmQgYWxsb3dzIHVzIHRvIG1hbnVhbGx5IGV4cGxvcmUgb3VyIHJlc3VsdHMNCmNvdW50KGFydGljbGVzX2Zyb21fYXByaWxfb253YXJkcykNCmBgYA0KSW4gdG90YWwsIDQzIGFydGljbGVzIHdlcmUgcHVibGlzaGVkIGZyb20gRmVicnVhcnkgMjAyMCBvbndhcmRzLiBDb21wYXJpbmcgdGhpcw0KZmlndXJlIHRvIHRoZSAzNSBhcnRpY2xlcyB0aGFuIGluY2x1ZGVkIENPVklEIDE5IHdlIGNhbiBzYXkgdGhhdCBmcm9tIEZlYnJ1YXJ5DQpvbndhcmRzLCBDT1ZJRC0xOSByZWlnbmVkIGluIHRoZSBtZWRpYSdzIGRpc2NvdXJzZSBzdXJyb3VuZGluZyBodW1hbiBtb2JpbGl0eQ0KYW5kIHRoZSBLZXJhbGEgZmxvb2RzL2xhbmRzbGlkZXMgb2YgMjAxOS4NCg0K