1. Intro
The objective of this .Rmd
file is to download data from Eurostat to be used for the students in their assignments
We are going to need some packages, then we are going to load them:
2. Countries available from Eurostat
First, we will see the list of available countries in the Eurostat database. They are in the data.frame called eu_countries
Let’s see the countries list as a table
3. You have to chose your country
Every one of you should choose one different country.
During the lessons/e-meetings we will use data for Spain, then here I choose Spain
We can now start to download the data. I repeat, in the lessons I will use data for Spain , BUT for your assignment you should use other country. Each of you a different country
4. Downloading the data for the assignment
OK. The code below will download some data for the country you have chosen
- First, we have to set some parameters to say to the
eurostat
package API which series we want to download
geo_f <- my_country
s_adj_f <- c("SCA") #- Seasonally and calendar adjusted data
unit_f <- c( "CP_MEUR" , "PD05_EUR", "CLV_I10" ) #- units: CP_MEUR[Current prices, million euro], PD05_EUR[Price index (implicit deflator), 2005=100, euro], CLV_I10[Chain linked volumes, index 2010=100]
na_item_f <-c("B1GQ") #- economic series. B1GQ: Gross domestic product at market prices
filtros <- list(geo = geo_f, na_item = na_item_f , unit = unit_f, s_adj = s_adj_f)
- Already downloading the data for the country you have chosen (
my_country
)
- “Cleaning” the data for the country chosen
let’s see what we have in the data.frame data_c
time |
Vol |
GDP |
Def |
GDPr |
1995-01-01 |
65.8 |
112945.8 |
70.583 |
160018.4 |
2019-10-01 |
111.2 |
315710.0 |
116.780 |
270345.9 |
- Dow loading data for the EU15
geo_f <- c("EU15") #- countries: EU15
filtros <- list(geo = geo_f, na_item = na_item_f , unit = unit_f, s_adj = s_adj_f)
df_l <- get_eurostat("namq_10_gdp", filters = filtros, type = "label", stringsAsFactors = F, select_time = 'Q') #- data with labels
df <- get_eurostat("namq_10_gdp", filters = filtros, type = "code", stringsAsFactors = F, select_time = 'Q') #- data with codes
df_l <- df_l %>% tidyr::spread(unit, values)
df <- df %>% tidyr::spread(unit, values)
data_15 <- df[first:last,4:7] #- getting only the valid observations of the last 3 columns (4:6)
data_15 <- data_15 %>% rename(GDP_15 = CP_MEUR, Def_15 = PD05_EUR, Vol_15 = CLV_I10) #- renaming our data
data_15 <- data_15 %>% mutate(GDPr_15 = GDP_15/Def_15*100) #- real GDP
#data_15 <- data_15[,-1] #- removing first column
let’s see what we have in the data.frame data_15
time |
Vol_15 |
GDP_15 |
Def_15 |
GDPr_15 |
1995-01-01 |
76.1 |
1738293 |
80.959 |
2147127 |
2019-10-01 |
113.7 |
3779499 |
117.775 |
3209084 |
- Downloading data for the US
geo_f <- c("US") #- countries: US
na_item_f <- c("B1GQ", "PD05_NAC") #- economic series. B1GQ: Gross domestic product at market prices
filtros <- list(geo = geo_f, na_item = na_item_f , s_adj = s_adj_f)
df_l <- get_eurostat("naidq_10_gdp", filters = filtros, type = "label", stringsAsFactors = F, select_time = 'Q') #- data with labels
df <- get_eurostat("naidq_10_gdp", filters = filtros, type = "code", stringsAsFactors = F, select_time = 'Q') #- data with codes
df_l <- df_l %>% tidyr::spread(unit, values)
df <- df %>% tidyr::spread(unit, values)
data_us <- df[first:last,c(4,5,9,10)] #- getting the data we need
data_us <- data_us %>% rename(GDP_us = CP_MNAC, GDP_us_e = CP_MEUR, Vol_us = CLV_I10) #- renaming our data
data_us <- data_us %>% mutate(tc_e_d = GDP_us/GDP_us_e) #- exchange rate
#data_us <- data_us[,-1] #- removing first column
let’s see what we have in the data.frame data_us
time |
Vol_us |
GDP_us_e |
GDP_us |
tc_e_d |
1995-01-01 |
67.6 |
1476928 |
1880572 |
1.2733 |
2019-10-01 |
123.2 |
4906766 |
5432281 |
1.1071 |
3. Merging the data
We have download data for the country you have chosen, for E15, and for the US. We have to join the data in a unique data.frame. But they have to share the same sample.
Good, we already have all the data we need in one data.frame. We have to save it because you will do your assignment with this data
4. Saving the data in a file
For example we can save the data in .csv format:
Or in .rds format
Please uncomment the two previous chunks to effectively save your data because you are going to need it for your assignment
LS0tCnRpdGxlOiAiRG93bmxvYWRpbmcgbXlfZGF0YSBmb3IgdGhlIGFzc2lnbm1lbnQiCmF1dGhvcjogIllvdSIKZGF0ZTogIjIwMjAsIEFwcmlsIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzIAogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgICNjb2RlX2ZvbGRpbmc6IHNob3cKICAgIHNlbGZfY29udGFpbmVkOiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMtIGRlZmluaWVuZG8gb3BjaW9uZXMgZ2xvYmFsZXMgcGFyYSBsb3MgY2h1bmtzIGRlIGPDs2RpZ28gUgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpb24gY2llbnRpZmljYQpgYGAKCjxicj4KCiMgMS4gSW50cm8KClRoZSBvYmplY3RpdmUgb2YgdGhpcyBgLlJtZGAgZmlsZSBpcyB0byBkb3dubG9hZCBkYXRhIGZyb20gRXVyb3N0YXQgdG8gYmUgdXNlZCBmb3IgdGhlIHN0dWRlbnRzIGluIHRoZWlyIGFzc2lnbm1lbnRzCgpXZSBhcmUgZ29pbmcgdG8gbmVlZCBzb21lIHBhY2thZ2VzLCB0aGVuIHdlIGFyZSBnb2luZyB0byBsb2FkIHRoZW06CgoKYGBge3IsIGVjaG8gPSBUUlVFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICAgICMtIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkoZXVyb3N0YXQpICAgICAgIy0gaW5zdGFsbC5wYWNrYWdlcygiZXVyb3N0YXQiKQpsaWJyYXJ5KGd0KSAgICAgICAgICAgICMtIGluc3RhbGwucGFja2FnZXMoImd0IikKbGlicmFyeShEVCkgICAgICAgICAgICAjLSBpbnN0YWxsLnBhY2thZ2VzKCJEVCIpCmBgYAogIAoKPGJyPgoKIyAyLiBDb3VudHJpZXMgYXZhaWxhYmxlIGZyb20gRXVyb3N0YXQKCgpGaXJzdCwgd2Ugd2lsbCBzZWUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvdW50cmllcyBpbiB0aGUgRXVyb3N0YXQgZGF0YWJhc2UuIFRoZXkgYXJlIGluIHRoZSBkYXRhLmZyYW1lIGNhbGxlZCBgZXVfY291bnRyaWVzYAoKYGBge3J9CmNvdW50cnlfY29kZXMgPC0gZXVfY291bnRyaWVzICAgICAgICMtIGF2YWxhaWxhYmxlIGNvdW50cmllcyBpbiBFdXJvc3RhdCBkYXRhCmBgYAoKTGV0J3Mgc2VlIHRoZSBjb3VudHJpZXMgbGlzdCBhcyBhIHRhYmxlCgoKYGBge3J9CiNndDo6Z3QoY291bnRyeV9jb2RlcykKRFQ6OmRhdGF0YWJsZShjb3VudHJ5X2NvZGVzKQpgYGAKCgo8YnI+CgojIyAzLiBZb3UgaGF2ZSB0byBjaG9zZSB5b3VyIGNvdW50cnkKCkV2ZXJ5IG9uZSBvZiB5b3Ugc2hvdWxkIGNob29zZSBvbmUgZGlmZmVyZW50IGNvdW50cnkuIAoKRHVyaW5nIHRoZSBsZXNzb25zL2UtbWVldGluZ3Mgd2Ugd2lsbCB1c2UgZGF0YSBmb3IgU3BhaW4sIHRoZW4gaGVyZSBJIGNob29zZSAqKlNwYWluKioKCgpgYGB7cn0KbXlfY291bnRyeSA8LSAiRVMiICAgIy0gIENIT09TRSBZT1VSIENPVU5UUlkgLSAgQ0hPT1NFIFlPVVIgQ09VTlRSWQpgYGAKCldlIGNhbiBub3cgc3RhcnQgdG8gZG93bmxvYWQgdGhlIGRhdGEuIEkgcmVwZWF0LCBpbiB0aGUgbGVzc29ucyBJIHdpbGwgdXNlIGRhdGEgZm9yIFNwYWluICwgQlVUIGZvciB5b3VyIGFzc2lnbm1lbnQgeW91IHNob3VsZCB1c2Ugb3RoZXIgY291bnRyeS4gRWFjaCBvZiB5b3UgYSBkaWZmZXJlbnQgY291bnRyeQoKPGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tCgoKPGJyPgoKIyA0LiBEb3dubG9hZGluZyB0aGUgZGF0YSBmb3IgdGhlIGFzc2lnbm1lbnQKCk9LLiBUaGUgY29kZSBiZWxvdyB3aWxsIGRvd25sb2FkIHNvbWUgZGF0YSAqKmZvciB0aGUgY291bnRyeSB5b3UgaGF2ZSBjaG9zZW4qKgoKPGJyPgoKMS4gRmlyc3QsIHdlIGhhdmUgdG8gc2V0IHNvbWUgcGFyYW1ldGVycyB0byBzYXkgdG8gdGhlIGBldXJvc3RhdGAgcGFja2FnZSBBUEkgd2hpY2ggc2VyaWVzIHdlIHdhbnQgdG8gZG93bmxvYWQKCmBgYHtyfQpnZW9fZiA8LSBteV9jb3VudHJ5CnNfYWRqX2YgPC0gYygiU0NBIikgICAgICMtIFNlYXNvbmFsbHkgYW5kIGNhbGVuZGFyIGFkanVzdGVkIGRhdGEKdW5pdF9mICA8LSBjKCAiQ1BfTUVVUiIgLCAiUEQwNV9FVVIiLCAiQ0xWX0kxMCIgKSAgICAgIy0gdW5pdHM6IENQX01FVVJbQ3VycmVudCBwcmljZXMsIG1pbGxpb24gZXVyb10sIFBEMDVfRVVSW1ByaWNlIGluZGV4IChpbXBsaWNpdCBkZWZsYXRvciksIDIwMDU9MTAwLCBldXJvXSwgQ0xWX0kxMFtDaGFpbiBsaW5rZWQgdm9sdW1lcywgaW5kZXggMjAxMD0xMDBdCm5hX2l0ZW1fZiA8LWMoIkIxR1EiKSAgICAjLSBlY29ub21pYyBzZXJpZXMuIEIxR1E6IEdyb3NzIGRvbWVzdGljIHByb2R1Y3QgYXQgbWFya2V0IHByaWNlcwpmaWx0cm9zIDwtIGxpc3QoZ2VvID0gZ2VvX2YsIG5hX2l0ZW0gPSBuYV9pdGVtX2YgLCB1bml0ID0gdW5pdF9mLCBzX2FkaiA9IHNfYWRqX2YpCmBgYAoKPGJyPgoKCjIuIEFscmVhZHkgZG93bmxvYWRpbmcgdGhlIGRhdGEgZm9yIHRoZSBjb3VudHJ5IHlvdSBoYXZlIGNob3NlbiAoYG15X2NvdW50cnlgKQoKYGBge3J9CmRmX2wgPC0gZ2V0X2V1cm9zdGF0KCJuYW1xXzEwX2dkcCIsIGZpbHRlcnMgPSBmaWx0cm9zLCB0eXBlID0gImxhYmVsIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYsICAgc2VsZWN0X3RpbWUgPSAnUScpICAgIy0gZGF0YSB3aXRoIGxhYmVscwpkZiA8LSBnZXRfZXVyb3N0YXQoIm5hbXFfMTBfZ2RwIiwgZmlsdGVycyA9IGZpbHRyb3MsIHR5cGUgPSAiY29kZSIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGLCAgIHNlbGVjdF90aW1lID0gJ1EnKSAgICMtICBkYXRhIHdpdGggY29kZXMKYGBgCgo8YnI+CgoKMy4gIkNsZWFuaW5nIiB0aGUgZGF0YSBmb3IgdGhlIGNvdW50cnkgY2hvc2VuCgpgYGB7cn0KIy0gdGhlIGRhdGEgYXJlIGluIGxvbmcgZm9ybWF0OiBjb252ZXJ0aW5nIHRvIHRoZSB3aWRlIChtb3JlIHRyYWRpdGlvbmFsKSBmb3JtYXQKZGZfbGEgPC0gZGZfbCAlPiUgdGlkeXI6OnNwcmVhZCh1bml0LCB2YWx1ZXMpCmRmYSAgIDwtIGRmICAgJT4lIHRpZHlyOjpzcHJlYWQodW5pdCwgdmFsdWVzKQoKIy0gR2V0dGluZyB0aGUgcmFuZ2Ugb2YgYXZhaWxhYmxlIGRhdGEgKG5vbi1OQSBvYnNlcnZhdGlvbnMpCmZpcnN0IDwtIG1pbih3aGljaCghaXMubmEoZGZhWyw1XSkpKSAgIy0gZmlyc3Qgbm9uLU5BIG9ic2VydmF0aW9uCmxhc3QgPC0gbWF4KHdoaWNoKCFpcy5uYShkZmFbLDVdKSkpICAgIy0gbGFzdCBub24tTkEgb2JzZXJ2YXRpb24KZGF0YV9jIDwtIGRmYVtmaXJzdDpsYXN0LDQ6N10gICMtIGdldHRpbmcgb25seSB0aGUgdmFsaWQgb2JzZXJ2YXRpb25zIG9mIHRoZSBsYXN0IDMgY29sdW1ucyAoNDo2KQoKIy0gUmVuYW1pbmcgJiB0cmFuc2Zvcm1pbmcgdGhlIHNlcmllcwpkYXRhX2MgPC0gZGF0YV9jICU+JSByZW5hbWUoR0RQID0gQ1BfTUVVUiwgRGVmID0gUEQwNV9FVVIsIFZvbCA9IENMVl9JMTApICAgIy0gcmVuYW1pbmcgb3VyIGRhdGEKZGF0YV9jIDwtIGRhdGFfYyAlPiUgbXV0YXRlKEdEUHIgPSBHRFAvRGVmKjEwMCkgICAgICAgICAgICAgICMtIHJlYWwgR0RQCmRhdGFfYyA8LSBkYXRhX2MKYGBgCgo8YnI+CgoKbGV0J3Mgc2VlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgZGF0YS5mcmFtZSBgZGF0YV9jYAoKYGBge3J9CmRhdGFfYyAlPiUgIHNsaWNlKDEsIG5yb3coZGF0YV9jKSkgJT4lIGd0OjpndCgpCmBgYAoKPGJyPgoKCjQuIERvdyBsb2FkaW5nIGRhdGEgZm9yIHRoZSBFVTE1CgoKYGBge3J9Cmdlb19mICAgPC0gYygiRVUxNSIpICAgICAgIy0gY291bnRyaWVzOiBFVTE1CmZpbHRyb3MgPC0gbGlzdChnZW8gPSBnZW9fZiwgbmFfaXRlbSA9IG5hX2l0ZW1fZiAsIHVuaXQgPSB1bml0X2YsIHNfYWRqID0gc19hZGpfZikKZGZfbCA8LSBnZXRfZXVyb3N0YXQoIm5hbXFfMTBfZ2RwIiwgZmlsdGVycyA9IGZpbHRyb3MsIHR5cGUgPSAibGFiZWwiLCBzdHJpbmdzQXNGYWN0b3JzID0gRiwgICBzZWxlY3RfdGltZSA9ICdRJykgICAjLSBkYXRhIHdpdGggbGFiZWxzCmRmIDwtIGdldF9ldXJvc3RhdCgibmFtcV8xMF9nZHAiLCBmaWx0ZXJzID0gZmlsdHJvcywgdHlwZSA9ICJjb2RlIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYsICAgc2VsZWN0X3RpbWUgPSAnUScpICAgIy0gIGRhdGEgd2l0aCBjb2RlcwpkZl9sIDwtIGRmX2wgJT4lIHRpZHlyOjpzcHJlYWQodW5pdCwgdmFsdWVzKQpkZiAgIDwtIGRmICAgJT4lIHRpZHlyOjpzcHJlYWQodW5pdCwgdmFsdWVzKQpkYXRhXzE1IDwtIGRmW2ZpcnN0Omxhc3QsNDo3XSAgIy0gZ2V0dGluZyBvbmx5IHRoZSB2YWxpZCBvYnNlcnZhdGlvbnMgb2YgdGhlIGxhc3QgMyBjb2x1bW5zICg0OjYpCmRhdGFfMTUgPC0gZGF0YV8xNSAlPiUgcmVuYW1lKEdEUF8xNSA9IENQX01FVVIsIERlZl8xNSA9IFBEMDVfRVVSLCBWb2xfMTUgPSBDTFZfSTEwKSAgICMtIHJlbmFtaW5nIG91ciBkYXRhCmRhdGFfMTUgPC0gZGF0YV8xNSAlPiUgbXV0YXRlKEdEUHJfMTUgPSBHRFBfMTUvRGVmXzE1KjEwMCkgICAgICAgICAgICAgICMtIHJlYWwgR0RQCiNkYXRhXzE1IDwtICBkYXRhXzE1WywtMV0gICMtIHJlbW92aW5nIGZpcnN0IGNvbHVtbgpgYGAKCjxicj4KCmxldCdzIHNlZSB3aGF0IHdlIGhhdmUgaW4gdGhlIGRhdGEuZnJhbWUgYGRhdGFfMTVgCgpgYGB7cn0KZGF0YV8xNSAlPiUgc2xpY2UoMSwgbnJvdyhkYXRhXzE1KSkgJT4lIGd0OjpndCgpCmBgYAoKPGJyPgoKNC4gRG93bmxvYWRpbmcgZGF0YSBmb3IgdGhlIFVTCgpgYGB7cn0KZ2VvX2YgICA8LSBjKCJVUyIpICAgICAgIy0gY291bnRyaWVzOiBVUwpuYV9pdGVtX2YgPC0gYygiQjFHUSIsICJQRDA1X05BQyIpICAgICMtIGVjb25vbWljIHNlcmllcy4gQjFHUTogR3Jvc3MgZG9tZXN0aWMgcHJvZHVjdCBhdCBtYXJrZXQgcHJpY2VzCmZpbHRyb3MgPC0gbGlzdChnZW8gPSBnZW9fZiwgbmFfaXRlbSA9IG5hX2l0ZW1fZiAsICBzX2FkaiA9IHNfYWRqX2YpCmRmX2wgPC0gZ2V0X2V1cm9zdGF0KCJuYWlkcV8xMF9nZHAiLCBmaWx0ZXJzID0gZmlsdHJvcywgdHlwZSA9ICJsYWJlbCIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGLCAgIHNlbGVjdF90aW1lID0gJ1EnKSAgICMtIGRhdGEgd2l0aCBsYWJlbHMKZGYgPC0gZ2V0X2V1cm9zdGF0KCJuYWlkcV8xMF9nZHAiLCBmaWx0ZXJzID0gZmlsdHJvcywgdHlwZSA9ICJjb2RlIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYsICAgc2VsZWN0X3RpbWUgPSAnUScpICAgIy0gIGRhdGEgd2l0aCBjb2RlcwpkZl9sIDwtIGRmX2wgJT4lIHRpZHlyOjpzcHJlYWQodW5pdCwgdmFsdWVzKQpkZiAgIDwtIGRmICAgJT4lIHRpZHlyOjpzcHJlYWQodW5pdCwgdmFsdWVzKQpkYXRhX3VzIDwtIGRmW2ZpcnN0Omxhc3QsYyg0LDUsOSwxMCldICAjLSBnZXR0aW5nIHRoZSBkYXRhIHdlIG5lZWQKZGF0YV91cyA8LSBkYXRhX3VzICU+JSByZW5hbWUoR0RQX3VzID0gQ1BfTU5BQywgR0RQX3VzX2UgPSBDUF9NRVVSLCBWb2xfdXMgPSBDTFZfSTEwKSAgICMtIHJlbmFtaW5nIG91ciBkYXRhCmRhdGFfdXMgPC0gZGF0YV91cyAlPiUgbXV0YXRlKHRjX2VfZCA9IEdEUF91cy9HRFBfdXNfZSkgICAgICAgICAgICAgICMtIGV4Y2hhbmdlIHJhdGUKI2RhdGFfdXMgPC0gIGRhdGFfdXNbLC0xXSAgIy0gcmVtb3ZpbmcgZmlyc3QgY29sdW1uCmBgYAoKPGJyPgoKbGV0J3Mgc2VlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgZGF0YS5mcmFtZSBgZGF0YV91c2AKCmBgYHtyfQpkYXRhX3VzICU+JSBzbGljZSgxLCBucm93KGRhdGFfdXMpKSAlPiUgZ3Q6Omd0KCkKYGBgCgo8YnI+CgotLS0tLS0tLS0tLS0tLS0tLS0KCjxicj4KCiMgMy4gTWVyZ2luZyB0aGUgZGF0YQoKV2UgaGF2ZSBkb3dubG9hZCBkYXRhIGZvciB0aGUgY291bnRyeSB5b3UgaGF2ZSBjaG9zZW4sIGZvciBFMTUsIGFuZCBmb3IgdGhlIFVTLiBXZSBoYXZlIHRvIGpvaW4gdGhlIGRhdGEgaW4gYSB1bmlxdWUgZGF0YS5mcmFtZS4gQnV0IHRoZXkgaGF2ZSB0byBzaGFyZSB0aGUgc2FtZSBzYW1wbGUuCgoKCmBgYHtyfQpkZiA8LSBmdWxsX2pvaW4oZGF0YV9jLCBkYXRhXzE1LCBieSA9IGMoInRpbWUiID0gInRpbWUiKSkgIy0gbWVyZ2luZyBkZl9jIHdpdGggZGZfMTUKZGYgPC0gZnVsbF9qb2luKGRmLCBkYXRhX3VzLCBieSA9IGMoInRpbWUiID0gInRpbWUiKSkKYGBgCgoKR29vZCwgd2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YSB3ZSBuZWVkIGluIG9uZSBkYXRhLmZyYW1lLiBXZSBoYXZlIHRvIHNhdmUgaXQgYmVjYXVzZSB5b3Ugd2lsbCBkbyB5b3VyIGFzc2lnbm1lbnQgd2l0aCB0aGlzIGRhdGEKCjxicj4KCi0tLS0tLS0tLS0tLS0tLQoKPGJyPgoKCiMgNC4gU2F2aW5nIHRoZSBkYXRhIGluIGEgZmlsZQoKRm9yIGV4YW1wbGUgd2UgY2FuIHNhdmUgdGhlIGRhdGEgaW4gLmNzdiBmb3JtYXQ6CgoKYGBge3J9CiMtIGV4cG9ydGluZyBkZiBhcyBhIC5jc3YgZmlsZS4gVGhlIGZvbGx3aW5nIDIgbGluZXMgb2YgY29kZSBtYWtlIHRoZSBzYW1lCiMgd3JpdGVfY3N2KGRmLCAibXlfZGF0YV9FUy5jc3YiKSAgICAgICAgICAgICAgICAgICAgICAgICAjLSBzYXZpbmcgZGYgYXMgY3N2IAojIHdyaXRlX2NzdihkZiwgcGFzdGUwKCJteV9kYXRhXyIsIG15X2NvdW50cnksICIuY3N2IikpICAgIy0gc2F2aW5nIGRmIGFzIGNzdgpgYGAKCjxicj4KCgpPciBpbiAucmRzIGZvcm1hdAoKCgpgYGB7cn0KIy0gc2F2aW5nIGRmIGFzIGEgLnJkcyBmaWxlCiMgd3JpdGVfY3N2KGRmLCBwYXN0ZTAoIm15X2RhdGFfIiwgbXlfY291bnRyeSwgIi5yZHMiKSkgICMtIHNhdmluZyBkZiBhcyByZHMKYGBgCgoKUGxlYXNlICoqdW5jb21tZW50IHRoZSB0d28gcHJldmlvdXMgY2h1bmtzKiogdG8gZWZmZWN0aXZlbHkgc2F2ZSB5b3VyIGRhdGEgYmVjYXVzZSB5b3UgYXJlIGdvaW5nIHRvIG5lZWQgaXQgZm9yIHlvdXIgYXNzaWdubWVudAoKPGJyPjxicj48YnI+PGJyPgoK