Historic data indicates that the occurrence and intensity of cyclonic storms (Hurricanes, Typhoons and Tornados) increases with the increased earth temperature. For this assignment you will need to tell this story to a non-technical audience (eg: a high-school earth science class).

Notes:

Source historic data for a period of at least 25 years on a measure of the earth’s temperature.

Source data on the occurrence and intensity of hurricanes, typhoons and tornados for the same historic period.

Perform the data analysis to establish the correlations between earth temperature and storm occurrence and intensity.

Tell the story of this data and your analysis using data visualizations and other illustrations (eg: pictures of storm damage) in a presentation that will be accessible to a high-school earth science class.

library(tidyverse)
library(openintro)

Loading data

Loading tornados.

#Loading data from CSV file
readLines("C:\\Users\\aleja\\Downloads\\data (1).csv", n = 5)
## [1] "Date,Tornadoes,Fatalities" "1998,1428,130"            
## [3] "1999,1342,94"              "2000,1073,41"             
## [5] "2001,1212,37"
data <- read.csv("C:\\Users\\aleja\\Downloads\\data (1).csv")

#View the first few rows of the dataset
head(data)
##   Date Tornadoes Fatalities
## 1 1998      1428        130
## 2 1999      1342         94
## 3 2000      1073         41
## 4 2001      1212         37
## 5 2002       934         55
## 6 2003      1385         54
#View the structure of the dataset
str(data)
## 'data.frame':    27 obs. of  3 variables:
##  $ Date      : int  1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 ...
##  $ Tornadoes : int  1428 1342 1073 1212 934 1385 1813 1262 1106 1100 ...
##  $ Fatalities: int  130 94 41 37 55 54 35 38 67 81 ...
#Converting 'Date' column to character
data$Date <- as.character(data$Date)

#Extracting year from 'Date' column
data$Year <- substr(data$Date, 1, 4)

#Converting 'Year' column back to integer (if needed)
data$Year <- as.integer(data$Year)

#Removing the original 'Date' column 
data <- data[, -which(names(data) == "Date")]

#Viewing the first few rows of the updated dataset
head(data)
##   Tornadoes Fatalities Year
## 1      1428        130 1998
## 2      1342         94 1999
## 3      1073         41 2000
## 4      1212         37 2001
## 5       934         55 2002
## 6      1385         54 2003
#Converting 'Tornadoes' column to numeric
data$Tornadoes <- as.numeric(data$Tornadoes)

#Aggregating the tornado counts by year and calculate the sum
tornado_sum <- aggregate(Tornadoes ~ Year, data = data, sum)

#Printing the resulting data frame
print(tornado_sum)
##    Year Tornadoes
## 1  1998      1428
## 2  1999      1342
## 3  2000      1073
## 4  2001      1212
## 5  2002       934
## 6  2003      1385
## 7  2004      1813
## 8  2005      1262
## 9  2006      1106
## 10 2007      1100
## 11 2008      1692
## 12 2009      1146
## 13 2010      1282
## 14 2011      1691
## 15 2012       938
## 16 2013       906
## 17 2014       886
## 18 2015      1177
## 19 2016       976
## 20 2017      1429
## 21 2018      1126
## 22 2019      1517
## 23 2020      1082
## 24 2021      1314
## 25 2022      1143
## 26 2023      1294
## 27 2024        97
#Converting 'Tornadoes' column to numeric
data$Tornadoes <- as.numeric(data$Tornadoes)

#Aggregating the tornado counts by year and calculate the sum
tornado_sum <- aggregate(Tornadoes ~ Year, data = data, sum)

#Merging the aggregated data back into the original dataset by 'Year'
data <- merge(data, tornado_sum, by = "Year", suffixes = c("", ".sum"))

#Removing the original 'Tornadoes' column if not needed anymore
data <- data[, -which(names(data) == "Tornadoes")]

#Renaming the new column
names(data)[which(names(data) == "Tornadoes.sum")] <- "Tornadoes"

#Printing the first few rows of the updated dataset
head(data)
##   Year Fatalities Tornadoes
## 1 1998        130      1428
## 2 1999         94      1342
## 3 2000         41      1073
## 4 2001         37      1212
## 5 2002         55       934
## 6 2003         54      1385
#Removing duplicate rows
data <- unique(data)

#Printing the first few rows of the updated dataset
head(data)
##   Year Fatalities Tornadoes
## 1 1998        130      1428
## 2 1999         94      1342
## 3 2000         41      1073
## 4 2001         37      1212
## 5 2002         55       934
## 6 2003         54      1385

Loading cyclones

#Loading the dataset
datac <- read.csv("C:\\Users\\aleja\\Downloads\\time-series-US-cost-1980-2024 (1).csv")

