Overview
This vignette will provide information on Netflix viewers history in
R.
Vignette Info
While working with the data, it demostrates different use of R
functions.
The dataset that I choosed is Netflix Viewing History dataset. This
dataset contains 5673 rows.
library(dplyr)
library(tidyr)
library(lubridate)
library(zoo)
library(ggplot2)
library(ggplotlyExtra)
library(plotly)
# READING DATA FROM CSV DOWNLOADED FROM NETFLIX ACCOUNT
netflix <- readr::read_csv("netflix_combined.csv")
str(netflix)
head(netflix)
netflix$Date <- dmy(netflix$Date)
# SEPARATE TITLE COLUMN IN TITLE OF TV SERIES, SEASON AND EPISODE TITLE
netflix_series <- netflix %>%
separate(col = Title, into = c("title", "types", "title_episode"), sep = ': ')
# REMOVE OCCURRENCES WHERE SEASON AND EPISODE ARE EMPTY (BECAUSE THEY ARE NOT TV SERIES)
netflix_series <- netflix_series[!is.na(netflix_series$types),]
netflix_series <- netflix_series[!is.na(netflix_series$title_episode),]
maratones_netflix <- netflix_series %>%
count(title, Date
# EPISODES PER DAY
netflix_episode_perday <- netflix %>%
count(Date) %>%
arrange(desc(n))


Plotting Eposodes Per Day
netflix_episode_perday_plot <- ggplot(aes(x = Date, y = n, color = n), data = netflix_episode_perday) +
geom_col(color = c("blue")) +
theme_minimal() +
ggtitle("Episodes watched on my Netflix per day", "History from 2020 to 2022") +
labs(x = "Date", y = "watched episodes")
netflix_episode_perday_plot

Graph 1: Episodes watched on Netflix per Day
Graph 1 shows that the number of episodes watched annually increased
gradually over time.
Days of the week and month
netflix_episode_perday$diasemanaF <-factor(netflix_episode_perday$diasemana, levels = rev(1:7), labels = rev(c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")),ordered = TRUE)
netflix_episode_perday$mesF <- factor(month(netflix_episode_perday$Date),levels = as.character(1:12), labels = c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),ordered = TRUE)
netflix_episode_perday$añomes <- factor(as.yearmon(netflix_episode_perday$Date))
netflix_episode_perday$semana <- as.numeric(format(netflix_episode_perday$Date,"%W"))
netflix_episode_perday$semanames <- ceiling(day(netflix_episode_perday$Date) / 7)
netflix_episode_perday_calendario <- ggplot(netflix_episode_perday, aes(semanames, diasemanaF, fill = n)) +
geom_tile(colour = "white") +
facet_grid(year(netflix_episode_perday$Date) ~ mesF) +
scale_fill_gradient(low = "blue", high = "green") +
ggtitle("Episodes watched per day on Netflix", "Heatmap by day of the week, month and year") +
labs(x = "week number", y = "Weekday") +
labs(fill = "No.Episodes")
netflix_episode_perday_calendario

Graph 2: Episodes watched per day on Netflix based on week,
month, and year
Graph 2 shows the highest number of episodes watched in Mar 2020
compared to other months.There was a dip in March due to low count views
of days collected for that period.
Frequency of activity in my netflix account per day
view_day <- netflix_episode_perday %>%
count(diasemanaF)
view_dayview_day_plot <- view_day %>%
ggplot(aes(diasemanaF, n)) +
geom_col(fill = "orange") +
coord_polar() +
theme_minimal() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_text(face = "bold"),
plot.title = element_text(size = 16, face = "bold")) +
ggtitle("Frequency of episodes watched", "Activity by day of the week on Netflix")
view_dayview_day_plot

Graph 3: Episodes watched per day on Netflix based on week,
month, and year
Graph 3 shows that people are watching Netflix every single day of
the week.
Frequency of activity in my netflix account per Month
View_month <- netflix_episode_perday %>%
count(mesF)
View_monthView_month_plot <- View_month %>%
ggplot(aes(mesF, n)) +
geom_col(fill = "blue") +
coord_polar() +
theme_minimal() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_text(face = "bold"),
plot.title = element_text(size = 18, face = "bold")) +
ggtitle("Frequency of episodes watched", "Activity per month on Netflix")
View_monthView_month_plot

