AAG April 07, 2017: Boston, MA
Abstract
The embodiment of surveillant technologies provides a means and site of production of data to be consumed by both the self and the medical gaze with physical and emotional consequences. Analyzing discourse on the subreddit r/diabetes, I examine assemblages of surveillant technologies that render an ever-increasing quantified self for those using insulin pumps and glucose monitors. Haraway (1990) brought cyborgs to the fore in the early 1990s and Lupton & Seymour (2000) describes cyborgs ``When hooked up to medical (and other) technologies, the patient’s body becomes a cyborg, a juncture of human flesh and machine’’ (p.56). Bodies are rendered regulatable through the use of embodied and disembodied technologies. People with any type of diabetes may be treated with insulin, which can be self-administered through multiple daily injections or through an insulin pump. Insulin pumps, as well as insulin, are proprietary. There is a growing do-it-yourself movement when it comes to hacking the cyborg self. Open source communities have made headway in generating new technology, reappropriating old devices or implementing everyday hacks of hardware and its fleshy interface (Forlano, 2016). Lupton (2016) describes these devices and data as intermingling within a data economy, which I argue in the case of diabetes are used in surveillance and the medical gaze. Devices used to manage diabetes quantify the self and datify the device user. These data as perceived by medical practitioners, family members, friends, strangers and last, but not least, the self can have significant effects on everyday life, socio-spatial relations and emotional health.
Methods and Methodologies: Mixed Methods & Reddit Data Using R
I have utilized netnography (Kozinets, 2015) to explore the online community called r/diabetes including observation (lurking) with screenshots, key word searches through the reddit GUI (graphical user interface), and am using R to analyze user-generated, textual data and its metadata. I chose to use reddit data due to its availability. Additionally I chose Reddit because their TOS provides no expectation of prvacy to the users. While this is a much larger project, for today’s presentation, I will focus on using R to explore a large unstructured (textual) data set.
What is R? Geographers such as Kitchin & Dodge (2011) discuss the importance and pervasiveness of code and software in our everyday lives. R is a computer programming language developed out of S at Bell Labs in the 70s and 80s for statistical computing (R Core Team, 2013). It is an opensource language and under a GNU license. It has a large, active contributing community, which is one of its largest assets. A one the most prolific contributors is Hadley Wickham, who developed all of the libraries I use in this project (Wickham & Francois, 2015).
Geographers like Crooks & Chouinard (2006) have used the proprietary software, NVivo, for analyzing text, while geographers like Elwood & Cope (2009), Aitken & Kwan (2010), Elwood (2010), and Wilson (2015) have taken traditionally quantitative tools and reappropriated them for qualitative, critical and mixed-method research in GIS. Although there is some interest in using R for mapping and spatial analysis (Brunsdon & Comber, 2015), there has been little work done using or writing about reappropriating traditionally quantitative opensource tools like R for analysis of qualitative data.
This type of reappropriation I suggest could be considered an epistemological or methodological challenge that “disrupts efforts to constrain empistemological diversity”" (Elwood, 2010, p. 106). This research therefore uses both inductive and deductive approaches, which Elwood (2010) asserts “challenge[s] the proposition that epistemologies are necessarily separate and singular” (p. 107).
Using R to analayze social media data is not a sort of panacea for looking at larger amounts of data or somehow claiming this way as new and therefore superior, but instead is what DeLyser & Sui (2014) call, ``an embrace of engaged methodological pluralism, where different and divergent methods flourish to tackle issues from different angles’’ (p. 303).
library(dplyr) # dplyr is a library written by Hadley Wickham for easy manipulation of data. See https://cran.r-project.org/web/packages/dplyr/index.html to download or http://dplyr.tidyverse.org/
library(readr) # Hadley Wickham made readr to make it easier for reading many kinds of tabular data.
library(ggplot2) # This is a plotting system for R, also by Hadley Wickham. See http://ggplot2.org/.
d <- read_csv("~/Downloads/reddit_diabetes.csv") # This data set was accessed through the reddit API and is publicly available. #a data frame is a data structure like a spreadsheet that uses code instead of a graphical user interface (although it could be argued that this is a graphical user interface.
The following functions are built into Dplyr.
mutate()
Adds new variables that are functions of exisiting variables. select()
Picks variables based on their names. filter()
Picks cases based on their values. summarise()
Reduces multiple values down to a single summary. arrange()
Changes the ordering of the rows.
You can also make your own functions. Below I create the filter_by_anything
function for key word searches.
filter_by_anything <- function(.data, pattern) { # Pattern here just means an input to be matched.
.data %>%
filter(grepl(pattern, body)) # grepl returns a logical vector (match or not for each element of x).
}
How do data producers access their own data from meters, pumps and continuous glucose meters (CGMs)?
d %>%
filter_by_anything("data") %>%
as.data.frame()
# One of the comments this yielded was interesting for answering our question:
# "There is so much going on in this field right now. In the past, people were pretty limited in what they could do with technology to manage their diabetes,because the type of technology wasn't considered in the FDA approval process (i.e. it had to jump through all the same hoops that a new pump model would, even if it was just an app that was reading data, not writing it). Even at that time, people were still coming up with ideas. In particular, I can think of a user here who set up an IFTTT program that would let him text his sugar to a number and then it would be automatically logged in a Google spreadsheet.He shared the code here and I was able to set it up for myself, too. I probably still have the code snippet somewhere.\n\nNow there has been a proliferation of diabetes related apps. There are some that gamify your care. An example is #[MySugr](https://mysugr.com/) where you make very detailed log entries to get more points to "feed the monster" and if you hit a certain number ... <truncated>"
Or I might try to look at other pertinent key words that would contain discussions of how commenters access their data. Here I decided to use an inclusive or to gather posts containing any or all of the arguments.
d %>%
filter(grepl(" API ", body, ignore.case=TRUE) | # Means "or"" as in boolean logic (inclusive or)
# Space definitely matters here as I has to include them before and after API so it wouldn't include posts with a word that contained the letters api in them.
grepl("Wireless", body, ignore.case=TRUE) |
grepl(" hack ", body, ignore.case=TRUE) |
grepl("blue tooth", body, ignore.case=TRUE) |
grepl("bluetooth", body, ignore.case=TRUE) |
grepl("reverse engineer", body, ignore.case=TRUE)) %>%
sample_n(35) %>%
as.data.frame()
Another pertinent question: What sorts of problems occur with the fleshy side of the interface?
d %>%
filter(grepl("infection", body, ignore.case=TRUE) &
grepl("site", body, ignore.case=TRUE)) %>%
sample_n(35) %>%
as.data.frame()
NA
The comments reveal that the fleshy interface must be rotated every several days, if not, a site can become infected and/or cause poor insulin infusion resulting in high blood glucose.
There are so many potential ways to look at unstructured data using R and dplyr, it really is up to the imagination. As you can see it yields some pretty rich data, which ultimately is filtered through the researcher. There are many limitations to this mixing up of methods.
The larger reddit data corpus is publicly available at https://archive.org/details/2015_reddit_comments_corpus. To make this data set and code available and accessible, I am hosting it in an S3 bucket through Amazon Web Services (AWS). It is also important, from a feminist methodological perspective, to make my research available to the community with whose data I worked and will post my github repository as well as my r notebook https://s3.amazonaws.com/gentryhanks-analysis/RedditAnalysis.nb.html to the subreddit once completed. Using r notebook also makes my research readily available through auto generation of html for immediate web hosting.
Insulin pump and continuous glucose monitor users generate large amounts of data, but often have trouble accessing or making sense of that data, not to mention the embodied toll this data collection takes, often causing infection or damage to the fleshy side of the interface.
Discussion Questions
What about trustworthiness of internet data (Hartig, 2008)? There is little incentive to lie in this subreddit. Ethics of netnography?
Theoretical hurdles?
Bibliography
Aitken, S. C., & Kwan, M.-P. (2010). GIS as qualitative research: Knowledge, participatory politics and cartographies of affect. The SAGE Handbook of Qualitative Geography, 287–304.
Brunsdon, C., & Comber, L. (2015). An introduction to r for spatial analysis and mapping. Sage.
Crooks, V. A., & Chouinard, V. (2006). An embodied geography of disablement: Chronically ill women’s struggles for enabling places in spaces of health care and daily life. Health & Place, 12(3), 345–352.
DeLyser, D., & Sui, D. (2014). Crossing the qualitative-quantitative chasm iii: Enduring methods, open geography, participatory research, and the fourth paradigm. Progress in Human Geography, 38(2), 294–307.
Elwood, S. (2010). Mixed methods: Thinking, doing, and asking in multiple ways. In The SAGE handbook of qualitative geography (pp. 94–114). Los Angeles; London: SAGE.
Elwood, S., & Cope, M. S. (Eds.). (2009). Qualitative gis: A mixed methods approach. Sage Publications.
Forlano, L. (2016). Hacking the feminist body. Journal of Peer Production, 8.
Haraway, D. J. (1990). Simians, cyborgs, and women: The reinvention of nature. New York: Routledge.
Hartig, O. (2008). Trustworthiness of data on the web. In Proceedings of the sti berlin & csw phd workshop. Citeseer.
Kitchin, R., & Dodge, M. (2011). Code/space: Software and everyday life. MIT Press.
Kozinets, R. V. (2015). Netnography: Redefined. Sage.
Lupton, D. (2016). Foreword: Lively devices, lively data and lively leisure studies. Leisure Studies, 1–3.
Lupton, D., & Seymour, W. (2000). Technology, selfhood and physical disability. Social Science and Medicine Social Science and Medicine, 50(12), 1851–1862.
R Core Team. (2013). R: A language and environment for statistical computing. Vienna, Austria: R Foundation for Statistical Computing. Retrieved from http://www.R-project.org/
Wickham, H., & Francois, R. (2015). Dplyr: A grammar of data manipulation. R Package Version 0.4, 1, 20.
Wilson, M. W. (2015). Paying attention, digital media, and community-based critical gis. Cultural Geographies, 22(1), 177–191.
LS0tCnRpdGxlOiAiRGlhYmV0ZXMgYW5kIHRoZSBRdWFudGlmaWVkIFNlbGY6IEhhY2tpbmcgSGFyZCwgRmxlc2h5IEludGVyZmFjZXMiCgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYmlibGlvZ3JhcGh5OiBkaXNzZXJ0YXRpb25fYmlibGlvZ3JhcGh5LmJpYgpjc2w6IGFwYS5jc2wKLS0tCiMjIyBHZW50cnkgSGFua3MsIFF1ZWVuJ3MgVW5pdmVyc2l0eSwgVHdpdHRlcjogXEBnZW50cnloYW5rcwojIyMgQUFHIEFwcmlsIDA3LCAyMDE3OiBCb3N0b24sIE1BCiMgQWJzdHJhY3QKClRoZSBlbWJvZGltZW50IG9mIHN1cnZlaWxsYW50IHRlY2hub2xvZ2llcyBwcm92aWRlcyBhIG1lYW5zIGFuZCBzaXRlIG9mIHByb2R1Y3Rpb24gb2YgZGF0YSB0byBiZSBjb25zdW1lZCBieSBib3RoIHRoZSBzZWxmIGFuZCB0aGUgbWVkaWNhbCBnYXplIHdpdGggcGh5c2ljYWwgYW5kIGVtb3Rpb25hbCBjb25zZXF1ZW5jZXMuIEFuYWx5emluZyBkaXNjb3Vyc2Ugb24gdGhlIHN1YnJlZGRpdCByL2RpYWJldGVzLCBJIGV4YW1pbmUgYXNzZW1ibGFnZXMgb2Ygc3VydmVpbGxhbnQgdGVjaG5vbG9naWVzIHRoYXQgcmVuZGVyIGFuIGV2ZXItaW5jcmVhc2luZyBxdWFudGlmaWVkIHNlbGYgZm9yIHRob3NlIHVzaW5nIGluc3VsaW4gcHVtcHMgYW5kIGdsdWNvc2UgbW9uaXRvcnMuIEBoYXJhd2F5X3NpbWlhbnNfMTk5MCBicm91Z2h0IGN5Ym9yZ3MgdG8gdGhlIGZvcmUgaW4gdGhlIGVhcmx5IDE5OTBzIGFuZCBAbHVwdG9uX3RlY2hub2xvZ3lfMjAwMCBkZXNjcmliZXMgY3lib3JncyBgYFdoZW4gaG9va2VkIHVwIHRvIG1lZGljYWwgKGFuZCBvdGhlcikgdGVjaG5vbG9naWVzLCB0aGUgcGF0aWVudCdzIGJvZHkgYmVjb21lcyBhIGN5Ym9yZywgYSBqdW5jdHVyZSBvZiBodW1hbiBmbGVzaCBhbmQgbWFjaGluZScnIChwLjU2KS4gQm9kaWVzIGFyZSByZW5kZXJlZCByZWd1bGF0YWJsZSB0aHJvdWdoIHRoZSB1c2Ugb2YgZW1ib2RpZWQgYW5kIGRpc2VtYm9kaWVkIHRlY2hub2xvZ2llcy4gUGVvcGxlIHdpdGggYW55IHR5cGUgb2YgZGlhYmV0ZXMgbWF5IGJlIHRyZWF0ZWQgd2l0aCBpbnN1bGluLCB3aGljaCBjYW4gYmUgc2VsZi1hZG1pbmlzdGVyZWQgdGhyb3VnaCBtdWx0aXBsZSBkYWlseSBpbmplY3Rpb25zIG9yIHRocm91Z2ggYW4gaW5zdWxpbiBwdW1wLiBJbnN1bGluIHB1bXBzLCBhcyB3ZWxsIGFzIGluc3VsaW4sIGFyZSBwcm9wcmlldGFyeS4gVGhlcmUgaXMgYSBncm93aW5nIGRvLWl0LXlvdXJzZWxmIG1vdmVtZW50IHdoZW4gaXQgY29tZXMgdG8gaGFja2luZyB0aGUgY3lib3JnIHNlbGYuIE9wZW4gc291cmNlIGNvbW11bml0aWVzIGhhdmUgbWFkZSBoZWFkd2F5IGluIGdlbmVyYXRpbmcgbmV3IHRlY2hub2xvZ3ksIHJlYXBwcm9wcmlhdGluZyBvbGQgZGV2aWNlcyBvciBpbXBsZW1lbnRpbmcgZXZlcnlkYXkgaGFja3Mgb2YgaGFyZHdhcmUgYW5kIGl0cyBmbGVzaHkgaW50ZXJmYWNlIFtAZm9ybGFub19oYWNraW5nXzIwMTZdLiBAbHVwdG9uMjAxNmZvcmV3b3JkIGRlc2NyaWJlcyB0aGVzZSBkZXZpY2VzIGFuZCBkYXRhIGFzIGludGVybWluZ2xpbmcgd2l0aGluIGEgZGF0YSBlY29ub215LCB3aGljaCBJIGFyZ3VlIGluIHRoZSBjYXNlIG9mIGRpYWJldGVzIGFyZSB1c2VkIGluIHN1cnZlaWxsYW5jZSBhbmQgdGhlIG1lZGljYWwgZ2F6ZS4gRGV2aWNlcyB1c2VkIHRvIG1hbmFnZSBkaWFiZXRlcyBxdWFudGlmeSB0aGUgc2VsZiBhbmQgZGF0aWZ5IHRoZSBkZXZpY2UgdXNlci4gVGhlc2UgZGF0YSBhcyBwZXJjZWl2ZWQgYnkgbWVkaWNhbCBwcmFjdGl0aW9uZXJzLCBmYW1pbHkgbWVtYmVycywgZnJpZW5kcywgc3RyYW5nZXJzIGFuZCBsYXN0LCBidXQgbm90IGxlYXN0LCB0aGUgc2VsZiBjYW4gaGF2ZSBzaWduaWZpY2FudCBlZmZlY3RzIG9uIGV2ZXJ5ZGF5IGxpZmUsIHNvY2lvLXNwYXRpYWwgcmVsYXRpb25zIGFuZCBlbW90aW9uYWwgaGVhbHRoLgoKIyBNZXRob2RzIGFuZCBNZXRob2RvbG9naWVzOiBNaXhlZCBNZXRob2RzICYgUmVkZGl0IERhdGEgVXNpbmcgUgpJIGhhdmUgdXRpbGl6ZWQgbmV0bm9ncmFwaHkgW0Byb2JlcnQyMDE1bmV0bm9ncmFwaHldIHRvIGV4cGxvcmUgdGhlIG9ubGluZSBjb21tdW5pdHkgY2FsbGVkIHIvZGlhYmV0ZXMgaW5jbHVkaW5nIG9ic2VydmF0aW9uIChsdXJraW5nKSB3aXRoIHNjcmVlbnNob3RzLCBrZXkgd29yZCBzZWFyY2hlcyB0aHJvdWdoIHRoZSByZWRkaXQgR1VJIChncmFwaGljYWwgdXNlciBpbnRlcmZhY2UpLCBhbmQgYW0gdXNpbmcgUiB0byBhbmFseXplIHVzZXItZ2VuZXJhdGVkLCB0ZXh0dWFsIGRhdGEgYW5kIGl0cyBtZXRhZGF0YS4gSSBjaG9zZSB0byB1c2UgcmVkZGl0IGRhdGEgZHVlIHRvIGl0cyBhdmFpbGFiaWxpdHkuIEFkZGl0aW9uYWxseSBJIGNob3NlIFJlZGRpdCBiZWNhdXNlIHRoZWlyIFRPUyBwcm92aWRlcyBubyBleHBlY3RhdGlvbiBvZiBwcnZhY3kgdG8gdGhlIHVzZXJzLiBXaGlsZSB0aGlzIGlzIGEgbXVjaCBsYXJnZXIgcHJvamVjdCwgZm9yIHRvZGF5J3MgcHJlc2VudGF0aW9uLCBJIHdpbGwgZm9jdXMgb24gdXNpbmcgUiB0byBleHBsb3JlIGEgbGFyZ2UgdW5zdHJ1Y3R1cmVkICh0ZXh0dWFsKSBkYXRhIHNldC4KCldoYXQgaXMgUj8KR2VvZ3JhcGhlcnMgc3VjaCBhcyBAa2l0Y2hpbl9jb2RlXzIwMTEgZGlzY3VzcyB0aGUgaW1wb3J0YW5jZSBhbmQgcGVydmFzaXZlbmVzcyBvZiBjb2RlIGFuZCBzb2Z0d2FyZSBpbiBvdXIgZXZlcnlkYXkgbGl2ZXMuIFIgaXMgYSBjb21wdXRlciBwcm9ncmFtbWluZyBsYW5ndWFnZSBkZXZlbG9wZWQgb3V0IG9mIFMgYXQgQmVsbCBMYWJzIGluIHRoZSA3MHMgYW5kIDgwcyBmb3Igc3RhdGlzdGljYWwgY29tcHV0aW5nIFtAUl8yMDEzXS4gSXQgaXMgYW4gb3BlbnNvdXJjZSBsYW5ndWFnZSBhbmQgdW5kZXIgYSBHTlUgbGljZW5zZS4gSXQgaGFzIGEgbGFyZ2UsIGFjdGl2ZSBjb250cmlidXRpbmcgY29tbXVuaXR5LCB3aGljaCBpcyBvbmUgb2YgaXRzIGxhcmdlc3QgYXNzZXRzLiBBIG9uZSB0aGUgbW9zdCBwcm9saWZpYyBjb250cmlidXRvcnMgaXMgSGFkbGV5IFdpY2toYW0sIHdobyBkZXZlbG9wZWQgYWxsIG9mIHRoZSBsaWJyYXJpZXMgSSB1c2UgaW4gdGhpcyBwcm9qZWN0IFtAd2lja2hhbTIwMTVkcGx5cl0uCgpHZW9ncmFwaGVycyBsaWtlIEBjcm9va3MyMDA2ZW1ib2RpZWQgaGF2ZSB1c2VkIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSwgTlZpdm8sIGZvciBhbmFseXppbmcgdGV4dCwgd2hpbGUgZ2VvZ3JhcGhlcnMgbGlrZSBAZWx3b29kMjAwOXF1YWxpdGF0aXZlLCBAYWl0a2VuMjAxMGdpcywgQGVsd29vZF9taXhlZF8yMDEwLCBhbmQgQHdpbHNvbjIwMTVwYXlpbmcgaGF2ZSB0YWtlbiB0cmFkaXRpb25hbGx5IHF1YW50aXRhdGl2ZSB0b29scyBhbmQgcmVhcHByb3ByaWF0ZWQgdGhlbSBmb3IgcXVhbGl0YXRpdmUsIGNyaXRpY2FsIGFuZCBtaXhlZC1tZXRob2QgcmVzZWFyY2ggaW4gR0lTLiBBbHRob3VnaCB0aGVyZSBpcyBzb21lIGludGVyZXN0IGluIHVzaW5nIFIgZm9yIG1hcHBpbmcgYW5kIHNwYXRpYWwgYW5hbHlzaXMgW0BicnVuc2RvbjIwMTVpbnRyb2R1Y3Rpb25dLCB0aGVyZSBoYXMgYmVlbiBsaXR0bGUgd29yayBkb25lIHVzaW5nIG9yIHdyaXRpbmcgYWJvdXQgcmVhcHByb3ByaWF0aW5nIHRyYWRpdGlvbmFsbHkgcXVhbnRpdGF0aXZlIG9wZW5zb3VyY2UgdG9vbHMgbGlrZSBSIGZvciBhbmFseXNpcyBvZiBxdWFsaXRhdGl2ZSBkYXRhLgoKVGhpcyB0eXBlIG9mIHJlYXBwcm9wcmlhdGlvbiBJIHN1Z2dlc3QgY291bGQgYmUgY29uc2lkZXJlZCBhbiBlcGlzdGVtb2xvZ2ljYWwgb3IgbWV0aG9kb2xvZ2ljYWwgY2hhbGxlbmdlIHRoYXQgImRpc3J1cHRzIGVmZm9ydHMgdG8gY29uc3RyYWluIGVtcGlzdGVtb2xvZ2ljYWwgZGl2ZXJzaXR5IiIgW0BlbHdvb2RfbWl4ZWRfMjAxMCwgcC4gMTA2XS4gVGhpcyByZXNlYXJjaCB0aGVyZWZvcmUgdXNlcyBib3RoIGluZHVjdGl2ZSBhbmQgZGVkdWN0aXZlIGFwcHJvYWNoZXMsIHdoaWNoIEBlbHdvb2RfbWl4ZWRfMjAxMCBhc3NlcnRzICJjaGFsbGVuZ2Vbc10gdGhlIHByb3Bvc2l0aW9uIHRoYXQgZXBpc3RlbW9sb2dpZXMgYXJlIG5lY2Vzc2FyaWx5IHNlcGFyYXRlIGFuZCBzaW5ndWxhciIgKHAuIDEwNykuIAoKVXNpbmcgUiB0byBhbmFsYXl6ZSBzb2NpYWwgbWVkaWEgZGF0YSBpcyBub3QgYSBzb3J0IG9mIHBhbmFjZWEgZm9yIGxvb2tpbmcgYXQgbGFyZ2VyIGFtb3VudHMgb2YgZGF0YSBvciBzb21laG93IGNsYWltaW5nIHRoaXMgd2F5IGFzIG5ldyBhbmQgdGhlcmVmb3JlIHN1cGVyaW9yLCBidXQgaW5zdGVhZCBpcyB3aGF0IEBkZWx5c2VyMjAxNGNyb3NzaW5nIGNhbGwsIGBgYW4gZW1icmFjZSBvZiBlbmdhZ2VkIG1ldGhvZG9sb2dpY2FsIHBsdXJhbGlzbSwgd2hlcmUgZGlmZmVyZW50IGFuZCBkaXZlcmdlbnQgbWV0aG9kcyBmbG91cmlzaCB0byB0YWNrbGUgaXNzdWVzIGZyb20KZGlmZmVyZW50IGFuZ2xlcycnIChwLiAzMDMpLgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKSAjIGRwbHlyIGlzIGEgbGlicmFyeSB3cml0dGVuIGJ5IEhhZGxleSBXaWNraGFtIGZvciBlYXN5IG1hbmlwdWxhdGlvbiBvZiBkYXRhLiBTZWUgaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2RwbHlyL2luZGV4Lmh0bWwgdG8gZG93bmxvYWQgb3IgaHR0cDovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvCmxpYnJhcnkocmVhZHIpICMgSGFkbGV5IFdpY2toYW0gbWFkZSByZWFkciB0byBtYWtlIGl0IGVhc2llciBmb3IgcmVhZGluZyBtYW55IGtpbmRzIG9mIHRhYnVsYXIgZGF0YS4KbGlicmFyeShnZ3Bsb3QyKSAjIFRoaXMgaXMgYSBwbG90dGluZyBzeXN0ZW0gZm9yIFIsIGFsc28gYnkgSGFkbGV5IFdpY2toYW0uIFNlZSBodHRwOi8vZ2dwbG90Mi5vcmcvLgpgYGAKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CgpkIDwtIHJlYWRfY3N2KCJ+L0Rvd25sb2Fkcy9yZWRkaXRfZGlhYmV0ZXMuY3N2IikgIyBUaGlzIGRhdGEgc2V0IHdhcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSByZWRkaXQgQVBJIGFuZCBpcyBwdWJsaWNseSBhdmFpbGFibGUuICNhIGRhdGEgZnJhbWUgaXMgYSBkYXRhIHN0cnVjdHVyZSBsaWtlIGEgc3ByZWFkc2hlZXQgdGhhdCB1c2VzIGNvZGUgaW5zdGVhZCBvZiBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSAoYWx0aG91Z2ggaXQgY291bGQgYmUgYXJndWVkIHRoYXQgdGhpcyBpcyBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZS4KYGBgCgoKClRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBidWlsdCBpbnRvIERwbHlyLgoKYG11dGF0ZSgpYCAgICBBZGRzIG5ldyB2YXJpYWJsZXMgdGhhdCBhcmUgZnVuY3Rpb25zIG9mIGV4aXNpdGluZyB2YXJpYWJsZXMuCmBzZWxlY3QoKWAgICAgUGlja3MgdmFyaWFibGVzIGJhc2VkIG9uIHRoZWlyIG5hbWVzLgpgZmlsdGVyKClgICAgIFBpY2tzIGNhc2VzIGJhc2VkIG9uIHRoZWlyIHZhbHVlcy4KYHN1bW1hcmlzZSgpYCBSZWR1Y2VzIG11bHRpcGxlIHZhbHVlcyBkb3duIHRvIGEgc2luZ2xlIHN1bW1hcnkuCmBhcnJhbmdlKClgICAgQ2hhbmdlcyB0aGUgb3JkZXJpbmcgb2YgdGhlIHJvd3MuCgpZb3UgY2FuIGFsc28gbWFrZSB5b3VyIG93biBmdW5jdGlvbnMuCkJlbG93IEkgY3JlYXRlIHRoZSBgZmlsdGVyX2J5X2FueXRoaW5nYCBmdW5jdGlvbiBmb3Iga2V5IHdvcmQgc2VhcmNoZXMuCmBgYHtyfQpmaWx0ZXJfYnlfYW55dGhpbmcgPC0gZnVuY3Rpb24oLmRhdGEsIHBhdHRlcm4pIHsgIyBQYXR0ZXJuIGhlcmUganVzdCBtZWFucyBhbiBpbnB1dCB0byBiZSBtYXRjaGVkLgogIC5kYXRhICU+JQogICAgZmlsdGVyKGdyZXBsKHBhdHRlcm4sIGJvZHkpKSAjIGdyZXBsIHJldHVybnMgYSBsb2dpY2FsIHZlY3RvciAobWF0Y2ggb3Igbm90IGZvciBlYWNoIGVsZW1lbnQgb2YgeCkuCn0KYGBgCgojIyMgSG93IGRvIGRhdGEgcHJvZHVjZXJzIGFjY2VzcyB0aGVpciBvd24gZGF0YSBmcm9tIG1ldGVycywgcHVtcHMgYW5kIGNvbnRpbnVvdXMgZ2x1Y29zZSBtZXRlcnMgKENHTXMpPwpgYGB7cn0KZCAlPiUKICBmaWx0ZXJfYnlfYW55dGhpbmcoImRhdGEiKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKIyBPbmUgb2YgdGhlIGNvbW1lbnRzIHRoaXMgeWllbGRlZCB3YXMgaW50ZXJlc3RpbmcgZm9yIGFuc3dlcmluZyBvdXIgcXVlc3Rpb246CiMgIlRoZXJlIGlzIHNvIG11Y2ggZ29pbmcgb24gaW4gdGhpcyBmaWVsZCByaWdodCBub3cuIEluIHRoZSBwYXN0LCBwZW9wbGUgd2VyZSBwcmV0dHkgbGltaXRlZCBpbiB3aGF0IHRoZXkgY291bGQgZG8gd2l0aCB0ZWNobm9sb2d5IHRvIG1hbmFnZSB0aGVpciBkaWFiZXRlcyxiZWNhdXNlIHRoZSB0eXBlIG9mIHRlY2hub2xvZ3kgd2Fzbid0IGNvbnNpZGVyZWQgaW4gdGhlIEZEQSBhcHByb3ZhbCBwcm9jZXNzIChpLmUuIGl0IGhhZCB0byBqdW1wIHRocm91Z2ggYWxsIHRoZSBzYW1lIGhvb3BzIHRoYXQgYSBuZXcgcHVtcCBtb2RlbCB3b3VsZCwgZXZlbiBpZiBpdCB3YXMganVzdCBhbiBhcHAgdGhhdCB3YXMgcmVhZGluZyBkYXRhLCBub3Qgd3JpdGluZyBpdCkuIEV2ZW4gYXQgdGhhdCB0aW1lLCBwZW9wbGUgd2VyZSBzdGlsbCBjb21pbmcgdXAgd2l0aCBpZGVhcy4gSW4gcGFydGljdWxhciwgSSBjYW4gdGhpbmsgb2YgYSB1c2VyIGhlcmUgd2hvIHNldCB1cCBhbiBJRlRUVCBwcm9ncmFtIHRoYXQgd291bGQgbGV0IGhpbSB0ZXh0IGhpcyBzdWdhciB0byBhIG51bWJlciBhbmQgdGhlbiBpdCB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxvZ2dlZCBpbiBhIEdvb2dsZSBzcHJlYWRzaGVldC5IZSBzaGFyZWQgdGhlIGNvZGUgaGVyZSBhbmQgSSB3YXMgYWJsZSB0byBzZXQgaXQgdXAgZm9yIG15c2VsZiwgdG9vLiBJIHByb2JhYmx5IHN0aWxsIGhhdmUgdGhlIGNvZGUgc25pcHBldCBzb21ld2hlcmUuXG5cbk5vdyB0aGVyZSBoYXMgYmVlbiBhIHByb2xpZmVyYXRpb24gb2YgZGlhYmV0ZXMgcmVsYXRlZCBhcHBzLiBUaGVyZSBhcmUgc29tZSB0aGF0IGdhbWlmeSB5b3VyIGNhcmUuIEFuIGV4YW1wbGUgaXMgI1tNeVN1Z3JdKGh0dHBzOi8vbXlzdWdyLmNvbS8pIHdoZXJlIHlvdSBtYWtlIHZlcnkgZGV0YWlsZWQgbG9nIGVudHJpZXMgdG8gZ2V0IG1vcmUgcG9pbnRzIHRvICJmZWVkIHRoZSBtb25zdGVyIiBhbmQgaWYgeW91IGhpdCBhIGNlcnRhaW4gbnVtYmVyIC4uLiA8dHJ1bmNhdGVkPiIKCmBgYAoKT3IgSSBtaWdodCB0cnkgdG8gbG9vayBhdCBvdGhlciBwZXJ0aW5lbnQga2V5IHdvcmRzIHRoYXQgd291bGQgY29udGFpbiBkaXNjdXNzaW9ucyBvZiBob3cgY29tbWVudGVycyBhY2Nlc3MgdGhlaXIgZGF0YS4gSGVyZSBJIGRlY2lkZWQgdG8gdXNlIGFuIGluY2x1c2l2ZSBvciB0byBnYXRoZXIgcG9zdHMgY29udGFpbmluZyBhbnkgb3IgYWxsIG9mIHRoZSBhcmd1bWVudHMuCmBgYHtyfQpkICU+JQogIGZpbHRlcihncmVwbCgiIEFQSSAiLCBib2R5LCBpZ25vcmUuY2FzZT1UUlVFKSB8ICMgTWVhbnMgIm9yIiIgYXMgaW4gYm9vbGVhbiBsb2dpYyAoaW5jbHVzaXZlIG9yKQogICAgICAgICAgICMgU3BhY2UgZGVmaW5pdGVseSBtYXR0ZXJzIGhlcmUgYXMgSSBoYXMgdG8gaW5jbHVkZSB0aGVtIGJlZm9yZSBhbmQgYWZ0ZXIgQVBJIHNvIGl0IHdvdWxkbid0IGluY2x1ZGUgcG9zdHMgICAgICAgICAgICAgd2l0aCBhIHdvcmQgdGhhdCBjb250YWluZWQgdGhlIGxldHRlcnMgYXBpIGluIHRoZW0uCiAgICAgICAgICAgZ3JlcGwoIldpcmVsZXNzIiwgYm9keSwgaWdub3JlLmNhc2U9VFJVRSkgfAogICAgICAgICAgIGdyZXBsKCIgaGFjayAiLCBib2R5LCBpZ25vcmUuY2FzZT1UUlVFKSB8CiAgICAgICAgICAgZ3JlcGwoImJsdWUgdG9vdGgiLCBib2R5LCBpZ25vcmUuY2FzZT1UUlVFKSB8CiAgICAgICAgICAgZ3JlcGwoImJsdWV0b290aCIsIGJvZHksIGlnbm9yZS5jYXNlPVRSVUUpIHwKICAgICAgICAgICBncmVwbCgicmV2ZXJzZSBlbmdpbmVlciIsIGJvZHksIGlnbm9yZS5jYXNlPVRSVUUpKSAlPiUKICBzYW1wbGVfbigzNSkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKIyMjIFRoZSBuZXh0IHF1ZXN0aW9uIEknZCBsaWtlIHRvIGV4cGxvcmUgaXM6ICBIb3cgZG8gcGVvcGxlIGluIHRoaXMgY29tbXVuaXR5IGZlZWwgYWJvdXQgd2VhcmluZyBhbiBlbWJvZGllZCBtZWRpY2FsIGRldmljZSBpbiBldmVyeWRheSBsaWZlPwoKYGBge3J9CiMgSGVyZSBJIGZpbHRlciBieSBrZXl3b3JkICJjeWJvcmciIGFuZCB1c2UgYXJyYW5nZSB0byBvcmRlciB0aGVtIGZyb20gb2xkZXN0IHRvIG5ld2VzdCBhbmQgZmluYWxseSB1c2UgYXMuZGF0YS5mcmFtZSgpIHRvIHJlYWQgdGhlIGNvbW1lbnRzIGZyb20gdGhlIGJvZHkuCmQgJT4lCiAgZmlsdGVyX2J5X2FueXRoaW5nKCJjeWJvcmciKSAlPiUKICBhcnJhbmdlKGNyZWF0ZWRfdXRjKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKYGBgCgojIEFub3RoZXIgcGVydGluZW50IHF1ZXN0aW9uOiBXaGF0IHNvcnRzIG9mIHByb2JsZW1zIG9jY3VyIHdpdGggdGhlIGZsZXNoeSBzaWRlIG9mIHRoZSBpbnRlcmZhY2U/CgpgYGB7cn0KZCAlPiUKIGZpbHRlcihncmVwbCgiaW5mZWN0aW9uIiwgYm9keSwgaWdub3JlLmNhc2U9VFJVRSkgJgogICAgICAgIGdyZXBsKCJzaXRlIiwgYm9keSwgaWdub3JlLmNhc2U9VFJVRSkpICU+JQogIHNhbXBsZV9uKDM1KSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKICAKYGBgCgpUaGUgY29tbWVudHMgcmV2ZWFsIHRoYXQgdGhlIGZsZXNoeSBpbnRlcmZhY2UgbXVzdCBiZSByb3RhdGVkIGV2ZXJ5IHNldmVyYWwgZGF5cywgaWYgbm90LCBhIHNpdGUgY2FuIGJlY29tZSBpbmZlY3RlZCBhbmQvb3IgY2F1c2UgcG9vciBpbnN1bGluIGluZnVzaW9uIHJlc3VsdGluZyBpbiBoaWdoIGJsb29kIGdsdWNvc2UuIAoKVGhlcmUgYXJlIHNvIG1hbnkgcG90ZW50aWFsIHdheXMgdG8gbG9vayBhdCB1bnN0cnVjdHVyZWQgZGF0YSB1c2luZyBSIGFuZCBkcGx5ciwgaXQgcmVhbGx5IGlzIHVwIHRvIHRoZSBpbWFnaW5hdGlvbi4gQXMgeW91IGNhbiBzZWUgaXQgeWllbGRzIHNvbWUgcHJldHR5IHJpY2ggZGF0YSwgd2hpY2ggdWx0aW1hdGVseSBpcyBmaWx0ZXJlZCB0aHJvdWdoIHRoZSByZXNlYXJjaGVyLiBUaGVyZSBhcmUgbWFueSBsaW1pdGF0aW9ucyB0byB0aGlzIG1peGluZyB1cCBvZiBtZXRob2RzLiAKCgpUaGUgbGFyZ2VyIHJlZGRpdCBkYXRhIGNvcnB1cyBpcyBwdWJsaWNseSBhdmFpbGFibGUgYXQgaHR0cHM6Ly9hcmNoaXZlLm9yZy9kZXRhaWxzLzIwMTVfcmVkZGl0X2NvbW1lbnRzX2NvcnB1cy4gVG8gbWFrZSB0aGlzIGRhdGEgc2V0IGFuZCBjb2RlIGF2YWlsYWJsZSBhbmQgYWNjZXNzaWJsZSwgSSBhbSBob3N0aW5nIGl0IGluIGFuIFMzIGJ1Y2tldCB0aHJvdWdoIEFtYXpvbiBXZWIgU2VydmljZXMgKEFXUykuIEl0IGlzIGFsc28gaW1wb3J0YW50LCBmcm9tIGEgZmVtaW5pc3QgbWV0aG9kb2xvZ2ljYWwgcGVyc3BlY3RpdmUsIHRvIG1ha2UgbXkgcmVzZWFyY2ggYXZhaWxhYmxlIHRvIHRoZSBjb21tdW5pdHkgd2l0aCB3aG9zZSBkYXRhIEkgd29ya2VkIGFuZCB3aWxsIHBvc3QgbXkgZ2l0aHViIHJlcG9zaXRvcnkgYXMgd2VsbCBhcyBteSByIG5vdGVib29rIGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9nZW50cnloYW5rcy1hbmFseXNpcy9SZWRkaXRBbmFseXNpcy5uYi5odG1sIHRvIHRoZSBzdWJyZWRkaXQgb25jZSBjb21wbGV0ZWQuIFVzaW5nIHIgbm90ZWJvb2sgYWxzbyBtYWtlcyBteSByZXNlYXJjaCByZWFkaWx5IGF2YWlsYWJsZSB0aHJvdWdoIGF1dG8gZ2VuZXJhdGlvbiBvZiBodG1sIGZvciBpbW1lZGlhdGUgd2ViIGhvc3RpbmcuICAKCkluc3VsaW4gcHVtcCBhbmQgY29udGludW91cyBnbHVjb3NlIG1vbml0b3IgdXNlcnMgZ2VuZXJhdGUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLCBidXQgb2Z0ZW4gaGF2ZSB0cm91YmxlIGFjY2Vzc2luZyBvciBtYWtpbmcgc2Vuc2Ugb2YgdGhhdCBkYXRhLCBub3QgdG8gbWVudGlvbiB0aGUgZW1ib2RpZWQgdG9sbCB0aGlzIGRhdGEgY29sbGVjdGlvbiB0YWtlcywgb2Z0ZW4gY2F1c2luZyBpbmZlY3Rpb24gb3IgZGFtYWdlIHRvIHRoZSBmbGVzaHkgc2lkZSBvZiB0aGUgaW50ZXJmYWNlLgoKCiMgRGlzY3Vzc2lvbiBRdWVzdGlvbnMKV2hhdCBhYm91dCB0cnVzdHdvcnRoaW5lc3Mgb2YgaW50ZXJuZXQgZGF0YSBbQGhhcnRpZzIwMDh0cnVzdHdvcnRoaW5lc3NdPyBUaGVyZSBpcyBsaXR0bGUgaW5jZW50aXZlIHRvIGxpZSBpbiB0aGlzIHN1YnJlZGRpdC4gCkV0aGljcyBvZiBuZXRub2dyYXBoeT8KClRoZW9yZXRpY2FsIGh1cmRsZXM/CgojIEknZCBsaWtlIHRvIHRoYW5rIENocmlzdG9waGVyIFBldGVycywgdGhlIHVzZXJzIG9mIHIvZGlhYmV0ZXMsIFF1ZWVuJ3MgVW5pdmVyc2l0eSwgYW5kIHRoZSBvcmdhbml6ZXJzIG9mIHRoaXMgc2Vzc2lvbi4KCgoKCmh0dHA6Ly93d3cuZ2VudHJ5aGFua3MuY29tCgpWaXNpdCBteSBSIG5vdGVib29rIGFuZCBHaXRIdWIgcmVwbyBvbiByL2RpYWJldGVzIHJlZGRpdCBkYXRhISAKUiBub3RlYm9vazogaHR0cDovL2JpdC5seS8ybkk3OVZMICAKR2l0SHViOiBodHRwOi8vYml0Lmx5LzJuZ1dsU1IgCgoKCgojIEJpYmxpb2dyYXBoeQo=