#showing the first few rows of the dataset
head(datac)
##   State Year Drought.Count Drought.Cost Drought.Lower.75 Drought.Upper.75
## 1    US 1998             1          6.7              5.7              7.1
## 2    US 1999             1          4.7              4.3              5.1
## 3    US 2000             1          9.1              8.6              9.9
## 4    US 2001             0          0.0              0.0              0.0
## 5    US 2002             1         15.7             15.7             17.2
## 6    US 2003             1          8.5              7.8              8.7
##   Drought.Lower.90 Drought.Upper.90 Drought.Lower.95 Drought.Upper.95
## 1              5.5              7.4              5.3              7.6
## 2              4.1              5.1              4.1              5.3
## 3              8.2             10.2              8.1             10.4
## 4              0.0              0.0              0.0              0.0
## 5             15.3             17.6             15.1             17.7
## 6              7.7              8.8              7.5              9.0
##   Flooding.Count Flooding.Cost Flooding.Lower.75 Flooding.Upper.75
## 1              1           1.8               1.5               2.3
## 2              0           0.0               0.0               0.0
## 3              1           1.6               0.9               1.8
## 4              0           0.0               0.0               0.0
## 5              0           0.0               0.0               0.0
## 6              0           0.0               0.0               0.0
##   Flooding.Lower.90 Flooding.Upper.90 Flooding.Lower.95 Flooding.Upper.95
## 1               1.5               2.4               1.3               2.4
## 2               0.0               0.0               0.0               0.0
## 3               1.2               1.9               0.9               1.9
## 4               0.0               0.0               0.0               0.0
## 5               0.0               0.0               0.0               0.0
## 6               0.0               0.0               0.0               0.0
##   Freeze.Count Freeze.Cost Freeze.Lower.75 Freeze.Upper.75 Freeze.Lower.90
## 1            1         4.8             3.8             5.7             3.6
## 2            0         0.0             0.0             0.0             0.0
## 3            0         0.0             0.0             0.0             0.0
## 4            0         0.0             0.0             0.0             0.0
## 5            0         0.0             0.0             0.0             0.0
## 6            0         0.0             0.0             0.0             0.0
##   Freeze.Upper.90 Freeze.Lower.95 Freeze.Upper.95 Severe.Storm.Count
## 1             5.9             3.6             5.9                  4
## 2             0.0             0.0             0.0                  1
## 3             0.0             0.0             0.0                  1
## 4             0.0             0.0             0.0                  2
## 5             0.0             0.0             0.0                  2
## 6             0.0             0.0             0.0                  4
##   Severe.Storm.Cost Severe.Storm.Lower.75 Severe.Storm.Upper.75
## 1               8.9                   7.9                   9.5
## 2               3.7                   3.2                   4.1
## 3               1.2                   1.6                   2.2
## 4               6.6                   5.9                   6.7
## 5               4.8                   4.5                   5.1
## 6              13.4                  12.1                  15.0
##   Severe.Storm.Lower.90 Severe.Storm.Upper.90 Severe.Storm.Lower.95
## 1                   7.3                  10.1                   7.1
## 2                   3.2                   4.3                   3.0
## 3                   1.6                   2.3                   1.6
## 4                   5.7                   7.1                   5.6
## 5                   4.3                   5.5                   4.1
## 6                  11.5                  15.6                  11.2
##   Severe.Storm.Upper.95 Tropical.Cyclone.Count Tropical.Cyclone.Cost
## 1                  10.7                      3                  14.5
## 2                   4.5                      1                  11.9
## 3                   2.3                      0                   0.0
## 4                   7.3                      1                  14.7
## 5                   5.5                      2                   3.9
## 6                  16.1                      1                   9.2
##   Tropical.Cyclone.Lower.75 Tropical.Cyclone.Upper.75 Tropical.Cyclone.Lower.90
## 1                      12.4                      16.3                      11.7
## 2                      10.5                      12.9                      10.1
## 3                       0.0                       0.0                       0.0
## 4                      12.5                      15.7                      11.9
## 5                       3.4                       4.2                       3.1
## 6                       7.8                       9.5                       7.5
##   Tropical.Cyclone.Upper.90 Tropical.Cyclone.Lower.95 Tropical.Cyclone.Upper.95
## 1                      17.4                      11.5                      17.8
## 2                      13.4                       9.8                      13.8
## 3                       0.0                       0.0                       0.0
## 4                      16.6                      11.6                      17.1
## 5                       4.6                       3.1                       4.8
## 6                      10.0                       7.5                      10.2
##   Wildfire.Count Wildfire.Cost Wildfire.Lower.75 Wildfire.Upper.75
## 1              0           0.0               0.0               0.0
## 2              0           0.0               0.0               0.0
## 3              1           1.9               1.8               2.2
## 4              0           0.0               0.0               0.0
## 5              1           2.2               1.9               2.6
## 6              1           6.5               5.5               6.8
##   Wildfire.Lower.90 Wildfire.Upper.90 Wildfire.Lower.95 Wildfire.Upper.95
## 1               0.0               0.0               0.0               0.0
## 2               0.0               0.0               0.0               0.0
## 3               1.8               2.2               1.6               2.3
## 4               0.0               0.0               0.0               0.0
## 5               1.7               2.7               1.7               2.9
## 6               5.3               7.2               5.2               7.5
##   Winter.Storm.Count Winter.Storm.Cost Winter.Storm.Lower.75
## 1                  1               2.7                   2.1
## 2                  2               3.6                   3.4
## 3                  1               1.3                   1.1
## 4                  0               0.0                   0.0
## 5                  0               0.0                   0.0
## 6                  0               0.0                   0.0
##   Winter.Storm.Upper.75 Winter.Storm.Lower.90 Winter.Storm.Upper.90
## 1                   2.7                   2.1                   2.9
## 2                   4.2                   3.2                   4.5
## 3                   1.5                   0.9                   1.5
## 4                   0.0                   0.0                   0.0
## 5                   0.0                   0.0                   0.0
## 6                   0.0                   0.0                   0.0
##   Winter.Storm.Lower.95 Winter.Storm.Upper.95 All.Disasters.Count
## 1                   1.9                   3.1                  11
## 2                   3.0                   4.9                   5
## 3                   0.9                   1.6                   5
## 4                   0.0                   0.0                   3
## 5                   0.0                   0.0                   6
## 6                   0.0                   0.0                   7
##   All.Disasters.Cost All.Disasters.Lower.75 All.Disasters.Upper.75
## 1               39.4                   33.4                   43.6
## 2               23.9                   21.4                   26.3
## 3               15.1                   14.0                   17.6
## 4               21.3                   18.4                   22.4
## 5               26.6                   25.5                   29.1
## 6               37.6                   33.2                   40.0
##   All.Disasters.Lower.90 All.Disasters.Upper.90 All.Disasters.Lower.95
## 1                   31.7                   46.1                   30.7
## 2                   20.6                   27.3                   19.9
## 3                   13.7                   18.1                   13.1
## 4                   17.6                   23.7                   17.2
## 5                   24.4                   30.4                   24.0
## 6                   32.0                   41.6                   31.4
##   All.Disasters.Upper.95
## 1                   47.5
## 2                   28.5
## 3                   18.5
## 4                   24.4
## 5                   30.9
## 6                   42.8
#Showing the structure of the dataset
str(datac)
## 'data.frame':    27 obs. of  66 variables:
##  $ State                    : chr  "US" "US" "US" "US" ...
##  $ Year                     : int  1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 ...
##  $ Drought.Count            : int  1 1 1 0 1 1 0 1 1 1 ...
##  $ Drought.Cost             : num  6.7 4.7 9.1 0 15.7 8.5 0 2.4 9.4 5.4 ...
##  $ Drought.Lower.75         : num  5.7 4.3 8.6 0 15.7 7.8 0 2.4 8.7 5.3 ...
##  $ Drought.Upper.75         : num  7.1 5.1 9.9 0 17.2 8.7 0 2.8 10.1 5.9 ...
##  $ Drought.Lower.90         : num  5.5 4.1 8.2 0 15.3 7.7 0 2.3 8.6 5.2 ...
##  $ Drought.Upper.90         : num  7.4 5.1 10.2 0 17.6 8.8 0 2.8 10.5 6.1 ...
##  $ Drought.Lower.95         : num  5.3 4.1 8.1 0 15.1 7.5 0 2.3 8.4 5.2 ...
##  $ Drought.Upper.95         : num  7.6 5.3 10.4 0 17.7 9 0 2.9 10.6 6.1 ...
##  $ Flooding.Count           : int  1 0 1 0 0 0 0 0 1 0 ...
##  $ Flooding.Cost            : num  1.8 0 1.6 0 0 0 0 0 2.3 0 ...
##  $ Flooding.Lower.75        : num  1.5 0 0.9 0 0 0 0 0 2.1 0 ...
##  $ Flooding.Upper.75        : num  2.3 0 1.8 0 0 0 0 0 3.2 0 ...
##  $ Flooding.Lower.90        : num  1.5 0 1.2 0 0 0 0 0 2 0 ...
##  $ Flooding.Upper.90        : num  2.4 0 1.9 0 0 0 0 0 3.5 0 ...
##  $ Flooding.Lower.95        : num  1.3 0 0.9 0 0 0 0 0 1.8 0 ...
##  $ Flooding.Upper.95        : num  2.4 0 1.9 0 0 0 0 0 3.6 0 ...
##  $ Freeze.Count             : int  1 0 0 0 0 0 0 0 0 2 ...
##  $ Freeze.Cost              : num  4.8 0 0 0 0 0 0 0 0 5.2 ...
##  $ Freeze.Lower.75          : num  3.8 0 0 0 0 0 0 0 0 4.6 ...
##  $ Freeze.Upper.75          : num  5.7 0 0 0 0 0 0 0 0 5.9 ...
##  $ Freeze.Lower.90          : num  3.6 0 0 0 0 0 0 0 0 4.4 ...
##  $ Freeze.Upper.90          : num  5.9 0 0 0 0 0 0 0 0 6.2 ...
##  $ Freeze.Lower.95          : num  3.6 0 0 0 0 0 0 0 0 4.2 ...
##  $ Freeze.Upper.95          : num  5.9 0 0 0 0 0 0 0 0 6.2 ...
##  $ Severe.Storm.Count       : int  4 1 1 2 2 4 2 1 5 1 ...
##  $ Severe.Storm.Cost        : num  8.9 3.7 1.2 6.6 4.8 13.4 2.8 1.4 10.7 3.7 ...
##  $ Severe.Storm.Lower.75    : num  7.9 3.2 1.6 5.9 4.5 12.1 2.6 1.3 9.8 3.3 ...
##  $ Severe.Storm.Upper.75    : num  9.5 4.1 2.2 6.7 5.1 15 3.1 1.4 11.3 3.7 ...
##  $ Severe.Storm.Lower.90    : num  7.3 3.2 1.6 5.7 4.3 11.5 2.5 1.3 9.4 3.1 ...
##  $ Severe.Storm.Upper.90    : num  10.1 4.3 2.3 7.1 5.5 15.6 3.3 1.4 11.5 3.7 ...
##  $ Severe.Storm.Lower.95    : num  7.1 3 1.6 5.6 4.1 11.2 2.3 1.1 9.2 3.1 ...
##  $ Severe.Storm.Upper.95    : num  10.7 4.5 2.3 7.3 5.5 16.1 3.5 1.4 11.9 3.9 ...
##  $ Tropical.Cyclone.Count   : int  3 1 0 1 2 1 4 4 0 0 ...
##  $ Tropical.Cyclone.Cost    : num  14.5 11.9 0 14.7 3.9 ...
##  $ Tropical.Cyclone.Lower.75: num  12.4 10.5 0 12.5 3.4 ...
##  $ Tropical.Cyclone.Upper.75: num  16.3 12.9 0 15.7 4.2 ...
##  $ Tropical.Cyclone.Lower.90: num  11.7 10.1 0 11.9 3.1 ...
##  $ Tropical.Cyclone.Upper.90: num  17.4 13.4 0 16.6 4.6 ...
##  $ Tropical.Cyclone.Lower.95: num  11.5 9.8 0 11.6 3.1 ...
##  $ Tropical.Cyclone.Upper.95: num  17.8 13.8 0 17.1 4.8 ...
##  $ Wildfire.Count           : int  0 0 1 0 1 1 0 0 1 1 ...
##  $ Wildfire.Cost            : num  0 0 1.9 0 2.2 6.5 0 0 2.3 4.1 ...
##  $ Wildfire.Lower.75        : num  0 0 1.8 0 1.9 5.5 0 0 2 3.8 ...
##  $ Wildfire.Upper.75        : num  0 0 2.2 0 2.6 6.8 0 0 2.5 4.4 ...
##  $ Wildfire.Lower.90        : num  0 0 1.8 0 1.7 5.3 0 0 2 3.7 ...
##  $ Wildfire.Upper.90        : num  0 0 2.2 0 2.7 7.2 0 0 2.7 4.6 ...
##  $ Wildfire.Lower.95        : num  0 0 1.6 0 1.7 5.2 0 0 1.9 3.6 ...
##  $ Wildfire.Upper.95        : num  0 0 2.3 0 2.9 7.5 0 0 2.7 4.9 ...
##  $ Winter.Storm.Count       : int  1 2 1 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Cost        : num  2.7 3.6 1.3 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Lower.75    : num  2.1 3.4 1.1 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Upper.75    : num  2.7 4.2 1.5 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Lower.90    : num  2.1 3.2 0.9 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Upper.90    : num  2.9 4.5 1.5 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Lower.95    : num  1.9 3 0.9 0 0 0 0 0 0 0 ...
##  $ Winter.Storm.Upper.95    : num  3.1 4.9 1.6 0 0 0 0 0 0 0 ...
##  $ All.Disasters.Count      : int  11 5 5 3 6 7 6 6 8 5 ...
##  $ All.Disasters.Cost       : num  39.4 23.9 15.1 21.3 26.6 ...
##  $ All.Disasters.Lower.75   : num  33.4 21.4 14 18.4 25.5 ...
##  $ All.Disasters.Upper.75   : num  43.6 26.3 17.6 22.4 29.1 ...
##  $ All.Disasters.Lower.90   : num  31.7 20.6 13.7 17.6 24.4 ...
##  $ All.Disasters.Upper.90   : num  46.1 27.3 18.1 23.7 30.4 ...
##  $ All.Disasters.Lower.95   : num  30.7 19.9 13.1 17.2 24 ...
##  $ All.Disasters.Upper.95   : num  47.5 28.5 18.5 24.4 30.9 ...
#Selecting specific columns from the dataset and drop all other columns
datac1 <- datac[, c("Tropical.Cyclone.Count", "State", "Year")]

