Introduction

The Federal Reserve’s mandate from Congress is to control inflation and to maintain low unemployment. These seem to be contradictory objectives. For this story you will need to source the following data for the last 25 years;

The Consumer Price Index (CPI) (Bureau of Labor Statistics)

The FED Funds Rate (FRED) (Federal Reserve Board)

Unemployment Rate (Bureau of Labor Statistics)

Your Data Visualizations should be designed to answer the question “Has the FED been able to fulfill the mandate given to it by Congress?”

For Story#2, I obtained the data for Unemployment Rate (Bureau of Labor Statistics) from the https://www.bls.gov/data/#unemployment website, Consumer Price Index (CPI) (Bureau of Labor Statistics) from the https://www.bls.gov/cpi/data.htm website and downloaded the series data from this link: https://download.bls.gov/pub/time.series/cu/ which incorporates all items. Lastly, I downloaded the FED Funds Rate (FRED) (Federal Reserve Board) data from this website: https://fred.stlouisfed.org/series/FEDFUNDS

Load R packages

library(tidyverse)
library(openintro)
library(ggplot2)
library(dplyr)

Retrieve URL of the raw dataset from GitHub & Load the CSV dataset into a data frame

url_one <- "https://raw.githubusercontent.com/pujaroy280/DATA608Story2/main/cu.data.1.AllItems.txt"
cpi_data <- read.csv(url_one, sep = "\t")
url_two <- "https://raw.githubusercontent.com/pujaroy280/DATA608Story2/main/la.data.1.CurrentS.txt"
bls_data <- read.csv(url_two, sep = "\t")
url_three <- "https://raw.githubusercontent.com/pujaroy280/DATA608Story2/main/FEDFUNDS.csv"
fed_data <- read.csv(url_three) 

Clean & Preprocess Data for Data Analysis + Visualization

Initially, working with the CPI and BLS data were messy so I had to transform the data by removing columns that did not contain useful information. I filtered the data to observe trends over the last 25 years.

# Filter the data to cover the last 25 years
cpi_data <- cpi_data %>%
  filter(year >= max(year) - 25)

# Remove the 'period' column
cpi_data <- cpi_data %>%
  select(-period)

# Remove the 'footnote_codes' column
cpi_data <- cpi_data %>%
  select(-footnote_codes)

# View the cleaned data
head(cpi_data)
##           series_id year value
## 1 CUSR0000SA0       1999 164.7
## 2 CUSR0000SA0       1999 164.7
## 3 CUSR0000SA0       1999 164.8
## 4 CUSR0000SA0       1999 165.9
## 5 CUSR0000SA0       1999 166.0
## 6 CUSR0000SA0       1999 166.0

Consumer Price Index (CPI) over the last 25 Years

# Remove duplicate values for the same years
cpi_data <- cpi_data %>%
  distinct(year, .keep_all = TRUE)

# Plotting
ggplot(cpi_data, aes(x = year, y = value)) +
  geom_line() +
  labs(x = "Year", y = "CPI Value", title = "Consumer Price Index (CPI) Over the Last 25 Years") + geom_point()

Over the past 25 years, Consumer Price Index (CPI) have increased. This includes all items including but not limited to US food beverage, housing, apparel, transportation, medical, education, goods & services etc.

# Filter the data to cover the last 25 years
bls_data <- bls_data %>%
  filter(year >= max(year) - 25)

# Remove the 'period' column
bls_data <- bls_data %>%
  select(-period)

# Remove the 'footnote_codes' column
bls_data <- bls_data %>%
  select(-footnote_codes)

# View the cleaned data
head(bls_data)
##                        series_id year        value
## 1 LASBS060000000000003           1998          5.9
## 2 LASBS060000000000003           1998          5.8
## 3 LASBS060000000000003           1998          5.8
## 4 LASBS060000000000003           1998          5.8
## 5 LASBS060000000000003           1998          5.7
## 6 LASBS060000000000003           1998          5.7

Unemployment Rate over the last 25 Years

# Remove duplicate values for the same years
bls_data <- bls_data %>%
  distinct(year, .keep_all = TRUE)
# Store bls_data into a new variable to print values in desc order
bls_data_sorted <- bls_data %>%
  arrange(desc(value))

