A. Creating Vectors

In this section, you are expected to be able to shape data in vectors, perform basic mathematical operations, and also manipulate vectors.

Exercise 1

Create a vector A containing numeric values, starting from the last 2 digits of your student id up to 30.

(09:30)
##  [1]  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
A<-(09:30)
A
##  [1]  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Exercise 2

Create a vector B containing 12 character values; all names of your classmate including yourself.

B<-c("Vanessa","Kefas","Putri","Sherly","Julian","Siana","Irene","Jeff","Ardifo","Nikita","Falen","Pak Bakti")
B
##  [1] "Vanessa"   "Kefas"     "Putri"     "Sherly"    "Julian"    "Siana"    
##  [7] "Irene"     "Jeff"      "Ardifo"    "Nikita"    "Falen"     "Pak Bakti"

Exercise 3

Create a vector C containing 12 numeric values, random number between 60 and 100.

C<-runif(12,60,100)
C
##  [1] 84.86107 62.57606 79.21254 95.93953 89.49230 79.30865 87.70179 90.38060
##  [9] 91.87407 66.02072 67.37145 93.94438

B. Creating Matrices

In this section, you are expected to be able to shape data in Matrices, perform basic mathematical operations, and also manipulate Matrices.

Exercise 4

Create a matrices M1 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 60 and 100.

c<-runif(16,60,100)
M1<- matrix(c,nrow = 4,ncol = 4)
M1
##          [,1]     [,2]     [,3]     [,4]
## [1,] 67.23816 61.18320 87.94154 76.33923
## [2,] 91.13866 62.44757 86.04402 79.02070
## [3,] 83.39362 75.34107 89.00813 86.00201
## [4,] 78.86857 66.94802 70.43566 91.00305

Exercise 5

Create a matrices M2 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 30 and 60. Find out the following tasks:

  • 3 * M1, give your opinion about the result.
  • M1 + M2, give your opinion about the result.
  • M1 - M2, give your opinion about the result.
  • M1 * M2, give your opinion about the result.
  • M1 / M2, give your opinion about the result.
  • determinan of M1, give your opinion about the result.
  • invers of M1, give your opinion about the result.
a<-runif(16,30,60)
M2<- matrix(a,nrow = 4,ncol = 4)
M2 
##          [,1]     [,2]     [,3]     [,4]
## [1,] 51.61999 37.29140 50.80204 56.88910
## [2,] 30.59969 39.23575 33.69697 33.52260
## [3,] 44.86591 59.46710 38.70641 50.51787
## [4,] 37.41516 53.09179 59.50612 44.41530
3 * M1    # nilai yang ada pada matriks M1 dikali dengan 3
##          [,1]     [,2]     [,3]     [,4]
## [1,] 201.7145 183.5496 263.8246 229.0177
## [2,] 273.4160 187.3427 258.1321 237.0621
## [3,] 250.1809 226.0232 267.0244 258.0060
## [4,] 236.6057 200.8441 211.3070 273.0092
M1 + M2   # penjumlahan M1 dan M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 118.8582  98.4746 138.7436 133.2283
## [2,] 121.7383 101.6833 119.7410 112.5433
## [3,] 128.2595 134.8082 127.7145 136.5199
## [4,] 116.2837 120.0398 129.9418 135.4184
M1 - M2   # pengurangan M1 dan M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 15.61818 23.89180 37.13950 19.45013
## [2,] 60.53897 23.21182 52.34705 45.49810
## [3,] 38.52771 15.87397 50.30171 35.48414
## [4,] 41.45341 13.85624 10.92954 46.58775
M1 * M2   # perkalian M1 dan M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 3470.833 2281.607 4467.610 4342.870
## [2,] 2788.815 2450.177 2899.423 2648.979
## [3,] 3741.530 4480.314 3445.185 4344.638
## [4,] 2950.880 3554.390 4191.353 4041.928
M1 / M2   # pembagian M1 dan M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 1.302561 1.640679 1.731063 1.341896
## [2,] 2.978418 1.591599 2.553465 2.357237
## [3,] 1.858730 1.266937 2.299571 1.702408
## [4,] 2.107931 1.260986 1.183671 2.048912
det(M1)   # menghitung determinan M1
## [1] 466181.3
library(matlib)
inv(M1)   # menghitung invers dari M1
##             [,1]        [,2]        [,3]        [,4]
## [1,] -0.03973559  0.04599510  0.00009424 -0.00669521
## [2,] -0.05622104 -0.04517971  0.12237446 -0.02925667
## [3,]  0.04592637  0.00614591 -0.02130521 -0.02372830
## [4,]  0.04025054 -0.01138166 -0.07361857  0.05667982

