INTRODUCTION

This capstone project is my first project in my Google Data Analytics Professional Certificate course. In this case study I will be analyzing a public dataset for a fictional company provided by the course. I will be using R programming language for this analysis because of its easy statistical analysis tools and data visualizations.

The following data analysis steps will be followed:

Ask,
Prepare,
Process,
Analyze,
Share,
Act.

The case study roadmap below will be followed on each step:

Code, when needed.
Key tasks.
Deliverables.  

Scenario

You are a junior data analyst working in the marketing analyst team at Cyclistic, a bike-share company in Chicago. The director of marketing believes the company’s future success depends on maximizing the number of annual memberships. Therefore,your team wants to understand how casual riders and annual members use Cyclistic bikes differently. From these insights, your team will design a new marketing strategy to convert casual riders into annual members. But first, Cyclistic executives must approve your recommendations, so they must be backed up with compelling data insights and professional data visualizations. ASK

Three questions will guide the future marketing program:

How do annual members and casual riders use Cyclistic bikes differently?
Why would casual riders buy Cyclistic annual memberships?
How can Cyclistic use digital media to influence casual riders to become members?

Lily Moreno (the director of marketing and my manager) has assigned you the first question to answer: How do annual members and casual riders use Cyclistic bikes differently?

Key tasks

Identify the business task

The main objective is to design marketing strategies aimed at converting casual riders to annual members by understanding how they differ.

Consider key stakeholders

Director of Marketing (Lily Moreno), Marketing Analytics team, Executive team.

Deliverable

A clear statement of the business task

To find the differences between the casual riders and annual members.

PREPARE

I will use Cyclistic’s historical trip data to analyze and identify trends. The data has been made available by Motivate International Inc. under this license. Datasets are available here link.

Key tasks

Download data and store it appropriately.

Data has been downloaded and copies have been stored securely on my computer and here on Kaggle.
  1. Identify how it’s organized.

    The data is in CSV (comma-separated values) format, and there are a total of 13 columns.

  2. Sort and filter the data.

    For this analysis, I will be using data for the last 12 months (Feb 2021 - Jan 2022) because it is more current.

  3. Determine the credibility of the data.

Deliverable A description of all data sources used Main source of data provided by the Cylistic company.

Install and load necessary packages

install.packages("tidyverse")
install.packages("lubridate")
install.packages("ggplot2")
install.packages("readr")
library(tidyverse)
library(lubridate)
library(ggplot2)
library(readr)

select directory for load file.

setwd("D:/Project/Project 1/Original")

#===================== # STEP 1: COLLECT DATA #=====================

# Upload Divvy datasets (csv files) here
y_2013 <- read.csv("Divvy_Trips_2013.csv")
q1_2_2014 <- read_csv("Divvy_Trips_2014_Q1Q2.csv")
q3_7_2014 <- read_csv("Divvy_Trips_2014-Q3-07.csv")
q3_8_9_2014 <- read_csv("Divvy_Trips_2014-Q3-07.csv")
q4_2014 <- read_csv("Divvy_Trips_2014-Q4.csv")
q1_2015 <- read_csv("Divvy_Trips_2014-Q4.csv")
q2_2015 <- read_csv("Divvy_Trips_2015-Q2.csv")
q3_7_2015 <- read_csv("Divvy_Trips_2015_07.csv")
q3_8_2015 <- read_csv("Divvy_Trips_2015_08.csv")
q3_9_2015 <- read_csv("Divvy_Trips_2015_09.csv")
q4_2015 <- read_csv("Divvy_Trips_2015_Q4.csv")
q1_2016 <- read_csv("Divvy_Trips_2016_Q1.csv")
q2_4_2016 <- read_csv("Divvy_Trips_2016_04.csv")
q2_5_2016 <- read_csv("Divvy_Trips_2016_05.csv")
q2_6_2016 <- read_csv("Divvy_Trips_2016_06.csv")
q3_2016 <- read_csv("Divvy_Trips_2016_Q3.csv")
q4_2016 <- read_csv("Divvy_Trips_2016_Q4.csv")
q1_2017 <- read_csv("Divvy_Trips_2017_Q1.csv")
q2_2017 <- read_csv("Divvy_Trips_2017_Q2.csv")
q3_2017 <- read_csv("Divvy_Trips_2017_Q3.csv")
q4_2017 <- read_csv("Divvy_Trips_2017_Q4.csv")
q1_2018 <- read_csv("Divvy_Trips_2018_Q1.csv")
q2_2018 <- read_csv("Divvy_Trips_2018_Q2.csv")
q3_2018 <- read_csv("Divvy_Trips_2018_Q3.csv")
q4_2018 <- read_csv("Divvy_Trips_2018_Q4.csv")
q1_2019 <- read_csv("Divvy_Trips_2019_Q1.csv")
q2_2019 <- read_csv("Divvy_Trips_2019_Q2.csv")
q3_2019 <- read_csv("Divvy_Trips_2019_Q3.csv")
q4_2019 <- read_csv("Divvy_Trips_2019_Q4.csv")
q1_2020 <- read_csv("Divvy_Trips_2020_Q1.csv")
q2_4_2020 <- read_csv("202004-divvy-tripdata.csv")
q2_5_2020 <- read_csv("202005-divvy-tripdata.csv")
q2_6_2020 <- read_csv("202006-divvy-tripdata.csv")
q3_7_2020 <- read_csv("202301_divvy_tripdata.csv")
q3_8_2020 <- read_csv("202008_divvy_tripdata.csv")
q3_9_2020 <- read_csv("202009_divvy_tripdata.csv")
q4_10_2020 <- read_csv("202010-divvy-tripdata.csv")
q4_11_2020 <- read_csv("202011-divvy-tripdata.csv")
q4_12_2020 <- read_csv("202012-divvy-tripdata.csv")
q1_1_2021 <- read_csv("202101-divvy-tripdata.csv")
q1_2_2021 <- read_csv("202102-divvy-tripdata.csv")
q1_3_2021 <- read_csv("202103-divvy-tripdata.csv")
q2_4_2021 <- read_csv("202104-divvy-tripdata.csv")
q2_5_2021 <- read_csv("202105-divvy-tripdata.csv")
q2_6_2021 <- read_csv("202106-divvy-tripdata.csv")
q3_7_2021 <- read_csv("202107-divvy-tripdata.csv")
q3_8_2021 <- read_csv("202108-divvy-tripdata.csv")
q3_9_2021 <- read.csv("202109-divvy-tripdata.csv")
q4_10_2021 <- read.csv("202110-divvy-tripdata.csv")
q4_11_2021 <- read.csv("202111-divvy-tripdata.csv")
q4_12_2021 <- read.csv("202112-divvy-tripdata.csv")
q1_1_2022 <- read_csv("202201-divvy-tripdata.csv")
q1_2_2022 <- read_csv("202202-divvy-tripdata.csv")
q1_3_2022 <- read_csv("202203-divvy-tripdata.csv")
q2_4_2022 <- read_csv("202204_divvy_tripdata.csv")
q2_5_2022 <- read_csv("202205_divvy_tripdata.csv")
q2_6_2022 <- read_csv("202206_divvy_tripdata.csv")
q3_7_2022 <- read_csv("202207_divvy_tripdata.csv")
q3_8_2022 <- read_csv("202208_divvy_tripdata.csv")
q3_9_2022 <- read.csv("202209_divvy_tripdata.csv")
q4_10_2022 <- read.csv("202210-divvy-tripdata.csv")
q4_11_2022 <- read.csv("202211-divvy-tripdata.csv")
q4_12_2022 <- read.csv("202212-divvy-tripdata.csv")
q1_1_2023 <- read.csv("202301_divvy_tripdata.csv")
q1_2_2023 <- read.csv("202302_divvy_tripdata.csv")
q1_3_2023 <- read.csv("202303_divvy_tripdata.csv")

I ensured that the data sets have the same number of columns and same column names with some extra coumn names which remove further to remove unwanted colmn. Before going forward to merge them, I also checked for inconsistencies.

Merge monthly data set in to queterly for every years for easy refrence. Some data types not match so, also change data type for started_at and ended_at colmn for find out ride_duration for further analysis.

q3_2014 <- bind_rows(q3_7_2014,q3_8_9_2014)
q3_2015 <- bind_rows(q3_7_2015,q3_8_2015,q3_9_2015)
q2_2016 <- bind_rows(q2_4_2016,q2_5_2016,q2_6_2016)
q2_4_2020 <-  mutate(q2_5_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_4_2020 <-  mutate(q2_5_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_5_2020 <-  mutate(q2_5_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_5_2020 <-  mutate(q2_5_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_6_2020 <-  mutate(q2_6_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_6_2020 <-  mutate(q2_6_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2020 <- bind_rows(q2_4_2020,q2_5_2020,q2_6_2020)
q3_7_2020 <-  mutate(q3_7_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_7_2020 <-  mutate(q3_7_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_8_2020 <-  mutate(q3_8_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_8_2020 <-  mutate(q3_8_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_8_2020 <-  mutate(q3_8_2020, start_station_id = as.character(start_station_id))
q3_8_2020 <-  mutate(q3_8_2020, end_station_id = as.character(end_station_id))
q3_9_2020 <-  mutate(q3_9_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_9_2020 <-  mutate(q3_9_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_9_2020 <-  mutate(q3_9_2020, start_station_id = as.character(start_station_id))
q3_9_2020 <-  mutate(q3_9_2020, end_station_id = as.character(end_station_id))
q3_2020 <- bind_rows(q3_7_2020,q3_8_2020,q3_9_2020)
q4_10_2020 <-  mutate(q4_10_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_10_2020 <-  mutate(q4_10_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_11_2020 <-  mutate(q4_11_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_11_2020 <-  mutate(q4_11_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_12_2020 <-  mutate(q4_12_2020, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_12_2020 <-  mutate(q4_12_2020, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_10_2020 <- mutate(q4_10_2020, start_station_id = as.character(start_station_id))
q4_11_2020 <- mutate(q4_11_2020, start_station_id = as.character(start_station_id))
q4_12_2020 <- mutate(q4_12_2020, start_station_id = as.character(start_station_id))
q4_10_2020 <- mutate(q4_10_2020, end_station_id = as.character(end_station_id))
q4_11_2020 <- mutate(q4_11_2020, end_station_id = as.character(end_station_id))
q4_12_2020 <- mutate(q4_12_2020, end_station_id = as.character(end_station_id))
q4_2020 <- bind_rows(q4_10_2020,q4_11_2020,q4_12_2020)
q1_2021 <- bind_rows(q1_1_2021,q1_2_2021,q1_3_2021)
q2_2021 <- bind_rows(q2_4_2021,q2_5_2021,q2_6_2021)
q3_9_2021 <-  mutate(q3_9_2021, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_9_2021 <-  mutate(q3_9_2021, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2021 <- bind_rows(q3_7_2021,q3_8_2021,q3_9_2021)
q4_2021 <- bind_rows(q4_10_2021,q4_11_2021,q4_12_2021)
q1_2022 <- bind_rows(q1_1_2022,q1_2_2022,q1_3_2022)
q2_2022 <- bind_rows(q2_4_2022,q2_5_2022,q2_6_2022)
q3_7_2022 <-  mutate(q3_7_2022, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_7_2022 <-  mutate(q3_7_2022, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_8_2022 <-  mutate(q3_8_2022, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_8_2022 <-  mutate(q3_8_2022, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_9_2022 <-  mutate(q3_9_2022, started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_9_2022 <-  mutate(q3_9_2022, ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2022 <- bind_rows(q3_7_2022,q3_8_2022,q3_9_2022)
q4_2022 <- bind_rows(q4_10_2022,q4_11_2022,q4_12_2022)
q1_2023 <- bind_rows(q1_1_2023,q1_2_2023,q1_3_2023)

#==================================================== # STEP 2: WRANGLE DATA AND COMBINE INTO A SINGLE FILE #==================================================== Compare column names each of the files While the names don’t have to be in the same order, they DO need to match perfectly before we can use a command to join them into one file

colnames(y_2013)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthday"         
colnames(q1_2_2014)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q3_2014)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2014)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q1_2015)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q1_2016)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q1_2017)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q1_2018)
 [1] "01 - Rental Details Rental ID"                    "01 - Rental Details Local Start Time"            
 [3] "01 - Rental Details Local End Time"               "01 - Rental Details Bike ID"                     
 [5] "01 - Rental Details Duration In Seconds Uncapped" "03 - Rental Start Station ID"                    
 [7] "03 - Rental Start Station Name"                   "02 - Rental End Station ID"                      
 [9] "02 - Rental End Station Name"                     "User Type"                                       
[11] "Member Gender"                                    "05 - Member Details Member Birthday Year"        
colnames(q1_2019)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q2_2015)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q2_2016)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q2_2017)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q2_2018)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q2_2019)
 [1] "01 - Rental Details Rental ID"                    "01 - Rental Details Local Start Time"            
 [3] "01 - Rental Details Local End Time"               "01 - Rental Details Bike ID"                     
 [5] "01 - Rental Details Duration In Seconds Uncapped" "03 - Rental Start Station ID"                    
 [7] "03 - Rental Start Station Name"                   "02 - Rental End Station ID"                      
 [9] "02 - Rental End Station Name"                     "User Type"                                       
[11] "Member Gender"                                    "05 - Member Details Member Birthday Year"        
colnames(q3_2015)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q3_2016)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q3_2017)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q3_2018)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q3_2019)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2015)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2016)
 [1] "trip_id"           "starttime"         "stoptime"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2017)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2018)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q4_2019)
 [1] "trip_id"           "start_time"        "end_time"          "bikeid"            "tripduration"     
 [6] "from_station_id"   "from_station_name" "to_station_id"     "to_station_name"   "usertype"         
[11] "gender"            "birthyear"        
colnames(q1_2020)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q1_2022)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q1_2023)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q2_2020)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q2_2022)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q3_2020)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q3_2022)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q4_2020)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q4_2022)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q1_2021)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q2_2021)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q3_2021)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     
colnames(q4_2021)
 [1] "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [6] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"         
[11] "end_lat"            "end_lng"            "member_casual"     

Rename columns to make them consistent with q1_2020 to q1_2023 (as this will be the supposed going-forward table design for Divvy)

