LET SEE HOW CONFIRMED CASES ARE DISTRIBUTED ACROSS CHINA AND OTHER PART OF THE WORLD SINCE 100TH CASE OVER DAYS
**Let load data for this analysis which is from “ourworldindata.org”
covid19_confirmed_cases_since_100th_case<-read.csv('covid19_cases.csv')
## now let see strature of the data
str(covid19_confirmed_cases_since_100th_case)
'data.frame': 13332 obs. of 6 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ Entity : Factor w/ 222 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Code : Factor w/ 206 levels "ABW","AFG","AGO",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Date : Factor w/ 110 levels "Apr 1, 2020",..: 19 49 60 71 74 75 76 77 78 79 ...
$ X.cases. : int 0 0 0 0 0 0 0 0 0 0 ...
$ Days.since.the.100th.confirmed.case..days.: int NA NA NA NA NA NA NA NA NA NA ...
##we are interested in Entity,cases and days since 100th case
library(dplyr)
covid_confirmed_cases_since_100th_case<-select(covid19_confirmed_cases_since_100th_case,Entity,X.cases.,Days.since.the.100th.confirmed.case..days.)
##since the data contain misssing value let remove all NA
covid_confirmed_cases_since_100th_case<-na.omit(covid_confirmed_cases_since_100th_case)
str(covid_confirmed_cases_since_100th_case)
'data.frame': 4852 obs. of 3 variables:
$ Entity : Factor w/ 222 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
$ X.cases. : int 106 114 141 166 192 235 235 270 299 337 ...
$ Days.since.the.100th.confirmed.case..days.: int 0 1 2 3 4 5 6 7 8 9 ...
- attr(*, "na.action")= 'omit' Named int 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, "names")= chr "1" "2" "3" "4" ...
##Next we look at China distribution of cases since 100th case
library(ggplot2)
library(ggrepel)
covid19_china_case_since_100th_case<-filter(covid_confirmed_cases_since_100th_case,Entity=='China')
ggplot(covid19_china_case_since_100th_case,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Now let see how cases are distributed per continent and across other countries above China in number of Covid19 cases.
covid19_Africa_cases_since_100th_case<-filter(covid_confirmed_cases_since_100th_case,Entity=='Africa')
covid19_AsiaExcl_China_cases_since_100th_cases<-filter(covid_confirmed_cases_since_100th_case,Entity=='Asia excl. China')
covid19_Europe_cases_since_100th_cases<-filter(covid_confirmed_cases_since_100th_case,Entity=='Europe')
covid19_NorthAmerica_cases_since_100th_case<-filter(covid_confirmed_cases_since_100th_case,Entity=='North America')
covid19_SouthAmerica_cases_since_100th_case<-filter(covid_confirmed_cases_since_100th_case,Entity=='South America')
covid19_Italy<-filter(covid_confirmed_cases_since_100th_case,Entity=='Italy')
covid19_Spain<-filter(covid_confirmed_cases_since_100th_case,Entity=='Spain')
covid19_UK<-filter(covid_confirmed_cases_since_100th_case,Entity=='United Kingdom')
covid19_USA<-filter(covid_confirmed_cases_since_100th_case,Entity=='United States')
covid19_France<-filter(covid_confirmed_cases_since_100th_case,Entity=='France')
##Africa cases
ggplot(covid19_Africa_cases_since_100th_case,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Asia cases excl China
options(scipen = 10000)
ggplot(covid19_AsiaExcl_China_cases_since_100th_cases,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Europe cases
ggplot(covid19_Europe_cases_since_100th_cases,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##North America cases
ggplot(covid19_NorthAmerica_cases_since_100th_case,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##South America cases
ggplot(covid19_SouthAmerica_cases_since_100th_case,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Now let look at the top 5 nations ahead of china which is currently 6 with highest cases
##United States cases
options(scipen = 10000)
ggplot(covid19_USA,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Spain cases
ggplot(covid19_Spain,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##United Kingdom cases
ggplot(covid19_UK,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##France cases
ggplot(covid19_France,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

##Italy cases
ggplot(covid19_Italy,aes(x=Days.since.the.100th.confirmed.case..days.,y=X.cases.),group=1)+geom_line(color='red')

From 1st plot its clear that China started to flatten the curve since 100th case after around 50 days
Africa in less than 40 days since 100th case new cases have gone high upto over 20k
Asia excluding China since 100th case new cases have gone up by more than 200k in less than 70 days
Europe since 100th case new cases have gone up to 1M in less than 60 days
North America since 100th case new infection are now over 600k in less than 50 days
South America since 100th case new infection now stand at over 60k in less than 40 days
Now Let Look How China Compare With Other Nations In Number Of Covid19 Infection Since 100th Case
##United States
Its beeen less than 50 days since USA recorded 100th case of coronavirus but number of new cases have skyrocketed to over 600k with China number standing at 83k in more than 85 days since 100th case
##Spain
Less than 50 days since Spain recorded 100th case with new infection going up to over 150k against China 83k cases in over 85 days since 100th cases
##United Kingdom
UK in less than 50 days since 100th case new infection have reached over 100k against China cases 83k in over 85 days
##France
Less than 50 days since France recorded 100th case but new infection have gone high of over 100k which more than China cases in over 85 days
##Italy
Less than 60 days since 100th case new infection stand at over 170k against China 83k in over 85 days
##Conclusion
First case of covid19 was reported in Wuhan China in late 2019 but it until March that it hit global magnitude probably two months after the fist case, as per John Hopkins University covid19 datasets number of cases globally on 1st of March 2020 was 88.4k while by 29th March number of confirmed cases reached over 720k a differential of 631,600 cases in duration of 29 days translating to 21k new infection cases per day in average worldwide,and it after this reality checked in did leaders and analyst from all walk of life started to raise doubts about actual number of cases in China while despite each country shortcomings on containing corona virus most of the measures put inplace in China have been replicated in almost all situation but numbers continue to rise even further suggesting China may have blindfolded everyone to think that virus was not as infectious as it was with cases standing above 2.2m as of 18th April 2020 from 88.4k in start of March which is less than two months China battled the virus before it hit every corner of the world thus making corona virus a black swan from China with world watching in retrospective review mirror:
LS0tDQp0aXRsZTogIiBDT1ZJRDE5LUEgQ2hpbmVzZSBCbGFjayBTd2FuIFdpdGggV29ybGQgd2F0Y2hpbmcgSW4gUmV0cm9zcGVjdGl2ZSBSZXZpZXcgTWlycm9yOiAgIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpBdXRodXI6ICIgSkFDS1NPTiBNVVJJVEhJIEtJTk9USSAiDQotLS0NCioqVG8gbWFqb3JpdHkgb2YgZ2xvYmFsIHBvcHVsYXRpb24gd29ybGQgYXMgdHVybmVkIHVwc2lkZSBkb3duIGR1ZSB0byBjb3JvbmEgdmlydXMgcGFuZGVtaWMgd2l0aCBldmVyeXRoaW5nIGNvbWluZyB0byBhIHN0YW5kc3RpbGwgaW4ganVzdCBvbmUgbW9tZW50IG9mIHRpbWUqKg0KDQoqQXMgdXN1YWwgZ2FtZXN0YXQyNTQgaXMgYWxsIGFib3V0IG51bWJlcnMgYW5kIGhhdmUgYmVlbiBsb29raW5nIGF0IHZhcmlvdXMgY29yb25hdmlydXMgcmVsYXRlZCBudW1iZXJzIGFuZCBhc2tlZCBteXNlbGYgd2hlcmUgZGlkIHdlIGdvIHdyb25nIHVudGlsbCBJIGNhbWUgYWNyb3NzIEJsYWNrIFN3YW4gdGhlIGltcGFjdCBvZiBoaWdobGx5IGltcHJvYmFibGUgYSBib29rIGJ5IE5pY2hvbGFzIFRhbGViLioNCg0KKipGaXJzdCB3aGF0IGlzIEJsYWNrIFN3YW4gYW5kIHdoeSBkb2VzIGl0IG1hdHRlcj8qKg0KDQoqQWNjb3JkaW5nIHRvIGludmVzdHBlZGlhIGEgYmxhY2sgc3dhbiBpcyBhbiB1bnByZWRpY3RhYmxlIGV2ZW50IHRoYXQgaXMgYmV5b25kIHdoYXQgaXMgbm9ybWFsIGV4cGVjdGVkIG9mIGEgc2l0dWF0aW9uIGFuZCBoYXMgcG90ZW50aWFsbHkgc2V2ZXJlIGNvbnNlcXVlbmNlcyBhbmQgYXJlIHByZWRpY3RhYmxlIGFmdGVyIHRoZSBmYWN0LioNCg0KKkR1cmluZyB0aGlzIHRpbWUgb2YgZ2xvYmFsIHBhbmRlbWljIG9uIGNvcm9uYSB2aXJ1cyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdhcyB0aGVyZSBhICJjb2xsZWN0aXZlIGJsaW5kbmVzcyAiIG9uIHdoYXQgd2FzIHNsb3dseSB1bmZvbGRpbmcgaW4gZnJvbnQgb2YgdXMgb3Igd2FzIHRoZXJlIGEgY292ZS11cCBieSBjaGluYSBvbiB0aGUgcmVhbGl0eSBvbiB0aGUgZ3JvdW5kLiAqDQoNCiMjIExFVCBTRUUgSE9XIENPTkZJUk1FRCBDQVNFUyBBUkUgRElTVFJJQlVURUQgQUNST1NTIENISU5BIEFORCBPVEhFUiBQQVJUIE9GIFRIRSBXT1JMRCBTSU5DRSAxMDBUSCBDQVNFIE9WRVIgREFZUw0KDQoqKkxldCBsb2FkIGRhdGEgZm9yIHRoaXMgYW5hbHlzaXMgd2hpY2ggaXMgZnJvbSAib3Vyd29ybGRpbmRhdGEub3JnIiANCg0KYGBge3J9DQpjb3ZpZDE5X2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlPC1yZWFkLmNzdignY292aWQxOV9jYXNlcy5jc3YnKQ0KIyMgbm93IGxldCBzZWUgc3RyYXR1cmUgb2YgdGhlIGRhdGENCnN0cihjb3ZpZDE5X2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlKQ0KYGBgDQpgYGB7cn0NCiMjd2UgYXJlIGludGVyZXN0ZWQgaW4gRW50aXR5LGNhc2VzIGFuZCBkYXlzIHNpbmNlIDEwMHRoIGNhc2UNCmxpYnJhcnkoZHBseXIpDQpjb3ZpZF9jb25maXJtZWRfY2FzZXNfc2luY2VfMTAwdGhfY2FzZTwtc2VsZWN0KGNvdmlkMTlfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5LFguY2FzZXMuLERheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLikNCiMjc2luY2UgdGhlIGRhdGEgY29udGFpbiBtaXNzc2luZyB2YWx1ZSBsZXQgcmVtb3ZlIGFsbCBOQQ0KY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2U8LW5hLm9taXQoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UpDQpzdHIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UpDQpgYGANCiMjTmV4dCB3ZSBsb29rIGF0IENoaW5hIGRpc3RyaWJ1dGlvbiBvZiBjYXNlcyBzaW5jZSAxMDB0aCBjYXNlDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dyZXBlbCkNCmNvdmlkMTlfY2hpbmFfY2FzZV9zaW5jZV8xMDB0aF9jYXNlPC1maWx0ZXIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5PT0nQ2hpbmEnKQ0KZ2dwbG90KGNvdmlkMTlfY2hpbmFfY2FzZV9zaW5jZV8xMDB0aF9jYXNlLGFlcyh4PURheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLix5PVguY2FzZXMuKSxncm91cD0xKStnZW9tX2xpbmUoY29sb3I9J3JlZCcpDQpgYGANCiMjTm93IGxldCBzZWUgaG93IGNhc2VzIGFyZSBkaXN0cmlidXRlZCBwZXIgY29udGluZW50IGFuZCBhY3Jvc3Mgb3RoZXIgY291bnRyaWVzIGFib3ZlIENoaW5hIGluIG51bWJlciBvZiBDb3ZpZDE5IGNhc2VzLg0KYGBge3J9DQpjb3ZpZDE5X0FmcmljYV9jYXNlc19zaW5jZV8xMDB0aF9jYXNlPC1maWx0ZXIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5PT0nQWZyaWNhJykNCg0KY292aWQxOV9Bc2lhRXhjbF9DaGluYV9jYXNlc19zaW5jZV8xMDB0aF9jYXNlczwtZmlsdGVyKGNvdmlkX2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLEVudGl0eT09J0FzaWEgZXhjbC4gQ2hpbmEnKQ0KDQpjb3ZpZDE5X0V1cm9wZV9jYXNlc19zaW5jZV8xMDB0aF9jYXNlczwtZmlsdGVyKGNvdmlkX2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLEVudGl0eT09J0V1cm9wZScpDQoNCmNvdmlkMTlfTm9ydGhBbWVyaWNhX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2U8LWZpbHRlcihjb3ZpZF9jb25maXJtZWRfY2FzZXNfc2luY2VfMTAwdGhfY2FzZSxFbnRpdHk9PSdOb3J0aCBBbWVyaWNhJykNCg0KY292aWQxOV9Tb3V0aEFtZXJpY2FfY2FzZXNfc2luY2VfMTAwdGhfY2FzZTwtZmlsdGVyKGNvdmlkX2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLEVudGl0eT09J1NvdXRoIEFtZXJpY2EnKQ0KDQpjb3ZpZDE5X0l0YWx5PC1maWx0ZXIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5PT0nSXRhbHknKQ0KDQpjb3ZpZDE5X1NwYWluPC1maWx0ZXIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5PT0nU3BhaW4nKQ0KDQpjb3ZpZDE5X1VLPC1maWx0ZXIoY292aWRfY29uZmlybWVkX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsRW50aXR5PT0nVW5pdGVkIEtpbmdkb20nKQ0KDQpjb3ZpZDE5X1VTQTwtZmlsdGVyKGNvdmlkX2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLEVudGl0eT09J1VuaXRlZCBTdGF0ZXMnKQ0KDQpjb3ZpZDE5X0ZyYW5jZTwtZmlsdGVyKGNvdmlkX2NvbmZpcm1lZF9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLEVudGl0eT09J0ZyYW5jZScpDQpgYGANCg0KYGBge3J9DQojI0FmcmljYSBjYXNlcw0KZ2dwbG90KGNvdmlkMTlfQWZyaWNhX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsYWVzKHg9RGF5cy5zaW5jZS50aGUuMTAwdGguY29uZmlybWVkLmNhc2UuLmRheXMuLHk9WC5jYXNlcy4pLGdyb3VwPTEpK2dlb21fbGluZShjb2xvcj0ncmVkJykNCg0KIyNBc2lhIGNhc2VzIGV4Y2wgQ2hpbmENCm9wdGlvbnMoc2NpcGVuID0gMTAwMDApDQpnZ3Bsb3QoY292aWQxOV9Bc2lhRXhjbF9DaGluYV9jYXNlc19zaW5jZV8xMDB0aF9jYXNlcyxhZXMoeD1EYXlzLnNpbmNlLnRoZS4xMDB0aC5jb25maXJtZWQuY2FzZS4uZGF5cy4seT1YLmNhc2VzLiksZ3JvdXA9MSkrZ2VvbV9saW5lKGNvbG9yPSdyZWQnKQ0KDQojI0V1cm9wZSBjYXNlcw0KZ2dwbG90KGNvdmlkMTlfRXVyb3BlX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2VzLGFlcyh4PURheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLix5PVguY2FzZXMuKSxncm91cD0xKStnZW9tX2xpbmUoY29sb3I9J3JlZCcpDQoNCiMjTm9ydGggQW1lcmljYSBjYXNlcyANCmdncGxvdChjb3ZpZDE5X05vcnRoQW1lcmljYV9jYXNlc19zaW5jZV8xMDB0aF9jYXNlLGFlcyh4PURheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLix5PVguY2FzZXMuKSxncm91cD0xKStnZW9tX2xpbmUoY29sb3I9J3JlZCcpDQoNCiMjU291dGggQW1lcmljYSBjYXNlcw0KZ2dwbG90KGNvdmlkMTlfU291dGhBbWVyaWNhX2Nhc2VzX3NpbmNlXzEwMHRoX2Nhc2UsYWVzKHg9RGF5cy5zaW5jZS50aGUuMTAwdGguY29uZmlybWVkLmNhc2UuLmRheXMuLHk9WC5jYXNlcy4pLGdyb3VwPTEpK2dlb21fbGluZShjb2xvcj0ncmVkJykNCmBgYA0KDQojI05vdyBsZXQgbG9vayBhdCB0aGUgdG9wIDUgbmF0aW9ucyBhaGVhZCBvZiBjaGluYSB3aGljaCBpcyBjdXJyZW50bHkgNiB3aXRoIGhpZ2hlc3QgY2FzZXMNCmBgYHtyfQ0KIyNVbml0ZWQgU3RhdGVzIGNhc2VzDQpvcHRpb25zKHNjaXBlbiA9IDEwMDAwKQ0KZ2dwbG90KGNvdmlkMTlfVVNBLGFlcyh4PURheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLix5PVguY2FzZXMuKSxncm91cD0xKStnZW9tX2xpbmUoY29sb3I9J3JlZCcpDQojI1NwYWluIGNhc2VzDQpnZ3Bsb3QoY292aWQxOV9TcGFpbixhZXMoeD1EYXlzLnNpbmNlLnRoZS4xMDB0aC5jb25maXJtZWQuY2FzZS4uZGF5cy4seT1YLmNhc2VzLiksZ3JvdXA9MSkrZ2VvbV9saW5lKGNvbG9yPSdyZWQnKQ0KIyNVbml0ZWQgS2luZ2RvbSBjYXNlcw0KZ2dwbG90KGNvdmlkMTlfVUssYWVzKHg9RGF5cy5zaW5jZS50aGUuMTAwdGguY29uZmlybWVkLmNhc2UuLmRheXMuLHk9WC5jYXNlcy4pLGdyb3VwPTEpK2dlb21fbGluZShjb2xvcj0ncmVkJykNCiMjRnJhbmNlIGNhc2VzDQpnZ3Bsb3QoY292aWQxOV9GcmFuY2UsYWVzKHg9RGF5cy5zaW5jZS50aGUuMTAwdGguY29uZmlybWVkLmNhc2UuLmRheXMuLHk9WC5jYXNlcy4pLGdyb3VwPTEpK2dlb21fbGluZShjb2xvcj0ncmVkJykNCiMjSXRhbHkgY2FzZXMNCmdncGxvdChjb3ZpZDE5X0l0YWx5LGFlcyh4PURheXMuc2luY2UudGhlLjEwMHRoLmNvbmZpcm1lZC5jYXNlLi5kYXlzLix5PVguY2FzZXMuKSxncm91cD0xKStnZW9tX2xpbmUoY29sb3I9J3JlZCcpDQpgYGANCj4qRnJvbSAxc3QgcGxvdCBpdHMgY2xlYXIgdGhhdCBDaGluYSBzdGFydGVkIHRvIGZsYXR0ZW4gdGhlIGN1cnZlIHNpbmNlIDEwMHRoIGNhc2UgYWZ0ZXIgYXJvdW5kIDUwIGRheXMqDQoNCj4qQWZyaWNhIGluIGxlc3MgdGhhbiA0MCBkYXlzIHNpbmNlIDEwMHRoIGNhc2UgbmV3IGNhc2VzIGhhdmUgZ29uZSBoaWdoIHVwdG8gb3ZlciAyMGsqDQoNCj4qQXNpYSBleGNsdWRpbmcgQ2hpbmEgc2luY2UgMTAwdGggY2FzZSBuZXcgY2FzZXMgaGF2ZSBnb25lIHVwIGJ5IG1vcmUgdGhhbiAyMDBrIGluIGxlc3MgdGhhbiA3MCBkYXlzKg0KDQo+KkV1cm9wZSBzaW5jZSAxMDB0aCBjYXNlIG5ldyBjYXNlcyBoYXZlIGdvbmUgdXAgdG8gMU0gaW4gbGVzcyB0aGFuIDYwIGRheXMqDQoNCj4qTm9ydGggQW1lcmljYSBzaW5jZSAxMDB0aCBjYXNlIG5ldyBpbmZlY3Rpb24gYXJlIG5vdyBvdmVyIDYwMGsgaW4gbGVzcyB0aGFuIDUwIGRheXMqDQoNCj4qU291dGggQW1lcmljYSBzaW5jZSAxMDB0aCBjYXNlIG5ldyBpbmZlY3Rpb24gbm93IHN0YW5kIGF0IG92ZXIgNjBrIGluIGxlc3MgdGhhbiA0MCBkYXlzKg0KDQoqTm93IExldCBMb29rIEhvdyBDaGluYSBDb21wYXJlIFdpdGggT3RoZXIgTmF0aW9ucyBJbiBOdW1iZXIgT2YgQ292aWQxOSBJbmZlY3Rpb24gU2luY2UgMTAwdGggQ2FzZSoNCg0KIyNVbml0ZWQgU3RhdGVzDQoNCioqSXRzIGJlZWVuIGxlc3MgdGhhbiA1MCBkYXlzIHNpbmNlIFVTQSByZWNvcmRlZCAxMDB0aCBjYXNlIG9mIGNvcm9uYXZpcnVzIGJ1dCBudW1iZXIgb2YgbmV3IGNhc2VzIGhhdmUgc2t5cm9ja2V0ZWQgdG8gb3ZlciA2MDBrIHdpdGggQ2hpbmEgbnVtYmVyIHN0YW5kaW5nIGF0IDgzayBpbiBtb3JlIHRoYW4gODUgZGF5cyBzaW5jZSAxMDB0aCBjYXNlKioNCg0KIyNTcGFpbg0KDQoqKkxlc3MgdGhhbiA1MCBkYXlzIHNpbmNlIFNwYWluIHJlY29yZGVkIDEwMHRoIGNhc2Ugd2l0aCBuZXcgaW5mZWN0aW9uIGdvaW5nIHVwIHRvIG92ZXIgMTUwayBhZ2FpbnN0IENoaW5hIDgzayBjYXNlcyBpbiBvdmVyIDg1IGRheXMgc2luY2UgMTAwdGggY2FzZXMqKg0KDQojI1VuaXRlZCBLaW5nZG9tDQoNCioqVUsgaW4gbGVzcyB0aGFuIDUwIGRheXMgc2luY2UgMTAwdGggY2FzZSBuZXcgaW5mZWN0aW9uIGhhdmUgcmVhY2hlZCBvdmVyIDEwMGsgYWdhaW5zdCBDaGluYSBjYXNlcyA4M2sgaW4gb3ZlciA4NSBkYXlzKioNCg0KIyNGcmFuY2UNCg0KKipMZXNzIHRoYW4gNTAgZGF5cyBzaW5jZSBGcmFuY2UgcmVjb3JkZWQgMTAwdGggY2FzZSBidXQgbmV3IGluZmVjdGlvbiBoYXZlIGdvbmUgaGlnaCBvZiBvdmVyIDEwMGsgd2hpY2ggbW9yZSB0aGFuIENoaW5hIGNhc2VzIGluIG92ZXIgODUgZGF5cyoqDQoNCiMjSXRhbHkNCg0KKipMZXNzIHRoYW4gNjAgZGF5cyBzaW5jZSAxMDB0aCBjYXNlIG5ldyBpbmZlY3Rpb24gc3RhbmQgYXQgb3ZlciAxNzBrIGFnYWluc3QgQ2hpbmEgODNrIGluIG92ZXIgODUgZGF5cyoqDQoNCiMjQ29uY2x1c2lvbiANCg0KKkZpcnN0IGNhc2Ugb2YgY292aWQxOSB3YXMgcmVwb3J0ZWQgaW4gV3VoYW4gQ2hpbmEgaW4gbGF0ZSAyMDE5IGJ1dCBpdCB1bnRpbCBNYXJjaCB0aGF0IGl0IGhpdCBnbG9iYWwgbWFnbml0dWRlIHByb2JhYmx5IHR3byBtb250aHMgYWZ0ZXIgdGhlIGZpc3QgY2FzZSwgYXMgcGVyIEpvaG4gSG9wa2lucyBVbml2ZXJzaXR5IGNvdmlkMTkgZGF0YXNldHMgbnVtYmVyIG9mIGNhc2VzIGdsb2JhbGx5IG9uIDFzdCBvZiBNYXJjaCAyMDIwIHdhcyA4OC40ayB3aGlsZSBieSAyOXRoIE1hcmNoIG51bWJlciBvZiBjb25maXJtZWQgY2FzZXMgcmVhY2hlZCBvdmVyIDcyMGsgYSBkaWZmZXJlbnRpYWwgb2YgNjMxLDYwMCBjYXNlcyBpbiBkdXJhdGlvbiBvZiAyOSBkYXlzIHRyYW5zbGF0aW5nIHRvIDIxayBuZXcgaW5mZWN0aW9uIGNhc2VzIHBlciBkYXkgaW4gYXZlcmFnZSB3b3JsZHdpZGUsYW5kIGl0IGFmdGVyIHRoaXMgcmVhbGl0eSBjaGVja2VkIGluIGRpZCBsZWFkZXJzIGFuZCBhbmFseXN0IGZyb20gYWxsIHdhbGsgb2YgbGlmZSBzdGFydGVkIHRvIHJhaXNlIGRvdWJ0cyBhYm91dCBhY3R1YWwgbnVtYmVyIG9mIGNhc2VzIGluIENoaW5hIHdoaWxlIGRlc3BpdGUgZWFjaCBjb3VudHJ5IHNob3J0Y29taW5ncyBvbiBjb250YWluaW5nIGNvcm9uYSB2aXJ1cyBtb3N0IG9mIHRoZSBtZWFzdXJlcyBwdXQgaW5wbGFjZSBpbiBDaGluYSBoYXZlIGJlZW4gcmVwbGljYXRlZCBpbiBhbG1vc3QgYWxsIHNpdHVhdGlvbiBidXQgbnVtYmVycyBjb250aW51ZSB0byByaXNlIGV2ZW4gZnVydGhlciBzdWdnZXN0aW5nIENoaW5hIG1heSBoYXZlIGJsaW5kZm9sZGVkIGV2ZXJ5b25lIHRvIHRoaW5rIHRoYXQgdmlydXMgd2FzIG5vdCBhcyBpbmZlY3Rpb3VzIGFzIGl0IHdhcyB3aXRoIGNhc2VzIHN0YW5kaW5nIGFib3ZlIDIuMm0gYXMgb2YgMTh0aCBBcHJpbCAyMDIwIGZyb20gODguNGsgaW4gc3RhcnQgb2YgTWFyY2ggd2hpY2ggaXMgbGVzcyB0aGFuIHR3byBtb250aHMgQ2hpbmEgYmF0dGxlZCB0aGUgdmlydXMgYmVmb3JlIGl0IGhpdCBldmVyeSBjb3JuZXIgb2YgdGhlIHdvcmxkIHRodXMgbWFraW5nIGNvcm9uYSB2aXJ1cyBhIGJsYWNrIHN3YW4gZnJvbSBDaGluYSB3aXRoIHdvcmxkIHdhdGNoaW5nIGluIHJldHJvc3BlY3RpdmUgcmV2aWV3IG1pcnJvcjoq