Aufgaben
In diesen Aufgaben sollen Sie den Datensatz iris
betrachten.
Geben Sie zunächst den folgenden Befehl ein, um sich einen Übersicht
über die Daten zu schaffen:
library(tidyverse)
iris <- as_tibble(iris)
iris
Um mehr über den Datensatz zu erfahren, geben Sie den folgenden
Befehl ein:
Um Hilfe zu den Aesthetics und dem Streudiagramm zu erhalten, geben
Sie den folgenden Befehl ein:
Übungsaufgaben
Wie viele Reihen und Spalten hat der Dataframe
iris
?
Welche Variablen aus iris
sind qualitativ? Welche
sind quantitativ?
Was bedeutet die Spalte Petal.Width
?
Erstellen Sie ein Streudiagramm mit Petal.Length
und
Petal.Width
.
Erstellen Sie ein Streudiagramm mit Species
und
Petal.Length
. Ist diese Grafik sinnvoll?
Erstellen Sie ein Streudiagramm mit Sepal.Length
und
Sepal.Width
.
Färben Sie zunächst alle Punkte grün ein und ändern Sie die
Form.
Nutzen Sie nun Aesthetics, um die Farbe und Form der Punkte gemäß
der Spezies (Variable Species
) zu ändern.
Ändern Sie zusätzlich die Größe aller Punkte.
Ändern Sie ebenfalls die Aesthetics alpha
,
fill
und stroke
.
Was passiert, wenn Sie einer Aesthetic eine quantitative Variable
zuordnen? Testen Sie beispielsweise
aes(color = Sepal.Length)
oder
aes(size = Sepal.Length)
.
Was passiert, wenn Sie zusätzlich in den Aesthetics
aes(color = Sepal.Length < 6)
angeben?
Hierbei handelt es sich nicht direkt um die Zuordnung einer Variablen zu
einer Aesthetic.
Lösung
Wie viele Reihen
und Spalten hat der Dataframe iris
?
Es gibt viele Möglichkeiten, das zu prüfen:
In die Environment
oben rechts in RStudio
schauen
Den Dataframe in der Konsole anzeigen lassen
Die Dimension durch dim(iris)
oder
nrow(iris)
und ncol(iris)
anzeigen
lassen
[1] 150 5
Es liegen 150 Beobachtungen (Reihen) und 5 Variablen (Spalten)
vor.
Welche Variablen
aus iris
sind qualitativ? Welche sind quantitativ?
Diese Information lässt sich aus den Spalten entnehmen.
Kontinuierliche Spalten sind quantitative Variablen, Kategorien
(Faktoren) sind qualitative Variablen.
Demnach sind Sepal.Length
, Sepal.Width
,
Petal.Length
und Petal.Width
quantitativ und
Species
qualitativ.
In R
gibt es hierzu auch den str
(structure) Befehl:
tibble [150 × 5] (S3: tbl_df/tbl/data.frame)
$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Was bedeutet die
Spalte Petal.Width
?
Hier könnte eine Suchmaschine nützlich sein. Laut Wikipedia handelt es
sich um die Breite des Kronblatts (3).
Erstellen Sie ein
Streudiagramm mit Petal.Length
und
Petal.Width
.
Zuerst müssen wir ggplot
mit dem Datensatz aufrufen und
dann die geom_point
Funktion hinzufügen mit den
entsprechenden Aesthetics für die x- und y-Achse, um ein Streudiagramm
zu erstellen:
ggplot(data = iris) +
geom_point(mapping = aes(x = Petal.Length, y = Petal.Width))
Erstellen Sie ein
Streudiagramm mit Species
und Petal.Length
.
Ist diese Grafik sinnvoll?
Wie zuvor müssen wir lediglich die Aesthetics an die Variablen
anpassen:
ggplot(data = iris) +
geom_point(mapping = aes(x = Species, y = Petal.Length))
Die Grafik ermöglicht das Vergleichen der einzelnen Datenpunkte
zwischen den unterschiedlichen Spezies der Iris-Pflanze, allerdings ist
die Grafik nicht sehr ansehnlich.
Besser wäre hier beispielsweise ein Boxplot, um die Verteilungen zu
vergleichen.
Erstellen Sie ein
Streudiagramm mit Sepal.Length
und
Sepal.Width
.
Ändern Sie
ebenfalls die Aesthetics alpha
, fill
und
stroke
.
Achtung: fill
ändert nur die Füllfarbe, sofern die
definierte Form von shape
das erlaubt.
Spielen Sie mit den Aesthetics herum und testen Sie selbst, was sich
ändert, wenn diese innerhalb oder außerhalb der aes()
Funktion stehen.
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Species), shape = 21, fill = "black", size = 2, stroke = 3, alpha = 0.6)
Was passiert,
wenn Sie einer Aesthetic eine quantitative Variable zuordnen? Testen Sie
beispielsweise aes(color = Sepal.Length)
oder
aes(size = Sepal.Length)
.
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Sepal.Length))
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, size = Sepal.Length))
Die Farbe geht entsprechend der kontinuierlichen Variable
Sepal.Length
von dunkelblau zu hellblau über.
Ähnlich verhält sich die Größe, welche entsprechend der Variable
Sepal.Length
angepasst wird.
Je nach Fragestellung können Sie so beispielsweise Ihre Daten
ebenfalls hervorheben.
Was passiert,
wenn Sie zusätzlich in den Aesthetics
aes(color = Sepal.Length < 6)
angeben? Hierbei handelt
es sich nicht direkt um die Zuordnung einer Variablen zu einer
Aesthetic.
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Sepal.Length < 6))
Sie sehen, dass die Datenpunkte (Pflanzen) mit einer
Sepal.Length
von über und unter 6cm automatisch
unterschiedlich dargestellt werden und eine Legende hinzugefügt
wurde.
Somit können Sie anhand von Bedingungen (nicht nur einzelne
Variablen) Ihre Datenpunkte durch Aesthetics hervorheben.
LS0tCnRpdGxlOiAiw5xidW5nc3pldHRlbCAxIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKLS0tCgojIEF1ZmdhYmVuCgpJbiBkaWVzZW4gQXVmZ2FiZW4gc29sbGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGBpcmlzYCBiZXRyYWNodGVuLgoKR2ViZW4gU2llIHp1bsOkY2hzdCBkZW4gZm9sZ2VuZGVuIEJlZmVobCBlaW4sIHVtIHNpY2ggZWluZW4gw5xiZXJzaWNodArDvGJlciBkaWUgRGF0ZW4genUgc2NoYWZmZW46CgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmlyaXMgPC0gYXNfdGliYmxlKGlyaXMpCmlyaXMKYGBgCgpVbSBtZWhyIMO8YmVyIGRlbiBEYXRlbnNhdHogenUgZXJmYWhyZW4sIGdlYmVuIFNpZSBkZW4gZm9sZ2VuZGVuIEJlZmVobAplaW46CgpgYGB7ciwgZXZhbCA9IEZBTFNFfQo/aXJpcwpgYGAKClVtIEhpbGZlIHp1IGRlbiBBZXN0aGV0aWNzIHVuZCBkZW0gU3RyZXVkaWFncmFtbSB6dSBlcmhhbHRlbiwgZ2ViZW4gU2llCmRlbiBmb2xnZW5kZW4gQmVmZWhsIGVpbjoKCmBgYHtyLCBldmFsID0gRkFMU0V9Cj9nZW9tX3BvaW50CmBgYAoKIyMgw5xidW5nc2F1ZmdhYmVuCgoxLiAgV2llIHZpZWxlIFJlaWhlbiB1bmQgU3BhbHRlbiBoYXQgZGVyIERhdGFmcmFtZSBgaXJpc2A/CgoyLiAgV2VsY2hlIFZhcmlhYmxlbiBhdXMgYGlyaXNgIHNpbmQgcXVhbGl0YXRpdj8gV2VsY2hlIHNpbmQKICAgIHF1YW50aXRhdGl2PwoKMy4gIFdhcyBiZWRldXRldCBkaWUgU3BhbHRlIGBQZXRhbC5XaWR0aGA/Cgo0LiAgRXJzdGVsbGVuIFNpZSBlaW4gU3RyZXVkaWFncmFtbSBtaXQgYFBldGFsLkxlbmd0aGAgdW5kCiAgICBgUGV0YWwuV2lkdGhgLgoKNS4gIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTcGVjaWVzYCB1bmQgYFBldGFsLkxlbmd0aGAuCiAgICBJc3QgZGllc2UgR3JhZmlrIHNpbm52b2xsPwoKNi4gIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTZXBhbC5MZW5ndGhgIHVuZAogICAgYFNlcGFsLldpZHRoYC4KCiAgICAxLiAgRsOkcmJlbiBTaWUgenVuw6RjaHN0IGFsbGUgUHVua3RlIGdyw7xuIGVpbiB1bmQgw6RuZGVybiBTaWUgZGllCiAgICAgICAgRm9ybS4KCiAgICAyLiAgTnV0emVuIFNpZSBudW4gQWVzdGhldGljcywgdW0gZGllIEZhcmJlIHVuZCBGb3JtIGRlciBQdW5rdGUKICAgICAgICBnZW3DpMOfIGRlciBTcGV6aWVzIChWYXJpYWJsZSBgU3BlY2llc2ApIHp1IMOkbmRlcm4uXAogICAgICAgIMOEbmRlcm4gU2llIHp1c8OkdHpsaWNoIGRpZSBHcsO2w59lIGFsbGVyIFB1bmt0ZS4KCiAgICAzLiAgw4RuZGVybiBTaWUgZWJlbmZhbGxzIGRpZSBBZXN0aGV0aWNzIGBhbHBoYWAsIGBmaWxsYCB1bmQKICAgICAgICBgc3Ryb2tlYC4KCiAgICA0LiAgV2FzIHBhc3NpZXJ0LCB3ZW5uIFNpZSBlaW5lciBBZXN0aGV0aWMgZWluZSBxdWFudGl0YXRpdmUKICAgICAgICBWYXJpYWJsZSB6dW9yZG5lbj8gVGVzdGVuIFNpZSBiZWlzcGllbHN3ZWlzZQogICAgICAgIGBhZXMoY29sb3IgPSBTZXBhbC5MZW5ndGgpYCBvZGVyIGBhZXMoc2l6ZSA9IFNlcGFsLkxlbmd0aClgLgoKICAgIDUuICBXYXMgcGFzc2llcnQsIHdlbm4gU2llIHp1c8OkdHpsaWNoIGluIGRlbiBBZXN0aGV0aWNzCiAgICAgICAgYGFlcyhjb2xvciA9IFNlcGFsLkxlbmd0aCA8IDYpYCBhbmdlYmVuP1wKICAgICAgICBIaWVyYmVpIGhhbmRlbHQgZXMgc2ljaCBuaWNodCBkaXJla3QgdW0gZGllIFp1b3JkbnVuZyBlaW5lcgogICAgICAgIFZhcmlhYmxlbiB6dSBlaW5lciBBZXN0aGV0aWMuCgojIyBMw7ZzdW5nCgojIyMgV2llIHZpZWxlIFJlaWhlbiB1bmQgU3BhbHRlbiBoYXQgZGVyIERhdGFmcmFtZSBgaXJpc2A/CgpFcyBnaWJ0IHZpZWxlIE3DtmdsaWNoa2VpdGVuLCBkYXMgenUgcHLDvGZlbjoKCi0gICBJbiBkaWUgYEVudmlyb25tZW50YCBvYmVuIHJlY2h0cyBpbiBSU3R1ZGlvIHNjaGF1ZW4KCi0gICBEZW4gRGF0YWZyYW1lIGluIGRlciBLb25zb2xlIGFuemVpZ2VuIGxhc3NlbgoKLSAgIERpZSBEaW1lbnNpb24gZHVyY2ggYGRpbShpcmlzKWAgb2RlciBgbnJvdyhpcmlzKWAgdW5kIGBuY29sKGlyaXMpYAogICAgYW56ZWlnZW4gbGFzc2VuCgpgYGB7cn0KZGltKGlyaXMpCmBgYAoKRXMgbGllZ2VuIDE1MCBCZW9iYWNodHVuZ2VuIChSZWloZW4pIHVuZCA1IFZhcmlhYmxlbiAoU3BhbHRlbikgdm9yLgoKIyMjIFdlbGNoZSBWYXJpYWJsZW4gYXVzIGBpcmlzYCBzaW5kIHF1YWxpdGF0aXY/IFdlbGNoZSBzaW5kIHF1YW50aXRhdGl2PwoKRGllc2UgSW5mb3JtYXRpb24gbMOkc3N0IHNpY2ggYXVzIGRlbiBTcGFsdGVuIGVudG5laG1lbi4gS29udGludWllcmxpY2hlClNwYWx0ZW4gc2luZCBxdWFudGl0YXRpdmUgVmFyaWFibGVuLCBLYXRlZ29yaWVuIChGYWt0b3Jlbikgc2luZApxdWFsaXRhdGl2ZSBWYXJpYWJsZW4uCgpEZW1uYWNoIHNpbmQgYFNlcGFsLkxlbmd0aGAsIGBTZXBhbC5XaWR0aGAsIGBQZXRhbC5MZW5ndGhgIHVuZApgUGV0YWwuV2lkdGhgIHF1YW50aXRhdGl2IHVuZCBgU3BlY2llc2AgcXVhbGl0YXRpdi4KCkluIGBSYCBnaWJ0IGVzIGhpZXJ6dSBhdWNoIGRlbiBgc3RyYCAoc3RydWN0dXJlKSBCZWZlaGw6CgpgYGB7cn0Kc3RyKGlyaXMpCmBgYAoKIyMjIFdhcyBiZWRldXRldCBkaWUgU3BhbHRlIGBQZXRhbC5XaWR0aGA/CgpIaWVyIGvDtm5udGUgZWluZSBTdWNobWFzY2hpbmUgbsO8dHpsaWNoIHNlaW4uIExhdXQKW1dpa2lwZWRpYV0oaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvS3JvbmJsYXR0KSBoYW5kZWx0IGVzIHNpY2ggdW0KZGllIEJyZWl0ZSBkZXMgS3JvbmJsYXR0cyAoMykuCgpbIVtTY2hlbWF0aXNjaGUgRGFyc3RlbGx1bmcgZWluZXIgQmzDvHRlIG1pdCBvYmVyc3TDpG5kaWdlbSBGcnVjaHRrbm90ZW4KdW5kIHBlcmlneW5lciBCbMO8dGVuaMO8bGxlICg9IOKAnm1pdHRlbHN0w6RuZGlnZXIiIEZydWNodGtub3Rlbik6IDEuCkJsw7x0ZW5ib2RlbiAoUmVjZXB0YWN1bHVtKSAyLiBLZWxjaGJsw6R0dGVyIChTZXBhbGVuKSAzLiBLcm9uYmzDpHR0ZXIKKFBldGFsZW4pIDQuIFN0YXViYmzDpHR0ZXIgKFN0YW1pbmEpIDUuIFN0ZW1wZWwKKFBpc3RpbGwpXShodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzEvMTIvQmx1ZXRlLVNjaGVtYS5zdmcpe3N0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiCndpZHRoPSI4MDAifV0oaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy8xLzEyL0JsdWV0ZS1TY2hlbWEuc3ZnKQoKIyMjIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBQZXRhbC5MZW5ndGhgIHVuZCBgUGV0YWwuV2lkdGhgLgoKWnVlcnN0IG3DvHNzZW4gd2lyIGBnZ3Bsb3RgIG1pdCBkZW0gRGF0ZW5zYXR6IGF1ZnJ1ZmVuIHVuZCBkYW5uIGRpZQpgZ2VvbV9wb2ludGAgRnVua3Rpb24gaGluenVmw7xnZW4gbWl0IGRlbiBlbnRzcHJlY2hlbmRlbiBBZXN0aGV0aWNzIGbDvHIKZGllIHgtIHVuZCB5LUFjaHNlLCB1bSBlaW4gU3RyZXVkaWFncmFtbSB6dSBlcnN0ZWxsZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBQZXRhbC5MZW5ndGgsIHkgPSBQZXRhbC5XaWR0aCkpCmBgYAoKIyMjIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTcGVjaWVzYCB1bmQgYFBldGFsLkxlbmd0aGAuIElzdCBkaWVzZSBHcmFmaWsgc2lubnZvbGw/CgpXaWUgenV2b3IgbcO8c3NlbiB3aXIgbGVkaWdsaWNoIGRpZSBBZXN0aGV0aWNzIGFuIGRpZSBWYXJpYWJsZW4gYW5wYXNzZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTcGVjaWVzLCB5ID0gUGV0YWwuTGVuZ3RoKSkKYGBgCgpEaWUgR3JhZmlrIGVybcO2Z2xpY2h0IGRhcyBWZXJnbGVpY2hlbiBkZXIgZWluemVsbmVuIERhdGVucHVua3RlIHp3aXNjaGVuCmRlbiB1bnRlcnNjaGllZGxpY2hlbiBTcGV6aWVzIGRlciBJcmlzLVBmbGFuemUsIGFsbGVyZGluZ3MgaXN0IGRpZQpHcmFmaWsgbmljaHQgc2VociBhbnNlaG5saWNoLgoKQmVzc2VyIHfDpHJlIGhpZXIgYmVpc3BpZWxzd2Vpc2UgZWluIEJveHBsb3QsIHVtIGRpZSBWZXJ0ZWlsdW5nZW4genUKdmVyZ2xlaWNoZW4uCgojIyMgRXJzdGVsbGVuIFNpZSBlaW4gU3RyZXVkaWFncmFtbSBtaXQgYFNlcGFsLkxlbmd0aGAgdW5kIGBTZXBhbC5XaWR0aGAuCgojIyMjIEbDpHJiZW4gU2llIHp1bsOkY2hzdCBhbGxlIFB1bmt0ZSBncsO8biBlaW4gdW5kIMOkbmRlcm4gU2llIGRpZSBGb3JtLgoKQWNodHVuZzogRGllIEFlc3RoZXRpY3MgbcO8c3NlbiBhdcOfZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uIGRlZmluaWVydAp3ZXJkZW4sIGRhbWl0IHNpZSB1bmFiaMOkbmdpZyB2b24gVmFyaWFibGVuIGbDvHIgYWxsZSBEYXRlbnB1bmt0ZSBnZWx0ZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCksIGNvbG9yID0gImdyZWVuIiwgc2hhcGUgPSAxNykKYGBgCgojIyMjIE51dHplbiBTaWUgbnVuIEFlc3RoZXRpY3MsIHVtIGRpZSBGYXJiZSB1bmQgRm9ybSBkZXIgUHVua3RlIGdlbcOkw58gZGVyIFNwZXppZXMgKFZhcmlhYmxlIGBTcGVjaWVzYCkgenUgw6RuZGVybi4gw4RuZGVybiBTaWUgenVzw6R0emxpY2ggZGllIEdyw7bDn2UgYWxsZXIgUHVua3RlLgoKVW0gZGllIEZhcmJlIGBjb2xvcmAgdW5kIEZvcm0gYHNoYXBlYCBiZXrDvGdsaWNoIGRlciBTcGV6aWVzIChWYXJpYWJsZQpgU3BlY2llc2ApIGFuenVwYXNzZW4sIG3DvHNzZW4gZGllc2UgaW5uZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uCmRlZmluaWVydCB3ZXJkZW4uIERhbWl0IHp1c8OkdHpsaWNoIGRpZSBHcsO2w59lIGBzaXplYCBhbGxlciBEYXRlbnB1a3RlCnZlcsOkbmRlcnQgd2VyZGVuIGthbm4sIG11c3MgZGllcyBhdcOfZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uCmRlZmluaWVydCB3ZXJkZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgY29sb3IgPSBTcGVjaWVzLCBzaGFwZSA9IFNwZWNpZXMpLCBzaXplID0gMykKYGBgCgojIyMjIMOEbmRlcm4gU2llIGViZW5mYWxscyBkaWUgQWVzdGhldGljcyBgYWxwaGFgLCBgZmlsbGAgdW5kIGBzdHJva2VgLgoKQWNodHVuZzogYGZpbGxgIMOkbmRlcnQgbnVyIGRpZSBGw7xsbGZhcmJlLCBzb2Zlcm4gZGllIGRlZmluaWVydGUgRm9ybSB2b24KYHNoYXBlYCBkYXMgZXJsYXVidC4KClNwaWVsZW4gU2llIG1pdCBkZW4gQWVzdGhldGljcyBoZXJ1bSB1bmQgdGVzdGVuIFNpZSBzZWxic3QsIHdhcyBzaWNoCsOkbmRlcnQsIHdlbm4gZGllc2UgaW5uZXJoYWxiIG9kZXIgYXXDn2VyaGFsYiBkZXIgYGFlcygpYCBGdW5rdGlvbiBzdGVoZW4uCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgY29sb3IgPSBTcGVjaWVzKSwgc2hhcGUgPSAyMSwgZmlsbCA9ICJibGFjayIsIHNpemUgPSAyLCBzdHJva2UgPSAzLCBhbHBoYSA9IDAuNikKYGBgCgojIyMjIFdhcyBwYXNzaWVydCwgd2VubiBTaWUgZWluZXIgQWVzdGhldGljIGVpbmUgcXVhbnRpdGF0aXZlIFZhcmlhYmxlIHp1b3JkbmVuPyBUZXN0ZW4gU2llIGJlaXNwaWVsc3dlaXNlIGBhZXMoY29sb3IgPSBTZXBhbC5MZW5ndGgpYCBvZGVyIGBhZXMoc2l6ZSA9IFNlcGFsLkxlbmd0aClgLgoKYGBge3J9CmdncGxvdChkYXRhID0gaXJpcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgsIGNvbG9yID0gU2VwYWwuTGVuZ3RoKSkKZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgc2l6ZSA9IFNlcGFsLkxlbmd0aCkpCmBgYAoKRGllIEZhcmJlIGdlaHQgZW50c3ByZWNoZW5kIGRlciBrb250aW51aWVybGljaGVuIFZhcmlhYmxlIGBTZXBhbC5MZW5ndGhgCnZvbiBkdW5rZWxibGF1IHp1IGhlbGxibGF1IMO8YmVyLgoKw4RobmxpY2ggdmVyaMOkbHQgc2ljaCBkaWUgR3LDtsOfZSwgd2VsY2hlIGVudHNwcmVjaGVuZCBkZXIgVmFyaWFibGUKYFNlcGFsLkxlbmd0aGAgYW5nZXBhc3N0IHdpcmQuCgpKZSBuYWNoIEZyYWdlc3RlbGx1bmcga8O2bm5lbiBTaWUgc28gYmVpc3BpZWxzd2Vpc2UgSWhyZSBEYXRlbiBlYmVuZmFsbHMKaGVydm9yaGViZW4uCgojIyMjIFdhcyBwYXNzaWVydCwgd2VubiBTaWUgenVzw6R0emxpY2ggaW4gZGVuIEFlc3RoZXRpY3MgYGFlcyhjb2xvciA9IFNlcGFsLkxlbmd0aCA8IDYpYCBhbmdlYmVuPyBIaWVyYmVpIGhhbmRlbHQgZXMgc2ljaCBuaWNodCBkaXJla3QgdW0gZGllIFp1b3JkbnVuZyBlaW5lciBWYXJpYWJsZW4genUgZWluZXIgQWVzdGhldGljLgoKYGBge3J9CmdncGxvdChkYXRhID0gaXJpcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgsIGNvbG9yID0gU2VwYWwuTGVuZ3RoIDwgNikpCmBgYAoKU2llIHNlaGVuLCBkYXNzIGRpZSBEYXRlbnB1bmt0ZSAoUGZsYW56ZW4pIG1pdCBlaW5lciBgU2VwYWwuTGVuZ3RoYCB2b24Kw7xiZXIgdW5kIHVudGVyIDZjbSBhdXRvbWF0aXNjaCB1bnRlcnNjaGllZGxpY2ggZGFyZ2VzdGVsbHQgd2VyZGVuIHVuZAplaW5lIExlZ2VuZGUgaGluenVnZWbDvGd0IHd1cmRlLgoKU29taXQga8O2bm5lbiBTaWUgYW5oYW5kIHZvbiBCZWRpbmd1bmdlbiAobmljaHQgbnVyIGVpbnplbG5lIFZhcmlhYmxlbikKSWhyZSBEYXRlbnB1bmt0ZSBkdXJjaCBBZXN0aGV0aWNzIGhlcnZvcmhlYmVuLgo=