Exercise 6

Create a matrix data by column, that is contain the following vectors:

  • B that you has been created in the exercise 2. Name it as a ‘names’ variable
  • C that you has been created in the exercise 3. Name it as a ‘scores’ variable.
names <-B
scores<-C
data<- cbind(names,scores)
data
##       names       scores            
##  [1,] "Vanessa"   "84.8610673937947"
##  [2,] "Kefas"     "62.5760619994253"
##  [3,] "Putri"     "79.2125416826457"
##  [4,] "Sherly"    "95.9395293146372"
##  [5,] "Julian"    "89.4922980573028"
##  [6,] "Siana"     "79.3086503725499"
##  [7,] "Irene"     "87.701786858961" 
##  [8,] "Jeff"      "90.3806035220623"
##  [9,] "Ardifo"    "91.8740678392351"
## [10,] "Nikita"    "66.0207219514996"
## [11,] "Falen"     "67.3714509699494"
## [12,] "Pak Bakti" "93.9443835243583"

C. Lists

In this section, you are expected to be able to shape data by using the list() function, perform some basic manipulations.

Exercise 7

Please create a data set as the List variable by using the list() function, contain the following vectors:

  • a variable name, the values including your classmate and yourself
  • a variable age, the values including your classmate and yourself
  • a variable gender, the values including your classmate and yourself
name<- c("Kefas","Vanessa","Jeffry","Irene","Nikita","Angel","Siana","Falen","Lala","Ardifo","Julian","Sherly")
age<- c(18,18,19,19,18,19,19,22,19,19,19,19)
gender<- c("male","female","male","female","female","female","female","male","female","male","male","female")
list<- list(name,age,gender)
list
## [[1]]
##  [1] "Kefas"   "Vanessa" "Jeffry"  "Irene"   "Nikita"  "Angel"   "Siana"  
##  [8] "Falen"   "Lala"    "Ardifo"  "Julian"  "Sherly" 
## 
## [[2]]
##  [1] 18 18 19 19 18 19 19 22 19 19 19 19
## 
## [[3]]
##  [1] "male"   "female" "male"   "female" "female" "female" "female" "male"  
##  [9] "female" "male"   "male"   "female"

D. Factors

In this section, you are expected to be able to shape data by using the factor() function, perform some basic manipulations.

Exercise 8

Please create a data set as the Factor variable as you have done at Exercise 7. Here, you add one more variable called marital_status by using the factor() function, as the following code:

marital_status <- factor(c("yes","no","yes","no", until 12 students))
marital_status <- factor(c("no","no","no","no", "no", "no", "no", "no", "no", "no", "no", "no"))
marital_status
##  [1] no no no no no no no no no no no no
## Levels: no

E. Data Frames

In this section, you are expected to be able to shape data by using the data.frame() function, perform some basic manipulations.

Exercise 9

Please create a data set as the DF1 variable, contain the following vectors:

  • id, assume 1 up to 6
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
DF1 <- data.frame(id = c(1:6), 
                  name = c("Kefas","Vanessa","Jeffry","Irene","Nikita","Angel"),
                  gender= c("male","female","male","female","female","female"),
                  age = c(18,18,19,19,18,19),
                  marital_status = c("single","single","single","single",
                                     "single","single"),
                  address_by_city = c("Medang","Manado","Jakarta","Tangerang","Tangerang Selatan","Tiga Raksa"),stringsAsFactors = F)
                  
DF1
##   id    name gender age marital_status   address_by_city
## 1  1   Kefas   male  18         single            Medang
## 2  2 Vanessa female  18         single            Manado
## 3  3  Jeffry   male  19         single           Jakarta
## 4  4   Irene female  19         single         Tangerang
## 5  5  Nikita female  18         single Tangerang Selatan
## 6  6   Angel female  19         single        Tiga Raksa

