Introduction

Pick three of your favorite books on one of your favorite subjects. At least one of the books should have more than one author. For each book, include the title, authors, and two or three other attributes that you find interesting. Take the information that you’ve selected about these three books, and separately create three files which store the book’s information in HTML (using an html table), XML, and JSON formats (e.g. “books.html”, “books.xml”, and “books.json”). To help you better understand the different file structures, I’d prefer that you create each of these files “by hand” unless you’re already very comfortable with the file formats. Write R code, using your packages of choice, to load the information from each of the three sources into separate R data frames. Are the three data frames identical?

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
library(openintro)
## Warning: package 'openintro' was built under R version 4.2.3
library(dplyr)
library(data.table)
## Warning: package 'data.table' was built under R version 4.2.3
library(XML)
## Warning: package 'XML' was built under R version 4.2.3
library(rvest)
library(DT)
## Warning: package 'DT' was built under R version 4.2.3
library(RCurl)
## Warning: package 'RCurl' was built under R version 4.2.3
library(jsonlite)
## Warning: package 'jsonlite' was built under R version 4.2.3

HTML

Loading dataset

bookshtml <- readLines("https://raw.githubusercontent.com/lburenkov/607week7/main/Book607.html")
bookshtml
## [1] "Book\tAuthors\tSubject\tPublication_date\tLanguage"                      
## [2] "Why Nations Fail\tDaron Acemoglu, James Robinson\tEconomy\t2012\tEnglish"
## [3] "Pride and Prejudice\tJane Austen\tNovel\t1813\tEnglish"                  
## [4] "La borra del café\tMario Benedetti\tNovel\t1992\tEspañol"
books.html.url <-getURL("https://raw.githubusercontent.com/lburenkov/607week7/main/Book607.html")
books.html.url
## [1] "Book\tAuthors\tSubject\tPublication_date\tLanguage\r\nWhy Nations Fail\tDaron Acemoglu, James Robinson\tEconomy\t2012\tEnglish\r\nPride and Prejudice\tJane Austen\tNovel\t1813\tEnglish\r\nLa borra del café\tMario Benedetti\tNovel\t1992\tEspañol\r\n"
records2 <- strsplit(books.html.url, "\r\n")[[1]]
records2
## [1] "Book\tAuthors\tSubject\tPublication_date\tLanguage"                      
## [2] "Why Nations Fail\tDaron Acemoglu, James Robinson\tEconomy\t2012\tEnglish"
## [3] "Pride and Prejudice\tJane Austen\tNovel\t1813\tEnglish"                  
## [4] "La borra del café\tMario Benedetti\tNovel\t1992\tEspañol"
# Create an empty data frame to store the structured data
structured_data2 <- data.frame(
  Book = character(0),
  Authors = character(0),
  Subject = character(0),
  Publication_date = character(0),
  Language = character(0)
)

# Loop through each record
for (record in records2) {
  # Split each record using "\t" (tab) as the delimiter
  fields <- unlist(strsplit(record, "\t"))

  # Extract and organize the data into the data frame
  structured_data2 <- rbind(structured_data2, data.frame(
    Book = fields[1],
    Authors = fields[2],
    Subject = fields[3],
    Publication_date = fields[4],
    Language = fields[5]
  ))
}

# Print the structured data
print(structured_data2)
##                  Book                        Authors Subject Publication_date
## 1                Book                        Authors Subject Publication_date
## 2    Why Nations Fail Daron Acemoglu, James Robinson Economy             2012
## 3 Pride and Prejudice                    Jane Austen   Novel             1813
## 4   La borra del café                Mario Benedetti   Novel             1992
##   Language
## 1 Language
## 2  English
## 3  English
## 4  Español

Reading into a dataframe

data.frame(structured_data2)
##                  Book                        Authors Subject Publication_date
## 1                Book                        Authors Subject Publication_date
## 2    Why Nations Fail Daron Acemoglu, James Robinson Economy             2012
## 3 Pride and Prejudice                    Jane Austen   Novel             1813
## 4   La borra del café                Mario Benedetti   Novel             1992
##   Language
## 1 Language
## 2  English
## 3  English
## 4  Español

