Introduction
Unlike the plots the base R plots and ggplots that users read
passively, interactive plots allow users to interact directly with them
by exploring different types of information from different
perspectives.
Essentially, interactive data visualization has an advantage over
static representations of data in that it offers tools for engaging with
the information shown in real time, allowing the end user to see more
details, generate new insights and questions, and squeeze more juice out
of the available data sets.
Strategies for Creating
Interactive DataViz
To develop effective interactive maps, charts, and graphs, there are
several factors we need to consider when we plan the design stage.
- Availability of sufficient data available to design an ideal
visualization.
- Tools and skills to make the visualization comprehensible and easy
to navigate.
- Capability of generating valuable insights one can act upon.
Typically, interactive data visualization will be structured around
identifying the desired goals, understanding the challenges stemming
from the restrictions posed by data sets, and designing a model in which
data can be quickly iterated and reviewed.
Once the design concept takes shape, we can move on to complex data
modeling aimed at thoroughly charting every piece of data and meta-data
involved. Next up is the design of the user interface and the
development of core technology which can be achieved with the help of
various data visualization tools.
With these steps completed, it’s time to user-test for compatibility,
functionality, security, UI, and performance. Put some finishing touches
by introducing any improvements that may be required and you’re ready to
go live with your target audience.
Benefits of Interactive
DataViz
Interactive visualizations allow viewers to interface with the
information presented in ways not possible with static charts and maps.
Interactivity is the way to go especially when dealing with complex
data.
Among the benefits of interactive data visualization are:
Identifying trends faster – Humans are way
better at processing visual data than just plain text. Being able to see
and directly rearrange data makes it easier to acquire information and
act on it accordingly.
Identifying relationships more efficiently – The
opportunity to focus on particular metrics allows users to discern
cause-and-effect relationships throughout definable time
frames.
Valuable data storytelling – The presentation of
a data story works best with humans when it’s served in a clear, linear
fashion. Interactive data visualization allowing you to zoom in and out,
highlight relevant information, filter, and change the parameters will
lead to a better understanding of the information.
Simplifying complex data – A huge data set with
many interconnected pieces may at first glance look very chaotic. Adding
in interactive controls like zooming and filtering will introduce the
much-needed order and generate valuable insights.
Editable data visualizations are extremely useful in that they
optimize the way information is shown. Dashboards with long tables, tons
of numbers and text simply aren’t as practical. A chart you can engage
with allows for a better understanding of whatever topic is being
presented due to its ability to group data and create hierarchies.
LS0tDQp0aXRsZTogIldoYXQgSXMgSW50ZXJhY3RpdmUgVmlzdWFsaXphdGlvbj8iDQphdXRob3I6ICJDaGVuZyBQZW5nIg0KZGF0ZTogIldlc3QgQ2hlc3RlciBVbml2ZXJzaXR5ICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpkaXYjVE9DIGxpIHsNCiAgICBsaXN0LXN0eWxlOm5vbmU7DQogICAgYmFja2dyb3VuZC1jb2xvcjpsaWdodGdyYXk7DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICAgIGNvbG9yOiAjNzgwYzBjOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmRpdiNUT0MgYTpob3ZlciB7DQogIGNvbG9yOiByZWQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQpkaXYjVE9DIGE6bGluayB7DQogIGNvbG9yOiBibHVlOw0KfQ0KDQoNCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCmg0LmF1dGhvciB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyANCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KYTpsaW5rIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiB2aXNpdGVkIGxpbmsgKi8NCmE6dmlzaXRlZCB7DQogIGNvbG9yOiBncmVlbjsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgICAjIEluc3RhbGwgUkN1cmwgcGFja2FnZQ0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCiMjIyBnZ3Bsb3QgYW5kIGV4dGVuc2lvbnMNCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3Bsb3QyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCiMga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvNzVDUEVORy9PbmVEcml2ZSAtIFdlc3QgQ2hlc3RlciBVbml2ZXJzaXR5IG9mIFBBL0RvY3VtZW50cyIpDQojIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gIkM6XFxTVEE0OTBcXHcwNSIpDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFKQ0KYGBgDQoNClwNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVW5saWtlIHRoZSBwbG90cyB0aGUgYmFzZSBSIHBsb3RzIGFuZCBnZ3Bsb3RzIHRoYXQgdXNlcnMgcmVhZCBwYXNzaXZlbHksIGludGVyYWN0aXZlIHBsb3RzIGFsbG93IHVzZXJzIHRvIGludGVyYWN0IGRpcmVjdGx5IHdpdGggdGhlbSBieSBleHBsb3JpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGluZm9ybWF0aW9uIGZyb20gZGlmZmVyZW50IHBlcnNwZWN0aXZlcy4gDQoNCkVzc2VudGlhbGx5LCBpbnRlcmFjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb24gaGFzIGFuIGFkdmFudGFnZSBvdmVyIHN0YXRpYyByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSBpbiB0aGF0IGl0IG9mZmVycyB0b29scyBmb3IgZW5nYWdpbmcgd2l0aCB0aGUgaW5mb3JtYXRpb24gc2hvd24gaW4gcmVhbCB0aW1lLCBhbGxvd2luZyB0aGUgZW5kIHVzZXIgdG8gc2VlIG1vcmUgZGV0YWlscywgZ2VuZXJhdGUgbmV3IGluc2lnaHRzIGFuZCBxdWVzdGlvbnMsIGFuZCBzcXVlZXplIG1vcmUganVpY2Ugb3V0IG9mIHRoZSBhdmFpbGFibGUgZGF0YSBzZXRzLg0KDQoNCiMgU3RyYXRlZ2llcyBmb3IgQ3JlYXRpbmcgSW50ZXJhY3RpdmUgRGF0YVZpeg0KDQpUbyBkZXZlbG9wIGVmZmVjdGl2ZSBpbnRlcmFjdGl2ZSBtYXBzLCBjaGFydHMsIGFuZCBncmFwaHMsIHRoZXJlIGFyZSBzZXZlcmFsIGZhY3RvcnMgd2UgbmVlZCB0byBjb25zaWRlciB3aGVuIHdlIHBsYW4gdGhlIGRlc2lnbiBzdGFnZS4gDQoNCiogQXZhaWxhYmlsaXR5IG9mIHN1ZmZpY2llbnQgZGF0YSBhdmFpbGFibGUgdG8gZGVzaWduIGFuIGlkZWFsIHZpc3VhbGl6YXRpb24uIA0KKiBUb29scyBhbmQgc2tpbGxzIHRvIG1ha2UgdGhlIHZpc3VhbGl6YXRpb24gY29tcHJlaGVuc2libGUgYW5kIGVhc3kgdG8gbmF2aWdhdGUuDQoqIENhcGFiaWxpdHkgb2YgZ2VuZXJhdGluZyB2YWx1YWJsZSBpbnNpZ2h0cyBvbmUgY2FuIGFjdCB1cG9uLg0KDQpUeXBpY2FsbHksIGludGVyYWN0aXZlIGRhdGEgdmlzdWFsaXphdGlvbiB3aWxsIGJlIHN0cnVjdHVyZWQgYXJvdW5kIGlkZW50aWZ5aW5nIHRoZSBkZXNpcmVkIGdvYWxzLCB1bmRlcnN0YW5kaW5nIHRoZSBjaGFsbGVuZ2VzIHN0ZW1taW5nIGZyb20gdGhlIHJlc3RyaWN0aW9ucyBwb3NlZCBieSBkYXRhIHNldHMsIGFuZCBkZXNpZ25pbmcgYSBtb2RlbCBpbiB3aGljaCBkYXRhIGNhbiBiZSBxdWlja2x5IGl0ZXJhdGVkIGFuZCByZXZpZXdlZC4NCg0KT25jZSB0aGUgZGVzaWduIGNvbmNlcHQgdGFrZXMgc2hhcGUsIHdlIGNhbiBtb3ZlIG9uIHRvIGNvbXBsZXggZGF0YSBtb2RlbGluZyBhaW1lZCBhdCB0aG9yb3VnaGx5IGNoYXJ0aW5nIGV2ZXJ5IHBpZWNlIG9mIGRhdGEgYW5kIG1ldGEtZGF0YSBpbnZvbHZlZC4gTmV4dCB1cCBpcyB0aGUgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZSBhbmQgdGhlIGRldmVsb3BtZW50IG9mIGNvcmUgdGVjaG5vbG9neSB3aGljaCBjYW4gYmUgYWNoaWV2ZWQgd2l0aCB0aGUgaGVscCBvZiB2YXJpb3VzIGRhdGEgdmlzdWFsaXphdGlvbiB0b29scy4NCg0KV2l0aCB0aGVzZSBzdGVwcyBjb21wbGV0ZWQsIGl04oCZcyB0aW1lIHRvIHVzZXItdGVzdCBmb3IgY29tcGF0aWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgc2VjdXJpdHksIFVJLCBhbmQgcGVyZm9ybWFuY2UuIFB1dCBzb21lIGZpbmlzaGluZyB0b3VjaGVzIGJ5IGludHJvZHVjaW5nIGFueSBpbXByb3ZlbWVudHMgdGhhdCBtYXkgYmUgcmVxdWlyZWQgYW5kIHlvdeKAmXJlIHJlYWR5IHRvIGdvIGxpdmUgd2l0aCB5b3VyIHRhcmdldCBhdWRpZW5jZS4NCg0KDQojIEJlbmVmaXRzIG9mIEludGVyYWN0aXZlIERhdGFWaXoNCg0KDQpJbnRlcmFjdGl2ZSB2aXN1YWxpemF0aW9ucyBhbGxvdyB2aWV3ZXJzIHRvIGludGVyZmFjZSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgaW4gd2F5cyBub3QgcG9zc2libGUgd2l0aCBzdGF0aWMgY2hhcnRzIGFuZCBtYXBzLiBJbnRlcmFjdGl2aXR5IGlzIHRoZSB3YXkgdG8gZ28gZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBjb21wbGV4IGRhdGEuDQoNCkFtb25nIHRoZSBiZW5lZml0cyBvZiBpbnRlcmFjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb24gYXJlOg0KDQoNCiogKipJZGVudGlmeWluZyB0cmVuZHMgZmFzdGVyKiog4oCTIEh1bWFucyBhcmUgd2F5IGJldHRlciBhdCBwcm9jZXNzaW5nIHZpc3VhbCBkYXRhIHRoYW4ganVzdCBwbGFpbiB0ZXh0LiBCZWluZyBhYmxlIHRvIHNlZSBhbmQgZGlyZWN0bHkgcmVhcnJhbmdlIGRhdGEgbWFrZXMgaXQgZWFzaWVyIHRvIGFjcXVpcmUgaW5mb3JtYXRpb24gYW5kIGFjdCBvbiBpdCBhY2NvcmRpbmdseS4NCg0KDQoqICoqSWRlbnRpZnlpbmcgcmVsYXRpb25zaGlwcyBtb3JlIGVmZmljaWVudGx5Kiog4oCTIFRoZSBvcHBvcnR1bml0eSB0byBmb2N1cyBvbiBwYXJ0aWN1bGFyIG1ldHJpY3MgYWxsb3dzIHVzZXJzIHRvIGRpc2Nlcm4gY2F1c2UtYW5kLWVmZmVjdCByZWxhdGlvbnNoaXBzIHRocm91Z2hvdXQgZGVmaW5hYmxlIHRpbWUgZnJhbWVzLg0KDQoNCiogKipWYWx1YWJsZSBkYXRhIHN0b3J5dGVsbGluZyoqIOKAkyBUaGUgcHJlc2VudGF0aW9uIG9mIGEgZGF0YSBzdG9yeSB3b3JrcyBiZXN0IHdpdGggaHVtYW5zIHdoZW4gaXTigJlzIHNlcnZlZCBpbiBhIGNsZWFyLCBsaW5lYXIgZmFzaGlvbi4gSW50ZXJhY3RpdmUgZGF0YSB2aXN1YWxpemF0aW9uIGFsbG93aW5nIHlvdSB0byB6b29tIGluIGFuZCBvdXQsIGhpZ2hsaWdodCByZWxldmFudCBpbmZvcm1hdGlvbiwgZmlsdGVyLCBhbmQgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIHdpbGwgbGVhZCB0byBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpbmZvcm1hdGlvbi4NCg0KKiAqKlNpbXBsaWZ5aW5nIGNvbXBsZXggZGF0YSoqIOKAkyBBIGh1Z2UgZGF0YSBzZXQgd2l0aCBtYW55IGludGVyY29ubmVjdGVkIHBpZWNlcyBtYXkgYXQgZmlyc3QgZ2xhbmNlIGxvb2sgdmVyeSBjaGFvdGljLiBBZGRpbmcgaW4gaW50ZXJhY3RpdmUgY29udHJvbHMgbGlrZSB6b29taW5nIGFuZCBmaWx0ZXJpbmcgd2lsbCBpbnRyb2R1Y2UgdGhlIG11Y2gtbmVlZGVkIG9yZGVyIGFuZCBnZW5lcmF0ZSB2YWx1YWJsZSBpbnNpZ2h0cy4NCg0KDQpFZGl0YWJsZSBkYXRhIHZpc3VhbGl6YXRpb25zIGFyZSBleHRyZW1lbHkgdXNlZnVsIGluIHRoYXQgdGhleSBvcHRpbWl6ZSB0aGUgd2F5IGluZm9ybWF0aW9uIGlzIHNob3duLiBEYXNoYm9hcmRzIHdpdGggbG9uZyB0YWJsZXMsIHRvbnMgb2YgbnVtYmVycyBhbmQgdGV4dCBzaW1wbHkgYXJlbuKAmXQgYXMgcHJhY3RpY2FsLiBBIGNoYXJ0IHlvdSBjYW4gZW5nYWdlIHdpdGggYWxsb3dzIGZvciBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHdoYXRldmVyIHRvcGljIGlzIGJlaW5nIHByZXNlbnRlZCBkdWUgdG8gaXRzIGFiaWxpdHkgdG8gZ3JvdXAgZGF0YSBhbmQgY3JlYXRlIGhpZXJhcmNoaWVzLiANCg0K