Please create a data set as the DF2 variable, contain the following vectors:

  • id, assume 7 up to 12
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
DF2<- data.frame(id = c(7:12),
                 name = c("Siana","Falen","Lala","Ardifo","Julian","Sherly"),
                 gender = c("female","male","female","male","male","female"),
                 age = c(19,22,19,19,19,19),
                 marital_status = c("single","Dating","Dating","single","single","single"),
                 address_by_city = c("Tangerang","Manado","Tangerang","Kalimantan","Tangerang","Jakarta"),stringsAsFactors = F)

DF2
##   id   name gender age marital_status address_by_city
## 1  7  Siana female  19         single       Tangerang
## 2  8  Falen   male  22         Dating          Manado
## 3  9   Lala female  19         Dating       Tangerang
## 4 10 Ardifo   male  19         single      Kalimantan
## 5 11 Julian   male  19         single       Tangerang
## 6 12 Sherly female  19         single         Jakarta

Exercise

In this final exercise, please consider the following tasks:

  • Combine DF1 and DF2, assign it as SB19 variable!
  • Print the result of data frame SB19!
SB19 <- rbind(DF1,DF2)
SB19
##    id    name gender age marital_status   address_by_city
## 1   1   Kefas   male  18         single            Medang
## 2   2 Vanessa female  18         single            Manado
## 3   3  Jeffry   male  19         single           Jakarta
## 4   4   Irene female  19         single         Tangerang
## 5   5  Nikita female  18         single Tangerang Selatan
## 6   6   Angel female  19         single        Tiga Raksa
## 7   7   Siana female  19         single         Tangerang
## 8   8   Falen   male  22         Dating            Manado
## 9   9    Lala female  19         Dating         Tangerang
## 10 10  Ardifo   male  19         single        Kalimantan
## 11 11  Julian   male  19         single         Tangerang
## 12 12  Sherly female  19         single           Jakarta
  • Print first 3 rows of the SB19 dataset!
head(SB19,3)
##   id    name gender age marital_status address_by_city
## 1  1   Kefas   male  18         single          Medang
## 2  2 Vanessa female  18         single          Manado
## 3  3  Jeffry   male  19         single         Jakarta
  • How can you preview the SB19 dataset like an Excel file on your Rstudio?
View(SB19)
  • Review the structure of the data frame SB19!
str(SB19)
## 'data.frame':    12 obs. of  6 variables:
##  $ id             : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ name           : chr  "Kefas" "Vanessa" "Jeffry" "Irene" ...
##  $ gender         : chr  "male" "female" "male" "female" ...
##  $ age            : num  18 18 19 19 18 19 19 22 19 19 ...
##  $ marital_status : chr  "single" "single" "single" "single" ...
##  $ address_by_city: chr  "Medang" "Manado" "Jakarta" "Tangerang" ...
  • Check the dimension of the data.
dim(SB19)
## [1] 12  6
  • Please apply piping functions to the data frame SB19, filter it by their gender accordingly! (as you have learn last week)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(magrittr)
