1) Read and Process Data

library(data.table)
webURL <- "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2Factivity.zip"
destURL <- file.path(getwd(),paste("activity_monitoring_data",".zip",sep = ""))
localFileURL <- file.path(getwd(),paste("activity",".csv",sep = ""))
download.file(webURL,destfile = destURL)
trying URL 'https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2Factivity.zip'
Content type 'application/zip' length 53559 bytes (52 KB)
==================================================
downloaded 52 KB
unzip(destURL)
#activityData <- as.data.frame(read.csv(localFileURL))
activityData <- read.csv(localFileURL, quote = "\"",stringsAsFactors = FALSE)
activityData$steps <- as.numeric(activityData$steps)
activityData$interval <- as.numeric(activityData$interval)
activityData$date <- as.Date(activityData$date,format = "%Y-%m-%d")

2) Histogram of the total number of steps taken each day

#   2) Histogram of the total number of steps taken each day
activityDataAg <- aggregate(activityData$steps,list(activityData$date),sum)
names(activityDataAg) <- c("date","totalSteps")
#activityDataAg <- activityDataAg[complete.cases(activityDataAg),]
hist(activityDataAg$totalSteps, xlab = "TotalSteps", breaks = 10)

3) Mean and median number of steps taken each day

The total median steps are 10765 and the mean for the total steps taken is 10766

#3) Mean and median number of steps taken each day
stepSummary <- as.table(summary(activityDataAg$totalSteps))
stepsMedian <- stepSummary[3]
stepsMean <- stepSummary[4]

4) Time series plot of the average number of steps taken

# 4) Time series plot of the average number of steps taken
# removed na's
actDataAg <- activityDataAg[complete.cases(activityDataAg),]
#activityTS= ts(rnorm(48), start=c(2293,6), frequency=1)
plot(actDataAg$date,actDataAg$totalSteps,type = "l", xlab = "date",ylab = "total steps")

5) The 5-minute interval that, on average, contains the maximum number of steps

The 5 minutes interval with the most steps is 835. The average number of steps at this interval is 206.2.

# 5   The 5-minute interval that, on average, contains the maximum number of steps
activity5min <- activityData[complete.cases(activityData),]
activity5min <- aggregate(activity5min$steps,list(activity5min$interval),mean)
names(activity5min) <- c("interval","avgsteps")
activity5min$avgsteps <- round(activity5min$avgsteps,1)
plot(activity5min$interval,activity5min$avgsteps,type = "l", xlab = "5min interval", ylab = "5min Avg Steps")

6 Code to describe and show a strategy for imputing missing datas

There are 2304 days that have NA’s

#stepSummary <- as.table(summary(activityDataAg$totalSteps))
#rowsNA <- nrow(activityData[!complete.cases(activityData),])

The strategy to fill na’s included calculating the average steps per interval. Then NA’s were replaced with the average value in respect to its interval. The mean after replacing the NA’s is 10766 and the median is 10766. The total daily steps and the average per inverval had no significant changes after filling the NA’s, as can be seen on the charts.

#  6 Code to describe and show a strategy for imputing missing data
stepSummary <- as.table(summary(activityDataAg$totalSteps))
rowsNA <- nrow(activityData[!complete.cases(activityData),])
#library(zoo)
activityIntMerge <- merge(activityData,activity5min, by = "interval", all.x = TRUE)
activityIntMerge$steps <- ifelse(is.na(activityIntMerge$steps) == TRUE, activityIntMerge$avgsteps, activityIntMerge$steps)
activityIntMergeSum <- aggregate(activityIntMerge$steps,list(activityIntMerge$date),sum)
names(activityIntMergeSum) <- c("date","totalSteps")
activityIntMergeSum$date <-  as.Date(activityIntMergeSum$date,format = "%Y-%m-%d")
activityIntMergeSum$totalSteps <- as.numeric(activityIntMergeSum$totalSteps)
7) Histogram of the total number of steps taken each day after missing values are imputed
hist(activityIntMergeSum$totalSteps, main = "Total Steps NA filled with Interval Avg",xlab = "TotalSteps", breaks = 10 )