# Print the sorted year and value columns
print(bls_data_sorted[, c("year", "value")])
##    year        value
## 1  2010         12.6
## 2  2011         12.2
## 3  2012         11.0
## 4  2009          9.7
## 5  2013          9.4
## 6  2014          8.0
## 7  2021          8.0
## 8  2003          6.9
## 9  2002          6.5
## 10 2004          6.5
## 11 2015          6.5
## 12 1998          5.9
## 13 2008          5.9
## 14 2005          5.7
## 15 2016          5.7
## 16 1999          5.4
## 17 2017          5.3
## 18 2006          5.0
## 19 2007          5.0
## 20 2022          4.8
## 21 2000          4.7
## 22 2001          4.7
## 23 2018          4.3
## 24 2019          4.2
## 25 2020          4.0
## 26 2023          4.0
# Plotting with blue color
ggplot(bls_data, aes(x = year, y = value)) +
  geom_line(color = "blue") +
  geom_point(color = "blue") +
  labs(x = "Year", y = "Unemployment Rate", title = "Unemployment Rate Over the Last 25 Years")

Over the past 25 years, unemployment rates significantly impacted 2010 which led to a recession. From 2020-2023, unemployment rates were stable and low. Similarly, from 2000-2001, 2005-2016, 2014-2021, unemployment rates were stable.

# Convert the 'DATE' column to Date format
fed_data$DATE <- as.Date(fed_data$DATE)

# Extract the year from the 'DATE' column
fed_data$year <- year(fed_data$DATE)

# Extract the last 25 years of data
last_25_years <- fed_data %>%
  filter(year >= (year(Sys.Date()) - 25))

# Remove duplicate years
last_25_years <- last_25_years %>%
  distinct(year, .keep_all = TRUE)

# Remove duplicate values for the same years
last_25_years<- last_25_years %>%
  distinct(year, .keep_all = TRUE)

# View the last 25 years of data of FedFunds Data
head(last_25_years)
##         DATE FEDFUNDS year
## 1 1999-01-01     4.63 1999
## 2 2000-01-01     5.45 2000
## 3 2001-01-01     5.98 2001
## 4 2002-01-01     1.73 2002
## 5 2003-01-01     1.24 2003
## 6 2004-01-01     1.00 2004
# Store last_25_years  into a new variable to print values in desc order
fed_data_sorted <- last_25_years %>%
  arrange(desc(FEDFUNDS))

# Print the sorted year and FEDFUNDS columns
print(fed_data_sorted[, c("year", "FEDFUNDS")])
##    year FEDFUNDS
## 1  2001     5.98
## 2  2000     5.45
## 3  2024     5.33
## 4  2007     5.25
## 5  1999     4.63
## 6  2023     4.33
## 7  2006     4.29
## 8  2008     3.94
## 9  2019     2.40
## 10 2005     2.28
## 11 2002     1.73
## 12 2020     1.55
## 13 2018     1.41
## 14 2003     1.24
## 15 2004     1.00
## 16 2017     0.65
## 17 2016     0.34
## 18 2011     0.17
## 19 2009     0.15
## 20 2013     0.14
## 21 2010     0.11
## 22 2015     0.11
## 23 2021     0.09
## 24 2012     0.08
## 25 2022     0.08
## 26 2014     0.07

Federal Funds Rate over the last 25 Years

# Plotting
ggplot(last_25_years, aes(x = year, y = FEDFUNDS)) +
  geom_line(color="darkgreen") +
  geom_point(color="darkgreen") +
  labs(x = "Year", y = "Federal Funds Rate", title = "Federal Funds Rate Over the Last 25 Years")

Over the past 25 years, Federal Fund rates have increased and decreased steadily. 2001 was the year in which Federal Fund rates increased by 5.98% and was the highest. Currently(2024), Federal Fund rates increased at a rate of 5.45%. The lowest Federal Fund rate was at a rate of 0.07% in 2014.

Has the FED been able to fulfill the mandate given to it by Congress?

The FED has not been able to fulfill the mandate given to it by Congress since CPI rates have been increasing over the past 25 years. However, unemployment rates have been decreasing since 2011 and has remained stable since the pandemic. Based on the visualizations, it seems that there are chances of unemployment rates to increase since mass layoffs have been occurring at various and notable companies including Google, Microsoft, Meta (formerly Facebook) and Amazon. Most importantly, FED fund rates have been increasing due to high rates of inflation and low unemployment rates. There is a negative correlation between unemployment, federal fund and CPI rates because when unemployment rates are low, there are higher chances of an increase in consumer expenses. For this reason, inflation will eventually exceed which can raise interest rates.