#First few rows of the subsetted dataset
head(datac1)
##   Tropical.Cyclone.Count State Year
## 1                      3    US 1998
## 2                      1    US 1999
## 3                      0    US 2000
## 4                      1    US 2001
## 5                      2    US 2002
## 6                      1    US 2003
#Viewing the structure of the subsetted dataset
str(datac1)
## 'data.frame':    27 obs. of  3 variables:
##  $ Tropical.Cyclone.Count: int  3 1 0 1 2 1 4 4 0 0 ...
##  $ State                 : chr  "US" "US" "US" "US" ...
##  $ Year                  : int  1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 ...

Loading temperature

#Loading the dataset
datat <- read.csv("C:\\Users\\aleja\\Downloads\\data.csv")

#Viewing the first few rows of the dataset
head(datat)
##   Year Anomaly
## 1 1998    0.66
## 2 1999    0.44
## 3 2000    0.43
## 4 2001    0.47
## 5 2002    0.63
## 6 2003    0.60
#Showing the structure of the dataset
str(datat)
## 'data.frame':    26 obs. of  2 variables:
##  $ Year   : int  1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 ...
##  $ Anomaly: num  0.66 0.44 0.43 0.47 0.63 0.6 0.58 0.66 0.66 0.69 ...
#Combining the datasets by the "Year" column
combined_data <- merge(data, datac1, by = "Year")
combined_data <- merge(combined_data, datat, by = "Year")

