require(ggplot2)
require(plotly)
require(plyr)
load("covid19sel.rda")

1. Progression of cases (corrected by population)

micolor <- c("blue","brown", "green","red", "cyan", "pink")
g1 <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=Date,y=TotalConfCases*10^6/pop,color=Country),size=1) +
  geom_point(aes(x=Date,y=TotalConfCases*10^6/pop,color=Country),size=1) +
  scale_color_manual(values=micolor) +
  ylab("Total Confirmed Cases (by Mhab)") +
  ggtitle("Covid-19: Total Confirmed cases", subtitle="(data: WHO reports)")
#print(g1)
ggplotly(g1,autosize = F, width = 800, height = 400)

Italy, Spain and Switzerland keep the rapid progress of cases. UK keeps a more moderate increase than the rest, Germany seems to have controlled the change to a faster increase experienced 3 days ago. France experiences a change of slope after a long period of steady progress.

g1b <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=as.numeric(dso),y=TotalConfCases*10^6/pop,color=Country),size=1) +
  geom_point(aes(x=as.numeric(dso),y=TotalConfCases*10^6/pop,color=Country),size=1) +
  scale_color_manual(values=micolor) +
  ylab("Total Confirmed Cases (by Mhab)") + 
  xlab("Days since outbreak") +
  ggtitle("Covid-19: Total Confirmed cases", subtitle="(data: WHO reports)")
#print(g1b)
ggplotly(g1b,autosize = F, width = 800, height = 400)

NA

Spain, Switzerland and Italy follow a different pattern than that of France, UK and Germany. Interesting the case of Switzerland, perhaps caused by the relatively higher weight of metropolitan population in a small country?

g5a <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths,label3=Date)) +
  geom_line(aes(x=Date,y=TotalConfNewCases*10^6/pop,color=Country),size=1) +
  geom_point(aes(x=Date,y=TotalConfNewCases*10^6/pop,color=Country),size=1)+
  scale_color_manual(values=micolor)+
  ylab("New Cases") + xlab ("Date") +
  ggtitle("Covid-19: New cases (by Million of habitants)", subtitle="(data: WHO reports)")
#print(g5a)
ggplotly(g5a,autosize = F, width = 800, height = 400)

Growth of new cases abruptely increased in Spain in the last week, but seems to be decreasing now.

g5b <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths,label3=Date)) +
  geom_line(aes(x=Date,y=TotalConfNewCases*100/TotalConfCases,color=Country),size=1) +
  geom_point(aes(x=Date,y=TotalConfNewCases*100/TotalConfCases,color=Country),size=1)+
  scale_color_manual(values=micolor)+
  ylab("New Cases (%)") + xlab ("Date") +
  ggtitle("Covid-19: New cases (by Total Confirmed Cases)", subtitle="(data: WHO reports)")
#print(g5b)
ggplotly(g5b,autosize = F, width = 800, height = 400)

The Rate of New cases decreases in the long term, but very slowly.

n <- length(unique(covid19sel$Date))
#g5c <- ggplot(data=covid19sel) +
#  geom_line(aes(x=Date[-1],y=TotalConfNewCases[-1]*100/TotalConfCases[-n],color=Country),size=1) +
#  geom_point(aes(x=Date[-1],y=TotalConfNewCases[-1]*100/TotalConfCases[-n],color=Country),size=1)+
#  scale_color_manual(values=micolor)+
#  ylab("Rate of New Cases (%)") + xlab ("Date") +
#  ggtitle("Covid-19: Rate of New cases (by Total Confirmed Cases)", subtitle="(data: WHO reports)")
##print(g5c)
#ggplotly(g5c,autosize = F, width = 800, height = 400)

2. Progression of total Deaths (corrected by population)

g2 <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=Date,y=TotalDeaths*10^6/pop,color=Country),size=1) +
  geom_point(aes(x=Date,y=TotalDeaths*10^6/pop,color=Country),size=1)+
  scale_color_manual(values=micolor)+
  ylab("Total Deaths (by Mhab)") +
  ggtitle("Covid-19: Relative Total Deaths", subtitle="(data: WHO reports)")
