diff --git a/.DS_Store b/.DS_Store index 96b6fde..e8a8d11 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index ae532aa..72745e9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ packrat/lib*/ PubMed pathologyarticles packrat/src/ +data/ \ No newline at end of file diff --git a/JournalsPublishedArticlesFromTurkey.Rmd b/JournalsPublishedArticlesFromTurkey.Rmd index b6b5cb7..fed03e4 100644 --- a/JournalsPublishedArticlesFromTurkey.Rmd +++ b/JournalsPublishedArticlesFromTurkey.Rmd @@ -39,6 +39,7 @@ library(tidyverse) If you want to see the code used in the analysis please click the code button on the right upper corner or throughout the page. Select from the tabs below. +--- ## Aim @@ -46,27 +47,32 @@ Select from the tabs below. Here we will look at the Journals in which articles from Turkey are published. +--- - -## Data retriveal from PubMed +## Data retriveal from PubMed using EDirect Articles are downloaded as `xml`. -```{r Search PubMed write 2018 data as xml, eval=FALSE, include=FALSE} -myTerm <- rstudioapi::terminalCreate(show = FALSE) -rstudioapi::terminalSend( - myTerm, - "esearch -db pubmed -query \"Turkey[Affiliation]\" -datetype PDAT -mindate 2018 -maxdate 3000 | efetch -format xml > data/Turkey_2018.xml \n" -) -Sys.sleep(1) -repeat { - Sys.sleep(0.1) - if (rstudioapi::terminalBusy(myTerm) == FALSE) { - print("Code Executed") - break - } -} -``` + + + + + + + + + + + + + + + + + + + + ```{r Search PubMed write all data as xml, eval=FALSE, include=FALSE} myTerm <- rstudioapi::terminalCreate(show = FALSE) @@ -88,65 +94,68 @@ repeat { -```{r Search PubMed get 2018 data on the fly, eval=FALSE, include=FALSE} -myTerm <- rstudioapi::terminalCreate(show = FALSE) -rstudioapi::terminalSend( - myTerm, - "esearch -db pubmed -query \"Turkey[Affiliation]\" -datetype PDAT -mindate 2018 -maxdate 3000 | efetch -format xml | xtract -pattern PubmedArticle -element MedlineCitation/PMID PubDate/Year Journal/ISSN ISOAbbreviation> data/onthefly_Turkey_2018.csv \n" -) -Sys.sleep(1) -repeat { - Sys.sleep(0.1) - if (rstudioapi::terminalBusy(myTerm) == FALSE) { - print("Code Executed") - break - } -} -``` + + + + + + + + + + + + + + + -```{r Search PubMed get all data on the fly, eval=FALSE, include=FALSE} -myTerm <- rstudioapi::terminalCreate(show = FALSE) -rstudioapi::terminalSend( - myTerm, - "esearch -db pubmed -query \"Turkey[Affiliation]\" -datetype PDAT -mindate 1800 -maxdate 3000 | efetch -format xml | xtract -pattern PubmedArticle -element MedlineCitation/PMID PubDate/Year Journal/ISSN ISOAbbreviation> data/onthefly_Turkey_all.csv \n" -) -Sys.sleep(1) -repeat { - Sys.sleep(0.1) - if (rstudioapi::terminalBusy(myTerm) == FALSE) { - print("Code Executed") - break - } -} -``` + + + + + + + + + + + + + + + + Journal Names are extracted from xml. -```{r extract journal names from xml, eval=FALSE, message=FALSE, warning=FALSE, include=FALSE} -myTerm <- rstudioapi::terminalCreate(show = FALSE) -rstudioapi::terminalSend( -myTerm, -"xtract -input data/Turkey_2018.xml -pattern PubmedArticle -element MedlineCitation/PMID PubDate/Year Journal/ISSN ISOAbbreviation > data/Turkey2018.csv \n" -) -Sys.sleep(1) -repeat { -Sys.sleep(0.1) -if (rstudioapi::terminalBusy(myTerm) == FALSE) { -print("Code Executed") -break -} -} -``` + + + + + + + + + + + + + + + + + ```{r extract journal names from all data xml, message=FALSE, warning=FALSE} myTerm <- rstudioapi::terminalCreate(show = FALSE) rstudioapi::terminalSend( myTerm, -"xtract -input data/Turkey_all.xml -pattern PubmedArticle -element MedlineCitation/PMID PubDate/Year Journal/ISSN ISOAbbreviation > data/TurkeyAll.csv \n" +"xtract -input data/Turkey_all.xml -pattern PubmedArticle -sep ' ' -def 'na' -element MedlineCitation/PMID Journal/ISSN ISOAbbreviation PubDate/Year > data/TurkeyAll.csv \n" ) Sys.sleep(1) repeat { @@ -160,189 +169,205 @@ break - ---- +## Retrieval of Data of Properties of Journals +[nlmcatalog_result_journals_pmc.xml](https://www.ncbi.nlm.nih.gov/portal/utils/file_backend.cgi?Db=nlmcatalog&HistoryId=NCID_1_69755278_130.14.18.97_5555_1534585934_3590606783_0MetA0_S_HStore&QueryKey=2&Sort=PubDate&Filter=all&CompleteResultCount=2559&Mode=file&View=xml&p$l=Email&portalSnapshot=%2Fprojects%2Fentrez%2Fpubmed%2FPubMedGroup@1.136&BaseUrl=&PortName=live&RootTag=NLMCatalogRecordSet&DocType=NLMCatalogRecordSet%20PUBLIC%20%22-%2F%2FNLM%2F%2FDTD%20NLMCatalogRecordSet,%201st%20June%202017%2F%2FEN%22%20%22https://www.nlm.nih.gov/databases/dtd/nlmcatalogrecordset_170601.dtd%22&FileName=&ContentType=xml) +[nlmcatalog_result_currentlyindexed.xml](https://www.ncbi.nlm.nih.gov/portal/utils/file_backend.cgi?Db=nlmcatalog&HistoryId=NCID_1_69755278_130.14.18.97_5555_1534585934_3590606783_0MetA0_S_HStore&QueryKey=1&Sort=PubDate&Filter=all&CompleteResultCount=5242&Mode=file&View=xml&p$l=Email&portalSnapshot=%2Fprojects%2Fentrez%2Fpubmed%2FPubMedGroup@1.136&BaseUrl=&PortName=live&RootTag=NLMCatalogRecordSet&DocType=NLMCatalogRecordSet%20PUBLIC%20%22-%2F%2FNLM%2F%2FDTD%20NLMCatalogRecordSet,%201st%20June%202017%2F%2FEN%22%20%22https://www.nlm.nih.gov/databases/dtd/nlmcatalogrecordset_170601.dtd%22&FileName=&ContentType=xml) +[scimagojr2017.csv](https://www.scimagojr.com/journalrank.php?out=xls) +[scimagojr2017-wos.csv](https://www.scimagojr.com/journalrank.php?wos=true&out=xls) +![](images/scidata.png) +--- +## Analysis +```{r Organize Journal Data 1, message=FALSE, warning=FALSE} +library(tidyverse) +library(readr) +TurkeyAll <- read_delim("data/TurkeyAll.csv", + "\t", escape_double = FALSE, col_names = FALSE, + na = "na", trim_ws = TRUE) +names(TurkeyAll) <- c("PMID", "ISSN", "JournalName", "Year") +# dim(TurkeyAll)[1] +# min(TurkeyAll[,4], na.rm = TRUE) +# max(TurkeyAll[,4], na.rm = TRUE) +# glimpse(TurkeyAll) +``` -The retrieved information was compiled in a table. -```{r message=FALSE, warning=FALSE} -library(readr) +```{r Organize Journal Data 2} +uniqueJournals <- TurkeyAll %>% + select(JournalName, ISSN) %>% + unique() -authorkeywords <- read_table2("data/authorkeywords.csv", -col_names = c("frequency", "author key word")) %>% -select('author key word', 'frequency') %>% -head(n = 20) +# dim(uniqueJournals)[1] -PathologyTurkeyMeSH <- read_table2("data/PathologyTurkeyMeSH.csv", -col_names = c("frequency", "MeSH term")) %>% -select('MeSH term', 'frequency') %>% -head(n = 20) ``` +```{r Organize Journal Data 3} -_**Most common 20 author supplied keywords are given below.**_ +TurkeyAll2 <- TurkeyAll %>% + mutate(Journal = paste(JournalName, ISSN, sep = " ISSN ")) -```{r results = 'asis'} -pander::pander(authorkeywords, justify = "left", caption = "Most common 20 author supplied keywords") -``` +ArticlesByYear <- TurkeyAll2 %>% + group_by(Journal, Year) %>% + summarise(n = n()) +ArticlesByYear <- ArticlesByYear %>% + spread(key = Year, value = n) -## Properties of Journals +TurkeyAll2 <- TurkeyAll2 %>% + select(Journal, JournalName, ISSN) %>% + unique() + +ArticlesByYear <- left_join(ArticlesByYear, TurkeyAll2, by = "Journal") +ArticlesByYear <- ArticlesByYear %>% + select( + Journal, JournalName, ISSN, everything() + ) +``` -[nlmcatalog_result_journals_pmc.xml](https://www.ncbi.nlm.nih.gov/portal/utils/file_backend.cgi?Db=nlmcatalog&HistoryId=NCID_1_69755278_130.14.18.97_5555_1534585934_3590606783_0MetA0_S_HStore&QueryKey=2&Sort=PubDate&Filter=all&CompleteResultCount=2559&Mode=file&View=xml&p$l=Email&portalSnapshot=%2Fprojects%2Fentrez%2Fpubmed%2FPubMedGroup@1.136&BaseUrl=&PortName=live&RootTag=NLMCatalogRecordSet&DocType=NLMCatalogRecordSet%20PUBLIC%20%22-%2F%2FNLM%2F%2FDTD%20NLMCatalogRecordSet,%201st%20June%202017%2F%2FEN%22%20%22https://www.nlm.nih.gov/databases/dtd/nlmcatalogrecordset_170601.dtd%22&FileName=&ContentType=xml) +```{r scimagojr2017} -[nlmcatalog_result_currentlyindexed.xml](https://www.ncbi.nlm.nih.gov/portal/utils/file_backend.cgi?Db=nlmcatalog&HistoryId=NCID_1_69755278_130.14.18.97_5555_1534585934_3590606783_0MetA0_S_HStore&QueryKey=1&Sort=PubDate&Filter=all&CompleteResultCount=5242&Mode=file&View=xml&p$l=Email&portalSnapshot=%2Fprojects%2Fentrez%2Fpubmed%2FPubMedGroup@1.136&BaseUrl=&PortName=live&RootTag=NLMCatalogRecordSet&DocType=NLMCatalogRecordSet%20PUBLIC%20%22-%2F%2FNLM%2F%2FDTD%20NLMCatalogRecordSet,%201st%20June%202017%2F%2FEN%22%20%22https://www.nlm.nih.gov/databases/dtd/nlmcatalogrecordset_170601.dtd%22&FileName=&ContentType=xml) +``` -[scimagojr2017.csv](https://www.scimagojr.com/journalrank.php?out=xls) -[scimagojr2017-wos.csv](https://www.scimagojr.com/journalrank.php?wos=true&out=xls) +-element MedlineTA NLMCatalogRecord/NlmUniqueID -def 'na' -sep '\t' -block TitleAlternate/Title -element TitleAlternate/Title +"xtract -input data/nlmcatalog_result_currentlyindexed.xml -pattern NCBICatalogRecord -element ISSNLinking -def 'na' -sep ' ' -block TitleAlternate/Title -if TitleAlternate/Title@Sort -equals N -element TitleAlternate/Title > data/nlmcatalog.csv \n" -![](images/scidata.png) +-sep '\t' +NLMCatalogRecord/NlmUniqueID ISSNLinking +```{r nlmcatalog, message=FALSE, warning=FALSE} +myTerm <- rstudioapi::terminalCreate(show = FALSE) +rstudioapi::terminalSend( +myTerm, +"xtract -input data/nlmcatalog_result_currentlyindexed.xml -pattern NCBICatalogRecord -tab '|' -element NLMCatalogRecord/NlmUniqueID -block ISSNLinking -tab '|' -element ISSNLinking -block Title -if Title@Sort -equals N -def 'na' -tab '|' -element TitleAlternate/Title > data/nlmcatalog.csv \n" +) +Sys.sleep(1) +repeat { +Sys.sleep(0.1) +if (rstudioapi::terminalBusy(myTerm) == FALSE) { +print("Code Executed") +break +} +} -## Analysis +``` -## Results +```{r} +library(readr) +nlmcatalog <- read_delim("data/nlmcatalog.csv", + delim = "|", + escape_double = FALSE, + col_names = FALSE, + trim_ws = TRUE) -## Discussion +``` +```{r} +library(xml2) +data <- read_xml("data/nlmcatalog_result_currentlyindexed.xml") -## Old +# Point locations +point <- data %>% xml_find_all("//pointer") +point %>% xml_attr("latitude") %>% as.numeric() +point %>% xml_attr("longitude") %>% as.numeric() +# Start time +data %>% + xml_find_all("//start-valid-time") %>% + xml_text() +# Temperature +data %>% + xml_find_all("//temperature[@type='hourly']/value") %>% + xml_text() %>% + as.integer() -Articles per journals per country +``` -**Methods:** +--- -```{r load required packages} -# load required packages -library(tidyverse) -library(RISmed) -``` +## Results -Pathology Journal ISSN List was retrieved from [In Cites Clarivate](https://jcr.incites.thomsonreuters.com/), and Journal Data Filtered as follows: `JCR Year: 2016 Selected Editions: SCIE,SSCI Selected Categories: 'PATHOLOGY' Selected Category Scheme: WoS` +- PubMed'de **`r min(TurkeyAll[,4], na.rm = TRUE)`-`r max(TurkeyAll[,4], na.rm = TRUE)`** tarihleri arasında, *Türkiye* adresli **`r dim(TurkeyAll)[1]`** adet yayın mevcuttur. -```{r Get ISSN List from data downloaded from WoS} -# Get ISSN List from data downloaded from WoS -ISSNList <- JournalHomeGrid <- read_csv("data/JournalHomeGrid.csv", - skip = 1) %>% - select(ISSN) %>% - filter(!is.na(ISSN)) %>% - t() %>% - paste("OR ", collapse = "") # add OR between ISSN List +- PubMed'de **`r min(TurkeyAll[,4], na.rm = TRUE)`-`r max(TurkeyAll[,4], na.rm = TRUE)`** tarihleri arasında, *Türkiye* adresli yayınlar **`r dim(uniqueJournals)[1]`** farklı dergide yayımlanmıştır. -ISSNList <- gsub(" OR $","" ,ISSNList) # to remove last OR -``` -Data is retrieved from PubMed via RISmed package. -PubMed collection from National Library of Medicine (https://www.ncbi.nlm.nih.gov/pubmed/), has the most comprehensive information about peer reviewed articles in medicine. -The API (https://dataguide.nlm.nih.gov/), and R packages are available for getting and fetching data from the server. -The search formula for PubMed is generated as "ISSN List AND Country[Affiliation]" like done in [advanced search of PubMed](https://www.ncbi.nlm.nih.gov/pubmed/advanced). -```{r Generate Search Formula For Pathology Journals AND Countries} -# Generate Search Formula For Pathology Journals AND Countries -searchformulaTR <- paste("'",ISSNList,"'", " AND ", "Turkey[Affiliation]") -searchformulaDE <- paste("'",ISSNList,"'", " AND ", "Germany[Affiliation]") -searchformulaJP <- paste("'",ISSNList,"'", " AND ", "Japan[Affiliation]") -``` -Articles from Japan, German and Turkey are retrieved limiting the search with pathology journals, affiliation and last 10 years. +--- -```{r Search PubMed, Get and Fetch} -# Search PubMed, Get and Fetch -TurkeyArticles <- EUtilsSummary(searchformulaTR, type = 'esearch', db = 'pubmed', mindate = 2007, maxdate = 2017, retmax = 10000) -fetchTurkey <- EUtilsGet(TurkeyArticles) +## Discussion -GermanyArticles <- EUtilsSummary(searchformulaDE, type = 'esearch', db = 'pubmed', mindate = 2007, maxdate = 2017, retmax = 10000) -fetchGermany <- EUtilsGet(GermanyArticles) +türkiye adresli olup da pubmedde yer alan makaleler hangi dergilerde kaçar adet yayınlanmış -JapanArticles <- EUtilsSummary(searchformulaJP, type = 'esearch', db = 'pubmed', mindate = 2007, maxdate = 2017, retmax = 10000) -fetchJapan <- EUtilsGet(JapanArticles) -``` The retrieved information was compiled in a table. -```{r} -ISSNTR <- table(ISSN(fetchTurkey)) %>% - as_tibble() %>% - rename(Turkey = n, Journal = Var1) -ISSNDE <- table(ISSN(fetchGermany)) %>% - as_tibble() %>% - rename(Germany = n, Journal = Var1) -ISSNJP <- table(ISSN(fetchJapan)) %>% - as_tibble() %>% - rename(Japan = n, Journal = Var1) -articles_per_journal <- list( - ISSNTR, - ISSNDE, - ISSNJP -) %>% - reduce(left_join, by = "Journal", .id = "id") %>% - gather(Country, n, 2:4) +**Methods:** + + + + -articles_per_journal$Country <- factor(articles_per_journal$Country, - levels =c("Japan", "Germany", "Turkey")) -``` **Result:** -In this graph x-axis is the list of journals with decreasing impact factor, and y-axis is the number of articles published in that journal. The colors and shapes are showing the country of affiliation. We see that in one journal articles from Japan is more than 800. -```{r} +```{r plot 1} ggplot(data = articles_per_journal, aes(x = Journal, y = n, group = Country, colour = Country, shape = Country, levels = Country @@ -358,16 +383,6 @@ ggplot(data = articles_per_journal, aes(x = Journal, y = n, group = Country, **Comment:** -It is seen that one of the journals [ISSN: 1440-1827](https://onlinelibrary.wiley.com/page/journal/14401827/homepage/productinformation.html) has more than 800 articles from Japan. This journal is also from Japan. Here we wonder if there is an editorial preference for articles from their home country. - -We sometimes observe this situation if there is a conference in that country, and the conference abstracts are indexed. - -This may also be a clue that if a country has a journal listed in indexes, than it is more easy for the researchers in that country to publish their results. - - -**Future Work:** - -Whether this observation is a unique situation, or there is a tendency in the journals to publish article from their country of origin, merits further investigation. @@ -384,4 +399,6 @@ This document will be continiously updated and the last update was on `r Sys.Dat ## Back to Main Menu -[Main Page for Bibliographic Analysis](https://sbalci.github.io/pubmed/BibliographicStudies.html) \ No newline at end of file +[Main Page for Bibliographic Analysis](https://sbalci.github.io/pubmed/BibliographicStudies.html) + +--- \ No newline at end of file diff --git a/JournalsPublishedArticlesFromTurkey.nb.html b/JournalsPublishedArticlesFromTurkey.nb.html index d02e1a0..68d08ea 100644 --- a/JournalsPublishedArticlesFromTurkey.nb.html +++ b/JournalsPublishedArticlesFromTurkey.nb.html @@ -11,7 +11,7 @@ - + Bibliographic Studies @@ -1743,7 +1743,7 @@

