No-Go-Liste

+ keine Umlaute im Pfad
+ keine Umlaut in der Benennung der Datei
+ keine doppelte Benennung der Daten

Ich bin eine Überschrift

Ich bin eine Überschrift

Ich bin eine Überschrift

Ich bin eine Überschrift

Ich bin ein Haus!
Ich bin ein Haus!

Ausgabe


print("Hello world")
[1] "Hello world"
a <- 1 
b <- 5

a<- 4
b<- 5

a+b
[1] 9
zahl <-sqrt (9)
sprintf("Wurzel aus 9 ist %d", zahl)
[1] "Wurzel aus 9 ist 3"

# install.packages("psych")

library(psych)
Paket 㤼㸱psych㤼㸲 wurde unter R Version 3.6.3 erstellt

Einlesen -> File->Import Dataset ->From Excel

optional

library(readxl)
pearson <- read_excel("D:/tests/pearson.xlsx", 
    sheet = "Tabelle1")

describe(pearson)
NA
NA
NA
NA

Der IQ liegt in dieser Studie bei 102,47(SD=11.39, n=104). Der Projekterfolg liegt bei 62,38% (SD= 11,52, n = 104).


describe.by(pearson$IQ)
describe.by is deprecated.  Please use the describeBy functionno grouping variable requested
# Kommtar 
hist(pearson$IQ, main='Histogramm des IQs', xlab="IQ"
  , ylab = "Anzahl", col = "deepskyblue")

Anlegen eines Zufallsdatensätzes

data <- data.frame(
  name=c( rep("A",50), rep("B",50), rep("C",50), rep("D",50), rep("E", 50)),
  value=c( rnorm(50, 8, 5), rnorm(50, 10, 1), rnorm(50, 28, 1), rnorm(50, 31, 4), rnorm(50, 37, 1) )
)
View(data)

psych::describeBy(data$value, group = data$name)

 Descriptive statistics by group 
group: A
------------------------------------------------------------------- 
group: B
------------------------------------------------------------------- 
group: C
------------------------------------------------------------------- 
group: D
------------------------------------------------------------------- 
group: E
attach(data)
name[1]
[1] A
Levels: A B C D E
detach(data)

Datentypen

Vector


# Numeric
var1 = c(15,85.15,9999999)

print(var1)
[1]      15.00      85.15 9999999.00
# logical /boolean

var2 = c(TRUE, FALSE)

print(var2)
[1]  TRUE FALSE
#Mischen


var3 = c("Maier", "Klein", 18, 18.14)

print(var3)
[1] "Maier" "Klein" "18"    "18.14"
typeof(var3)
[1] "character"

Matrix


# matrix(data, nrow, ncol, byrow, dimnames)


arr  = array(c(1:9), dim=c(3,3,4,2))
arr

Meine erste Liste


mylist <-  list(var1, var2, var3)

mylist

Mein erster erzeugter Datensatz


var4 <- c("Haus2","Haus3","Haus4","Haus1") 
var5 <- c(5,6,7,8) 
var6 <- c(9,10,11,12) 

Tab1 <- data.frame(var4,var5, var6)

View(Tab1)

Meine erste if- Bedingung


#Wie alt bist du? 
alter <-  51

if( 20 > alter ) {
           print("Du Teenager!!! ")
}else if (50 > alter && alter > 21 ) {
           print("Du wirst auch nicht mehr jünger.")
}else{ 
           print("Ich zähle die Tage bis zur Rente.")
  }

Schleifen

# Es gibt drei Schleifenarten

# 1. repeat
revar1 = 1


repeat{

          print(revar1)
          revar1 = revar1 +2
          
          if (revar1 > 9)
            break
          
  
}
# 2. Schleife While

whilevar1=0

while(whilevar1 < 15)
{
  
  print(whilevar1)
  whilevar1 = whilevar1 +1;
  
}
anzahl <- 5
# 3. Schleife For
for (i in 10:anzahl)
{
  
 #anzahl = anzahl +1;
  print (i)
  
}

Finden und Löschen von Missing-Values (NA)