XML

Loading dataset

books.xml.url <- getURL('https://raw.githubusercontent.com/lburenkov/607week7/main/Book607.xml')
books.xml.url
## [1] "Book\tAuthors\tSubject\tPublication_date\tLanguage\r\nWhy Nations Fail\tDaron Acemoglu, James Robinson\tEconomy\t2012\tEnglish\r\nPride and Prejudice\tJane Austen\tNovel\t1813\tEnglish\r\nLa borra del café\tMario Benedetti\tNovel\t1992\tEspañol\r\n"
records1 <- strsplit(books.xml.url, "\r\n")[[1]]
records1
## [1] "Book\tAuthors\tSubject\tPublication_date\tLanguage"                      
## [2] "Why Nations Fail\tDaron Acemoglu, James Robinson\tEconomy\t2012\tEnglish"
## [3] "Pride and Prejudice\tJane Austen\tNovel\t1813\tEnglish"                  
## [4] "La borra del café\tMario Benedetti\tNovel\t1992\tEspañol"
# Create an empty data frame to store the structured data
structured_data1 <- data.frame(
  Book = character(0),
  Authors = character(0),
  Subject = character(0),
  Publication_date = character(0),
  Language = character(0)
)

# Remove the header row
records1 <- records1[-1]

# Loop through each record
for (record in records1) {
  # Split each record using "\t" as a delimiter
  fields <- unlist(strsplit(record, "\t"))

  # Extract and organize the data into the data frame
  structured_data1 <- rbind(structured_data1, data.frame(
    Book = fields[1],
    Authors = fields[2],
    Subject = fields[3],
    Publication_date = fields[4],
    Language = fields[5]
  ))
}

# Print the structured data
print(structured_data1)
##                  Book                        Authors Subject Publication_date
## 1    Why Nations Fail Daron Acemoglu, James Robinson Economy             2012
## 2 Pride and Prejudice                    Jane Austen   Novel             1813
## 3   La borra del café                Mario Benedetti   Novel             1992
##   Language
## 1  English
## 2  English
## 3  Español

Reading into a dataframe

data.frame(structured_data1)
##                  Book                        Authors Subject Publication_date
## 1    Why Nations Fail Daron Acemoglu, James Robinson Economy             2012
## 2 Pride and Prejudice                    Jane Austen   Novel             1813
## 3   La borra del café                Mario Benedetti   Novel             1992
##   Language
## 1  English
## 2  English
## 3  Español

JSON

Loading dataset

books.json.url <- getURL("https://raw.githubusercontent.com/lburenkov/607week7/main/books607.json")
books.json.url
## [1] "Json\r\n\"Why Nations Fail\":\"Daron Acemoglu, James Robinson\":\"Economy\":\"2012\":\"English\",\r\n\"Pride and Prejudice\":\"Jane Austen\":\"Novel\":\"1813\":\"English\",\r\n\"La borra del café\":\"Mario Benedetti\":\"Novel\":\"1992\":\"Español\",\r\n"
head(books.json.url)
## [1] "Json\r\n\"Why Nations Fail\":\"Daron Acemoglu, James Robinson\":\"Economy\":\"2012\":\"English\",\r\n\"Pride and Prejudice\":\"Jane Austen\":\"Novel\":\"1813\":\"English\",\r\n\"La borra del café\":\"Mario Benedetti\":\"Novel\":\"1992\":\"Español\",\r\n"
records <- strsplit(books.json.url, "\r\n")[[1]]
records
## [1] "Json"                                                                                     
## [2] "\"Why Nations Fail\":\"Daron Acemoglu, James Robinson\":\"Economy\":\"2012\":\"English\","
## [3] "\"Pride and Prejudice\":\"Jane Austen\":\"Novel\":\"1813\":\"English\","                  
## [4] "\"La borra del café\":\"Mario Benedetti\":\"Novel\":\"1992\":\"Español\","
# Create an empty data frame to store the structured data
structured_data <- data.frame(
  Title = character(0),
  Author = character(0),
  Genre = character(0),
  Year = character(0),
  Language = character(0)
)