#Rename columns  to make them consistent with q1_2020 to q1_2023 (as this will be the supposed going-forward table design for Divvy)
(y_2013 <- rename(y_2013
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q1_2_2014 <- rename(q1_2_2014
                  ,ride_id = trip_id
                  ,rideable_type = bikeid 
                  ,started_at = starttime  
                  ,ended_at = stoptime  
                  ,start_station_name = from_station_name 
                  ,start_station_id = from_station_id 
                  ,end_station_name = to_station_name 
                  ,end_station_id = to_station_id 
                  ,member_casual = usertype))

(q3_2014 <- rename(q3_2014
                     ,ride_id = trip_id
                     ,rideable_type = bikeid 
                     ,started_at = starttime  
                     ,ended_at = stoptime  
                     ,start_station_name = from_station_name 
                     ,start_station_id = from_station_id 
                     ,end_station_name = to_station_name 
                     ,end_station_id = to_station_id 
                     ,member_casual = usertype))
(q4_2014 <- rename(q4_2014
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q1_2015 <- rename(q1_2015
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))
(q1_2016 <- rename(q1_2016
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q1_2017 <- rename(q1_2017
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q1_2018 <- rename(q1_2018
                   ,ride_id = "01 - Rental Details Rental ID"
                   ,rideable_type = "01 - Rental Details Bike ID" 
                   ,started_at = "01 - Rental Details Local Start Time"  
                   ,ended_at = "01 - Rental Details Local End Time"  
                   ,start_station_name = "03 - Rental Start Station Name" 
                   ,start_station_id = "03 - Rental Start Station ID"
                   ,end_station_name = "02 - Rental End Station Name" 
                   ,end_station_id = "02 - Rental End Station ID"
                   ,member_casual = "User Type"))

(q1_2019 <- rename(q1_2019
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q2_2015 <- rename(q2_2015
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q2_2016 <- rename(q2_2016
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q2_2017 <- rename(q2_2017
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q2_2018 <- rename(q2_2018
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q2_2019 <- rename(q2_2019
                   ,ride_id = "01 - Rental Details Rental ID"
                   ,rideable_type = "01 - Rental Details Bike ID" 
                   ,started_at = "01 - Rental Details Local Start Time"  
                   ,ended_at = "01 - Rental Details Local End Time"  
                   ,start_station_name = "03 - Rental Start Station Name" 
                   ,start_station_id = "03 - Rental Start Station ID"
                   ,end_station_name = "02 - Rental End Station Name" 
                   ,end_station_id = "02 - Rental End Station ID"
                   ,member_casual = "User Type"))

(q3_2015 <- rename(q3_2015
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q3_2016 <- rename(q3_2016
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q3_2017 <- rename(q3_2017
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q3_2018 <- rename(q3_2018
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q4_2015 <- rename(q4_2015
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q4_2016 <- rename(q4_2016
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = starttime  
                   ,ended_at = stoptime  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q4_2017 <- rename(q4_2017
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q4_2018 <- rename(q4_2018
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q4_2019 <- rename(q4_2019
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))

(q3_2019 <- rename(q3_2019
                   ,ride_id = trip_id
                   ,rideable_type = bikeid 
                   ,started_at = start_time  
                   ,ended_at = end_time  
                   ,start_station_name = from_station_name 
                   ,start_station_id = from_station_id 
                   ,end_station_name = to_station_name 
                   ,end_station_id = to_station_id 
                   ,member_casual = usertype))
#Change Datatype of colmn, So they stack correctly
q1_2017 <- mutate(q1_2017,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2017 <- mutate(q1_2017,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2018 <- mutate(q1_2018,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2018 <- mutate(q1_2018,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2019 <- mutate(q1_2019,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2019 <- mutate(q1_2019,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2020 <- mutate(q1_2020,ride_id = as.character(ride_id))
q1_2017 <- mutate(q1_2017,ride_id = as.character(ride_id))
q1_2016 <- mutate(q1_2016,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2016 <- mutate(q1_2016,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2016 <- mutate(q1_2016,ride_id = as.character(ride_id))
q1_2015 <- mutate(q1_2015,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2015 <- mutate(q1_2015,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2015 <- mutate(q1_2015,ride_id = as.character(ride_id))
q1_2_2014 <- mutate(q1_2_2014,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2_2014 <- mutate(q1_2_2014,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2_2014 <- mutate(q1_2_2014,ride_id = as.character(ride_id))
y_2013 <- mutate(y_2013,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
y_2013 <- mutate(y_2013,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
y_2013 <- mutate(y_2013,ride_id = as.character(ride_id))
q1_2018 <- mutate(q1_2018,ride_id = as.character(ride_id))
q1_2019 <- mutate(q1_2019,ride_id = as.character(ride_id))
q1_2020 <- mutate(q1_2020,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2020 <- mutate(q1_2020,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2_2014 <- mutate(q1_2_2014,rideable_type = as.character(rideable_type))
y_2013 <- mutate(y_2013,rideable_type = as.character(rideable_type))
q1_2015 <- mutate(q1_2015,rideable_type = as.character(rideable_type))
q1_2016 <- mutate(q1_2016,rideable_type = as.character(rideable_type))
q1_2017 <- mutate(q1_2017,rideable_type = as.character(rideable_type))
q1_2018 <- mutate(q1_2018,rideable_type = as.character(rideable_type))
q1_2019 <- mutate(q1_2019,rideable_type = as.character(rideable_type))
q1_2022 <- mutate(q1_2022,rideable_type = as.character(rideable_type))
q1_2022 <- mutate(q1_2022,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2022 <- mutate(q1_2022,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2_2014 <- mutate(q1_2_2014,ride_id = as.character(ride_id))
q2_2015 <- mutate(q2_2015,ride_id = as.character(ride_id))
q2_2015 <- mutate(q2_2015,rideable_type = as.character(rideable_type))
q2_2015 <- mutate(q2_2015,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2015 <- mutate(q2_2015,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2016 <- mutate(q2_2016,ride_id = as.character(ride_id))
q2_2016 <- mutate(q2_2016,rideable_type = as.character(rideable_type))
q2_2016 <- mutate(q2_2016,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2016 <- mutate(q2_2016,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2017 <- mutate(q2_2017,ride_id = as.character(ride_id))
q2_2017 <- mutate(q2_2017,rideable_type = as.character(rideable_type))
q2_2017 <- mutate(q2_2017,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2017 <- mutate(q2_2017,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2018 <- mutate(q2_2018,ride_id = as.character(ride_id))
q2_2018 <- mutate(q2_2018,rideable_type = as.character(rideable_type))
q2_2018 <- mutate(q2_2018,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2018 <- mutate(q2_2018,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2019 <- mutate(q2_2019,ride_id = as.character(ride_id))
q2_2019 <- mutate(q2_2019,rideable_type = as.character(rideable_type))
q2_2019 <- mutate(q2_2019,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2019 <- mutate(q2_2019,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2019 <- mutate(q2_2019,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2019 <- mutate(q2_2019,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2022 <- mutate(q2_2022,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q2_2022 <- mutate(q2_2022,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2014 <- mutate(q3_2014,ride_id = as.character(ride_id))
q3_2014 <- mutate(q3_2014,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2014 <- mutate(q3_2014,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2014 <- mutate(q3_2014,rideable_type = as.character(rideable_type))
q3_2015 <- mutate(q3_2015,ride_id = as.character(ride_id))
q3_2015 <- mutate(q3_2015,rideable_type = as.character(rideable_type))
q3_2015 <- mutate(q3_2015,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2015 <- mutate(q3_2015,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2016 <- mutate(q3_2016,ride_id = as.character(ride_id))
q3_2016 <- mutate(q3_2016,rideable_type = as.character(rideable_type))
q3_2016 <- mutate(q3_2016,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2016 <- mutate(q3_2016,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2017 <- mutate(q3_2017,ride_id = as.character(ride_id))
q3_2017 <- mutate(q3_2017,rideable_type = as.character(rideable_type))
q3_2017 <- mutate(q3_2017,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2017 <- mutate(q3_2017,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2018 <- mutate(q3_2018,ride_id = as.character(ride_id))
q3_2018 <- mutate(q3_2018,rideable_type = as.character(rideable_type))
q3_2018 <- mutate(q3_2018,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2018 <- mutate(q3_2018,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2019 <- mutate(q3_2019,ride_id = as.character(ride_id))
q3_2019 <- mutate(q3_2019,rideable_type = as.character(rideable_type))
q3_2019 <- mutate(q3_2019,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q3_2019 <- mutate(q3_2019,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2014 <- mutate(q4_2014,ride_id = as.character(ride_id))
q4_2014 <- mutate(q4_2014,rideable_type = as.character(rideable_type))
q4_2014 <- mutate(q4_2014,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2014 <- mutate(q4_2014,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2015 <- mutate(q4_2015,ride_id = as.character(ride_id))
q4_2015 <- mutate(q4_2015,rideable_type = as.character(rideable_type))
q4_2015 <- mutate(q4_2015,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2015 <- mutate(q4_2015,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2016 <- mutate(q4_2016,ride_id = as.character(ride_id))
q4_2016 <- mutate(q4_2016,rideable_type = as.character(rideable_type))
q4_2016 <- mutate(q4_2016,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2016 <- mutate(q4_2016,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2017 <- mutate(q4_2017,ride_id = as.character(ride_id))
q4_2017 <- mutate(q4_2017,rideable_type = as.character(rideable_type))
q4_2017 <- mutate(q4_2017,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2017 <- mutate(q4_2017,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2018 <- mutate(q4_2018,ride_id = as.character(ride_id))
q4_2018 <- mutate(q4_2018,rideable_type = as.character(rideable_type))
q4_2018 <- mutate(q4_2018,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2018 <- mutate(q4_2018,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2019 <- mutate(q4_2019,ride_id = as.character(ride_id))
q4_2019 <- mutate(q4_2019,rideable_type = as.character(rideable_type))
q4_2019 <- mutate(q4_2019,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2019 <- mutate(q4_2019,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2023 <- mutate(q1_2023,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q1_2023 <- mutate(q1_2023,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2021 <- mutate(q4_2021,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2021 <- mutate(q4_2021,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2022 <- mutate(q4_2022,started_at = as.POSIXct(started_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
q4_2022 <- mutate(q4_2022,ended_at = as.POSIXct(ended_at, format="%Y-%m-%d %H:%M:%S", tz="UTC"))
y_2013 <- mutate(y_2013,end_station_id = as.character(end_station_id))
y_2013 <- mutate(y_2013,start_station_id = as.character(start_station_id))
q1_2_2014 <- mutate(q1_2_2014,start_station_id = as.character(start_station_id))
q1_2_2014 <- mutate(q1_2_2014,end_station_id = as.character(end_station_id))
q3_2014 <- mutate(q3_2014,start_station_id = as.character(start_station_id))
q3_2014 <- mutate(q3_2014,end_station_id = as.character(end_station_id))
q4_2014 <- mutate(q4_2014,start_station_id = as.character(start_station_id))
q4_2014 <- mutate(q4_2014,end_station_id = as.character(end_station_id))
q1_2015 <- mutate(q1_2015,start_station_id = as.character(start_station_id))
q1_2015 <- mutate(q1_2015,end_station_id = as.character(end_station_id))
q2_2015 <- mutate(q2_2015,start_station_id = as.character(start_station_id))
q2_2015 <- mutate(q2_2015,end_station_id = as.character(end_station_id))
q3_2015 <- mutate(q3_2015,start_station_id = as.character(start_station_id))
q3_2015 <- mutate(q3_2015,end_station_id = as.character(end_station_id))
q4_2015 <- mutate(q4_2015,start_station_id = as.character(start_station_id))
q4_2015 <- mutate(q4_2015,end_station_id = as.character(end_station_id))
q1_2016 <- mutate(q1_2016,start_station_id = as.character(start_station_id))
q1_2016 <- mutate(q1_2016,end_station_id = as.character(end_station_id))
q2_2016 <- mutate(q2_2016,start_station_id = as.character(start_station_id))
q2_2016 <- mutate(q2_2016,end_station_id = as.character(end_station_id))
q3_2016 <- mutate(q3_2016,start_station_id = as.character(start_station_id))
q3_2016 <- mutate(q3_2016,end_station_id = as.character(end_station_id))
q4_2016 <- mutate(q4_2016,start_station_id = as.character(start_station_id))
q4_2016 <- mutate(q4_2016,end_station_id = as.character(end_station_id))
q1_2016 <- mutate(q1_2016,start_station_id = as.character(start_station_id))
q1_2017 <- mutate(q1_2017,start_station_id = as.character(start_station_id))
q1_2017 <- mutate(q1_2017,end_station_id = as.character(end_station_id))
q2_2017 <- mutate(q2_2017,start_station_id = as.character(start_station_id))
q2_2017 <- mutate(q2_2017,end_station_id = as.character(end_station_id))
q3_2017 <- mutate(q3_2017,start_station_id = as.character(start_station_id))
q3_2017 <- mutate(q3_2017,end_station_id = as.character(end_station_id))
q4_2017 <- mutate(q4_2017,start_station_id = as.character(start_station_id))
q4_2017 <- mutate(q4_2017,end_station_id = as.character(end_station_id))
q1_2018 <- mutate(q1_2018,start_station_id = as.character(start_station_id))
q1_2018 <- mutate(q1_2018,end_station_id = as.character(end_station_id))
q2_2018 <- mutate(q2_2018,start_station_id = as.character(start_station_id))
q2_2018 <- mutate(q2_2018,end_station_id = as.character(end_station_id))
q3_2018 <- mutate(q3_2018,start_station_id = as.character(start_station_id))
q3_2018 <- mutate(q3_2018,end_station_id = as.character(end_station_id))
q4_2018 <- mutate(q4_2018,start_station_id = as.character(start_station_id))
q4_2018 <- mutate(q4_2018,end_station_id = as.character(end_station_id))
q1_2019 <- mutate(q1_2019,start_station_id = as.character(start_station_id))
q1_2019 <- mutate(q1_2019,end_station_id = as.character(end_station_id))
q2_2019 <- mutate(q2_2019,start_station_id = as.character(start_station_id))
q2_2019 <- mutate(q2_2019,end_station_id = as.character(end_station_id))
q3_2019 <- mutate(q3_2019,start_station_id = as.character(start_station_id))
q3_2019 <- mutate(q3_2019,end_station_id = as.character(end_station_id))
q4_2019 <- mutate(q4_2019,start_station_id = as.character(start_station_id))
q4_2019 <- mutate(q4_2019,end_station_id = as.character(end_station_id))
q1_2020 <- mutate(q1_2020,start_station_id = as.character(start_station_id))
q1_2020 <- mutate(q1_2020,end_station_id = as.character(end_station_id))
q2_2020 <- mutate(q2_2020,start_station_id = as.character(start_station_id))
q2_2020 <- mutate(q2_2020,end_station_id = as.character(end_station_id))
q3_2020 <- mutate(q3_2020,start_station_id = as.character(start_station_id))
q3_2020 <- mutate(q3_2020,end_station_id = as.character(end_station_id))
q4_2020 <- mutate(q4_2020,start_station_id = as.character(start_station_id))
q4_2020 <- mutate(q4_2020,end_station_id = as.character(end_station_id))
# Remove unwanted colmme

y_2013 <- y_2013 %>%  
  select(-c(birthday, gender, "tripduration"))

q1_2_2014 <- q1_2_2014 %>%  
  select(-c(birthyear, gender, "tripduration"))

q3_2014 <- q3_2014 %>%  
  select(-c(birthyear, gender, "tripduration"))

q4_2014 <- q4_2014 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2015 <- q1_2015 %>%  
  select(-c(birthyear, gender, "tripduration"))

q2_2015 <- q2_2015 %>%  
  select(-c(birthyear, gender, "tripduration"))

q3_2015 <- q3_2015 %>%  
  select(-c(birthyear, gender, "tripduration"))

q4_2015 <- q4_2015 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2016 <- q1_2016 %>%  
  select(-c(birthyear, gender, "tripduration"))

q2_2016 <- q2_2016 %>%  
  select(-c(birthyear, gender, "tripduration"))

q3_2016 <- q3_2016 %>%  
  select(-c(birthyear, gender, "tripduration"))

q4_2016 <- q4_2016 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2017 <- q1_2017 %>%  
  select(-c(birthyear, gender, "tripduration"))

q2_2017 <- q2_2017 %>%  
  select(-c(birthyear, gender, "tripduration"))

q3_2017 <- q3_2017 %>%  
  select(-c(birthyear, gender, "tripduration"))

q4_2017 <- q4_2017 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2018 <- q1_2018 %>%  
  select(-c("01 - Rental Details Duration In Seconds Uncapped", "05 - Member Details Member Birthday Year", "Member Gender"))
q2_2018 <- q2_2018 %>%  
  select(-c(birthyear, gender, "tripduration"))
q3_2018 <- q3_2018 %>%  
  select(-c(birthyear, gender, "tripduration"))
q4_2018 <- q4_2018 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2019 <- q1_2019 %>%  
  select(-c(birthyear, gender, "tripduration"))
q2_2019 <- q2_2019 %>%  
  select(-c("01 - Rental Details Duration In Seconds Uncapped", "05 - Member Details Member Birthday Year", "Member Gender"))
q3_2019 <- q3_2019 %>%  
  select(-c(birthyear, gender, "tripduration"))
q4_2019 <- q4_2019 %>%  
  select(-c(birthyear, gender, "tripduration"))

q1_2020 <- q1_2020 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q2_2020 <- q2_2020 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q3_2020 <- q3_2020 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q4_2020 <- q4_2020 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))

q1_2021 <- q1_2021 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q2_2021 <- q2_2021 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q3_2021 <- q3_2021 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q4_2021 <- q4_2021 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))

q1_2022 <- q1_2022 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q2_2022 <- q2_2022 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q3_2022 <- q3_2022 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))
q4_2022 <- q4_2022 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))

q1_2023 <- q1_2023 %>%  
  select(-c(start_lat, start_lng, end_lat, end_lng))

Make Big Dataset

#### Stack individual quarter's data frames into one big data frame
all_trips <- bind_rows(y_2013,q1_2_2014,q1_2015,q1_2016,q1_2017,q1_2018,q1_2019,q1_2020,q1_2021,q1_2022,q1_2023,q2_2015,q2_2016,q2_2017,q2_2018,q2_2019,q2_2020,q2_2021,q2_2022,q3_2014,q3_2015,q3_2016,q3_2017,q3_2018,q3_2019,q3_2020,q3_2021,q3_2022,q4_2014,q4_2015,q4_2016,q4_2017,q4_2018,q4_2019,q4_2020,q4_2021,q4_2022)

#====================================================== # STEP 3: CLEAN UP AND ADD DATA TO PREPARE FOR ANALYSIS #======================================================

#PROCESS

Cleaning and preparing data for analysis

Key tasks

Check the data for errors.
Choose your tools.
Transform the data so you can work with it effectively.
Document the cleaning process.

Deliverable

Following code chunks will be used for this phase.

# Inspect the new table that has been created
colnames(all_trips)  #List of column names
[1] "ride_id"            "started_at"         "ended_at"           "rideable_type"      "start_station_id"  
[6] "start_station_name" "end_station_id"     "end_station_name"   "member_casual"     
nrow(all_trips)  #How many rows are in data frame?
[1] 36386876
dim(all_trips)  #Dimensions of the data frame?
[1] 36386876        9
head(all_trips)  #See the first 6 rows of data frame.  Also tail(all_trips)
str(all_trips)  #See list of columns and data types (numeric, character, etc)
'data.frame':   36386876 obs. of  9 variables:
 $ ride_id           : chr  "4118" "4275" "4291" "4316" ...
 $ started_at        : POSIXct, format: NA NA NA NA ...
 $ ended_at          : POSIXct, format: NA NA NA NA ...
 $ rideable_type     : chr  "480" "77" "77" "77" ...
 $ start_station_id  : chr  "85" "32" "32" "19" ...
 $ start_station_name: chr  "Michigan Ave & Oak St" "Racine Ave & Congress Pkwy" "Racine Ave & Congress Pkwy" "Loomis St & Taylor St" ...
 $ end_station_id    : chr  "28" "32" "19" "19" ...
 $ end_station_name  : chr  "Larrabee St & Menomonee St" "Racine Ave & Congress Pkwy" "Loomis St & Taylor St" "Loomis St & Taylor St" ...
 $ member_casual     : chr  "Customer" "Customer" "Customer" "Customer" ...
summary(all_trips)  #Statistical summary of data. Mainly for numerics
   ride_id            started_at                        ended_at                      rideable_type     
 Length:36386876    Min.   :2018-01-01 00:12:00.00   Min.   :2018-01-01 00:17:23.00   Length:36386876   
 Class :character   1st Qu.:2019-08-02 03:53:23.75   1st Qu.:2019-08-02 05:40:07.50   Class :character  
 Mode  :character   Median :2021-05-05 10:03:34.00   Median :2021-05-05 10:24:38.00   Mode  :character  
                    Mean   :2020-11-29 12:10:14.64   Mean   :2020-11-29 12:31:58.40                     
                    3rd Qu.:2022-04-28 16:27:38.50   3rd Qu.:2022-04-28 16:39:33.25                     
                    Max.   :2023-03-31 23:59:28.00   Max.   :2023-04-03 11:41:11.00                     
                    NA's   :13767584                 NA's   :13767584                                   
 start_station_id   start_station_name end_station_id     end_station_name   member_casual     
 Length:36386876    Length:36386876    Length:36386876    Length:36386876    Length:36386876   
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
                                                                                               

Remove bias which are null values

is.na(all_trips)
all_trips <- na.omit(all_trips)

There are a few problems we will need to fix:

(1) In the “member_casual” column, there are two names for members (“member” and “Subscriber”) and two names for casual riders (“Customer” and “casual”). We will need to consolidate that from four to two labels.

(2) The data can only be aggregated at the ride-level, which is too granular. We will want to add some additional columns of data – such as day, month, year – that provide additional opportunities to aggregate the data.

(3) We will want to add a calculated field for length of ride since the 2020Q1 data did not have the “tripduration” column. We will add “ride_length” to the entire dataframe for consistency.

(4) There are some rides where tripduration shows up as negative, including several hundred rides where Divvy took bikes out of circulation for Quality Control reasons. We will want to delete these rides.

In the “member_casual” column, replace “Subscriber” with “member” and “Customer” with “casual”

Before 2020, Divvy used different labels for these two types of riders … we will want to make our dataframe consistent with their current nomenclature

N.B.: “Level” is a special property of a column that is retained even if a subset does not contain any values from a specific level

Begin by seeing how many observations fall under each usertype

table(all_trips$member_casual)

    casual   Customer     member Subscriber 
   5451378    1557793    8150672    5863293 
# Reassign to the desired values
all_trips <-  all_trips %>% 
  mutate(member_casual = recode(member_casual
                                ,"Subscriber" = "member"
                                ,"Customer" = "casual"))
# Check to make sure the proper number of observations were reassigned
table(all_trips$member_casual)

  casual   member 
 7009171 14013965 

Add columns that list the date, month, day, and year of each ride

This will allow us to aggregate ride data for each month, day, or year … before completing these operations we could only aggregate at the ride level

Add a “ride_length” calculation to all_trips (in seconds)

https://stat.ethz.ch/R-manual/R-devel/library/base/html/difftime.html

all_trips$ride_length <- difftime(all_trips$ended_at,all_trips$started_at)

Inspect the structure of the columns

str(all_trips)
'data.frame':   21023136 obs. of  15 variables:
 $ ride_id           : chr  "17536702" "17536703" "17536704" "17536705" ...
 $ started_at        : POSIXct, format: "2018-01-01 00:12:00" "2018-01-01 00:41:35" "2018-01-01 00:44:46" "2018-01-01 00:53:10" ...
 $ ended_at          : POSIXct, format: "2018-01-01 00:17:23" "2018-01-01 00:47:52" "2018-01-01 01:33:10" "2018-01-01 01:05:37" ...
 $ rideable_type     : chr  "3304" "5367" "4599" "2302" ...
 $ start_station_id  : chr  "69" "253" "98" "125" ...
 $ start_station_name: chr  "Damen Ave & Pierce Ave" "Winthrop Ave & Lawrence Ave" "LaSalle St & Washington St" "Rush St & Hubbard St" ...
 $ end_station_id    : chr  "159" "325" "509" "364" ...
 $ end_station_name  : chr  "Claremont Ave & Hirsch St" "Clark St & Winnemac Ave (Temp)" "Troy St & North Ave" "Larrabee St & Oak St" ...
 $ member_casual     : chr  "member" "member" "member" "member" ...
 $ date              : Date, format: "2018-01-01" "2018-01-01" "2018-01-01" "2018-01-01" ...
 $ month             : chr  "01" "01" "01" "01" ...
 $ day               : chr  "01" "01" "01" "01" ...
 $ year              : chr  "2018" "2018" "2018" "2018" ...
 $ day_of_week       : chr  "Monday" "Monday" "Monday" "Monday" ...
 $ ride_length       : 'difftime' num  323 377 2904 747 ...
  ..- attr(*, "units")= chr "secs"
 - attr(*, "na.action")= 'omit' Named int [1:15363740] 1 2 3 4 5 6 7 8 9 10 ...
  ..- attr(*, "names")= chr [1:15363740] "1" "2" "3" "4" ...

Convert “ride_length” from Factor to numeric so we can run calculations on the data

is.factor(all_trips$ride_length)
[1] FALSE
all_trips$ride_length <- as.numeric(as.character(all_trips$ride_length))
is.numeric(all_trips$ride_length)
[1] TRUE

Remove “bad” data

The dataframe includes a few hundred entries when bikes were taken out of docks and checked for quality by Divvy or ride_length was negative

We will create a new version of the dataframe (v2) since data is being removed

https://www.datasciencemadesimple.com/delete-or-drop-rows-in-r-with-conditions-2

all_trips_v2 <- all_trips[!(all_trips$start_station_name == "HQ QR" | all_trips$ride_length<0),]

#===================================== # STEP 4: CONDUCT DESCRIPTIVE ANALYSIS #=====================================

# Descriptive analysis on ride_length (all figures in seconds)
mean(all_trips_v2$ride_length) #straight average (total ride length / rides)
[1] 1312.669
median(all_trips_v2$ride_length) #midpoint number in the ascending array of ride lengths
[1] 685
max(all_trips_v2$ride_length) #longest ride
[1] 14340041
min(all_trips_v2$ride_length) #shortest ride
[1] 0
# You can condense the four lines above to one line using summary() on the specific attribute
summary(all_trips_v2$ride_length)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
       0      390      685     1313     1250 14340041 
# Compare members and casual users
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual, FUN = mean)
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual, FUN = median)
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual, FUN = max)
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual, FUN = min)
# See the average ride time by each day for members vs casual users
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual + all_trips_v2$day_of_week, FUN = mean)
# Notice that the days of the week are out of order. Let's fix that.
all_trips_v2$day_of_week <- ordered(all_trips_v2$day_of_week, levels=c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
# Now, let's run the average ride time by each day for members vs casual users
aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual + all_trips_v2$day_of_week, FUN = mean)
# analyze ridership data by type and weekday
all_trips_v2 %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>%  #creates weekday field using wday()
  group_by(member_casual, weekday) %>%  #groups by usertype and weekday
  summarise(number_of_rides = n()                           #calculates the number of rides and average duration 
            ,average_duration = mean(ride_length)) %>%      # calculates the average duration
  arrange(member_casual, weekday)                               # sorts
`summarise()` has grouped output by 'member_casual'. You can override using the `.groups` argument.

#Now Times to Visualize the data

# Let's visualize the number of rides by rider type
all_trips_v2 %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, weekday) %>% 
  summarise(number_of_rides = n()
            ,average_duration = mean(ride_length)) %>% 
  arrange(member_casual, weekday)  %>% 
  ggplot(aes(x = weekday, y = number_of_rides, fill = member_casual)) +
  geom_col(position = "dodge")
`summarise()` has grouped output by 'member_casual'. You can override using the `.groups` argument.

# Let's create a visualization for average duration
all_trips_v2 %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, weekday) %>% 
  summarise(number_of_rides = n()
            ,average_duration = mean(ride_length)) %>% 
  arrange(member_casual, weekday)  %>% 
  ggplot(aes(x = weekday, y = average_duration, fill = member_casual)) +
  geom_col(position = "dodge")
`summarise()` has grouped output by 'member_casual'. You can override using the `.groups` argument.

#================================================= # STEP 5: EXPORT SUMMARY FILE FOR FURTHER ANALYSIS #=================================================

# Create a csv file that we will visualize in Excel, Tableau, or my presentation software
# N.B.: This file location is for a Mac. If you are working on a PC, change the file location accordingly (most likely "C:\Users\YOUR_USERNAME\Desktop\...") to export the data. You can read more here: https://datatofish.com/export-dataframe-to-csv-in-r/

counts <- aggregate(all_trips_v2$ride_length ~ all_trips_v2$member_casual + all_trips_v2$day_of_week, FUN = mean)
write.csv(counts, file = 'D:/Project/Project 1/final/avg_ride_length.csv')

#ACT

This phase will be carried out by the executive team, Director of Marketing (Lily Moreno) and the Marketing Analytics team based on my analysis. Conclusion

Casual riders go farther in terms of distance.
Casual riders travel for a longer time period.
Members ride less on the weekend compared to casual riders.

Deliverable

Your top three recommendations based on your analysis

Have a slash sale or promo for casual riders so they can acquire more bikes and indulge them in the benefits of being a member.
Encourage member riders to ride on weekends by giving them various coupons or extending their membership by a period of time.
Host fun biking competitions with prizes at intervals for members on the weekends. Since there are lot of casual riders on weekends,this will also attract them to get a membership.
LS0tDQp0aXRsZTogIkRpdnZ5IEN5Y2xpc3RpYyBOb3RlYm9vayINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQpJTlRST0RVQ1RJT04NCg0KVGhpcyBjYXBzdG9uZSBwcm9qZWN0IGlzIG15IGZpcnN0IHByb2plY3QgaW4gbXkgR29vZ2xlIERhdGEgQW5hbHl0aWNzIFByb2Zlc3Npb25hbCBDZXJ0aWZpY2F0ZSBjb3Vyc2UuIEluIHRoaXMgY2FzZSBzdHVkeSBJIHdpbGwgYmUgYW5hbHl6aW5nIGEgcHVibGljIGRhdGFzZXQgZm9yIGEgZmljdGlvbmFsIGNvbXBhbnkgcHJvdmlkZWQgYnkgdGhlIGNvdXJzZS4gSSB3aWxsIGJlIHVzaW5nIFIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZm9yIHRoaXMgYW5hbHlzaXMgYmVjYXVzZSBvZiBpdHMgZWFzeSBzdGF0aXN0aWNhbCBhbmFseXNpcyB0b29scyBhbmQgZGF0YSB2aXN1YWxpemF0aW9ucy4NCg0KVGhlIGZvbGxvd2luZyBkYXRhIGFuYWx5c2lzIHN0ZXBzIHdpbGwgYmUgZm9sbG93ZWQ6DQoNCiAgICBBc2ssDQogICAgUHJlcGFyZSwNCiAgICBQcm9jZXNzLA0KICAgIEFuYWx5emUsDQogICAgU2hhcmUsDQogICAgQWN0Lg0KICAgIA0KVGhlIGNhc2Ugc3R1ZHkgcm9hZG1hcCBiZWxvdyB3aWxsIGJlIGZvbGxvd2VkIG9uIGVhY2ggc3RlcDoNCg0KICAgIENvZGUsIHdoZW4gbmVlZGVkLg0KICAgIEtleSB0YXNrcy4NCiAgICBEZWxpdmVyYWJsZXMuICANCiAgICANClNjZW5hcmlvDQoNCllvdSBhcmUgYSBqdW5pb3IgZGF0YSBhbmFseXN0IHdvcmtpbmcgaW4gdGhlIG1hcmtldGluZyBhbmFseXN0IHRlYW0gYXQgQ3ljbGlzdGljLCBhIGJpa2Utc2hhcmUgY29tcGFueSBpbiBDaGljYWdvLiBUaGUgZGlyZWN0b3Igb2YgbWFya2V0aW5nIGJlbGlldmVzIHRoZSBjb21wYW554oCZcyBmdXR1cmUgc3VjY2VzcyBkZXBlbmRzIG9uIG1heGltaXppbmcgdGhlIG51bWJlciBvZiBhbm51YWwgbWVtYmVyc2hpcHMuIFRoZXJlZm9yZSx5b3VyIHRlYW0gd2FudHMgdG8gdW5kZXJzdGFuZCBob3cgY2FzdWFsIHJpZGVycyBhbmQgYW5udWFsIG1lbWJlcnMgdXNlIEN5Y2xpc3RpYyBiaWtlcyBkaWZmZXJlbnRseS4gRnJvbSB0aGVzZSBpbnNpZ2h0cywgeW91ciB0ZWFtIHdpbGwgZGVzaWduIGEgbmV3IG1hcmtldGluZyBzdHJhdGVneSB0byBjb252ZXJ0IGNhc3VhbCByaWRlcnMgaW50byBhbm51YWwgbWVtYmVycy4gQnV0IGZpcnN0LCBDeWNsaXN0aWMgZXhlY3V0aXZlcyBtdXN0IGFwcHJvdmUgeW91ciByZWNvbW1lbmRhdGlvbnMsIHNvIHRoZXkgbXVzdCBiZSBiYWNrZWQgdXAgd2l0aCBjb21wZWxsaW5nIGRhdGEgaW5zaWdodHMgYW5kIHByb2Zlc3Npb25hbCBkYXRhIHZpc3VhbGl6YXRpb25zLg0KQVNLDQoNCiAgICBUaHJlZSBxdWVzdGlvbnMgd2lsbCBndWlkZSB0aGUgZnV0dXJlIG1hcmtldGluZyBwcm9ncmFtOg0KDQogICAgSG93IGRvIGFubnVhbCBtZW1iZXJzIGFuZCBjYXN1YWwgcmlkZXJzIHVzZSBDeWNsaXN0aWMgYmlrZXMgZGlmZmVyZW50bHk/DQogICAgV2h5IHdvdWxkIGNhc3VhbCByaWRlcnMgYnV5IEN5Y2xpc3RpYyBhbm51YWwgbWVtYmVyc2hpcHM/DQogICAgSG93IGNhbiBDeWNsaXN0aWMgdXNlIGRpZ2l0YWwgbWVkaWEgdG8gaW5mbHVlbmNlIGNhc3VhbCByaWRlcnMgdG8gYmVjb21lIG1lbWJlcnM/DQoNCkxpbHkgTW9yZW5vICh0aGUgZGlyZWN0b3Igb2YgbWFya2V0aW5nIGFuZCBteSBtYW5hZ2VyKSBoYXMgYXNzaWduZWQgeW91IHRoZSBmaXJzdCBxdWVzdGlvbiB0byBhbnN3ZXI6IEhvdyBkbyBhbm51YWwgbWVtYmVycyBhbmQgY2FzdWFsIHJpZGVycyB1c2UgQ3ljbGlzdGljIGJpa2VzIGRpZmZlcmVudGx5Pw0KDQpLZXkgdGFza3MNCg0KICAgIElkZW50aWZ5IHRoZSBidXNpbmVzcyB0YXNrDQoNCiAgICBUaGUgbWFpbiBvYmplY3RpdmUgaXMgdG8gZGVzaWduIG1hcmtldGluZyBzdHJhdGVnaWVzIGFpbWVkIGF0IGNvbnZlcnRpbmcgY2FzdWFsIHJpZGVycyB0byBhbm51YWwgbWVtYmVycyBieSB1bmRlcnN0YW5kaW5nIGhvdyB0aGV5IGRpZmZlci4NCg0KICAgIENvbnNpZGVyIGtleSBzdGFrZWhvbGRlcnMNCg0KICAgIERpcmVjdG9yIG9mIE1hcmtldGluZyAoTGlseSBNb3Jlbm8pLCBNYXJrZXRpbmcgQW5hbHl0aWNzIHRlYW0sIEV4ZWN1dGl2ZSB0ZWFtLg0KDQpEZWxpdmVyYWJsZQ0KDQogICAgQSBjbGVhciBzdGF0ZW1lbnQgb2YgdGhlIGJ1c2luZXNzIHRhc2sNCg0KICAgIFRvIGZpbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNhc3VhbCByaWRlcnMgYW5kIGFubnVhbCBtZW1iZXJzLg0KDQpQUkVQQVJFDQoNCiAgICBJIHdpbGwgdXNlIEN5Y2xpc3RpY+KAmXMgaGlzdG9yaWNhbCB0cmlwIGRhdGEgdG8gYW5hbHl6ZSBhbmQgaWRlbnRpZnkgdHJlbmRzLiBUaGUgZGF0YSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSBieSBNb3RpdmF0ZSBJbnRlcm5hdGlvbmFsIEluYy4gdW5kZXIgdGhpcyBsaWNlbnNlLiBEYXRhc2V0cyBhcmUgYXZhaWxhYmxlIGhlcmUgbGluay4NCg0KS2V5IHRhc2tzDQoNCiAgICBEb3dubG9hZCBkYXRhIGFuZCBzdG9yZSBpdCBhcHByb3ByaWF0ZWx5Lg0KDQogICAgRGF0YSBoYXMgYmVlbiBkb3dubG9hZGVkIGFuZCBjb3BpZXMgaGF2ZSBiZWVuIHN0b3JlZCBzZWN1cmVseSBvbiBteSBjb21wdXRlciBhbmQgaGVyZSBvbiBLYWdnbGUuDQoNCjIuIElkZW50aWZ5IGhvdyBpdOKAmXMgb3JnYW5pemVkLg0KDQogICAgVGhlIGRhdGEgaXMgaW4gQ1NWIChjb21tYS1zZXBhcmF0ZWQgdmFsdWVzKSBmb3JtYXQsIGFuZCB0aGVyZSBhcmUgYSB0b3RhbCBvZiAxMyBjb2x1bW5zLg0KDQozLiBTb3J0IGFuZCBmaWx0ZXIgdGhlIGRhdGEuDQoNCiAgICBGb3IgdGhpcyBhbmFseXNpcywgSSB3aWxsIGJlIHVzaW5nIGRhdGEgZm9yIHRoZSBsYXN0IDEyIG1vbnRocyAoRmViIDIwMjEgLSBKYW4gMjAyMikgYmVjYXVzZSBpdCBpcyBtb3JlIGN1cnJlbnQuDQoNCjQuIERldGVybWluZSB0aGUgY3JlZGliaWxpdHkgb2YgdGhlIGRhdGEuDQoNCkRlbGl2ZXJhYmxlDQogIEEgZGVzY3JpcHRpb24gb2YgYWxsIGRhdGEgc291cmNlcyB1c2VkDQogIE1haW4gc291cmNlIG9mIGRhdGEgcHJvdmlkZWQgYnkgdGhlIEN5bGlzdGljIGNvbXBhbnkuDQoNCkluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmluc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpDQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmluc3RhbGwucGFja2FnZXMoInJlYWRyIikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWRyKQ0KYGBgDQoNCnNlbGVjdCBkaXJlY3RvcnkgZm9yIGxvYWQgZmlsZS4NCmBgYHtyfQ0Kc2V0d2QoIkQ6L1Byb2plY3QvUHJvamVjdCAxL09yaWdpbmFsIikNCmBgYA0KIz09PT09PT09PT09PT09PT09PT09PQ0KIyBTVEVQIDE6IENPTExFQ1QgREFUQQ0KIz09PT09PT09PT09PT09PT09PT09PQ0KYGBge3J9DQojIFVwbG9hZCBEaXZ2eSBkYXRhc2V0cyAoY3N2IGZpbGVzKSBoZXJlDQp5XzIwMTMgPC0gcmVhZC5jc3YoIkRpdnZ5X1RyaXBzXzIwMTMuY3N2IikNCnExXzJfMjAxNCA8LSByZWFkX2NzdigiRGl2dnlfVHJpcHNfMjAxNF9RMVEyLmNzdiIpDQpxM183XzIwMTQgPC0gcmVhZF9jc3YoIkRpdnZ5X1RyaXBzXzIwMTQtUTMtMDcuY3N2IikNCnEzXzhfOV8yMDE0IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE0LVEzLTA3LmNzdiIpDQpxNF8yMDE0IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE0LVE0LmNzdiIpDQpxMV8yMDE1IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE0LVE0LmNzdiIpDQpxMl8yMDE1IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE1LVEyLmNzdiIpDQpxM183XzIwMTUgPC0gcmVhZF9jc3YoIkRpdnZ5X1RyaXBzXzIwMTVfMDcuY3N2IikNCnEzXzhfMjAxNSA8LSByZWFkX2NzdigiRGl2dnlfVHJpcHNfMjAxNV8wOC5jc3YiKQ0KcTNfOV8yMDE1IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE1XzA5LmNzdiIpDQpxNF8yMDE1IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE1X1E0LmNzdiIpDQpxMV8yMDE2IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE2X1ExLmNzdiIpDQpxMl80XzIwMTYgPC0gcmVhZF9jc3YoIkRpdnZ5X1RyaXBzXzIwMTZfMDQuY3N2IikNCnEyXzVfMjAxNiA8LSByZWFkX2NzdigiRGl2dnlfVHJpcHNfMjAxNl8wNS5jc3YiKQ0KcTJfNl8yMDE2IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE2XzA2LmNzdiIpDQpxM18yMDE2IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE2X1EzLmNzdiIpDQpxNF8yMDE2IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE2X1E0LmNzdiIpDQpxMV8yMDE3IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE3X1ExLmNzdiIpDQpxMl8yMDE3IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE3X1EyLmNzdiIpDQpxM18yMDE3IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE3X1EzLmNzdiIpDQpxNF8yMDE3IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE3X1E0LmNzdiIpDQpxMV8yMDE4IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE4X1ExLmNzdiIpDQpxMl8yMDE4IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE4X1EyLmNzdiIpDQpxM18yMDE4IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE4X1EzLmNzdiIpDQpxNF8yMDE4IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE4X1E0LmNzdiIpDQpxMV8yMDE5IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE5X1ExLmNzdiIpDQpxMl8yMDE5IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE5X1EyLmNzdiIpDQpxM18yMDE5IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE5X1EzLmNzdiIpDQpxNF8yMDE5IDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDE5X1E0LmNzdiIpDQpxMV8yMDIwIDwtIHJlYWRfY3N2KCJEaXZ2eV9Ucmlwc18yMDIwX1ExLmNzdiIpDQpxMl80XzIwMjAgPC0gcmVhZF9jc3YoIjIwMjAwNC1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTJfNV8yMDIwIDwtIHJlYWRfY3N2KCIyMDIwMDUtZGl2dnktdHJpcGRhdGEuY3N2IikNCnEyXzZfMjAyMCA8LSByZWFkX2NzdigiMjAyMDA2LWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxM183XzIwMjAgPC0gcmVhZF9jc3YoIjIwMjMwMV9kaXZ2eV90cmlwZGF0YS5jc3YiKQ0KcTNfOF8yMDIwIDwtIHJlYWRfY3N2KCIyMDIwMDhfZGl2dnlfdHJpcGRhdGEuY3N2IikNCnEzXzlfMjAyMCA8LSByZWFkX2NzdigiMjAyMDA5X2RpdnZ5X3RyaXBkYXRhLmNzdiIpDQpxNF8xMF8yMDIwIDwtIHJlYWRfY3N2KCIyMDIwMTAtZGl2dnktdHJpcGRhdGEuY3N2IikNCnE0XzExXzIwMjAgPC0gcmVhZF9jc3YoIjIwMjAxMS1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTRfMTJfMjAyMCA8LSByZWFkX2NzdigiMjAyMDEyLWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxMV8xXzIwMjEgPC0gcmVhZF9jc3YoIjIwMjEwMS1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTFfMl8yMDIxIDwtIHJlYWRfY3N2KCIyMDIxMDItZGl2dnktdHJpcGRhdGEuY3N2IikNCnExXzNfMjAyMSA8LSByZWFkX2NzdigiMjAyMTAzLWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxMl80XzIwMjEgPC0gcmVhZF9jc3YoIjIwMjEwNC1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTJfNV8yMDIxIDwtIHJlYWRfY3N2KCIyMDIxMDUtZGl2dnktdHJpcGRhdGEuY3N2IikNCnEyXzZfMjAyMSA8LSByZWFkX2NzdigiMjAyMTA2LWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxM183XzIwMjEgPC0gcmVhZF9jc3YoIjIwMjEwNy1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTNfOF8yMDIxIDwtIHJlYWRfY3N2KCIyMDIxMDgtZGl2dnktdHJpcGRhdGEuY3N2IikNCnEzXzlfMjAyMSA8LSByZWFkLmNzdigiMjAyMTA5LWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxNF8xMF8yMDIxIDwtIHJlYWQuY3N2KCIyMDIxMTAtZGl2dnktdHJpcGRhdGEuY3N2IikNCnE0XzExXzIwMjEgPC0gcmVhZC5jc3YoIjIwMjExMS1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTRfMTJfMjAyMSA8LSByZWFkLmNzdigiMjAyMTEyLWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxMV8xXzIwMjIgPC0gcmVhZF9jc3YoIjIwMjIwMS1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTFfMl8yMDIyIDwtIHJlYWRfY3N2KCIyMDIyMDItZGl2dnktdHJpcGRhdGEuY3N2IikNCnExXzNfMjAyMiA8LSByZWFkX2NzdigiMjAyMjAzLWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxMl80XzIwMjIgPC0gcmVhZF9jc3YoIjIwMjIwNF9kaXZ2eV90cmlwZGF0YS5jc3YiKQ0KcTJfNV8yMDIyIDwtIHJlYWRfY3N2KCIyMDIyMDVfZGl2dnlfdHJpcGRhdGEuY3N2IikNCnEyXzZfMjAyMiA8LSByZWFkX2NzdigiMjAyMjA2X2RpdnZ5X3RyaXBkYXRhLmNzdiIpDQpxM183XzIwMjIgPC0gcmVhZF9jc3YoIjIwMjIwN19kaXZ2eV90cmlwZGF0YS5jc3YiKQ0KcTNfOF8yMDIyIDwtIHJlYWRfY3N2KCIyMDIyMDhfZGl2dnlfdHJpcGRhdGEuY3N2IikNCnEzXzlfMjAyMiA8LSByZWFkLmNzdigiMjAyMjA5X2RpdnZ5X3RyaXBkYXRhLmNzdiIpDQpxNF8xMF8yMDIyIDwtIHJlYWQuY3N2KCIyMDIyMTAtZGl2dnktdHJpcGRhdGEuY3N2IikNCnE0XzExXzIwMjIgPC0gcmVhZC5jc3YoIjIwMjIxMS1kaXZ2eS10cmlwZGF0YS5jc3YiKQ0KcTRfMTJfMjAyMiA8LSByZWFkLmNzdigiMjAyMjEyLWRpdnZ5LXRyaXBkYXRhLmNzdiIpDQpxMV8xXzIwMjMgPC0gcmVhZC5jc3YoIjIwMjMwMV9kaXZ2eV90cmlwZGF0YS5jc3YiKQ0KcTFfMl8yMDIzIDwtIHJlYWQuY3N2KCIyMDIzMDJfZGl2dnlfdHJpcGRhdGEuY3N2IikNCnExXzNfMjAyMyA8LSByZWFkLmNzdigiMjAyMzAzX2RpdnZ5X3RyaXBkYXRhLmNzdiIpDQpgYGANCkkgZW5zdXJlZCB0aGF0IHRoZSBkYXRhIHNldHMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgc2FtZSBjb2x1bW4gbmFtZXMgd2l0aCBzb21lIGV4dHJhIGNvdW1uIG5hbWVzIHdoaWNoIHJlbW92ZSBmdXJ0aGVyIHRvIHJlbW92ZSB1bndhbnRlZCBjb2xtbi4gQmVmb3JlIGdvaW5nIGZvcndhcmQgdG8gbWVyZ2UgdGhlbSwgSSBhbHNvIGNoZWNrZWQgZm9yIGluY29uc2lzdGVuY2llcy4NCg0KTWVyZ2UgbW9udGhseSBkYXRhIHNldCBpbiB0byBxdWV0ZXJseSBmb3IgZXZlcnkgeWVhcnMgZm9yIGVhc3kgcmVmcmVuY2UuIFNvbWUgZGF0YSB0eXBlcyBub3QgbWF0Y2ggc28sIGFsc28gY2hhbmdlIGRhdGEgdHlwZSBmb3Igc3RhcnRlZF9hdCBhbmQgZW5kZWRfYXQgY29sbW4gZm9yIGZpbmQgb3V0IHJpZGVfZHVyYXRpb24gZm9yIGZ1cnRoZXIgYW5hbHlzaXMuDQoNCmBgYHtyfQ0KcTNfMjAxNCA8LSBiaW5kX3Jvd3MocTNfN18yMDE0LHEzXzhfOV8yMDE0KQ0KcTNfMjAxNSA8LSBiaW5kX3Jvd3MocTNfN18yMDE1LHEzXzhfMjAxNSxxM185XzIwMTUpDQpxMl8yMDE2IDwtIGJpbmRfcm93cyhxMl80XzIwMTYscTJfNV8yMDE2LHEyXzZfMjAxNikNCnEyXzRfMjAyMCA8LSAgbXV0YXRlKHEyXzVfMjAyMCwgc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzRfMjAyMCA8LSAgbXV0YXRlKHEyXzVfMjAyMCwgZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfNV8yMDIwIDwtICBtdXRhdGUocTJfNV8yMDIwLCBzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfNV8yMDIwIDwtICBtdXRhdGUocTJfNV8yMDIwLCBlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl82XzIwMjAgPC0gIG11dGF0ZShxMl82XzIwMjAsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl82XzIwMjAgPC0gIG11dGF0ZShxMl82XzIwMjAsIGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMjAgPC0gYmluZF9yb3dzKHEyXzRfMjAyMCxxMl81XzIwMjAscTJfNl8yMDIwKQ0KcTNfN18yMDIwIDwtICBtdXRhdGUocTNfN18yMDIwLCBzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfN18yMDIwIDwtICBtdXRhdGUocTNfN18yMDIwLCBlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM184XzIwMjAgPC0gIG11dGF0ZShxM184XzIwMjAsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM184XzIwMjAgPC0gIG11dGF0ZShxM184XzIwMjAsIGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzhfMjAyMCA8LSAgbXV0YXRlKHEzXzhfMjAyMCwgc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnEzXzhfMjAyMCA8LSAgbXV0YXRlKHEzXzhfMjAyMCwgZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTNfOV8yMDIwIDwtICBtdXRhdGUocTNfOV8yMDIwLCBzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfOV8yMDIwIDwtICBtdXRhdGUocTNfOV8yMDIwLCBlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM185XzIwMjAgPC0gIG11dGF0ZShxM185XzIwMjAsIHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxM185XzIwMjAgPC0gIG11dGF0ZShxM185XzIwMjAsIGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnEzXzIwMjAgPC0gYmluZF9yb3dzKHEzXzdfMjAyMCxxM184XzIwMjAscTNfOV8yMDIwKQ0KcTRfMTBfMjAyMCA8LSAgbXV0YXRlKHE0XzEwXzIwMjAsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8xMF8yMDIwIDwtICBtdXRhdGUocTRfMTBfMjAyMCwgZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMTFfMjAyMCA8LSAgbXV0YXRlKHE0XzExXzIwMjAsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8xMV8yMDIwIDwtICBtdXRhdGUocTRfMTFfMjAyMCwgZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMTJfMjAyMCA8LSAgbXV0YXRlKHE0XzEyXzIwMjAsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8xMl8yMDIwIDwtICBtdXRhdGUocTRfMTJfMjAyMCwgZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMTBfMjAyMCA8LSBtdXRhdGUocTRfMTBfMjAyMCwgc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnE0XzExXzIwMjAgPC0gbXV0YXRlKHE0XzExXzIwMjAsIHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxNF8xMl8yMDIwIDwtIG11dGF0ZShxNF8xMl8yMDIwLCBzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTRfMTBfMjAyMCA8LSBtdXRhdGUocTRfMTBfMjAyMCwgZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTRfMTFfMjAyMCA8LSBtdXRhdGUocTRfMTFfMjAyMCwgZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTRfMTJfMjAyMCA8LSBtdXRhdGUocTRfMTJfMjAyMCwgZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTRfMjAyMCA8LSBiaW5kX3Jvd3MocTRfMTBfMjAyMCxxNF8xMV8yMDIwLHE0XzEyXzIwMjApDQpxMV8yMDIxIDwtIGJpbmRfcm93cyhxMV8xXzIwMjEscTFfMl8yMDIxLHExXzNfMjAyMSkNCnEyXzIwMjEgPC0gYmluZF9yb3dzKHEyXzRfMjAyMSxxMl81XzIwMjEscTJfNl8yMDIxKQ0KcTNfOV8yMDIxIDwtICBtdXRhdGUocTNfOV8yMDIxLCBzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfOV8yMDIxIDwtICBtdXRhdGUocTNfOV8yMDIxLCBlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM18yMDIxIDwtIGJpbmRfcm93cyhxM183XzIwMjEscTNfOF8yMDIxLHEzXzlfMjAyMSkNCnE0XzIwMjEgPC0gYmluZF9yb3dzKHE0XzEwXzIwMjEscTRfMTFfMjAyMSxxNF8xMl8yMDIxKQ0KcTFfMjAyMiA8LSBiaW5kX3Jvd3MocTFfMV8yMDIyLHExXzJfMjAyMixxMV8zXzIwMjIpDQpxMl8yMDIyIDwtIGJpbmRfcm93cyhxMl80XzIwMjIscTJfNV8yMDIyLHEyXzZfMjAyMikNCnEzXzdfMjAyMiA8LSAgbXV0YXRlKHEzXzdfMjAyMiwgc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzdfMjAyMiA8LSAgbXV0YXRlKHEzXzdfMjAyMiwgZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfOF8yMDIyIDwtICBtdXRhdGUocTNfOF8yMDIyLCBzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfOF8yMDIyIDwtICBtdXRhdGUocTNfOF8yMDIyLCBlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM185XzIwMjIgPC0gIG11dGF0ZShxM185XzIwMjIsIHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM185XzIwMjIgPC0gIG11dGF0ZShxM185XzIwMjIsIGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzIwMjIgPC0gYmluZF9yb3dzKHEzXzdfMjAyMixxM184XzIwMjIscTNfOV8yMDIyKQ0KcTRfMjAyMiA8LSBiaW5kX3Jvd3MocTRfMTBfMjAyMixxNF8xMV8yMDIyLHE0XzEyXzIwMjIpDQpxMV8yMDIzIDwtIGJpbmRfcm93cyhxMV8xXzIwMjMscTFfMl8yMDIzLHExXzNfMjAyMykNCmBgYA0KDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBTVEVQIDI6IFdSQU5HTEUgREFUQSBBTkQgQ09NQklORSBJTlRPIEEgU0lOR0xFIEZJTEUNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpDb21wYXJlIGNvbHVtbiBuYW1lcyBlYWNoIG9mIHRoZSBmaWxlcw0KIFdoaWxlIHRoZSBuYW1lcyBkb24ndCBoYXZlIHRvIGJlIGluIHRoZSBzYW1lIG9yZGVyLCB0aGV5IERPIG5lZWQgdG8gbWF0Y2ggcGVyZmVjdGx5IGJlZm9yZSB3ZSBjYW4gdXNlIGEgY29tbWFuZCB0byBqb2luIHRoZW0gaW50byBvbmUgZmlsZQ0KDQpgYGB7cn0NCmNvbG5hbWVzKHlfMjAxMykNCmNvbG5hbWVzKHExXzJfMjAxNCkNCmNvbG5hbWVzKHEzXzIwMTQpDQpjb2xuYW1lcyhxNF8yMDE0KQ0KY29sbmFtZXMocTFfMjAxNSkNCmNvbG5hbWVzKHExXzIwMTYpDQpjb2xuYW1lcyhxMV8yMDE3KQ0KY29sbmFtZXMocTFfMjAxOCkNCmNvbG5hbWVzKHExXzIwMTkpDQpjb2xuYW1lcyhxMl8yMDE1KQ0KY29sbmFtZXMocTJfMjAxNikNCmNvbG5hbWVzKHEyXzIwMTcpDQpjb2xuYW1lcyhxMl8yMDE4KQ0KY29sbmFtZXMocTJfMjAxOSkNCmNvbG5hbWVzKHEzXzIwMTUpDQpjb2xuYW1lcyhxM18yMDE2KQ0KY29sbmFtZXMocTNfMjAxNykNCmNvbG5hbWVzKHEzXzIwMTgpDQpjb2xuYW1lcyhxM18yMDE5KQ0KY29sbmFtZXMocTRfMjAxNSkNCmNvbG5hbWVzKHE0XzIwMTYpDQpjb2xuYW1lcyhxNF8yMDE3KQ0KY29sbmFtZXMocTRfMjAxOCkNCmNvbG5hbWVzKHE0XzIwMTkpDQpjb2xuYW1lcyhxMV8yMDIwKQ0KY29sbmFtZXMocTFfMjAyMikNCmNvbG5hbWVzKHExXzIwMjMpDQpjb2xuYW1lcyhxMl8yMDIwKQ0KY29sbmFtZXMocTJfMjAyMikNCmNvbG5hbWVzKHEzXzIwMjApDQpjb2xuYW1lcyhxM18yMDIyKQ0KY29sbmFtZXMocTRfMjAyMCkNCmNvbG5hbWVzKHE0XzIwMjIpDQpjb2xuYW1lcyhxMV8yMDIxKQ0KY29sbmFtZXMocTJfMjAyMSkNCmNvbG5hbWVzKHEzXzIwMjEpDQpjb2xuYW1lcyhxNF8yMDIxKQ0KYGBgDQpSZW5hbWUgY29sdW1ucyAgdG8gbWFrZSB0aGVtIGNvbnNpc3RlbnQgd2l0aCBxMV8yMDIwIHRvIHExXzIwMjMgKGFzIHRoaXMgd2lsbCBiZSB0aGUgc3VwcG9zZWQgZ29pbmctZm9yd2FyZCB0YWJsZSBkZXNpZ24gZm9yIERpdnZ5KQ0KDQpgYGB7cn0NCiNSZW5hbWUgY29sdW1ucyAgdG8gbWFrZSB0aGVtIGNvbnNpc3RlbnQgd2l0aCBxMV8yMDIwIHRvIHExXzIwMjMgKGFzIHRoaXMgd2lsbCBiZSB0aGUgc3VwcG9zZWQgZ29pbmctZm9yd2FyZCB0YWJsZSBkZXNpZ24gZm9yIERpdnZ5KQ0KKHlfMjAxMyA8LSByZW5hbWUoeV8yMDEzDQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxlbmRlZF9hdCA9IHN0b3B0aW1lICANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9uYW1lID0gZnJvbV9zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25faWQgPSBmcm9tX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX25hbWUgPSB0b19zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX2lkID0gdG9fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9IHVzZXJ0eXBlKSkNCg0KKHExXzJfMjAxNCA8LSByZW5hbWUocTFfMl8yMDE0DQogICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydHRpbWUgIA0KICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gc3RvcHRpbWUgIA0KICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25faWQgPSBmcm9tX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9IHVzZXJ0eXBlKSkNCg0KKHEzXzIwMTQgPC0gcmVuYW1lKHEzXzIwMTQNCiAgICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0dGltZSAgDQogICAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBzdG9wdGltZSAgDQogICAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9uYW1lID0gZnJvbV9zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX2lkID0gdG9fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KKHE0XzIwMTQgPC0gcmVuYW1lKHE0XzIwMTQNCiAgICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICAscmlkZWFibGVfdHlwZSA9IGJpa2VpZCANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0dGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gc3RvcHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTFfMjAxNSA8LSByZW5hbWUocTFfMjAxNQ0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnR0aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBzdG9wdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoocTFfMjAxNiA8LSByZW5hbWUocTFfMjAxNg0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnR0aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBzdG9wdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxMV8yMDE3IDwtIHJlbmFtZShxMV8yMDE3DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBlbmRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxMV8yMDE4IDwtIHJlbmFtZShxMV8yMDE4DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBSZW50YWwgSUQiDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBCaWtlIElEIiANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9ICIwMSAtIFJlbnRhbCBEZXRhaWxzIExvY2FsIFN0YXJ0IFRpbWUiICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBMb2NhbCBFbmQgVGltZSIgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSAiMDMgLSBSZW50YWwgU3RhcnQgU3RhdGlvbiBOYW1lIiANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9ICIwMyAtIFJlbnRhbCBTdGFydCBTdGF0aW9uIElEIg0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gIjAyIC0gUmVudGFsIEVuZCBTdGF0aW9uIE5hbWUiIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9ICIwMiAtIFJlbnRhbCBFbmQgU3RhdGlvbiBJRCINCiAgICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9ICJVc2VyIFR5cGUiKSkNCg0KKHExXzIwMTkgPC0gcmVuYW1lKHExXzIwMTkNCiAgICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICAscmlkZWFibGVfdHlwZSA9IGJpa2VpZCANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0X3RpbWUgIA0KICAgICAgICAgICAgICAgICAgICxlbmRlZF9hdCA9IGVuZF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9uYW1lID0gZnJvbV9zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25faWQgPSBmcm9tX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX25hbWUgPSB0b19zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX2lkID0gdG9fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9IHVzZXJ0eXBlKSkNCg0KKHEyXzIwMTUgPC0gcmVuYW1lKHEyXzIwMTUNCiAgICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICAscmlkZWFibGVfdHlwZSA9IGJpa2VpZCANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0dGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gc3RvcHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTJfMjAxNiA8LSByZW5hbWUocTJfMjAxNg0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnR0aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBzdG9wdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxMl8yMDE3IDwtIHJlbmFtZShxMl8yMDE3DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBlbmRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxMl8yMDE4IDwtIHJlbmFtZShxMl8yMDE4DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBlbmRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxMl8yMDE5IDwtIHJlbmFtZShxMl8yMDE5DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBSZW50YWwgSUQiDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBCaWtlIElEIiANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9ICIwMSAtIFJlbnRhbCBEZXRhaWxzIExvY2FsIFN0YXJ0IFRpbWUiICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSAiMDEgLSBSZW50YWwgRGV0YWlscyBMb2NhbCBFbmQgVGltZSIgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSAiMDMgLSBSZW50YWwgU3RhcnQgU3RhdGlvbiBOYW1lIiANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9ICIwMyAtIFJlbnRhbCBTdGFydCBTdGF0aW9uIElEIg0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gIjAyIC0gUmVudGFsIEVuZCBTdGF0aW9uIE5hbWUiIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9ICIwMiAtIFJlbnRhbCBFbmQgU3RhdGlvbiBJRCINCiAgICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9ICJVc2VyIFR5cGUiKSkNCg0KKHEzXzIwMTUgPC0gcmVuYW1lKHEzXzIwMTUNCiAgICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICAscmlkZWFibGVfdHlwZSA9IGJpa2VpZCANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0dGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gc3RvcHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTNfMjAxNiA8LSByZW5hbWUocTNfMjAxNg0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnR0aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBzdG9wdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxM18yMDE3IDwtIHJlbmFtZShxM18yMDE3DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBlbmRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxM18yMDE4IDwtIHJlbmFtZShxM18yMDE4DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydF90aW1lICANCiAgICAgICAgICAgICAgICAgICAsZW5kZWRfYXQgPSBlbmRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25fbmFtZSA9IGZyb21fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX2lkID0gZnJvbV9zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9uYW1lID0gdG9fc3RhdGlvbl9uYW1lIA0KICAgICAgICAgICAgICAgICAgICxlbmRfc3RhdGlvbl9pZCA9IHRvX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLG1lbWJlcl9jYXN1YWwgPSB1c2VydHlwZSkpDQoNCihxNF8yMDE1IDwtIHJlbmFtZShxNF8yMDE1DQogICAgICAgICAgICAgICAgICAgLHJpZGVfaWQgPSB0cmlwX2lkDQogICAgICAgICAgICAgICAgICAgLHJpZGVhYmxlX3R5cGUgPSBiaWtlaWQgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0ZWRfYXQgPSBzdGFydHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxlbmRlZF9hdCA9IHN0b3B0aW1lICANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9uYW1lID0gZnJvbV9zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLHN0YXJ0X3N0YXRpb25faWQgPSBmcm9tX3N0YXRpb25faWQgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX25hbWUgPSB0b19zdGF0aW9uX25hbWUgDQogICAgICAgICAgICAgICAgICAgLGVuZF9zdGF0aW9uX2lkID0gdG9fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsbWVtYmVyX2Nhc3VhbCA9IHVzZXJ0eXBlKSkNCg0KKHE0XzIwMTYgPC0gcmVuYW1lKHE0XzIwMTYNCiAgICAgICAgICAgICAgICAgICAscmlkZV9pZCA9IHRyaXBfaWQNCiAgICAgICAgICAgICAgICAgICAscmlkZWFibGVfdHlwZSA9IGJpa2VpZCANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRlZF9hdCA9IHN0YXJ0dGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gc3RvcHRpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTRfMjAxNyA8LSByZW5hbWUocTRfMjAxNw0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gZW5kX3RpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTRfMjAxOCA8LSByZW5hbWUocTRfMjAxOA0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gZW5kX3RpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTRfMjAxOSA8LSByZW5hbWUocTRfMjAxOQ0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gZW5kX3RpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KDQoocTNfMjAxOSA8LSByZW5hbWUocTNfMjAxOQ0KICAgICAgICAgICAgICAgICAgICxyaWRlX2lkID0gdHJpcF9pZA0KICAgICAgICAgICAgICAgICAgICxyaWRlYWJsZV90eXBlID0gYmlrZWlkIA0KICAgICAgICAgICAgICAgICAgICxzdGFydGVkX2F0ID0gc3RhcnRfdGltZSAgDQogICAgICAgICAgICAgICAgICAgLGVuZGVkX2F0ID0gZW5kX3RpbWUgIA0KICAgICAgICAgICAgICAgICAgICxzdGFydF9zdGF0aW9uX25hbWUgPSBmcm9tX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsc3RhcnRfc3RhdGlvbl9pZCA9IGZyb21fc3RhdGlvbl9pZCANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25fbmFtZSA9IHRvX3N0YXRpb25fbmFtZSANCiAgICAgICAgICAgICAgICAgICAsZW5kX3N0YXRpb25faWQgPSB0b19zdGF0aW9uX2lkIA0KICAgICAgICAgICAgICAgICAgICxtZW1iZXJfY2FzdWFsID0gdXNlcnR5cGUpKQ0KYGBgDQoNCmBgYHtyfQ0KI0NoYW5nZSBEYXRhdHlwZSBvZiBjb2xtbiwgU28gdGhleSBzdGFjayBjb3JyZWN0bHkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAxOCA8LSBtdXRhdGUocTFfMjAxOCxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAxOCA8LSBtdXRhdGUocTFfMjAxOCxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMV8yMDE5IDwtIG11dGF0ZShxMV8yMDE5LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMV8yMDE5IDwtIG11dGF0ZShxMV8yMDE5LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnExXzIwMjAgPC0gbXV0YXRlKHExXzIwMjAscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnExXzIwMTYgPC0gbXV0YXRlKHExXzIwMTYsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnExXzIwMTYgPC0gbXV0YXRlKHExXzIwMTYsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAxNiA8LSBtdXRhdGUocTFfMjAxNixyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTFfMjAxNSA8LSBtdXRhdGUocTFfMjAxNSxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAxNSA8LSBtdXRhdGUocTFfMjAxNSxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMV8yMDE1IDwtIG11dGF0ZShxMV8yMDE1LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxMV8yXzIwMTQgPC0gbXV0YXRlKHExXzJfMjAxNCxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMl8yMDE0IDwtIG11dGF0ZShxMV8yXzIwMTQsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMl8yMDE0IDwtIG11dGF0ZShxMV8yXzIwMTQscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnlfMjAxMyA8LSBtdXRhdGUoeV8yMDEzLHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQp5XzIwMTMgPC0gbXV0YXRlKHlfMjAxMyxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQp5XzIwMTMgPC0gbXV0YXRlKHlfMjAxMyxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTFfMjAxOCA8LSBtdXRhdGUocTFfMjAxOCxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTFfMjAxOSA8LSBtdXRhdGUocTFfMjAxOSxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTFfMjAyMCA8LSBtdXRhdGUocTFfMjAyMCxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAyMCA8LSBtdXRhdGUocTFfMjAyMCxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMV8yXzIwMTQgPC0gbXV0YXRlKHExXzJfMjAxNCxyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KeV8yMDEzIDwtIG11dGF0ZSh5XzIwMTMscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMTUgPC0gbXV0YXRlKHExXzIwMTUscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMTYgPC0gbXV0YXRlKHExXzIwMTYscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMTggPC0gbXV0YXRlKHExXzIwMTgscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMTkgPC0gbXV0YXRlKHExXzIwMTkscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMjIgPC0gbXV0YXRlKHExXzIwMjIscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnExXzIwMjIgPC0gbXV0YXRlKHExXzIwMjIsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnExXzIwMjIgPC0gbXV0YXRlKHExXzIwMjIsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMl8yMDE0IDwtIG11dGF0ZShxMV8yXzIwMTQscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnEyXzIwMTUgPC0gbXV0YXRlKHEyXzIwMTUscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnEyXzIwMTUgPC0gbXV0YXRlKHEyXzIwMTUscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnEyXzIwMTUgPC0gbXV0YXRlKHEyXzIwMTUsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMTUgPC0gbXV0YXRlKHEyXzIwMTUsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfMjAxNiA8LSBtdXRhdGUocTJfMjAxNixyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTJfMjAxNiA8LSBtdXRhdGUocTJfMjAxNixyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KcTJfMjAxNiA8LSBtdXRhdGUocTJfMjAxNixzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfMjAxNiA8LSBtdXRhdGUocTJfMjAxNixlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl8yMDE3IDwtIG11dGF0ZShxMl8yMDE3LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxMl8yMDE3IDwtIG11dGF0ZShxMl8yMDE3LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxMl8yMDE3IDwtIG11dGF0ZShxMl8yMDE3LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl8yMDE3IDwtIG11dGF0ZShxMl8yMDE3LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMTggPC0gbXV0YXRlKHEyXzIwMTgscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnEyXzIwMTggPC0gbXV0YXRlKHEyXzIwMTgscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnEyXzIwMTggPC0gbXV0YXRlKHEyXzIwMTgsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMTggPC0gbXV0YXRlKHEyXzIwMTgsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfMjAxOSA8LSBtdXRhdGUocTJfMjAxOSxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTJfMjAxOSA8LSBtdXRhdGUocTJfMjAxOSxyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KcTJfMjAxOSA8LSBtdXRhdGUocTJfMjAxOSxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTJfMjAxOSA8LSBtdXRhdGUocTJfMjAxOSxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl8yMDE5IDwtIG11dGF0ZShxMl8yMDE5LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxMl8yMDE5IDwtIG11dGF0ZShxMl8yMDE5LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMjIgPC0gbXV0YXRlKHEyXzIwMjIsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEyXzIwMjIgPC0gbXV0YXRlKHEyXzIwMjIsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfMjAxNCA8LSBtdXRhdGUocTNfMjAxNCxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTNfMjAxNCA8LSBtdXRhdGUocTNfMjAxNCxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfMjAxNCA8LSBtdXRhdGUocTNfMjAxNCxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM18yMDE0IDwtIG11dGF0ZShxM18yMDE0LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxM18yMDE1IDwtIG11dGF0ZShxM18yMDE1LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxM18yMDE1IDwtIG11dGF0ZShxM18yMDE1LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxM18yMDE1IDwtIG11dGF0ZShxM18yMDE1LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM18yMDE1IDwtIG11dGF0ZShxM18yMDE1LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzIwMTYgPC0gbXV0YXRlKHEzXzIwMTYscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnEzXzIwMTYgPC0gbXV0YXRlKHEzXzIwMTYscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnEzXzIwMTYgPC0gbXV0YXRlKHEzXzIwMTYsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzIwMTYgPC0gbXV0YXRlKHEzXzIwMTYsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfMjAxNyA8LSBtdXRhdGUocTNfMjAxNyxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTNfMjAxNyA8LSBtdXRhdGUocTNfMjAxNyxyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KcTNfMjAxNyA8LSBtdXRhdGUocTNfMjAxNyxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTNfMjAxNyA8LSBtdXRhdGUocTNfMjAxNyxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM18yMDE4IDwtIG11dGF0ZShxM18yMDE4LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxM18yMDE4IDwtIG11dGF0ZShxM18yMDE4LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxM18yMDE4IDwtIG11dGF0ZShxM18yMDE4LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxM18yMDE4IDwtIG11dGF0ZShxM18yMDE4LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzIwMTkgPC0gbXV0YXRlKHEzXzIwMTkscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnEzXzIwMTkgPC0gbXV0YXRlKHEzXzIwMTkscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnEzXzIwMTkgPC0gbXV0YXRlKHEzXzIwMTksc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnEzXzIwMTkgPC0gbXV0YXRlKHEzXzIwMTksZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMjAxNCA8LSBtdXRhdGUocTRfMjAxNCxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTRfMjAxNCA8LSBtdXRhdGUocTRfMjAxNCxyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KcTRfMjAxNCA8LSBtdXRhdGUocTRfMjAxNCxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMjAxNCA8LSBtdXRhdGUocTRfMjAxNCxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDE1IDwtIG11dGF0ZShxNF8yMDE1LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxNF8yMDE1IDwtIG11dGF0ZShxNF8yMDE1LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxNF8yMDE1IDwtIG11dGF0ZShxNF8yMDE1LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDE1IDwtIG11dGF0ZShxNF8yMDE1LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMTYgPC0gbXV0YXRlKHE0XzIwMTYscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnE0XzIwMTYgPC0gbXV0YXRlKHE0XzIwMTYscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnE0XzIwMTYgPC0gbXV0YXRlKHE0XzIwMTYsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMTYgPC0gbXV0YXRlKHE0XzIwMTYsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMjAxNyA8LSBtdXRhdGUocTRfMjAxNyxyaWRlX2lkID0gYXMuY2hhcmFjdGVyKHJpZGVfaWQpKQ0KcTRfMjAxNyA8LSBtdXRhdGUocTRfMjAxNyxyaWRlYWJsZV90eXBlID0gYXMuY2hhcmFjdGVyKHJpZGVhYmxlX3R5cGUpKQ0KcTRfMjAxNyA8LSBtdXRhdGUocTRfMjAxNyxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTRfMjAxNyA8LSBtdXRhdGUocTRfMjAxNyxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDE4IDwtIG11dGF0ZShxNF8yMDE4LHJpZGVfaWQgPSBhcy5jaGFyYWN0ZXIocmlkZV9pZCkpDQpxNF8yMDE4IDwtIG11dGF0ZShxNF8yMDE4LHJpZGVhYmxlX3R5cGUgPSBhcy5jaGFyYWN0ZXIocmlkZWFibGVfdHlwZSkpDQpxNF8yMDE4IDwtIG11dGF0ZShxNF8yMDE4LHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDE4IDwtIG11dGF0ZShxNF8yMDE4LGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMTkgPC0gbXV0YXRlKHE0XzIwMTkscmlkZV9pZCA9IGFzLmNoYXJhY3RlcihyaWRlX2lkKSkNCnE0XzIwMTkgPC0gbXV0YXRlKHE0XzIwMTkscmlkZWFibGVfdHlwZSA9IGFzLmNoYXJhY3RlcihyaWRlYWJsZV90eXBlKSkNCnE0XzIwMTkgPC0gbXV0YXRlKHE0XzIwMTksc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMTkgPC0gbXV0YXRlKHE0XzIwMTksZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAyMyA8LSBtdXRhdGUocTFfMjAyMyxzdGFydGVkX2F0ID0gYXMuUE9TSVhjdChzdGFydGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KcTFfMjAyMyA8LSBtdXRhdGUocTFfMjAyMyxlbmRlZF9hdCA9IGFzLlBPU0lYY3QoZW5kZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDIxIDwtIG11dGF0ZShxNF8yMDIxLHN0YXJ0ZWRfYXQgPSBhcy5QT1NJWGN0KHN0YXJ0ZWRfYXQsIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiLCB0ej0iVVRDIikpDQpxNF8yMDIxIDwtIG11dGF0ZShxNF8yMDIxLGVuZGVkX2F0ID0gYXMuUE9TSVhjdChlbmRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMjIgPC0gbXV0YXRlKHE0XzIwMjIsc3RhcnRlZF9hdCA9IGFzLlBPU0lYY3Qoc3RhcnRlZF9hdCwgZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIsIHR6PSJVVEMiKSkNCnE0XzIwMjIgPC0gbXV0YXRlKHE0XzIwMjIsZW5kZWRfYXQgPSBhcy5QT1NJWGN0KGVuZGVkX2F0LCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIiwgdHo9IlVUQyIpKQ0KeV8yMDEzIDwtIG11dGF0ZSh5XzIwMTMsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KeV8yMDEzIDwtIG11dGF0ZSh5XzIwMTMsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnExXzJfMjAxNCA8LSBtdXRhdGUocTFfMl8yMDE0LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxMV8yXzIwMTQgPC0gbXV0YXRlKHExXzJfMjAxNCxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxM18yMDE0IDwtIG11dGF0ZShxM18yMDE0LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxM18yMDE0IDwtIG11dGF0ZShxM18yMDE0LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnE0XzIwMTQgPC0gbXV0YXRlKHE0XzIwMTQsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnE0XzIwMTQgPC0gbXV0YXRlKHE0XzIwMTQsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTFfMjAxNSA8LSBtdXRhdGUocTFfMjAxNSxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTFfMjAxNSA8LSBtdXRhdGUocTFfMjAxNSxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxMl8yMDE1IDwtIG11dGF0ZShxMl8yMDE1LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxMl8yMDE1IDwtIG11dGF0ZShxMl8yMDE1LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnEzXzIwMTUgPC0gbXV0YXRlKHEzXzIwMTUsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnEzXzIwMTUgPC0gbXV0YXRlKHEzXzIwMTUsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTRfMjAxNSA8LSBtdXRhdGUocTRfMjAxNSxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTRfMjAxNSA8LSBtdXRhdGUocTRfMjAxNSxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxMV8yMDE2IDwtIG11dGF0ZShxMV8yMDE2LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxMV8yMDE2IDwtIG11dGF0ZShxMV8yMDE2LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnEyXzIwMTYgPC0gbXV0YXRlKHEyXzIwMTYsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnEyXzIwMTYgPC0gbXV0YXRlKHEyXzIwMTYsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTNfMjAxNiA8LSBtdXRhdGUocTNfMjAxNixzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTNfMjAxNiA8LSBtdXRhdGUocTNfMjAxNixlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxNF8yMDE2IDwtIG11dGF0ZShxNF8yMDE2LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxNF8yMDE2IDwtIG11dGF0ZShxNF8yMDE2LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnExXzIwMTYgPC0gbXV0YXRlKHExXzIwMTYsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnExXzIwMTcgPC0gbXV0YXRlKHExXzIwMTcsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTJfMjAxNyA8LSBtdXRhdGUocTJfMjAxNyxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTJfMjAxNyA8LSBtdXRhdGUocTJfMjAxNyxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxM18yMDE3IDwtIG11dGF0ZShxM18yMDE3LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxM18yMDE3IDwtIG11dGF0ZShxM18yMDE3LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnE0XzIwMTcgPC0gbXV0YXRlKHE0XzIwMTcsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnE0XzIwMTcgPC0gbXV0YXRlKHE0XzIwMTcsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTFfMjAxOCA8LSBtdXRhdGUocTFfMjAxOCxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTFfMjAxOCA8LSBtdXRhdGUocTFfMjAxOCxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxMl8yMDE4IDwtIG11dGF0ZShxMl8yMDE4LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxMl8yMDE4IDwtIG11dGF0ZShxMl8yMDE4LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnEzXzIwMTggPC0gbXV0YXRlKHEzXzIwMTgsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnEzXzIwMTggPC0gbXV0YXRlKHEzXzIwMTgsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTRfMjAxOCA8LSBtdXRhdGUocTRfMjAxOCxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTRfMjAxOCA8LSBtdXRhdGUocTRfMjAxOCxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxMV8yMDE5IDwtIG11dGF0ZShxMV8yMDE5LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxMV8yMDE5IDwtIG11dGF0ZShxMV8yMDE5LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnEyXzIwMTkgPC0gbXV0YXRlKHEyXzIwMTksc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnEyXzIwMTkgPC0gbXV0YXRlKHEyXzIwMTksZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTNfMjAxOSA8LSBtdXRhdGUocTNfMjAxOSxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTNfMjAxOSA8LSBtdXRhdGUocTNfMjAxOSxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxNF8yMDE5IDwtIG11dGF0ZShxNF8yMDE5LHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxNF8yMDE5IDwtIG11dGF0ZShxNF8yMDE5LGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnExXzIwMjAgPC0gbXV0YXRlKHExXzIwMjAsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnExXzIwMjAgPC0gbXV0YXRlKHExXzIwMjAsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KcTJfMjAyMCA8LSBtdXRhdGUocTJfMjAyMCxzdGFydF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKHN0YXJ0X3N0YXRpb25faWQpKQ0KcTJfMjAyMCA8LSBtdXRhdGUocTJfMjAyMCxlbmRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihlbmRfc3RhdGlvbl9pZCkpDQpxM18yMDIwIDwtIG11dGF0ZShxM18yMDIwLHN0YXJ0X3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoc3RhcnRfc3RhdGlvbl9pZCkpDQpxM18yMDIwIDwtIG11dGF0ZShxM18yMDIwLGVuZF9zdGF0aW9uX2lkID0gYXMuY2hhcmFjdGVyKGVuZF9zdGF0aW9uX2lkKSkNCnE0XzIwMjAgPC0gbXV0YXRlKHE0XzIwMjAsc3RhcnRfc3RhdGlvbl9pZCA9IGFzLmNoYXJhY3RlcihzdGFydF9zdGF0aW9uX2lkKSkNCnE0XzIwMjAgPC0gbXV0YXRlKHE0XzIwMjAsZW5kX3N0YXRpb25faWQgPSBhcy5jaGFyYWN0ZXIoZW5kX3N0YXRpb25faWQpKQ0KYGBgDQogDQpgYGB7cn0NCiMgUmVtb3ZlIHVud2FudGVkIGNvbG1tZQ0KDQp5XzIwMTMgPC0geV8yMDEzICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aGRheSwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnExXzJfMjAxNCA8LSBxMV8yXzIwMTQgJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnEzXzIwMTQgPC0gcTNfMjAxNCAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTRfMjAxNCA8LSBxNF8yMDE0ICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aHllYXIsIGdlbmRlciwgInRyaXBkdXJhdGlvbiIpKQ0KDQpxMV8yMDE1IDwtIHExXzIwMTUgJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnEyXzIwMTUgPC0gcTJfMjAxNSAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTNfMjAxNSA8LSBxM18yMDE1ICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aHllYXIsIGdlbmRlciwgInRyaXBkdXJhdGlvbiIpKQ0KDQpxNF8yMDE1IDwtIHE0XzIwMTUgJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnExXzIwMTYgPC0gcTFfMjAxNiAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTJfMjAxNiA8LSBxMl8yMDE2ICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aHllYXIsIGdlbmRlciwgInRyaXBkdXJhdGlvbiIpKQ0KDQpxM18yMDE2IDwtIHEzXzIwMTYgJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnE0XzIwMTYgPC0gcTRfMjAxNiAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTFfMjAxNyA8LSBxMV8yMDE3ICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aHllYXIsIGdlbmRlciwgInRyaXBkdXJhdGlvbiIpKQ0KDQpxMl8yMDE3IDwtIHEyXzIwMTcgJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnEzXzIwMTcgPC0gcTNfMjAxNyAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTRfMjAxNyA8LSBxNF8yMDE3ICU+JSAgDQogIHNlbGVjdCgtYyhiaXJ0aHllYXIsIGdlbmRlciwgInRyaXBkdXJhdGlvbiIpKQ0KDQpxMV8yMDE4IDwtIHExXzIwMTggJT4lICANCiAgc2VsZWN0KC1jKCIwMSAtIFJlbnRhbCBEZXRhaWxzIER1cmF0aW9uIEluIFNlY29uZHMgVW5jYXBwZWQiLCAiMDUgLSBNZW1iZXIgRGV0YWlscyBNZW1iZXIgQmlydGhkYXkgWWVhciIsICJNZW1iZXIgR2VuZGVyIikpDQpxMl8yMDE4IDwtIHEyXzIwMTggJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQpxM18yMDE4IDwtIHEzXzIwMTggJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQpxNF8yMDE4IDwtIHE0XzIwMTggJT4lICANCiAgc2VsZWN0KC1jKGJpcnRoeWVhciwgZ2VuZGVyLCAidHJpcGR1cmF0aW9uIikpDQoNCnExXzIwMTkgPC0gcTFfMjAxOSAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCnEyXzIwMTkgPC0gcTJfMjAxOSAlPiUgIA0KICBzZWxlY3QoLWMoIjAxIC0gUmVudGFsIERldGFpbHMgRHVyYXRpb24gSW4gU2Vjb25kcyBVbmNhcHBlZCIsICIwNSAtIE1lbWJlciBEZXRhaWxzIE1lbWJlciBCaXJ0aGRheSBZZWFyIiwgIk1lbWJlciBHZW5kZXIiKSkNCnEzXzIwMTkgPC0gcTNfMjAxOSAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCnE0XzIwMTkgPC0gcTRfMjAxOSAlPiUgIA0KICBzZWxlY3QoLWMoYmlydGh5ZWFyLCBnZW5kZXIsICJ0cmlwZHVyYXRpb24iKSkNCg0KcTFfMjAyMCA8LSBxMV8yMDIwICU+JSAgDQogIHNlbGVjdCgtYyhzdGFydF9sYXQsIHN0YXJ0X2xuZywgZW5kX2xhdCwgZW5kX2xuZykpDQpxMl8yMDIwIDwtIHEyXzIwMjAgJT4lICANCiAgc2VsZWN0KC1jKHN0YXJ0X2xhdCwgc3RhcnRfbG5nLCBlbmRfbGF0LCBlbmRfbG5nKSkNCnEzXzIwMjAgPC0gcTNfMjAyMCAlPiUgIA0KICBzZWxlY3QoLWMoc3RhcnRfbGF0LCBzdGFydF9sbmcsIGVuZF9sYXQsIGVuZF9sbmcpKQ0KcTRfMjAyMCA8LSBxNF8yMDIwICU+JSAgDQogIHNlbGVjdCgtYyhzdGFydF9sYXQsIHN0YXJ0X2xuZywgZW5kX2xhdCwgZW5kX2xuZykpDQoNCnExXzIwMjEgPC0gcTFfMjAyMSAlPiUgIA0KICBzZWxlY3QoLWMoc3RhcnRfbGF0LCBzdGFydF9sbmcsIGVuZF9sYXQsIGVuZF9sbmcpKQ0KcTJfMjAyMSA8LSBxMl8yMDIxICU+JSAgDQogIHNlbGVjdCgtYyhzdGFydF9sYXQsIHN0YXJ0X2xuZywgZW5kX2xhdCwgZW5kX2xuZykpDQpxM18yMDIxIDwtIHEzXzIwMjEgJT4lICANCiAgc2VsZWN0KC1jKHN0YXJ0X2xhdCwgc3RhcnRfbG5nLCBlbmRfbGF0LCBlbmRfbG5nKSkNCnE0XzIwMjEgPC0gcTRfMjAyMSAlPiUgIA0KICBzZWxlY3QoLWMoc3RhcnRfbGF0LCBzdGFydF9sbmcsIGVuZF9sYXQsIGVuZF9sbmcpKQ0KDQpxMV8yMDIyIDwtIHExXzIwMjIgJT4lICANCiAgc2VsZWN0KC1jKHN0YXJ0X2xhdCwgc3RhcnRfbG5nLCBlbmRfbGF0LCBlbmRfbG5nKSkNCnEyXzIwMjIgPC0gcTJfMjAyMiAlPiUgIA0KICBzZWxlY3QoLWMoc3RhcnRfbGF0LCBzdGFydF9sbmcsIGVuZF9sYXQsIGVuZF9sbmcpKQ0KcTNfMjAyMiA8LSBxM18yMDIyICU+JSAgDQogIHNlbGVjdCgtYyhzdGFydF9sYXQsIHN0YXJ0X2xuZywgZW5kX2xhdCwgZW5kX2xuZykpDQpxNF8yMDIyIDwtIHE0XzIwMjIgJT4lICANCiAgc2VsZWN0KC1jKHN0YXJ0X2xhdCwgc3RhcnRfbG5nLCBlbmRfbGF0LCBlbmRfbG5nKSkNCg0KcTFfMjAyMyA8LSBxMV8yMDIzICU+JSAgDQogIHNlbGVjdCgtYyhzdGFydF9sYXQsIHN0YXJ0X2xuZywgZW5kX2xhdCwgZW5kX2xuZykpDQpgYGANCiANCk1ha2UgQmlnIERhdGFzZXQNCg0KYGBge3J9DQojIyMjIFN0YWNrIGluZGl2aWR1YWwgcXVhcnRlcidzIGRhdGEgZnJhbWVzIGludG8gb25lIGJpZyBkYXRhIGZyYW1lDQphbGxfdHJpcHMgPC0gYmluZF9yb3dzKHlfMjAxMyxxMV8yXzIwMTQscTFfMjAxNSxxMV8yMDE2LHExXzIwMTcscTFfMjAxOCxxMV8yMDE5LHExXzIwMjAscTFfMjAyMSxxMV8yMDIyLHExXzIwMjMscTJfMjAxNSxxMl8yMDE2LHEyXzIwMTcscTJfMjAxOCxxMl8yMDE5LHEyXzIwMjAscTJfMjAyMSxxMl8yMDIyLHEzXzIwMTQscTNfMjAxNSxxM18yMDE2LHEzXzIwMTcscTNfMjAxOCxxM18yMDE5LHEzXzIwMjAscTNfMjAyMSxxM18yMDIyLHE0XzIwMTQscTRfMjAxNSxxNF8yMDE2LHE0XzIwMTcscTRfMjAxOCxxNF8yMDE5LHE0XzIwMjAscTRfMjAyMSxxNF8yMDIyKQ0KYGBgDQoNCg0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBTVEVQIDM6IENMRUFOIFVQIEFORCBBREQgREFUQSBUTyBQUkVQQVJFIEZPUiBBTkFMWVNJUw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojUFJPQ0VTUw0KDQpDbGVhbmluZyBhbmQgcHJlcGFyaW5nIGRhdGEgZm9yIGFuYWx5c2lzDQoNCktleSB0YXNrcw0KDQogICAgQ2hlY2sgdGhlIGRhdGEgZm9yIGVycm9ycy4NCiAgICBDaG9vc2UgeW91ciB0b29scy4NCiAgICBUcmFuc2Zvcm0gdGhlIGRhdGEgc28geW91IGNhbiB3b3JrIHdpdGggaXQgZWZmZWN0aXZlbHkuDQogICAgRG9jdW1lbnQgdGhlIGNsZWFuaW5nIHByb2Nlc3MuDQoNCiBEZWxpdmVyYWJsZQ0KIA0KIEZvbGxvd2luZyBjb2RlIGNodW5rcyB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgcGhhc2UuDQogDQpgYGB7cn0NCiMgSW5zcGVjdCB0aGUgbmV3IHRhYmxlIHRoYXQgaGFzIGJlZW4gY3JlYXRlZA0KY29sbmFtZXMoYWxsX3RyaXBzKSAgI0xpc3Qgb2YgY29sdW1uIG5hbWVzDQpucm93KGFsbF90cmlwcykgICNIb3cgbWFueSByb3dzIGFyZSBpbiBkYXRhIGZyYW1lPw0KZGltKGFsbF90cmlwcykgICNEaW1lbnNpb25zIG9mIHRoZSBkYXRhIGZyYW1lPw0KaGVhZChhbGxfdHJpcHMpICAjU2VlIHRoZSBmaXJzdCA2IHJvd3Mgb2YgZGF0YSBmcmFtZS4gIEFsc28gdGFpbChhbGxfdHJpcHMpDQpzdHIoYWxsX3RyaXBzKSAgI1NlZSBsaXN0IG9mIGNvbHVtbnMgYW5kIGRhdGEgdHlwZXMgKG51bWVyaWMsIGNoYXJhY3RlciwgZXRjKQ0Kc3VtbWFyeShhbGxfdHJpcHMpICAjU3RhdGlzdGljYWwgc3VtbWFyeSBvZiBkYXRhLiBNYWlubHkgZm9yIG51bWVyaWNzDQoNCmBgYA0KIA0KIyBSZW1vdmUgYmlhcyB3aGljaCBhcmUgbnVsbCB2YWx1ZXMNCg0KYGBge3J9DQppcy5uYShhbGxfdHJpcHMpDQphbGxfdHJpcHMgPC0gbmEub21pdChhbGxfdHJpcHMpDQpgYGANCg0KIyBUaGVyZSBhcmUgYSBmZXcgcHJvYmxlbXMgd2Ugd2lsbCBuZWVkIHRvIGZpeDoNCiMgKDEpIEluIHRoZSAibWVtYmVyX2Nhc3VhbCIgY29sdW1uLCB0aGVyZSBhcmUgdHdvIG5hbWVzIGZvciBtZW1iZXJzICgibWVtYmVyIiBhbmQgIlN1YnNjcmliZXIiKSBhbmQgdHdvIG5hbWVzIGZvciBjYXN1YWwgcmlkZXJzICgiQ3VzdG9tZXIiIGFuZCAiY2FzdWFsIikuIFdlIHdpbGwgbmVlZCB0byBjb25zb2xpZGF0ZSB0aGF0IGZyb20gZm91ciB0byB0d28gbGFiZWxzLg0KIyAoMikgVGhlIGRhdGEgY2FuIG9ubHkgYmUgYWdncmVnYXRlZCBhdCB0aGUgcmlkZS1sZXZlbCwgd2hpY2ggaXMgdG9vIGdyYW51bGFyLiBXZSB3aWxsIHdhbnQgdG8gYWRkIHNvbWUgYWRkaXRpb25hbCBjb2x1bW5zIG9mIGRhdGEgLS0gc3VjaCBhcyBkYXksIG1vbnRoLCB5ZWFyIC0tIHRoYXQgcHJvdmlkZSBhZGRpdGlvbmFsIG9wcG9ydHVuaXRpZXMgdG8gYWdncmVnYXRlIHRoZSBkYXRhLg0KIyAoMykgV2Ugd2lsbCB3YW50IHRvIGFkZCBhIGNhbGN1bGF0ZWQgZmllbGQgZm9yIGxlbmd0aCBvZiByaWRlIHNpbmNlIHRoZSAyMDIwUTEgZGF0YSBkaWQgbm90IGhhdmUgdGhlICJ0cmlwZHVyYXRpb24iIGNvbHVtbi4gV2Ugd2lsbCBhZGQgInJpZGVfbGVuZ3RoIiB0byB0aGUgZW50aXJlIGRhdGFmcmFtZSBmb3IgY29uc2lzdGVuY3kuDQojICg0KSBUaGVyZSBhcmUgc29tZSByaWRlcyB3aGVyZSB0cmlwZHVyYXRpb24gc2hvd3MgdXAgYXMgbmVnYXRpdmUsIGluY2x1ZGluZyBzZXZlcmFsIGh1bmRyZWQgcmlkZXMgd2hlcmUgRGl2dnkgdG9vayBiaWtlcyBvdXQgb2YgY2lyY3VsYXRpb24gZm9yIFF1YWxpdHkgQ29udHJvbCByZWFzb25zLiBXZSB3aWxsIHdhbnQgdG8gZGVsZXRlIHRoZXNlIHJpZGVzLg0KDQojIEluIHRoZSAibWVtYmVyX2Nhc3VhbCIgY29sdW1uLCByZXBsYWNlICJTdWJzY3JpYmVyIiB3aXRoICJtZW1iZXIiIGFuZCAiQ3VzdG9tZXIiIHdpdGggImNhc3VhbCINCiMgQmVmb3JlIDIwMjAsIERpdnZ5IHVzZWQgZGlmZmVyZW50IGxhYmVscyBmb3IgdGhlc2UgdHdvIHR5cGVzIG9mIHJpZGVycyAuLi4gd2Ugd2lsbCB3YW50IHRvIG1ha2Ugb3VyIGRhdGFmcmFtZSBjb25zaXN0ZW50IHdpdGggdGhlaXIgY3VycmVudCBub21lbmNsYXR1cmUNCiMgTi5CLjogIkxldmVsIiBpcyBhIHNwZWNpYWwgcHJvcGVydHkgb2YgYSBjb2x1bW4gdGhhdCBpcyByZXRhaW5lZCBldmVuIGlmIGEgc3Vic2V0IGRvZXMgbm90IGNvbnRhaW4gYW55IHZhbHVlcyBmcm9tIGEgc3BlY2lmaWMgbGV2ZWwNCiMgQmVnaW4gYnkgc2VlaW5nIGhvdyBtYW55IG9ic2VydmF0aW9ucyBmYWxsIHVuZGVyIGVhY2ggdXNlcnR5cGUNCg0KYGBge3J9DQp0YWJsZShhbGxfdHJpcHMkbWVtYmVyX2Nhc3VhbCkNCmBgYA0KDQpgYGB7cn0NCiMgUmVhc3NpZ24gdG8gdGhlIGRlc2lyZWQgdmFsdWVzDQphbGxfdHJpcHMgPC0gIGFsbF90cmlwcyAlPiUgDQogIG11dGF0ZShtZW1iZXJfY2FzdWFsID0gcmVjb2RlKG1lbWJlcl9jYXN1YWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCJTdWJzY3JpYmVyIiA9ICJtZW1iZXIiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwiQ3VzdG9tZXIiID0gImNhc3VhbCIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHByb3BlciBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIHdlcmUgcmVhc3NpZ25lZA0KdGFibGUoYWxsX3RyaXBzJG1lbWJlcl9jYXN1YWwpDQpgYGANCiMgQWRkIGNvbHVtbnMgdGhhdCBsaXN0IHRoZSBkYXRlLCBtb250aCwgZGF5LCBhbmQgeWVhciBvZiBlYWNoIHJpZGUNCiMgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFnZ3JlZ2F0ZSByaWRlIGRhdGEgZm9yIGVhY2ggbW9udGgsIGRheSwgb3IgeWVhciAuLi4gYmVmb3JlIGNvbXBsZXRpbmcgdGhlc2Ugb3BlcmF0aW9ucyB3ZSBjb3VsZCBvbmx5IGFnZ3JlZ2F0ZSBhdCB0aGUgcmlkZSBsZXZlbA0KIyBodHRwczovL3d3dy5zdGF0bWV0aG9kcy5uZXQvaW5wdXQvZGF0ZXMuaHRtbCBtb3JlIG9uIGRhdGUgZm9ybWF0cyBpbiBSIGZvdW5kIGF0IHRoYXQgbGluaw0KDQpgYGB7cn0NCmFsbF90cmlwcyRkYXRlIDwtIGFzLkRhdGUoYWxsX3RyaXBzJHN0YXJ0ZWRfYXQpICNUaGUgZGVmYXVsdCBmb3JtYXQgaXMgeXl5eS1tbS1kZA0KYWxsX3RyaXBzJG1vbnRoIDwtIGZvcm1hdChhcy5EYXRlKGFsbF90cmlwcyRkYXRlKSwgIiVtIikNCmFsbF90cmlwcyRkYXkgPC0gZm9ybWF0KGFzLkRhdGUoYWxsX3RyaXBzJGRhdGUpLCAiJWQiKQ0KYWxsX3RyaXBzJHllYXIgPC0gZm9ybWF0KGFzLkRhdGUoYWxsX3RyaXBzJGRhdGUpLCAiJVkiKQ0KYWxsX3RyaXBzJGRheV9vZl93ZWVrIDwtIGZvcm1hdChhcy5EYXRlKGFsbF90cmlwcyRkYXRlKSwgIiVBIikNCmBgYA0KDQojIEFkZCBhICJyaWRlX2xlbmd0aCIgY2FsY3VsYXRpb24gdG8gYWxsX3RyaXBzIChpbiBzZWNvbmRzKQ0KIyBodHRwczovL3N0YXQuZXRoei5jaC9SLW1hbnVhbC9SLWRldmVsL2xpYnJhcnkvYmFzZS9odG1sL2RpZmZ0aW1lLmh0bWwNCg0KYGBge3J9DQphbGxfdHJpcHMkcmlkZV9sZW5ndGggPC0gZGlmZnRpbWUoYWxsX3RyaXBzJGVuZGVkX2F0LGFsbF90cmlwcyRzdGFydGVkX2F0KQ0KYGBgDQoNCiMgSW5zcGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2x1bW5zDQoNCmBgYHtyfQ0Kc3RyKGFsbF90cmlwcykNCmBgYA0KDQojIENvbnZlcnQgInJpZGVfbGVuZ3RoIiBmcm9tIEZhY3RvciB0byBudW1lcmljIHNvIHdlIGNhbiBydW4gY2FsY3VsYXRpb25zIG9uIHRoZSBkYXRhDQoNCmBgYHtyfQ0KaXMuZmFjdG9yKGFsbF90cmlwcyRyaWRlX2xlbmd0aCkNCmFsbF90cmlwcyRyaWRlX2xlbmd0aCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihhbGxfdHJpcHMkcmlkZV9sZW5ndGgpKQ0KaXMubnVtZXJpYyhhbGxfdHJpcHMkcmlkZV9sZW5ndGgpDQpgYGANCg0KIyBSZW1vdmUgImJhZCIgZGF0YQ0KIyBUaGUgZGF0YWZyYW1lIGluY2x1ZGVzIGEgZmV3IGh1bmRyZWQgZW50cmllcyB3aGVuIGJpa2VzIHdlcmUgdGFrZW4gb3V0IG9mIGRvY2tzIGFuZCBjaGVja2VkIGZvciBxdWFsaXR5IGJ5IERpdnZ5IG9yIHJpZGVfbGVuZ3RoIHdhcyBuZWdhdGl2ZQ0KIyBXZSB3aWxsIGNyZWF0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBkYXRhZnJhbWUgKHYyKSBzaW5jZSBkYXRhIGlzIGJlaW5nIHJlbW92ZWQNCiMgaHR0cHM6Ly93d3cuZGF0YXNjaWVuY2VtYWRlc2ltcGxlLmNvbS9kZWxldGUtb3ItZHJvcC1yb3dzLWluLXItd2l0aC1jb25kaXRpb25zLTINCg0KYGBge3J9DQphbGxfdHJpcHNfdjIgPC0gYWxsX3RyaXBzWyEoYWxsX3RyaXBzJHN0YXJ0X3N0YXRpb25fbmFtZSA9PSAiSFEgUVIiIHwgYWxsX3RyaXBzJHJpZGVfbGVuZ3RoPDApLF0NCmBgYA0KDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBTVEVQIDQ6IENPTkRVQ1QgREVTQ1JJUFRJVkUgQU5BTFlTSVMNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmBgYHtyfQ0KIyBEZXNjcmlwdGl2ZSBhbmFseXNpcyBvbiByaWRlX2xlbmd0aCAoYWxsIGZpZ3VyZXMgaW4gc2Vjb25kcykNCm1lYW4oYWxsX3RyaXBzX3YyJHJpZGVfbGVuZ3RoKSAjc3RyYWlnaHQgYXZlcmFnZSAodG90YWwgcmlkZSBsZW5ndGggLyByaWRlcykNCm1lZGlhbihhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGgpICNtaWRwb2ludCBudW1iZXIgaW4gdGhlIGFzY2VuZGluZyBhcnJheSBvZiByaWRlIGxlbmd0aHMNCm1heChhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGgpICNsb25nZXN0IHJpZGUNCm1pbihhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGgpICNzaG9ydGVzdCByaWRlDQpgYGANCmBgYHtyfQ0KIyBZb3UgY2FuIGNvbmRlbnNlIHRoZSBmb3VyIGxpbmVzIGFib3ZlIHRvIG9uZSBsaW5lIHVzaW5nIHN1bW1hcnkoKSBvbiB0aGUgc3BlY2lmaWMgYXR0cmlidXRlDQpzdW1tYXJ5KGFsbF90cmlwc192MiRyaWRlX2xlbmd0aCkNCg0KYGBgDQpgYGB7cn0NCiMgQ29tcGFyZSBtZW1iZXJzIGFuZCBjYXN1YWwgdXNlcnMNCmFnZ3JlZ2F0ZShhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGggfiBhbGxfdHJpcHNfdjIkbWVtYmVyX2Nhc3VhbCwgRlVOID0gbWVhbikNCmFnZ3JlZ2F0ZShhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGggfiBhbGxfdHJpcHNfdjIkbWVtYmVyX2Nhc3VhbCwgRlVOID0gbWVkaWFuKQ0KYWdncmVnYXRlKGFsbF90cmlwc192MiRyaWRlX2xlbmd0aCB+IGFsbF90cmlwc192MiRtZW1iZXJfY2FzdWFsLCBGVU4gPSBtYXgpDQphZ2dyZWdhdGUoYWxsX3RyaXBzX3YyJHJpZGVfbGVuZ3RoIH4gYWxsX3RyaXBzX3YyJG1lbWJlcl9jYXN1YWwsIEZVTiA9IG1pbikNCmBgYA0KYGBge3J9DQojIFNlZSB0aGUgYXZlcmFnZSByaWRlIHRpbWUgYnkgZWFjaCBkYXkgZm9yIG1lbWJlcnMgdnMgY2FzdWFsIHVzZXJzDQphZ2dyZWdhdGUoYWxsX3RyaXBzX3YyJHJpZGVfbGVuZ3RoIH4gYWxsX3RyaXBzX3YyJG1lbWJlcl9jYXN1YWwgKyBhbGxfdHJpcHNfdjIkZGF5X29mX3dlZWssIEZVTiA9IG1lYW4pDQpgYGANCmBgYHtyfQ0KIyBOb3RpY2UgdGhhdCB0aGUgZGF5cyBvZiB0aGUgd2VlayBhcmUgb3V0IG9mIG9yZGVyLiBMZXQncyBmaXggdGhhdC4NCmFsbF90cmlwc192MiRkYXlfb2Zfd2VlayA8LSBvcmRlcmVkKGFsbF90cmlwc192MiRkYXlfb2Zfd2VlaywgbGV2ZWxzPWMoIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IikpDQpgYGANCg0KYGBge3J9DQojIE5vdywgbGV0J3MgcnVuIHRoZSBhdmVyYWdlIHJpZGUgdGltZSBieSBlYWNoIGRheSBmb3IgbWVtYmVycyB2cyBjYXN1YWwgdXNlcnMNCmFnZ3JlZ2F0ZShhbGxfdHJpcHNfdjIkcmlkZV9sZW5ndGggfiBhbGxfdHJpcHNfdjIkbWVtYmVyX2Nhc3VhbCArIGFsbF90cmlwc192MiRkYXlfb2Zfd2VlaywgRlVOID0gbWVhbikNCmBgYA0KDQpgYGB7cn0NCiMgYW5hbHl6ZSByaWRlcnNoaXAgZGF0YSBieSB0eXBlIGFuZCB3ZWVrZGF5DQphbGxfdHJpcHNfdjIgJT4lIA0KICBtdXRhdGUod2Vla2RheSA9IHdkYXkoc3RhcnRlZF9hdCwgbGFiZWwgPSBUUlVFKSkgJT4lICAjY3JlYXRlcyB3ZWVrZGF5IGZpZWxkIHVzaW5nIHdkYXkoKQ0KICBncm91cF9ieShtZW1iZXJfY2FzdWFsLCB3ZWVrZGF5KSAlPiUgICNncm91cHMgYnkgdXNlcnR5cGUgYW5kIHdlZWtkYXkNCiAgc3VtbWFyaXNlKG51bWJlcl9vZl9yaWRlcyA9IG4oKQkJCQkJCQkjY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHJpZGVzIGFuZCBhdmVyYWdlIGR1cmF0aW9uIA0KICAgICAgICAgICAgLGF2ZXJhZ2VfZHVyYXRpb24gPSBtZWFuKHJpZGVfbGVuZ3RoKSkgJT4lIAkJIyBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIGR1cmF0aW9uDQogIGFycmFuZ2UobWVtYmVyX2Nhc3VhbCwgd2Vla2RheSkJCQkJCQkJCSMgc29ydHMNCmBgYA0KDQojTm93IFRpbWVzIHRvIFZpc3VhbGl6ZSB0aGUgZGF0YQ0KDQpgYGB7cn0NCiMgTGV0J3MgdmlzdWFsaXplIHRoZSBudW1iZXIgb2YgcmlkZXMgYnkgcmlkZXIgdHlwZQ0KYWxsX3RyaXBzX3YyICU+JSANCiAgbXV0YXRlKHdlZWtkYXkgPSB3ZGF5KHN0YXJ0ZWRfYXQsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkobWVtYmVyX2Nhc3VhbCwgd2Vla2RheSkgJT4lIA0KICBzdW1tYXJpc2UobnVtYmVyX29mX3JpZGVzID0gbigpDQogICAgICAgICAgICAsYXZlcmFnZV9kdXJhdGlvbiA9IG1lYW4ocmlkZV9sZW5ndGgpKSAlPiUgDQogIGFycmFuZ2UobWVtYmVyX2Nhc3VhbCwgd2Vla2RheSkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gd2Vla2RheSwgeSA9IG51bWJlcl9vZl9yaWRlcywgZmlsbCA9IG1lbWJlcl9jYXN1YWwpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikNCmBgYA0KDQpgYGB7cn0NCiMgTGV0J3MgY3JlYXRlIGEgdmlzdWFsaXphdGlvbiBmb3IgYXZlcmFnZSBkdXJhdGlvbg0KYWxsX3RyaXBzX3YyICU+JSANCiAgbXV0YXRlKHdlZWtkYXkgPSB3ZGF5KHN0YXJ0ZWRfYXQsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkobWVtYmVyX2Nhc3VhbCwgd2Vla2RheSkgJT4lIA0KICBzdW1tYXJpc2UobnVtYmVyX29mX3JpZGVzID0gbigpDQogICAgICAgICAgICAsYXZlcmFnZV9kdXJhdGlvbiA9IG1lYW4ocmlkZV9sZW5ndGgpKSAlPiUgDQogIGFycmFuZ2UobWVtYmVyX2Nhc3VhbCwgd2Vla2RheSkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gd2Vla2RheSwgeSA9IGF2ZXJhZ2VfZHVyYXRpb24sIGZpbGwgPSBtZW1iZXJfY2FzdWFsKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpDQpgYGANCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFNURVAgNTogRVhQT1JUIFNVTU1BUlkgRklMRSBGT1IgRlVSVEhFUiBBTkFMWVNJUw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KYGBge3J9DQojIENyZWF0ZSBhIGNzdiBmaWxlIHRoYXQgd2Ugd2lsbCB2aXN1YWxpemUgaW4gRXhjZWwsIFRhYmxlYXUsIG9yIG15IHByZXNlbnRhdGlvbiBzb2Z0d2FyZQ0KIyBOLkIuOiBUaGlzIGZpbGUgbG9jYXRpb24gaXMgZm9yIGEgTWFjLiBJZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBQQywgY2hhbmdlIHRoZSBmaWxlIGxvY2F0aW9uIGFjY29yZGluZ2x5IChtb3N0IGxpa2VseSAiQzpcVXNlcnNcWU9VUl9VU0VSTkFNRVxEZXNrdG9wXC4uLiIpIHRvIGV4cG9ydCB0aGUgZGF0YS4gWW91IGNhbiByZWFkIG1vcmUgaGVyZTogaHR0cHM6Ly9kYXRhdG9maXNoLmNvbS9leHBvcnQtZGF0YWZyYW1lLXRvLWNzdi1pbi1yLw0KDQpjb3VudHMgPC0gYWdncmVnYXRlKGFsbF90cmlwc192MiRyaWRlX2xlbmd0aCB+IGFsbF90cmlwc192MiRtZW1iZXJfY2FzdWFsICsgYWxsX3RyaXBzX3YyJGRheV9vZl93ZWVrLCBGVU4gPSBtZWFuKQ0Kd3JpdGUuY3N2KGNvdW50cywgZmlsZSA9ICdEOi9Qcm9qZWN0L1Byb2plY3QgMS9maW5hbC9hdmdfcmlkZV9sZW5ndGguY3N2JykNCmBgYA0KDQojQUNUDQoNClRoaXMgcGhhc2Ugd2lsbCBiZSBjYXJyaWVkIG91dCBieSB0aGUgZXhlY3V0aXZlIHRlYW0sIERpcmVjdG9yIG9mIE1hcmtldGluZyAoTGlseSBNb3Jlbm8pIGFuZCB0aGUgTWFya2V0aW5nIEFuYWx5dGljcyB0ZWFtIGJhc2VkIG9uIG15IGFuYWx5c2lzLg0KQ29uY2x1c2lvbg0KDQogICAgQ2FzdWFsIHJpZGVycyBnbyBmYXJ0aGVyIGluIHRlcm1zIG9mIGRpc3RhbmNlLg0KICAgIENhc3VhbCByaWRlcnMgdHJhdmVsIGZvciBhIGxvbmdlciB0aW1lIHBlcmlvZC4NCiAgICBNZW1iZXJzIHJpZGUgbGVzcyBvbiB0aGUgd2Vla2VuZCBjb21wYXJlZCB0byBjYXN1YWwgcmlkZXJzLg0KDQpEZWxpdmVyYWJsZQ0KDQogICAgWW91ciB0b3AgdGhyZWUgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHlvdXIgYW5hbHlzaXMNCg0KICAgIEhhdmUgYSBzbGFzaCBzYWxlIG9yIHByb21vIGZvciBjYXN1YWwgcmlkZXJzIHNvIHRoZXkgY2FuIGFjcXVpcmUgbW9yZSBiaWtlcyBhbmQgaW5kdWxnZSB0aGVtIGluIHRoZSBiZW5lZml0cyBvZiBiZWluZyBhIG1lbWJlci4NCiAgICBFbmNvdXJhZ2UgbWVtYmVyIHJpZGVycyB0byByaWRlIG9uIHdlZWtlbmRzIGJ5IGdpdmluZyB0aGVtIHZhcmlvdXMgY291cG9ucyBvciBleHRlbmRpbmcgdGhlaXIgbWVtYmVyc2hpcCBieSBhIHBlcmlvZCBvZiB0aW1lLg0KICAgIEhvc3QgZnVuIGJpa2luZyBjb21wZXRpdGlvbnMgd2l0aCBwcml6ZXMgYXQgaW50ZXJ2YWxzIGZvciBtZW1iZXJzIG9uIHRoZSB3ZWVrZW5kcy4gU2luY2UgdGhlcmUgYXJlIGxvdCBvZiBjYXN1YWwgcmlkZXJzIG9uIHdlZWtlbmRzLHRoaXMgd2lsbCBhbHNvIGF0dHJhY3QgdGhlbSB0byBnZXQgYSBtZW1iZXJzaGlwLg0KDQo=