#print(g2)
ggplotly(g2,autosize = F, width = 800, height = 400)

Total deaths much higher in Italy and Spain (actually grwing faster in Spain now). Germany still very stable.

g2b <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=as.numeric(dso),y=TotalDeaths*10^6/pop,color=Country),size=1) +
  geom_point(aes(x=as.numeric(dso),y=TotalDeaths*10^6/pop,color=Country),size=1)+
  scale_color_manual(values=micolor)+
  ylab("Total Deaths (by Mhab)") +
  xlab("Days since outbreak") +
  ggtitle("Covid-19: Relative Total Deaths", subtitle="(data: WHO reports)")
#print(g2)
ggplotly(g2b,autosize = F, width = 800, height = 400)

NA

3. Naive Case Fatality Rate

g3 <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=Date,y=TotalDeaths*100/TotalConfCases,color=Country),size=1) +
  geom_point(aes(x=Date,y=TotalDeaths*100/TotalConfCases,color=Country),size=1)+
  scale_color_manual(values=micolor) +
  ylab("Total Deaths/Total Cases (%)") +
  ggtitle("Covid-19: Naive Case Fatality Rate", subtitle="(data: WHO reports)")
#print(g3)
ggplotly(g3,autosize = F, width = 800, height = 400)

Note: Naive Case Fatality Rate (NCFR=Nb Deaths/Nb Cases) is a biased estimator of the true CFR (see https://www.worldometers.info/coronavirus/coronavirus-death-rate/#correct). I keep it as a valid metric for comparative purposes.
NCFR is growing in all countries except Germany and Switzerland. After an initially high NCFR in France (probably caused by the instability of very low initial values), France, Spain, Switzerland and UK converged on 2020-03-06, Spain and France started a worrying raise in 2020-03-06 that levelled off in France but has recentely increased. NCFR is irregularly increasing in Spain, which is approaching the line of Italy. NCFR increases in the UK almost as in Spain. NCFR in Italy is higher than the rest and still keeps a growing trend. Switzerland and, notably, Germany are able to keep a very low Nb. of Deaths despite having a similar number of cases.

g3b <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths)) +
  geom_line(aes(x=as.numeric(dso),y=TotalDeaths*100/TotalConfCases,color=Country),size=1) +
  geom_point(aes(x=as.numeric(dso),y=TotalDeaths*100/TotalConfCases,color=Country),size=1)+
  scale_color_manual(values=micolor) +
  xlab("Days since outbreak") +
  ylab("Total Deaths/Total Cases (%)") +
  ggtitle("Covid-19: Naive Case Fatality Rate", subtitle="(data: WHO reports)")
#print(g3b)
ggplotly(g3b,autosize = F, width = 800, height = 400)

4. Naive Case Fatality Rate vs Total cases

g4 <- ggplot(data=covid19sel,aes(label1=TotalConfCases,label2=TotalDeaths,label3=Date)) +
  geom_line(aes(x=TotalConfCases,y=TotalDeaths*100/TotalConfCases,color=Country),size=1) +
  geom_point(aes(x=TotalConfCases,y=TotalDeaths*100/TotalConfCases,color=Country),size=1)+
  scale_color_manual(values=micolor) +
  ylab("Total Deaths/Total Cases (%)") + xlab ("Total Confirmed Cases") +
  ggtitle("Covid-19: Naive Case Fatality Rate", subtitle="(data: WHO reports)")
#print(g4)
ggplotly(g4,autosize = F, width = 800, height = 400)

