General Issues

General Comments

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 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 axis 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 C 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 A 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 C, and then Plot A.

LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCSAgCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIEdlbmVyYWwgSXNzdWVzCgoqIE1ha2Ugc3VyZSB5b3VyIGZpbGUgbmFtZXMgYW5kIGZpbGUgcmVmZXJlbmNlcyB1c2UgaWRlbnRpY2FsCiAgc3BlbGxpbmcsIGluY2x1ZGluZyB1cHBlci9sb3dlciBjYXNlLiBZb3VyIGNvZGUgd2lsbCBmYWlsIG9uIGEKICBjYXNlLXNlbnNpdGl2ZSBmaWxlIHN5c3RlbSBpZiB5b3UgZG9uJ3QuCgoqIE1ha2Ugc3VyZSB0byBjb21taXQgeW91ciB3b3JrIHRvIHlvdXIgbG9jYWwgcmVwb3NpdG9yeSBhbmQgcHVzaCB5b3VyCiAgY29tbWl0cyB0byBHaXRMYWIuIFdlIGNhbiBvbmx5IHNlZSB3aGF0IGlzIG9uIEdpdExhYiwgbm90IHdoYXQgaXMgb24KICB5b3VyIGNvbXB1dGVyLiBZb3UgY2FuIGNoZWNrIHdoYXQgd2Ugc2VlIGJ5IGdvaW5nIHRvIHRoZSBHaXRMYWIgd2ViCiAgaW50ZXJmYWNlLgogCiogSW5jbHVkZSB5b3VyIG5hbWUgYW5kIHRoZSBkYXRlIGluIHRoZSBoZWFkZXIgb2YgeW91ciBgLlJtZGAgZmlsZQogIHVzaW5nIGBhdXRob3I6YCBhbmQgYGRhdGU6YCB0YWdzLiBZb3UgY2FuIHVzZSBhbiBpbmxpbmUgY2h1bmsgdG8KICBoYXZlIHRoZSBkYXRlIGNvbXB1dGVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIHJlbmRlcmVkLiBZb3VyIGhlYWRlcgogIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpyaW5saW5lIDwtIGZ1bmN0aW9uKGNvZGUpIHsKICAgIHNwcmludGYoJ2ByICVzYCcsIGNvZGUpCn0KYGBgCiAgICBgYGAKICAgIC0tLQogICAgdGl0bGU6ICJBc3NpZ25tZW50IDMiCiAgICBhdXRob3I6ICJGcmVkIEZyb2ciCiAgICBkYXRlOiAiYHIgcmlubGluZSgiU3lzLkRhdGUoKSIpYCIKICAgIG91dHB1dDogaHRtbF9kb2N1bWVudAogICAgLS0tCiAgICBgYGAKCiogSWYgeW91IHdhbnQgdG8gaW5jcmVhc2UgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIGJvZHkgdGV4dCBpbiB5b3VyIEhUTUwKICBvdXRwdXQgb25lIG9wdGlvbiBpcyB0byBhZGQgdGhpcyBsaW5lIGFmdGVyIHlvdXIgZG9jdW1lbnQgaGVhZGVyOgoKICAgIGBgYAoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4gYm9keXsgZm9udC1zaXplOiAxMnB0OyB9IDwvc3R5bGU+CglgYGAKCURvIF9ub3RfIHVzZSBtYXJrZG93biBoZWFkZXJzIGZvciB0aGlzLiBNYXJrZG93biBoZWFkZXJzIChsaW5lcwoJc3RhcnRpbmcgd2l0aCBvbmUgb3IgbW9yZSBgI2AgY2hhcmFjdGVycykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKCXNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gaGVhZGVycy4KCgojIyBHZW5lcmFsIENvbW1lbnRzCgoqIFlvdXIgSFRNTCBmaWxlIHNob3VsZCBiZSBhIHJlcG9ydCBvZiB5b3VyIGZpbmRpbmdzLgoKICAgICogQW55IGdyYXBoIHlvdSBzaG93IHNob3VsZCBiZSBkaXNjdXNzZWQgaW4geW91ciBuYXJyYXRpdmUuCgogICAgKiBBbnkgY29kZSB5b3Ugc2hvdyBzaG91bGQgYmUgZGlzY3Vzc2VkIGluIHlvdXIgbmFycmF0aXZlLgoKICAgICogSWYgeW91IGRvIG5vdCBuZWVkIHRvIGRpc2N1c3MgYSBwaWVjZSBvZiBjb2RlIGluIHRoZSBuYXJyYXRpdmUsCiAgICAgIHVzZSBgZWNobyBGQUxTRWAgdG8gYXZvaWQgc2hvd2luZyBpdC4KCiAgICAqIFlvdXIgcmVwb3J0IHNob3VsZCBhbHNvIG5vdCBjb250YWluIHJhdyBSIG91dHB1dCB1bmxlc3MgeW91IGFyZQoJICBkaXNjdXNzaW5nIGhvdyBSIHByZXNlbnRzIHJlc3VsdHMuIE91dHB1dCBzaG91bGQgYmUgaW5jb3Jwb3JhdGVkCgkgIGludG8geW91ciB0ZXh0IHdpdGggaW5saW5lIGNvZGUgb3IgcHJlc2VudGVkIGFzIG5pY2VseSBmb3JtYXR0ZWQKCSAgdGFibGVzLgoKKiBZb3VyIGAuUm1kYCBmaWxlLCBhbmQgcG9zc2libHkgc3VwcG9ydGluZyBgLlJgIGZpbGVzLCBjb250YWluIHRoZQogIGNvZGUgZm9yIHlvdXIgYW5hbHlzaXMuCgogICAgKiBJZiB5b3UgbmVlZCB0byB1cGRhdGUgeW91ciBjb2RlLCBvciBpZiBhIGNvbGxhYm9yYXRvciBuZWVkcyB0bwogICAgICB1cGRhdGUgeW91ciBjb2RlLCB0aGF0IHdvcmsgd2lsbCBiZSBkb25lIGluIHlvdXIgYC5SbWRgIGZpbGUuCgogICAgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgY29kZSBpbiB5b3VyIGAuUm1kYCBmaWxlIGlzIHJlYWRhYmxlLgoKCSogRm9sbG93aW5nIHRoZSBbY29kaW5nIHN0YW5kYXJkc10oY29kaW5nLmh0bWwpIGhlbHBzIHdpdGggdGhpcy4KCiAgICAqIFBsZWFzZSBpbmRlbnQgYnkgNCBzcGFjZXMgZm9yIGVhY2ggbGV2ZWwuIEkgZmluZCB0aGlzIHRoZSBtb3N0CiAgICAgIHJlYWRhYmxlIG9wdGlvbi4KCiogSWYgeW91IHJlYWQgYSBkYXRhIGZpbGUgaW4geW91ciBjb2RlIG1ha2Ugc3VyZSB0aGF0IHlvdSByZWFkIGl0IGluIGEKICB3YXkgdGhhdCB3aWxsIHdvcmsgZm9yIHNvbWVvbmUgZWxzZSB1c2luZyB5b3VyIHJlcG9zaXRvcnkuIElmIHlvdQogIHdhbnQgdG8gcmVhZCBmcm9tIGEgbG9jYWwgZmlsZToKCgkqIE1ha2Ugc3VyZSBpdCBpcyBhdmFpbGFibGUgbG9jYWxseSBlaXRoZXIgYnkgZG93bmxvYWRpbmcgaXQgYXMKICAgICAgbmVlZGVkIG9yIGluY2x1ZGluZyBpdCBpbiB5b3VyIHJlcG9zaXRvcnkuCgoJKiBSZWFkIHRoZSBmaWxlIHdpdGggYSByZWxhdGl2ZSBwYXRoIG5hbWUsIGFzc3VtaW5nIHlvdXIgd29ya2luZwogICAgICBkaXJlY3Rvcnkgd2lsbCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgeW91ciBgUm1kYCBmaWxlLgoKIyMgMS4gQ2hvb3NpbmcgQmV0d2VlbiBGYWNldGluZyBhbmQgQ29sb3IKClRoZSBmYWNldGVkIHBsb3Qgc2hvd3MgZWFjaCBvZiB0aGUgc2V2ZW4gZ3JvdXBzIGluIGEgc3ViLXBsb3QsIG9yIGZhY2V0LAp1c2luZyB0aGUgc2FtZSBheGlzIHNjYWxlcyBmb3IgYWxsIHBsb3RzLgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBmYWNldF93cmFwKH4gY2xhc3MsIG5yb3cgPSAyKQpgYGAKClRoZSBwbG90cyBhcmUgc21hbGwgYW5kIHRoZXJlIGlzIHNvbWUgb3Zlci1wbG90dGluZy4gVGhlIG92ZXItcGxvdHRpbmcKY291bGQgYmUgcmVkdWNlZCBieSByZWR1Y2luZyB0aGUgcG9pbnQgc2l6ZS4KCkEgc2luZ2xlIHBsb3QgdGhhdCBtYXBzIGBjbGFzc2AgdG8gY29sb3IgYmVuZWZpdHMgZnJvbSBhIGxhcmdlciBwb2ludCBzaXplCnRvIGltcHJvdmUgZGlzY3JpbWluYWJpbGl0eSBvZiB0aGUgY29sb3JzOgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGwsIHkgPSBod3ksIGNvbG9yID0gY2xhc3MpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAyLjUpCmBgYAoKVGhlIG51bWJlciBvZiBjb2xvcnMgaXMgbGFyZ2UsIHdoaWNoIG1ha2VzIGRpc2NyaW1pbmF0aW9uIG1vcmUKZGlmZmljdWx0LCBldmVuIHdpdGggdGhlIGluY3JlYXNlZCBwb2ludCBzaXplLiBCdXQgb25jZSBncm91cHMgYXJlCmlkZW50aWZpZWQsIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9ucyBhcmUgZWFzaWVyIHRvIHNlZSBpbiB0aGUgY29sb3JlZApwbG90IGFzIGFsbCBjb21wYXJpc29ucyBhcmUgd2l0aGluIGEgY29tbW9uIHNldCBvZiBzY2FsZXMuCgpGYWNldGluZyByZWR1Y2VzIHBsb3Qgc2l6ZSBhbmQgdGh1cyBpbmNyZWFzZXMgb3Zlci1wbG90dGluZyBmb3IgbGFyZ2VyCmRhdGEgc2V0cy4gUmVkdWNpbmcgcG9pbnQgc2l6ZSBpcyBhbiBvcHRpb24gdGhhdCBjYW4gYmUgZWZmZWN0aXZlIGlmCmNvbG9yIGFuZCBzaGFwZSBhcmUgbm90IGJlaW5nIHVzZWQgYXMgY2hhbm5lbHMuIEEgc2lnbmlmaWNhbnQgZHJhd2JhY2sKb2YgZmFjZXRpbmcgaXMgdGhhdCBzb21lIGdyb3VwIGNvbXBhcmlzb25zIGFyZSBtb3ZlZCBmcm9tIGNvbW1vbiBzY2FsZQpjb21wYXJpc29ucyB0byB1bmFsaWduZWQgc2NhbGUgY29tcGFyaXNvbnMuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZQphbGxldmlhdGVkIHNvbWV3aGF0IGJ5IHNob3dpbmcgYSBtdXRlZCBpbWFnZSBvZiB0aGUgY29tcGxldGUgZGF0YSBpbgp0aGUgYmFja2dyb3VuZC4KCk92ZXJhbGwsIGNvbG9yIG1heSBoYXZlIGEgc2xpZ2h0IGVkZ2UgaW4gdGhpcyBkYXRhIHNldC4gQnV0IGl0IHNob3VsZApiZSBrZXB0IGluIG1pbmQgdGhhdCBjb2xvciBpcyBub3QgZWZmZWN0aXZlIG9uIGFsbCBkaXNwbGF5IGRldmljZXMgb3IKZm9yIGFsbCB2aWV3ZXJzLgoKSW4gbGFyZ2VyIGRhdGEgc2V0cyBjb2xvciBiZWNvbWVzIGxlc3MgZWZmZWN0aXZlIGFzIHRoZXJlIHdpbGwgYmUgYQpjb25zaWRlcmFibGUgYW1vdW50IG9mIG92ZXItcGxvdHRpbmcsIGdpdmVuIHRoZSBwb2ludCBzaXplIG5lZWRlZCB0bwpzdXBwb3J0IGdvb2QgY29sb3IgZGlzY3JpbWluYXRpb24uIEZhY2V0aW5nIHdpbGwgYWxzbyBzdWZmZXIgZnJvbSBtb3JlCm92ZXItcGxvdHRpbmcgaW4gbGFyZ2VyIGRhdGEgc2V0cyBmb3IgYSBnaXZlbiBwb2ludCBzaXplLCBidXQgdGhlcmUgaXMgbW9yZQpmbGV4aWJpbGl0eSB0byByZWR1Y2UgcG9pbnQgc2l6ZS4gIFRoZSBzaGFwZSBvZiB0aGUgZGF0YSBhbHNvIHBsYXlzIGEKcm9sZSwgc28gYm90aCBhcHByb2FjaGVzIGFyZSB3b3J0aCBjb25zaWRlcmluZy4KCgojIyAyLiBGYWNldGluZyB3aXRoIE11dGVkIEZ1bGwgRGF0YQoKVGhlIGZ1bGwgZGF0YSBjYW4gYmUgYWRkZWQgYXMgYSBiYWNrZ3JvdW5kIGxheWVyIGluIGEgbXV0ZWQgY29sb3IsCnN1Y2ggYXMgYSBsaWdodCBncmV5OgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOH0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKwogICAgZ2VvbV9wb2ludChkYXRhID0gbXV0YXRlKG1wZywgY2xhc3MgPSBOVUxMKSwgY29sb3IgPSAibGlnaHRncmV5IikgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGZhY2V0X3dyYXAofiBjbGFzcywgbnJvdyA9IDIpCmBgYAoKV2l0aCB0aGUgZnVsbCBkYXRhIGdyb3VwLXRvLXdob2xlIGNvbXBhcmlzb25zIGFyZSBhZ2FpbiBvbiBhbGlnbmVkCnNjYWxlcy4gIEZvciBleGFtcGxlLCB3aXRoIHRoZSBmdWxsIGRhdGEgaW4gdGhlIGJhY2tncm91bmQgaXQgaXMgZWFzeQp0byBzZWUgdGhhdCB0aGUgMi1zZWF0ZXJzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIKY2Fycy4gU2VlaW5nIHRoaXMgaW4gdGhlIGJhc2ljIHBsb3Qgc2hvd24gYWJvdmUgaXMgYWxzbyBwb3NzaWJsZSwgYnV0Cml0IHJlcXVpcmVzIHNvbWUgd29yay4KCgojIyAzLiBHdW4gTXVyZGVycyBpbiBVUyBTdGF0ZXMKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0V9CmlmICghIGZpbGUuZXhpc3RzKCJtdXJkZXJzLmNzdiIpKQogICAgZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc3RhdC51aW93YS5lZHUvfmx1a2UvZGF0YS9tdXJkZXJzLmNzdiIsCiAgICAgICAgICAgICAgICAgICJtdXJkZXJzLmNzdiIpCm11cmRlcnMgPC0gcmVhZC5jc3YoIm11cmRlcnMuY3N2IikKYGBgCgpUaGUgZm9sbG93aW5nIGdyYXBoIHNob3dzIGEgcGxvdCBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGd1biBtdXJkZXJzCmFnYWluc3QgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdGF0ZSBhbmQgdGhlIERpc3RyaWN0IG9mIENvbHVtYmlhLgpMb2cgYXhpcyBhcmUgdXNlZCBhcyB0aGUgZGlzdHJpYnV0aW9ucyBvZiBib3RoIHZhcmlhYmxlcyBhcmUgaGlnaGx5CnNrZXdlZC4gVGhlIHBvaW50cyBhcmUgY29sb3JlZCB0byBzaG93IHRoZSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIGVhY2gKc3RhdGUuCgpgYGB7cn0KZ2dwbG90KG11cmRlcnMsIGFlcyh4ID0gcG9wdWxhdGlvbiwgeSA9IHRvdGFsLCBjb2xvciA9IHJlZ2lvbikpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDIuNSkgKwogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIHNjYWxlX3lfbG9nMTAoKQpgYGAKClRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIG11cmRlcnMgYW5kIHRoZSBwb3B1bGF0aW9uIHNpemUKYXBwZWFycyB0byBiZSBjbG9zZSB0byBsaW5lYXIuIFRoZSBzdGF0ZXMgaW4gdGhlIHNvdXRoZXJuIHJlZ2lvbiBhcmUKbW9zdGx5IHRvd2FyZHMgdGhlIHRvcCBvZiB0aGUgc2V0IG9mIHBvaW50czogZm9yIGEgZ2l2ZW4gcG9wdWxhdGlvbgpzaXplIHRoZSBudW1iZXIgb2YgbXVyZGVycyBpbiBzb3V0aGVybiBzdGF0ZXMgYXBwZWFycyB0byBiZSBoaWdoZXIKdGhhbiBpbiBvdGhlcnMuCgojIyA0LiBDb21wYXJpbmcgU29tZSBWaXN1YWxpemF0aW9ucwoKQWxsIHRocmVlIHBsb3RzIGNsZWFybHkgc2hvdyB0aGF0IHRoZSA1IGN5bGluZGVyIGdyb3VwIGlzIHRoZQpzbWFsbGVzdC4gRGlzdGluZ3Vpc2hpbmcgdGhlIHNpemVzIG9mIHRoZSBvdGhlciBncm91cHMgaXMgbW9yZQpjaGFsbGVuZ2luZy4KClBsb3QgQiB1c2VzIGFsaWduZWQgc2NhbGVzLiBJdCBpcyBlYXN5IHRvIHNlZSB0aGUgb3JkZXJpbmcsIGV2ZW4KdGhvdWdoIHRoZSB2YWx1ZXMgZm9yIDgsIDYsIGFuZCA0IGN5bGluZGVycyBhcmUgcXVpdGUgY2xvc2UuCgpQbG90IEMgcmVsaWVzIG9uIGxlbmd0aCBjb21wYXJpc29uczsgaXQgc2VlbXMgcG9zc2libGUgdG8gcmVjb2duaXplCnRoYXQgdGhlIDggY3lsaW5kZXIgZ3JvdXAgaXMgdGhlIHNtYWxsZXN0IGFtb25nIHRoZSA0LCA2LCBhbmQgOApjeWxpbmRlciBncm91cHMsIGJ1dCBkZXRlcm1pbmluZyB3aGljaCBvZiB0aGUgNCBhbmQgNiBjeWxpbmRlciBncm91cHMKaXMgc21hbGxlciBpcyB2ZXJ5IGhhcmQuCgpQbG90IEEgcmVsaWVzIG9uIGFyZWEgY29tcGFyaXNvbnMuICBUaGUgc2l6ZXMgb2YgdGhlIDQsIDYsIGFuZCA4CmN5bGluZGVyIGdyb3VwcyBhcmUgdmVyeSBoYXJkIHRvIGRpc3Rpbmd1aXNoLgoKRm9yIGNvbXBhcmluZyB0aGUgZ3JvdXAgc2l6ZXMgaW4gdGhpcyBkYXRhIHNldCBQbG90IEIgaXMgYmVzdCwgZm9sbG93ZWQKYnkgUGxvdCBDLCBhbmQgdGhlbiBQbG90IEEuCg==