NAFillStepsSummary <- as.table(summary(activityIntMergeSum$totalSteps))
activityIntMergeAvg<- aggregate(activityIntMerge$steps,list(activityIntMerge$interval),mean)
names(activityIntMergeAvg) <- c("interval","avgSteps")
activityIntMergeAvg$avgSteps <- round(activityIntMergeAvg$avgSteps,1)
plot(activityIntMergeAvg$interval,activityIntMergeAvg$avgSteps,type = "l", main = "Interval after NA Filled",xlab = "5min interval", ylab = "5min Avg Steps")

8) Panel plot comparing the average number of steps taken per 5-minute interval across weekdays and weekends
###### 8) Panel plot comparing the average number of steps taken per 5-minute interval across weekdays and weekends
activityData$wkdy <- weekdays(activityData$date)
activityData$weektype <- ifelse((activityData$wkdy == "Saturday" | activityData$wkdy == "Sunday"), "Weekend", "Weekday" )
activityWk <- activityData[complete.cases(activityData),]
activityWkend <- aggregate(activityWk[which(activityWk$weektype =="Weekend"),"steps"]
                           , list(activityWk[which(activityWk$weektype =="Weekend"),"interval"]),mean)
names(activityWkend) <- c("interval","avgSteps")
activityWkend$interval <- as.integer(activityWkend$interval)
activityWkend$avgSteps <- round(as.numeric(activityWkend$avgSteps),1)
activityWkdy <- aggregate(activityWk[which(activityWk$weektype =="Weekday"),"steps"]
                           , list(activityWk[which(activityWk$weektype =="Weekday"),"interval"]),mean)
names(activityWkdy ) <- c("interval","avgSteps")
activityWkdy$interval <- as.integer(activityWkdy$interval)
activityWkdy$avgSteps <- round(as.numeric(activityWkdy$avgSteps),1)
par(mfrow=c(2,1))
#par(mfcol=c(2,1))
plot(activityWkdy$interval, activityWkdy$avgSteps, type = "l", xlab = "", ylab = "WkDay Avg Steps")
plot(activityWkend$interval, activityWkend$avgSteps, type = "l",xlab = "interval", ylab = "WkEnd Avg Steps")
mtext("Weekend vs. Weekday Avg Steps", side=3, outer=TRUE, line=-1) 