pria<-SB19 %>% filter(gender=="male")%>% print()
##   id   name gender age marital_status address_by_city
## 1  1  Kefas   male  18         single          Medang
## 2  3 Jeffry   male  19         single         Jakarta
## 3  8  Falen   male  22         Dating          Manado
## 4 10 Ardifo   male  19         single      Kalimantan
## 5 11 Julian   male  19         single       Tangerang
library(dplyr)
library(magrittr)
wanita<-SB19 %>% filter(gender=="female")%>% print()
##   id    name gender age marital_status   address_by_city
## 1  2 Vanessa female  18         single            Manado
## 2  4   Irene female  19         single         Tangerang
## 3  5  Nikita female  18         single Tangerang Selatan
## 4  6   Angel female  19         single        Tiga Raksa
## 5  7   Siana female  19         single         Tangerang
## 6  9    Lala female  19         Dating         Tangerang
## 7 12  Sherly female  19         single           Jakarta
LS0tDQp0aXRsZTogIkxhYjM6IFIgQmFzaWNzIg0KYXV0aG9yOiAiTmlraXRhIEluZHJpeWFuaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgTG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc0MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vZ2l0aHViLmNvbS9CYWt0aS1TaXJlZ2FyL2ltYWdlcy9ibG9iL21hc3Rlci9sb2dvLnBuZz9yYXc9dHJ1ZSIpDQpgYGANCg0KIyMgQS4gQ3JlYXRpbmcgVmVjdG9ycyANCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBpbiB2ZWN0b3JzLCBwZXJmb3JtIGJhc2ljIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zLCBhbmQgYWxzbyBtYW5pcHVsYXRlIHZlY3RvcnMuDQoNCiMjIyBFeGVyY2lzZSAxDQoNCkNyZWF0ZSBhIHZlY3RvciBgQWAgY29udGFpbmluZyBudW1lcmljIHZhbHVlcywgc3RhcnRpbmcgZnJvbSB0aGUgbGFzdCAyIGRpZ2l0cyBvZiB5b3VyIHN0dWRlbnQgaWQgdXAgdG8gMzAuDQoNCmBgYHtyfQ0KKDA5OjMwKQ0KQTwtKDA5OjMwKQ0KQQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAyDQoNCkNyZWF0ZSBhIHZlY3RvciBgQmAgY29udGFpbmluZyAxMiBjaGFyYWN0ZXIgdmFsdWVzOyBhbGwgbmFtZXMgb2YgeW91ciBjbGFzc21hdGUgaW5jbHVkaW5nIHlvdXJzZWxmLg0KDQpgYGB7cn0NCkI8LWMoIlZhbmVzc2EiLCJLZWZhcyIsIlB1dHJpIiwiU2hlcmx5IiwiSnVsaWFuIiwiU2lhbmEiLCJJcmVuZSIsIkplZmYiLCJBcmRpZm8iLCJOaWtpdGEiLCJGYWxlbiIsIlBhayBCYWt0aSIpDQpCDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDMNCg0KQ3JlYXRlIGEgdmVjdG9yICBgQ2AgY29udGFpbmluZyAxMiBudW1lcmljIHZhbHVlcywgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDYwIGFuZCAxMDAuDQoNCmBgYHtyfQ0KQzwtcnVuaWYoMTIsNjAsMTAwKQ0KQw0KYGBgDQoNCg0KIyMgQi4gQ3JlYXRpbmcgTWF0cmljZXMgDQoNCkluIHRoaXMgc2VjdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHNoYXBlIGRhdGEgaW4gTWF0cmljZXMsIHBlcmZvcm0gYmFzaWMgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMsIGFuZCBhbHNvIG1hbmlwdWxhdGUgTWF0cmljZXMuDQoNCg0KIyMjIEV4ZXJjaXNlIDQNCg0KQ3JlYXRlIGEgbWF0cmljZXMgYE0xYCBvcmRlciBieSAkcm93cyBcdGltZXMgY29sdW1ucyBcc3BhY2UgKDQgXHRpbWVzIDQpJCBjb250YWluaW5nIDE2IG51bWVyaWMgdmFsdWVzLCByYW5kb20gbnVtYmVyIGJldHdlZW4gNjAgYW5kIDEwMC4NCg0KYGBge3J9DQpjPC1ydW5pZigxNiw2MCwxMDApDQpNMTwtIG1hdHJpeChjLG5yb3cgPSA0LG5jb2wgPSA0KQ0KTTENCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSA1DQoNCkNyZWF0ZSBhIG1hdHJpY2VzIGBNMmAgb3JkZXIgYnkgJHJvd3MgXHRpbWVzIGNvbHVtbnMgXHNwYWNlICg0IFx0aW1lcyA0KSQgY29udGFpbmluZyAxNiBudW1lcmljIHZhbHVlcywgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDMwIGFuZCA2MC4gRmluZCBvdXQgdGhlIGZvbGxvd2luZyB0YXNrczoNCg0KKiBgMyAqIE0xYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGBNMSArIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGBNMSAtIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4NCiogYE0xICogTTJgLCBnaXZlIHlvdXIgb3BpbmlvbiBhYm91dCB0aGUgcmVzdWx0LiANCiogYE0xIC8gTTJgLCBnaXZlIHlvdXIgb3BpbmlvbiBhYm91dCB0aGUgcmVzdWx0LiANCiogZGV0ZXJtaW5hbiBvZiBgTTFgLCBnaXZlIHlvdXIgb3BpbmlvbiBhYm91dCB0aGUgcmVzdWx0LiANCiogaW52ZXJzIG9mIGBNMWAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuDQoNCg0KYGBge3J9DQphPC1ydW5pZigxNiwzMCw2MCkNCk0yPC0gbWF0cml4KGEsbnJvdyA9IDQsbmNvbCA9IDQpDQpNMiANCjMgKiBNMSAgICAjIG5pbGFpIHlhbmcgYWRhIHBhZGEgbWF0cmlrcyBNMSBkaWthbGkgZGVuZ2FuIDMNCk0xICsgTTIgICAjIHBlbmp1bWxhaGFuIE0xIGRhbiBNMg0KTTEgLSBNMiAgICMgcGVuZ3VyYW5nYW4gTTEgZGFuIE0yDQpNMSAqIE0yICAgIyBwZXJrYWxpYW4gTTEgZGFuIE0yDQpNMSAvIE0yICAgIyBwZW1iYWdpYW4gTTEgZGFuIE0yDQpkZXQoTTEpICAgIyBtZW5naGl0dW5nIGRldGVybWluYW4gTTENCmxpYnJhcnkobWF0bGliKQ0KaW52KE0xKSAgICMgbWVuZ2hpdHVuZyBpbnZlcnMgZGFyaSBNMQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA2DQoNCkNyZWF0ZSBhIG1hdHJpeCBgZGF0YWAgYnkgY29sdW1uLCB0aGF0IGlzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2ZWN0b3JzOg0KDQoqIGBCYCB0aGF0IHlvdSBoYXMgYmVlbiBjcmVhdGVkIGluIHRoZSBleGVyY2lzZSAyLiBOYW1lIGl0IGFzIGEgJ25hbWVzJyB2YXJpYWJsZQ0KKiBgQ2AgdGhhdCB5b3UgaGFzIGJlZW4gY3JlYXRlZCBpbiB0aGUgZXhlcmNpc2UgMy4gTmFtZSBpdCBhcyBhICdzY29yZXMnIHZhcmlhYmxlLg0KDQpgYGB7cn0NCm5hbWVzIDwtQg0Kc2NvcmVzPC1DDQpkYXRhPC0gY2JpbmQobmFtZXMsc2NvcmVzKQ0KZGF0YQ0KYGBgDQoNCg0KIyMgQy4gTGlzdHMgDQoNCkluIHRoaXMgc2VjdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHNoYXBlIGRhdGEgYnkgdXNpbmcgdGhlIGBsaXN0KClgIGZ1bmN0aW9uLCBwZXJmb3JtIHNvbWUgYmFzaWMgbWFuaXB1bGF0aW9ucy4NCg0KDQojIyMgRXhlcmNpc2UgNw0KDQpQbGVhc2UgY3JlYXRlIGEgZGF0YSBzZXQgYXMgdGhlIGBMaXN0YCB2YXJpYWJsZSBieSB1c2luZyB0aGUgYGxpc3QoKWAgZnVuY3Rpb24sIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2ZWN0b3JzOg0KDQoqIGEgdmFyaWFibGUgYG5hbWVgLCB0aGUgdmFsdWVzIGluY2x1ZGluZyB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYSB2YXJpYWJsZSBgYWdlYCwgdGhlIHZhbHVlcyBpbmNsdWRpbmcgeW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGEgdmFyaWFibGUgYGdlbmRlcmAsIHRoZSB2YWx1ZXMgaW5jbHVkaW5nIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KDQpgYGB7cn0NCm5hbWU8LSBjKCJLZWZhcyIsIlZhbmVzc2EiLCJKZWZmcnkiLCJJcmVuZSIsIk5pa2l0YSIsIkFuZ2VsIiwiU2lhbmEiLCJGYWxlbiIsIkxhbGEiLCJBcmRpZm8iLCJKdWxpYW4iLCJTaGVybHkiKQ0KYWdlPC0gYygxOCwxOCwxOSwxOSwxOCwxOSwxOSwyMiwxOSwxOSwxOSwxOSkNCmdlbmRlcjwtIGMoIm1hbGUiLCJmZW1hbGUiLCJtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwibWFsZSIsImZlbWFsZSIsIm1hbGUiLCJtYWxlIiwiZmVtYWxlIikNCmxpc3Q8LSBsaXN0KG5hbWUsYWdlLGdlbmRlcikNCmxpc3QNCmBgYA0KDQoNCiMjIEQuIEZhY3RvcnMNCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBieSB1c2luZyB0aGUgYGZhY3RvcigpYCBmdW5jdGlvbiwgcGVyZm9ybSBzb21lIGJhc2ljIG1hbmlwdWxhdGlvbnMuDQoNCg0KIyMjIEV4ZXJjaXNlIDgNCg0KUGxlYXNlIGNyZWF0ZSBhIGRhdGEgc2V0IGFzIHRoZSBgRmFjdG9yYCB2YXJpYWJsZSBhcyB5b3UgaGF2ZSBkb25lIGF0IEV4ZXJjaXNlIDcuIEhlcmUsIHlvdSBhZGQgb25lIG1vcmUgdmFyaWFibGUgY2FsbGVkIGBtYXJpdGFsX3N0YXR1c2AgYnkgdXNpbmcgdGhlIGBmYWN0b3IoKWAgZnVuY3Rpb24sIGFzIHRoZSBmb2xsb3dpbmcgY29kZToNCg0KYGBgeWFtbA0KbWFyaXRhbF9zdGF0dXMgPC0gZmFjdG9yKGMoInllcyIsIm5vIiwieWVzIiwibm8iLCB1bnRpbCAxMiBzdHVkZW50cykpDQpgYGANCg0KYGBge3J9DQptYXJpdGFsX3N0YXR1cyA8LSBmYWN0b3IoYygibm8iLCJubyIsIm5vIiwibm8iLCAibm8iLCAibm8iLCAibm8iLCAibm8iLCAibm8iLCAibm8iLCAibm8iLCAibm8iKSkNCm1hcml0YWxfc3RhdHVzDQpgYGANCg0KDQojIyBFLiBEYXRhIEZyYW1lcw0KDQpJbiB0aGlzIHNlY3Rpb24sIHlvdSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBzaGFwZSBkYXRhIGJ5IHVzaW5nIHRoZSBgZGF0YS5mcmFtZSgpYCBmdW5jdGlvbiwgcGVyZm9ybSBzb21lIGJhc2ljIG1hbmlwdWxhdGlvbnMuDQoNCg0KIyMjIEV4ZXJjaXNlIDkNCg0KUGxlYXNlIGNyZWF0ZSBhIGRhdGEgc2V0IGFzIHRoZSBgREYxYCB2YXJpYWJsZSwgY29udGFpbiB0aGUgZm9sbG93aW5nIHZlY3RvcnM6DQoNCiogYGlkYCwgYXNzdW1lIDEgdXAgdG8gNg0KKiBgbmFtZWAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBnZW5kZXJgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgYWdlYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYG1hcml0YWxfc3RhdHVzYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGFkZHJlc3NfYnlfY2l0eWAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoNCmBgYHtyfQ0KREYxIDwtIGRhdGEuZnJhbWUoaWQgPSBjKDE6NiksIA0KICAgICAgICAgICAgICAgICAgbmFtZSA9IGMoIktlZmFzIiwiVmFuZXNzYSIsIkplZmZyeSIsIklyZW5lIiwiTmlraXRhIiwiQW5nZWwiKSwNCiAgICAgICAgICAgICAgICAgIGdlbmRlcj0gYygibWFsZSIsImZlbWFsZSIsIm1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiKSwNCiAgICAgICAgICAgICAgICAgIGFnZSA9IGMoMTgsMTgsMTksMTksMTgsMTkpLA0KICAgICAgICAgICAgICAgICAgbWFyaXRhbF9zdGF0dXMgPSBjKCJzaW5nbGUiLCJzaW5nbGUiLCJzaW5nbGUiLCJzaW5nbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUiLCJzaW5nbGUiKSwNCiAgICAgICAgICAgICAgICAgIGFkZHJlc3NfYnlfY2l0eSA9IGMoIk1lZGFuZyIsIk1hbmFkbyIsIkpha2FydGEiLCJUYW5nZXJhbmciLCJUYW5nZXJhbmcgU2VsYXRhbiIsIlRpZ2EgUmFrc2EiKSxzdHJpbmdzQXNGYWN0b3JzID0gRikNCiAgICAgICAgICAgICAgICAgIA0KREYxDQoNCmBgYA0KDQpQbGVhc2UgY3JlYXRlIGEgZGF0YSBzZXQgYXMgdGhlIGBERjJgIHZhcmlhYmxlLCBjb250YWluIHRoZSBmb2xsb3dpbmcgdmVjdG9yczoNCg0KKiBgaWRgLCBhc3N1bWUgNyB1cCB0byAxMg0KKiBgbmFtZWAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBnZW5kZXJgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgYWdlYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYG1hcml0YWxfc3RhdHVzYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGFkZHJlc3NfYnlfY2l0eWAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoNCmBgYHtyfQ0KREYyPC0gZGF0YS5mcmFtZShpZCA9IGMoNzoxMiksDQogICAgICAgICAgICAgICAgIG5hbWUgPSBjKCJTaWFuYSIsIkZhbGVuIiwiTGFsYSIsIkFyZGlmbyIsIkp1bGlhbiIsIlNoZXJseSIpLA0KICAgICAgICAgICAgICAgICBnZW5kZXIgPSBjKCJmZW1hbGUiLCJtYWxlIiwiZmVtYWxlIiwibWFsZSIsIm1hbGUiLCJmZW1hbGUiKSwNCiAgICAgICAgICAgICAgICAgYWdlID0gYygxOSwyMiwxOSwxOSwxOSwxOSksDQogICAgICAgICAgICAgICAgIG1hcml0YWxfc3RhdHVzID0gYygic2luZ2xlIiwiRGF0aW5nIiwiRGF0aW5nIiwic2luZ2xlIiwic2luZ2xlIiwic2luZ2xlIiksDQogICAgICAgICAgICAgICAgIGFkZHJlc3NfYnlfY2l0eSA9IGMoIlRhbmdlcmFuZyIsIk1hbmFkbyIsIlRhbmdlcmFuZyIsIkthbGltYW50YW4iLCJUYW5nZXJhbmciLCJKYWthcnRhIiksc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQoNCkRGMg0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIA0KDQpJbiB0aGlzIGZpbmFsIGV4ZXJjaXNlLCBwbGVhc2UgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0YXNrczogDQoNCiogQ29tYmluZSBgREYxYCBhbmQgYERGMmAsICBhc3NpZ24gaXQgYXMgYFNCMTlgIHZhcmlhYmxlIQ0KKiBQcmludCB0aGUgcmVzdWx0IG9mIGRhdGEgZnJhbWUgYFNCMTlgIQ0KYGBge3J9DQpTQjE5IDwtIHJiaW5kKERGMSxERjIpDQpTQjE5DQpgYGANCiogUHJpbnQgZmlyc3QgMyByb3dzIG9mIHRoZSBgU0IxOWAgZGF0YXNldCENCmBgYHtyfQ0KaGVhZChTQjE5LDMpDQpgYGANCiogSG93IGNhbiB5b3UgcHJldmlldyAgdGhlIGBTQjE5YCBkYXRhc2V0IGxpa2UgYW4gRXhjZWwgZmlsZSBvbiB5b3VyIFJzdHVkaW8/DQpgYGB7cn0NClZpZXcoU0IxOSkNCmBgYA0KKiBSZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBmcmFtZSBgU0IxOWAhDQpgYGB7cn0NCnN0cihTQjE5KQ0KYGBgDQoqIENoZWNrIHRoZSBkaW1lbnNpb24gb2YgdGhlIGRhdGEuIA0KYGBge3J9DQpkaW0oU0IxOSkNCmBgYA0KKiBQbGVhc2UgYXBwbHkgcGlwaW5nIGZ1bmN0aW9ucyB0byB0aGUgZGF0YSBmcmFtZSBgU0IxOWAsIGZpbHRlciBpdCBieSB0aGVpciBnZW5kZXIgYWNjb3JkaW5nbHkhIChhcyB5b3UgaGF2ZSBsZWFybiBsYXN0IHdlZWspDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KcHJpYTwtU0IxOSAlPiUgZmlsdGVyKGdlbmRlcj09Im1hbGUiKSU+JSBwcmludCgpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWFncml0dHIpDQp3YW5pdGE8LVNCMTkgJT4lIGZpbHRlcihnZW5kZXI9PSJmZW1hbGUiKSU+JSBwcmludCgpDQpgYGANCg0KDQo=