Graph 4: Frequency of episodes watched activity per
month
Graph 4 shows that viewers’ episode watch rate is high at the
beginning of a year and in January due to the new year holiday time
Frequency of activity in my netflix account per Year
view_year <- netflix_episode_perday %>%
count(añomes)
view_yearview_year_plot <- view_year %>%
ggplot(aes(añomes, n)) +
geom_col(fill = "blue") +
coord_polar() +
theme_minimal() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_text(face = "bold"),
plot.title = element_text(size = 18, face = "bold")) +
ggtitle("Frequency of episodes watched", "Activity by month of the year on Netflix")
view_yearview_year_plot

Graph 5: Frequency of episodes watched activity per month and
year
It was observed that there were fewer frequent viewers in February
from 2020 to 2022 and June of 2020-2021 in Graph 5.
From the data we can see that most users watch to love Netflix
regularly. This is an interesting finding since it counters one of my
previous assumptions about how people consume video content using
Netflix these days.
LS0tDQp0aXRsZTogIk5ldGZsaXggVmlld2luZyBIaXN0b3J5IGluIFIiDQphdXRob3I6ICJTYWlrYXQgQmFydWEiDQpkYXRlOiAnMjAyMi0wOC0xMycNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMjIyBPdmVydmlldw0KDQpUaGlzIHZpZ25ldHRlIHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBOZXRmbGl4IHZpZXdlcnMgaGlzdG9yeSBpbiBSLg0KDQojIyMgVG9vbA0KDQpDb2xsZWN0ZWQgZGF0YSBmcm9tIE5ldGZsaXguIDxodHRwczovL3d3dy5uZXRmbGl4LmNvbS9Zb3VyQWNjb3VudD4gLg0KDQpEYXRhIHNvdXJjZSA6IFRvIGRvd25sb2FkIHRoZSBmaWxlLCBwbGVhc2UgY2xpY2sgaGVyZToNCg0KW05ldGZsaXhdICg8aHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xalZIakRkc0lQYWl3cFhqNlFJdDFkQVR1M0RuMVpUdGgvdmlldz91c3A9c2hhcmluZz5bKV0oaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xcEtHdXJka2ZMcmhGWGxzdnRsT19hMll4ZmMtdmZNQl8vdmlldz91c3A9c2hhcmluZykpDQoNCm9yDQoNCjxodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzFqVkhqRGRzSVBhaXdwWGo2UUl0MWRBVHUzRG4xWlR0aC92aWV3P3VzcD1zaGFyaW5nPg0KDQojIyMgVmlnbmV0dGUgSW5mbw0KDQpXaGlsZSB3b3JraW5nIHdpdGggdGhlIGRhdGEsIGl0IGRlbW9zdHJhdGVzIGRpZmZlcmVudCB1c2Ugb2YgUiBmdW5jdGlvbnMuDQoNClRoZSBkYXRhc2V0IHRoYXQgSSBjaG9vc2VkIGlzIE5ldGZsaXggVmlld2luZyBIaXN0b3J5IGRhdGFzZXQuIFRoaXMgZGF0YXNldCBjb250YWlucyA1NjczIHJvd3MuDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoem9vKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3Bsb3RseUV4dHJhKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUkVBRElORyBEQVRBIEZST00gQ1NWIERPV05MT0FERUQgRlJPTSBORVRGTElYIEFDQ09VTlQNCm5ldGZsaXggPC0gcmVhZHI6OnJlYWRfY3N2KCJuZXRmbGl4X2NvbWJpbmVkLmNzdiIpIA0Kc3RyKG5ldGZsaXgpDQpoZWFkKG5ldGZsaXgpDQpuZXRmbGl4JERhdGUgPC0gZG15KG5ldGZsaXgkRGF0ZSkNCiAgDQoNCiMgU0VQQVJBVEUgVElUTEUgQ09MVU1OIElOIFRJVExFIE9GIFRWIFNFUklFUywgU0VBU09OIEFORCBFUElTT0RFIFRJVExFDQpuZXRmbGl4X3NlcmllcyA8LSBuZXRmbGl4ICU+JQ0KICBzZXBhcmF0ZShjb2wgPSBUaXRsZSwgaW50byA9IGMoInRpdGxlIiwgInR5cGVzIiwgInRpdGxlX2VwaXNvZGUiKSwgc2VwID0gJzogJykNCg0KDQojIFJFTU9WRSBPQ0NVUlJFTkNFUyBXSEVSRSBTRUFTT04gQU5EIEVQSVNPREUgQVJFIEVNUFRZIChCRUNBVVNFIFRIRVkgQVJFIE5PVCBUViBTRVJJRVMpDQpuZXRmbGl4X3NlcmllcyA8LSBuZXRmbGl4X3Nlcmllc1shaXMubmEobmV0ZmxpeF9zZXJpZXMkdHlwZXMpLF0NCm5ldGZsaXhfc2VyaWVzIDwtIG5ldGZsaXhfc2VyaWVzWyFpcy5uYShuZXRmbGl4X3NlcmllcyR0aXRsZV9lcGlzb2RlKSxdDQptYXJhdG9uZXNfbmV0ZmxpeCA8LSBuZXRmbGl4X3NlcmllcyAlPiUNCiAgY291bnQodGl0bGUsIERhdGUNCg0KIyBFUElTT0RFUyBQRVIgREFZDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5IDwtIG5ldGZsaXggJT4lDQogIGNvdW50KERhdGUpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpDQoNCmBgYA0KDQohW10oaW1hZ2VzL3Bhc3RlLTAxMzQ0OEZDLnBuZyl7d2lkdGg9IjgyMCJ9DQoNCiFbXShpbWFnZXMvcGFzdGUtRkJDNzhENUUucG5nKXt3aWR0aD0iODIwIn0NCg0KIyMjIFBsb3R0aW5nIEVwb3NvZGVzIFBlciBEYXkNCg0KYGBge3J9DQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5X3Bsb3QgPC0gZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IG4sIGNvbG9yID0gbiksIGRhdGEgPSBuZXRmbGl4X2VwaXNvZGVfcGVyZGF5KSArDQogIGdlb21fY29sKGNvbG9yID0gYygiYmx1ZSIpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdndGl0bGUoIkVwaXNvZGVzIHdhdGNoZWQgb24gbXkgTmV0ZmxpeCBwZXIgZGF5IiwgIkhpc3RvcnkgZnJvbSAyMDIwIHRvIDIwMjIiKSArDQogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJ3YXRjaGVkIGVwaXNvZGVzIikgDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5X3Bsb3QNCmBgYA0KDQohW10oaW1hZ2VzL0dyYXBoJTIwMV8lMjBFcGlzb2RlcyUyMHdhdGNoZWQlMjBvbiUyME5ldGZsaXglMjBwZXIlMjBEYXktMDEuUE5HKQ0KDQpHcmFwaCAxOiBFcGlzb2RlcyB3YXRjaGVkIG9uIE5ldGZsaXggcGVyIERheQ0KDQpHcmFwaCAxIHNob3dzIHRoYXQgdGhlIG51bWJlciBvZiBlcGlzb2RlcyB3YXRjaGVkIGFubnVhbGx5IGluY3JlYXNlZCBncmFkdWFsbHkgb3ZlciB0aW1lLsKgDQoNCiMjIyBGb3JtYXQgaW50byBEYXksIG1vbnRoIGFuZCB5ZWFyDQoNCmBgYHtyfQ0KbmV0ZmxpeF9lcGlzb2RlX3BlcmRheSA8LSBuZXRmbGl4X2VwaXNvZGVfcGVyZGF5W29yZGVyKG5ldGZsaXhfZXBpc29kZV9wZXJkYXkkRGF0ZSksXQ0KbmV0ZmxpeF9lcGlzb2RlX3BlcmRheSRkaWFzZW1hbmEgPC0gd2RheShuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JERhdGUpDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JGRpYXNlbWFuYUYgPC0gd2Vla2RheXMobmV0ZmxpeF9lcGlzb2RlX3BlcmRheSREYXRlLCBhYmJyZXZpYXRlID0gVCkNCm5ldGZsaXhfZXBpc29kZV9wZXJkYXkkbWVzRiA8LSBtb250aHMobmV0ZmxpeF9lcGlzb2RlX3BlcmRheSREYXRlLCBhYmJyZXZpYXRlID0gVCkNCmBgYA0KDQojIyMgRGF5cyBvZiB0aGUgd2VlayBhbmQgbW9udGgNCg0KYGBge3J9DQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JGRpYXNlbWFuYUYgPC1mYWN0b3IobmV0ZmxpeF9lcGlzb2RlX3BlcmRheSRkaWFzZW1hbmEsIGxldmVscyA9IHJldigxOjcpLCBsYWJlbHMgPSByZXYoYygiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0IiwiU3VuIikpLG9yZGVyZWQgPSBUUlVFKQ0KbmV0ZmxpeF9lcGlzb2RlX3BlcmRheSRtZXNGIDwtIGZhY3Rvcihtb250aChuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JERhdGUpLGxldmVscyA9IGFzLmNoYXJhY3RlcigxOjEyKSwgbGFiZWxzID0gYygiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIiksb3JkZXJlZCA9IFRSVUUpDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JGHDsW9tZXMgPC0gZmFjdG9yKGFzLnllYXJtb24obmV0ZmxpeF9lcGlzb2RlX3BlcmRheSREYXRlKSkgDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JHNlbWFuYSA8LSBhcy5udW1lcmljKGZvcm1hdChuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JERhdGUsIiVXIikpDQpuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JHNlbWFuYW1lcyA8LSBjZWlsaW5nKGRheShuZXRmbGl4X2VwaXNvZGVfcGVyZGF5JERhdGUpIC8gNykNCm5ldGZsaXhfZXBpc29kZV9wZXJkYXlfY2FsZW5kYXJpbyA8LSBnZ3Bsb3QobmV0ZmxpeF9lcGlzb2RlX3BlcmRheSwgYWVzKHNlbWFuYW1lcywgZGlhc2VtYW5hRiwgZmlsbCA9IG4pKSArIA0KICBnZW9tX3RpbGUoY29sb3VyID0gIndoaXRlIikgKyANCiAgZmFjZXRfZ3JpZCh5ZWFyKG5ldGZsaXhfZXBpc29kZV9wZXJkYXkkRGF0ZSkgfiBtZXNGKSArIA0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJibHVlIiwgaGlnaCA9ICJncmVlbiIpICsgDQogIGdndGl0bGUoIkVwaXNvZGVzIHdhdGNoZWQgcGVyIGRheSBvbiBOZXRmbGl4IiwgIkhlYXRtYXAgYnkgZGF5IG9mIHRoZSB3ZWVrLCBtb250aCBhbmQgeWVhciIpICsNCiAgbGFicyh4ID0gIndlZWsgbnVtYmVyIiwgeSA9ICJXZWVrZGF5IikgKw0KICBsYWJzKGZpbGwgPSAiTm8uRXBpc29kZXMiKQ0KbmV0ZmxpeF9lcGlzb2RlX3BlcmRheV9jYWxlbmRhcmlvDQpgYGANCg0KIVtdKGltYWdlcy9HcmFwaCUyMDJfRXBpc29kZXMlMjB3YXRjaGVkJTIwcGVyJTIwZGF5JTIwb24lMjBOZXRmbGl4JTIwYmFzZWQlMjBvbiUyMHdlZWssJTIwbW9udGgsJTIwYW5kJTIweWVhci0wMi5QTkcpDQoNCipHcmFwaCAyOiBFcGlzb2RlcyB3YXRjaGVkIHBlciBkYXkgb24gTmV0ZmxpeCBiYXNlZCBvbiB3ZWVrLCBtb250aCwgYW5kIHllYXIqDQoNCkdyYXBoIDIgc2hvd3MgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGVwaXNvZGVzIHdhdGNoZWQgaW4gTWFyIDIwMjAgY29tcGFyZWQgdG8gb3RoZXIgbW9udGhzLlRoZXJlIHdhcyBhIGRpcCBpbiBNYXJjaCBkdWUgdG8gbG93IGNvdW50IHZpZXdzIG9mIGRheXMgY29sbGVjdGVkIGZvciB0aGF0IHBlcmlvZC4NCg0KIyMjIEZyZXF1ZW5jeSBvZiBhY3Rpdml0eSBpbiBteSBuZXRmbGl4IGFjY291bnQgcGVyIGRheQ0KDQpgYGB7cn0NCnZpZXdfZGF5IDwtIG5ldGZsaXhfZXBpc29kZV9wZXJkYXkgJT4lDQogIGNvdW50KGRpYXNlbWFuYUYpDQp2aWV3X2RheXZpZXdfZGF5X3Bsb3QgPC0gdmlld19kYXkgJT4lIA0KICBnZ3Bsb3QoYWVzKGRpYXNlbWFuYUYsIG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAib3JhbmdlIikgKw0KICBjb29yZF9wb2xhcigpICArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSkgKw0KICBnZ3RpdGxlKCJGcmVxdWVuY3kgb2YgZXBpc29kZXMgd2F0Y2hlZCIsICJBY3Rpdml0eSBieSBkYXkgb2YgdGhlIHdlZWsgb24gTmV0ZmxpeCIpDQoNCnZpZXdfZGF5dmlld19kYXlfcGxvdA0KYGBgDQoNCiFbXShpbWFnZXMvR3JhcGglMjAzXyUyMEVwaXNvZGVzJTIwd2F0Y2hlZCUyMHBlciUyMGRheSUyMG9uJTIwTmV0ZmxpeCUyMGJhc2VkJTIwb24lMjB3ZWVrLCUyMG1vbnRoLCUyMGFuZCUyMHllYXItMDIuUE5HKQ0KDQoqR3JhcGggMzogRXBpc29kZXMgd2F0Y2hlZCBwZXIgZGF5IG9uIE5ldGZsaXggYmFzZWQgb24gd2VlaywgbW9udGgsIGFuZCB5ZWFyKg0KDQpHcmFwaCAzIHNob3dzIHRoYXQgcGVvcGxlIGFyZSB3YXRjaGluZyBOZXRmbGl4IGV2ZXJ5IHNpbmdsZSBkYXkgb2YgdGhlIHdlZWsuDQoNCiMjIyBGcmVxdWVuY3kgb2YgYWN0aXZpdHkgaW4gbXkgbmV0ZmxpeCBhY2NvdW50IHBlciBNb250aA0KDQpgYGB7cn0NClZpZXdfbW9udGggPC0gbmV0ZmxpeF9lcGlzb2RlX3BlcmRheSAlPiUNCiAgY291bnQobWVzRikNClZpZXdfbW9udGhWaWV3X21vbnRoX3Bsb3QgPC0gVmlld19tb250aCAlPiUgDQogIGdncGxvdChhZXMobWVzRiwgbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICJibHVlIikgKw0KICBjb29yZF9wb2xhcigpICArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gImJvbGQiKSkgKw0KICBnZ3RpdGxlKCJGcmVxdWVuY3kgb2YgZXBpc29kZXMgd2F0Y2hlZCIsICJBY3Rpdml0eSBwZXIgbW9udGggb24gTmV0ZmxpeCIpIA0KVmlld19tb250aFZpZXdfbW9udGhfcGxvdA0KYGBgDQoNCiFbXShpbWFnZXMvR3JhcGglMjA0X0ZyZXF1ZW5jeSUyMG9mJTIwZXBpc29kZXMlMjB3YXRjaGVkJTIwYWN0aXZpdHklMjBwZXIlMjBtb250aC0wMi5QTkcpDQoNCipHcmFwaCA0OiBGcmVxdWVuY3kgb2YgZXBpc29kZXMgd2F0Y2hlZCBhY3Rpdml0eSBwZXIgbW9udGgqDQoNCkdyYXBoIDQgc2hvd3MgdGhhdCB2aWV3ZXJzJyBlcGlzb2RlIHdhdGNoIHJhdGUgaXMgaGlnaCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgeWVhciBhbmQgaW4gSmFudWFyeSBkdWUgdG8gdGhlIG5ldyB5ZWFyIGhvbGlkYXkgdGltZQ0KDQojIyMgRnJlcXVlbmN5IG9mIGFjdGl2aXR5IGluIG15IG5ldGZsaXggYWNjb3VudCBwZXIgWWVhcg0KDQpgYGB7cn0NCnZpZXdfeWVhciA8LSBuZXRmbGl4X2VwaXNvZGVfcGVyZGF5ICU+JQ0KICBjb3VudChhw7FvbWVzKQ0Kdmlld195ZWFydmlld195ZWFyX3Bsb3QgPC0gdmlld195ZWFyICU+JSANCiAgZ2dwbG90KGFlcyhhw7FvbWVzLCBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gImJsdWUiKSArDQogIGNvb3JkX3BvbGFyKCkgICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAiYm9sZCIpKSArDQogIGdndGl0bGUoIkZyZXF1ZW5jeSBvZiBlcGlzb2RlcyB3YXRjaGVkIiwgIkFjdGl2aXR5IGJ5IG1vbnRoIG9mIHRoZSB5ZWFyIG9uIE5ldGZsaXgiKQ0Kdmlld195ZWFydmlld195ZWFyX3Bsb3QNCmBgYA0KDQohW10oaW1hZ2VzL0dyYXBoJTIwNV9ScGxvdCUyMEZyZXF1ZW5jeSUyMG9mJTIwZXBpc29kZXMlMjB3YXRjaGVkX0FjdGl2aXR5JTIwYnklMjBNb250aCUyMG9mJTIwWWVhci0wMi5QTkcpe3dpZHRoPSI4MDAifQ0KDQoqR3JhcGggNTogRnJlcXVlbmN5IG9mIGVwaXNvZGVzIHdhdGNoZWQgYWN0aXZpdHkgcGVyIG1vbnRoIGFuZCB5ZWFyKg0KDQpJdCB3YXMgb2JzZXJ2ZWQgdGhhdCB0aGVyZSB3ZXJlIGZld2VyIGZyZXF1ZW50IHZpZXdlcnMgaW4gRmVicnVhcnkgZnJvbSAyMDIwwqAgdG8gMjAyMiBhbmQgSnVuZSBvZiAyMDIwLTIwMjEgaW4gR3JhcGggNS4NCg0KRnJvbSB0aGUgZGF0YSB3ZSBjYW4gc2VlIHRoYXQgbW9zdCB1c2VycyB3YXRjaCB0byBsb3ZlIE5ldGZsaXggcmVndWxhcmx5LiBUaGlzIGlzIGFuIGludGVyZXN0aW5nIGZpbmRpbmcgc2luY2UgaXQgY291bnRlcnMgb25lIG9mIG15IHByZXZpb3VzIGFzc3VtcHRpb25zIGFib3V0IGhvdyBwZW9wbGUgY29uc3VtZSB2aWRlbyBjb250ZW50IHVzaW5nIE5ldGZsaXggdGhlc2UgZGF5cy4NCg0KIyMjICoqUmVmZXJlbmNlcyoqDQoNCk5FVEZMSVguIChuLmQpLiBBY2NvdW50LiA8aHR0cHM6Ly93d3cubmV0ZmxpeC5jb20vWW91ckFjY291bnQ+DQo=