Titanic <- read.csv("C:/Users/Alfa-Dozent/Downloads/Titanic.csv") 
View(Titanic)
# Finden der NA-Werte 
is.na(Titanic$Age)
# wie viele NA-Werte
sum(is.na(Titanic))
# Auslassen der NA-Werte 
Titanic <- na.omit(Titanic)
hist(Titanic$Age)

Welcher Datentyp hat mein Variable?

#Version 1
typeof(t_testUN$Selbststaendig)
#Version 2
class(t_testUN$Selbststaendig)

Erzeuge neue Variable

# Differenz erstellen
zwischen <- ttestVER$Fremdeinschaetzung -ttestVER$Selbsteinschaetzung 
zwischen

# Die Spalte "Differenz" wird zum Datensatz hinzugefügt
ttestVER <- cbind(ttestVER, "Differenz" = zwischen)
View(ttestVER)

Eine Spalte löschen

# Eine Spalte löschen
 
ttestVER$Differenz <- NULL
View(ttestVER)

Zeilen löschen


attach(Levene)

# Diese Zeilen sollen entfernt werden
drops <- c(248,798,929,995,1207)

# Zeilen löschen
Levene <- Levene[-drops,]
View(Levene)

Type festlegen


NCBirth$Smoke <- as.factor(NCBirth$Smoke)
Fehler in is.factor(x) : Objekt 'NCBirth' nicht gefunden

Umbenennen

library(psych)
describeBy(NCbirths$BirthWeightGm,NCbirths$Smoke)
NCbirths <- rename(NCbirths, c(1 ="Ja",0 ="Nein"))

Datenstruktur ändern

library(reshape2)
ANOVA_mit_MW$Proband <- as.factor(ANOVA_mit_MW$Proband)
anovamituebung<- melt(ANOVA_mit_MW, 
                      id.vars = c("Proband"), 
                      measure.vars = c("Morgen","Mittag", "Abend"), 
                      variable.name = "Zeit",
                      value.name = "Konz"
                  
                      )

Datenauswahl

# select variables v1, v2, v3
myvars <- c("v1", "v2", "v3")
newdata <- mydata[myvars]

# another method
myvars <- paste("v", 1:3, sep="")
newdata <- mydata[myvars]

# select 1st and 5th thru 10th variables
newdata <- mydata[c(1,5:10)] 

# exclude variables v1, v2, v3
myvars <- names(mydata) %in% c("v1", "v2", "v3")
newdata <- mydata[!myvars]

# exclude 3rd and 5th variable
newdata <- mydata[c(-3,-5)]

# delete variables v3 and v5
mydata$v3 <- mydata$v5 <- NULL 


# first 5 observations
newdata <- mydata[1:5,]

# based on variable values
newdata <- mydata[ which(mydata$gender=='F'
& mydata$age > 65), ]

# or
attach(mydata)
newdata <- mydata[ which(gender=='F' & age > 65),]
detach(mydata) 

 

# using subset function
newdata <- subset(mydata, age >= 20 | age < 10,
select=c(ID, Weight)) 