#Viewing the first few rows of the combined dataset
head(combined_data)
##   Year Fatalities Tornadoes Tropical.Cyclone.Count State Anomaly
## 1 1998        130      1428                      3    US    0.66
## 2 1999         94      1342                      1    US    0.44
## 3 2000         41      1073                      0    US    0.43
## 4 2001         37      1212                      1    US    0.47
## 5 2002         55       934                      2    US    0.63
## 6 2003         54      1385                      1    US    0.60
#Showing the structure of the combined dataset
str(combined_data)
## 'data.frame':    26 obs. of  6 variables:
##  $ Year                  : int  1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 ...
##  $ Fatalities            : int  130 94 41 37 55 54 35 38 67 81 ...
##  $ Tornadoes             : num  1428 1342 1073 1212 934 ...
##  $ Tropical.Cyclone.Count: int  3 1 0 1 2 1 4 4 0 0 ...
##  $ State                 : chr  "US" "US" "US" "US" ...
##  $ Anomaly               : num  0.66 0.44 0.43 0.47 0.63 0.6 0.58 0.66 0.66 0.69 ...

Summary Statistics and distributions

#Summary statistics for numeric variables
summary(combined_data[, c("Fatalities", "Tornadoes", "Tropical.Cyclone.Count")])
##    Fatalities       Tornadoes    Tropical.Cyclone.Count
##  Min.   : 10.00   Min.   : 886   Min.   :0.000         
##  1st Qu.: 36.25   1st Qu.:1086   1st Qu.:0.000         
##  Median : 50.50   Median :1194   Median :2.000         
##  Mean   : 75.96   Mean   :1241   Mean   :1.808         
##  3rd Qu.: 79.75   3rd Qu.:1374   3rd Qu.:3.000         
##  Max.   :553.00   Max.   :1813   Max.   :7.000
#Loading required libraries
library(ggplot2)

# Histogram of Fatalities
ggplot(combined_data, aes(x = Fatalities)) +
  geom_histogram(binwidth = 10, fill = "skyblue", color = "black") +
  labs(title = "Distribution of Fatalities",
       x = "Number of Fatalities", y = "Frequency")

# Histogram of Tornadoes
ggplot(combined_data, aes(x = Tornadoes)) +
  geom_histogram(binwidth = 100, fill = "skyblue", color = "black") +
  labs(title = "Distribution of Tornadoes",
       x = "Number of Tornadoes", y = "Frequency")

# Histogram of Tropical Cyclone Count
ggplot(combined_data, aes(x = Tropical.Cyclone.Count)) +
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
  labs(title = "Distribution of Tropical Cyclone Count",
       x = "Number of Cyclones", y = "Frequency")

Visualizations

#Loading required libraries
library(ggplot2)

# Line plot of Fatalities over time
ggplot(combined_data, aes(x = Year, y = Fatalities)) +
  geom_line(color = "red") +
  labs(title = "Fatalities Over Time",
       x = "Year", y = "Fatalities")

# Line plot of Tornadoes over time
ggplot(combined_data, aes(x = Year, y = Tornadoes)) +
  geom_line(color = "blue") +
  labs(title = "Tornadoes Over Time",
       x = "Year", y = "Tornadoes")

# Line plot of Tropical Cyclone Count over time
ggplot(combined_data, aes(x = Year, y = Tropical.Cyclone.Count)) +
  geom_line(color = "green") +
  labs(title = "Tropical Cyclone Count Over Time",
       x = "Year", y = "Tropical Cyclone Count")

