Operator
Operator merupakan simbol yang mengarahkan complier untuk melakukan berbagai macam operasi terhadap bebarapa penugasan. Operator ini mensimulasikan aritmatika, logika, dan lain sebagainya. Dalam R dan Python ini mendukung empat jenis operator sebagai berikut.
Aritmatika
Operator ini digunakan untuk mensimulasi berbegaia macam operasi matematika namun pada R dan Pyhton memiliki simbol yang berbeda. Pada R operator penjumlahan (+), pengurangan (-), perkalian(* ), pembagian(/), pemangkatan(^), dan modulo(%%). Namun berbeda dengan Python yaitu R operator penjumlahan (+), pengurangan (-), perkalian(* ), pembagian(/), pemangkatan(**), dan modulo(%)
Pada R, adapun contoh sebagai berikut.
x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
x+y # hasil penjumlahan vektor x dan vektor y
## [1] 4 7 11
print(x+y) #hasil penjumlahan vektor x dan vektor y
## [1] 4 7 11
print(x*y) #hasil perkalian vektor x dan vektor y
## [1] 4 12 30
print(x-y) #hasil pengurangan vektor x dan vektor y
## [1] 0 -1 -1
print(x/y) #hasil pembagian vektor x dan vektor y
## [1] 1.0000000 0.7500000 0.8333333
print(x^y) #hasil permangkatan vektor x dan vektor y
## [1] 4 81 15625
print(x%%y) #hasil modulo vektor x dan vektor y
## [1] 0 3 5
Selain itu juga dapat menambahakan komentar pada hasil perhitungan di dalam R dengan cara sebagai berikut.
x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
cat("Penjumlahan vektor x dan y:", x + y, "\n")
## Penjumlahan vektor x dan y: 4 7 11
cat("pengurangan vektor x dan vektor y :",x - y, "\n")
## pengurangan vektor x dan vektor y : 0 -1 -1
cat("perkalian vektor x dan vektor y :",x * y, "\n")
## perkalian vektor x dan vektor y : 4 12 30
cat("pembagian vektor x dan vektor y :", x / y, "\n")
## pembagian vektor x dan vektor y : 1 0.75 0.8333333
cat("pemangkatan vektor x dan vektor y :",x ^ y, "\n")
## pemangkatan vektor x dan vektor y : 4 81 15625
cat("modulo vektor x dan vektor y :" ,x %% y, "\n")
## modulo vektor x dan vektor y : 0 3 5
Relasional
Pada R dan Python ini memiliki oeprator relasional yang sama guna untuk melakukan perbandingan antara elemen yang bersesuaian pada setiap opran dengna mengembalikan nilai TRUE jika operan pertama memenuhi relasi dibandingan dengan operan lainnya dimana nilai TRUE ini jauh lebih besar daripada nilai FALSE.
Operan relasional pada R dan Pyhton sebagai berikut.
Operator kurang dari (<) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih kecil daripada operan ekdua dan mengembalikan FALSE.
Operan kurang dari sama dengan (<=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama kurang dari atau sama dengan elemen operan kedua dan mengembalikan FALSE.
Operan lebih besar dari (>) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih besar daripada operan kedua dan mengembalikan FALSE.
Operan lebih dari sama dengan (>=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih besar dari atau sama dengan elemen operan kedua dan mengembalikan FALSE.
Operan sama dengan (==) berguna untuk mengembalikan TRUE jika dan hanya jika kedua sisi memiliki nilai yang sama.
Operan tidak sama dengan (!=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada oprena pertama tidak sama dengan dari operan kedua.
x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
cat("vektor x kurang dari vektor y :",x < y, "\n")
## vektor x kurang dari vektor y : FALSE TRUE TRUE
cat("vektor x kurang dari sama dengan vektor y :",x <= y, "\n")
## vektor x kurang dari sama dengan vektor y : TRUE TRUE TRUE
cat("vektor x lebih besar dari vektor y :",x > y,"\n")
## vektor x lebih besar dari vektor y : FALSE FALSE FALSE
cat("vektor x lebih besar dari sama dengan vektor y :",x >= y, "\n")
## vektor x lebih besar dari sama dengan vektor y : TRUE FALSE FALSE
cat("vektor x sama dengan vektor y :",x == y, "\n")
## vektor x sama dengan vektor y : TRUE FALSE FALSE
cat("vektor x tidak sama dengan vektor y :",x != y, "\n")
## vektor x tidak sama dengan vektor y : FALSE TRUE TRUE
Logika
Operator logika ini mensimulasikan operasi keputusan dengan mengevaluasi ke nilai TRUE atau FALSE. Simbol pada R dan Python pada operasional logika ini memiliki kesamaan sebagai berikut.
Operator NOT(!) ini merupakan operasi negasi atau kebalikan pasa status elemen operan.
Operator AND(&) ini merupakan membalikkan TRUE jika kedua operan bernilai benar.
Operan OR(|) ini merupakan menggembalikan TRUE jika salah satu operan adalah benar.
Operan XOR (^) ini merupakan menggembalikan TRUE, jika salah satu dari kedua elemen pertama operan bernilai benar.
Pada R, adapun contoh sebagai berikut.
x<-c(0,TRUE,FALSE)
y<-c(TRUE,0.1,4+3i)
#melakukan operasi logikan pada operan
cat("logika negasi(~) untuk vektor x:",!x, "\n")
## logika negasi(~) untuk vektor x: TRUE FALSE TRUE
cat("logika negasi(~) untuk vektor y:",!y, "\n")
## logika negasi(~) untuk vektor y: FALSE FALSE FALSE
cat("logika konjungsi(Dan):",x & y, "\n")
## logika konjungsi(Dan): FALSE TRUE FALSE
cat("logika disjungsi(Or):",x | y, "\n")
## logika disjungsi(Or): TRUE TRUE TRUE
cat("logika disjungsi parsial(Or):",x||y, "\n")
## logika disjungsi parsial(Or): TRUE
Lainnya
Pada R, adapun contoh sebagai berikut.
x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
## [1] 2.000000 3.464102 5.477226
## [1] 0.6931472 1.0986123 1.6094379
## [1] 7.389056 54.598150 403.428793
## [1] 3.000000 4.750000 6.833333
Tipe Data
Tipe data pada R dan Pyhton memanglah sangat penting. Pada tipe data R dan Pyhton memiliki kesamaan maupun perbedaan Sebagai berikut.
Tipe data Double atau Float (5.6) dengan bilangan yang mempunyai koman. Tipe data integer (5) merupakan bilangan bulat 1,2,…,n. Tipe data String atau character (‘Dsiencelabs’) ini merupakan karakter atau kalimat bisa berupa huruf , angka, dan lainnya dengan diampit tanda (‘) atau (“).
Namun berbeda dengan Tipe data Bolean atau Logical dan Complex pada R dan Pyhton yang berbeda. Tipe data Logical ada R (TRUE/FALSE) namun pada Python (True/False) ini merupakan benak nilai 1 dan salah nilai 0. Tipe data Complex pada R (1+5i) namun pada Pyhton (1+5j) ini merupakan pasangan angka real dan imajiner.
Pada R, adapun contoh sebagai berikut.
c1 <- 1.3 #memuat nilai desimal
c2 <- as.integer(1) #tetapkan nilai integer
c2 <- 1L #caralain unutk memual nilai integer di R
c3 <- c(TRUE,FALSE) #bolean atau logical
c3 <- as.logical(c(0,1)) #caralain untuk memuat bolean atau logical
c4 <- c("d",'e', '456') #string atau character
c5 <- 3 + 5i #complex
Contoh :
class(c1) #cetak nama kelar variabel
## [1] "numeric"
typeof(c1) #cetak tipe variabel x
## [1] "double"
LS0tDQp0aXRsZTogIkFMT0dBUklUTUEgREFOIFNUUlVLVFVSIERBVEEiDQpzdWJ0aXRsZTogIlRVR0FTIDIiDQphdXRob3I6ICJCcmlnaXRhIFRpYXJhIEVsZ2l0eWFuYSBNZWxhbnRpa2EgKDIwMjA0OTIwMDAxKSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGh0bWxfZG9jdW1lbnQ6IG51bGwNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogc2FuZHN0b25lDQogICAgY3NzOiBzdHlsZTEuY3NzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQotLS0NCg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjI1JSIgc3JjPSJmb3RvcHJpYmFkaS5qcGciLz4gDQoNCmBgYHtyIGxvZ28sIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAnMzAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJsb2dvLnBuZyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgYnJpZ2l0YS5tZWxhbnRpa2FAc3R1ZGVudC5tYXRhbmF1bml2ZXJzaXR5LmFjLmlkIDxicj4NClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL2JyaWdpdGF0aWFyYWVtLyA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgUiBWUyBQeXRob24gDQoNCkJhaGFzYSBSIGRhbiBQeXRob24gYWRhbGFoIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIHBvcHVsYXIgdGVydXRhbWEgcGFkYSBkYXRhIHNjaWVuY2Uga2FyZW5hIGRhcGF0IG1lbWJhbnR1IG1lbmdhbmFsaXNpcyBwZW5lbGl0aWFuIHBhZGEgZGF0YS4gUHl0aG9uIG1lcnVwYWthbiBiYWhhc2EgcGVtcm9ncmFtYW4gdGluZ2dpIGRpbWFuYSBiaXNhIG1lbmdndW5ha2FuIGluc3RydWtzaSBtdWx0aSBndWFuIGRlbmdhbiBtZXRvZGUgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIGRhbiBtZW5nZ3VuYWthbiBzZW1hbnRpayBkaW5hbWlzIHVudHVrIG1lbWJlcmlrYW4gdGluZ2thdCBrZXRlcmJhY2FhbiBzeW50YXggZGltYW5hIG1lbmR1a3VuZyBtdWx0aSBwbGF0Zm9ybSBkYW4gbXVsdGkgc3lzdGVtLCBwZW5nZW1iYW5nYW4gcHJvZ3JhbSBkYXBhdCBkaWxha3VrYW4gZGVuZ2FuIGNlcGF0IGRhbiBrb2RlIHlhbmcganVtbGFobnlhIGxlYmloIHNlZGlraXQuIFNlZGFuZ2thbiBSIG1lcnVwYWthbiBiYWhhc2EgcGVtcm9ncmFtYSB0ZXJsZWJpaCB5YW5nIGRpZ3VuYWthbiB1bnR1ayBrb21wdXRhc2kgc3RhdGlzdGlrIGRhbiBncmFmaWsgZGltYW5hIGNvY29rIGRpZ3VuYWthbiB1dG51ayByaXNldCBkYW4gYWthZGVtaXMsIHN5bnRheCB5YW5nIG11ZGFoIGRpcGVsYWphciBkZW5nYW4gc2lmYXQgdGVyYnVrYSBkaW1hbmEgZGFwYXQgbWVuYW1iYWhrYW4gZml0dXItZml0dXIgdGFtYmFoYW4gZGFsYW0gYmVudHVrIHBha2V0LiANCg0KIyMgUmVzdWx0cyB7LnRhYnNldH0NCg0KIyMjIFBlcnNhbWFhbg0KDQpQYWRhIGJhaGFzYSBwZW1yb2dhcmFtIFIgZGFuIFB5dGhvbiBtZW1pbGlraSBiZWJlcmFwYSBwZXJzYW1hYW4geWFpdHUgc2ViYWdhaSBiZXJpa3V0LiANCg0KMS4JUiBkYW4gUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4gbXVsdGktcGFyYWRpZ21hIHNlaGluZ2dhIGtlZHVhbnlhIG1lbmR1a3VuZyBQZW1yb2dyYW1hbiBCZXJvcmllbnRhc2kgT2JqZWssIFBlbXJvZ3JhbWFuIEltcGVyYXRpZiwgUGVtcm9ncmFtYW4gUHJvc2VkdXJhbCwgZGFuIGxhaW5ueWEuDQoNCjIuCUJhaGFzYSB5YW5nIGRpdGFmc2lya2FuLg0KDQozLglEaWd1bmFrYW4gZGFsYW0gcGVuZ2VtYmFuZ2FuIGFsZ29yaXRtYS4NCg0KNC4JQmFoYXNhIHBlbXJvZ3JhbWFuIHRpbmdrYXQgdGluZ2dpLg0KDQo1LglCZXJzaWZhdCBncmF0aXMgZGFuIG9wZW4gc291cmNlLg0KDQo2LglLZWR1YW55YSBkYXBhdCBkaWludGVncmFzaWthbiBkZW5nYW4gYXBsaWthc2kgbGFpbiBzZXBlcnRpIE15U1FMLCBPcmFjbGUsIEdpdEh1YiwgZGxsLg0KDQo3LglLZWR1YW55YSBtZW5kdWt1bmcgZmlsZSB5YW5nIGJlcmJlZGEgc2VwZXJ0aSBmaWxlIENTViwgZmlsZSBleGNlbCwgZmlsZSBYTUwgZGFuIGZpbGUgSlNPTi4NCg0KOC4JS2VkdWEgYmFoYXNhIHRlcnMNCg0KIyMjIFBlcmJlZGFhbiANCg0KU2VsYWluIG1lbWlsaWtpIHBlcnNhbWFhbiwgUiBkZW5nYW4gUHl0aG9uIGp1Z2EgbWVtaWxpa2kgcGVyYmVkYWFuIHNlcGVydGkgcGFkYSBydWFuZyBsaW5na3VwLCBwYWRhIFIgaGFueWEgbWVuY2FrdXAgZGF0YSBzY2llbmNlIGRhbiBzdGF0c2l0aWsgbmFtdW4gcGFkYSBQeWh0b24gbWVuY2FrdXAgYXBsaWthc2kgZGFuIGluZHVzdHJpLiBEYWxhbSBwZW5nZ3VhbmFhbm55YSwgUiBtZW5jYWt1cCBha2FkZW1pcyBkYW4gcGVuZWxpdGlhbiBzZWRhbmdrYW4gUHl0aG9uIHByb2dyYW1tZXJzIGRhbiBkZXZlbG9wZXJzLiAgUGFkYSBJREUgKCB1c2VyIGludGVyZmFjZSksIFIgbWVuZ2FjdSBwYWRhIFJzdHVkaW8gc2VkYW5na2FuIFB5dGhvbiBtZW5nYWN1IHBhZGEgc3B5ZGVyLCBKdXB5dGVyLCBOb3RlYm9vaywgUHljaGFybSwgZGFuIGxhaW5ueWEuIEVrc3RlbnNpIHBhZGEgUiB5YWl0dSAuUiBkYW4gLlJtZCwgc2VkYW5na2FuIHBhZGEgUHl0aG9uIHlhaXR1IC5weSBkYW4gLmlweW5iIC4gUGFkYSBTdHJ1a3R1ciBkYXRhLCBSIG1lbmNha3VwIHZla3RvciwgbGlzdCwgbWF0cmlrcywgYXJyYXksIGZha3RvciwgZGFuIGJpbmdrYWkgZGF0YSBzZWRhbmdrYW4gcGFkYSBQeWh0b24gbWVuY2FrdXAgbGlzdCwgZGljdGlvbmFyeSBkYW4gdHVwZWwuIFBhY2thZ2VzIGRhbiBsaWJyYXJ5IHBhZGEgUiBtZW5jYWt1cCB0aWR5dmVyc2UsIGdncGxvdDIsIGNhcmV0LCBkYW4gem9vLCBzZWRhbmdrYW4gcGFkYSBweXRob24gbWVuY2FrdXAgcGFkYXMsIHNjaXB5LCBzY2lraXQtbGVhcm4sIHRlbnNvcmZsb3csIGRhbiBjYXJldC4gDQoNClIgbWVtaWxpa2kga2VsZWJpaGFuIHlhaXR1IG1lbWlsaWtpIGJhbnlhayBsaWJyYXJ5IGRhbiBrdWFsaXRhcyB2aXN1YWxpc2FzaSBncmFmaWsgeWFuZyBkaWhhc2lsa2FuIHNhbmdhdCB0aW5nZ2ksIHNlZGFuZ2thbiBwYWRhIFB5dGhvbiBtZW1pbGlraSBrZWxlYmloYW4geWFpdHUgc2lzdGVtYXRpa2EgcGVudWxpc2FuIHNjcmlwdCB5YW5nIHN1ZGFoIGRpYmFjYSwgZm9rdXMgcGFkYSBrZWNlcGF0YW4ga29tcHV0YXNpLCBwZW5nZW1iYW5nYW4gd2ViLCBqYXJpbmdhbiwgb3RvbWF0aXNhc2ksIGRhbiBsYWlubnlhLiBSIGp1Z2EgbWVtaWxpa2kga2VrdXJhbmdhbiB5YWl0dSBrZXRlcmdhbnR1bmdhbiBhbnRhciBsaWJyYXJ5LCBzZWRhbmdrYW4gcGFkYSBQeXRob24gbWVtaWxpa2kga2VrdXJhbmdhbiB5YWl0dSBsaWJyYXJ5IGxlYmloIHNlZGlraXQgZGliYW5kaW5na2FuIFIuIEludGVncmFzaSBwYWRhIFIgeWFpdHUgZml0dXIgUm1hcmtkb3duIGRhbiBzaGlueSwgc2VkYW5na2FuIHBhZGEgUHl0aG9uIHlhaXR1IGludHJlZ2FzaSBhcGxpa2FzaSBsZWJpaCBsdWFzLiANCg0KIyBTeW50YXggRGFzYXINCg0KUGFkYSBiYWhhc2EgcGVtcm9ncmFtYW4gUiBkYW4gUHl0aG9uIGluaSB0ZXJkaXJpIGRhcmkgdmFyaWFiZWwgeWFuZyBiZXJndW5hIHVudHVrIG1lbnlpbXBhbiBzdWF0dSBuaWxhaSBkYW4ga29tZW50YXIgeWFuZyBiZXJndW5hIHVudHVrIG1lbmluZ2thdGthbiBwZW1haGFtYW4gcGVuZ2d1bmEgbWVuZ2VuYWkgc2tyaXAgYXRhdSBjb2RkaW5nLiANCg0KIyMgUGVudWdhc2FuIFZhcmlhYmVsDQoNClBhZGEgUiwgcGVyaW50YWggcGVudWdhc2FuIHZhcmlhYmVsIGRhcGF0IGRpbm90YXNpa2FuIGRlbmdhbiAzIGNhcmEgeWFpdHUgOg0KDQoxLgk9ICB5YW5nIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gc2VkZXJoYW5hDQoNCjIuCTwtIHlhbmcgZGlndW5ha2FuIHVudHVrIHBlbnVnYXNhbiBkYXJpIHNpc2kga2lyaSwgZGFuDQoNCjMuCS0+IHlhbmcgZGlndW5hbmEgdW50dWsgcGVudWdhc2FuIGRhcmkgZGlkaSBrYW5hbi4NCg0KYGBge3J9DQp4PTMNCnk8LTUNCjItPnoNCnByaW50KGMoeCx5LHopKQ0KDQpgYGANCg0KIyMgUGVuYW1iYWhhbiBLb21lbnRhcg0KDQpLZWd1bmFhbiBwZW5hbWJhaGFuIGtvbG9tIGtvbWVudGFyIHBhZGEgc2NyaXB0IFIgYXRhdXB1biBQeXRob24gYmVyZ3VuYSB1bnR1ayBtZW1iZXJpIGtldGVyYW5nYW4gYWdhciBtdWRhaCBtZW1haGFtaSBtYWtuYSBkYXJpIHBlbmdndW5hYW4gcGVyaW50YWhueWEuIEtvbWVudGFyIGluaSBiZXJzaWZhdCBpbmZvcm1hc2kgZGVuZ2FuIHBlbnVsaXNhbiBhd2FsIG1hdXB1biBha2hpciBkZW5nYW4gbWVuZ2d1bmFrYW4gIyAuDQoNClBhZGEgUiwNCg0KYGBge3J9DQojIG1lbmdnYW50aSBuaWxhaSB4IHlhbmcgc3VkYWggZGlyZWthbSAoIGtvbWVudGFyIGRpIGF3YWwgcGVybnlhdGFhbikNCng9MTINCno8LSB4K3kgI21lbmdnYW50aWthbiBuaWxhaSB6IHlhbmcgc3VkYWggZGlyZWthbSAoIGtvbWVudGFyIGRpIGFraGlyIHBlcm55YXRhYW4pDQp4K3ktPnogIyBzYW1hIGRlbmdhbiBkaWF0YXMNCmBgYA0KDQojIE9wZXJhdG9yDQoNCk9wZXJhdG9yIG1lcnVwYWthbiBzaW1ib2wgeWFuZyBtZW5nYXJhaGthbiBjb21wbGllciB1bnR1ayBtZWxha3VrYW4gYmVyYmFnYWkgbWFjYW0gb3BlcmFzaSB0ZXJoYWRhcCBiZWJhcmFwYSBwZW51Z2FzYW4uIE9wZXJhdG9yIGluaSBtZW5zaW11bGFzaWthbiBhcml0bWF0aWthLCBsb2dpa2EsIGRhbiBsYWluIHNlYmFnYWlueWEuIERhbGFtIFIgZGFuIFB5dGhvbiBpbmkgbWVuZHVrdW5nIGVtcGF0IGplbmlzIG9wZXJhdG9yIHNlYmFnYWkgYmVyaWt1dC4NCg0KIyMgQXJpdG1hdGlrYQ0KDQpPcGVyYXRvciBpbmkgZGlndW5ha2FuIHVudHVrIG1lbnNpbXVsYXNpIGJlcmJlZ2FpYSBtYWNhbSBvcGVyYXNpIG1hdGVtYXRpa2EgbmFtdW4gcGFkYSBSIGRhbiBQeWh0b24gbWVtaWxpa2kgc2ltYm9sIHlhbmcgYmVyYmVkYS4gUGFkYSBSIG9wZXJhdG9yIHBlbmp1bWxhaGFuICgrKSwgcGVuZ3VyYW5nYW4gKC0pLCBwZXJrYWxpYW4oKiApLCBwZW1iYWdpYW4oLyksIHBlbWFuZ2thdGFuKF4pLCBkYW4gbW9kdWxvKCUlKS4gTmFtdW4gYmVyYmVkYSBkZW5nYW4gUHl0aG9uIHlhaXR1IFIgb3BlcmF0b3IgcGVuanVtbGFoYW4gKCspLCBwZW5ndXJhbmdhbiAoLSksIHBlcmthbGlhbigqICksIHBlbWJhZ2lhbigvKSwgcGVtYW5na2F0YW4oKiopLCBkYW4gbW9kdWxvKCUpDQoNClBhZGEgUiwgYWRhcHVuIGNvbnRvaCBzZWJhZ2FpIGJlcmlrdXQuDQoNCmBgYHtyfQ0KeDwtYygyLDMsNSkgI21lbXVhdCB2ZWt0b3IgeA0KeTwtYygyLDQsNikgI21lbXVhdCB2ZWt0b3IgeQ0KeCt5ICMgaGFzaWwgcGVuanVtbGFoYW4gdmVrdG9yIHggZGFuIHZla3RvciAgeQ0KDQpgYGANCg0KYGBge3J9DQpwcmludCh4K3kpICNoYXNpbCBwZW5qdW1sYWhhbiB2ZWt0b3IgeCBkYW4gdmVrdG9yIHkgDQpgYGANCg0KYGBge3J9DQpwcmludCh4KnkpICNoYXNpbCBwZXJrYWxpYW4gdmVrdG9yIHggZGFuIHZla3RvciB5DQpgYGANCg0KDQpgYGB7cn0NCnByaW50KHgteSkgI2hhc2lsIHBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB2ZWt0b3IgeQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoeC95KSAjaGFzaWwgcGVtYmFnaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoeF55KSAjaGFzaWwgcGVybWFuZ2thdGFuIHZla3RvciB4IGRhbiB2ZWt0b3IgIHkNCmBgYA0KDQpgYGB7cn0NCnByaW50KHglJXkpICNoYXNpbCBtb2R1bG8gdmVrdG9yIHggZGFuIHZla3RvciB5DQpgYGANCg0KU2VsYWluIGl0dSBqdWdhIGRhcGF0IG1lbmFtYmFoYWthbiBrb21lbnRhciBwYWRhIGhhc2lsIHBlcmhpdHVuZ2FuIGRpIGRhbGFtIFIgZGVuZ2FuIGNhcmEgc2ViYWdhaSBiZXJpa3V0Lg0KDQpgYGB7cn0NCng8LWMoMiwzLDUpICNtZW11YXQgdmVrdG9yIHgNCnk8LWMoMiw0LDYpICNtZW11YXQgdmVrdG9yIHkNCmBgYA0KDQpgYGB7cn0NCmNhdCgiUGVuanVtbGFoYW4gdmVrdG9yIHggZGFuIHk6IiwgeCArIHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4IC0geSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgicGVya2FsaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4ICogeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgicGVtYmFnaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6IiwgeCAvIHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInBlbWFuZ2thdGFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4IF4geSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibW9kdWxvIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6IiAseCAlJSB5LCAiXG4iKQ0KYGBgDQoNCiMjIFJlbGFzaW9uYWwNCg0KUGFkYSBSIGRhbiBQeXRob24gaW5pIG1lbWlsaWtpIG9lcHJhdG9yIHJlbGFzaW9uYWwgeWFuZyBzYW1hIGd1bmEgdW50dWsgbWVsYWt1a2FuIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3ByYW4gZGVuZ25hIG1lbmdlbWJhbGlrYW4gbmlsYWkgVFJVRSBqaWthIG9wZXJhbiBwZXJ0YW1hIG1lbWVudWhpIHJlbGFzaSBkaWJhbmRpbmdhbiBkZW5nYW4gb3BlcmFuIGxhaW5ueWEgZGltYW5hIG5pbGFpIFRSVUUgaW5pIGphdWggbGViaWggYmVzYXIgZGFyaXBhZGEgbmlsYWkgRkFMU0UuDQoNCipPcGVyYW4gcmVsYXNpb25hbCBwYWRhIFIgZGFuIFB5aHRvbiBzZWJhZ2FpIGJlcmlrdXQuKg0KDQpPcGVyYXRvciBrdXJhbmcgZGFyaSAoPCkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGxlYmloIGtlY2lsIGRhcmlwYWRhIG9wZXJhbiBla2R1YSBkYW4gbWVuZ2VtYmFsaWthbiBGQUxTRS4NCg0KT3BlcmFuIGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuICg8PSkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4gZWxlbWVuIG9wZXJhbiBrZWR1YSBkYW4gbWVuZ2VtYmFsaWthbiBGQUxTRS4NCg0KT3BlcmFuIGxlYmloIGJlc2FyIGRhcmkgKD4pIGJlcmd1bmEgdW50dWsgbWVuZ2VtYmFsaWthbiBUUlVFIGppa2EgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBvcGVyYW4gcGVydGFtYSBsZWJpaCBiZXNhciBkYXJpcGFkYSBvcGVyYW4ga2VkdWEgZGFuIG1lbmdlbWJhbGlrYW4gRkFMU0UuDQoNCk9wZXJhbiBsZWJpaCBkYXJpIHNhbWEgZGVuZ2FuICg+PSkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGxlYmloIGJlc2FyIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiBlbGVtZW4gb3BlcmFuIGtlZHVhIGRhbiBtZW5nZW1iYWxpa2FuIEZBTFNFLg0KDQpPcGVyYW4gc2FtYSBkZW5nYW4gKD09KSBiZXJndW5hIHVudHVrIG1lbmdlbWJhbGlrYW4gVFJVRSBqaWthICBkYW4gaGFueWEgamlrYSAga2VkdWEgc2lzaSBtZW1pbGlraSBuaWxhaSB5YW5nIHNhbWEuDQoNCk9wZXJhbiB0aWRhayBzYW1hIGRlbmdhbiAoIT0pIGJlcmd1bmEgdW50dWsgbWVuZ2VtYmFsaWthbiBUUlVFIGppa2EgIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgb3ByZW5hIHBlcnRhbWEgdGlkYWsgc2FtYSBkZW5nYW4gZGFyaSBvcGVyYW4ga2VkdWEuDQoNCmBgYHtyfQ0KeDwtYygyLDMsNSkgI21lbXVhdCB2ZWt0b3IgeA0KeTwtYygyLDQsNikgI21lbXVhdCB2ZWt0b3IgeQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoInZla3RvciB4IGt1cmFuZyBkYXJpIHZla3RvciB5IDoiLHggPCB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCBrdXJhbmcgZGFyaSBzYW1hIGRlbmdhbiB2ZWt0b3IgeSA6Iix4IDw9IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInZla3RvciB4IGxlYmloIGJlc2FyIGRhcmkgdmVrdG9yIHkgOiIseCA+IHksIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgidmVrdG9yIHggbGViaWggYmVzYXIgZGFyaSBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCA+PSB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCA9PSB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCB0aWRhayBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCAhPSB5LCAiXG4iKQ0KYGBgDQoNCiMjIExvZ2lrYQ0KDQpPcGVyYXRvciBsb2dpa2EgaW5pIG1lbnNpbXVsYXNpa2FuIG9wZXJhc2kga2VwdXR1c2FuIGRlbmdhbiBtZW5nZXZhbHVhc2kga2UgbmlsYWkgVFJVRSBhdGF1IEZBTFNFLiBTaW1ib2wgcGFkYSBSIGRhbiBQeXRob24gcGFkYSBvcGVyYXNpb25hbCBsb2dpa2EgaW5pIG1lbWlsaWtpIGtlc2FtYWFuIHNlYmFnYWkgYmVyaWt1dC4NCg0KT3BlcmF0b3IgTk9UKCEpIGluaSBtZXJ1cGFrYW4gb3BlcmFzaSBuZWdhc2kgYXRhdSBrZWJhbGlrYW4gcGFzYSBzdGF0dXMgZWxlbWVuIG9wZXJhbi4NCg0KT3BlcmF0b3IgQU5EKCYpIGluaSBtZXJ1cGFrYW4gbWVtYmFsaWtrYW4gVFJVRSBqaWthIGtlZHVhIG9wZXJhbiBiZXJuaWxhaSBiZW5hci4NCg0KT3BlcmFuIE9SKHwpIGluaSBtZXJ1cGFrYW4gbWVuZ2dlbWJhbGlrYW4gVFJVRSBqaWthIHNhbGFoIHNhdHUgb3BlcmFuIGFkYWxhaCBiZW5hci4NCg0KT3BlcmFuIFhPUiAoXikgaW5pIG1lcnVwYWthbiBtZW5nZ2VtYmFsaWthbiBUUlVFLCBqaWthIHNhbGFoIHNhdHUgZGFyaSBrZWR1YSBlbGVtZW4gcGVydGFtYSBvcGVyYW4gYmVybmlsYWkgYmVuYXIuDQoNCipQYWRhIFIsIGFkYXB1biBjb250b2ggc2ViYWdhaSBiZXJpa3V0LioNCg0KYGBge3J9DQp4PC1jKDAsVFJVRSxGQUxTRSkNCnk8LWMoVFJVRSwwLjEsNCszaSkNCiNtZWxha3VrYW4gb3BlcmFzaSBsb2dpa2FuIHBhZGEgb3BlcmFuDQpgYGANCg0KYGBge3J9DQpjYXQoImxvZ2lrYSBuZWdhc2kofikgdW50dWsgdmVrdG9yIHg6IiwheCwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIG5lZ2FzaSh+KSB1bnR1ayB2ZWt0b3IgeToiLCF5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJsb2dpa2Ega29uanVuZ3NpKERhbik6Iix4ICYgeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIGRpc2p1bmdzaShPcik6Iix4IHwgeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIGRpc2p1bmdzaSBwYXJzaWFsKE9yKToiLHh8fHksICJcbiIpDQpgYGANCg0KIyMgTGFpbm55YQ0KDQpQYWRhIFIsIGFkYXB1biBjb250b2ggc2ViYWdhaSBiZXJpa3V0Lg0KDQpgYGB7cn0NCng8LWMoMiwzLDUpICNtZW11YXQgdmVrdG9yIHgNCnk8LWMoMiw0LDYpICNtZW11YXQgdmVrdG9yIHkNCmBgYA0KDQpgYGB7cn0NCnNxcnQoeCp5KSAjYmVudHVrIGFrYXINCmBgYA0KDQpgYGB7cn0NCmxvZyh4KSAjbG9nYXJpdG1hDQpgYGANCg0KYGBge3J9DQpleHAoeSkgI2Vrc3BvbmVuDQpgYGANCg0KYGBge3J9DQooeC95KSt5ICN0YW5kYSBrdXJ1bmcNCmBgYA0KDQojIFRpcGUgRGF0YQ0KDQpUaXBlIGRhdGEgcGFkYSBSIGRhbiBQeWh0b24gbWVtYW5nbGFoIHNhbmdhdCBwZW50aW5nLiBQYWRhIHRpcGUgZGF0YSBSIGRhbiBQeWh0b24gbWVtaWxpa2kga2VzYW1hYW4gbWF1cHVuIHBlcmJlZGFhbiBTZWJhZ2FpIGJlcmlrdXQuDQoNClRpcGUgZGF0YSBEb3VibGUgYXRhdSBGbG9hdCAoNS42KSBkZW5nYW4gYmlsYW5nYW4geWFuZyBtZW1wdW55YWkga29tYW4uIFRpcGUgZGF0YSBpbnRlZ2VyICg1KSBtZXJ1cGFrYW4gYmlsYW5nYW4gYnVsYXQgMSwyLC4uLixuLiBUaXBlIGRhdGEgU3RyaW5nIGF0YXUgY2hhcmFjdGVyICjigJhEc2llbmNlbGFic+KAmSkgaW5pIG1lcnVwYWthbiBrYXJha3RlciBhdGF1IGthbGltYXQgYmlzYSBiZXJ1cGEgaHVydWYgLCBhbmdrYSwgZGFuIGxhaW5ueWEgZGVuZ2FuIGRpYW1waXQgdGFuZGEgKOKAmCkgYXRhdSAo4oCcKS4NCg0KTmFtdW4gYmVyYmVkYSBkZW5nYW4gVGlwZSBkYXRhIEJvbGVhbiBhdGF1IExvZ2ljYWwgZGFuIENvbXBsZXggcGFkYSBSIGRhbiBQeWh0b24geWFuZyBiZXJiZWRhLiBUaXBlIGRhdGEgTG9naWNhbCBhZGEgUiAoVFJVRS9GQUxTRSkgbmFtdW4gcGFkYSBQeXRob24gKFRydWUvRmFsc2UpIGluaSBtZXJ1cGFrYW4gYmVuYWsgbmlsYWkgMSBkYW4gc2FsYWggbmlsYWkgMC4gVGlwZSBkYXRhIENvbXBsZXggcGFkYSBSICgxKzVpKSBuYW11biBwYWRhIFB5aHRvbiAoMSs1aikgaW5pIG1lcnVwYWthbiBwYXNhbmdhbiBhbmdrYSByZWFsIGRhbiBpbWFqaW5lci4NCg0KDQoqUGFkYSBSLCBhZGFwdW4gY29udG9oIHNlYmFnYWkgYmVyaWt1dC4qDQoNCmBgYHtyfQ0KYzEgPC0gMS4zICAgICAgICAgICAgICAgICNtZW11YXQgbmlsYWkgZGVzaW1hbA0KYzIgPC0gYXMuaW50ZWdlcigxKSAgICAgI3RldGFwa2FuIG5pbGFpIGludGVnZXINCmMyIDwtIDFMICAgICAgICAgICAgICAgICAjY2FyYWxhaW4gdW51dGsgbWVtdWFsIG5pbGFpIGludGVnZXIgZGkgUg0KYzMgPC0gYyhUUlVFLEZBTFNFKSAgICAgICNib2xlYW4gYXRhdSBsb2dpY2FsDQpjMyA8LSBhcy5sb2dpY2FsKGMoMCwxKSkgI2NhcmFsYWluIHVudHVrIG1lbXVhdCBib2xlYW4gYXRhdSBsb2dpY2FsDQpjNCA8LSBjKCJkIiwnZScsICc0NTYnKSAgI3N0cmluZyBhdGF1IGNoYXJhY3Rlcg0KYzUgPC0gMyArIDVpICAgICAgICAgICAgICNjb21wbGV4DQpgYGANCg0KKkNvbnRvaCA6Kg0KDQpgYGB7cn0NCmNsYXNzKGMxKSAgICAgICAgICAgICAgICNjZXRhayBuYW1hIGtlbGFyIHZhcmlhYmVsDQpgYGANCg0KYGBge3J9DQp0eXBlb2YoYzEpICAgICAgICAgICAgICAjY2V0YWsgdGlwZSB2YXJpYWJlbCB4DQpgYGANCg0KIyBCYW50dWFuDQoNClBhZGEgUiwgYWRhcHVuIGNvbnRvaCBzZWJhZ2FpIGJlcmlrdXQuDQoNCmBgYHtyfQ0KIyBoZWxwLnN0YXJ0KCkgICAgICAgICAjIE1lbnUgdW50dWsgbWVuZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KIyA/aGVscCAgICAgICAgICAgICAgICAjIE1lbnUgdW50dWsgbWVuZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KIyA/IGNsYXNzICAgICAgICAgICAgICAjIG1lbmRhcGF0a2FuIGJhbnR1YW4gdW50dWsgZnVuZ3NpIGNsYXNzDQojIGhlbHAoY2xhc3MpICAgICAgICAgICMgbWVuZGFwYXRrYW4gYmFudHVhbiB1bnR1ayBmdW5nc2kgY2xhc3MNCiMgPz9jbGFzcyAgICAgICAgICAgICAgIyBqaWthIHRpZGFrIG1lbmdldGFodWkgZnVuZ3NpIHlhbmcgZGljYXJpDQojIGhlbHAuc2VhcmNoKCdjbGFzcycpICMgamlrYSB0aWRhayBtZW5nZXRhaHVpIGZ1bmdzaSB5YW5nIGRpY2FyaQ0KYGBgDQo=