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)

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)

License and Copyright
Copyright 2017 Michael Garcia. All Rights Reserved. Inquiries mgar_datascience at protonmail.com
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.s
LS0tCnRpdGxlOiAiQWN0aXZpdHkgUmVwb3J0IFBBMSIKYXV0aG9yOiAiTWljaGFlbCBHYXJjaWEiCmRhdGU6ICJBdWd1c3QgMSwgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyAxKSBSZWFkIGFuZCBQcm9jZXNzIERhdGEKCmBgYHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KbGlicmFyeShkYXRhLnRhYmxlKQoKd2ViVVJMIDwtICJodHRwczovL2QzOTZxdXN6YTQwb3JjLmNsb3VkZnJvbnQubmV0L3JlcGRhdGElMkZkYXRhJTJGYWN0aXZpdHkuemlwIgpkZXN0VVJMIDwtIGZpbGUucGF0aChnZXR3ZCgpLHBhc3RlKCJhY3Rpdml0eV9tb25pdG9yaW5nX2RhdGEiLCIuemlwIixzZXAgPSAiIikpCmxvY2FsRmlsZVVSTCA8LSBmaWxlLnBhdGgoZ2V0d2QoKSxwYXN0ZSgiYWN0aXZpdHkiLCIuY3N2IixzZXAgPSAiIikpCmRvd25sb2FkLmZpbGUod2ViVVJMLGRlc3RmaWxlID0gZGVzdFVSTCkKCnVuemlwKGRlc3RVUkwpCiNhY3Rpdml0eURhdGEgPC0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdihsb2NhbEZpbGVVUkwpKQphY3Rpdml0eURhdGEgPC0gcmVhZC5jc3YobG9jYWxGaWxlVVJMLCBxdW90ZSA9ICJcIiIsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQphY3Rpdml0eURhdGEkc3RlcHMgPC0gYXMubnVtZXJpYyhhY3Rpdml0eURhdGEkc3RlcHMpCmFjdGl2aXR5RGF0YSRpbnRlcnZhbCA8LSBhcy5udW1lcmljKGFjdGl2aXR5RGF0YSRpbnRlcnZhbCkKYWN0aXZpdHlEYXRhJGRhdGUgPC0gYXMuRGF0ZShhY3Rpdml0eURhdGEkZGF0ZSxmb3JtYXQgPSAiJVktJW0tJWQiKQoKYGBgCgoKIyMjIyAyKSBIaXN0b2dyYW0gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQoKCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KIyAgIDIpIEhpc3RvZ3JhbSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5CmFjdGl2aXR5RGF0YUFnIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eURhdGEkc3RlcHMsbGlzdChhY3Rpdml0eURhdGEkZGF0ZSksc3VtKQpuYW1lcyhhY3Rpdml0eURhdGFBZykgPC0gYygiZGF0ZSIsInRvdGFsU3RlcHMiKQojYWN0aXZpdHlEYXRhQWcgPC0gYWN0aXZpdHlEYXRhQWdbY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhQWcpLF0KaGlzdChhY3Rpdml0eURhdGFBZyR0b3RhbFN0ZXBzLCB4bGFiID0gIlRvdGFsU3RlcHMiLCBicmVha3MgPSAxMCkKYGBgCgoKIyMjIyAzKSBNZWFuIGFuZCBtZWRpYW4gbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5ClRoZSB0b3RhbCBtZWRpYW4gc3RlcHMgYXJlIGByIGFzLmludGVnZXIoc3RlcHNNZWRpYW4pYCBhbmQgdGhlIG1lYW4gZm9yIHRoZSB0b3RhbCBzdGVwcyB0YWtlbiBpcyBgciBhcy5pbnRlZ2VyKHN0ZXBzTWVhbilgCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQojMykgTWVhbiBhbmQgbWVkaWFuIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQpzdGVwU3VtbWFyeSA8LSBhcy50YWJsZShzdW1tYXJ5KGFjdGl2aXR5RGF0YUFnJHRvdGFsU3RlcHMpKQpzdGVwc01lZGlhbiA8LSBzdGVwU3VtbWFyeVszXQpzdGVwc01lYW4gPC0gc3RlcFN1bW1hcnlbNF0KYGBgCgoKIyMjIyA0KSBUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBzdGVwcyB0YWtlbgoKCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgNCkgVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4KIyByZW1vdmVkIG5hJ3MKYWN0RGF0YUFnIDwtIGFjdGl2aXR5RGF0YUFnW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YUFnKSxdCiNhY3Rpdml0eVRTPSB0cyhybm9ybSg0OCksIHN0YXJ0PWMoMjI5Myw2KSwgZnJlcXVlbmN5PTEpCnBsb3QoYWN0RGF0YUFnJGRhdGUsYWN0RGF0YUFnJHRvdGFsU3RlcHMsdHlwZSA9ICJsIiwgeGxhYiA9ICJkYXRlIix5bGFiID0gInRvdGFsIHN0ZXBzIikKYGBgCgoKIyMjIyA1KSBUaGUgNS1taW51dGUgaW50ZXJ2YWwgdGhhdCwgb24gYXZlcmFnZSwgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzClRoZSA1IG1pbnV0ZXMgaW50ZXJ2YWwgd2l0aCB0aGUgbW9zdCBzdGVwcyBpcyBgciBhY3Rpdml0eTVtaW5bd2hpY2goYWN0aXZpdHk1bWluJGF2Z3N0ZXBzID09IG1heChhY3Rpdml0eTVtaW4kYXZnc3RlcHMpKSwiaW50ZXJ2YWwiXWAuIFRoZSBhdmVyYWdlIG51bWJlciBvZiBzdGVwcyBhdCB0aGlzIGludGVydmFsIGlzIGByIGFjdGl2aXR5NW1pblt3aGljaChhY3Rpdml0eTVtaW4kYXZnc3RlcHMgPT0gbWF4KGFjdGl2aXR5NW1pbiRhdmdzdGVwcykpLCJhdmdzdGVwcyJdYC4KCmBgYCB7ciBpbmNsdWRlID0gVFJVRSxlY2hvID0gVFJVRX0KIyA1ICAgVGhlIDUtbWludXRlIGludGVydmFsIHRoYXQsIG9uIGF2ZXJhZ2UsIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcwphY3Rpdml0eTVtaW4gPC0gYWN0aXZpdHlEYXRhW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXQphY3Rpdml0eTVtaW4gPC0gYWdncmVnYXRlKGFjdGl2aXR5NW1pbiRzdGVwcyxsaXN0KGFjdGl2aXR5NW1pbiRpbnRlcnZhbCksbWVhbikKbmFtZXMoYWN0aXZpdHk1bWluKSA8LSBjKCJpbnRlcnZhbCIsImF2Z3N0ZXBzIikKYWN0aXZpdHk1bWluJGF2Z3N0ZXBzIDwtIHJvdW5kKGFjdGl2aXR5NW1pbiRhdmdzdGVwcywxKQpwbG90KGFjdGl2aXR5NW1pbiRpbnRlcnZhbCxhY3Rpdml0eTVtaW4kYXZnc3RlcHMsdHlwZSA9ICJsIiwgeGxhYiA9ICI1bWluIGludGVydmFsIiwgeWxhYiA9ICI1bWluIEF2ZyBTdGVwcyIpCgpgYGAKCiMjIyMjIyAgNiBDb2RlIHRvIGRlc2NyaWJlIGFuZCBzaG93IGEgc3RyYXRlZ3kgZm9yIGltcHV0aW5nIG1pc3NpbmcgZGF0YXMKVGhlcmUgYXJlIGByICBucm93KGFjdGl2aXR5RGF0YVshY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhKSxdKWAgZGF5cyB0aGF0IGhhdmUgTkEncwoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KI3N0ZXBTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlEYXRhQWckdG90YWxTdGVwcykpCiNyb3dzTkEgPC0gbnJvdyhhY3Rpdml0eURhdGFbIWNvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXSkKYGBgCgpUaGUgc3RyYXRlZ3kgdG8gZmlsbCBuYSdzIGluY2x1ZGVkIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIHN0ZXBzIHBlciBpbnRlcnZhbC4gVGhlbiBOQSdzIHdlcmUgcmVwbGFjZWQgd2l0aCB0aGUgYXZlcmFnZSB2YWx1ZSBpbiByZXNwZWN0IHRvIGl0cyBpbnRlcnZhbC4gVGhlIG1lYW4gYWZ0ZXIgcmVwbGFjaW5nIHRoZSBOQSdzIGlzIGByIGFzLmludGVnZXIocm91bmQoTkFGaWxsU3RlcHNTdW1tYXJ5WzRdLDApKWAgYW5kIHRoZSBtZWRpYW4gaXMgYHIgYXMuaW50ZWdlcihyb3VuZChOQUZpbGxTdGVwc1N1bW1hcnlbM10sMCkpYC4gVGhlIHRvdGFsIGRhaWx5IHN0ZXBzIGFuZCB0aGUgYXZlcmFnZSBwZXIgaW52ZXJ2YWwgaGFkIG5vIHNpZ25pZmljYW50IGNoYW5nZXMgYWZ0ZXIgZmlsbGluZyB0aGUgTkEncywgYXMgY2FuIGJlIHNlZW4gb24gdGhlIGNoYXJ0cy4KCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgIDYgQ29kZSB0byBkZXNjcmliZSBhbmQgc2hvdyBhIHN0cmF0ZWd5IGZvciBpbXB1dGluZyBtaXNzaW5nIGRhdGEKCnN0ZXBTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlEYXRhQWckdG90YWxTdGVwcykpCgpyb3dzTkEgPC0gbnJvdyhhY3Rpdml0eURhdGFbIWNvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXSkKCgoKI2xpYnJhcnkoem9vKQphY3Rpdml0eUludE1lcmdlIDwtIG1lcmdlKGFjdGl2aXR5RGF0YSxhY3Rpdml0eTVtaW4sIGJ5ID0gImludGVydmFsIiwgYWxsLnggPSBUUlVFKQphY3Rpdml0eUludE1lcmdlJHN0ZXBzIDwtIGlmZWxzZShpcy5uYShhY3Rpdml0eUludE1lcmdlJHN0ZXBzKSA9PSBUUlVFLCBhY3Rpdml0eUludE1lcmdlJGF2Z3N0ZXBzLCBhY3Rpdml0eUludE1lcmdlJHN0ZXBzKQphY3Rpdml0eUludE1lcmdlU3VtIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eUludE1lcmdlJHN0ZXBzLGxpc3QoYWN0aXZpdHlJbnRNZXJnZSRkYXRlKSxzdW0pCm5hbWVzKGFjdGl2aXR5SW50TWVyZ2VTdW0pIDwtIGMoImRhdGUiLCJ0b3RhbFN0ZXBzIikKYWN0aXZpdHlJbnRNZXJnZVN1bSRkYXRlIDwtICBhcy5EYXRlKGFjdGl2aXR5SW50TWVyZ2VTdW0kZGF0ZSxmb3JtYXQgPSAiJVktJW0tJWQiKQphY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMgPC0gYXMubnVtZXJpYyhhY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMpCmBgYAoKCiMjIyMjIyA3KSBIaXN0b2dyYW0gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheSBhZnRlciBtaXNzaW5nIHZhbHVlcyBhcmUgaW1wdXRlZAoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFICwgZWNobyA9IFRSVUV9Cmhpc3QoYWN0aXZpdHlJbnRNZXJnZVN1bSR0b3RhbFN0ZXBzLCBtYWluID0gIlRvdGFsIFN0ZXBzIE5BIGZpbGxlZCB3aXRoIEludGVydmFsIEF2ZyIseGxhYiA9ICJUb3RhbFN0ZXBzIiwgYnJlYWtzID0gMTAgKQoKTkFGaWxsU3RlcHNTdW1tYXJ5IDwtIGFzLnRhYmxlKHN1bW1hcnkoYWN0aXZpdHlJbnRNZXJnZVN1bSR0b3RhbFN0ZXBzKSkKYGBgCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KYWN0aXZpdHlJbnRNZXJnZUF2ZzwtIGFnZ3JlZ2F0ZShhY3Rpdml0eUludE1lcmdlJHN0ZXBzLGxpc3QoYWN0aXZpdHlJbnRNZXJnZSRpbnRlcnZhbCksbWVhbikKbmFtZXMoYWN0aXZpdHlJbnRNZXJnZUF2ZykgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5SW50TWVyZ2VBdmckYXZnU3RlcHMgPC0gcm91bmQoYWN0aXZpdHlJbnRNZXJnZUF2ZyRhdmdTdGVwcywxKQpwbG90KGFjdGl2aXR5SW50TWVyZ2VBdmckaW50ZXJ2YWwsYWN0aXZpdHlJbnRNZXJnZUF2ZyRhdmdTdGVwcyx0eXBlID0gImwiLCBtYWluID0gIkludGVydmFsIGFmdGVyIE5BIEZpbGxlZCIseGxhYiA9ICI1bWluIGludGVydmFsIiwgeWxhYiA9ICI1bWluIEF2ZyBTdGVwcyIpCmBgYAoKCiMjIyMjIyA4KSBQYW5lbCBwbG90IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4gcGVyIDUtbWludXRlIGludGVydmFsIGFjcm9zcyB3ZWVrZGF5cyBhbmQgd2Vla2VuZHMKCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQojIyMjIyMgOCkgUGFuZWwgcGxvdCBjb21wYXJpbmcgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIHBlciA1LW1pbnV0ZSBpbnRlcnZhbCBhY3Jvc3Mgd2Vla2RheXMgYW5kIHdlZWtlbmRzCgphY3Rpdml0eURhdGEkd2tkeSA8LSB3ZWVrZGF5cyhhY3Rpdml0eURhdGEkZGF0ZSkKYWN0aXZpdHlEYXRhJHdlZWt0eXBlIDwtIGlmZWxzZSgoYWN0aXZpdHlEYXRhJHdrZHkgPT0gIlNhdHVyZGF5IiB8IGFjdGl2aXR5RGF0YSR3a2R5ID09ICJTdW5kYXkiKSwgIldlZWtlbmQiLCAiV2Vla2RheSIgKQphY3Rpdml0eVdrIDwtIGFjdGl2aXR5RGF0YVtjb21wbGV0ZS5jYXNlcyhhY3Rpdml0eURhdGEpLF0KYWN0aXZpdHlXa2VuZCA8LSBhZ2dyZWdhdGUoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtlbmQiKSwic3RlcHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxpc3QoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtlbmQiKSwiaW50ZXJ2YWwiXSksbWVhbikKbmFtZXMoYWN0aXZpdHlXa2VuZCkgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5V2tlbmQkaW50ZXJ2YWwgPC0gYXMuaW50ZWdlcihhY3Rpdml0eVdrZW5kJGludGVydmFsKQphY3Rpdml0eVdrZW5kJGF2Z1N0ZXBzIDwtIHJvdW5kKGFzLm51bWVyaWMoYWN0aXZpdHlXa2VuZCRhdmdTdGVwcyksMSkKCmFjdGl2aXR5V2tkeSA8LSBhZ2dyZWdhdGUoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtkYXkiKSwic3RlcHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxpc3QoYWN0aXZpdHlXa1t3aGljaChhY3Rpdml0eVdrJHdlZWt0eXBlID09IldlZWtkYXkiKSwiaW50ZXJ2YWwiXSksbWVhbikKbmFtZXMoYWN0aXZpdHlXa2R5ICkgPC0gYygiaW50ZXJ2YWwiLCJhdmdTdGVwcyIpCmFjdGl2aXR5V2tkeSRpbnRlcnZhbCA8LSBhcy5pbnRlZ2VyKGFjdGl2aXR5V2tkeSRpbnRlcnZhbCkKYWN0aXZpdHlXa2R5JGF2Z1N0ZXBzIDwtIHJvdW5kKGFzLm51bWVyaWMoYWN0aXZpdHlXa2R5JGF2Z1N0ZXBzKSwxKQpwYXIobWZyb3c9YygyLDEpKQojcGFyKG1mY29sPWMoMiwxKSkKcGxvdChhY3Rpdml0eVdrZHkkaW50ZXJ2YWwsIGFjdGl2aXR5V2tkeSRhdmdTdGVwcywgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIldrRGF5IEF2ZyBTdGVwcyIpCnBsb3QoYWN0aXZpdHlXa2VuZCRpbnRlcnZhbCwgYWN0aXZpdHlXa2VuZCRhdmdTdGVwcywgdHlwZSA9ICJsIix4bGFiID0gImludGVydmFsIiwgeWxhYiA9ICJXa0VuZCBBdmcgU3RlcHMiKQptdGV4dCgiV2Vla2VuZCB2cy4gV2Vla2RheSBBdmcgU3RlcHMiLCBzaWRlPTMsIG91dGVyPVRSVUUsIGxpbmU9LTEpIApgYGAKCiMjIyMjIExpY2Vuc2UgYW5kIENvcHlyaWdodAogICBDb3B5cmlnaHQgMjAxNyBNaWNoYWVsIEdhcmNpYS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgSW5xdWlyaWVzIG1nYXJfZGF0YXNjaWVuY2UgYXQgcHJvdG9ubWFpbC5jb20KICAKCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5zCg==