The occurrence of many fatalities in certain years due to the combined effects of global temperature increase and tornadoes underscores the importance of addressing climate change and implementing effective measures to reduce the risks associated with severe weather events.

# Line plot of Temperature Anomaly over time
ggplot(combined_data, aes(x = Year, y = Anomaly)) +
  geom_line(color = "orange") +
  labs(title = "Temperature Anomaly Over Time",
       x = "Year", y = "Temperature Anomaly")

A rise in global temperature of 0.5 (for reference) degrees Celsius can lead to alterations in weather patterns, including shifts in precipitation patterns, changes in the frequency and intensity of extreme weather events such as heatwaves, droughts, and heavy rainfall events, and variations in the distribution of storms and cyclones.

# Trend series plot with Anomaly and Tropical Cyclone Count
ggplot(combined_data, aes(x = Year)) +
  geom_line(aes(y = Anomaly, color = "Temperature Anomaly")) +
  geom_line(aes(y = Tropical.Cyclone.Count, color = "Tropical Cyclone Count")) +
  labs(title = "Trend Series of Anomaly and Tropical Cyclone Count",
       x = "Year", y = "Count/Anomaly") +
  scale_color_manual(name = "Variables",
                     values = c("Temperature Anomaly" = "orange",
                                "Tropical Cyclone Count" = "green"))

#Creating a dual-axis plot for Tornadoes and Temperature Anomaly
ggplot() +
  geom_line(data = combined_data, aes(x = Year, y = Tornadoes, color = "Tornadoes")) +
  geom_line(data = combined_data, aes(x = Year, y = Anomaly * max(combined_data$Tornadoes) / max(combined_data$Anomaly), color = "Temperature Anomaly")) +
  scale_y_continuous(sec.axis = sec_axis(~./max(combined_data$Tornadoes) * max(combined_data$Anomaly), name = "Temperature Anomaly")) +
  labs(title = "Trend Series of Tornadoes and Temperature Anomaly",
       x = "Year", y = "Tornadoes") +
  scale_color_manual(name = "Variables",
                     values = c("Tornadoes" = "blue",
                                "Temperature Anomaly" = "orange"))
## Warning: Use of `combined_data$Tornadoes` is discouraged.
## ℹ Use `Tornadoes` instead.
## Warning: Use of `combined_data$Anomaly` is discouraged.
## ℹ Use `Anomaly` instead.

A significant increase in global temperature can lead to more frequent and intense extreme weather events, including tornadoes and cyclones. Warmer temperatures can provide additional energy to the atmosphere, fueling the formation and intensification of these storms.

The combination of higher global temperatures and an increasing trend in tornadoes and cyclones poses a heightened risk of damage to infrastructure, property, and ecosystems, as well as an increased likelihood of loss of life and injuries due to severe weather impacts.

