Code
Algoritma & Struktur Data
~ Ujian Tengah Semester ~
Pendahuluan
Menghubungkan suatu data pada saat pengolahan data di data science sangatlah penting dimana data tersebut dapat di simpan dalam bentuk csv, excel, txt, rds, xml, json, dan lainnya yang dapat di baca maupun dijalankan menggunakan R yang tersimpan baik di luar maupun di dalma direktori. Berikut beberapa cara yang dapat diterapkan pada R.
Impor/Ekspor Data CSV
Berikut 3 cara untuk impor maupun ekspor data pada R.
Cara 1
# memanggil direktori dengan
print (getwd ())
## [1] "D:/brigita tiara KULIAH/kuliah semester 3/alogaritma"
## [1] "D:/brigita tiara KULIAH/kuliah semester 3/alogaritma"
Selain itu, adapun proses impor data dalam bentuk CSV dengan fungsi read.csv()
setwd (getwd ())
df1 <- read.csv ("Input/input1.csv" ,sep = "," ) # format pemisah koma
df1
df2 <- read.csv ("Input/input2.csv" ,sep = ";" ) # format pemisah titik koma
Adapun proses ekspor data dalam bentuk CSV dengan menggunakan fungsi write.csv()
write.csv (df1,"Output/output1.csv" , row.names = FALSE ) # tanda pemisah koma yaitu ","
write.csv (df2,"Output/output2.csv" , row.names = FALSE ) # tanda pemisah koma yaitu ";"
Cara 2
Dengan menggunakan cara praktis dalam mengundang direktori otomatis.
(WD= getwd ()) # yang digunakan untuk menyeting direktori
## [1] "D:/brigita tiara KULIAH/kuliah semester 3/alogaritma"
if (! is.null (WD)) setwd (WD)
Cara mengimpor data
df1 <- read.csv (file.path (WD, 'Input' , 'input1.csv' ))
df2 <- read.csv (file.path (WD, 'Input' , 'input1.csv' ))
Cara engekspor data
write.csv (df1, file.path (WD, 'Input' , 'input1.csv' ), row.names= FALSE )
write.csv (df2, file.path (WD, 'Input' , 'input1.csv' ), row.names= FALSE )
Cara 3
Pada cara ke-3 ini merupakan cara alternatif yang dilakukan tanpa adanya pengaturan direktori sebelum pengimporan data.
df3<- read.csv (file.choose ())
df3
Impor/Ekspor Data Pada Excel
Dengan Excel data dapat di simpan melalui format .xls atau .xlsx dan R dapat membaca menggunakan funsi readxl
#install.packages(c("readxl", "writexl")) # install `readxl & writexl`
pacman:: p_load (readxl, writexl) # load `readxl & writexl`
# impor data
df3<- read_excel ("Input/input4.xls" ) # impor data xls (97-2003)
df4<- read_excel ("Input/input3.xlsx" ,sheet= 1 ) # impor data xlsx (2003-up)
# ekspor data
write_xlsx (df3,"Output/output3.xls" )
write_xlsx (df4,"Output/output4.xlsx" )
Impor/Ekspor Data Pada TXT dan RDS
Dengan adanya impor maupun ekspor pada file CSV dan XLSX dimana data cenderung lebih besar dibandingakan dengan TXT dan RDS maka data dapat di impor maupun ekspor menggunakan format txt atau binary.
Berikut adalah fungsi untuk impor data.
df5<- read.table ("Input/input5.txt" ) # dimana ini merupakan format txt-notepad
df6<- source ("Input/input6.Rdmpd" ) # dimana ini merupakan format txt-rdmpd
df7<- readRDS ("Input/input7.rds" ) # dimana ini merupakan format binary-RDS
df8<- readRDS ("Input/input8.ascii" ) # dimana ini merupakan format binary-ASCII
Berikut adalah fungsi untuk ekspor data.
write.table (df5, "Output/output5.txt" )
dump ("df6" , "Output/output6.Rdmpd" )
saveRDS (df7, "Output/output7.rds" )
saveRDS (df8, "Output/output8.ascii" , ascii= TRUE )
Impor/Ekspor Data Pada XML
Data XML ini tidak jauh beda dengan HTML namun pada XMl sintaks dalam tag markup pada HTML tidaklah sama. Pada format file dan data di World Wide Web, INternet, dan lainnya.
library ("XML" ) # load packages XML
library ("kulife" ) # load packages kulife
library ("methods" ) # packages kondisional
df9<- xmlParse ("Input/input9.xml" ) # proses impor data XML
xml_df<- xmlToDataFrame (df9) # konversi ke data frame
write.xml (xml_df, "Output/output9.xml" ) # proses ekspor dara XML
Impor/Ekspor Data Pada JSON
JSON merupakan Java Script Object Natation pada R dapat digunakan dengan format data jsonlite dengan cara sebagai berikut.
Cara mengimpor data json
df10<- fromJSON ("Input/input10.json" )
json_df<- as.data.frame (df10) # proses konversi ke data frame
Cara mengekspor data json
write_json (json_df, "Output/output10.json" )
Impor Data dari WEB
Dalam mengimpor data tidak selalu melalui file namun juga bisa didapatkan dari website yang ada dengan cara sebagai berikut.
Dengan format CSV
web_csv<- read.csv ("https://github.com/Bakti-Siregar/dataset/raw/master/Bookdown-Data-Science-for-Beginners/csv1.csv" )
Dengan format XLSX
#install.package("Rio")
library (rio) # mengimpor data dari github
install_formats () # memeriksa aut packages yang disarankan
## [1] TRUE
Basis Data R
Basis data ini merupkaan penormalisasian suatu data yang disimpan dengan relasional dengan bantuan query SQL saat komputasi statistik. R ini dapat terhubungan dengan database relasional pada umumnya seperti MySql, Oracle, SQL erver, dan lainnya yang dapat diubah ke bentuk data frame dan dilakukannya proses analisis yang lebih lanjut.
Menambang Data WEB
Webscraping data atau bisa disebut dengan pengikisan data dari website ini merupakan suatu proses pengekstrakan konten dan data baik kode HTML yang dilakukan dengna menggunakan bot pada suatu website.
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIn4gVWppYW4gVGVuZ2FoIFNlbWVzdGVyIH4iDQphdXRob3I6ICJCYWt0aSBTaXJlZ2FyLCBTLlNpLiwgTS5TYyINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KDQotLS0NCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyNSUiIHNyYz0iZm90b3ByaWJhZGkuanBnIi8+IA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNsYXNzLnNvdXJjZSA9ICJub2NvcHkiLA0KICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLm91dHB1dCA9ICJub2NvcHkiLA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGLA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGKQ0KDQpsaWJyYXJ5KHJldGljdWxhdGUpDQpsaWJyYXJ5KFJjcHApDQpgYGANCg0KfA0KOi0tLS0gfDotLS0tDQoqKktvbnRhayoqfCAqKjogJFxkb3duYXJyb3ckKioNCkVtYWlsfCBkc2NpZW5jZWxhYnNAb3V0bG9vay5jb20NCkluc3RhZ3JhbSB8IGh0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vYnJndF90aWFyYWVtLyANClJQdWJzICB8IGh0dHBzOi8vcnB1YnMuY29tL2JyaWdpdGF0aWFyYWVtLyANCg0KKioqDQojIFBlbmRhaHVsdWFuDQpNZW5naHVidW5na2FuIHN1YXR1IGRhdGEgcGFkYSBzYWF0IHBlbmdvbGFoYW4gZGF0YSBkaSBkYXRhIHNjaWVuY2Ugc2FuZ2F0bGFoIHBlbnRpbmcgZGltYW5hIGRhdGEgdGVyc2VidXQgZGFwYXQgZGkgc2ltcGFuIGRhbGFtIGJlbnR1ayBjc3YsIGV4Y2VsLCB0eHQsIHJkcywgeG1sLCBqc29uLCBkYW4gbGFpbm55YSB5YW5nIGRhcGF0IGRpIGJhY2EgbWF1cHVuIGRpamFsYW5rYW4gbWVuZ2d1bmFrYW4gUiB5YW5nIHRlcnNpbXBhbiBiYWlrIGRpIGx1YXIgbWF1cHVuIGRpIGRhbG1hIGRpcmVrdG9yaS4gQmVyaWt1dCBiZWJlcmFwYSBjYXJhIHlhbmcgZGFwYXQgZGl0ZXJhcGthbiBwYWRhIFIuDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiBtaWRsZTsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6OTAlIiBzcmM9ImZvdG9tYWlubWFwYXNkMTAucG5nIi8+IA0KDQojIEltcG9yL0Vrc3BvciBEYXRhIENTVg0KDQpCZXJpa3V0IDMgY2FyYSB1bnR1ayBpbXBvciBtYXVwdW4gZWtzcG9yIGRhdGEgcGFkYSBSLiANCg0KIyMgQ2FyYSAxDQpgYGB7cn0NCiMgbWVtYW5nZ2lsIGRpcmVrdG9yaSBkZW5nYW4gDQpwcmludChnZXR3ZCgpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0d2QoKQ0KYGBgDQoNClNlbGFpbiBpdHUsIGFkYXB1biBwcm9zZXMgaW1wb3IgZGF0YSBkYWxhbSBiZW50dWsgQ1NWIGRlbmdhbiBmdW5nc2kgcmVhZC5jc3YoKQ0KYGBge3J9DQpzZXR3ZChnZXR3ZCgpKQ0KDQpkZjEgPC1yZWFkLmNzdigiSW5wdXQvaW5wdXQxLmNzdiIsc2VwID0gIiwiKSAjIGZvcm1hdCBwZW1pc2FoIGtvbWEgDQpkZjENCmBgYA0KDQpgYGB7cn0NCmRmMiA8LXJlYWQuY3N2KCJJbnB1dC9pbnB1dDIuY3N2IixzZXAgPSAiOyIpICMgZm9ybWF0IHBlbWlzYWggdGl0aWsga29tYQ0KYGBgDQoNCkFkYXB1biBwcm9zZXMgZWtzcG9yIGRhdGEgZGFsYW0gYmVudHVrIENTViBkZW5nYW4gbWVuZ2d1bmFrYW4gZnVuZ3NpIHdyaXRlLmNzdigpDQpgYGB7cn0NCndyaXRlLmNzdihkZjEsIk91dHB1dC9vdXRwdXQxLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKSAjIHRhbmRhIHBlbWlzYWgga29tYSB5YWl0dSAiLCINCndyaXRlLmNzdihkZjIsIk91dHB1dC9vdXRwdXQyLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKSAjIHRhbmRhIHBlbWlzYWgga29tYSB5YWl0dSAiOyINCmBgYA0KDQojIyBDYXJhIDINCkRlbmdhbiBtZW5nZ3VuYWthbiBjYXJhIHByYWt0aXMgZGFsYW0gbWVuZ3VuZGFuZyBkaXJla3Rvcmkgb3RvbWF0aXMuDQoNCmBgYHtyfQ0KKFdEPSBnZXR3ZCgpKSAjIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbnlldGluZyBkaXJla3RvcmkNCmlmICghaXMubnVsbChXRCkpIHNldHdkKFdEKQ0KYGBgDQpDYXJhIG1lbmdpbXBvciBkYXRhDQpgYGB7cn0NCmRmMSA8LXJlYWQuY3N2KGZpbGUucGF0aChXRCwgJ0lucHV0JywgJ2lucHV0MS5jc3YnKSkgIA0KZGYyIDwtcmVhZC5jc3YoZmlsZS5wYXRoKFdELCAnSW5wdXQnLCAnaW5wdXQxLmNzdicpKQ0KYGBgDQoNCkNhcmEgZW5nZWtzcG9yIGRhdGEgDQpgYGB7cn0NCndyaXRlLmNzdihkZjEsIGZpbGUucGF0aChXRCwgJ0lucHV0JywgJ2lucHV0MS5jc3YnKSwgcm93Lm5hbWVzPUZBTFNFKSAgDQp3cml0ZS5jc3YoZGYyLCBmaWxlLnBhdGgoV0QsICdJbnB1dCcsICdpbnB1dDEuY3N2JyksIHJvdy5uYW1lcz1GQUxTRSkNCmBgYA0KDQojIyBDYXJhIDMNCg0KUGFkYSBjYXJhIGtlLTMgaW5pIG1lcnVwYWthbiBjYXJhIGFsdGVybmF0aWYgeWFuZyBkaWxha3VrYW4gdGFucGEgYWRhbnlhIHBlbmdhdHVyYW4gZGlyZWt0b3JpIHNlYmVsdW0gcGVuZ2ltcG9yYW4gZGF0YS4NCmBgYHtyfQ0KZGYzPC1yZWFkLmNzdihmaWxlLmNob29zZSgpKQ0KZGYzDQpgYGANCg0KIyBJbXBvci9Fa3Nwb3IgRGF0YSBQYWRhIEV4Y2VsDQpEZW5nYW4gRXhjZWwgZGF0YSBkYXBhdCBkaSBzaW1wYW4gbWVsYWx1aSBmb3JtYXQgLnhscyBhdGF1IC54bHN4IGRhbiBSIGRhcGF0IG1lbWJhY2EgbWVuZ2d1bmFrYW4gZnVuc2kgcmVhZHhsDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKGMoInJlYWR4bCIsICJ3cml0ZXhsIikpICAgICAgICMgaW5zdGFsbCBgcmVhZHhsICYgd3JpdGV4bGAgDQpwYWNtYW46OnBfbG9hZChyZWFkeGwsIHdyaXRleGwpICAgICAgICAgICAgICAgICAjIGxvYWQgYHJlYWR4bCAmIHdyaXRleGxgDQpgYGANCg0KYGBge3J9DQojIGltcG9yIGRhdGENCmRmMzwtcmVhZF9leGNlbCgiSW5wdXQvaW5wdXQ0LnhscyIpICAgICAgICAgICAgICMgaW1wb3IgZGF0YSB4bHMgKDk3LTIwMDMpDQpkZjQ8LXJlYWRfZXhjZWwoIklucHV0L2lucHV0My54bHN4IixzaGVldD0xKSAgICAjIGltcG9yIGRhdGEgeGxzeCAoMjAwMy11cCkNCmBgYA0KDQpgYGB7cn0NCiMgZWtzcG9yIGRhdGENCndyaXRlX3hsc3goZGYzLCJPdXRwdXQvb3V0cHV0My54bHMiKSANCndyaXRlX3hsc3goZGY0LCJPdXRwdXQvb3V0cHV0NC54bHN4IikNCmBgYA0KDQojIEltcG9yL0Vrc3BvciBEYXRhIFBhZGEgVFhUIGRhbiBSRFMNCg0KRGVuZ2FuIGFkYW55YSBpbXBvciBtYXVwdW4gZWtzcG9yIHBhZGEgZmlsZSBDU1YgZGFuIFhMU1ggZGltYW5hIGRhdGEgY2VuZGVydW5nIGxlYmloIGJlc2FyIGRpYmFuZGluZ2FrYW4gZGVuZ2FuIFRYVCBkYW4gUkRTIG1ha2EgZGF0YSBkYXBhdCBkaSBpbXBvciBtYXVwdW4gZWtzcG9yIG1lbmdndW5ha2FuIGZvcm1hdCB0eHQgYXRhdSBiaW5hcnkuDQoNCkJlcmlrdXQgYWRhbGFoIGZ1bmdzaSB1bnR1ayBpbXBvciBkYXRhLg0KDQpgYGB7cn0NCmRmNTwtcmVhZC50YWJsZSgiSW5wdXQvaW5wdXQ1LnR4dCIpICMgZGltYW5hIGluaSBtZXJ1cGFrYW4gZm9ybWF0IHR4dC1ub3RlcGFkDQpgYGANCg0KYGBge3J9DQpkZjY8LXNvdXJjZSgiSW5wdXQvaW5wdXQ2LlJkbXBkIikgICAjIGRpbWFuYSBpbmkgbWVydXBha2FuIGZvcm1hdCB0eHQtcmRtcGQNCmBgYA0KDQpgYGB7cn0NCmRmNzwtcmVhZFJEUygiSW5wdXQvaW5wdXQ3LnJkcyIpICAgICMgZGltYW5hIGluaSBtZXJ1cGFrYW4gZm9ybWF0IGJpbmFyeS1SRFMNCmBgYA0KDQpgYGB7cn0NCmRmODwtcmVhZFJEUygiSW5wdXQvaW5wdXQ4LmFzY2lpIikgICMgZGltYW5hIGluaSBtZXJ1cGFrYW4gZm9ybWF0IGJpbmFyeS1BU0NJSQ0KYGBgDQoNCkJlcmlrdXQgYWRhbGFoIGZ1bmdzaSB1bnR1ayBla3Nwb3IgZGF0YS4NCmBgYHtyfQ0Kd3JpdGUudGFibGUoZGY1LCAiT3V0cHV0L291dHB1dDUudHh0IikNCmR1bXAoImRmNiIsICJPdXRwdXQvb3V0cHV0Ni5SZG1wZCIpDQpzYXZlUkRTKGRmNywgIk91dHB1dC9vdXRwdXQ3LnJkcyIpDQpzYXZlUkRTKGRmOCwgIk91dHB1dC9vdXRwdXQ4LmFzY2lpIiwgYXNjaWk9VFJVRSkNCmBgYA0KDQojIEltcG9yL0Vrc3BvciBEYXRhIFBhZGEgWE1MDQpEYXRhIFhNTCBpbmkgdGlkYWsgamF1aCBiZWRhIGRlbmdhbiBIVE1MIG5hbXVuIHBhZGEgWE1sIHNpbnRha3MgZGFsYW0gdGFnIG1hcmt1cCBwYWRhIEhUTUwgdGlkYWtsYWggc2FtYS4gUGFkYSBmb3JtYXQgZmlsZSBkYW4gZGF0YSBkaSBXb3JsZCBXaWRlIFdlYiwgSU50ZXJuZXQsIGRhbiBsYWlubnlhLiANCg0KYGBge3J9DQpsaWJyYXJ5KCJYTUwiKSAgICAgIyBsb2FkIHBhY2thZ2VzIFhNTA0KbGlicmFyeSgia3VsaWZlIikgICMgbG9hZCBwYWNrYWdlcyBrdWxpZmUNCmxpYnJhcnkoIm1ldGhvZHMiKSAjIHBhY2thZ2VzIGtvbmRpc2lvbmFsDQpgYGANCg0KYGBge3J9DQpkZjk8LXhtbFBhcnNlKCJJbnB1dC9pbnB1dDkueG1sIikgICAgICAgIyBwcm9zZXMgaW1wb3IgZGF0YSBYTUwNCnhtbF9kZjwteG1sVG9EYXRhRnJhbWUoZGY5KSAgICAgICAgICAgICAjIGtvbnZlcnNpIGtlIGRhdGEgZnJhbWUNCndyaXRlLnhtbCh4bWxfZGYsICJPdXRwdXQvb3V0cHV0OS54bWwiKSAjIHByb3NlcyBla3Nwb3IgZGFyYSBYTUwNCmBgYA0KDQojIEltcG9yL0Vrc3BvciBEYXRhIFBhZGEgSlNPTg0KDQpKU09OIG1lcnVwYWthbiBKYXZhIFNjcmlwdCBPYmplY3QgTmF0YXRpb24gcGFkYSBSIGRhcGF0IGRpZ3VuYWthbiBkZW5nYW4gZm9ybWF0IGRhdGEganNvbmxpdGUgZGVuZ2FuIGNhcmEgc2ViYWdhaSBiZXJpa3V0Lg0KDQpgYGB7cn0NCmxpYnJhcnkoImpzb25saXRlIikNCmBgYA0KDQpDYXJhIG1lbmdpbXBvciBkYXRhIGpzb24NCmBgYHtyfQ0KZGYxMDwtZnJvbUpTT04oIklucHV0L2lucHV0MTAuanNvbiIpDQpqc29uX2RmPC1hcy5kYXRhLmZyYW1lKGRmMTApICAgICMgcHJvc2VzIGtvbnZlcnNpIGtlIGRhdGEgZnJhbWUNCmBgYA0KDQpDYXJhIG1lbmdla3Nwb3IgZGF0YSBqc29uDQpgYGB7cn0NCndyaXRlX2pzb24oanNvbl9kZiwgIk91dHB1dC9vdXRwdXQxMC5qc29uIikNCmBgYA0KDQojIEltcG9yIERhdGEgZGFyaSBXRUINCkRhbGFtIG1lbmdpbXBvciBkYXRhIHRpZGFrIHNlbGFsdSBtZWxhbHVpIGZpbGUgbmFtdW4ganVnYSBiaXNhIGRpZGFwYXRrYW4gZGFyaSB3ZWJzaXRlIHlhbmcgYWRhIGRlbmdhbiBjYXJhIHNlYmFnYWkgYmVyaWt1dC4NCg0KRGVuZ2FuIGZvcm1hdCBDU1YNCmBgYHtyfQ0Kd2ViX2NzdjwtcmVhZC5jc3YoImh0dHBzOi8vZ2l0aHViLmNvbS9CYWt0aS1TaXJlZ2FyL2RhdGFzZXQvcmF3L21hc3Rlci9Cb29rZG93bi1EYXRhLVNjaWVuY2UtZm9yLUJlZ2lubmVycy9jc3YxLmNzdiIpDQpgYGANCg0KRGVuZ2FuIGZvcm1hdCBYTFNYDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2UoIlJpbyIpDQpsaWJyYXJ5KHJpbykgICAgICAjIG1lbmdpbXBvciBkYXRhIGRhcmkgZ2l0aHViDQppbnN0YWxsX2Zvcm1hdHMoKSAjIG1lbWVyaWtzYSBhdXQgcGFja2FnZXMgeWFuZyBkaXNhcmFua2FuDQpgYGANCg0KIyBCYXNpcyBEYXRhIFINCkJhc2lzIGRhdGEgaW5pIG1lcnVwa2FhbiBwZW5vcm1hbGlzYXNpYW4gc3VhdHUgZGF0YSB5YW5nIGRpc2ltcGFuIGRlbmdhbiByZWxhc2lvbmFsIGRlbmdhbiBiYW50dWFuIHF1ZXJ5IFNRTCBzYWF0IGtvbXB1dGFzaSBzdGF0aXN0aWsuIFIgaW5pIGRhcGF0IHRlcmh1YnVuZ2FuIGRlbmdhbiBkYXRhYmFzZSByZWxhc2lvbmFsIHBhZGEgdW11bW55YSBzZXBlcnRpIE15U3FsLCBPcmFjbGUsIFNRTCBlcnZlciwgZGFuIGxhaW5ueWEgeWFuZyBkYXBhdCBkaXViYWgga2UgYmVudHVrIGRhdGEgZnJhbWUgZGFuIGRpbGFrdWthbm55YSBwcm9zZXMgYW5hbGlzaXMgeWFuZyBsZWJpaCBsYW5qdXQuIA0KDQojIE1lbmFtYmFuZyBEYXRhIFdFQg0KV2Vic2NyYXBpbmcgZGF0YSBhdGF1IGJpc2EgZGlzZWJ1dCBkZW5nYW4gcGVuZ2lraXNhbiBkYXRhIGRhcmkgd2Vic2l0ZSBpbmkgbWVydXBha2FuIHN1YXR1IHByb3NlcyBwZW5nZWtzdHJha2FuIGtvbnRlbiBkYW4gZGF0YSBiYWlrIGtvZGUgSFRNTCB5YW5nIGRpbGFrdWthbiBkZW5nbmEgbWVuZ2d1bmFrYW4gYm90IHBhZGEgc3VhdHUgd2Vic2l0ZS4NCg==