# Loop through each record
for (record in records) {
  # Split each record using ":" as a delimiter
  fields <- unlist(strsplit(record, ":"))

  # Extract and organize the data into the data frame
  structured_data <- rbind(structured_data, data.frame(
    Title = fields[1],
    Author = fields[2],
    Genre = fields[3],
    Year = fields[4],
    Language = fields[5]
  ))
}

# Print the structured data
print(structured_data)
##                   Title                           Author     Genre   Year
## 1                  Json                             <NA>      <NA>   <NA>
## 2    "Why Nations Fail" "Daron Acemoglu, James Robinson" "Economy" "2012"
## 3 "Pride and Prejudice"                    "Jane Austen"   "Novel" "1813"
## 4   "La borra del café"                "Mario Benedetti"   "Novel" "1992"
##     Language
## 1       <NA>
## 2 "English",
## 3 "English",
## 4 "Español",

Reading into a dataframe

data.frame(structured_data)
##                   Title                           Author     Genre   Year
## 1                  Json                             <NA>      <NA>   <NA>
## 2    "Why Nations Fail" "Daron Acemoglu, James Robinson" "Economy" "2012"
## 3 "Pride and Prejudice"                    "Jane Austen"   "Novel" "1813"
## 4   "La borra del café"                "Mario Benedetti"   "Novel" "1992"
##     Language
## 1       <NA>
## 2 "English",
## 3 "English",
## 4 "Español",

Conclusions:

Processes were very different when reading this files. The data frames look different but I think its because of files were read and how I have been working with them. Certainly data frames need more work on some files than the others which I believe it is the main point of this exercise.