Bibliographic Studies

Journals Published Articles From Turkey

Serdar Balcı, MD, Pathologist

-

2018-08-18

+

2018-08-22

@@ -1759,32 +1759,86 @@

2018-08-18

Journals Published Articles From Turkey

If you want to see the code used in the analysis please click the code button on the right upper corner or throughout the page.
Select from the tabs below.

+

Aim

Aim:

Here we will look at the Journals in which articles from Turkey are published.

+
-
-

Data retriveal from PubMed

+
+

Data retriveal from PubMed using EDirect

Articles are downloaded as xml.

+ + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Journal Names are extracted from xml.

- - + + + + + + + + + + + + + + + - + - -
[1] "Code Executed"
-
-

The retrieved information was compiled in a table.

- - - - - - - -

Most common 20 author supplied keywords are given below.

- - - - - - -
-
-

Properties of Journals

+

Analysis

-
-
-

Results

-
-
-

Discussion

-
-
-

Old

-

Articles per journals per country

-

Methods:

- - + + -

Pathology Journal ISSN List was retrieved from In Cites Clarivate, and Journal Data Filtered as follows: JCR Year: 2016 Selected Editions: SCIE,SSCI Selected Categories: 'PATHOLOGY' Selected Category Scheme: WoS

- - + + -

Data is retrieved from PubMed via RISmed package. PubMed collection from National Library of Medicine (https://www.ncbi.nlm.nih.gov/pubmed/), has the most comprehensive information about peer reviewed articles in medicine. The API (https://dataguide.nlm.nih.gov/), and R packages are available for getting and fetching data from the server.

-

The search formula for PubMed is generated as “ISSN List AND Country[Affiliation]” like done in advanced search of PubMed.

- - + + -

Articles from Japan, German and Turkey are retrieved limiting the search with pathology journals, affiliation and last 10 years.

- - + + +

-element MedlineTA NLMCatalogRecord/NlmUniqueID -def ‘na’ -sep ‘’ -block TitleAlternate/Title -element TitleAlternate/Title

+

“xtract -input data/nlmcatalog_result_currentlyindexed.xml -pattern NCBICatalogRecord -element ISSNLinking -def ‘na’ -sep ’ ’ -block TitleAlternate/Title -if TitleAlternate/Title@Sort -equals N -element TitleAlternate/Title > data/nlmcatalog.csv ”

+

-sep ‘’

+

NLMCatalogRecord/NlmUniqueID ISSNLinking

+ + + + + +
[1] "Code Executed"
+ + + + + + + + + +
Parsed with column specification:
+cols(
+  X1 = col_integer(),
+  X2 = col_character(),
+  X3 = col_character(),
+  X4 = col_character(),
+  X5 = col_character(),
+  X6 = col_character(),
+  X7 = col_character(),
+  X8 = col_character()
+)
+number of columns of result is not a multiple of vector length (arg 1)5116 parsing failures.
+row # A tibble: 5 x 5 col     row col   expected  actual    file                  expected   <int> <chr> <chr>     <chr>     <chr>                 actual 1     2 NA    8 columns 2 columns 'data/nlmcatalog.csv' file 2     3 NA    8 columns 3 columns 'data/nlmcatalog.csv' row 3     4 NA    8 columns 5 columns 'data/nlmcatalog.csv' col 4     6 NA    8 columns 4 columns 'data/nlmcatalog.csv' expected 5     7 NA    8 columns 5 columns 'data/nlmcatalog.csv'
+... ................................. ... ....................................................... ........ .................................................................................................................................................................................... ...... ................................................................................. .... ................................................................................. ... ................................................................................. ... ................................................................................. ........ .................................................................................
+See problems(...) for more details.
+ -

The retrieved information was compiled in a table.

- - + + + +
{xml_nodeset (0)}
+ +
+
+
+

Results

+
    +
  • PubMed’de 1939-2018 tarihleri arasında, Türkiye adresli 200229 adet yayın mevcuttur.

  • +
  • PubMed’de 1939-2018 tarihleri arasında, Türkiye adresli yayınlar 8517 farklı dergide yayımlanmıştır.

  • +
+
+
+
+

Discussion

+

türkiye adresli olup da pubmedde yer alan makaleler hangi dergilerde kaçar adet yayınlanmış

+

The retrieved information was compiled in a table.

+

Methods:

Result:

-

In this graph x-axis is the list of journals with decreasing impact factor, and y-axis is the number of articles published in that journal. The colors and shapes are showing the country of affiliation. We see that in one journal articles from Japan is more than 800.

- - + + - -

-

Comment:

-

It is seen that one of the journals ISSN: 1440-1827 has more than 800 articles from Japan. This journal is also from Japan. Here we wonder if there is an editorial preference for articles from their home country.

-

We sometimes observe this situation if there is a conference in that country, and the conference abstracts are indexed.

-

This may also be a clue that if a country has a journal listed in indexes, than it is more easy for the researchers in that country to publish their results.

-

Future Work:

-

Whether this observation is a unique situation, or there is a tendency in the journals to publish article from their country of origin, merits further investigation.


Feedback

Serdar Balcı, MD, Pathologist would like to hear your feedback: https://goo.gl/forms/YjGZ5DHgtPlR1RnB3

-

This document will be continiously updated and the last update was on 2018-08-18.

+

This document will be continiously updated and the last update was on 2018-08-22.


-
LS0tCnRpdGxlOiAiQmlibGlvZ3JhcGhpYyBTdHVkaWVzIgpzdWJ0aXRsZTogIkpvdXJuYWxzIFB1Ymxpc2hlZCBBcnRpY2xlcyBGcm9tIFR1cmtleSIKYXV0aG9yOiAiU2VyZGFyIEJhbGPEsSwgTUQsIFBhdGhvbG9naXN0IgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBrYWJsZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBrZWVwX21kOiB5ZXMKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnBhdGggPSAnZmlndXJlLycsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIGV2YWwgPSBUUlVFLCB0aWR5ID0gVFJVRSwgY29tbWVudCA9IE5BKQpgYGAKCmBgYHtyIGxpYnJhcnksIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgo8IS0tICMgU3BvbnNvcmVkIGJ5IC0tPgoKPCEtLSBbIVtdKGltYWdlcy9tb2RlbGlzdGF0aXN0aWtfbG9nby0zLTMwMHg3My5wbmcpXShodHRwczovL3d3dy5tb2RlbGlzdGF0aXN0aWsuY29tLykgLS0+CgoKIyBKb3VybmFscyBQdWJsaXNoZWQgQXJ0aWNsZXMgRnJvbSBUdXJrZXkgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpJZiB5b3Ugd2FudCB0byBzZWUgdGhlIGNvZGUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgcGxlYXNlIGNsaWNrIHRoZSBjb2RlIGJ1dHRvbiBvbiB0aGUgcmlnaHQgdXBwZXIgY29ybmVyIG9yIHRocm91Z2hvdXQgdGhlIHBhZ2UuICAKU2VsZWN0IGZyb20gdGhlIHRhYnMgYmVsb3cuCgoKIyMgQWltIAoKKipBaW06KioKCkhlcmUgd2Ugd2lsbCBsb29rIGF0IHRoZSBKb3VybmFscyBpbiB3aGljaCBhcnRpY2xlcyBmcm9tIFR1cmtleSBhcmUgcHVibGlzaGVkLiAKCgoKIyMgRGF0YSByZXRyaXZlYWwgZnJvbSBQdWJNZWQgCgpBcnRpY2xlcyBhcmUgZG93bmxvYWRlZCBhcyBgeG1sYC4KCmBgYHtyIFNlYXJjaCBQdWJNZWQgd3JpdGUgMjAxOCBkYXRhIGFzIHhtbCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKAogICAgbXlUZXJtLAogICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMjAxOCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sID4gZGF0YS9UdXJrZXlfMjAxOC54bWwgXG4iCikKU3lzLnNsZWVwKDEpCnJlcGVhdCB7CiAgICBTeXMuc2xlZXAoMC4xKQogICAgaWYgKHJzdHVkaW9hcGk6OnRlcm1pbmFsQnVzeShteVRlcm0pID09IEZBTFNFKSB7CiAgICAgICAgcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQogICAgICAgIGJyZWFrCiAgICB9Cn0KYGBgCgpgYGB7ciBTZWFyY2ggUHViTWVkIHdyaXRlIGFsbCBkYXRhIGFzIHhtbCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKAogICAgbXlUZXJtLAogICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMTgwMCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sID4gZGF0YS9UdXJrZXlfYWxsLnhtbCBcbiIKKQpTeXMuc2xlZXAoMSkKcmVwZWF0IHsKICAgIFN5cy5zbGVlcCgwLjEpCiAgICBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsKICAgICAgICBwcmludCgiQ29kZSBFeGVjdXRlZCIpCiAgICAgICAgYnJlYWsKICAgIH0KfQpgYGAKCgoKCgpgYGB7ciBTZWFyY2ggUHViTWVkIGdldCAyMDE4IGRhdGEgb24gdGhlIGZseSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKAogICAgbXlUZXJtLAogICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMjAxOCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sIHwgeHRyYWN0ICAtcGF0dGVybiBQdWJtZWRBcnRpY2xlIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIFB1YkRhdGUvWWVhciBKb3VybmFsL0lTU04gSVNPQWJicmV2aWF0aW9uPiBkYXRhL29udGhlZmx5X1R1cmtleV8yMDE4LmNzdiBcbiIKKQpTeXMuc2xlZXAoMSkKcmVwZWF0IHsKICAgIFN5cy5zbGVlcCgwLjEpCiAgICBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsKICAgICAgICBwcmludCgiQ29kZSBFeGVjdXRlZCIpCiAgICAgICAgYnJlYWsKICAgIH0KfQpgYGAKCgpgYGB7ciBTZWFyY2ggUHViTWVkIGdldCBhbGwgZGF0YSBvbiB0aGUgZmx5LCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpteVRlcm0gPC0gcnN0dWRpb2FwaTo6dGVybWluYWxDcmVhdGUoc2hvdyA9IEZBTFNFKQpyc3R1ZGlvYXBpOjp0ZXJtaW5hbFNlbmQoCiAgICBteVRlcm0sCiAgICAiZXNlYXJjaCAtZGIgcHVibWVkIC1xdWVyeSBcIlR1cmtleVtBZmZpbGlhdGlvbl1cIiAtZGF0ZXR5cGUgUERBVCAtbWluZGF0ZSAxODAwIC1tYXhkYXRlIDMwMDAgfCBlZmV0Y2ggLWZvcm1hdCB4bWwgfCB4dHJhY3QgIC1wYXR0ZXJuIFB1Ym1lZEFydGljbGUgLWVsZW1lbnQgTWVkbGluZUNpdGF0aW9uL1BNSUQgUHViRGF0ZS9ZZWFyIEpvdXJuYWwvSVNTTiBJU09BYmJyZXZpYXRpb24+IGRhdGEvb250aGVmbHlfVHVya2V5X2FsbC5jc3YgXG4iCikKU3lzLnNsZWVwKDEpCnJlcGVhdCB7CiAgICBTeXMuc2xlZXAoMC4xKQogICAgaWYgKHJzdHVkaW9hcGk6OnRlcm1pbmFsQnVzeShteVRlcm0pID09IEZBTFNFKSB7CiAgICAgICAgcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQogICAgICAgIGJyZWFrCiAgICB9Cn0KYGBgCgoKCkpvdXJuYWwgTmFtZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHhtbC4KCmBgYHtyIGV4dHJhY3Qgam91cm5hbCBuYW1lcyBmcm9tIHhtbCwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKApteVRlcm0sCiJ4dHJhY3QgLWlucHV0IGRhdGEvVHVya2V5XzIwMTgueG1sIC1wYXR0ZXJuIFB1Ym1lZEFydGljbGUgLWVsZW1lbnQgTWVkbGluZUNpdGF0aW9uL1BNSUQgUHViRGF0ZS9ZZWFyIEpvdXJuYWwvSVNTTiBJU09BYmJyZXZpYXRpb24gPiBkYXRhL1R1cmtleTIwMTguY3N2IFxuIgopClN5cy5zbGVlcCgxKQpyZXBlYXQgewpTeXMuc2xlZXAoMC4xKQppZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsKcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQpicmVhawp9Cn0KYGBgCgoKYGBge3IgZXh0cmFjdCBqb3VybmFsIG5hbWVzIGZyb20gYWxsIGRhdGEgeG1sLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpteVRlcm0gPC0gcnN0dWRpb2FwaTo6dGVybWluYWxDcmVhdGUoc2hvdyA9IEZBTFNFKQpyc3R1ZGlvYXBpOjp0ZXJtaW5hbFNlbmQoCm15VGVybSwKInh0cmFjdCAtaW5wdXQgZGF0YS9UdXJrZXlfYWxsLnhtbCAtcGF0dGVybiBQdWJtZWRBcnRpY2xlIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIFB1YkRhdGUvWWVhciBKb3VybmFsL0lTU04gSVNPQWJicmV2aWF0aW9uID4gZGF0YS9UdXJrZXlBbGwuY3N2IFxuIgopClN5cy5zbGVlcCgxKQpyZXBlYXQgewpTeXMuc2xlZXAoMC4xKQppZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsKcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQpicmVhawp9Cn0KYGBgCgoKCgotLS0tCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKClRoZSByZXRyaWV2ZWQgaW5mb3JtYXRpb24gd2FzIGNvbXBpbGVkIGluIGEgdGFibGUuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQoKYXV0aG9ya2V5d29yZHMgPC0gcmVhZF90YWJsZTIoImRhdGEvYXV0aG9ya2V5d29yZHMuY3N2IiwKY29sX25hbWVzID0gYygiZnJlcXVlbmN5IiwgImF1dGhvciBrZXkgd29yZCIpKSAlPiUKc2VsZWN0KCdhdXRob3Iga2V5IHdvcmQnLCAnZnJlcXVlbmN5JykgJT4lCmhlYWQobiA9IDIwKQoKUGF0aG9sb2d5VHVya2V5TWVTSCA8LSByZWFkX3RhYmxlMigiZGF0YS9QYXRob2xvZ3lUdXJrZXlNZVNILmNzdiIsCmNvbF9uYW1lcyA9IGMoImZyZXF1ZW5jeSIsICJNZVNIIHRlcm0iKSkgJT4lCnNlbGVjdCgnTWVTSCB0ZXJtJywgJ2ZyZXF1ZW5jeScpICU+JQpoZWFkKG4gPSAyMCkKYGBgCgoKCl8qKk1vc3QgY29tbW9uIDIwIGF1dGhvciBzdXBwbGllZCBrZXl3b3JkcyBhcmUgZ2l2ZW4gYmVsb3cuKipfCgpgYGB7ciByZXN1bHRzID0gJ2FzaXMnfQpwYW5kZXI6OnBhbmRlcihhdXRob3JrZXl3b3JkcywganVzdGlmeSA9ICJsZWZ0IiwgY2FwdGlvbiA9ICJNb3N0IGNvbW1vbiAyMCBhdXRob3Igc3VwcGxpZWQga2V5d29yZHMiKQpgYGAKCgojIyBQcm9wZXJ0aWVzIG9mIEpvdXJuYWxzCgoKCltubG1jYXRhbG9nX3Jlc3VsdF9qb3VybmFsc19wbWMueG1sXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BvcnRhbC91dGlscy9maWxlX2JhY2tlbmQuY2dpP0RiPW5sbWNhdGFsb2cmSGlzdG9yeUlkPU5DSURfMV82OTc1NTI3OF8xMzAuMTQuMTguOTdfNTU1NV8xNTM0NTg1OTM0XzM1OTA2MDY3ODNfME1ldEEwX1NfSFN0b3JlJlF1ZXJ5S2V5PTImU29ydD1QdWJEYXRlJkZpbHRlcj1hbGwmQ29tcGxldGVSZXN1bHRDb3VudD0yNTU5Jk1vZGU9ZmlsZSZWaWV3PXhtbCZwJGw9RW1haWwmcG9ydGFsU25hcHNob3Q9JTJGcHJvamVjdHMlMkZlbnRyZXolMkZwdWJtZWQlMkZQdWJNZWRHcm91cEAxLjEzNiZCYXNlVXJsPSZQb3J0TmFtZT1saXZlJlJvb3RUYWc9TkxNQ2F0YWxvZ1JlY29yZFNldCZEb2NUeXBlPU5MTUNhdGFsb2dSZWNvcmRTZXQlMjBQVUJMSUMlMjAlMjItJTJGJTJGTkxNJTJGJTJGRFREJTIwTkxNQ2F0YWxvZ1JlY29yZFNldCwlMjAxc3QlMjBKdW5lJTIwMjAxNyUyRiUyRkVOJTIyJTIwJTIyaHR0cHM6Ly93d3cubmxtLm5paC5nb3YvZGF0YWJhc2VzL2R0ZC9ubG1jYXRhbG9ncmVjb3Jkc2V0XzE3MDYwMS5kdGQlMjImRmlsZU5hbWU9JkNvbnRlbnRUeXBlPXhtbCkKCgpbbmxtY2F0YWxvZ19yZXN1bHRfY3VycmVudGx5aW5kZXhlZC54bWxdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG9ydGFsL3V0aWxzL2ZpbGVfYmFja2VuZC5jZ2k/RGI9bmxtY2F0YWxvZyZIaXN0b3J5SWQ9TkNJRF8xXzY5NzU1Mjc4XzEzMC4xNC4xOC45N181NTU1XzE1MzQ1ODU5MzRfMzU5MDYwNjc4M18wTWV0QTBfU19IU3RvcmUmUXVlcnlLZXk9MSZTb3J0PVB1YkRhdGUmRmlsdGVyPWFsbCZDb21wbGV0ZVJlc3VsdENvdW50PTUyNDImTW9kZT1maWxlJlZpZXc9eG1sJnAkbD1FbWFpbCZwb3J0YWxTbmFwc2hvdD0lMkZwcm9qZWN0cyUyRmVudHJleiUyRnB1Ym1lZCUyRlB1Yk1lZEdyb3VwQDEuMTM2JkJhc2VVcmw9JlBvcnROYW1lPWxpdmUmUm9vdFRhZz1OTE1DYXRhbG9nUmVjb3JkU2V0JkRvY1R5cGU9TkxNQ2F0YWxvZ1JlY29yZFNldCUyMFBVQkxJQyUyMCUyMi0lMkYlMkZOTE0lMkYlMkZEVEQlMjBOTE1DYXRhbG9nUmVjb3JkU2V0LCUyMDFzdCUyMEp1bmUlMjAyMDE3JTJGJTJGRU4lMjIlMjAlMjJodHRwczovL3d3dy5ubG0ubmloLmdvdi9kYXRhYmFzZXMvZHRkL25sbWNhdGFsb2dyZWNvcmRzZXRfMTcwNjAxLmR0ZCUyMiZGaWxlTmFtZT0mQ29udGVudFR5cGU9eG1sKQoKCltzY2ltYWdvanIyMDE3LmNzdl0oaHR0cHM6Ly93d3cuc2NpbWFnb2pyLmNvbS9qb3VybmFscmFuay5waHA/b3V0PXhscykKCltzY2ltYWdvanIyMDE3LXdvcy5jc3ZdKGh0dHBzOi8vd3d3LnNjaW1hZ29qci5jb20vam91cm5hbHJhbmsucGhwP3dvcz10cnVlJm91dD14bHMpCgoKIVtdKGltYWdlcy9zY2lkYXRhLnBuZykKCgoKCiMjIEFuYWx5c2lzCgojIyBSZXN1bHRzCgoKIyMgRGlzY3Vzc2lvbgoKCgojIyBPbGQKCgoKQXJ0aWNsZXMgcGVyIGpvdXJuYWxzIHBlciBjb3VudHJ5CgoKCgoqKk1ldGhvZHM6KioKCmBgYHtyIGxvYWQgcmVxdWlyZWQgcGFja2FnZXN9CiMgbG9hZCByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShSSVNtZWQpCmBgYAoKUGF0aG9sb2d5IEpvdXJuYWwgSVNTTiBMaXN0IHdhcyByZXRyaWV2ZWQgZnJvbSBbSW4gQ2l0ZXMgQ2xhcml2YXRlXShodHRwczovL2pjci5pbmNpdGVzLnRob21zb25yZXV0ZXJzLmNvbS8pLCBhbmQgSm91cm5hbCBEYXRhIEZpbHRlcmVkIGFzIGZvbGxvd3M6IGBKQ1IgWWVhcjogMjAxNiBTZWxlY3RlZCBFZGl0aW9uczogU0NJRSxTU0NJIFNlbGVjdGVkIENhdGVnb3JpZXM6ICdQQVRIT0xPR1knIFNlbGVjdGVkIENhdGVnb3J5IFNjaGVtZTogV29TYAoKYGBge3IgR2V0IElTU04gTGlzdCBmcm9tIGRhdGEgZG93bmxvYWRlZCBmcm9tIFdvU30KIyBHZXQgSVNTTiBMaXN0IGZyb20gZGF0YSBkb3dubG9hZGVkIGZyb20gV29TCklTU05MaXN0IDwtIEpvdXJuYWxIb21lR3JpZCA8LSByZWFkX2NzdigiZGF0YS9Kb3VybmFsSG9tZUdyaWQuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgc2VsZWN0KElTU04pICU+JSAKICAgIGZpbHRlcighaXMubmEoSVNTTikpICU+JSAKICAgIHQoKSAlPiUgCiAgICBwYXN0ZSgiT1IgIiwgY29sbGFwc2UgPSAiIikgIyBhZGQgT1IgYmV0d2VlbiBJU1NOIExpc3QKCklTU05MaXN0IDwtIGdzdWIoIiBPUiAkIiwiIiAsSVNTTkxpc3QpICMgdG8gcmVtb3ZlIGxhc3QgT1IKYGBgCgpEYXRhIGlzIHJldHJpZXZlZCBmcm9tIFB1Yk1lZCB2aWEgUklTbWVkIHBhY2thZ2UuClB1Yk1lZCBjb2xsZWN0aW9uIGZyb20gTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSAoaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvKSwgaGFzIHRoZSBtb3N0IGNvbXByZWhlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQgcGVlciByZXZpZXdlZCBhcnRpY2xlcyBpbiBtZWRpY2luZS4KVGhlIEFQSSAoaHR0cHM6Ly9kYXRhZ3VpZGUubmxtLm5paC5nb3YvKSwgYW5kIFIgcGFja2FnZXMgYXJlIGF2YWlsYWJsZSBmb3IgZ2V0dGluZyBhbmQgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuCgpUaGUgc2VhcmNoIGZvcm11bGEgZm9yIFB1Yk1lZCBpcyBnZW5lcmF0ZWQgYXMgIklTU04gTGlzdCBBTkQgQ291bnRyeVtBZmZpbGlhdGlvbl0iIGxpa2UgZG9uZSBpbiBbYWR2YW5jZWQgc2VhcmNoIG9mIFB1Yk1lZF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvYWR2YW5jZWQpLgoKYGBge3IgR2VuZXJhdGUgU2VhcmNoIEZvcm11bGEgRm9yIFBhdGhvbG9neSBKb3VybmFscyBBTkQgQ291bnRyaWVzfQojIEdlbmVyYXRlIFNlYXJjaCBGb3JtdWxhIEZvciBQYXRob2xvZ3kgSm91cm5hbHMgQU5EIENvdW50cmllcwpzZWFyY2hmb3JtdWxhVFIgPC0gcGFzdGUoIiciLElTU05MaXN0LCInIiwgIiBBTkQgIiwgIlR1cmtleVtBZmZpbGlhdGlvbl0iKQpzZWFyY2hmb3JtdWxhREUgPC0gcGFzdGUoIiciLElTU05MaXN0LCInIiwgIiBBTkQgIiwgIkdlcm1hbnlbQWZmaWxpYXRpb25dIikKc2VhcmNoZm9ybXVsYUpQIDwtIHBhc3RlKCInIixJU1NOTGlzdCwiJyIsICIgQU5EICIsICJKYXBhbltBZmZpbGlhdGlvbl0iKQpgYGAKCkFydGljbGVzIGZyb20gSmFwYW4sIEdlcm1hbiBhbmQgVHVya2V5IGFyZSByZXRyaWV2ZWQgbGltaXRpbmcgdGhlIHNlYXJjaCB3aXRoIHBhdGhvbG9neSBqb3VybmFscywgYWZmaWxpYXRpb24gYW5kIGxhc3QgMTAgeWVhcnMuCgpgYGB7ciBTZWFyY2ggUHViTWVkLCBHZXQgYW5kIEZldGNofQojIFNlYXJjaCBQdWJNZWQsIEdldCBhbmQgRmV0Y2gKVHVya2V5QXJ0aWNsZXMgPC0gRVV0aWxzU3VtbWFyeShzZWFyY2hmb3JtdWxhVFIsIHR5cGUgPSAnZXNlYXJjaCcsIGRiID0gJ3B1Ym1lZCcsIG1pbmRhdGUgPSAyMDA3LCBtYXhkYXRlID0gMjAxNywgcmV0bWF4ID0gMTAwMDApCmZldGNoVHVya2V5IDwtIEVVdGlsc0dldChUdXJrZXlBcnRpY2xlcykKCkdlcm1hbnlBcnRpY2xlcyA8LSBFVXRpbHNTdW1tYXJ5KHNlYXJjaGZvcm11bGFERSwgdHlwZSA9ICdlc2VhcmNoJywgZGIgPSAncHVibWVkJywgbWluZGF0ZSA9IDIwMDcsIG1heGRhdGUgPSAyMDE3LCByZXRtYXggPSAxMDAwMCkKZmV0Y2hHZXJtYW55IDwtIEVVdGlsc0dldChHZXJtYW55QXJ0aWNsZXMpCgpKYXBhbkFydGljbGVzIDwtIEVVdGlsc1N1bW1hcnkoc2VhcmNoZm9ybXVsYUpQLCB0eXBlID0gJ2VzZWFyY2gnLCBkYiA9ICdwdWJtZWQnLCBtaW5kYXRlID0gMjAwNywgbWF4ZGF0ZSA9IDIwMTcsIHJldG1heCA9IDEwMDAwKQpmZXRjaEphcGFuIDwtIEVVdGlsc0dldChKYXBhbkFydGljbGVzKQpgYGAKClRoZSByZXRyaWV2ZWQgaW5mb3JtYXRpb24gd2FzIGNvbXBpbGVkIGluIGEgdGFibGUuCgpgYGB7cn0KCklTU05UUiA8LSB0YWJsZShJU1NOKGZldGNoVHVya2V5KSkgJT4lIAogICAgYXNfdGliYmxlKCkgJT4lIAogICAgcmVuYW1lKFR1cmtleSA9IG4sIEpvdXJuYWwgPSBWYXIxKQoKSVNTTkRFIDwtIHRhYmxlKElTU04oZmV0Y2hHZXJtYW55KSkgJT4lIAogICAgYXNfdGliYmxlKCkgJT4lIAogICAgcmVuYW1lKEdlcm1hbnkgPSBuLCBKb3VybmFsID0gVmFyMSkKCklTU05KUCA8LSB0YWJsZShJU1NOKGZldGNoSmFwYW4pKSAlPiUgCiAgICBhc190aWJibGUoKSAlPiUgCiAgICByZW5hbWUoSmFwYW4gPSBuLCBKb3VybmFsID0gVmFyMSkKCmFydGljbGVzX3Blcl9qb3VybmFsIDwtIGxpc3QoCiAgICBJU1NOVFIsCiAgICBJU1NOREUsCiAgICBJU1NOSlAKKSAlPiUKICAgIHJlZHVjZShsZWZ0X2pvaW4sIGJ5ID0gIkpvdXJuYWwiLCAuaWQgPSAiaWQiKSAlPiUgCiAgICBnYXRoZXIoQ291bnRyeSwgbiwgMjo0KQoKYXJ0aWNsZXNfcGVyX2pvdXJuYWwkQ291bnRyeSA8LSBmYWN0b3IoYXJ0aWNsZXNfcGVyX2pvdXJuYWwkQ291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID1jKCJKYXBhbiIsICJHZXJtYW55IiwgIlR1cmtleSIpKQoKYGBgCgoKCioqUmVzdWx0OioqCgpJbiB0aGlzIGdyYXBoIHgtYXhpcyBpcyB0aGUgbGlzdCBvZiBqb3VybmFscyB3aXRoIGRlY3JlYXNpbmcgaW1wYWN0IGZhY3RvciwgYW5kIHktYXhpcyBpcyB0aGUgbnVtYmVyIG9mIGFydGljbGVzIHB1Ymxpc2hlZCBpbiB0aGF0IGpvdXJuYWwuIFRoZSBjb2xvcnMgYW5kIHNoYXBlcyBhcmUgc2hvd2luZyB0aGUgY291bnRyeSBvZiBhZmZpbGlhdGlvbi4gV2Ugc2VlIHRoYXQgaW4gb25lIGpvdXJuYWwgYXJ0aWNsZXMgZnJvbSBKYXBhbiBpcyBtb3JlIHRoYW4gODAwLiAgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhcnRpY2xlc19wZXJfam91cm5hbCwgYWVzKHggPSBKb3VybmFsLCB5ID0gbiwgZ3JvdXAgPSBDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ291bnRyeSwgc2hhcGUgPSBDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gQ291bnRyeQopKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgbGFicyh4ID0gIkpvdXJuYWxzIHdpdGggZGVjcmVhc2luZyBpbXBhY3QgZmFjdG9yIiwgeSA9ICJOdW1iZXIgb2YgQXJ0aWNsZXMiKSArCiAgICBnZ3RpdGxlKCJQYXRob2xvZ3kgQXJ0aWNsZXMgUGVyIEpvdXJuYWwiKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpCgpgYGAKCgoqKkNvbW1lbnQ6KioKCkl0IGlzIHNlZW4gdGhhdCBvbmUgb2YgdGhlIGpvdXJuYWxzIFtJU1NOOiAxNDQwLTE4MjddKGh0dHBzOi8vb25saW5lbGlicmFyeS53aWxleS5jb20vcGFnZS9qb3VybmFsLzE0NDAxODI3L2hvbWVwYWdlL3Byb2R1Y3RpbmZvcm1hdGlvbi5odG1sKSBoYXMgbW9yZSB0aGFuIDgwMCBhcnRpY2xlcyBmcm9tIEphcGFuLiBUaGlzIGpvdXJuYWwgaXMgYWxzbyBmcm9tIEphcGFuLiBIZXJlIHdlIHdvbmRlciBpZiB0aGVyZSBpcyBhbiBlZGl0b3JpYWwgcHJlZmVyZW5jZSBmb3IgYXJ0aWNsZXMgZnJvbSB0aGVpciBob21lIGNvdW50cnkuIAoKV2Ugc29tZXRpbWVzIG9ic2VydmUgdGhpcyBzaXR1YXRpb24gaWYgdGhlcmUgaXMgYSBjb25mZXJlbmNlIGluIHRoYXQgY291bnRyeSwgYW5kIHRoZSBjb25mZXJlbmNlIGFic3RyYWN0cyBhcmUgaW5kZXhlZC4gCgpUaGlzIG1heSBhbHNvIGJlIGEgY2x1ZSB0aGF0IGlmIGEgY291bnRyeSBoYXMgYSBqb3VybmFsIGxpc3RlZCBpbiBpbmRleGVzLCB0aGFuIGl0IGlzIG1vcmUgZWFzeSBmb3IgdGhlIHJlc2VhcmNoZXJzIGluIHRoYXQgY291bnRyeSB0byBwdWJsaXNoIHRoZWlyIHJlc3VsdHMuCgoKKipGdXR1cmUgV29yazoqKgoKV2hldGhlciB0aGlzIG9ic2VydmF0aW9uIGlzIGEgdW5pcXVlIHNpdHVhdGlvbiwgb3IgdGhlcmUgaXMgYSB0ZW5kZW5jeSBpbiB0aGUgam91cm5hbHMgdG8gcHVibGlzaCBhcnRpY2xlIGZyb20gdGhlaXIgY291bnRyeSBvZiBvcmlnaW4sIG1lcml0cyBmdXJ0aGVyIGludmVzdGlnYXRpb24uIAoKCgotLS0KCgojIyBGZWVkYmFjawoKW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9naXRodWIuY29tL3NiYWxjaSkgd291bGQgbGlrZSB0byBoZWFyIHlvdXIgZmVlZGJhY2s6IGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzCgpUaGlzIGRvY3VtZW50IHdpbGwgYmUgY29udGluaW91c2x5IHVwZGF0ZWQgYW5kIHRoZSBsYXN0IHVwZGF0ZSB3YXMgb24gYHIgU3lzLkRhdGUoKWAuCgotLS0KCiMjIEJhY2sgdG8gTWFpbiBNZW51CgpbTWFpbiBQYWdlIGZvciBCaWJsaW9ncmFwaGljIEFuYWx5c2lzXShodHRwczovL3NiYWxjaS5naXRodWIuaW8vcHVibWVkL0JpYmxpb2dyYXBoaWNTdHVkaWVzLmh0bWwp
+
LS0tCnRpdGxlOiAiQmlibGlvZ3JhcGhpYyBTdHVkaWVzIgpzdWJ0aXRsZTogIkpvdXJuYWxzIFB1Ymxpc2hlZCBBcnRpY2xlcyBGcm9tIFR1cmtleSIKYXV0aG9yOiAiU2VyZGFyIEJhbGPEsSwgTUQsIFBhdGhvbG9naXN0IgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBrYWJsZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBrZWVwX21kOiB5ZXMKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnBhdGggPSAnZmlndXJlLycsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIGV2YWwgPSBUUlVFLCB0aWR5ID0gVFJVRSwgY29tbWVudCA9IE5BKQpgYGAKCmBgYHtyIGxpYnJhcnksIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgo8IS0tICMgU3BvbnNvcmVkIGJ5IC0tPgoKPCEtLSBbIVtdKGltYWdlcy9tb2RlbGlzdGF0aXN0aWtfbG9nby0zLTMwMHg3My5wbmcpXShodHRwczovL3d3dy5tb2RlbGlzdGF0aXN0aWsuY29tLykgLS0+CgoKIyBKb3VybmFscyBQdWJsaXNoZWQgQXJ0aWNsZXMgRnJvbSBUdXJrZXkgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpJZiB5b3Ugd2FudCB0byBzZWUgdGhlIGNvZGUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgcGxlYXNlIGNsaWNrIHRoZSBjb2RlIGJ1dHRvbiBvbiB0aGUgcmlnaHQgdXBwZXIgY29ybmVyIG9yIHRocm91Z2hvdXQgdGhlIHBhZ2UuICAKU2VsZWN0IGZyb20gdGhlIHRhYnMgYmVsb3cuCgotLS0KCiMjIEFpbSAKCioqQWltOioqCgpIZXJlIHdlIHdpbGwgbG9vayBhdCB0aGUgSm91cm5hbHMgaW4gd2hpY2ggYXJ0aWNsZXMgZnJvbSBUdXJrZXkgYXJlIHB1Ymxpc2hlZC4gCgotLS0KCiMjIERhdGEgcmV0cml2ZWFsIGZyb20gUHViTWVkIHVzaW5nIEVEaXJlY3QgCgpBcnRpY2xlcyBhcmUgZG93bmxvYWRlZCBhcyBgeG1sYC4KCgoKPCEtLSBgYGB7ciBTZWFyY2ggUHViTWVkIHdyaXRlIDIwMTggZGF0YSBhcyB4bWwsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9IC0tPgo8IS0tIG15VGVybSA8LSByc3R1ZGlvYXBpOjp0ZXJtaW5hbENyZWF0ZShzaG93ID0gRkFMU0UpIC0tPgo8IS0tIHJzdHVkaW9hcGk6OnRlcm1pbmFsU2VuZCggLS0+CjwhLS0gICAgIG15VGVybSwgLS0+CjwhLS0gICAgICJlc2VhcmNoIC1kYiBwdWJtZWQgLXF1ZXJ5IFwiVHVya2V5W0FmZmlsaWF0aW9uXVwiIC1kYXRldHlwZSBQREFUIC1taW5kYXRlIDIwMTggLW1heGRhdGUgMzAwMCB8IGVmZXRjaCAtZm9ybWF0IHhtbCA+IGRhdGEvVHVya2V5XzIwMTgueG1sIFxuIiAtLT4KPCEtLSApIC0tPgo8IS0tIFN5cy5zbGVlcCgxKSAtLT4KPCEtLSByZXBlYXQgeyAtLT4KPCEtLSAgICAgU3lzLnNsZWVwKDAuMSkgLS0+CjwhLS0gICAgIGlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgeyAtLT4KPCEtLSAgICAgICAgIHByaW50KCJDb2RlIEV4ZWN1dGVkIikgLS0+CjwhLS0gICAgICAgICBicmVhayAtLT4KPCEtLSAgICAgfSAtLT4KPCEtLSB9IC0tPgo8IS0tIGBgYCAtLT4KCgoKCmBgYHtyIFNlYXJjaCBQdWJNZWQgd3JpdGUgYWxsIGRhdGEgYXMgeG1sLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpteVRlcm0gPC0gcnN0dWRpb2FwaTo6dGVybWluYWxDcmVhdGUoc2hvdyA9IEZBTFNFKQpyc3R1ZGlvYXBpOjp0ZXJtaW5hbFNlbmQoCiAgICBteVRlcm0sCiAgICAiZXNlYXJjaCAtZGIgcHVibWVkIC1xdWVyeSBcIlR1cmtleVtBZmZpbGlhdGlvbl1cIiAtZGF0ZXR5cGUgUERBVCAtbWluZGF0ZSAxODAwIC1tYXhkYXRlIDMwMDAgfCBlZmV0Y2ggLWZvcm1hdCB4bWwgPiBkYXRhL1R1cmtleV9hbGwueG1sIFxuIgopClN5cy5zbGVlcCgxKQpyZXBlYXQgewogICAgU3lzLnNsZWVwKDAuMSkKICAgIGlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgewogICAgICAgIHByaW50KCJDb2RlIEV4ZWN1dGVkIikKICAgICAgICBicmVhawogICAgfQp9CmBgYAoKCgoKCjwhLS0gYGBge3IgU2VhcmNoIFB1Yk1lZCBnZXQgMjAxOCBkYXRhIG9uIHRoZSBmbHksIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9IC0tPgo8IS0tIG15VGVybSA8LSByc3R1ZGlvYXBpOjp0ZXJtaW5hbENyZWF0ZShzaG93ID0gRkFMU0UpIC0tPgo8IS0tIHJzdHVkaW9hcGk6OnRlcm1pbmFsU2VuZCggLS0+CjwhLS0gICAgIG15VGVybSwgLS0+CjwhLS0gICAgICJlc2VhcmNoIC1kYiBwdWJtZWQgLXF1ZXJ5IFwiVHVya2V5W0FmZmlsaWF0aW9uXVwiIC1kYXRldHlwZSBQREFUIC1taW5kYXRlIDIwMTggLW1heGRhdGUgMzAwMCB8IGVmZXRjaCAtZm9ybWF0IHhtbCB8IHh0cmFjdCAgLXBhdHRlcm4gUHVibWVkQXJ0aWNsZSAtZWxlbWVudCBNZWRsaW5lQ2l0YXRpb24vUE1JRCBQdWJEYXRlL1llYXIgSm91cm5hbC9JU1NOIElTT0FiYnJldmlhdGlvbj4gZGF0YS9vbnRoZWZseV9UdXJrZXlfMjAxOC5jc3YgXG4iIC0tPgo8IS0tICkgLS0+CjwhLS0gU3lzLnNsZWVwKDEpIC0tPgo8IS0tIHJlcGVhdCB7IC0tPgo8IS0tICAgICBTeXMuc2xlZXAoMC4xKSAtLT4KPCEtLSAgICAgaWYgKHJzdHVkaW9hcGk6OnRlcm1pbmFsQnVzeShteVRlcm0pID09IEZBTFNFKSB7IC0tPgo8IS0tICAgICAgICAgcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKSAtLT4KPCEtLSAgICAgICAgIGJyZWFrIC0tPgo8IS0tICAgICB9IC0tPgo8IS0tIH0gLS0+CjwhLS0gYGBgIC0tPgoKCgo8IS0tIGBgYHtyIFNlYXJjaCBQdWJNZWQgZ2V0IGFsbCBkYXRhIG9uIHRoZSBmbHksIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9IC0tPgo8IS0tIG15VGVybSA8LSByc3R1ZGlvYXBpOjp0ZXJtaW5hbENyZWF0ZShzaG93ID0gRkFMU0UpIC0tPgo8IS0tIHJzdHVkaW9hcGk6OnRlcm1pbmFsU2VuZCggLS0+CjwhLS0gICAgIG15VGVybSwgLS0+CjwhLS0gICAgICJlc2VhcmNoIC1kYiBwdWJtZWQgLXF1ZXJ5IFwiVHVya2V5W0FmZmlsaWF0aW9uXVwiIC1kYXRldHlwZSBQREFUIC1taW5kYXRlIDE4MDAgLW1heGRhdGUgMzAwMCB8IGVmZXRjaCAtZm9ybWF0IHhtbCB8IHh0cmFjdCAgLXBhdHRlcm4gUHVibWVkQXJ0aWNsZSAtZWxlbWVudCBNZWRsaW5lQ2l0YXRpb24vUE1JRCBQdWJEYXRlL1llYXIgSm91cm5hbC9JU1NOIElTT0FiYnJldmlhdGlvbj4gZGF0YS9vbnRoZWZseV9UdXJrZXlfYWxsLmNzdiBcbiIgLS0+CjwhLS0gKSAtLT4KPCEtLSBTeXMuc2xlZXAoMSkgLS0+CjwhLS0gcmVwZWF0IHsgLS0+CjwhLS0gICAgIFN5cy5zbGVlcCgwLjEpIC0tPgo8IS0tICAgICBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gICAgICAgICBwcmludCgiQ29kZSBFeGVjdXRlZCIpIC0tPgo8IS0tICAgICAgICAgYnJlYWsgLS0+CjwhLS0gICAgIH0gLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+CgoKCkpvdXJuYWwgTmFtZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHhtbC4KCgoKPCEtLSBgYGB7ciBleHRyYWN0IGpvdXJuYWwgbmFtZXMgZnJvbSAyMDE4IHhtbCwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSBteVRlcm0sIC0tPgo8IS0tICJ4dHJhY3QgLWlucHV0IGRhdGEvVHVya2V5XzIwMTgueG1sIC1wYXR0ZXJuIFB1Ym1lZEFydGljbGUgLWVsZW1lbnQgTWVkbGluZUNpdGF0aW9uL1BNSUQgUHViRGF0ZS9ZZWFyIEpvdXJuYWwvSVNTTiBJU09BYmJyZXZpYXRpb24gPiBkYXRhL1R1cmtleTIwMTguY3N2IFxuIiAtLT4KPCEtLSApIC0tPgo8IS0tIFN5cy5zbGVlcCgxKSAtLT4KPCEtLSByZXBlYXQgeyAtLT4KPCEtLSBTeXMuc2xlZXAoMC4xKSAtLT4KPCEtLSBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKSAtLT4KPCEtLSBicmVhayAtLT4KPCEtLSB9IC0tPgo8IS0tIH0gLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyIGV4dHJhY3Qgam91cm5hbCBuYW1lcyBmcm9tIGFsbCBkYXRhIHhtbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKApteVRlcm0sCiJ4dHJhY3QgLWlucHV0IGRhdGEvVHVya2V5X2FsbC54bWwgLXBhdHRlcm4gUHVibWVkQXJ0aWNsZSAtc2VwICcgJyAtZGVmICduYScgLWVsZW1lbnQgTWVkbGluZUNpdGF0aW9uL1BNSUQgSm91cm5hbC9JU1NOIElTT0FiYnJldmlhdGlvbiBQdWJEYXRlL1llYXIgPiBkYXRhL1R1cmtleUFsbC5jc3YgXG4iCikKU3lzLnNsZWVwKDEpCnJlcGVhdCB7ClN5cy5zbGVlcCgwLjEpCmlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgewpwcmludCgiQ29kZSBFeGVjdXRlZCIpCmJyZWFrCn0KfQpgYGAKCgoKLS0tLQoKCiMjIFJldHJpZXZhbCBvZiBEYXRhIG9mIFByb3BlcnRpZXMgb2YgSm91cm5hbHMKCgoKW25sbWNhdGFsb2dfcmVzdWx0X2pvdXJuYWxzX3BtYy54bWxdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG9ydGFsL3V0aWxzL2ZpbGVfYmFja2VuZC5jZ2k/RGI9bmxtY2F0YWxvZyZIaXN0b3J5SWQ9TkNJRF8xXzY5NzU1Mjc4XzEzMC4xNC4xOC45N181NTU1XzE1MzQ1ODU5MzRfMzU5MDYwNjc4M18wTWV0QTBfU19IU3RvcmUmUXVlcnlLZXk9MiZTb3J0PVB1YkRhdGUmRmlsdGVyPWFsbCZDb21wbGV0ZVJlc3VsdENvdW50PTI1NTkmTW9kZT1maWxlJlZpZXc9eG1sJnAkbD1FbWFpbCZwb3J0YWxTbmFwc2hvdD0lMkZwcm9qZWN0cyUyRmVudHJleiUyRnB1Ym1lZCUyRlB1Yk1lZEdyb3VwQDEuMTM2JkJhc2VVcmw9JlBvcnROYW1lPWxpdmUmUm9vdFRhZz1OTE1DYXRhbG9nUmVjb3JkU2V0JkRvY1R5cGU9TkxNQ2F0YWxvZ1JlY29yZFNldCUyMFBVQkxJQyUyMCUyMi0lMkYlMkZOTE0lMkYlMkZEVEQlMjBOTE1DYXRhbG9nUmVjb3JkU2V0LCUyMDFzdCUyMEp1bmUlMjAyMDE3JTJGJTJGRU4lMjIlMjAlMjJodHRwczovL3d3dy5ubG0ubmloLmdvdi9kYXRhYmFzZXMvZHRkL25sbWNhdGFsb2dyZWNvcmRzZXRfMTcwNjAxLmR0ZCUyMiZGaWxlTmFtZT0mQ29udGVudFR5cGU9eG1sKQoKCltubG1jYXRhbG9nX3Jlc3VsdF9jdXJyZW50bHlpbmRleGVkLnhtbF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wb3J0YWwvdXRpbHMvZmlsZV9iYWNrZW5kLmNnaT9EYj1ubG1jYXRhbG9nJkhpc3RvcnlJZD1OQ0lEXzFfNjk3NTUyNzhfMTMwLjE0LjE4Ljk3XzU1NTVfMTUzNDU4NTkzNF8zNTkwNjA2NzgzXzBNZXRBMF9TX0hTdG9yZSZRdWVyeUtleT0xJlNvcnQ9UHViRGF0ZSZGaWx0ZXI9YWxsJkNvbXBsZXRlUmVzdWx0Q291bnQ9NTI0MiZNb2RlPWZpbGUmVmlldz14bWwmcCRsPUVtYWlsJnBvcnRhbFNuYXBzaG90PSUyRnByb2plY3RzJTJGZW50cmV6JTJGcHVibWVkJTJGUHViTWVkR3JvdXBAMS4xMzYmQmFzZVVybD0mUG9ydE5hbWU9bGl2ZSZSb290VGFnPU5MTUNhdGFsb2dSZWNvcmRTZXQmRG9jVHlwZT1OTE1DYXRhbG9nUmVjb3JkU2V0JTIwUFVCTElDJTIwJTIyLSUyRiUyRk5MTSUyRiUyRkRURCUyME5MTUNhdGFsb2dSZWNvcmRTZXQsJTIwMXN0JTIwSnVuZSUyMDIwMTclMkYlMkZFTiUyMiUyMCUyMmh0dHBzOi8vd3d3Lm5sbS5uaWguZ292L2RhdGFiYXNlcy9kdGQvbmxtY2F0YWxvZ3JlY29yZHNldF8xNzA2MDEuZHRkJTIyJkZpbGVOYW1lPSZDb250ZW50VHlwZT14bWwpCgoKW3NjaW1hZ29qcjIwMTcuY3N2XShodHRwczovL3d3dy5zY2ltYWdvanIuY29tL2pvdXJuYWxyYW5rLnBocD9vdXQ9eGxzKQoKW3NjaW1hZ29qcjIwMTctd29zLmNzdl0oaHR0cHM6Ly93d3cuc2NpbWFnb2pyLmNvbS9qb3VybmFscmFuay5waHA/d29zPXRydWUmb3V0PXhscykKCgohW10oaW1hZ2VzL3NjaWRhdGEucG5nKQoKCgoKCi0tLQoKCgoKCgojIyBBbmFseXNpcwoKYGBge3IgT3JnYW5pemUgSm91cm5hbCBEYXRhIDEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWRyKQoKVHVya2V5QWxsIDwtIHJlYWRfZGVsaW0oImRhdGEvVHVya2V5QWxsLmNzdiIsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwKICAgIG5hID0gIm5hIiwgdHJpbV93cyA9IFRSVUUpCgpuYW1lcyhUdXJrZXlBbGwpIDwtIGMoIlBNSUQiLCAiSVNTTiIsICJKb3VybmFsTmFtZSIsICJZZWFyIikKCiMgZGltKFR1cmtleUFsbClbMV0KCiMgbWluKFR1cmtleUFsbFssNF0sIG5hLnJtID0gVFJVRSkKCiMgbWF4KFR1cmtleUFsbFssNF0sIG5hLnJtID0gVFJVRSkKCiMgZ2xpbXBzZShUdXJrZXlBbGwpCgpgYGAKCgoKYGBge3IgT3JnYW5pemUgSm91cm5hbCBEYXRhIDJ9CnVuaXF1ZUpvdXJuYWxzIDwtIFR1cmtleUFsbCAlPiUgCiAgICBzZWxlY3QoSm91cm5hbE5hbWUsIElTU04pICU+JSAKICAgIHVuaXF1ZSgpCgojIGRpbSh1bmlxdWVKb3VybmFscylbMV0KCmBgYAoKCmBgYHtyIE9yZ2FuaXplIEpvdXJuYWwgRGF0YSAzfQoKVHVya2V5QWxsMiA8LSBUdXJrZXlBbGwgJT4lIAogICAgbXV0YXRlKEpvdXJuYWwgPSBwYXN0ZShKb3VybmFsTmFtZSwgSVNTTiwgc2VwID0gIiBJU1NOICIpKQoKQXJ0aWNsZXNCeVllYXIgPC0gVHVya2V5QWxsMiAlPiUgCiAgICBncm91cF9ieShKb3VybmFsLCBZZWFyKSAlPiUgCiAgICBzdW1tYXJpc2UobiA9IG4oKSkKCkFydGljbGVzQnlZZWFyIDwtIEFydGljbGVzQnlZZWFyICU+JSAKICAgIHNwcmVhZChrZXkgPSBZZWFyLCB2YWx1ZSA9IG4pCgpUdXJrZXlBbGwyIDwtIFR1cmtleUFsbDIgJT4lIAogICAgc2VsZWN0KEpvdXJuYWwsIEpvdXJuYWxOYW1lLCBJU1NOKSAlPiUgCiAgICB1bmlxdWUoKQogICAgCkFydGljbGVzQnlZZWFyIDwtIGxlZnRfam9pbihBcnRpY2xlc0J5WWVhciwgVHVya2V5QWxsMiwgYnkgPSAiSm91cm5hbCIpIAoKQXJ0aWNsZXNCeVllYXIgPC0gQXJ0aWNsZXNCeVllYXIgJT4lCiAgICBzZWxlY3QoCiAgICBKb3VybmFsLCBKb3VybmFsTmFtZSwgSVNTTiwgZXZlcnl0aGluZygpCiAgICApCgpgYGAKCgpgYGB7ciBzY2ltYWdvanIyMDE3fQoKYGBgCgoKCi1lbGVtZW50IE1lZGxpbmVUQSAgTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCAtZGVmICduYScgLXNlcCAnXHQnIC1ibG9jayBUaXRsZUFsdGVybmF0ZS9UaXRsZSAgIC1lbGVtZW50IFRpdGxlQWx0ZXJuYXRlL1RpdGxlICAgCgoieHRyYWN0IC1pbnB1dCBkYXRhL25sbWNhdGFsb2dfcmVzdWx0X2N1cnJlbnRseWluZGV4ZWQueG1sIC1wYXR0ZXJuIE5DQklDYXRhbG9nUmVjb3JkIC1lbGVtZW50IElTU05MaW5raW5nIC1kZWYgJ25hJyAtc2VwICcgJyAtYmxvY2sgVGl0bGVBbHRlcm5hdGUvVGl0bGUgLWlmIFRpdGxlQWx0ZXJuYXRlL1RpdGxlQFNvcnQgLWVxdWFscyBOIC1lbGVtZW50IFRpdGxlQWx0ZXJuYXRlL1RpdGxlICA+IGRhdGEvbmxtY2F0YWxvZy5jc3YgXG4iCgotc2VwICdcdCcgCgoKTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCBJU1NOTGlua2luZwoKYGBge3IgbmxtY2F0YWxvZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKApteVRlcm0sCiJ4dHJhY3QgLWlucHV0IGRhdGEvbmxtY2F0YWxvZ19yZXN1bHRfY3VycmVudGx5aW5kZXhlZC54bWwgLXBhdHRlcm4gTkNCSUNhdGFsb2dSZWNvcmQgLXRhYiAnfCcgLWVsZW1lbnQgTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCAtYmxvY2sgSVNTTkxpbmtpbmcgLXRhYiAnfCcgLWVsZW1lbnQgSVNTTkxpbmtpbmcgLWJsb2NrIFRpdGxlIC1pZiBUaXRsZUBTb3J0IC1lcXVhbHMgTiAtZGVmICduYScgLXRhYiAnfCcgLWVsZW1lbnQgVGl0bGVBbHRlcm5hdGUvVGl0bGUgPiBkYXRhL25sbWNhdGFsb2cuY3N2IFxuIgopClN5cy5zbGVlcCgxKQpyZXBlYXQgewpTeXMuc2xlZXAoMC4xKQppZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsKcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQpicmVhawp9Cn0KCmBgYCAKCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbmxtY2F0YWxvZyA8LSByZWFkX2RlbGltKCJkYXRhL25sbWNhdGFsb2cuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJ8IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW1fd3MgPSBUUlVFKQoKYGBgCgpgYGB7cn0KCmxpYnJhcnkoeG1sMikKZGF0YSA8LSByZWFkX3htbCgiZGF0YS9ubG1jYXRhbG9nX3Jlc3VsdF9jdXJyZW50bHlpbmRleGVkLnhtbCIpCgojIFBvaW50IGxvY2F0aW9ucwpwb2ludCA8LSBkYXRhICU+JSB4bWxfZmluZF9hbGwoIi8vcG9pbnRlciIpCnBvaW50ICU+JSB4bWxfYXR0cigibGF0aXR1ZGUiKSAlPiUgYXMubnVtZXJpYygpCnBvaW50ICU+JSB4bWxfYXR0cigibG9uZ2l0dWRlIikgJT4lIGFzLm51bWVyaWMoKQoKIyBTdGFydCB0aW1lCmRhdGEgJT4lIAogIHhtbF9maW5kX2FsbCgiLy9zdGFydC12YWxpZC10aW1lIikgJT4lIAogIHhtbF90ZXh0KCkKCiMgVGVtcGVyYXR1cmUKZGF0YSAlPiUgCiAgeG1sX2ZpbmRfYWxsKCIvL3RlbXBlcmF0dXJlW0B0eXBlPSdob3VybHknXS92YWx1ZSIpICU+JSAKICB4bWxfdGV4dCgpICU+JSAKICBhcy5pbnRlZ2VyKCkKCgoKYGBgCgoKLS0tCgojIyBSZXN1bHRzCgotIFB1Yk1lZCdkZSAqKmByIG1pbihUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpYC1gciBtYXgoVHVya2V5QWxsWyw0XSwgbmEucm0gPSBUUlVFKWAqKiB0YXJpaGxlcmkgYXJhc8SxbmRhLCAqVMO8cmtpeWUqIGFkcmVzbGkgKipgciBkaW0oVHVya2V5QWxsKVsxXWAqKiBhZGV0IHlhecSxbiBtZXZjdXR0dXIuCgotIFB1Yk1lZCdkZSAqKmByIG1pbihUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpYC1gciBtYXgoVHVya2V5QWxsWyw0XSwgbmEucm0gPSBUUlVFKWAqKiB0YXJpaGxlcmkgYXJhc8SxbmRhLCAqVMO8cmtpeWUqIGFkcmVzbGkgeWF5xLFubGFyICoqYHIgZGltKHVuaXF1ZUpvdXJuYWxzKVsxXWAqKiBmYXJrbMSxIGRlcmdpZGUgeWF5xLFtbGFubcSxxZ90xLFyLgoKCgoKCi0tLQoKIyMgRGlzY3Vzc2lvbgoKdMO8cmtpeWUgYWRyZXNsaSBvbHVwIGRhIHB1Ym1lZGRlIHllciBhbGFuIG1ha2FsZWxlciBoYW5naSBkZXJnaWxlcmRlIGthw6dhciBhZGV0IHlhecSxbmxhbm3EscWfCgoKVGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiB3YXMgY29tcGlsZWQgaW4gYSB0YWJsZS4KCgoKCgoqKk1ldGhvZHM6KioKCgoKCgoKCgoKKipSZXN1bHQ6KioKCgpgYGB7ciBwbG90IDF9CmdncGxvdChkYXRhID0gYXJ0aWNsZXNfcGVyX2pvdXJuYWwsIGFlcyh4ID0gSm91cm5hbCwgeSA9IG4sIGdyb3VwID0gQ291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvdW50cnksIHNoYXBlID0gQ291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IENvdW50cnkKKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGxhYnMoeCA9ICJKb3VybmFscyB3aXRoIGRlY3JlYXNpbmcgaW1wYWN0IGZhY3RvciIsIHkgPSAiTnVtYmVyIG9mIEFydGljbGVzIikgKwogICAgZ2d0aXRsZSgiUGF0aG9sb2d5IEFydGljbGVzIFBlciBKb3VybmFsIikgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKQoKYGBgCgoKKipDb21tZW50OioqCgoKCgotLS0KCgojIyBGZWVkYmFjawoKW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9naXRodWIuY29tL3NiYWxjaSkgd291bGQgbGlrZSB0byBoZWFyIHlvdXIgZmVlZGJhY2s6IGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzCgpUaGlzIGRvY3VtZW50IHdpbGwgYmUgY29udGluaW91c2x5IHVwZGF0ZWQgYW5kIHRoZSBsYXN0IHVwZGF0ZSB3YXMgb24gYHIgU3lzLkRhdGUoKWAuCgotLS0KCiMjIEJhY2sgdG8gTWFpbiBNZW51CgpbTWFpbiBQYWdlIGZvciBCaWJsaW9ncmFwaGljIEFuYWx5c2lzXShodHRwczovL3NiYWxjaS5naXRodWIuaW8vcHVibWVkL0JpYmxpb2dyYXBoaWNTdHVkaWVzLmh0bWwpCgotLS0=
diff --git a/SEERResearchPerCountries.Rmd b/SEERResearchPerCountries.Rmd new file mode 100644 index 0000000..1435790 --- /dev/null +++ b/SEERResearchPerCountries.Rmd @@ -0,0 +1,682 @@ +--- +title: "Bibliographic Studies" +subtitle: "SEER Research Per Countries / Who is doing SEER Research?" +author: "Serdar Balcı, MD, Pathologist" +date: '`r format(Sys.Date())`' +output: + html_notebook: + code_folding: hide + fig_caption: yes + highlight: kate + theme: cerulean + toc_float: yes + html_document: + code_folding: hide + df_print: kable + fig_caption: yes + highlight: kate + keep_md: yes + theme: cerulean + toc_float: yes +--- + + + +```{r global_options, include=FALSE} +knitr::opts_chunk$set(fig.width = 12, fig.height = 8, fig.path = 'figure/', echo = FALSE, warning = FALSE, message = FALSE, error = FALSE, eval = TRUE, tidy = TRUE, comment = NA) +``` + +```{r library, include=FALSE} +library(tidyverse) +``` + + +```{r} +state.name +``` + + +```{r} +# install.packages("maps") +# library(maps) +# x <- map("world", plot=FALSE) +# glimpse(x) +# x$names + +``` + +```{r} +install.packages("rworldmap") +library(rworldmap) +vignette('rworldmap') +data(countryExData) +countryExData +``` + + + + + + + + + + + + +SEER China vs others + +https://www.rdocumentation.org/packages/bayesTFR/versions/6.1-2/topics/country.names + + +https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/state.html + + + + +# Who works on SEER {.tabset .tabset-fade .tabset-pills} + +If you want to see the code used in the analysis please click the code button on the right upper corner or throughout the page. +Select from the tabs below. + +--- + +## Aim + +**Aim:** + + + +--- + +## Data retriveal from PubMed using EDirect + +Articles are downloaded as `xml`. + +```{r Search PubMed write all data as xml, eval=FALSE, include=FALSE} +myTerm <- rstudioapi::terminalCreate(show = FALSE) +rstudioapi::terminalSend( + myTerm, + "esearch -db pubmed -query \"'SEER Program'[Mesh] +\" -datetype PDAT -mindate 1800 -maxdate 3000 | efetch -format xml > data/pubmed_result_SEER_MeSH.xml \n" +) +Sys.sleep(1) +repeat { + Sys.sleep(0.1) + if (rstudioapi::terminalBusy(myTerm) == FALSE) { + print("Code Executed") + break + } +} +``` + + + +```{r extract journal names from all data xml, message=FALSE, warning=FALSE} +myTerm <- rstudioapi::terminalCreate(show = FALSE) +rstudioapi::terminalSend( +myTerm, +"xtract -input data/pubmed_result_SEER_MeSH.xml -pattern PubmedArticle -sep ' ' -def 'na' -element MedlineCitation/PMID PubDate/Year Affiliation> data/SEER_countries.csv \n" +) +Sys.sleep(1) +repeat { +Sys.sleep(0.1) +if (rstudioapi::terminalBusy(myTerm) == FALSE) { +print("Code Executed") +break +} +} +``` + + +```{r} +library(readr) +SEER_countries <- read_delim("data/SEER_countries.csv", + "\t", escape_double = FALSE, col_names = c("PMID", "year", "Affiliations"), + na = "NA", trim_ws = TRUE) +# View(SEER_countries) +``` + +```{r} +countries <- read_delim("data/countries.txt", delim = "|", col_names = c("abb", "country")) + +country <- countries$country + +country <- c(country, state.name) + +country[80] <- "Georgia_" + +``` + + + +```{r} +# SEER_countries <- cbind(SEER_countries, setNames(lapply(country, function(x) x=NA), country)) + +# names(SEER_countries)[254] <- "GeorgiaUSA" + + +``` + +```{r} +# grepl(pattern = "China", x = SEER_countries$Affiliations) +``` + + +```{r} +# deneme1 <- grepl(pattern = country[44], x = SEER_countries$Affiliations) + +# deneme2 <- sapply(country, function(x) grepl(x, SEER_countries$Affiliations)) + +# sum(deneme1 != deneme2[,44]) + +``` + +```{r} +# deneme2 <- as.data.frame(deneme2) + +# sum(deneme2$Turkey) +``` + +```{r} +SEER_countries <- cbind(SEER_countries, sapply(country, function(x) grepl(x, SEER_countries$Affiliations))) +``` + + +```{r} +dim(SEER_countries)[1] +``` + +At the time of the research the number of articles with 'SEER Program'[Mesh] formula is `r dim(SEER_countries)[1]`. + +```{r} +# deneme <- colSums(SEER_countries[,-(1:3)]) + +# deneme <- as.data.frame(deneme) + +# deneme <- rownames_to_column(deneme, var = "countries") + +# names(deneme) <- c("countries", "number") + +# deneme %>% arrange(desc(number)) + + +``` + +```{r} +SEER_countries[SEER_countries == FALSE] <- 0 + +SEER_countries[SEER_countries == TRUE] <- 1 + +``` + + + +```{r} +countryTotals <- SEER_countries %>% + select(-c(1:3)) %>% + summarise_all(funs(sum)) + +countryTotals[which(countryTotals>0)] + +publisherCountries <- names(countryTotals[which(countryTotals>0)]) + +SEER_countries <- SEER_countries %>% + select(c(1:3, publisherCountries)) + +``` + + + +```{r} +deneme <- SEER_countries %>% + gather(key = "Country", value = "Number", -c(1:3)) %>% + group_by(Country, year) %>% + summarise(total = sum(Number)) +``` + + +```{r} +deneme %>% + filter(year != "na") %>% + filter(year != "2017") %>% + filter(year != "2018") %>% +ggplot() + + aes(y = total, x = year, group = Country, color = Country) + + geom_line() + + guides(fill=FALSE, color=FALSE) + + theme(axis.text.x = element_text(angle = 90, hjust = 1)) +``` + + +```{r} +USAnames <- names(SEER_countries) %in% state.name + +Others <- setdiff(names(SEER_countries[-c(1:3)]), c(USAnames,"United States", "China")) + + +deneme2 <- SEER_countries %>% + mutate( + sumUSA = rowSums( + select(., one_of(USAnames), `United States`) + ) + ) %>% +mutate( + sumOthers = rowSums( + select(., one_of(Others)) + ) + ) %>% + select(PMID, year, China, USA = sumUSA, Others = sumOthers) + +``` + +```{r} +deneme3 <- deneme2 %>% + gather(key = "Country", value = "Number", -c(1:2)) %>% + group_by(PMID, Country, year) %>% + summarise(total = sum(Number)) %>% + filter(year != "na") %>% + filter(year != "2017") %>% + filter(year != "2018") %>% + filter(total != "0") +``` + + +```{r} +# which(duplicated(deneme3$PMID)) +# which(duplicated(deneme3$PMID))-1 + +# deneme3[which(duplicated(deneme3$PMID)),] + +together <- bind_cols( +First = deneme3$Country[which(duplicated(deneme3$PMID))], +Second = deneme3$Country[which(duplicated(deneme3$PMID))-1] +) + +table(together$First, together$Second) %>% addmargins() +bind_cols( + +``` + + + +```{r} +deneme4 <- deneme2 %>% + gather(key = "Country", value = "Number", -c(1:2)) %>% + group_by(Country, year) %>% + summarise(total = sum(Number)) %>% + filter(year != "na") %>% + filter(year != "2017") %>% + filter(year != "2018") %>% + filter(total != "0") +``` + + + +```{r} +deneme4 %>% + +ggplot() + + aes(y = total, x = year, group = Country, color = Country) + + geom_line() + + # guides(fill=FALSE, color=FALSE) + + theme(axis.text.x = element_text(angle = 90, hjust = 1)) +``` + + + + + + +

While helping the preparation of #PBPath Journal Watch (https://t.co/WiBsJixzlc) I thought that many SEER @NCICancerStats studies are from China. So using edirect @NCBI and #RStats I draw the attached graph. What do you think? Do Chinese do research on SEER that much? pic.twitter.com/3Op5r9ofbK

— Serdar Balcı (@serdarbalci) October 6, 2018
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SEERResearchPerCountries.nb.html b/SEERResearchPerCountries.nb.html new file mode 100644 index 0000000..9f470ff --- /dev/null +++ b/SEERResearchPerCountries.nb.html @@ -0,0 +1,2370 @@ + + + + + + + + + + + + + + + +Bibliographic Studies + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 [1] "Alabama"        "Alaska"        
+ [3] "Arizona"        "Arkansas"      
+ [5] "California"     "Colorado"      
+ [7] "Connecticut"    "Delaware"      
+ [9] "Florida"        "Georgia"       
+[11] "Hawaii"         "Idaho"         
+[13] "Illinois"       "Indiana"       
+[15] "Iowa"           "Kansas"        
+[17] "Kentucky"       "Louisiana"     
+[19] "Maine"          "Maryland"      
+[21] "Massachusetts"  "Michigan"      
+[23] "Minnesota"      "Mississippi"   
+[25] "Missouri"       "Montana"       
+[27] "Nebraska"       "Nevada"        
+[29] "New Hampshire"  "New Jersey"    
+[31] "New Mexico"     "New York"      
+[33] "North Carolina" "North Dakota"  
+[35] "Ohio"           "Oklahoma"      
+[37] "Oregon"         "Pennsylvania"  
+[39] "Rhode Island"   "South Carolina"
+[41] "South Dakota"   "Tennessee"     
+[43] "Texas"          "Utah"          
+[45] "Vermont"        "Virginia"      
+[47] "Washington"     "West Virginia" 
+[49] "Wisconsin"      "Wyoming"       
+ + + + + + + + + + + + + +
+ +
+ + + +

SEER China vs others

+

https://www.rdocumentation.org/packages/bayesTFR/versions/6.1-2/topics/country.names

+

https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/state.html

+
+

Who works on SEER

+

If you want to see the code used in the analysis please click the code button on the right upper corner or throughout the page.
+Select from the tabs below.

+
+
+

Aim

+

Aim:

+
+
+
+

Data retriveal from PubMed using EDirect

+

Articles are downloaded as xml.

+ + + + + + + + + + + + + + + +
Parsed with column specification:
+cols(
+  PMID = col_integer(),
+  year = col_character(),
+  Affiliations = col_character()
+)
+ + + + + + + + + + + + +
Parsed with column specification:
+cols(
+  abb = col_character(),
+  country = col_character()
+)
+ + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[1] 6240
+ + + +

At the time of the research the number of articles with ‘SEER Program’[Mesh] formula is 6240.

+ + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + +
NA
+ + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + +
        
+         China Others Sum
+  Others    19      0  19
+  USA       15    165 180
+  Sum       34    165 199
+ + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
LS0tCnRpdGxlOiAiQmlibGlvZ3JhcGhpYyBTdHVkaWVzIgpzdWJ0aXRsZTogIlNFRVIgUmVzZWFyY2ggUGVyIENvdW50cmllcyAvIFdobyBpcyBkb2luZyBTRUVSIFJlc2VhcmNoPyIKYXV0aG9yOiAiU2VyZGFyIEJhbGPEsSwgTUQsIFBhdGhvbG9naXN0IgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBrYWJsZQogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBrZWVwX21kOiB5ZXMKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgoKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdmaWd1cmUvJywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRSwgZXZhbCA9IFRSVUUsIHRpZHkgPSBUUlVFLCBjb21tZW50ID0gTkEpCmBgYAoKYGBge3IgbGlicmFyeSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKCmBgYHtyfQpzdGF0ZS5uYW1lCmBgYAoKCmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoIm1hcHMiKQojIGxpYnJhcnkobWFwcykKIyB4IDwtIG1hcCgid29ybGQiLCBwbG90PUZBTFNFKQojIGdsaW1wc2UoeCkKIyB4JG5hbWVzCgpgYGAKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJyd29ybGRtYXAiKQpsaWJyYXJ5KHJ3b3JsZG1hcCkKdmlnbmV0dGUoJ3J3b3JsZG1hcCcpCmRhdGEoY291bnRyeUV4RGF0YSkKY291bnRyeUV4RGF0YQpgYGAKCgoKCgoKCgoKCgoKU0VFUiBDaGluYSB2cyBvdGhlcnMKCmh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9iYXllc1RGUi92ZXJzaW9ucy82LjEtMi90b3BpY3MvY291bnRyeS5uYW1lcwoKCmh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9kYXRhc2V0cy9odG1sL3N0YXRlLmh0bWwKCgoKCiMgV2hvIHdvcmtzIG9uIFNFRVIgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpJZiB5b3Ugd2FudCB0byBzZWUgdGhlIGNvZGUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgcGxlYXNlIGNsaWNrIHRoZSBjb2RlIGJ1dHRvbiBvbiB0aGUgcmlnaHQgdXBwZXIgY29ybmVyIG9yIHRocm91Z2hvdXQgdGhlIHBhZ2UuICAKU2VsZWN0IGZyb20gdGhlIHRhYnMgYmVsb3cuCgotLS0KCiMjIEFpbSAKCioqQWltOioqCgoKCi0tLQoKIyMgRGF0YSByZXRyaXZlYWwgZnJvbSBQdWJNZWQgdXNpbmcgRURpcmVjdCAKCkFydGljbGVzIGFyZSBkb3dubG9hZGVkIGFzIGB4bWxgLgoKYGBge3IgU2VhcmNoIFB1Yk1lZCB3cml0ZSBhbGwgZGF0YSBhcyB4bWwsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cm15VGVybSA8LSByc3R1ZGlvYXBpOjp0ZXJtaW5hbENyZWF0ZShzaG93ID0gRkFMU0UpCnJzdHVkaW9hcGk6OnRlcm1pbmFsU2VuZCgKICAgIG15VGVybSwKICAgICJlc2VhcmNoIC1kYiBwdWJtZWQgLXF1ZXJ5IFwiJ1NFRVIgUHJvZ3JhbSdbTWVzaF0KXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMTgwMCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sID4gZGF0YS9wdWJtZWRfcmVzdWx0X1NFRVJfTWVTSC54bWwgXG4iCikKU3lzLnNsZWVwKDEpCnJlcGVhdCB7CiAgICBTeXMuc2xlZXAoMC4xKQogICAgaWYgKHJzdHVkaW9hcGk6OnRlcm1pbmFsQnVzeShteVRlcm0pID09IEZBTFNFKSB7CiAgICAgICAgcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKQogICAgICAgIGJyZWFrCiAgICB9Cn0KYGBgCgoKCmBgYHtyIGV4dHJhY3Qgam91cm5hbCBuYW1lcyBmcm9tIGFsbCBkYXRhIHhtbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkKcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKApteVRlcm0sCiJ4dHJhY3QgLWlucHV0IGRhdGEvcHVibWVkX3Jlc3VsdF9TRUVSX01lU0gueG1sIC1wYXR0ZXJuIFB1Ym1lZEFydGljbGUgLXNlcCAnICcgLWRlZiAnbmEnIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIFB1YkRhdGUvWWVhciBBZmZpbGlhdGlvbj4gZGF0YS9TRUVSX2NvdW50cmllcy5jc3YgXG4iCikKU3lzLnNsZWVwKDEpCnJlcGVhdCB7ClN5cy5zbGVlcCgwLjEpCmlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgewpwcmludCgiQ29kZSBFeGVjdXRlZCIpCmJyZWFrCn0KfQpgYGAKCgpgYGB7cn0KbGlicmFyeShyZWFkcikKU0VFUl9jb3VudHJpZXMgPC0gcmVhZF9kZWxpbSgiZGF0YS9TRUVSX2NvdW50cmllcy5jc3YiLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gYygiUE1JRCIsICJ5ZWFyIiwgIkFmZmlsaWF0aW9ucyIpLCAKICAgIG5hID0gIk5BIiwgdHJpbV93cyA9IFRSVUUpCiMgVmlldyhTRUVSX2NvdW50cmllcykKYGBgCgpgYGB7cn0KY291bnRyaWVzIDwtIHJlYWRfZGVsaW0oImRhdGEvY291bnRyaWVzLnR4dCIsIGRlbGltID0gInwiLCBjb2xfbmFtZXMgPSBjKCJhYmIiLCAiY291bnRyeSIpKQoKY291bnRyeSA8LSBjb3VudHJpZXMkY291bnRyeQoKY291bnRyeSA8LSBjKGNvdW50cnksIHN0YXRlLm5hbWUpCgpjb3VudHJ5WzgwXSA8LSAiR2VvcmdpYV8iCgpgYGAKCgoKYGBge3J9CiMgU0VFUl9jb3VudHJpZXMgPC0gY2JpbmQoU0VFUl9jb3VudHJpZXMsIHNldE5hbWVzKGxhcHBseShjb3VudHJ5LCBmdW5jdGlvbih4KSB4PU5BKSwgY291bnRyeSkpCgojIG5hbWVzKFNFRVJfY291bnRyaWVzKVsyNTRdIDwtICJHZW9yZ2lhVVNBIgoKCmBgYAoKYGBge3J9CiMgZ3JlcGwocGF0dGVybiA9ICJDaGluYSIsIHggPSBTRUVSX2NvdW50cmllcyRBZmZpbGlhdGlvbnMpCmBgYAoKCmBgYHtyfQojIGRlbmVtZTEgPC0gZ3JlcGwocGF0dGVybiA9IGNvdW50cnlbNDRdLCB4ID0gU0VFUl9jb3VudHJpZXMkQWZmaWxpYXRpb25zKQogICAgCiMgZGVuZW1lMiA8LSBzYXBwbHkoY291bnRyeSwgZnVuY3Rpb24oeCkgZ3JlcGwoeCwgU0VFUl9jb3VudHJpZXMkQWZmaWxpYXRpb25zKSkKCiMgc3VtKGRlbmVtZTEgIT0gZGVuZW1lMlssNDRdKQoKYGBgCgpgYGB7cn0KIyBkZW5lbWUyIDwtIGFzLmRhdGEuZnJhbWUoZGVuZW1lMikKCiMgc3VtKGRlbmVtZTIkVHVya2V5KQpgYGAKCmBgYHtyfQpTRUVSX2NvdW50cmllcyA8LSBjYmluZChTRUVSX2NvdW50cmllcywgc2FwcGx5KGNvdW50cnksIGZ1bmN0aW9uKHgpIGdyZXBsKHgsIFNFRVJfY291bnRyaWVzJEFmZmlsaWF0aW9ucykpKQpgYGAKCgpgYGB7cn0KZGltKFNFRVJfY291bnRyaWVzKVsxXQpgYGAKCkF0IHRoZSB0aW1lIG9mIHRoZSByZXNlYXJjaCB0aGUgbnVtYmVyIG9mIGFydGljbGVzIHdpdGggJ1NFRVIgUHJvZ3JhbSdbTWVzaF0gZm9ybXVsYSBpcyBgciBkaW0oU0VFUl9jb3VudHJpZXMpWzFdYC4KCmBgYHtyfQojIGRlbmVtZSA8LSBjb2xTdW1zKFNFRVJfY291bnRyaWVzWywtKDE6MyldKQoKIyBkZW5lbWUgPC0gYXMuZGF0YS5mcmFtZShkZW5lbWUpCgojIGRlbmVtZSA8LSByb3duYW1lc190b19jb2x1bW4oZGVuZW1lLCB2YXIgPSAiY291bnRyaWVzIikKCiMgbmFtZXMoZGVuZW1lKSA8LSBjKCJjb3VudHJpZXMiLCAibnVtYmVyIikKCiMgZGVuZW1lICU+JSBhcnJhbmdlKGRlc2MobnVtYmVyKSkKCgpgYGAKCmBgYHtyfQpTRUVSX2NvdW50cmllc1tTRUVSX2NvdW50cmllcyA9PSBGQUxTRV0gPC0gMAoKU0VFUl9jb3VudHJpZXNbU0VFUl9jb3VudHJpZXMgPT0gVFJVRV0gPC0gMQoKYGBgCgoKCmBgYHtyfQpjb3VudHJ5VG90YWxzIDwtIFNFRVJfY291bnRyaWVzICU+JSAKICBzZWxlY3QoLWMoMTozKSkgJT4lIAogIHN1bW1hcmlzZV9hbGwoZnVucyhzdW0pKSAKCmNvdW50cnlUb3RhbHNbd2hpY2goY291bnRyeVRvdGFscz4wKV0KCnB1Ymxpc2hlckNvdW50cmllcyA8LSBuYW1lcyhjb3VudHJ5VG90YWxzW3doaWNoKGNvdW50cnlUb3RhbHM+MCldKQoKU0VFUl9jb3VudHJpZXMgPC0gU0VFUl9jb3VudHJpZXMgJT4lIAogIHNlbGVjdChjKDE6MywgcHVibGlzaGVyQ291bnRyaWVzKSkKCmBgYAoKCgpgYGB7cn0KZGVuZW1lIDwtIFNFRVJfY291bnRyaWVzICU+JSAKICBnYXRoZXIoa2V5ID0gIkNvdW50cnkiLCB2YWx1ZSA9ICJOdW1iZXIiLCAtYygxOjMpKSAlPiUgCiAgZ3JvdXBfYnkoQ291bnRyeSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShOdW1iZXIpKQpgYGAKCgpgYGB7cn0KZGVuZW1lICU+JSAKICBmaWx0ZXIoeWVhciAhPSAibmEiKSAlPiUKICBmaWx0ZXIoeWVhciAhPSAiMjAxNyIpICU+JSAKICBmaWx0ZXIoeWVhciAhPSAiMjAxOCIpICU+JSAKZ2dwbG90KCkgKwogIGFlcyh5ID0gdG90YWwsIHggPSB5ZWFyLCBncm91cCA9IENvdW50cnksIGNvbG9yID0gQ291bnRyeSkgKwogIGdlb21fbGluZSgpICsgCiAgZ3VpZGVzKGZpbGw9RkFMU0UsIGNvbG9yPUZBTFNFKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCgoKYGBge3J9ClVTQW5hbWVzIDwtIG5hbWVzKFNFRVJfY291bnRyaWVzKSAlaW4lIHN0YXRlLm5hbWUKCk90aGVycyA8LSBzZXRkaWZmKG5hbWVzKFNFRVJfY291bnRyaWVzWy1jKDE6MyldKSwgYyhVU0FuYW1lcywiVW5pdGVkIFN0YXRlcyIsICJDaGluYSIpKQoKCmRlbmVtZTIgPC0gU0VFUl9jb3VudHJpZXMgJT4lIAogIG11dGF0ZSgKICAgIHN1bVVTQSA9IHJvd1N1bXMoCiAgICAgIHNlbGVjdCguLCBvbmVfb2YoVVNBbmFtZXMpLCBgVW5pdGVkIFN0YXRlc2ApCiAgICAgICkKICAgICkgJT4lIAptdXRhdGUoCiAgICBzdW1PdGhlcnMgPSByb3dTdW1zKAogICAgICBzZWxlY3QoLiwgb25lX29mKE90aGVycykpCiAgICAgICkKICAgICkgJT4lIAogIHNlbGVjdChQTUlELCB5ZWFyLCBDaGluYSwgVVNBID0gc3VtVVNBLCBPdGhlcnMgPSBzdW1PdGhlcnMpCgpgYGAKCmBgYHtyfQpkZW5lbWUzIDwtIGRlbmVtZTIgJT4lIAogIGdhdGhlcihrZXkgPSAiQ291bnRyeSIsIHZhbHVlID0gIk51bWJlciIsIC1jKDE6MikpICU+JSAKICBncm91cF9ieShQTUlELCBDb3VudHJ5LCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKE51bWJlcikpICU+JSAKICBmaWx0ZXIoeWVhciAhPSAibmEiKSAlPiUKICBmaWx0ZXIoeWVhciAhPSAiMjAxNyIpICU+JSAKICBmaWx0ZXIoeWVhciAhPSAiMjAxOCIpICU+JSAKICBmaWx0ZXIodG90YWwgIT0gIjAiKQpgYGAKCgpgYGB7cn0KIyB3aGljaChkdXBsaWNhdGVkKGRlbmVtZTMkUE1JRCkpCiMgd2hpY2goZHVwbGljYXRlZChkZW5lbWUzJFBNSUQpKS0xCgojIGRlbmVtZTNbd2hpY2goZHVwbGljYXRlZChkZW5lbWUzJFBNSUQpKSxdCgp0b2dldGhlciA8LSBiaW5kX2NvbHMoCkZpcnN0ID0gZGVuZW1lMyRDb3VudHJ5W3doaWNoKGR1cGxpY2F0ZWQoZGVuZW1lMyRQTUlEKSldLApTZWNvbmQgPSBkZW5lbWUzJENvdW50cnlbd2hpY2goZHVwbGljYXRlZChkZW5lbWUzJFBNSUQpKS0xXQopCgp0YWJsZSh0b2dldGhlciRGaXJzdCwgdG9nZXRoZXIkU2Vjb25kKSAlPiUgYWRkbWFyZ2lucygpCmJpbmRfY29scygKCmBgYAoKCgpgYGB7cn0KZGVuZW1lNCA8LSBkZW5lbWUyICU+JSAKICBnYXRoZXIoa2V5ID0gIkNvdW50cnkiLCB2YWx1ZSA9ICJOdW1iZXIiLCAtYygxOjIpKSAlPiUgCiAgZ3JvdXBfYnkoQ291bnRyeSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShOdW1iZXIpKSAlPiUgCiAgZmlsdGVyKHllYXIgIT0gIm5hIikgJT4lCiAgZmlsdGVyKHllYXIgIT0gIjIwMTciKSAlPiUgCiAgZmlsdGVyKHllYXIgIT0gIjIwMTgiKSAlPiUgCiAgZmlsdGVyKHRvdGFsICE9ICIwIikKYGBgCgoKCmBgYHtyfQpkZW5lbWU0ICU+JSAKCmdncGxvdCgpICsKICBhZXMoeSA9IHRvdGFsLCB4ID0geWVhciwgZ3JvdXAgPSBDb3VudHJ5LCBjb2xvciA9IENvdW50cnkpICsKICBnZW9tX2xpbmUoKSArIAogICMgZ3VpZGVzKGZpbGw9RkFMU0UsIGNvbG9yPUZBTFNFKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCgoKCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy5mYWNlYm9vay5jb20vcGx1Z2lucy9wb3N0LnBocD9ocmVmPWh0dHBzJTNBJTJGJTJGd3d3LmZhY2Vib29rLmNvbSUyRnNlcmRhcmJhbGNpbWRwYXRob2xvZ2lzdCUyRnBvc3RzJTJGMTkxOTcwNjU4MTQ3OTAwOSZ3aWR0aD01MDAiIHdpZHRoPSI1MDAiIGhlaWdodD0iNTI5IiBzdHlsZT0iYm9yZGVyOm5vbmU7b3ZlcmZsb3c6aGlkZGVuIiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dUcmFuc3BhcmVuY3k9InRydWUiIGFsbG93PSJlbmNyeXB0ZWQtbWVkaWEiPjwvaWZyYW1lPgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPldoaWxlIGhlbHBpbmcgdGhlIHByZXBhcmF0aW9uIG9mIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9QQlBhdGg/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNQQlBhdGg8L2E+IEpvdXJuYWwgV2F0Y2ggKDxhIGhyZWY9Imh0dHBzOi8vdC5jby9XaUJzSml4emxjIj5odHRwczovL3QuY28vV2lCc0ppeHpsYzwvYT4pICBJIHRob3VnaHQgdGhhdCBtYW55IFNFRVIgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9OQ0lDYW5jZXJTdGF0cz9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5ATkNJQ2FuY2VyU3RhdHM8L2E+IHN0dWRpZXMgYXJlIGZyb20gQ2hpbmEuIFNvIHVzaW5nIGVkaXJlY3QgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9OQ0JJP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBOQ0JJPC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JTdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JTdGF0czwvYT4gSSBkcmF3IHRoZSBhdHRhY2hlZCBncmFwaC4gV2hhdCBkbyB5b3UgdGhpbms/IERvIENoaW5lc2UgZG8gcmVzZWFyY2ggb24gU0VFUiB0aGF0IG11Y2g/IDxhIGhyZWY9Imh0dHBzOi8vdC5jby8zT3A1cjlvZmJLIj5waWMudHdpdHRlci5jb20vM09wNXI5b2ZiSzwvYT48L3A+Jm1kYXNoOyBTZXJkYXIgQmFsY8SxIChAc2VyZGFyYmFsY2kpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vc2VyZGFyYmFsY2kvc3RhdHVzLzEwNDg2NjMzMDI5MTY3ODgyMjQ/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciA2LCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKCgo8IS0tIGBgYHtyIFNlYXJjaCBQdWJNZWQgd3JpdGUgMjAxOCBkYXRhIGFzIHhtbCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSAgICAgbXlUZXJtLCAtLT4KPCEtLSAgICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMjAxOCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sID4gZGF0YS9UdXJrZXlfMjAxOC54bWwgXG4iIC0tPgo8IS0tICkgLS0+CjwhLS0gU3lzLnNsZWVwKDEpIC0tPgo8IS0tIHJlcGVhdCB7IC0tPgo8IS0tICAgICBTeXMuc2xlZXAoMC4xKSAtLT4KPCEtLSAgICAgaWYgKHJzdHVkaW9hcGk6OnRlcm1pbmFsQnVzeShteVRlcm0pID09IEZBTFNFKSB7IC0tPgo8IS0tICAgICAgICAgcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKSAtLT4KPCEtLSAgICAgICAgIGJyZWFrIC0tPgo8IS0tICAgICB9IC0tPgo8IS0tIH0gLS0+CjwhLS0gYGBgIC0tPgoKCgoKPCEtLSBgYGB7ciBTZWFyY2ggUHViTWVkIHdyaXRlIGFsbCBkYXRhIGFzIHhtbCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSAgICAgbXlUZXJtLCAtLT4KPCEtLSAgICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMTgwMCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sID4gZGF0YS9UdXJrZXlfYWxsLnhtbCBcbiIgLS0+CjwhLS0gKSAtLT4KPCEtLSBTeXMuc2xlZXAoMSkgLS0+CjwhLS0gcmVwZWF0IHsgLS0+CjwhLS0gICAgIFN5cy5zbGVlcCgwLjEpIC0tPgo8IS0tICAgICBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gICAgICAgICBwcmludCgiQ29kZSBFeGVjdXRlZCIpIC0tPgo8IS0tICAgICAgICAgYnJlYWsgLS0+CjwhLS0gICAgIH0gLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+CgoKCgoKPCEtLSBgYGB7ciBTZWFyY2ggUHViTWVkIGdldCAyMDE4IGRhdGEgb24gdGhlIGZseSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSAgICAgbXlUZXJtLCAtLT4KPCEtLSAgICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMjAxOCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sIHwgeHRyYWN0ICAtcGF0dGVybiBQdWJtZWRBcnRpY2xlIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIFB1YkRhdGUvWWVhciBKb3VybmFsL0lTU04gSVNPQWJicmV2aWF0aW9uPiBkYXRhL29udGhlZmx5X1R1cmtleV8yMDE4LmNzdiBcbiIgLS0+CjwhLS0gKSAtLT4KPCEtLSBTeXMuc2xlZXAoMSkgLS0+CjwhLS0gcmVwZWF0IHsgLS0+CjwhLS0gICAgIFN5cy5zbGVlcCgwLjEpIC0tPgo8IS0tICAgICBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gICAgICAgICBwcmludCgiQ29kZSBFeGVjdXRlZCIpIC0tPgo8IS0tICAgICAgICAgYnJlYWsgLS0+CjwhLS0gICAgIH0gLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+CgoKCjwhLS0gYGBge3IgU2VhcmNoIFB1Yk1lZCBnZXQgYWxsIGRhdGEgb24gdGhlIGZseSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSAgICAgbXlUZXJtLCAtLT4KPCEtLSAgICAgImVzZWFyY2ggLWRiIHB1Ym1lZCAtcXVlcnkgXCJUdXJrZXlbQWZmaWxpYXRpb25dXCIgLWRhdGV0eXBlIFBEQVQgLW1pbmRhdGUgMTgwMCAtbWF4ZGF0ZSAzMDAwIHwgZWZldGNoIC1mb3JtYXQgeG1sIHwgeHRyYWN0ICAtcGF0dGVybiBQdWJtZWRBcnRpY2xlIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIFB1YkRhdGUvWWVhciBKb3VybmFsL0lTU04gSVNPQWJicmV2aWF0aW9uPiBkYXRhL29udGhlZmx5X1R1cmtleV9hbGwuY3N2IFxuIiAtLT4KPCEtLSApIC0tPgo8IS0tIFN5cy5zbGVlcCgxKSAtLT4KPCEtLSByZXBlYXQgeyAtLT4KPCEtLSAgICAgU3lzLnNsZWVwKDAuMSkgLS0+CjwhLS0gICAgIGlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgeyAtLT4KPCEtLSAgICAgICAgIHByaW50KCJDb2RlIEV4ZWN1dGVkIikgLS0+CjwhLS0gICAgICAgICBicmVhayAtLT4KPCEtLSAgICAgfSAtLT4KPCEtLSB9IC0tPgo8IS0tIGBgYCAtLT4KCgoKPCEtLSBKb3VybmFsIE5hbWVzIGFyZSBleHRyYWN0ZWQgZnJvbSB4bWwuIC0tPgoKCgo8IS0tIGBgYHtyIGV4dHJhY3Qgam91cm5hbCBuYW1lcyBmcm9tIDIwMTggeG1sLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfSAtLT4KPCEtLSBteVRlcm0gPC0gcnN0dWRpb2FwaTo6dGVybWluYWxDcmVhdGUoc2hvdyA9IEZBTFNFKSAtLT4KPCEtLSByc3R1ZGlvYXBpOjp0ZXJtaW5hbFNlbmQoIC0tPgo8IS0tIG15VGVybSwgLS0+CjwhLS0gInh0cmFjdCAtaW5wdXQgZGF0YS9UdXJrZXlfMjAxOC54bWwgLXBhdHRlcm4gUHVibWVkQXJ0aWNsZSAtZWxlbWVudCBNZWRsaW5lQ2l0YXRpb24vUE1JRCBQdWJEYXRlL1llYXIgSm91cm5hbC9JU1NOIElTT0FiYnJldmlhdGlvbiA+IGRhdGEvVHVya2V5MjAxOC5jc3YgXG4iIC0tPgo8IS0tICkgLS0+CjwhLS0gU3lzLnNsZWVwKDEpIC0tPgo8IS0tIHJlcGVhdCB7IC0tPgo8IS0tIFN5cy5zbGVlcCgwLjEpIC0tPgo8IS0tIGlmIChyc3R1ZGlvYXBpOjp0ZXJtaW5hbEJ1c3kobXlUZXJtKSA9PSBGQUxTRSkgeyAtLT4KPCEtLSBwcmludCgiQ29kZSBFeGVjdXRlZCIpIC0tPgo8IS0tIGJyZWFrIC0tPgo8IS0tIH0gLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciBleHRyYWN0IGpvdXJuYWwgbmFtZXMgZnJvbSBhbGwgZGF0YSB4bWwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tIG15VGVybSA8LSByc3R1ZGlvYXBpOjp0ZXJtaW5hbENyZWF0ZShzaG93ID0gRkFMU0UpIC0tPgo8IS0tIHJzdHVkaW9hcGk6OnRlcm1pbmFsU2VuZCggLS0+CjwhLS0gbXlUZXJtLCAtLT4KPCEtLSAieHRyYWN0IC1pbnB1dCBkYXRhL1R1cmtleV9hbGwueG1sIC1wYXR0ZXJuIFB1Ym1lZEFydGljbGUgLXNlcCAnICcgLWRlZiAnbmEnIC1lbGVtZW50IE1lZGxpbmVDaXRhdGlvbi9QTUlEIEpvdXJuYWwvSVNTTiBJU09BYmJyZXZpYXRpb24gUHViRGF0ZS9ZZWFyID4gZGF0YS9UdXJrZXlBbGwuY3N2IFxuIiAtLT4KPCEtLSApIC0tPgo8IS0tIFN5cy5zbGVlcCgxKSAtLT4KPCEtLSByZXBlYXQgeyAtLT4KPCEtLSBTeXMuc2xlZXAoMC4xKSAtLT4KPCEtLSBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKSAtLT4KPCEtLSBicmVhayAtLT4KPCEtLSB9IC0tPgo8IS0tIH0gLS0+CjwhLS0gYGBgIC0tPgoKCgo8IS0tIC0tLS0gLS0+CgoKPCEtLSAjIyBSZXRyaWV2YWwgb2YgRGF0YSBvZiBQcm9wZXJ0aWVzIG9mIEpvdXJuYWxzIC0tPgoKCgo8IS0tIFtubG1jYXRhbG9nX3Jlc3VsdF9qb3VybmFsc19wbWMueG1sXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BvcnRhbC91dGlscy9maWxlX2JhY2tlbmQuY2dpP0RiPW5sbWNhdGFsb2cmSGlzdG9yeUlkPU5DSURfMV82OTc1NTI3OF8xMzAuMTQuMTguOTdfNTU1NV8xNTM0NTg1OTM0XzM1OTA2MDY3ODNfME1ldEEwX1NfSFN0b3JlJlF1ZXJ5S2V5PTImU29ydD1QdWJEYXRlJkZpbHRlcj1hbGwmQ29tcGxldGVSZXN1bHRDb3VudD0yNTU5Jk1vZGU9ZmlsZSZWaWV3PXhtbCZwJGw9RW1haWwmcG9ydGFsU25hcHNob3Q9JTJGcHJvamVjdHMlMkZlbnRyZXolMkZwdWJtZWQlMkZQdWJNZWRHcm91cEAxLjEzNiZCYXNlVXJsPSZQb3J0TmFtZT1saXZlJlJvb3RUYWc9TkxNQ2F0YWxvZ1JlY29yZFNldCZEb2NUeXBlPU5MTUNhdGFsb2dSZWNvcmRTZXQlMjBQVUJMSUMlMjAlMjItJTJGJTJGTkxNJTJGJTJGRFREJTIwTkxNQ2F0YWxvZ1JlY29yZFNldCwlMjAxc3QlMjBKdW5lJTIwMjAxNyUyRiUyRkVOJTIyJTIwJTIyaHR0cHM6Ly93d3cubmxtLm5paC5nb3YvZGF0YWJhc2VzL2R0ZC9ubG1jYXRhbG9ncmVjb3Jkc2V0XzE3MDYwMS5kdGQlMjImRmlsZU5hbWU9JkNvbnRlbnRUeXBlPXhtbCkgLS0+CgoKPCEtLSBbbmxtY2F0YWxvZ19yZXN1bHRfY3VycmVudGx5aW5kZXhlZC54bWxdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG9ydGFsL3V0aWxzL2ZpbGVfYmFja2VuZC5jZ2k/RGI9bmxtY2F0YWxvZyZIaXN0b3J5SWQ9TkNJRF8xXzY5NzU1Mjc4XzEzMC4xNC4xOC45N181NTU1XzE1MzQ1ODU5MzRfMzU5MDYwNjc4M18wTWV0QTBfU19IU3RvcmUmUXVlcnlLZXk9MSZTb3J0PVB1YkRhdGUmRmlsdGVyPWFsbCZDb21wbGV0ZVJlc3VsdENvdW50PTUyNDImTW9kZT1maWxlJlZpZXc9eG1sJnAkbD1FbWFpbCZwb3J0YWxTbmFwc2hvdD0lMkZwcm9qZWN0cyUyRmVudHJleiUyRnB1Ym1lZCUyRlB1Yk1lZEdyb3VwQDEuMTM2JkJhc2VVcmw9JlBvcnROYW1lPWxpdmUmUm9vdFRhZz1OTE1DYXRhbG9nUmVjb3JkU2V0JkRvY1R5cGU9TkxNQ2F0YWxvZ1JlY29yZFNldCUyMFBVQkxJQyUyMCUyMi0lMkYlMkZOTE0lMkYlMkZEVEQlMjBOTE1DYXRhbG9nUmVjb3JkU2V0LCUyMDFzdCUyMEp1bmUlMjAyMDE3JTJGJTJGRU4lMjIlMjAlMjJodHRwczovL3d3dy5ubG0ubmloLmdvdi9kYXRhYmFzZXMvZHRkL25sbWNhdGFsb2dyZWNvcmRzZXRfMTcwNjAxLmR0ZCUyMiZGaWxlTmFtZT0mQ29udGVudFR5cGU9eG1sKSAtLT4KCgo8IS0tIFtzY2ltYWdvanIyMDE3LmNzdl0oaHR0cHM6Ly93d3cuc2NpbWFnb2pyLmNvbS9qb3VybmFscmFuay5waHA/b3V0PXhscykgLS0+Cgo8IS0tIFtzY2ltYWdvanIyMDE3LXdvcy5jc3ZdKGh0dHBzOi8vd3d3LnNjaW1hZ29qci5jb20vam91cm5hbHJhbmsucGhwP3dvcz10cnVlJm91dD14bHMpIC0tPgoKCjwhLS0gIVtdKGltYWdlcy9zY2lkYXRhLnBuZykgLS0+CgoKCgoKPCEtLSAtLS0gLS0+CgoKCgoKCjwhLS0gIyMgQW5hbHlzaXMgLS0+Cgo8IS0tIGBgYHtyIE9yZ2FuaXplIEpvdXJuYWwgRGF0YSAxLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfSAtLT4KPCEtLSBsaWJyYXJ5KHRpZHl2ZXJzZSkgLS0+CjwhLS0gbGlicmFyeShyZWFkcikgLS0+Cgo8IS0tIFR1cmtleUFsbCA8LSByZWFkX2RlbGltKCJkYXRhL1R1cmtleUFsbC5jc3YiLCAgLS0+CjwhLS0gICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIC0tPgo8IS0tICAgICBuYSA9ICJuYSIsIHRyaW1fd3MgPSBUUlVFKSAtLT4KCjwhLS0gbmFtZXMoVHVya2V5QWxsKSA8LSBjKCJQTUlEIiwgIklTU04iLCAiSm91cm5hbE5hbWUiLCAiWWVhciIpIC0tPgoKPCEtLSAjIGRpbShUdXJrZXlBbGwpWzFdIC0tPgoKPCEtLSAjIG1pbihUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpIC0tPgoKPCEtLSAjIG1heChUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpIC0tPgoKPCEtLSAjIGdsaW1wc2UoVHVya2V5QWxsKSAtLT4KCjwhLS0gYGBgIC0tPgoKCgo8IS0tIGBgYHtyIE9yZ2FuaXplIEpvdXJuYWwgRGF0YSAyfSAtLT4KPCEtLSB1bmlxdWVKb3VybmFscyA8LSBUdXJrZXlBbGwgJT4lICAtLT4KPCEtLSAgICAgc2VsZWN0KEpvdXJuYWxOYW1lLCBJU1NOKSAlPiUgIC0tPgo8IS0tICAgICB1bmlxdWUoKSAtLT4KCjwhLS0gIyBkaW0odW5pcXVlSm91cm5hbHMpWzFdIC0tPgoKPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciBPcmdhbml6ZSBKb3VybmFsIERhdGEgM30gLS0+Cgo8IS0tIFR1cmtleUFsbDIgPC0gVHVya2V5QWxsICU+JSAgLS0+CjwhLS0gICAgIG11dGF0ZShKb3VybmFsID0gcGFzdGUoSm91cm5hbE5hbWUsIElTU04sIHNlcCA9ICIgSVNTTiAiKSkgLS0+Cgo8IS0tIEFydGljbGVzQnlZZWFyIDwtIFR1cmtleUFsbDIgJT4lICAtLT4KPCEtLSAgICAgZ3JvdXBfYnkoSm91cm5hbCwgWWVhcikgJT4lICAtLT4KPCEtLSAgICAgc3VtbWFyaXNlKG4gPSBuKCkpIC0tPgoKPCEtLSBBcnRpY2xlc0J5WWVhciA8LSBBcnRpY2xlc0J5WWVhciAlPiUgIC0tPgo8IS0tICAgICBzcHJlYWQoa2V5ID0gWWVhciwgdmFsdWUgPSBuKSAtLT4KCjwhLS0gVHVya2V5QWxsMiA8LSBUdXJrZXlBbGwyICU+JSAgLS0+CjwhLS0gICAgIHNlbGVjdChKb3VybmFsLCBKb3VybmFsTmFtZSwgSVNTTikgJT4lICAtLT4KPCEtLSAgICAgdW5pcXVlKCkgLS0+Cgo8IS0tIEFydGljbGVzQnlZZWFyIDwtIGxlZnRfam9pbihBcnRpY2xlc0J5WWVhciwgVHVya2V5QWxsMiwgYnkgPSAiSm91cm5hbCIpICAtLT4KCjwhLS0gQXJ0aWNsZXNCeVllYXIgPC0gQXJ0aWNsZXNCeVllYXIgJT4lIC0tPgo8IS0tICAgICBzZWxlY3QoIC0tPgo8IS0tICAgICBKb3VybmFsLCBKb3VybmFsTmFtZSwgSVNTTiwgZXZlcnl0aGluZygpIC0tPgo8IS0tICAgICApIC0tPgoKPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciBzY2ltYWdvanIyMDE3fSAtLT4KCjwhLS0gYGBgIC0tPgoKCgo8IS0tIC1lbGVtZW50IE1lZGxpbmVUQSAgTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCAtZGVmICduYScgLXNlcCAnXHQnIC1ibG9jayBUaXRsZUFsdGVybmF0ZS9UaXRsZSAgIC1lbGVtZW50IFRpdGxlQWx0ZXJuYXRlL1RpdGxlICAgIC0tPgoKPCEtLSAieHRyYWN0IC1pbnB1dCBkYXRhL25sbWNhdGFsb2dfcmVzdWx0X2N1cnJlbnRseWluZGV4ZWQueG1sIC1wYXR0ZXJuIE5DQklDYXRhbG9nUmVjb3JkIC1lbGVtZW50IElTU05MaW5raW5nIC1kZWYgJ25hJyAtc2VwICcgJyAtYmxvY2sgVGl0bGVBbHRlcm5hdGUvVGl0bGUgLWlmIFRpdGxlQWx0ZXJuYXRlL1RpdGxlQFNvcnQgLWVxdWFscyBOIC1lbGVtZW50IFRpdGxlQWx0ZXJuYXRlL1RpdGxlICA+IGRhdGEvbmxtY2F0YWxvZy5jc3YgXG4iIC0tPgoKPCEtLSAtc2VwICdcdCcgIC0tPgoKCjwhLS0gTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCBJU1NOTGlua2luZyAtLT4KCjwhLS0gYGBge3IgbmxtY2F0YWxvZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gbXlUZXJtIDwtIHJzdHVkaW9hcGk6OnRlcm1pbmFsQ3JlYXRlKHNob3cgPSBGQUxTRSkgLS0+CjwhLS0gcnN0dWRpb2FwaTo6dGVybWluYWxTZW5kKCAtLT4KPCEtLSBteVRlcm0sIC0tPgo8IS0tICJ4dHJhY3QgLWlucHV0IGRhdGEvbmxtY2F0YWxvZ19yZXN1bHRfY3VycmVudGx5aW5kZXhlZC54bWwgLXBhdHRlcm4gTkNCSUNhdGFsb2dSZWNvcmQgLXRhYiAnfCcgLWVsZW1lbnQgTkxNQ2F0YWxvZ1JlY29yZC9ObG1VbmlxdWVJRCAtYmxvY2sgSVNTTkxpbmtpbmcgLXRhYiAnfCcgLWVsZW1lbnQgSVNTTkxpbmtpbmcgLWJsb2NrIFRpdGxlIC1pZiBUaXRsZUBTb3J0IC1lcXVhbHMgTiAtZGVmICduYScgLXRhYiAnfCcgLWVsZW1lbnQgVGl0bGVBbHRlcm5hdGUvVGl0bGUgPiBkYXRhL25sbWNhdGFsb2cuY3N2IFxuIiAtLT4KPCEtLSApIC0tPgo8IS0tIFN5cy5zbGVlcCgxKSAtLT4KPCEtLSByZXBlYXQgeyAtLT4KPCEtLSBTeXMuc2xlZXAoMC4xKSAtLT4KPCEtLSBpZiAocnN0dWRpb2FwaTo6dGVybWluYWxCdXN5KG15VGVybSkgPT0gRkFMU0UpIHsgLS0+CjwhLS0gcHJpbnQoIkNvZGUgRXhlY3V0ZWQiKSAtLT4KPCEtLSBicmVhayAtLT4KPCEtLSB9IC0tPgo8IS0tIH0gLS0+Cgo8IS0tIGBgYCAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gbGlicmFyeShyZWFkcikgLS0+CjwhLS0gbmxtY2F0YWxvZyA8LSByZWFkX2RlbGltKCJkYXRhL25sbWNhdGFsb2cuY3N2IiwgIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJ8IiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IEZBTFNFLCAgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW1fd3MgPSBUUlVFKSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+Cgo8IS0tIGxpYnJhcnkoeG1sMikgLS0+CjwhLS0gZGF0YSA8LSByZWFkX3htbCgiZGF0YS9ubG1jYXRhbG9nX3Jlc3VsdF9jdXJyZW50bHlpbmRleGVkLnhtbCIpIC0tPgoKPCEtLSAjIFBvaW50IGxvY2F0aW9ucyAtLT4KPCEtLSBwb2ludCA8LSBkYXRhICU+JSB4bWxfZmluZF9hbGwoIi8vcG9pbnRlciIpIC0tPgo8IS0tIHBvaW50ICU+JSB4bWxfYXR0cigibGF0aXR1ZGUiKSAlPiUgYXMubnVtZXJpYygpIC0tPgo8IS0tIHBvaW50ICU+JSB4bWxfYXR0cigibG9uZ2l0dWRlIikgJT4lIGFzLm51bWVyaWMoKSAtLT4KCjwhLS0gIyBTdGFydCB0aW1lIC0tPgo8IS0tIGRhdGEgJT4lICAtLT4KPCEtLSAgIHhtbF9maW5kX2FsbCgiLy9zdGFydC12YWxpZC10aW1lIikgJT4lICAtLT4KPCEtLSAgIHhtbF90ZXh0KCkgLS0+Cgo8IS0tICMgVGVtcGVyYXR1cmUgLS0+CjwhLS0gZGF0YSAlPiUgIC0tPgo8IS0tICAgeG1sX2ZpbmRfYWxsKCIvL3RlbXBlcmF0dXJlW0B0eXBlPSdob3VybHknXS92YWx1ZSIpICU+JSAgLS0+CjwhLS0gICB4bWxfdGV4dCgpICU+JSAgLS0+CjwhLS0gICBhcy5pbnRlZ2VyKCkgLS0+CgoKCjwhLS0gYGBgIC0tPgoKCjwhLS0gLS0tIC0tPgoKPCEtLSAjIyBSZXN1bHRzIC0tPgoKPCEtLSAtIFB1Yk1lZCdkZSAqKmByIG1pbihUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpYC1gciBtYXgoVHVya2V5QWxsWyw0XSwgbmEucm0gPSBUUlVFKWAqKiB0YXJpaGxlcmkgYXJhc8SxbmRhLCAqVMO8cmtpeWUqIGFkcmVzbGkgKipgciBkaW0oVHVya2V5QWxsKVsxXWAqKiBhZGV0IHlhecSxbiBtZXZjdXR0dXIuIC0tPgoKPCEtLSAtIFB1Yk1lZCdkZSAqKmByIG1pbihUdXJrZXlBbGxbLDRdLCBuYS5ybSA9IFRSVUUpYC1gciBtYXgoVHVya2V5QWxsWyw0XSwgbmEucm0gPSBUUlVFKWAqKiB0YXJpaGxlcmkgYXJhc8SxbmRhLCAqVMO8cmtpeWUqIGFkcmVzbGkgeWF5xLFubGFyICoqYHIgZGltKHVuaXF1ZUpvdXJuYWxzKVsxXWAqKiBmYXJrbMSxIGRlcmdpZGUgeWF5xLFtbGFubcSxxZ90xLFyLiAtLT4KCgoKCgo8IS0tIC0tLSAtLT4KCjwhLS0gIyMgRGlzY3Vzc2lvbiAtLT4KCjwhLS0gdMO8cmtpeWUgYWRyZXNsaSBvbHVwIGRhIHB1Ym1lZGRlIHllciBhbGFuIG1ha2FsZWxlciBoYW5naSBkZXJnaWxlcmRlIGthw6dhciBhZGV0IHlhecSxbmxhbm3EscWfIC0tPgoKCjwhLS0gVGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiB3YXMgY29tcGlsZWQgaW4gYSB0YWJsZS4gLS0+CgoKCgoKPCEtLSAqKk1ldGhvZHM6KiogLS0+CgoKCgoKCgoKCjwhLS0gKipSZXN1bHQ6KiogLS0+CgoKPCEtLSBgYGB7ciBwbG90IDF9IC0tPgo8IS0tIGdncGxvdChkYXRhID0gYXJ0aWNsZXNfcGVyX2pvdXJuYWwsIGFlcyh4ID0gSm91cm5hbCwgeSA9IG4sIGdyb3VwID0gQ291bnRyeSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvdW50cnksIHNoYXBlID0gQ291bnRyeSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IENvdW50cnkgLS0+CjwhLS0gKSkgKyAtLT4KPCEtLSAgICAgZ2VvbV9wb2ludCgpICsgLS0+CjwhLS0gICAgIGxhYnMoeCA9ICJKb3VybmFscyB3aXRoIGRlY3JlYXNpbmcgaW1wYWN0IGZhY3RvciIsIHkgPSAiTnVtYmVyIG9mIEFydGljbGVzIikgKyAtLT4KPCEtLSAgICAgZ2d0aXRsZSgiUGF0aG9sb2d5IEFydGljbGVzIFBlciBKb3VybmFsIikgKyAgLS0+CjwhLS0gICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCAtLT4KPCEtLSAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSAtLT4KCjwhLS0gYGBgIC0tPgoKCjwhLS0gKipDb21tZW50OioqIC0tPgoKCgoKPCEtLSAtLS0gLS0+CgoKPCEtLSAjIyBGZWVkYmFjayAtLT4KCjwhLS0gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9naXRodWIuY29tL3NiYWxjaSkgd291bGQgbGlrZSB0byBoZWFyIHlvdXIgZmVlZGJhY2s6IGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzIC0tPgoKPCEtLSBUaGlzIGRvY3VtZW50IHdpbGwgYmUgY29udGluaW91c2x5IHVwZGF0ZWQgYW5kIHRoZSBsYXN0IHVwZGF0ZSB3YXMgb24gYHIgU3lzLkRhdGUoKWAuIC0tPgoKPCEtLSAtLS0gLS0+Cgo8IS0tICMjIEJhY2sgdG8gTWFpbiBNZW51IC0tPgoKPCEtLSBbTWFpbiBQYWdlIGZvciBCaWJsaW9ncmFwaGljIEFuYWx5c2lzXShodHRwczovL3NiYWxjaS5naXRodWIuaW8vcHVibWVkL0JpYmxpb2dyYXBoaWNTdHVkaWVzLmh0bWwpIC0tPgoKPCEtLSAtLS0gLS0+
+ + + +
+ + + + + + + + diff --git a/correction pathology articles b/correction pathology articles new file mode 100644 index 0000000..e745e56 --- /dev/null +++ b/correction pathology articles @@ -0,0 +1 @@ +correction pathology articles \ No newline at end of file diff --git a/data/.gitignore b/data/.gitignore index a85a09d..0b20536 100644 --- a/data/.gitignore +++ b/data/.gitignore @@ -4,3 +4,5 @@ TurkeyAll.csv Turkey_all.xml onthefly_Turkey_2018.xml Turkey2018.csv +/data/ + diff --git a/neutrophil lymph ratio.txt b/neutrophil lymph ratio.txt new file mode 100644 index 0000000..0da7f4e --- /dev/null +++ b/neutrophil lymph ratio.txt @@ -0,0 +1 @@ +neutrophil lymph ratio \ No newline at end of file diff --git a/retracted pathology articles b/retracted pathology articles new file mode 100644 index 0000000..23c45b6 --- /dev/null +++ b/retracted pathology articles @@ -0,0 +1 @@ +retracted pathology articles \ No newline at end of file