LS0tDQp0aXRsZTogIkRhdGEgNjA4IFN0b3J5IDUiDQphdXRob3I6ICJMYXVyYSBCIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpIaXN0b3JpYyBkYXRhIGluZGljYXRlcyB0aGF0IHRoZSBvY2N1cnJlbmNlIGFuZCBpbnRlbnNpdHkgb2YgY3ljbG9uaWMgc3Rvcm1zIChIdXJyaWNhbmVzLCBUeXBob29ucyBhbmQgVG9ybmFkb3MpIGluY3JlYXNlcyB3aXRoIHRoZSBpbmNyZWFzZWQgZWFydGggdGVtcGVyYXR1cmUuIEZvciB0aGlzIGFzc2lnbm1lbnQgeW91IHdpbGwgbmVlZCB0byB0ZWxsIHRoaXMgc3RvcnkgdG8gYSBub24tdGVjaG5pY2FsIGF1ZGllbmNlIChlZzogYSBoaWdoLXNjaG9vbCBlYXJ0aCBzY2llbmNlIGNsYXNzKS4NCg0KTm90ZXM6DQoNClNvdXJjZSBoaXN0b3JpYyBkYXRhIGZvciBhIHBlcmlvZCBvZiBhdCBsZWFzdCAyNSB5ZWFycyBvbiBhIG1lYXN1cmUgb2YgdGhlIGVhcnRoJ3MgdGVtcGVyYXR1cmUuDQoNClNvdXJjZSBkYXRhIG9uIHRoZSBvY2N1cnJlbmNlIGFuZCBpbnRlbnNpdHkgb2YgaHVycmljYW5lcywgdHlwaG9vbnMgYW5kIHRvcm5hZG9zIGZvciB0aGUgc2FtZSBoaXN0b3JpYyBwZXJpb2QuDQoNClBlcmZvcm0gdGhlIGRhdGEgYW5hbHlzaXMgdG8gZXN0YWJsaXNoIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBlYXJ0aCB0ZW1wZXJhdHVyZSBhbmQgc3Rvcm0gb2NjdXJyZW5jZSBhbmQgaW50ZW5zaXR5Lg0KDQpUZWxsIHRoZSBzdG9yeSBvZiB0aGlzIGRhdGEgYW5kIHlvdXIgYW5hbHlzaXMgdXNpbmcgZGF0YSB2aXN1YWxpemF0aW9ucyBhbmQgb3RoZXIgaWxsdXN0cmF0aW9ucyAoZWc6IHBpY3R1cmVzIG9mIHN0b3JtIGRhbWFnZSkgaW4gYSBwcmVzZW50YXRpb24gdGhhdCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gYSBoaWdoLXNjaG9vbCBlYXJ0aCBzY2llbmNlIGNsYXNzLg0KDQoNCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpgYGANCg0KIyMjIExvYWRpbmcgZGF0YQ0KDQpMb2FkaW5nIHRvcm5hZG9zLg0KDQpgYGB7ciBjb2RlLWNodW5rLWxhYmVsfQ0KI0xvYWRpbmcgZGF0YSBmcm9tIENTViBmaWxlDQpyZWFkTGluZXMoIkM6XFxVc2Vyc1xcYWxlamFcXERvd25sb2Fkc1xcZGF0YSAoMSkuY3N2IiwgbiA9IDUpDQoNCmRhdGEgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcYWxlamFcXERvd25sb2Fkc1xcZGF0YSAoMSkuY3N2IikNCg0KI1ZpZXcgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSBkYXRhc2V0DQpoZWFkKGRhdGEpDQoNCiNWaWV3IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQNCnN0cihkYXRhKQ0KDQpgYGANCg0KYGBge3J9DQojQ29udmVydGluZyAnRGF0ZScgY29sdW1uIHRvIGNoYXJhY3Rlcg0KZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihkYXRhJERhdGUpDQoNCiNFeHRyYWN0aW5nIHllYXIgZnJvbSAnRGF0ZScgY29sdW1uDQpkYXRhJFllYXIgPC0gc3Vic3RyKGRhdGEkRGF0ZSwgMSwgNCkNCg0KI0NvbnZlcnRpbmcgJ1llYXInIGNvbHVtbiBiYWNrIHRvIGludGVnZXIgKGlmIG5lZWRlZCkNCmRhdGEkWWVhciA8LSBhcy5pbnRlZ2VyKGRhdGEkWWVhcikNCg0KI1JlbW92aW5nIHRoZSBvcmlnaW5hbCAnRGF0ZScgY29sdW1uIA0KZGF0YSA8LSBkYXRhWywgLXdoaWNoKG5hbWVzKGRhdGEpID09ICJEYXRlIildDQoNCiNWaWV3aW5nIHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgdXBkYXRlZCBkYXRhc2V0DQpoZWFkKGRhdGEpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI0NvbnZlcnRpbmcgJ1Rvcm5hZG9lcycgY29sdW1uIHRvIG51bWVyaWMNCmRhdGEkVG9ybmFkb2VzIDwtIGFzLm51bWVyaWMoZGF0YSRUb3JuYWRvZXMpDQoNCiNBZ2dyZWdhdGluZyB0aGUgdG9ybmFkbyBjb3VudHMgYnkgeWVhciBhbmQgY2FsY3VsYXRlIHRoZSBzdW0NCnRvcm5hZG9fc3VtIDwtIGFnZ3JlZ2F0ZShUb3JuYWRvZXMgfiBZZWFyLCBkYXRhID0gZGF0YSwgc3VtKQ0KDQojUHJpbnRpbmcgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lDQpwcmludCh0b3JuYWRvX3N1bSkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCiNDb252ZXJ0aW5nICdUb3JuYWRvZXMnIGNvbHVtbiB0byBudW1lcmljDQpkYXRhJFRvcm5hZG9lcyA8LSBhcy5udW1lcmljKGRhdGEkVG9ybmFkb2VzKQ0KDQojQWdncmVnYXRpbmcgdGhlIHRvcm5hZG8gY291bnRzIGJ5IHllYXIgYW5kIGNhbGN1bGF0ZSB0aGUgc3VtDQp0b3JuYWRvX3N1bSA8LSBhZ2dyZWdhdGUoVG9ybmFkb2VzIH4gWWVhciwgZGF0YSA9IGRhdGEsIHN1bSkNCg0KI01lcmdpbmcgdGhlIGFnZ3JlZ2F0ZWQgZGF0YSBiYWNrIGludG8gdGhlIG9yaWdpbmFsIGRhdGFzZXQgYnkgJ1llYXInDQpkYXRhIDwtIG1lcmdlKGRhdGEsIHRvcm5hZG9fc3VtLCBieSA9ICJZZWFyIiwgc3VmZml4ZXMgPSBjKCIiLCAiLnN1bSIpKQ0KDQojUmVtb3ZpbmcgdGhlIG9yaWdpbmFsICdUb3JuYWRvZXMnIGNvbHVtbiBpZiBub3QgbmVlZGVkIGFueW1vcmUNCmRhdGEgPC0gZGF0YVssIC13aGljaChuYW1lcyhkYXRhKSA9PSAiVG9ybmFkb2VzIildDQoNCiNSZW5hbWluZyB0aGUgbmV3IGNvbHVtbg0KbmFtZXMoZGF0YSlbd2hpY2gobmFtZXMoZGF0YSkgPT0gIlRvcm5hZG9lcy5zdW0iKV0gPC0gIlRvcm5hZG9lcyINCg0KI1ByaW50aW5nIHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgdXBkYXRlZCBkYXRhc2V0DQpoZWFkKGRhdGEpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI1JlbW92aW5nIGR1cGxpY2F0ZSByb3dzDQpkYXRhIDwtIHVuaXF1ZShkYXRhKQ0KDQojUHJpbnRpbmcgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSB1cGRhdGVkIGRhdGFzZXQNCmhlYWQoZGF0YSkNCg0KYGBgDQoNCg0KTG9hZGluZyBjeWNsb25lcyANCg0KYGBge3J9DQojTG9hZGluZyB0aGUgZGF0YXNldA0KZGF0YWMgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcYWxlamFcXERvd25sb2Fkc1xcdGltZS1zZXJpZXMtVVMtY29zdC0xOTgwLTIwMjQgKDEpLmNzdiIpDQoNCiNzaG93aW5nIHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgZGF0YXNldA0KaGVhZChkYXRhYykNCg0KI1Nob3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldA0Kc3RyKGRhdGFjKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNTZWxlY3Rpbmcgc3BlY2lmaWMgY29sdW1ucyBmcm9tIHRoZSBkYXRhc2V0IGFuZCBkcm9wIGFsbCBvdGhlciBjb2x1bW5zDQpkYXRhYzEgPC0gZGF0YWNbLCBjKCJUcm9waWNhbC5DeWNsb25lLkNvdW50IiwgIlN0YXRlIiwgIlllYXIiKV0NCg0KI0ZpcnN0IGZldyByb3dzIG9mIHRoZSBzdWJzZXR0ZWQgZGF0YXNldA0KaGVhZChkYXRhYzEpDQoNCiNWaWV3aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YnNldHRlZCBkYXRhc2V0DQpzdHIoZGF0YWMxKQ0KDQpgYGANCg0KDQoNCkxvYWRpbmcgdGVtcGVyYXR1cmUNCg0KYGBge3J9DQojTG9hZGluZyB0aGUgZGF0YXNldA0KZGF0YXQgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcYWxlamFcXERvd25sb2Fkc1xcZGF0YS5jc3YiKQ0KDQojVmlld2luZyB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIGRhdGFzZXQNCmhlYWQoZGF0YXQpDQoNCiNTaG93aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQNCnN0cihkYXRhdCkNCg0KYGBgDQoNCg0KYGBge3J9DQojQ29tYmluaW5nIHRoZSBkYXRhc2V0cyBieSB0aGUgIlllYXIiIGNvbHVtbg0KY29tYmluZWRfZGF0YSA8LSBtZXJnZShkYXRhLCBkYXRhYzEsIGJ5ID0gIlllYXIiKQ0KY29tYmluZWRfZGF0YSA8LSBtZXJnZShjb21iaW5lZF9kYXRhLCBkYXRhdCwgYnkgPSAiWWVhciIpDQoNCiNWaWV3aW5nIHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgY29tYmluZWQgZGF0YXNldA0KaGVhZChjb21iaW5lZF9kYXRhKQ0KDQojU2hvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb21iaW5lZCBkYXRhc2V0DQpzdHIoY29tYmluZWRfZGF0YSkNCg0KYGBgDQoNCg0KIyMjIFN1bW1hcnkgU3RhdGlzdGljcyBhbmQgZGlzdHJpYnV0aW9ucyANCg0KYGBge3J9DQojU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBudW1lcmljIHZhcmlhYmxlcw0Kc3VtbWFyeShjb21iaW5lZF9kYXRhWywgYygiRmF0YWxpdGllcyIsICJUb3JuYWRvZXMiLCAiVHJvcGljYWwuQ3ljbG9uZS5Db3VudCIpXSkNCg0KDQpgYGANCg0KYGBge3J9DQojTG9hZGluZyByZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBIaXN0b2dyYW0gb2YgRmF0YWxpdGllcw0KZ2dwbG90KGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gRmF0YWxpdGllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEZhdGFsaXRpZXMiLA0KICAgICAgIHggPSAiTnVtYmVyIG9mIEZhdGFsaXRpZXMiLCB5ID0gIkZyZXF1ZW5jeSIpDQoNCiMgSGlzdG9ncmFtIG9mIFRvcm5hZG9lcw0KZ2dwbG90KGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gVG9ybmFkb2VzKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMCwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIFRvcm5hZG9lcyIsDQogICAgICAgeCA9ICJOdW1iZXIgb2YgVG9ybmFkb2VzIiwgeSA9ICJGcmVxdWVuY3kiKQ0KDQojIEhpc3RvZ3JhbSBvZiBUcm9waWNhbCBDeWNsb25lIENvdW50DQpnZ3Bsb3QoY29tYmluZWRfZGF0YSwgYWVzKHggPSBUcm9waWNhbC5DeWNsb25lLkNvdW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUcm9waWNhbCBDeWNsb25lIENvdW50IiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBDeWNsb25lcyIsIHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCg0KIyMjIFZpc3VhbGl6YXRpb25zDQoNCmBgYHtyfQ0KI0xvYWRpbmcgcmVxdWlyZWQgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgTGluZSBwbG90IG9mIEZhdGFsaXRpZXMgb3ZlciB0aW1lDQpnZ3Bsb3QoY29tYmluZWRfZGF0YSwgYWVzKHggPSBZZWFyLCB5ID0gRmF0YWxpdGllcykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJGYXRhbGl0aWVzIE92ZXIgVGltZSIsDQogICAgICAgeCA9ICJZZWFyIiwgeSA9ICJGYXRhbGl0aWVzIikNCg0KIyBMaW5lIHBsb3Qgb2YgVG9ybmFkb2VzIG92ZXIgdGltZQ0KZ2dwbG90KGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gWWVhciwgeSA9IFRvcm5hZG9lcykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiVG9ybmFkb2VzIE92ZXIgVGltZSIsDQogICAgICAgeCA9ICJZZWFyIiwgeSA9ICJUb3JuYWRvZXMiKQ0KDQojIExpbmUgcGxvdCBvZiBUcm9waWNhbCBDeWNsb25lIENvdW50IG92ZXIgdGltZQ0KZ2dwbG90KGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gWWVhciwgeSA9IFRyb3BpY2FsLkN5Y2xvbmUuQ291bnQpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIpICsNCiAgbGFicyh0aXRsZSA9ICJUcm9waWNhbCBDeWNsb25lIENvdW50IE92ZXIgVGltZSIsDQogICAgICAgeCA9ICJZZWFyIiwgeSA9ICJUcm9waWNhbCBDeWNsb25lIENvdW50IikNCg0KYGBgDQoNClRoZSBvY2N1cnJlbmNlIG9mIG1hbnkgZmF0YWxpdGllcyBpbiBjZXJ0YWluIHllYXJzIGR1ZSB0byB0aGUgY29tYmluZWQgZWZmZWN0cyBvZiBnbG9iYWwgdGVtcGVyYXR1cmUgaW5jcmVhc2UgYW5kIHRvcm5hZG9lcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBhZGRyZXNzaW5nIGNsaW1hdGUgY2hhbmdlIGFuZCBpbXBsZW1lbnRpbmcgZWZmZWN0aXZlIG1lYXN1cmVzIHRvIHJlZHVjZSB0aGUgcmlza3MgYXNzb2NpYXRlZCB3aXRoIHNldmVyZSB3ZWF0aGVyIGV2ZW50cy4gDQoNCmBgYHtyfQ0KIyBMaW5lIHBsb3Qgb2YgVGVtcGVyYXR1cmUgQW5vbWFseSBvdmVyIHRpbWUNCmdncGxvdChjb21iaW5lZF9kYXRhLCBhZXMoeCA9IFllYXIsIHkgPSBBbm9tYWx5KSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAib3JhbmdlIikgKw0KICBsYWJzKHRpdGxlID0gIlRlbXBlcmF0dXJlIEFub21hbHkgT3ZlciBUaW1lIiwNCiAgICAgICB4ID0gIlllYXIiLCB5ID0gIlRlbXBlcmF0dXJlIEFub21hbHkiKQ0KDQpgYGANCg0KQSByaXNlIGluIGdsb2JhbCB0ZW1wZXJhdHVyZSBvZiAwLjUgKGZvciByZWZlcmVuY2UpIGRlZ3JlZXMgQ2Vsc2l1cyBjYW4gbGVhZCB0byBhbHRlcmF0aW9ucyBpbiB3ZWF0aGVyIHBhdHRlcm5zLCBpbmNsdWRpbmcgc2hpZnRzIGluIHByZWNpcGl0YXRpb24gcGF0dGVybnMsIGNoYW5nZXMgaW4gdGhlIGZyZXF1ZW5jeSBhbmQgaW50ZW5zaXR5IG9mIGV4dHJlbWUgd2VhdGhlciBldmVudHMgc3VjaCBhcyBoZWF0d2F2ZXMsIGRyb3VnaHRzLCBhbmQgaGVhdnkgcmFpbmZhbGwgZXZlbnRzLCBhbmQgdmFyaWF0aW9ucyBpbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0b3JtcyBhbmQgY3ljbG9uZXMuDQoNCg0KYGBge3J9DQoNCiMgVHJlbmQgc2VyaWVzIHBsb3Qgd2l0aCBBbm9tYWx5IGFuZCBUcm9waWNhbCBDeWNsb25lIENvdW50DQpnZ3Bsb3QoY29tYmluZWRfZGF0YSwgYWVzKHggPSBZZWFyKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBBbm9tYWx5LCBjb2xvciA9ICJUZW1wZXJhdHVyZSBBbm9tYWx5IikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVHJvcGljYWwuQ3ljbG9uZS5Db3VudCwgY29sb3IgPSAiVHJvcGljYWwgQ3ljbG9uZSBDb3VudCIpKSArDQogIGxhYnModGl0bGUgPSAiVHJlbmQgU2VyaWVzIG9mIEFub21hbHkgYW5kIFRyb3BpY2FsIEN5Y2xvbmUgQ291bnQiLA0KICAgICAgIHggPSAiWWVhciIsIHkgPSAiQ291bnQvQW5vbWFseSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiVmFyaWFibGVzIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIlRlbXBlcmF0dXJlIEFub21hbHkiID0gIm9yYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcm9waWNhbCBDeWNsb25lIENvdW50IiA9ICJncmVlbiIpKQ0KDQpgYGANCg0KYGBge3J9DQojQ3JlYXRpbmcgYSBkdWFsLWF4aXMgcGxvdCBmb3IgVG9ybmFkb2VzIGFuZCBUZW1wZXJhdHVyZSBBbm9tYWx5DQpnZ3Bsb3QoKSArDQogIGdlb21fbGluZShkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBZZWFyLCB5ID0gVG9ybmFkb2VzLCBjb2xvciA9ICJUb3JuYWRvZXMiKSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gWWVhciwgeSA9IEFub21hbHkgKiBtYXgoY29tYmluZWRfZGF0YSRUb3JuYWRvZXMpIC8gbWF4KGNvbWJpbmVkX2RhdGEkQW5vbWFseSksIGNvbG9yID0gIlRlbXBlcmF0dXJlIEFub21hbHkiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+Li9tYXgoY29tYmluZWRfZGF0YSRUb3JuYWRvZXMpICogbWF4KGNvbWJpbmVkX2RhdGEkQW5vbWFseSksIG5hbWUgPSAiVGVtcGVyYXR1cmUgQW5vbWFseSIpKSArDQogIGxhYnModGl0bGUgPSAiVHJlbmQgU2VyaWVzIG9mIFRvcm5hZG9lcyBhbmQgVGVtcGVyYXR1cmUgQW5vbWFseSIsDQogICAgICAgeCA9ICJZZWFyIiwgeSA9ICJUb3JuYWRvZXMiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlZhcmlhYmxlcyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJUb3JuYWRvZXMiID0gImJsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVtcGVyYXR1cmUgQW5vbWFseSIgPSAib3JhbmdlIikpDQoNCmBgYA0KDQpBIHNpZ25pZmljYW50IGluY3JlYXNlIGluIGdsb2JhbCB0ZW1wZXJhdHVyZSBjYW4gbGVhZCB0byBtb3JlIGZyZXF1ZW50IGFuZCBpbnRlbnNlIGV4dHJlbWUgd2VhdGhlciBldmVudHMsIGluY2x1ZGluZyB0b3JuYWRvZXMgYW5kIGN5Y2xvbmVzLiBXYXJtZXIgdGVtcGVyYXR1cmVzIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgZW5lcmd5IHRvIHRoZSBhdG1vc3BoZXJlLCBmdWVsaW5nIHRoZSBmb3JtYXRpb24gYW5kIGludGVuc2lmaWNhdGlvbiBvZiB0aGVzZSBzdG9ybXMuDQoNCiBUaGUgY29tYmluYXRpb24gb2YgaGlnaGVyIGdsb2JhbCB0ZW1wZXJhdHVyZXMgYW5kIGFuIGluY3JlYXNpbmcgdHJlbmQgaW4gdG9ybmFkb2VzIGFuZCBjeWNsb25lcyBwb3NlcyBhIGhlaWdodGVuZWQgcmlzayBvZiBkYW1hZ2UgdG8gaW5mcmFzdHJ1Y3R1cmUsIHByb3BlcnR5LCBhbmQgZWNvc3lzdGVtcywgYXMgd2VsbCBhcyBhbiBpbmNyZWFzZWQgbGlrZWxpaG9vZCBvZiBsb3NzIG9mIGxpZmUgYW5kIGluanVyaWVzIGR1ZSB0byBzZXZlcmUgd2VhdGhlciBpbXBhY3RzLg0KDQojIyMgUmVmZXJlbmNlcw0KDQpEYXRhIHNvdXJjZXM6DQoNCmh0dHBzOi8vd3d3Lm5jZWkubm9hYS5nb3YvYWNjZXNzL21vbml0b3JpbmcvY2xpbWF0ZS1hdC1hLWdsYW5jZS9nbG9iYWwvdGltZS1zZXJpZXMNCg0KaHR0cHM6Ly93d3cubmNlaS5ub2FhLmdvdi9hY2Nlc3MvYmlsbGlvbnMvc3RhdGUtc3VtbWFyeS9VUw0KDQoNCg0KDQo=