LS0tDQp0aXRsZTogIldvcmtpbmcgd2l0aCBYTUwgYW5kIEpTT04gaW4gUiINCmF1dGhvcjogIkxhdXJhIFB1ZWJsYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KIyMjIEludHJvZHVjdGlvbg0KUGljayB0aHJlZSBvZiB5b3VyIGZhdm9yaXRlIGJvb2tzIG9uIG9uZSBvZiB5b3VyIGZhdm9yaXRlIHN1YmplY3RzLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGJvb2tzIHNob3VsZCBoYXZlIG1vcmUNCnRoYW4gb25lIGF1dGhvci4gRm9yIGVhY2ggYm9vaywgaW5jbHVkZSB0aGUgdGl0bGUsIGF1dGhvcnMsIGFuZCB0d28gb3IgdGhyZWUgb3RoZXIgYXR0cmlidXRlcyB0aGF0IHlvdSBmaW5kDQppbnRlcmVzdGluZy4NClRha2UgdGhlIGluZm9ybWF0aW9uIHRoYXQgeW914oCZdmUgc2VsZWN0ZWQgYWJvdXQgdGhlc2UgdGhyZWUgYm9va3MsIGFuZCBzZXBhcmF0ZWx5IGNyZWF0ZSB0aHJlZSBmaWxlcyB3aGljaA0Kc3RvcmUgdGhlIGJvb2vigJlzIGluZm9ybWF0aW9uIGluIEhUTUwgKHVzaW5nIGFuIGh0bWwgdGFibGUpLCBYTUwsIGFuZCBKU09OIGZvcm1hdHMgKGUuZy4g4oCcYm9va3MuaHRtbOKAnSwNCuKAnGJvb2tzLnhtbOKAnSwgYW5kIOKAnGJvb2tzLmpzb27igJ0pLiBUbyBoZWxwIHlvdSBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZGlmZmVyZW50IGZpbGUgc3RydWN0dXJlcywgSeKAmWQgcHJlZmVyIHRoYXQgeW91DQpjcmVhdGUgZWFjaCBvZiB0aGVzZSBmaWxlcyDigJxieSBoYW5k4oCdIHVubGVzcyB5b3XigJlyZSBhbHJlYWR5IHZlcnkgY29tZm9ydGFibGUgd2l0aCB0aGUgZmlsZSBmb3JtYXRzLg0KV3JpdGUgUiBjb2RlLCB1c2luZyB5b3VyIHBhY2thZ2VzIG9mIGNob2ljZSwgdG8gbG9hZCB0aGUgaW5mb3JtYXRpb24gZnJvbSBlYWNoIG9mIHRoZSB0aHJlZSBzb3VyY2VzIGludG8NCnNlcGFyYXRlIFIgZGF0YSBmcmFtZXMuIEFyZSB0aGUgdGhyZWUgZGF0YSBmcmFtZXMgaWRlbnRpY2FsPw0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KFhNTCkNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShSQ3VybCkNCmxpYnJhcnkoanNvbmxpdGUpDQpgYGANCiMjIEhUTUwNCg0KIyMjIExvYWRpbmcgZGF0YXNldA0KDQoNCmBgYHtyfQ0KYm9va3NodG1sIDwtIHJlYWRMaW5lcygiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2xidXJlbmtvdi82MDd3ZWVrNy9tYWluL0Jvb2s2MDcuaHRtbCIpDQpib29rc2h0bWwNCmBgYA0KDQpgYGB7cn0NCmJvb2tzLmh0bWwudXJsIDwtZ2V0VVJMKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbGJ1cmVua292LzYwN3dlZWs3L21haW4vQm9vazYwNy5odG1sIikNCg0KDQpgYGANCg0KYGBge3J9DQpib29rcy5odG1sLnVybA0KYGBgDQpgYGB7cn0NCnJlY29yZHMyIDwtIHN0cnNwbGl0KGJvb2tzLmh0bWwudXJsLCAiXHJcbiIpW1sxXV0NCnJlY29yZHMyDQpgYGANCmBgYHtyfQ0KDQoNCiMgQ3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gc3RvcmUgdGhlIHN0cnVjdHVyZWQgZGF0YQ0Kc3RydWN0dXJlZF9kYXRhMiA8LSBkYXRhLmZyYW1lKA0KICBCb29rID0gY2hhcmFjdGVyKDApLA0KICBBdXRob3JzID0gY2hhcmFjdGVyKDApLA0KICBTdWJqZWN0ID0gY2hhcmFjdGVyKDApLA0KICBQdWJsaWNhdGlvbl9kYXRlID0gY2hhcmFjdGVyKDApLA0KICBMYW5ndWFnZSA9IGNoYXJhY3RlcigwKQ0KKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIHJlY29yZA0KZm9yIChyZWNvcmQgaW4gcmVjb3JkczIpIHsNCiAgIyBTcGxpdCBlYWNoIHJlY29yZCB1c2luZyAiXHQiICh0YWIpIGFzIHRoZSBkZWxpbWl0ZXINCiAgZmllbGRzIDwtIHVubGlzdChzdHJzcGxpdChyZWNvcmQsICJcdCIpKQ0KDQogICMgRXh0cmFjdCBhbmQgb3JnYW5pemUgdGhlIGRhdGEgaW50byB0aGUgZGF0YSBmcmFtZQ0KICBzdHJ1Y3R1cmVkX2RhdGEyIDwtIHJiaW5kKHN0cnVjdHVyZWRfZGF0YTIsIGRhdGEuZnJhbWUoDQogICAgQm9vayA9IGZpZWxkc1sxXSwNCiAgICBBdXRob3JzID0gZmllbGRzWzJdLA0KICAgIFN1YmplY3QgPSBmaWVsZHNbM10sDQogICAgUHVibGljYXRpb25fZGF0ZSA9IGZpZWxkc1s0XSwNCiAgICBMYW5ndWFnZSA9IGZpZWxkc1s1XQ0KICApKQ0KfQ0KDQojIFByaW50IHRoZSBzdHJ1Y3R1cmVkIGRhdGENCnByaW50KHN0cnVjdHVyZWRfZGF0YTIpDQoNCmBgYA0KDQoNCiMjIyBSZWFkaW5nIGludG8gYSBkYXRhZnJhbWUNCmBgYHtyfQ0KZGF0YS5mcmFtZShzdHJ1Y3R1cmVkX2RhdGEyKQ0KYGBgDQoNCg0KDQoNCg0KIyMgWE1MDQoNCiMjIyBMb2FkaW5nIGRhdGFzZXQNCg0KDQpgYGB7cn0NCmJvb2tzLnhtbC51cmwgPC0gZ2V0VVJMKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbGJ1cmVua292LzYwN3dlZWs3L21haW4vQm9vazYwNy54bWwnKQ0KYm9va3MueG1sLnVybA0KYGBgDQpgYGB7cn0NCnJlY29yZHMxIDwtIHN0cnNwbGl0KGJvb2tzLnhtbC51cmwsICJcclxuIilbWzFdXQ0KcmVjb3JkczENCmBgYA0KYGBge3J9DQojIENyZWF0ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBzdHJ1Y3R1cmVkIGRhdGENCnN0cnVjdHVyZWRfZGF0YTEgPC0gZGF0YS5mcmFtZSgNCiAgQm9vayA9IGNoYXJhY3RlcigwKSwNCiAgQXV0aG9ycyA9IGNoYXJhY3RlcigwKSwNCiAgU3ViamVjdCA9IGNoYXJhY3RlcigwKSwNCiAgUHVibGljYXRpb25fZGF0ZSA9IGNoYXJhY3RlcigwKSwNCiAgTGFuZ3VhZ2UgPSBjaGFyYWN0ZXIoMCkNCikNCg0KIyBSZW1vdmUgdGhlIGhlYWRlciByb3cNCnJlY29yZHMxIDwtIHJlY29yZHMxWy0xXQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIHJlY29yZA0KZm9yIChyZWNvcmQgaW4gcmVjb3JkczEpIHsNCiAgIyBTcGxpdCBlYWNoIHJlY29yZCB1c2luZyAiXHQiIGFzIGEgZGVsaW1pdGVyDQogIGZpZWxkcyA8LSB1bmxpc3Qoc3Ryc3BsaXQocmVjb3JkLCAiXHQiKSkNCg0KICAjIEV4dHJhY3QgYW5kIG9yZ2FuaXplIHRoZSBkYXRhIGludG8gdGhlIGRhdGEgZnJhbWUNCiAgc3RydWN0dXJlZF9kYXRhMSA8LSByYmluZChzdHJ1Y3R1cmVkX2RhdGExLCBkYXRhLmZyYW1lKA0KICAgIEJvb2sgPSBmaWVsZHNbMV0sDQogICAgQXV0aG9ycyA9IGZpZWxkc1syXSwNCiAgICBTdWJqZWN0ID0gZmllbGRzWzNdLA0KICAgIFB1YmxpY2F0aW9uX2RhdGUgPSBmaWVsZHNbNF0sDQogICAgTGFuZ3VhZ2UgPSBmaWVsZHNbNV0NCiAgKSkNCn0NCg0KIyBQcmludCB0aGUgc3RydWN0dXJlZCBkYXRhDQpwcmludChzdHJ1Y3R1cmVkX2RhdGExKQ0KDQpgYGANCg0KDQoNCiMjIyBSZWFkaW5nIGludG8gYSBkYXRhZnJhbWUNCmBgYHtyfQ0KZGF0YS5mcmFtZShzdHJ1Y3R1cmVkX2RhdGExKQ0KYGBgDQoNCg0KIyMgSlNPTg0KDQojIyMgTG9hZGluZyBkYXRhc2V0DQoNCmBgYHtyfQ0KYm9va3MuanNvbi51cmwgPC0gZ2V0VVJMKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbGJ1cmVua292LzYwN3dlZWs3L21haW4vYm9va3M2MDcuanNvbiIpDQpib29rcy5qc29uLnVybA0KYGBgDQpgYGB7cn0NCmhlYWQoYm9va3MuanNvbi51cmwpDQpgYGANCg0KDQoNCmBgYHtyfQ0KcmVjb3JkcyA8LSBzdHJzcGxpdChib29rcy5qc29uLnVybCwgIlxyXG4iKVtbMV1dDQpgYGANCg0KYGBge3J9DQpyZWNvcmRzDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYW4gZW1wdHkgZGF0YSBmcmFtZSB0byBzdG9yZSB0aGUgc3RydWN0dXJlZCBkYXRhDQpzdHJ1Y3R1cmVkX2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgVGl0bGUgPSBjaGFyYWN0ZXIoMCksDQogIEF1dGhvciA9IGNoYXJhY3RlcigwKSwNCiAgR2VucmUgPSBjaGFyYWN0ZXIoMCksDQogIFllYXIgPSBjaGFyYWN0ZXIoMCksDQogIExhbmd1YWdlID0gY2hhcmFjdGVyKDApDQopDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggcmVjb3JkDQpmb3IgKHJlY29yZCBpbiByZWNvcmRzKSB7DQogICMgU3BsaXQgZWFjaCByZWNvcmQgdXNpbmcgIjoiIGFzIGEgZGVsaW1pdGVyDQogIGZpZWxkcyA8LSB1bmxpc3Qoc3Ryc3BsaXQocmVjb3JkLCAiOiIpKQ0KDQogICMgRXh0cmFjdCBhbmQgb3JnYW5pemUgdGhlIGRhdGEgaW50byB0aGUgZGF0YSBmcmFtZQ0KICBzdHJ1Y3R1cmVkX2RhdGEgPC0gcmJpbmQoc3RydWN0dXJlZF9kYXRhLCBkYXRhLmZyYW1lKA0KICAgIFRpdGxlID0gZmllbGRzWzFdLA0KICAgIEF1dGhvciA9IGZpZWxkc1syXSwNCiAgICBHZW5yZSA9IGZpZWxkc1szXSwNCiAgICBZZWFyID0gZmllbGRzWzRdLA0KICAgIExhbmd1YWdlID0gZmllbGRzWzVdDQogICkpDQp9DQoNCiMgUHJpbnQgdGhlIHN0cnVjdHVyZWQgZGF0YQ0KcHJpbnQoc3RydWN0dXJlZF9kYXRhKQ0KDQpgYGANCg0KIyMjIFJlYWRpbmcgaW50byBhIGRhdGFmcmFtZQ0KYGBge3J9DQpkYXRhLmZyYW1lKHN0cnVjdHVyZWRfZGF0YSkNCmBgYA0KDQoNCiMjIyBDb25jbHVzaW9uczoNClByb2Nlc3NlcyB3ZXJlIHZlcnkgZGlmZmVyZW50IHdoZW4gcmVhZGluZyB0aGlzIGZpbGVzLiBUaGUgZGF0YSBmcmFtZXMgbG9vayBkaWZmZXJlbnQgYnV0IEkgdGhpbmsgaXRzIGJlY2F1c2Ugb2YgZmlsZXMgd2VyZSByZWFkIGFuZCBob3cgSSBoYXZlIGJlZW4gd29ya2luZyB3aXRoIHRoZW0uIENlcnRhaW5seSBkYXRhIGZyYW1lcyBuZWVkIG1vcmUgd29yayBvbiBzb21lIGZpbGVzIHRoYW4gdGhlIG90aGVycyB3aGljaCBJIGJlbGlldmUgaXQgaXMgdGhlIG1haW4gcG9pbnQgb2YgdGhpcyBleGVyY2lzZS4gDQo=