LS0tCnRpdGxlOiAiQWN0aXZpdHkgUmVwb3J0IFBBMSIKYXV0aG9yOiAiTWljaGFlbCBHYXJjaWEiCmRhdGU6ICJBdWd1c3QgMSwgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyAxKSBSZWFkIGFuZCBQcm9jZXNzIERhdGEKCmBgYHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KbGlicmFyeShkYXRhLnRhYmxlKQoKd2ViVVJMIDwtICJodHRwczovL2QzOTZxdXN6YTQwb3JjLmNsb3VkZnJvbnQubmV0L3JlcGRhdGElMkZkYXRhJTJGYWN0aXZpdHkuemlwIgpkZXN0VVJMIDwtIGZpbGUucGF0aChnZXR3ZCgpLHBhc3RlKCJhY3Rpdml0eV9tb25pdG9yaW5nX2RhdGEiLCIuemlwIixzZXAgPSAiIikpCmxvY2FsRmlsZVVSTCA8LSBmaWxlLnBhdGgoZ2V0d2QoKSxwYXN0ZSgiYWN0aXZpdHkiLCIuY3N2IixzZXAgPSAiIikpCmRvd25sb2FkLmZpbGUod2ViVVJMLGRlc3RmaWxlID0gZGVzdFVSTCkKCnVuemlwKGRlc3RVUkwpCiNhY3Rpdml0eURhdGEgPC0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdihsb2NhbEZpbGVVUkwpKQphY3Rpdml0eURhdGEgPC0gcmVhZC5jc3YobG9jYWxGaWxlVVJMLCBxdW90ZSA9ICJcIiIsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQphY3Rpdml0eURhdGEkc3RlcHMgPC0gYXMubnVtZXJpYyhhY3Rpdml0eURhdGEkc3RlcHMpCmFjdGl2aXR5RGF0YSRpbnRlcnZhbCA8LSBhcy5udW1lcmljKGFjdGl2aXR5RGF0YSRpbnRlcnZhbCkKYWN0aXZpdHlEYXRhJGRhdGUgPC0gYXMuRGF0ZShhY3Rpdml0eURhdGEkZGF0ZSxmb3JtYXQgPSAiJVktJW0tJWQiKQoKYGBgCgoKIyMjIyAyKSBIaXN0b2dyYW0gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQoKCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KIyAgIDIpIEhpc3RvZ3JhbSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5CmFjdGl2aXR5RGF0YUFnIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eURhdGEkc3RlcHMsbGlzdChhY3Rpdml0eURhdGEkZGF0ZSksc3VtKQpuYW1lcyhhY3Rpdml0eURhdGFBZykgPC0gYygiZGF0ZSIsInRvdGFsU3RlcHMiKQojYWN0aXZpdHlEYXRhQWcgPC0gYWN0aXZpdHlEYXRhQWdbY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhQWcpLF0KaGlzdChhY3Rpdml0eURhdGFBZyR0b3RhbFN0ZXBzLCB4bGFiID0gIlRvdGFsU3RlcHMiLCBicmVha3MgPSAxMCkKYGBgCgoKIyMjIyAzKSBNZWFuIGFuZCBtZWRpYW4gbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5ClRoZSB0b3RhbCBtZWRpYW4gc3RlcHMgYXJlIGByIGFzLmludGVnZXIoc3RlcHNNZWRpYW4pYCBhbmQgdGhlIG1lYW4gZm9yIHRoZSB0b3RhbCBzdGVwcyB0YWtlbiBpcyBgciBhcy5pbnRlZ2VyKHN0ZXBzTWVhbilgCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQojMykgTWVhbiBhbmQgbWVkaWFuIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQpzdGVwU3VtbWFyeSA8LSBhcy50YWJsZShzdW1tYXJ5KGFjdGl2aXR5RGF0YUFnJHRvdGFsU3RlcHMpKQpzdGVwc01lZGlhbiA8LSBzdGVwU3VtbWFyeVszXQpzdGVwc01lYW4gPC0gc3RlcFN1bW1hcnlbNF0KYGBgCgoKIyMjIyA0KSBUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBzdGVwcyB0YWtlbgoKCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgNCkgVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4KIyByZW1vdmVkIG5hJ3MKYWN0RGF0YUFnIDwtIGFjdGl2aXR5RGF0YUFnW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YUFnKSxdCiNhY3Rpdml0eVRTPSB0cyhybm9ybSg0OCksIHN0YXJ0PWMoMjI5Myw2KSwgZnJlcXVlbmN5PTEpCnBsb3QoYWN0RGF0YUFnJGRhdGUsYWN0RGF0YUFnJHRvdGFsU3RlcHMsdHlwZSA9ICJsIiwgeGxhYiA9ICJkYXRlIix5bGFiID0gInRvdGFsIHN0ZXBzIikKYGBgCgoKIyMjIyA1KSBUaGUgNS1taW51dGUgaW50ZXJ2YWwgdGhhdCwgb24gYXZlcmFnZSwgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzClRoZSA1IG1pbnV0ZXMgaW50ZXJ2YWwgd2l0aCB0aGUgbW9zdCBzdGVwcyBpcyBgciBhY3Rpdml0eTVtaW5bd2hpY2goYWN0aXZpdHk1bWluJGF2Z3N0ZXBzID09IG1heChhY3Rpdml0eTVtaW4kYXZnc3RlcHMpKSwiaW50ZXJ2YWwiXWAuIFRoZSBhdmVyYWdlIG51bWJlciBvZiBzdGVwcyBhdCB0aGlzIGludGVydmFsIGlzIGByIGFjdGl2aXR5NW1pblt3aGljaChhY3Rpdml0eTVtaW4kYXZnc3RlcHMgPT0gbWF4KGFjdGl2aXR5NW1pbiRhdmdzdGVwcykpLCJhdmdzdGVwcyJdYC4KCmBgYCB7ciBpbmNsdWRlID0gVFJVRSxlY2hvID0gVFJVRX0KIyA1ICAgVGhlIDUtbWludXRlIGludGVydmFsIHRoYXQsIG9uIGF2ZXJhZ2UsIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcwphY3Rpdml0eTVtaW4gPC0gYWN0aXZpdHlEYXRhW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXQphY3Rpdml0eTVtaW4gPC0gYWdncmVnYXRlKGFjdGl2aXR5NW1pbiRzdGVwcyxsaXN0KGFjdGl2aXR5NW1pbiRpbnRlcnZhbCksbWVhbikKbmFtZXMoYWN0aXZpdHk1bWluKSA8LSBjKCJpbnRlcnZhbCIsImF2Z3N0ZXBzIikKYWN0aXZpdHk1bWluJGF2Z3N0ZXBzIDwtIHJvdW5kKGFjdGl2aXR5NW1pbiRhdmdzdGVwcywxKQpwbG90KGFjdGl2aXR5NW1pbiRpbnRlcnZhbCxhY3Rpdml0eTVtaW4kYXZnc3RlcHMsdHlwZSA9ICJsIiwgeGxhYiA9ICI1bWluIGludGVydmFsIiwgeWxhYiA9ICI1bWluIEF2ZyBTdGVwcyIpCgpgYGAKCiMjIyMjIyAgNiBDb2RlIHRvIGRlc2NyaWJlIGFuZCBzaG93IGEgc3RyYXRlZ3kgZm9yIGltcHV0aW5nIG1pc3NpbmcgZGF0YXMKVGhlcmUgYXJlIGByICBucm93KGFjdGl2aXR5RGF0YVshY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhKSxdKWAgZGF5cyB0aGF0IGhhdmUgTkEncwoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KI3N0ZXBTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlEYXRhQWckdG90YWxTdGVwcykpCiNyb3dzTkEgPC0gbnJvdyhhY3Rpdml0eURhdGFbIWNvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXSkKYGBgCgpUaGUgc3RyYXRlZ3kgdG8gZmlsbCBuYSdzIGluY2x1ZGVkIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIHN0ZXBzIHBlciBpbnRlcnZhbC4gVGhlbiBOQSdzIHdlcmUgcmVwbGFjZWQgd2l0aCB0aGUgYXZlcmFnZSB2YWx1ZSBpbiByZXNwZWN0IHRvIGl0cyBpbnRlcnZhbC4gVGhlIG1lYW4gYWZ0ZXIgcmVwbGFjaW5nIHRoZSBOQSdzIGlzIGByIGFzLmludGVnZXIocm91bmQoTkFGaWxsU3RlcHNTdW1tYXJ5WzRdLDApKWAgYW5kIHRoZSBtZWRpYW4gaXMgYHIgYXMuaW50ZWdlcihyb3VuZChOQUZpbGxTdGVwc1N1bW1hcnlbM10sMCkpYC4gVGhlIHRvdGFsIGRhaWx5IHN0ZXBzIGFuZCB0aGUgYXZlcmFnZSBwZXIgaW52ZXJ2YWwgaGFkIG5vIHNpZ25pZmljYW50IGNoYW5nZXMgYWZ0ZXIgZmlsbGluZyB0aGUgTkEncywgYXMgY2FuIGJlIHNlZW4gb24gdGhlIGNoYXJ0cy4KCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgIDYgQ29kZSB0byBkZXNjcmliZSBhbmQgc2hvdyBhIHN0cmF0ZWd5IGZvciBpbXB1dGluZyBtaXNzaW5nIGRhdGEKCnN0ZXBTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlEYXRhQWckdG90YWxTdGVwcykpCgpyb3dzTkEgPC0gbnJvdyhhY3Rpdml0eURhdGFbIWNvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXSkKCgoKI2xpYnJhcnkoem9vKQphY3Rpdml0eUludE1lcmdlIDwtIG1lcmdlKGFjdGl2aXR5RGF0YSxhY3Rpdml0eTVtaW4sIGJ5ID0gImludGVydmFsIiwgYWxsLnggPSBUUlVFKQphY3Rpdml0eUludE1lcmdlJHN0ZXBzIDwtIGlmZWxzZShpcy5uYShhY3Rpdml0eUludE1lcmdlJHN0ZXBzKSA9PSBUUlVFLCBhY3Rpdml0eUludE1lcmdlJGF2Z3N0ZXBzLCBhY3Rpdml0eUludE1lcmdlJHN0ZXBzKQphY3Rpdml0eUludE1lcmdlU3VtIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eUludE1lcmdlJHN0ZXBzLGxpc3QoYWN0aXZpdHlJbnRNZXJnZSRkYXRlKSxzdW0pCm5hbWVzKGFjdGl2aXR5SW50TWVyZ2VTdW0pIDwtIGMoImRhdGUiLCJ0b3RhbFN0ZXBzIikKYWN0aXZpdHlJbnRNZXJnZVN1bSRkYXRlIDwtICBhcy5EYXRlKGFjdGl2aXR5SW50TWVyZ2VTdW0kZGF0ZSxmb3JtYXQgPSAiJVktJW0tJWQiKQphY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMgPC0gYXMubnVtZXJpYyhhY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMpCmBgYAoKCiMjIyMjIyA3KSBIaXN0b2dyYW0gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheSBhZnRlciBtaXNzaW5nIHZhbHVlcyBhcmUgaW1wdXRlZAoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFICwgZWNobyA9IFRSVUV9Cmhpc3QoYWN0aXZpdHlJbnRNZXJnZVN1bSR0b3RhbFN0ZXBzLCBtYWluID0gIlRvdGFsIFN0ZXBzIE5BIGZpbGxlZCB3aXRoIEludGVydmFsIEF2ZyIseGxhYiA9ICJUb3RhbFN0ZXBzIiwgYnJlYWtzID0gMTAgKQoKTkFGaWxsU3RlcHNTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlJbnRNZXJnZVN1bSR0b3RhbFN0ZXBzKSkKYGBgCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KYWN0aXZpdHlJbnRNZXJnZUF2ZzwtIGFnZ3JlZ2F0ZShhY3Rpdml0eUludE1lcmdlJHN0ZXBzLGxpc3QoYWN0aXZpdHlJbnRNZXJnZSRpbnRlcnZhbCksbWVhbikKbmFtZXMoYWN0aXZpdHlJbnRNZXJnZUF2ZykgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5SW50TWVyZ2VBdmckYXZnU3RlcHMgPC0gcm91bmQoYWN0aXZpdHlJbnRNZXJnZUF2ZyRhdmdTdGVwcywxKQpwbG90KGFjdGl2aXR5SW50TWVyZ2VBdmckaW50ZXJ2YWwsYWN0aXZpdHlJbnRNZXJnZUF2ZyRhdmdTdGVwcyx0eXBlID0gImwiLCBtYWluID0gIkludGVydmFsIGFmdGVyIE5BIEZpbGxlZCIseGxhYiA9ICI1bWluIGludGVydmFsIiwgeWxhYiA9ICI1bWluIEF2ZyBTdGVwcyIpCmBgYAoKCiMjIyMjIyA4KSBQYW5lbCBwbG90IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4gcGVyIDUtbWludXRlIGludGVydmFsIGFjcm9zcyB3ZWVrZGF5cyBhbmQgd2Vla2VuZHMKCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQojIyMjIyMgOCkgUGFuZWwgcGxvdCBjb21wYXJpbmcgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIHBlciA1LW1pbnV0ZSBpbnRlcnZhbCBhY3Jvc3Mgd2Vla2RheXMgYW5kIHdlZWtlbmRzCgphY3Rpdml0eURhdGEkd2tkeSA8LSB3ZWVrZGF5cyhhY3Rpdml0eURhdGEkZGF0ZSkKYWN0aXZpdHlEYXRhJHdlZWt0eXBlIDwtIGlmZWxzZSgoYWN0aXZpdHlEYXRhJHdrZHkgPT0gIlNhdHVyZGF5IiB8IGFjdGl2aXR5RGF0YSR3a2R5ID09ICJTdW5kYXkiKSwgIldlZWtlbmQiLCAiV2Vla2RheSIgKQphY3Rpdml0eVdrIDwtIGFjdGl2aXR5RGF0YVtjb21wbGV0ZS5jYXNlcyhhY3Rpdml0eURhdGEpLF0KYWN0aXZpdHlXa2VuZCA8LSBhZ2dyZWdhdGUoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtlbmQiKSwic3RlcHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxpc3QoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtlbmQiKSwiaW50ZXJ2YWwiXSksbWVhbikKbmFtZXMoYWN0aXZpdHlXa2VuZCkgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5V2tlbmQkaW50ZXJ2YWwgPC0gYXMuaW50ZWdlcihhY3Rpdml0eVdrZW5kJGludGVydmFsKQphY3Rpdml0eVdrZW5kJGF2Z1N0ZXBzIDwtIHJvdW5kKGFzLm51bWVyaWMoYWN0aXZpdHlXa2VuZCRhdmdTdGVwcyksMSkKCmFjdGl2aXR5V2tkeSA8LSBhZ2dyZWdhdGUoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtkYXkiKSwic3RlcHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxpc3QoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtkYXkiKSwiaW50ZXJ2YWwiXSksbWVhbikKbmFtZXMoYWN0aXZpdHlXa2R5ICkgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5V2tkeSRpbnRlcnZhbCA8LSBhcy5pbnRlZ2VyKGFjdGl2aXR5V2tkeSRpbnRlcnZhbCkKYWN0aXZpdHlXa2R5JGF2Z1N0ZXBzIDwtIHJvdW5kKGFzLm51bWVyaWMoYWN0aXZpdHlXa2R5JGF2Z1N0ZXBzKSwxKQpwYXIobWZyb3c9YygyLDEpKQojcGFyKG1mY29sPWMoMiwxKSkKcGxvdChhY3Rpdml0eVdrZHkkaW50ZXJ2YWwsIGFjdGl2aXR5V2tkeSRhdmdTdGVwcywgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIldrRGF5IEF2ZyBTdGVwcyIpCnBsb3QoYWN0aXZpdHlXa2VuZCRpbnRlcnZhbCwgYWN0aXZpdHlXa2VuZCRhdmdTdGVwcywgdHlwZSA9ICJsIix4bGFiID0gImludGVydmFsIiwgeWxhYiA9ICJXa0VuZCBBdmcgU3RlcHMiKQptdGV4dCgiV2Vla2VuZCB2cy4gV2Vla2RheSBBdmcgU3RlcHMiLCBzaWRlPTMsIG91dGVyPVRSVUUsIGxpbmU9LTEpIApgYGAKCiMjIyMjIExpY2Vuc2UgYW5kIENvcHlyaWdodAogICBDb3B5cmlnaHQgMjAxNyBNaWNoYWVsIEdhcmNpYS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgSW5xdWlyaWVzIG1nYXJfZGF0YXNjaWVuY2UgYXQgcHJvdG9ubWFpbC5jb20KICAKCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5zCg==