Conclusion

Throughout this Story#2, I learned about insights/trends of CPI, unemployment and Fed Fund rates. I conducted research on various economic and financial terms to assist my knowledge in providing alternate details to support my Story#2. While I delved deeper in examining the data sets from the government sources, I learned that identical values for a certain year can tarnish the presentation of the data visualization and analysis. For this assignment, I was initially planning to the fetch the data by using the APIs, but had to change the structure since the request was not allowing me to successfully fetch the data sets through the API.

LS0tDQp0aXRsZTogIkRBVEEgNjA4OiBTdG9yeSMyOiBDYW4gdGhlIEZFRCBDb250cm9sIEluZmxhdGlvbiBhbmQgTWFpbnRhaW4gRnVsbCBFbXBsb3ltZW50Ig0KYXV0aG9yOiAiUHVqYSBSb3kiDQpkYXRlOiAiMjAyNC0wMi0xOCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KIyMjIEludHJvZHVjdGlvbg0KDQpUaGUgRmVkZXJhbCBSZXNlcnZlJ3MgbWFuZGF0ZSBmcm9tIENvbmdyZXNzIGlzIHRvIGNvbnRyb2wgaW5mbGF0aW9uIGFuZCB0byBtYWludGFpbiBsb3cgdW5lbXBsb3ltZW50LiBUaGVzZSBzZWVtIHRvIGJlIGNvbnRyYWRpY3Rvcnkgb2JqZWN0aXZlcy4NCkZvciB0aGlzIHN0b3J5IHlvdSB3aWxsIG5lZWQgdG8gc291cmNlIHRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgdGhlIGxhc3QgMjUgeWVhcnM7DQoNClRoZSBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSAoQnVyZWF1IG9mIExhYm9yIFN0YXRpc3RpY3MpDQoNClRoZSBGRUQgRnVuZHMgUmF0ZSAoRlJFRCkgKEZlZGVyYWwgUmVzZXJ2ZSBCb2FyZCkNCg0KVW5lbXBsb3ltZW50IFJhdGUgIChCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcykNCg0KWW91ciBEYXRhIFZpc3VhbGl6YXRpb25zIHNob3VsZCBiZSBkZXNpZ25lZCB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uICJIYXMgdGhlIEZFRCBiZWVuIGFibGUgdG8gZnVsZmlsbCB0aGUgbWFuZGF0ZSBnaXZlbiB0byBpdCBieSBDb25ncmVzcz8iDQoNCkZvciBTdG9yeSMyLCBJIG9idGFpbmVkIHRoZSBkYXRhIGZvciBVbmVtcGxveW1lbnQgUmF0ZSAgKEJ1cmVhdSBvZiBMYWJvciBTdGF0aXN0aWNzKSBmcm9tIHRoZSBodHRwczovL3d3dy5ibHMuZ292L2RhdGEvI3VuZW1wbG95bWVudCB3ZWJzaXRlLCBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSAoQnVyZWF1IG9mIExhYm9yIFN0YXRpc3RpY3MpIGZyb20gdGhlIGh0dHBzOi8vd3d3LmJscy5nb3YvY3BpL2RhdGEuaHRtIHdlYnNpdGUgYW5kIGRvd25sb2FkZWQgdGhlIHNlcmllcyBkYXRhIGZyb20gdGhpcyBsaW5rOiBodHRwczovL2Rvd25sb2FkLmJscy5nb3YvcHViL3RpbWUuc2VyaWVzL2N1LyB3aGljaCBpbmNvcnBvcmF0ZXMgYWxsIGl0ZW1zLiBMYXN0bHksIEkgZG93bmxvYWRlZCB0aGUgRkVEIEZ1bmRzIFJhdGUgKEZSRUQpIChGZWRlcmFsIFJlc2VydmUgQm9hcmQpIGRhdGEgZnJvbSB0aGlzIHdlYnNpdGU6IGh0dHBzOi8vZnJlZC5zdGxvdWlzZmVkLm9yZy9zZXJpZXMvRkVERlVORFMgDQoNCg0KIyMjIExvYWQgUiBwYWNrYWdlcw0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCiMjIyBSZXRyaWV2ZSBVUkwgb2YgdGhlIHJhdyBkYXRhc2V0IGZyb20gR2l0SHViICYgTG9hZCB0aGUgQ1NWIGRhdGFzZXQgaW50byBhIGRhdGEgZnJhbWUNCg0KYGBge3J9DQp1cmxfb25lIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHVqYXJveTI4MC9EQVRBNjA4U3RvcnkyL21haW4vY3UuZGF0YS4xLkFsbEl0ZW1zLnR4dCINCmNwaV9kYXRhIDwtIHJlYWQuY3N2KHVybF9vbmUsIHNlcCA9ICJcdCIpDQoNCmBgYA0KDQpgYGB7cn0NCnVybF90d28gPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wdWphcm95MjgwL0RBVEE2MDhTdG9yeTIvbWFpbi9sYS5kYXRhLjEuQ3VycmVudFMudHh0Ig0KYmxzX2RhdGEgPC0gcmVhZC5jc3YodXJsX3R3bywgc2VwID0gIlx0IikNCmBgYA0KDQpgYGB7cn0NCnVybF90aHJlZSA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3B1amFyb3kyODAvREFUQTYwOFN0b3J5Mi9tYWluL0ZFREZVTkRTLmNzdiINCmZlZF9kYXRhIDwtIHJlYWQuY3N2KHVybF90aHJlZSkgDQpgYGANCg0KIyMjIENsZWFuICYgUHJlcHJvY2VzcyBEYXRhIGZvciBEYXRhIEFuYWx5c2lzICsgVmlzdWFsaXphdGlvbg0KSW5pdGlhbGx5LCB3b3JraW5nIHdpdGggdGhlIENQSSBhbmQgQkxTIGRhdGEgd2VyZSBtZXNzeSBzbyBJIGhhZCB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgY29sdW1ucyB0aGF0IGRpZCBub3QgY29udGFpbiB1c2VmdWwgaW5mb3JtYXRpb24uIEkgZmlsdGVyZWQgdGhlIGRhdGEgdG8gb2JzZXJ2ZSB0cmVuZHMgb3ZlciB0aGUgbGFzdCAyNSB5ZWFycy4NCg0KYGBge3J9DQojIEZpbHRlciB0aGUgZGF0YSB0byBjb3ZlciB0aGUgbGFzdCAyNSB5ZWFycw0KY3BpX2RhdGEgPC0gY3BpX2RhdGEgJT4lDQogIGZpbHRlcih5ZWFyID49IG1heCh5ZWFyKSAtIDI1KQ0KDQojIFJlbW92ZSB0aGUgJ3BlcmlvZCcgY29sdW1uDQpjcGlfZGF0YSA8LSBjcGlfZGF0YSAlPiUNCiAgc2VsZWN0KC1wZXJpb2QpDQoNCiMgUmVtb3ZlIHRoZSAnZm9vdG5vdGVfY29kZXMnIGNvbHVtbg0KY3BpX2RhdGEgPC0gY3BpX2RhdGEgJT4lDQogIHNlbGVjdCgtZm9vdG5vdGVfY29kZXMpDQoNCiMgVmlldyB0aGUgY2xlYW5lZCBkYXRhDQpoZWFkKGNwaV9kYXRhKQ0KYGBgDQojIyMgQ29uc3VtZXIgUHJpY2UgSW5kZXggKENQSSkgb3ZlciB0aGUgbGFzdCAyNSBZZWFycw0KDQpgYGB7cn0NCiMgUmVtb3ZlIGR1cGxpY2F0ZSB2YWx1ZXMgZm9yIHRoZSBzYW1lIHllYXJzDQpjcGlfZGF0YSA8LSBjcGlfZGF0YSAlPiUNCiAgZGlzdGluY3QoeWVhciwgLmtlZXBfYWxsID0gVFJVRSkNCg0KIyBQbG90dGluZw0KZ2dwbG90KGNwaV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHggPSAiWWVhciIsIHkgPSAiQ1BJIFZhbHVlIiwgdGl0bGUgPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKENQSSkgT3ZlciB0aGUgTGFzdCAyNSBZZWFycyIpICsgZ2VvbV9wb2ludCgpDQoNCmBgYA0KDQpPdmVyIHRoZSBwYXN0IDI1IHllYXJzLCBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSBoYXZlIGluY3JlYXNlZC4gVGhpcyBpbmNsdWRlcyBhbGwgaXRlbXMgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBVUyBmb29kIGJldmVyYWdlLCBob3VzaW5nLCBhcHBhcmVsLCB0cmFuc3BvcnRhdGlvbiwgbWVkaWNhbCwgZWR1Y2F0aW9uLCBnb29kcyAmIHNlcnZpY2VzIGV0Yy4NCg0KYGBge3J9DQojIEZpbHRlciB0aGUgZGF0YSB0byBjb3ZlciB0aGUgbGFzdCAyNSB5ZWFycw0KYmxzX2RhdGEgPC0gYmxzX2RhdGEgJT4lDQogIGZpbHRlcih5ZWFyID49IG1heCh5ZWFyKSAtIDI1KQ0KDQojIFJlbW92ZSB0aGUgJ3BlcmlvZCcgY29sdW1uDQpibHNfZGF0YSA8LSBibHNfZGF0YSAlPiUNCiAgc2VsZWN0KC1wZXJpb2QpDQoNCiMgUmVtb3ZlIHRoZSAnZm9vdG5vdGVfY29kZXMnIGNvbHVtbg0KYmxzX2RhdGEgPC0gYmxzX2RhdGEgJT4lDQogIHNlbGVjdCgtZm9vdG5vdGVfY29kZXMpDQoNCiMgVmlldyB0aGUgY2xlYW5lZCBkYXRhDQpoZWFkKGJsc19kYXRhKQ0KYGBgDQojIyMgVW5lbXBsb3ltZW50IFJhdGUgb3ZlciB0aGUgbGFzdCAyNSBZZWFycw0KYGBge3J9DQojIFJlbW92ZSBkdXBsaWNhdGUgdmFsdWVzIGZvciB0aGUgc2FtZSB5ZWFycw0KYmxzX2RhdGEgPC0gYmxzX2RhdGEgJT4lDQogIGRpc3RpbmN0KHllYXIsIC5rZWVwX2FsbCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQojIFN0b3JlIGJsc19kYXRhIGludG8gYSBuZXcgdmFyaWFibGUgdG8gcHJpbnQgdmFsdWVzIGluIGRlc2Mgb3JkZXINCmJsc19kYXRhX3NvcnRlZCA8LSBibHNfZGF0YSAlPiUNCiAgYXJyYW5nZShkZXNjKHZhbHVlKSkNCg0KIyBQcmludCB0aGUgc29ydGVkIHllYXIgYW5kIHZhbHVlIGNvbHVtbnMNCnByaW50KGJsc19kYXRhX3NvcnRlZFssIGMoInllYXIiLCAidmFsdWUiKV0pDQpgYGANCg0KYGBge3J9DQojIFBsb3R0aW5nIHdpdGggYmx1ZSBjb2xvcg0KZ2dwbG90KGJsc19kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlVuZW1wbG95bWVudCBSYXRlIiwgdGl0bGUgPSAiVW5lbXBsb3ltZW50IFJhdGUgT3ZlciB0aGUgTGFzdCAyNSBZZWFycyIpDQoNCmBgYA0KDQpPdmVyIHRoZSBwYXN0IDI1IHllYXJzLCB1bmVtcGxveW1lbnQgcmF0ZXMgc2lnbmlmaWNhbnRseSBpbXBhY3RlZCAyMDEwIHdoaWNoIGxlZCB0byBhIHJlY2Vzc2lvbi4gRnJvbSAyMDIwLTIwMjMsIHVuZW1wbG95bWVudCByYXRlcyB3ZXJlIHN0YWJsZSBhbmQgbG93LiBTaW1pbGFybHksIGZyb20gMjAwMC0yMDAxLCAyMDA1LTIwMTYsIDIwMTQtMjAyMSwgdW5lbXBsb3ltZW50IHJhdGVzIHdlcmUgc3RhYmxlLg0KDQpgYGB7cn0NCiMgQ29udmVydCB0aGUgJ0RBVEUnIGNvbHVtbiB0byBEYXRlIGZvcm1hdA0KZmVkX2RhdGEkREFURSA8LSBhcy5EYXRlKGZlZF9kYXRhJERBVEUpDQoNCiMgRXh0cmFjdCB0aGUgeWVhciBmcm9tIHRoZSAnREFURScgY29sdW1uDQpmZWRfZGF0YSR5ZWFyIDwtIHllYXIoZmVkX2RhdGEkREFURSkNCg0KIyBFeHRyYWN0IHRoZSBsYXN0IDI1IHllYXJzIG9mIGRhdGENCmxhc3RfMjVfeWVhcnMgPC0gZmVkX2RhdGEgJT4lDQogIGZpbHRlcih5ZWFyID49ICh5ZWFyKFN5cy5EYXRlKCkpIC0gMjUpKQ0KDQojIFJlbW92ZSBkdXBsaWNhdGUgeWVhcnMNCmxhc3RfMjVfeWVhcnMgPC0gbGFzdF8yNV95ZWFycyAlPiUNCiAgZGlzdGluY3QoeWVhciwgLmtlZXBfYWxsID0gVFJVRSkNCg0KIyBSZW1vdmUgZHVwbGljYXRlIHZhbHVlcyBmb3IgdGhlIHNhbWUgeWVhcnMNCmxhc3RfMjVfeWVhcnM8LSBsYXN0XzI1X3llYXJzICU+JQ0KICBkaXN0aW5jdCh5ZWFyLCAua2VlcF9hbGwgPSBUUlVFKQ0KDQojIFZpZXcgdGhlIGxhc3QgMjUgeWVhcnMgb2YgZGF0YSBvZiBGZWRGdW5kcyBEYXRhDQpoZWFkKGxhc3RfMjVfeWVhcnMpDQpgYGANCmBgYHtyfQ0KIyBTdG9yZSBsYXN0XzI1X3llYXJzICBpbnRvIGEgbmV3IHZhcmlhYmxlIHRvIHByaW50IHZhbHVlcyBpbiBkZXNjIG9yZGVyDQpmZWRfZGF0YV9zb3J0ZWQgPC0gbGFzdF8yNV95ZWFycyAlPiUNCiAgYXJyYW5nZShkZXNjKEZFREZVTkRTKSkNCg0KIyBQcmludCB0aGUgc29ydGVkIHllYXIgYW5kIEZFREZVTkRTIGNvbHVtbnMNCnByaW50KGZlZF9kYXRhX3NvcnRlZFssIGMoInllYXIiLCAiRkVERlVORFMiKV0pDQpgYGANCg0KIyMjIEZlZGVyYWwgRnVuZHMgUmF0ZSBvdmVyIHRoZSBsYXN0IDI1IFllYXJzDQpgYGB7cn0NCiMgUGxvdHRpbmcNCmdncGxvdChsYXN0XzI1X3llYXJzLCBhZXMoeCA9IHllYXIsIHkgPSBGRURGVU5EUykpICsNCiAgZ2VvbV9saW5lKGNvbG9yPSJkYXJrZ3JlZW4iKSArDQogIGdlb21fcG9pbnQoY29sb3I9ImRhcmtncmVlbiIpICsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIkZlZGVyYWwgRnVuZHMgUmF0ZSIsIHRpdGxlID0gIkZlZGVyYWwgRnVuZHMgUmF0ZSBPdmVyIHRoZSBMYXN0IDI1IFllYXJzIikNCmBgYA0KDQpPdmVyIHRoZSBwYXN0IDI1IHllYXJzLCBGZWRlcmFsIEZ1bmQgcmF0ZXMgaGF2ZSBpbmNyZWFzZWQgYW5kIGRlY3JlYXNlZCBzdGVhZGlseS4gMjAwMSB3YXMgdGhlIHllYXIgaW4gd2hpY2ggRmVkZXJhbCBGdW5kIHJhdGVzIGluY3JlYXNlZCBieSA1Ljk4JSBhbmQgd2FzIHRoZSBoaWdoZXN0LiBDdXJyZW50bHkoMjAyNCksIEZlZGVyYWwgRnVuZCByYXRlcyBpbmNyZWFzZWQgYXQgYSByYXRlIG9mIDUuNDUlLiBUaGUgbG93ZXN0IEZlZGVyYWwgRnVuZCByYXRlIHdhcyBhdCBhIHJhdGUgb2YgMC4wNyUgaW4gMjAxNC4gDQoNCiMjIyBIYXMgdGhlIEZFRCBiZWVuIGFibGUgdG8gZnVsZmlsbCB0aGUgbWFuZGF0ZSBnaXZlbiB0byBpdCBieSBDb25ncmVzcz8NCg0KVGhlIEZFRCBoYXMgbm90IGJlZW4gYWJsZSB0byBmdWxmaWxsIHRoZSBtYW5kYXRlIGdpdmVuIHRvIGl0IGJ5IENvbmdyZXNzIHNpbmNlIENQSSByYXRlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBvdmVyIHRoZSBwYXN0IDI1IHllYXJzLiBIb3dldmVyLCB1bmVtcGxveW1lbnQgcmF0ZXMgaGF2ZSBiZWVuIGRlY3JlYXNpbmcgc2luY2UgMjAxMSBhbmQgaGFzIHJlbWFpbmVkIHN0YWJsZSBzaW5jZSB0aGUgcGFuZGVtaWMuIEJhc2VkIG9uIHRoZSB2aXN1YWxpemF0aW9ucywgaXQgc2VlbXMgdGhhdCB0aGVyZSBhcmUgY2hhbmNlcyBvZiB1bmVtcGxveW1lbnQgcmF0ZXMgdG8gaW5jcmVhc2Ugc2luY2UgbWFzcyBsYXlvZmZzIGhhdmUgYmVlbiBvY2N1cnJpbmcgYXQgdmFyaW91cyBhbmQgbm90YWJsZSBjb21wYW5pZXMgaW5jbHVkaW5nIEdvb2dsZSwgTWljcm9zb2Z0LCBNZXRhIChmb3JtZXJseSBGYWNlYm9vaykgYW5kIEFtYXpvbi4gTW9zdCBpbXBvcnRhbnRseSwgRkVEIGZ1bmQgcmF0ZXMgaGF2ZSBiZWVuIGluY3JlYXNpbmcgZHVlIHRvIGhpZ2ggcmF0ZXMgb2YgaW5mbGF0aW9uIGFuZCBsb3cgdW5lbXBsb3ltZW50IHJhdGVzLiBUaGVyZSBpcyBhIG5lZ2F0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gdW5lbXBsb3ltZW50LCBmZWRlcmFsIGZ1bmQgYW5kIENQSSByYXRlcyBiZWNhdXNlIHdoZW4gdW5lbXBsb3ltZW50IHJhdGVzIGFyZSBsb3csIHRoZXJlIGFyZSBoaWdoZXIgY2hhbmNlcyBvZiBhbiBpbmNyZWFzZSBpbiBjb25zdW1lciBleHBlbnNlcy4gRm9yIHRoaXMgcmVhc29uLCBpbmZsYXRpb24gd2lsbCBldmVudHVhbGx5IGV4Y2VlZCB3aGljaCBjYW4gcmFpc2UgaW50ZXJlc3QgcmF0ZXMuDQoNCiMjIyBDb25jbHVzaW9uDQoNClRocm91Z2hvdXQgdGhpcyBTdG9yeSMyLCBJIGxlYXJuZWQgYWJvdXQgaW5zaWdodHMvdHJlbmRzIG9mIENQSSwgdW5lbXBsb3ltZW50IGFuZCBGZWQgRnVuZCByYXRlcy4gSSBjb25kdWN0ZWQgcmVzZWFyY2ggb24gdmFyaW91cyBlY29ub21pYyBhbmQgZmluYW5jaWFsIHRlcm1zIHRvIGFzc2lzdCBteSBrbm93bGVkZ2UgaW4gcHJvdmlkaW5nIGFsdGVybmF0ZSBkZXRhaWxzIHRvIHN1cHBvcnQgbXkgU3RvcnkjMi4gV2hpbGUgSSBkZWx2ZWQgZGVlcGVyIGluIGV4YW1pbmluZyB0aGUgZGF0YSBzZXRzIGZyb20gdGhlIGdvdmVybm1lbnQgc291cmNlcywgSSBsZWFybmVkIHRoYXQgaWRlbnRpY2FsIHZhbHVlcyBmb3IgYSBjZXJ0YWluIHllYXIgY2FuIHRhcm5pc2ggdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSB2aXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcy4gRm9yIHRoaXMgYXNzaWdubWVudCwgSSB3YXMgaW5pdGlhbGx5IHBsYW5uaW5nIHRvIHRoZSBmZXRjaCB0aGUgZGF0YSBieSB1c2luZyB0aGUgQVBJcywgYnV0IGhhZCB0byBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBzaW5jZSB0aGUgcmVxdWVzdCB3YXMgbm90IGFsbG93aW5nIG1lIHRvIHN1Y2Nlc3NmdWxseSBmZXRjaCB0aGUgZGF0YSBzZXRzIHRocm91Z2ggdGhlIEFQSS4=