# using subset function (part 2)
newdata <- subset(mydata, sex=="m" & age > 25,
select=weight:income) 
LS0tDQp0aXRsZTogIkVpbmbDvGhydW5nIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQoNCiMgTm8tR28tTGlzdGUNCiAgICArIGtlaW5lIFVtbGF1dGUgaW0gUGZhZA0KICAgICsga2VpbmUgVW1sYXV0IGluIGRlciBCZW5lbm51bmcgZGVyIERhdGVpDQogICAgKyBrZWluZSBkb3BwZWx0ZSBCZW5lbm51bmcgZGVyIERhdGVuDQoNCg0KIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQojIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQojIyMgSWNoIGJpbiBlaW5lIMOcYmVyc2NocmlmdA0KIyMjIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQoNCkljaCBiaW4gKmVpbiBIYXVzKiE8YnI+DQpJY2ggYmluICoqZWluIEhhdXMqKiENCg0KIyBBdXNnYWJlIA0KYGBge3J9DQoNCnByaW50KCJIZWxsbyB3b3JsZCIpDQoNCmEgPC0gMSANCmIgPC0gNQ0KDQpgYGANCg0KYGBge3J9DQoNCmE8LSA0DQpiPC0gNQ0KDQphK2INCg0KYGBgDQoNCg0KYGBge3J9DQp6YWhsIDwtc3FydCAoOSkNCnNwcmludGYoIld1cnplbCBhdXMgOSBpc3QgJWQiLCB6YWhsKQ0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KDQpsaWJyYXJ5KHBzeWNoKQ0KYGBgDQoNCkVpbmxlc2VuIC0+IEZpbGUtPkltcG9ydCBEYXRhc2V0IC0+RnJvbSBFeGNlbA0KDQoNCiMjIyBvcHRpb25hbA0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCnBlYXJzb24gPC0gcmVhZF9leGNlbCgiRDovdGVzdHMvcGVhcnNvbi54bHN4IiwgDQogICAgc2hlZXQgPSAiVGFiZWxsZTEiKQ0KYGBgDQoNCg0KYGBge3J9DQpjaGkkdm9yaGVyID0gYXMuZmFjdG9yKGNoaSR2b3JoZXIpDQpjaGkkbmFjaGhlciA9IGFzLmZhY3RvcihjaGkkbmFjaGhlcikNCmRlc2NyaWJlKHBlYXJzb24pDQpgYGANCg0KDQpEZXIgSVEgbGllZ3QgaW4gZGllc2VyIFN0dWRpZSBiZWkgMTAyLDQ3KFNEPTExLjM5LCBuPTEwNCkuIERlciBQcm9qZWt0ZXJmb2xnIGxpZWd0IGJlaSA2MiwzOCUgKFNEPSAxMSw1MiwgbiA9IDEwNCkuDQoNCg0KYGBge3J9DQoNCmRlc2NyaWJlLmJ5KHBlYXJzb24kSVEpDQpgYGANCg0KDQpgYGB7cn0NCg0KaGlzdChwZWFyc29uJElRLCBtYWluPSdIaXN0b2dyYW1tIGRlcyBJUXMnLCB4bGFiPSJJUSIgLCB5bGFiID0gIkFuemFobCIsIGNvbCA9ICJkZWVwc2t5Ymx1ZSIpDQoNCmBgYA0KDQoNCiMgQW5sZWdlbiBlaW5lcyBadWZhbGxzZGF0ZW5zw6R0emVzDQpgYGB7cn0NCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgbmFtZT1jKCByZXAoIkEiLDUwKSwgcmVwKCJCIiw1MCksIHJlcCgiQyIsNTApLCByZXAoIkQiLDUwKSwgcmVwKCJFIiwgMzApKSwNCiAgdmFsdWU9Yyggcm5vcm0oNTAsIDgsIDUpLCBybm9ybSg1MCwgMTAsIDEpLCBybm9ybSg1MCwgMjgsIDEpLCBybm9ybSg1MCwgMzEsIDQpLCBybm9ybSgzMCwgMzcsIDEpICkNCikNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KVmlldyhkYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KcHN5Y2g6OmRlc2NyaWJlQnkoZGF0YSR2YWx1ZSwgZ3JvdXAgPSBkYXRhJG5hbWUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KYXR0YWNoKGRhdGEpDQpgYGANCg0KYGBge3J9DQpuYW1lWzFdDQpgYGANCg0KDQoNCmBgYHtyfQ0KZGV0YWNoKGRhdGEpDQpgYGANCg0KDQojIERhdGVudHlwZW4NCg0KDQojIyMgVmVjdG9yDQoNCmBgYHtyfQ0KDQojIE51bWVyaWMNCnZhcjEgPSBjKDE1LDg1LjE1LDk5OTk5OTkpDQoNCnByaW50KHZhcjEpDQoNCg0KIyBsb2dpY2FsIC9ib29sZWFuDQoNCnZhcjIgPSBjKFRSVUUsIEZBTFNFKQ0KDQpwcmludCh2YXIyKQ0KDQojTWlzY2hlbg0KDQoNCnZhcjMgPSBjKCJNYWllciIsICJLbGVpbiIsIDE4LCAxOC4xNCkNCg0KcHJpbnQodmFyMykNCg0KDQpgYGANCmBgYHtyfQ0KdHlwZW9mKHZhcjMpDQpgYGANCg0KDQoNCg0KDQoNCiMjIyBNYXRyaXggDQoNCmBgYHtyfQ0KDQojIG1hdHJpeChkYXRhLCBucm93LCBuY29sLCBieXJvdywgZGltbmFtZXMpDQoNCg0KYXJyICA9IGFycmF5KGMoMTo5KSwgZGltPWMoMywzLDQsMikpDQphcnINCg0KDQpgYGANCiMjIyBNZWluZSBlcnN0ZSBMaXN0ZQ0KDQpgYGB7cn0NCg0KbXlsaXN0IDwtICBsaXN0KHZhcjEsIHZhcjIsIHZhcjMpDQoNCm15bGlzdA0KDQoNCmBgYA0KIyMjIE1laW4gZXJzdGVyIGVyemV1Z3RlciBEYXRlbnNhdHoNCg0KYGBge3J9DQoNCnZhcjQgPC0gYygiSGF1czIiLCJIYXVzMyIsIkhhdXM0IiwiSGF1czEiKSANCnZhcjUgPC0gYyg1LDYsNyw4KSANCnZhcjYgPC0gYyg5LDEwLDExLDEyKSANCg0KVGFiMSA8LSBkYXRhLmZyYW1lKHZhcjQsdmFyNSwgdmFyNikNCg0KVmlldyhUYWIxKQ0KDQpgYGANCiANCiMjIyAgTWVpbmUgZXJzdGUgaWYtIEJlZGluZ3VuZyAgDQogDQpgYGB7cn0NCg0KI1dpZSBhbHQgYmlzdCBkdT8gDQphbHRlciA8LSAgNTENCg0KaWYoIDIwID4gYWx0ZXIgKSB7DQogICAgICAgICAgIHByaW50KCJEdSBUZWVuYWdlciEhISAiKQ0KfWVsc2UgaWYgKDUwID4gYWx0ZXIgJiYgYWx0ZXIgPiAyMSApIHsNCiAgICAgICAgICAgcHJpbnQoIkR1IHdpcnN0IGF1Y2ggbmljaHQgbWVociBqw7xuZ2VyLiIpDQp9ZWxzZXsgDQogICAgICAgICAgIHByaW50KCJJY2ggesOkaGxlIGRpZSBUYWdlIGJpcyB6dXIgUmVudGUuIikNCiAgfQ0KDQoNCmBgYA0KDQoNCiMjIyBTY2hsZWlmZW4NCg0KYGBge3J9DQojIEVzIGdpYnQgZHJlaSBTY2hsZWlmZW5hcnRlbg0KDQojIDEuIHJlcGVhdA0KcmV2YXIxID0gMQ0KDQoNCnJlcGVhdHsNCg0KICAgICAgICAgIHByaW50KHJldmFyMSkNCiAgICAgICAgICByZXZhcjEgPSByZXZhcjEgKzINCiAgICAgICAgICANCiAgICAgICAgICBpZiAocmV2YXIxID4gOSkNCiAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgDQogIA0KfQ0KDQoNCg0KDQpgYGANCg0KYGBge3J9DQojIDIuIFNjaGxlaWZlIFdoaWxlDQoNCndoaWxldmFyMT0wDQoNCndoaWxlKHdoaWxldmFyMSA8IDE1KQ0Kew0KICANCiAgcHJpbnQod2hpbGV2YXIxKQ0KICB3aGlsZXZhcjEgPSB3aGlsZXZhcjEgKzE7DQogIA0KfQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmFuemFobCA8LSA1DQojIDMuIFNjaGxlaWZlIEZvcg0KZm9yIChpIGluIDEwOmFuemFobCkNCnsNCiAgDQogI2FuemFobCA9IGFuemFobCArMTsNCiAgcHJpbnQgKGkpDQogIA0KfQ0KDQoNCg0KDQpgYGANCg0KDQoNCg0KIyBGaW5kZW4gdW5kIEzDtnNjaGVuIHZvbiBNaXNzaW5nLVZhbHVlcyAoTkEpDQoNCmBgYHtyfQ0KDQpUaXRhbmljIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9BbGZhLURvemVudC9Eb3dubG9hZHMvVGl0YW5pYy5jc3YiKSANCmBgYA0KDQoNCmBgYHtyfQ0KVmlldyhUaXRhbmljKQ0KYGBgDQoNCg0KYGBge3J9DQojIEZpbmRlbiBkZXIgTkEtV2VydGUgDQppcy5uYShUaXRhbmljJEFnZSkNCmBgYA0KDQpgYGB7cn0NCiMgd2llIHZpZWxlIE5BLVdlcnRlDQpzdW0oaXMubmEoVGl0YW5pYykpDQpgYGANCg0KYGBge3J9DQojIEF1c2xhc3NlbiBkZXIgTkEtV2VydGUgDQpUaXRhbmljIDwtIG5hLm9taXQoVGl0YW5pYykNCmBgYA0KYGBge3J9DQpoaXN0KFRpdGFuaWMkQWdlKQ0KYGBgDQoNCg0KIyMjIFdlbGNoZXIgRGF0ZW50eXAgaGF0IG1laW4gVmFyaWFibGU/DQoNCmBgYHtyfQ0KI1ZlcnNpb24gMQ0KdHlwZW9mKHRfdGVzdFVOJFNlbGJzdHN0YWVuZGlnKQ0KI1ZlcnNpb24gMg0KY2xhc3ModF90ZXN0VU4kU2VsYnN0c3RhZW5kaWcpDQpgYGANCg0KDQoNCg0KIyMjIEVyemV1Z2UgbmV1ZSBWYXJpYWJsZQ0KDQpgYGB7cn0NCiMgRGlmZmVyZW56IGVyc3RlbGxlbg0Kendpc2NoZW4gPC0gdHRlc3RWRVIkRnJlbWRlaW5zY2hhZXR6dW5nIC10dGVzdFZFUiRTZWxic3RlaW5zY2hhZXR6dW5nIA0Kendpc2NoZW4NCg0KIyBEaWUgU3BhbHRlICJEaWZmZXJlbnoiIHdpcmQgenVtIERhdGVuc2F0eiBoaW56dWdlZsO8Z3QNCnR0ZXN0VkVSIDwtIGNiaW5kKHR0ZXN0VkVSLCAiRGlmZmVyZW56IiA9IHp3aXNjaGVuKQ0KVmlldyh0dGVzdFZFUikNCg0KYGBgDQoNCiMgRWluZSBTcGFsdGUgbMO2c2NoZW4NCg0KYGBge3J9DQojIEVpbmUgU3BhbHRlIGzDtnNjaGVuDQogDQp0dGVzdFZFUiREaWZmZXJlbnogPC0gTlVMTA0KVmlldyh0dGVzdFZFUikNCg0KYGBgDQoNCiMgWmVpbGVuIGzDtnNjaGVuDQpgYGB7cn0NCg0KYXR0YWNoKExldmVuZSkNCg0KIyBEaWVzZSBaZWlsZW4gc29sbGVuIGVudGZlcm50IHdlcmRlbg0KZHJvcHMgPC0gYygyNDgsNzk4LDkyOSw5OTUsMTIwNykNCg0KIyBaZWlsZW4gbMO2c2NoZW4NCkxldmVuZSA8LSBMZXZlbmVbLWRyb3BzLF0NClZpZXcoTGV2ZW5lKQ0KDQoNCmBgYA0KDQoNCg0KIyBUeXBlIGZlc3RsZWdlbg0KYGBge3J9DQoNCk5DQmlydGgkU21va2UgPC0gYXMuZmFjdG9yKE5DQmlydGgkU21va2UpDQpOQ0JpcnRoJEJpcnRoZ20gPC0gYXMubnVtZXJpYyhOQ0JpcnRoJEJpcnRoZ20pDQpgYGANCg0KIyBVbWJlbmVubmVuDQoNCmBgYHtyfQ0KbGlicmFyeShwc3ljaCkNCmRlc2NyaWJlQnkoTkNiaXJ0aHMkQmlydGhXZWlnaHRHbSxOQ2JpcnRocyRTbW9rZSkNCmBgYA0KDQoNCmBgYHtyfQ0KTkNiaXJ0aHMgPC0gcmVuYW1lKE5DYmlydGhzLCBjKDEgPSJKYSIsMCA9Ik5laW4iKSkNCmBgYA0KDQoNCiMgRGF0ZW5zdHJ1a3R1ciDDpG5kZXJuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KYGBgDQoNCg0KYGBge3J9DQpBTk9WQV9taXRfTVckUHJvYmFuZCA8LSBhcy5mYWN0b3IoQU5PVkFfbWl0X01XJFByb2JhbmQpDQpgYGANCg0KYGBge3J9DQphbm92YW1pdHVlYnVuZzwtIG1lbHQoQU5PVkFfbWl0X01XLCANCiAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygiUHJvYmFuZCIpLCANCiAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlLnZhcnMgPSBjKCJNb3JnZW4iLCJNaXR0YWciLCAiQWJlbmQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJaZWl0IiwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIktvbnoiDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICApDQpgYGANCg0KIyBEYXRlbmF1c3dhaGwgDQoNCmBgYHtyfQ0KIyBzZWxlY3QgdmFyaWFibGVzIHYxLCB2MiwgdjMNCm15dmFycyA8LSBjKCJ2MSIsICJ2MiIsICJ2MyIpDQpuZXdkYXRhIDwtIG15ZGF0YVtteXZhcnNdDQoNCiMgYW5vdGhlciBtZXRob2QNCm15dmFycyA8LSBwYXN0ZSgidiIsIDE6Mywgc2VwPSIiKQ0KbmV3ZGF0YSA8LSBteWRhdGFbbXl2YXJzXQ0KDQojIHNlbGVjdCAxc3QgYW5kIDV0aCB0aHJ1IDEwdGggdmFyaWFibGVzDQpuZXdkYXRhIDwtIG15ZGF0YVtjKDEsNToxMCldIA0KDQojIGV4Y2x1ZGUgdmFyaWFibGVzIHYxLCB2MiwgdjMNCm15dmFycyA8LSBuYW1lcyhteWRhdGEpICVpbiUgYygidjEiLCAidjIiLCAidjMiKQ0KbmV3ZGF0YSA8LSBteWRhdGFbIW15dmFyc10NCg0KIyBleGNsdWRlIDNyZCBhbmQgNXRoIHZhcmlhYmxlDQpuZXdkYXRhIDwtIG15ZGF0YVtjKC0zLC01KV0NCg0KIyBkZWxldGUgdmFyaWFibGVzIHYzIGFuZCB2NQ0KbXlkYXRhJHYzIDwtIG15ZGF0YSR2NSA8LSBOVUxMIA0KDQoNCiMgZmlyc3QgNSBvYnNlcnZhdGlvbnMNCm5ld2RhdGEgPC0gbXlkYXRhWzE6NSxdDQoNCiMgYmFzZWQgb24gdmFyaWFibGUgdmFsdWVzDQpuZXdkYXRhIDwtIG15ZGF0YVsgd2hpY2gobXlkYXRhJGdlbmRlcj09J0YnDQomIG15ZGF0YSRhZ2UgPiA2NSksIF0NCg0KIyBvcg0KYXR0YWNoKG15ZGF0YSkNCm5ld2RhdGEgPC0gbXlkYXRhWyB3aGljaChnZW5kZXI9PSdGJyAmIGFnZSA+IDY1KSxdDQpkZXRhY2gobXlkYXRhKSANCg0KIA0KDQojIHVzaW5nIHN1YnNldCBmdW5jdGlvbg0KbmV3ZGF0YSA8LSBzdWJzZXQobXlkYXRhLCBhZ2UgPj0gMjAgfCBhZ2UgPCAxMCwNCnNlbGVjdD1jKElELCBXZWlnaHQpKSANCg0KDQoNCiMgdXNpbmcgc3Vic2V0IGZ1bmN0aW9uIChwYXJ0IDIpDQpuZXdkYXRhIDwtIHN1YnNldChteWRhdGEsIHNleD09Im0iICYgYWdlID4gMjUsDQpzZWxlY3Q9d2VpZ2h0OmluY29tZSkgDQpgYGANCg0KDQoNCg0K