Note: Naive Case Fatality Rate (NCFR=Nb Deaths/Nb Cases) is a biased estimator of the true CFR (see https://www.worldometers.info/coronavirus/coronavirus-death-rate/#correct). I keep it as a valid metric for comparative purposes.

It is notorious the increase of NCFR in Italy, Spain and France as the Nb. of cases increases. After a more stable trend, France now follows the pattern of Italy and even Switzerland follows this growing trend albeit at lower values. Germany is still able to keep an amazingly low Nb. of Deaths despite having a similar number of cases than Spain or France, with a very moderate increase. NCFR drastically increases in the UK despite its low number of cases.

LS0tDQp0aXRsZTogJ0NvdmlkLTE5OiBDb21wYXJhdGl2ZSBHcmFwaGljcyBpbiA2IGtleSBFdXJvcGVhbiBjb3VudHJpZXMnDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQotLS0NCmBgYHtyfQ0KcmVxdWlyZShnZ3Bsb3QyKQ0KcmVxdWlyZShwbG90bHkpDQpyZXF1aXJlKHBseXIpDQpsb2FkKCJjb3ZpZDE5c2VsLnJkYSIpDQpgYGANCg0KKiBhbG9ib2FsZXVAZ21haWwuY29tDQoqIERhdGEgZnJvbSBbV0hPIHJlcG9ydHNdIChodHRwczovL3d3dy53aG8uaW50L2VtZXJnZW5jaWVzL2Rpc2Vhc2VzL25vdmVsLWNvcm9uYXZpcnVzLTIwMTkvc2l0dWF0aW9uLXJlcG9ydHMpDQogICogTGFzdCByZXBvcnQ6IDIwMjAwMzMwLXNpdHJlcC03MC1jb3ZpZC0xOS5wZGYgKERhdGEgYXMgcmVwb3J0ZWQgYnkgbmF0aW9uYWwgYXV0aG9yaXRpZXMgYnkgKioxMEFNIENFVCAzMCBNYXJjaCAyMDIwKiopDQoNCiMjIDEuIFByb2dyZXNzaW9uIG9mIGNhc2VzIChjb3JyZWN0ZWQgYnkgcG9wdWxhdGlvbikNCg0KYGBge3J9DQptaWNvbG9yIDwtIGMoImJsdWUiLCJicm93biIsICJncmVlbiIsInJlZCIsICJjeWFuIiwgInBpbmsiKQ0KZzEgPC0gZ2dwbG90KGRhdGE9Y292aWQxOXNlbCxhZXMobGFiZWwxPVRvdGFsQ29uZkNhc2VzLGxhYmVsMj1Ub3RhbERlYXRocykpICsNCiAgZ2VvbV9saW5lKGFlcyh4PURhdGUseT1Ub3RhbENvbmZDYXNlcyoxMF42L3BvcCxjb2xvcj1Db3VudHJ5KSxzaXplPTEpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1EYXRlLHk9VG90YWxDb25mQ2FzZXMqMTBeNi9wb3AsY29sb3I9Q291bnRyeSksc2l6ZT0xKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikgKw0KICB5bGFiKCJUb3RhbCBDb25maXJtZWQgQ2FzZXMgKGJ5IE1oYWIpIikgKw0KICBnZ3RpdGxlKCJDb3ZpZC0xOTogVG90YWwgQ29uZmlybWVkIGNhc2VzIiwgc3VidGl0bGU9IihkYXRhOiBXSE8gcmVwb3J0cykiKQ0KI3ByaW50KGcxKQ0KZ2dwbG90bHkoZzEsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCkl0YWx5LCBTcGFpbiBhbmQgU3dpdHplcmxhbmQga2VlcCB0aGUgcmFwaWQgcHJvZ3Jlc3Mgb2YgY2FzZXMuIFVLIGtlZXBzIGEgbW9yZSBtb2RlcmF0ZSBpbmNyZWFzZSB0aGFuIHRoZSByZXN0LCBHZXJtYW55IHNlZW1zIHRvIGhhdmUgY29udHJvbGxlZCB0aGUgY2hhbmdlIHRvIGEgZmFzdGVyIGluY3JlYXNlIGV4cGVyaWVuY2VkIDMgZGF5cyBhZ28uIEZyYW5jZSBleHBlcmllbmNlcyBhIGNoYW5nZSBvZiBzbG9wZSBhZnRlciBhIGxvbmcgcGVyaW9kIG9mIHN0ZWFkeSBwcm9ncmVzcy4NCg0KDQpgYGB7cn0NCmcxYiA8LSBnZ3Bsb3QoZGF0YT1jb3ZpZDE5c2VsLGFlcyhsYWJlbDE9VG90YWxDb25mQ2FzZXMsbGFiZWwyPVRvdGFsRGVhdGhzKSkgKw0KICBnZW9tX2xpbmUoYWVzKHg9YXMubnVtZXJpYyhkc28pLHk9VG90YWxDb25mQ2FzZXMqMTBeNi9wb3AsY29sb3I9Q291bnRyeSksc2l6ZT0xKSArDQogIGdlb21fcG9pbnQoYWVzKHg9YXMubnVtZXJpYyhkc28pLHk9VG90YWxDb25mQ2FzZXMqMTBeNi9wb3AsY29sb3I9Q291bnRyeSksc2l6ZT0xKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikgKw0KICB5bGFiKCJUb3RhbCBDb25maXJtZWQgQ2FzZXMgKGJ5IE1oYWIpIikgKyANCiAgeGxhYigiRGF5cyBzaW5jZSBvdXRicmVhayIpICsNCiAgZ2d0aXRsZSgiQ292aWQtMTk6IFRvdGFsIENvbmZpcm1lZCBjYXNlcyIsIHN1YnRpdGxlPSIoZGF0YTogV0hPIHJlcG9ydHMpIikNCiNwcmludChnMWIpDQpnZ3Bsb3RseShnMWIsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANClNwYWluLCBTd2l0emVybGFuZCAgYW5kIEl0YWx5IGZvbGxvdyBhIGRpZmZlcmVudCBwYXR0ZXJuIHRoYW4gdGhhdCBvZiBGcmFuY2UsIFVLIGFuZCBHZXJtYW55LiBJbnRlcmVzdGluZyB0aGUgY2FzZSBvZiBTd2l0emVybGFuZCwgcGVyaGFwcyBjYXVzZWQgYnkgdGhlIHJlbGF0aXZlbHkgaGlnaGVyIHdlaWdodCBvZiBtZXRyb3BvbGl0YW4gcG9wdWxhdGlvbiBpbiBhIHNtYWxsIGNvdW50cnk/DQoNCmBgYHtyfQ0KZzVhIDwtIGdncGxvdChkYXRhPWNvdmlkMTlzZWwsYWVzKGxhYmVsMT1Ub3RhbENvbmZDYXNlcyxsYWJlbDI9VG90YWxEZWF0aHMsbGFiZWwzPURhdGUpKSArDQogIGdlb21fbGluZShhZXMoeD1EYXRlLHk9VG90YWxDb25mTmV3Q2FzZXMqMTBeNi9wb3AsY29sb3I9Q291bnRyeSksc2l6ZT0xKSArDQogIGdlb21fcG9pbnQoYWVzKHg9RGF0ZSx5PVRvdGFsQ29uZk5ld0Nhc2VzKjEwXjYvcG9wLGNvbG9yPUNvdW50cnkpLHNpemU9MSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikrDQogIHlsYWIoIk5ldyBDYXNlcyIpICsgeGxhYiAoIkRhdGUiKSArDQogIGdndGl0bGUoIkNvdmlkLTE5OiBOZXcgY2FzZXMgKGJ5IE1pbGxpb24gb2YgaGFiaXRhbnRzKSIsIHN1YnRpdGxlPSIoZGF0YTogV0hPIHJlcG9ydHMpIikNCiNwcmludChnNWEpDQpnZ3Bsb3RseShnNWEsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQpHcm93dGggb2YgbmV3IGNhc2VzIGFicnVwdGVseSBpbmNyZWFzZWQgaW4gU3BhaW4gaW4gdGhlIGxhc3Qgd2VlaywgYnV0IHNlZW1zIHRvIGJlIGRlY3JlYXNpbmcgbm93Lg0KDQoNCmBgYHtyfQ0KZzViIDwtIGdncGxvdChkYXRhPWNvdmlkMTlzZWwsYWVzKGxhYmVsMT1Ub3RhbENvbmZDYXNlcyxsYWJlbDI9VG90YWxEZWF0aHMsbGFiZWwzPURhdGUpKSArDQogIGdlb21fbGluZShhZXMoeD1EYXRlLHk9VG90YWxDb25mTmV3Q2FzZXMqMTAwL1RvdGFsQ29uZkNhc2VzLGNvbG9yPUNvdW50cnkpLHNpemU9MSkgKw0KICBnZW9tX3BvaW50KGFlcyh4PURhdGUseT1Ub3RhbENvbmZOZXdDYXNlcyoxMDAvVG90YWxDb25mQ2FzZXMsY29sb3I9Q291bnRyeSksc2l6ZT0xKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1taWNvbG9yKSsNCiAgeWxhYigiTmV3IENhc2VzICglKSIpICsgeGxhYiAoIkRhdGUiKSArDQogIGdndGl0bGUoIkNvdmlkLTE5OiBOZXcgY2FzZXMgKGJ5IFRvdGFsIENvbmZpcm1lZCBDYXNlcykiLCBzdWJ0aXRsZT0iKGRhdGE6IFdITyByZXBvcnRzKSIpDQojcHJpbnQoZzViKQ0KZ2dwbG90bHkoZzViLGF1dG9zaXplID0gRiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KVGhlIFJhdGUgb2YgTmV3IGNhc2VzIGRlY3JlYXNlcyBpbiB0aGUgbG9uZyB0ZXJtLCBidXQgdmVyeSBzbG93bHkuDQoNCmBgYHtyfQ0KbiA8LSBsZW5ndGgodW5pcXVlKGNvdmlkMTlzZWwkRGF0ZSkpDQojZzVjIDwtIGdncGxvdChkYXRhPWNvdmlkMTlzZWwpICsNCiMgIGdlb21fbGluZShhZXMoeD1EYXRlWy0xXSx5PVRvdGFsQ29uZk5ld0Nhc2VzWy0xXSoxMDAvVG90YWxDb25mQ2FzZXNbLW5dLGNvbG9yPUNvdW50cnkpLHNpemU9MSkgKw0KIyAgZ2VvbV9wb2ludChhZXMoeD1EYXRlWy0xXSx5PVRvdGFsQ29uZk5ld0Nhc2VzWy0xXSoxMDAvVG90YWxDb25mQ2FzZXNbLW5dLGNvbG9yPUNvdW50cnkpLHNpemU9MSkrDQojICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1pY29sb3IpKw0KIyAgeWxhYigiUmF0ZSBvZiBOZXcgQ2FzZXMgKCUpIikgKyB4bGFiICgiRGF0ZSIpICsNCiMgIGdndGl0bGUoIkNvdmlkLTE5OiBSYXRlIG9mIE5ldyBjYXNlcyAoYnkgVG90YWwgQ29uZmlybWVkIENhc2VzKSIsIHN1YnRpdGxlPSIoZGF0YTogV0hPIHJlcG9ydHMpIikNCiMjcHJpbnQoZzVjKQ0KI2dncGxvdGx5KGc1YyxhdXRvc2l6ZSA9IEYsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQojIyAyLiBQcm9ncmVzc2lvbiBvZiB0b3RhbCBEZWF0aHMgKGNvcnJlY3RlZCBieSBwb3B1bGF0aW9uKQ0KDQpgYGB7cn0NCmcyIDwtIGdncGxvdChkYXRhPWNvdmlkMTlzZWwsYWVzKGxhYmVsMT1Ub3RhbENvbmZDYXNlcyxsYWJlbDI9VG90YWxEZWF0aHMpKSArDQogIGdlb21fbGluZShhZXMoeD1EYXRlLHk9VG90YWxEZWF0aHMqMTBeNi9wb3AsY29sb3I9Q291bnRyeSksc2l6ZT0xKSArDQogIGdlb21fcG9pbnQoYWVzKHg9RGF0ZSx5PVRvdGFsRGVhdGhzKjEwXjYvcG9wLGNvbG9yPUNvdW50cnkpLHNpemU9MSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikrDQogIHlsYWIoIlRvdGFsIERlYXRocyAoYnkgTWhhYikiKSArDQogIGdndGl0bGUoIkNvdmlkLTE5OiBSZWxhdGl2ZSBUb3RhbCBEZWF0aHMiLCBzdWJ0aXRsZT0iKGRhdGE6IFdITyByZXBvcnRzKSIpDQojcHJpbnQoZzIpDQpnZ3Bsb3RseShnMixhdXRvc2l6ZSA9IEYsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KVG90YWwgZGVhdGhzIG11Y2ggaGlnaGVyIGluIEl0YWx5IGFuZCBTcGFpbiAoYWN0dWFsbHkgZ3J3aW5nIGZhc3RlciBpbiBTcGFpbiBub3cpLiBHZXJtYW55IHN0aWxsIHZlcnkgc3RhYmxlLg0KYGBge3J9DQpnMmIgPC0gZ2dwbG90KGRhdGE9Y292aWQxOXNlbCxhZXMobGFiZWwxPVRvdGFsQ29uZkNhc2VzLGxhYmVsMj1Ub3RhbERlYXRocykpICsNCiAgZ2VvbV9saW5lKGFlcyh4PWFzLm51bWVyaWMoZHNvKSx5PVRvdGFsRGVhdGhzKjEwXjYvcG9wLGNvbG9yPUNvdW50cnkpLHNpemU9MSkgKw0KICBnZW9tX3BvaW50KGFlcyh4PWFzLm51bWVyaWMoZHNvKSx5PVRvdGFsRGVhdGhzKjEwXjYvcG9wLGNvbG9yPUNvdW50cnkpLHNpemU9MSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikrDQogIHlsYWIoIlRvdGFsIERlYXRocyAoYnkgTWhhYikiKSArDQogIHhsYWIoIkRheXMgc2luY2Ugb3V0YnJlYWsiKSArDQogIGdndGl0bGUoIkNvdmlkLTE5OiBSZWxhdGl2ZSBUb3RhbCBEZWF0aHMiLCBzdWJ0aXRsZT0iKGRhdGE6IFdITyByZXBvcnRzKSIpDQojcHJpbnQoZzIpDQpnZ3Bsb3RseShnMmIsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCiMjIDMuIE5haXZlIENhc2UgRmF0YWxpdHkgUmF0ZQ0KYGBge3J9DQpnMyA8LSBnZ3Bsb3QoZGF0YT1jb3ZpZDE5c2VsLGFlcyhsYWJlbDE9VG90YWxDb25mQ2FzZXMsbGFiZWwyPVRvdGFsRGVhdGhzKSkgKw0KICBnZW9tX2xpbmUoYWVzKHg9RGF0ZSx5PVRvdGFsRGVhdGhzKjEwMC9Ub3RhbENvbmZDYXNlcyxjb2xvcj1Db3VudHJ5KSxzaXplPTEpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1EYXRlLHk9VG90YWxEZWF0aHMqMTAwL1RvdGFsQ29uZkNhc2VzLGNvbG9yPUNvdW50cnkpLHNpemU9MSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWljb2xvcikgKw0KICB5bGFiKCJUb3RhbCBEZWF0aHMvVG90YWwgQ2FzZXMgKCUpIikgKw0KICBnZ3RpdGxlKCJDb3ZpZC0xOTogTmFpdmUgQ2FzZSBGYXRhbGl0eSBSYXRlIiwgc3VidGl0bGU9IihkYXRhOiBXSE8gcmVwb3J0cykiKQ0KI3ByaW50KGczKQ0KZ2dwbG90bHkoZzMsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCioqTm90ZToqKiBOYWl2ZSBDYXNlIEZhdGFsaXR5IFJhdGUgKE5DRlI9TmIgRGVhdGhzL05iIENhc2VzKSBpcyBhIGJpYXNlZCBlc3RpbWF0b3Igb2YgdGhlIHRydWUgDQpDRlIgKHNlZSBodHRwczovL3d3dy53b3JsZG9tZXRlcnMuaW5mby9jb3JvbmF2aXJ1cy9jb3JvbmF2aXJ1cy1kZWF0aC1yYXRlLyNjb3JyZWN0KS4gSSBrZWVwIGl0IGFzIGEgdmFsaWQgbWV0cmljIGZvciBjb21wYXJhdGl2ZSBwdXJwb3Nlcy4gIA0KTkNGUiBpcyBncm93aW5nIGluIGFsbCBjb3VudHJpZXMgZXhjZXB0IEdlcm1hbnkgYW5kIFN3aXR6ZXJsYW5kLiBBZnRlciBhbiBpbml0aWFsbHkgaGlnaCBOQ0ZSIGluIEZyYW5jZSAocHJvYmFibHkgY2F1c2VkIGJ5IHRoZSBpbnN0YWJpbGl0eSBvZiB2ZXJ5IGxvdyBpbml0aWFsIHZhbHVlcyksIEZyYW5jZSwgU3BhaW4sIFN3aXR6ZXJsYW5kIGFuZCBVSyBjb252ZXJnZWQgb24gMjAyMC0wMy0wNiwgU3BhaW4gYW5kIEZyYW5jZSBzdGFydGVkIGEgd29ycnlpbmcgcmFpc2UgaW4gMjAyMC0wMy0wNiB0aGF0IGxldmVsbGVkIG9mZiBpbiBGcmFuY2UgYnV0IGhhcyByZWNlbnRlbHkgaW5jcmVhc2VkLiBOQ0ZSIGlzIGlycmVndWxhcmx5IGluY3JlYXNpbmcgaW4gU3BhaW4sIHdoaWNoIGlzIGFwcHJvYWNoaW5nIHRoZSBsaW5lIG9mIEl0YWx5LiBOQ0ZSIGluY3JlYXNlcyBpbiB0aGUgVUsgYWxtb3N0IGFzIGluIFNwYWluLiBOQ0ZSIGluIEl0YWx5IGlzIGhpZ2hlciB0aGFuIHRoZSByZXN0IGFuZCBzdGlsbCBrZWVwcyBhIGdyb3dpbmcgdHJlbmQuIFN3aXR6ZXJsYW5kIGFuZCwgbm90YWJseSwgR2VybWFueSBhcmUgYWJsZSB0byBrZWVwIGEgdmVyeSBsb3cgTmIuIG9mIERlYXRocyBkZXNwaXRlIGhhdmluZyBhIHNpbWlsYXIgbnVtYmVyIG9mIGNhc2VzLg0KDQpgYGB7cn0NCmczYiA8LSBnZ3Bsb3QoZGF0YT1jb3ZpZDE5c2VsLGFlcyhsYWJlbDE9VG90YWxDb25mQ2FzZXMsbGFiZWwyPVRvdGFsRGVhdGhzKSkgKw0KICBnZW9tX2xpbmUoYWVzKHg9YXMubnVtZXJpYyhkc28pLHk9VG90YWxEZWF0aHMqMTAwL1RvdGFsQ29uZkNhc2VzLGNvbG9yPUNvdW50cnkpLHNpemU9MSkgKw0KICBnZW9tX3BvaW50KGFlcyh4PWFzLm51bWVyaWMoZHNvKSx5PVRvdGFsRGVhdGhzKjEwMC9Ub3RhbENvbmZDYXNlcyxjb2xvcj1Db3VudHJ5KSxzaXplPTEpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1pY29sb3IpICsNCiAgeGxhYigiRGF5cyBzaW5jZSBvdXRicmVhayIpICsNCiAgeWxhYigiVG90YWwgRGVhdGhzL1RvdGFsIENhc2VzICglKSIpICsNCiAgZ2d0aXRsZSgiQ292aWQtMTk6IE5haXZlIENhc2UgRmF0YWxpdHkgUmF0ZSIsIHN1YnRpdGxlPSIoZGF0YTogV0hPIHJlcG9ydHMpIikNCiNwcmludChnM2IpDQpnZ3Bsb3RseShnM2IsYXV0b3NpemUgPSBGLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCiMjIDQuIE5haXZlIENhc2UgRmF0YWxpdHkgUmF0ZSB2cyBUb3RhbCBjYXNlcw0KDQpgYGB7cn0NCmc0IDwtIGdncGxvdChkYXRhPWNvdmlkMTlzZWwsYWVzKGxhYmVsMT1Ub3RhbENvbmZDYXNlcyxsYWJlbDI9VG90YWxEZWF0aHMsbGFiZWwzPURhdGUpKSArDQogIGdlb21fbGluZShhZXMoeD1Ub3RhbENvbmZDYXNlcyx5PVRvdGFsRGVhdGhzKjEwMC9Ub3RhbENvbmZDYXNlcyxjb2xvcj1Db3VudHJ5KSxzaXplPTEpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1Ub3RhbENvbmZDYXNlcyx5PVRvdGFsRGVhdGhzKjEwMC9Ub3RhbENvbmZDYXNlcyxjb2xvcj1Db3VudHJ5KSxzaXplPTEpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1pY29sb3IpICsNCiAgeWxhYigiVG90YWwgRGVhdGhzL1RvdGFsIENhc2VzICglKSIpICsgeGxhYiAoIlRvdGFsIENvbmZpcm1lZCBDYXNlcyIpICsNCiAgZ2d0aXRsZSgiQ292aWQtMTk6IE5haXZlIENhc2UgRmF0YWxpdHkgUmF0ZSIsIHN1YnRpdGxlPSIoZGF0YTogV0hPIHJlcG9ydHMpIikNCiNwcmludChnNCkNCmdncGxvdGx5KGc0LGF1dG9zaXplID0gRiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KKipOb3RlOioqIE5haXZlIENhc2UgRmF0YWxpdHkgUmF0ZSAoTkNGUj1OYiBEZWF0aHMvTmIgQ2FzZXMpIGlzIGEgYmlhc2VkIGVzdGltYXRvciBvZiB0aGUgdHJ1ZSANCkNGUiAoc2VlIGh0dHBzOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvL2Nvcm9uYXZpcnVzL2Nvcm9uYXZpcnVzLWRlYXRoLXJhdGUvI2NvcnJlY3QpLiAgSSBrZWVwIGl0IGFzIGEgdmFsaWQgbWV0cmljIGZvciBjb21wYXJhdGl2ZSBwdXJwb3Nlcy4gIA0KDQpJdCBpcyBub3RvcmlvdXMgdGhlIGluY3JlYXNlIG9mIE5DRlIgaW4gSXRhbHksIFNwYWluIGFuZCBGcmFuY2UgYXMgdGhlIE5iLiBvZiBjYXNlcyBpbmNyZWFzZXMuIEFmdGVyIGEgbW9yZSBzdGFibGUgdHJlbmQsIEZyYW5jZSBub3cgZm9sbG93cyB0aGUgcGF0dGVybiBvZiBJdGFseSBhbmQgZXZlbiBTd2l0emVybGFuZCBmb2xsb3dzIHRoaXMgZ3Jvd2luZyB0cmVuZCBhbGJlaXQgYXQgbG93ZXIgdmFsdWVzLiBHZXJtYW55IGlzIHN0aWxsIGFibGUgdG8ga2VlcCBhbiBhbWF6aW5nbHkgbG93IE5iLiBvZiBEZWF0aHMgZGVzcGl0ZSBoYXZpbmcgYSBzaW1pbGFyIG51bWJlciBvZiBjYXNlcyB0aGFuIFNwYWluIG9yIEZyYW5jZSwgd2l0aCBhIHZlcnkgbW9kZXJhdGUgaW5jcmVhc2UuIE5DRlIgZHJhc3RpY2FsbHkgaW5jcmVhc2VzIGluIHRoZSBVSyBkZXNwaXRlIGl0cyBsb3cgbnVtYmVyIG9mIGNhc2VzLg0KDQo=