General Issues
Make sure your file names and file references use identical spelling, including upper/lower case. Your code will fail on a case-sensitive file system if you don’t.
Make sure to commit your work to your local repository and push your commits to GitLab. We can only see what is on GitLab, not what is on your computer. You can check what we see by going to the GitLab web interface.
Include your name and the date in the header of your .Rmd
file using author:
and date:
tags. You can use an inline chunk to have the date computed when the document is rendered. Your header should look something like this:
---
title: "Assignment 3"
author: "Fred Frog"
date: "`r Sys.Date()`"
output: html_document
---
If you want to increase the font size for the body text in your HTML output one option is to add this line after your document header:
<style type="text/css"> body{ font-size: 12pt; } </style>
Do not use markdown headers for this. Markdown headers (lines starting with one or more #
characters) should only be used for section and subsection headers.
1. Choosing Between Faceting and Color
The faceted plot shows each of the seven groups in a sub-plot, or facet, using the same axis scales for all plots.
library(ggplot2)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, nrow = 2)
The plots are small and there is some over-plotting. The over-plotting could be reduced by reducing the point size.
A single plot that maps class
to color benefits from a larger point size to improve discriminability of the colors:
ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 2.5)
The number of colors is large, which makes discrimination more difficult, even with the increased point size. But once groups are identified, their relative positions are easier to see in the colored plot as all comparisons are within a common set of scales.
Faceting reduces plot size and thus increases over-plotting for larger data sets. Reducing point size is an option that can be effective if color and shape are not being used as channels. A significant drawback of faceting is that some group comparisons are moved from common scale comparisons to unaligned scale comparisons. This can sometimes be alleviated somewhat by showing a muted image of the complete data in the background.
Overall, color may have a slight edge in this data set. But it should be kept in mind that color is not effective on all display devices or for all viewers.
In larger data sets color becomes less effective as there will be a considerable amount of over-plotting, given the point size needed to support good color discrimination. Faceting will also suffer from more over-plotting in larger data sets for a given point size, but there is more flexibility to reduce point size. The shape of the data also plays a role, so both approaches are worth considering.
2. Faceting with Muted Full Data
The full data can be added as a background layer in a muted color, such as a light grey:
library(ggplot2)
library(dplyr)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(data = mutate(mpg, class = NULL), color = "lightgrey") +
geom_point() +
facet_wrap(~ class, nrow = 2)
With the full data group-to-whole comparisons are again on aligned scales. For example, with the full data in the background it is easy to see that the 2-seaters are quite different than the other cars. Seeing this in the basic faceted plot shown above is also possible, but it requires some work.
3. Gun Murders in US States
if (! file.exists("murders.csv"))
download.file("https://www.stat.uiowa.edu/~luke/data/murders.csv",
"murders.csv")
murders <- read.csv("murders.csv")
The following graph shows a plot of the total number of gun murders against the population of each state and the District of Columbia. Log axes are used as the distributions of both variables are highly skewed. The points are colored to show the region associated with each state.
ggplot(murders, aes(x = population, y = total, color = region)) +
geom_point(size = 2.5) +
scale_x_log10() +
scale_y_log10()
The relationship between the number of murders and the population size appears to be close to linear. The states in the southern region are mostly towards the top of the set of points: for a given population size the number of murders in southern states appears to be higher than in others.
4. Comparing Some Visualizations
All three plots clearly show that the 5 cylinder group is the smallest. Distinguishing the sizes of the other groups is more challenging.
Plot B uses aligned scales. It is easy to see the ordering, even though the values for 8, 6, and 4 cylinders are quite close.
Plot A relies on length comparisons; it seems possible to recognize that the 8 cylinder group is the smallest among the 4, 6, and 8 cylinder groups, but determining which of the 4 and 6 cylinder groups is smaller is very hard.
Plot C relies on area comparisons. The sizes of the 4, 6, and 8 cylinder groups are very hard to distinguish.
For comparing the group sizes in this data set Plot B is best, followed by Plot A, and then Plot C.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIEdlbmVyYWwgSXNzdWVzCgoqIE1ha2Ugc3VyZSB5b3VyIGZpbGUgbmFtZXMgYW5kIGZpbGUgcmVmZXJlbmNlcyB1c2UgaWRlbnRpY2FsCiAgc3BlbGxpbmcsIGluY2x1ZGluZyB1cHBlci9sb3dlciBjYXNlLiBZb3VyIGNvZGUgd2lsbCBmYWlsIG9uIGEKICBjYXNlLXNlbnNpdGl2ZSBmaWxlIHN5c3RlbSBpZiB5b3UgZG9uJ3QuCgoqIE1ha2Ugc3VyZSB0byBjb21taXQgeW91ciB3b3JrIHRvIHlvdXIgbG9jYWwgcmVwb3NpdG9yeSBhbmQgcHVzaCB5b3VyCiAgY29tbWl0cyB0byBHaXRMYWIuIFdlIGNhbiBvbmx5IHNlZSB3aGF0IGlzIG9uIEdpdExhYiwgbm90IHdoYXQgaXMgb24KICB5b3VyIGNvbXB1dGVyLiBZb3UgY2FuIGNoZWNrIHdoYXQgd2Ugc2VlIGJ5IGdvaW5nIHRvIHRoZSBHaXRMYWIgd2ViCiAgaW50ZXJmYWNlLgogCiogSW5jbHVkZSB5b3VyIG5hbWUgYW5kIHRoZSBkYXRlIGluIHRoZSBoZWFkZXIgb2YgeW91ciBgLlJtZGAgZmlsZQogIHVzaW5nIGBhdXRob3I6YCBhbmQgYGRhdGU6YCB0YWdzLiBZb3UgY2FuIHVzZSBhbiBpbmxpbmUgY2h1bmsgdG8KICBoYXZlIHRoZSBkYXRlIGNvbXB1dGVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIHJlbmRlcmVkLiBZb3VyIGhlYWRlcgogIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpyaW5saW5lIDwtIGZ1bmN0aW9uKGNvZGUpIHsKICAgIHNwcmludGYoImByICVzYCIsIGNvZGUpCn0KYGBgCiAgICBgYGAKICAgIC0tLQogICAgdGl0bGU6ICJBc3NpZ25tZW50IDMiCiAgICBhdXRob3I6ICJGcmVkIEZyb2ciCiAgICBkYXRlOiAiYHIgcmlubGluZSgiU3lzLkRhdGUoKSIpYCIKICAgIG91dHB1dDogaHRtbF9kb2N1bWVudAogICAgLS0tCiAgICBgYGAKCiogSWYgeW91IHdhbnQgdG8gaW5jcmVhc2UgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIGJvZHkgdGV4dCBpbiB5b3VyIEhUTUwKICBvdXRwdXQgb25lIG9wdGlvbiBpcyB0byBhZGQgdGhpcyBsaW5lIGFmdGVyIHlvdXIgZG9jdW1lbnQgaGVhZGVyOgoKICAgIGBgYAogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4gYm9keXsgZm9udC1zaXplOiAxMnB0OyB9IDwvc3R5bGU+CiAgICBgYGAKICAgIERvIF9ub3RfIHVzZSBtYXJrZG93biBoZWFkZXJzIGZvciB0aGlzLiBNYXJrZG93biBoZWFkZXJzIChsaW5lcwogICAgc3RhcnRpbmcgd2l0aCBvbmUgb3IgbW9yZSBgI2AgY2hhcmFjdGVycykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKICAgIHNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gaGVhZGVycy4KCgojIyBHZW5lcmFsIENvbW1lbnRzCgoqIFlvdXIgSFRNTCBmaWxlIHNob3VsZCBiZSBhIHJlcG9ydCBvZiB5b3VyIGZpbmRpbmdzLgoKICAgICogQW55IGdyYXBoIHlvdSBzaG93IHNob3VsZCBiZSBkaXNjdXNzZWQgaW4geW91ciBuYXJyYXRpdmUuCgogICAgKiBBbnkgY29kZSB5b3Ugc2hvdyBzaG91bGQgYmUgZGlzY3Vzc2VkIGluIHlvdXIgbmFycmF0aXZlLgoKICAgICogSWYgeW91IGRvIG5vdCBuZWVkIHRvIGRpc2N1c3MgYSBwaWVjZSBvZiBjb2RlIGluIHRoZSBuYXJyYXRpdmUsCiAgICAgIHVzZSBgZWNobyBGQUxTRWAgdG8gYXZvaWQgc2hvd2luZyBpdC4KCiAgICAqIFlvdXIgcmVwb3J0IHNob3VsZCBhbHNvIG5vdCBjb250YWluIHJhdyBSIG91dHB1dCB1bmxlc3MgeW91IGFyZQogICAgICBkaXNjdXNzaW5nIGhvdyBSIHByZXNlbnRzIHJlc3VsdHMuIE91dHB1dCBzaG91bGQgYmUgaW5jb3Jwb3JhdGVkCiAgICAgIGludG8geW91ciB0ZXh0IHdpdGggaW5saW5lIGNvZGUgb3IgcHJlc2VudGVkIGFzIG5pY2VseSBmb3JtYXR0ZWQKICAgICAgdGFibGVzLgoKKiBZb3VyIGAuUm1kYCBmaWxlLCBhbmQgcG9zc2libHkgc3VwcG9ydGluZyBgLlJgIGZpbGVzLCBjb250YWluIHRoZQogIGNvZGUgZm9yIHlvdXIgYW5hbHlzaXMuCgogICAgKiBJZiB5b3UgbmVlZCB0byB1cGRhdGUgeW91ciBjb2RlLCBvciBpZiBhIGNvbGxhYm9yYXRvciBuZWVkcyB0bwogICAgICB1cGRhdGUgeW91ciBjb2RlLCB0aGF0IHdvcmsgd2lsbCBiZSBkb25lIGluIHlvdXIgYC5SbWRgIGZpbGUuCgogICAgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgY29kZSBpbiB5b3VyIGAuUm1kYCBmaWxlIGlzIHJlYWRhYmxlLgoKICAgICogRm9sbG93aW5nIHRoZSBbY29kaW5nIHN0YW5kYXJkc10oY29kaW5nLmh0bWwpIGhlbHBzIHdpdGggdGhpcy4KCiAgICAqIFBsZWFzZSBpbmRlbnQgYnkgNCBzcGFjZXMgZm9yIGVhY2ggbGV2ZWwuIEkgZmluZCB0aGlzIHRoZSBtb3N0CiAgICAgIHJlYWRhYmxlIG9wdGlvbi4KCiogSWYgeW91IHJlYWQgYSBkYXRhIGZpbGUgaW4geW91ciBjb2RlIG1ha2Ugc3VyZSB0aGF0IHlvdSByZWFkIGl0IGluIGEKICB3YXkgdGhhdCB3aWxsIHdvcmsgZm9yIHNvbWVvbmUgZWxzZSB1c2luZyB5b3VyIHJlcG9zaXRvcnkuIElmIHlvdQogIHdhbnQgdG8gcmVhZCBmcm9tIGEgbG9jYWwgZmlsZToKCiAgICAqIE1ha2Ugc3VyZSBpdCBpcyBhdmFpbGFibGUgbG9jYWxseSBlaXRoZXIgYnkgZG93bmxvYWRpbmcgaXQgYXMKICAgICAgbmVlZGVkIG9yIGluY2x1ZGluZyBpdCBpbiB5b3VyIHJlcG9zaXRvcnkuCgogICAgKiBSZWFkIHRoZSBmaWxlIHdpdGggYSByZWxhdGl2ZSBwYXRoIG5hbWUsIGFzc3VtaW5nIHlvdXIgd29ya2luZwogICAgICBkaXJlY3Rvcnkgd2lsbCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgeW91ciBgUm1kYCBmaWxlLgoKIyMgMS4gQ2hvb3NpbmcgQmV0d2VlbiBGYWNldGluZyBhbmQgQ29sb3IKClRoZSBmYWNldGVkIHBsb3Qgc2hvd3MgZWFjaCBvZiB0aGUgc2V2ZW4gZ3JvdXBzIGluIGEgc3ViLXBsb3QsIG9yIGZhY2V0LAp1c2luZyB0aGUgc2FtZSBheGlzIHNjYWxlcyBmb3IgYWxsIHBsb3RzLgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBmYWNldF93cmFwKH4gY2xhc3MsIG5yb3cgPSAyKQpgYGAKClRoZSBwbG90cyBhcmUgc21hbGwgYW5kIHRoZXJlIGlzIHNvbWUgb3Zlci1wbG90dGluZy4gVGhlIG92ZXItcGxvdHRpbmcKY291bGQgYmUgcmVkdWNlZCBieSByZWR1Y2luZyB0aGUgcG9pbnQgc2l6ZS4KCkEgc2luZ2xlIHBsb3QgdGhhdCBtYXBzIGBjbGFzc2AgdG8gY29sb3IgYmVuZWZpdHMgZnJvbSBhIGxhcmdlciBwb2ludCBzaXplCnRvIGltcHJvdmUgZGlzY3JpbWluYWJpbGl0eSBvZiB0aGUgY29sb3JzOgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGwsIHkgPSBod3ksIGNvbG9yID0gY2xhc3MpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAyLjUpCmBgYAoKVGhlIG51bWJlciBvZiBjb2xvcnMgaXMgbGFyZ2UsIHdoaWNoIG1ha2VzIGRpc2NyaW1pbmF0aW9uIG1vcmUKZGlmZmljdWx0LCBldmVuIHdpdGggdGhlIGluY3JlYXNlZCBwb2ludCBzaXplLiBCdXQgb25jZSBncm91cHMgYXJlCmlkZW50aWZpZWQsIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9ucyBhcmUgZWFzaWVyIHRvIHNlZSBpbiB0aGUgY29sb3JlZApwbG90IGFzIGFsbCBjb21wYXJpc29ucyBhcmUgd2l0aGluIGEgY29tbW9uIHNldCBvZiBzY2FsZXMuCgpGYWNldGluZyByZWR1Y2VzIHBsb3Qgc2l6ZSBhbmQgdGh1cyBpbmNyZWFzZXMgb3Zlci1wbG90dGluZyBmb3IgbGFyZ2VyCmRhdGEgc2V0cy4gUmVkdWNpbmcgcG9pbnQgc2l6ZSBpcyBhbiBvcHRpb24gdGhhdCBjYW4gYmUgZWZmZWN0aXZlIGlmCmNvbG9yIGFuZCBzaGFwZSBhcmUgbm90IGJlaW5nIHVzZWQgYXMgY2hhbm5lbHMuIEEgc2lnbmlmaWNhbnQgZHJhd2JhY2sKb2YgZmFjZXRpbmcgaXMgdGhhdCBzb21lIGdyb3VwIGNvbXBhcmlzb25zIGFyZSBtb3ZlZCBmcm9tIGNvbW1vbiBzY2FsZQpjb21wYXJpc29ucyB0byB1bmFsaWduZWQgc2NhbGUgY29tcGFyaXNvbnMuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZQphbGxldmlhdGVkIHNvbWV3aGF0IGJ5IHNob3dpbmcgYSBtdXRlZCBpbWFnZSBvZiB0aGUgY29tcGxldGUgZGF0YSBpbgp0aGUgYmFja2dyb3VuZC4KCk92ZXJhbGwsIGNvbG9yIG1heSBoYXZlIGEgc2xpZ2h0IGVkZ2UgaW4gdGhpcyBkYXRhIHNldC4gQnV0IGl0IHNob3VsZApiZSBrZXB0IGluIG1pbmQgdGhhdCBjb2xvciBpcyBub3QgZWZmZWN0aXZlIG9uIGFsbCBkaXNwbGF5IGRldmljZXMgb3IKZm9yIGFsbCB2aWV3ZXJzLgoKSW4gbGFyZ2VyIGRhdGEgc2V0cyBjb2xvciBiZWNvbWVzIGxlc3MgZWZmZWN0aXZlIGFzIHRoZXJlIHdpbGwgYmUgYQpjb25zaWRlcmFibGUgYW1vdW50IG9mIG92ZXItcGxvdHRpbmcsIGdpdmVuIHRoZSBwb2ludCBzaXplIG5lZWRlZCB0bwpzdXBwb3J0IGdvb2QgY29sb3IgZGlzY3JpbWluYXRpb24uIEZhY2V0aW5nIHdpbGwgYWxzbyBzdWZmZXIgZnJvbSBtb3JlCm92ZXItcGxvdHRpbmcgaW4gbGFyZ2VyIGRhdGEgc2V0cyBmb3IgYSBnaXZlbiBwb2ludCBzaXplLCBidXQgdGhlcmUgaXMgbW9yZQpmbGV4aWJpbGl0eSB0byByZWR1Y2UgcG9pbnQgc2l6ZS4gIFRoZSBzaGFwZSBvZiB0aGUgZGF0YSBhbHNvIHBsYXlzIGEKcm9sZSwgc28gYm90aCBhcHByb2FjaGVzIGFyZSB3b3J0aCBjb25zaWRlcmluZy4KCgojIyAyLiBGYWNldGluZyB3aXRoIE11dGVkIEZ1bGwgRGF0YQoKVGhlIGZ1bGwgZGF0YSBjYW4gYmUgYWRkZWQgYXMgYSBiYWNrZ3JvdW5kIGxheWVyIGluIGEgbXV0ZWQgY29sb3IsCnN1Y2ggYXMgYSBsaWdodCBncmV5OgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOH0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKwogICAgZ2VvbV9wb2ludChkYXRhID0gbXV0YXRlKG1wZywgY2xhc3MgPSBOVUxMKSwgY29sb3IgPSAibGlnaHRncmV5IikgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGZhY2V0X3dyYXAofiBjbGFzcywgbnJvdyA9IDIpCmBgYAoKV2l0aCB0aGUgZnVsbCBkYXRhIGdyb3VwLXRvLXdob2xlIGNvbXBhcmlzb25zIGFyZSBhZ2FpbiBvbiBhbGlnbmVkCnNjYWxlcy4gIEZvciBleGFtcGxlLCB3aXRoIHRoZSBmdWxsIGRhdGEgaW4gdGhlIGJhY2tncm91bmQgaXQgaXMgZWFzeQp0byBzZWUgdGhhdCB0aGUgMi1zZWF0ZXJzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIKY2Fycy4gU2VlaW5nIHRoaXMgaW4gdGhlIGJhc2ljIGZhY2V0ZWQgcGxvdCBzaG93biBhYm92ZSBpcyBhbHNvCnBvc3NpYmxlLCBidXQgaXQgcmVxdWlyZXMgc29tZSB3b3JrLgoKCiMjIDMuIEd1biBNdXJkZXJzIGluIFVTIFN0YXRlcwoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KaWYgKCEgZmlsZS5leGlzdHMoIm11cmRlcnMuY3N2IikpCiAgICBkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zdGF0LnVpb3dhLmVkdS9+bHVrZS9kYXRhL211cmRlcnMuY3N2IiwKICAgICAgICAgICAgICAgICAgIm11cmRlcnMuY3N2IikKbXVyZGVycyA8LSByZWFkLmNzdigibXVyZGVycy5jc3YiKQpgYGAKClRoZSBmb2xsb3dpbmcgZ3JhcGggc2hvd3MgYSBwbG90IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VuIG11cmRlcnMKYWdhaW5zdCB0aGUgcG9wdWxhdGlvbiBvZiBlYWNoIHN0YXRlIGFuZCB0aGUgRGlzdHJpY3Qgb2YgQ29sdW1iaWEuCkxvZyBheGVzIGFyZSB1c2VkIGFzIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggdmFyaWFibGVzIGFyZSBoaWdobHkKc2tld2VkLiBUaGUgcG9pbnRzIGFyZSBjb2xvcmVkIHRvIHNob3cgdGhlIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggZWFjaApzdGF0ZS4KCmBgYHtyfQpnZ3Bsb3QobXVyZGVycywgYWVzKHggPSBwb3B1bGF0aW9uLCB5ID0gdG90YWwsIGNvbG9yID0gcmVnaW9uKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMi41KSArCiAgICBzY2FsZV94X2xvZzEwKCkgKwogICAgc2NhbGVfeV9sb2cxMCgpCmBgYAoKVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgbXVyZGVycyBhbmQgdGhlIHBvcHVsYXRpb24gc2l6ZQphcHBlYXJzIHRvIGJlIGNsb3NlIHRvIGxpbmVhci4gVGhlIHN0YXRlcyBpbiB0aGUgc291dGhlcm4gcmVnaW9uIGFyZQptb3N0bHkgdG93YXJkcyB0aGUgdG9wIG9mIHRoZSBzZXQgb2YgcG9pbnRzOiBmb3IgYSBnaXZlbiBwb3B1bGF0aW9uCnNpemUgdGhlIG51bWJlciBvZiBtdXJkZXJzIGluIHNvdXRoZXJuIHN0YXRlcyBhcHBlYXJzIHRvIGJlIGhpZ2hlcgp0aGFuIGluIG90aGVycy4KCiMjIDQuIENvbXBhcmluZyBTb21lIFZpc3VhbGl6YXRpb25zCgpBbGwgdGhyZWUgcGxvdHMgY2xlYXJseSBzaG93IHRoYXQgdGhlIDUgY3lsaW5kZXIgZ3JvdXAgaXMgdGhlCnNtYWxsZXN0LiBEaXN0aW5ndWlzaGluZyB0aGUgc2l6ZXMgb2YgdGhlIG90aGVyIGdyb3VwcyBpcyBtb3JlCmNoYWxsZW5naW5nLgoKUGxvdCBCIHVzZXMgYWxpZ25lZCBzY2FsZXMuIEl0IGlzIGVhc3kgdG8gc2VlIHRoZSBvcmRlcmluZywgZXZlbgp0aG91Z2ggdGhlIHZhbHVlcyBmb3IgOCwgNiwgYW5kIDQgY3lsaW5kZXJzIGFyZSBxdWl0ZSBjbG9zZS4KClBsb3QgQSByZWxpZXMgb24gbGVuZ3RoIGNvbXBhcmlzb25zOyBpdCBzZWVtcyBwb3NzaWJsZSB0byByZWNvZ25pemUKdGhhdCB0aGUgOCBjeWxpbmRlciBncm91cCBpcyB0aGUgc21hbGxlc3QgYW1vbmcgdGhlIDQsIDYsIGFuZCA4CmN5bGluZGVyIGdyb3VwcywgYnV0IGRldGVybWluaW5nIHdoaWNoIG9mIHRoZSA0IGFuZCA2IGN5bGluZGVyIGdyb3VwcwppcyBzbWFsbGVyIGlzIHZlcnkgaGFyZC4KClBsb3QgQyByZWxpZXMgb24gYXJlYSBjb21wYXJpc29ucy4gIFRoZSBzaXplcyBvZiB0aGUgNCwgNiwgYW5kIDgKY3lsaW5kZXIgZ3JvdXBzIGFyZSB2ZXJ5IGhhcmQgdG8gZGlzdGluZ3Vpc2guCgpGb3IgY29tcGFyaW5nIHRoZSBncm91cCBzaXplcyBpbiB0aGlzIGRhdGEgc2V0IFBsb3QgQiBpcyBiZXN0LCBmb2xsb3dlZApieSBQbG90IEEsIGFuZCB0aGVuIFBsb3QgQy4K