QWxsIGZpbGVzIHVuZGVyIHRoaXMgY29udHJpYiBkaXJlY3RvcnkgYXJlIFVOU1VQUE9SVEVELiBUaGVyZSB3ZXJlCnByb3ZpZGVkIGJ5IHVzZXJzIG9mIHpsaWIgYW5kIHdlcmUgbm90IHRlc3RlZCBieSB0aGUgYXV0aG9ycyBvZiB6bGliLgpVc2UgYXQgeW91ciBvd24gcmlzay4gUGxlYXNlIGNvbnRhY3QgdGhlIGF1dGhvcnMgb2YgdGhlIGNvbnRyaWJ1dGlvbnMKZm9yIGhlbHAgYWJvdXQgdGhlc2UsIG5vdCB0aGUgemxpYiBhdXRob3JzLiBUaGFua3MuCgoKYWRhLyAgICAgICAgYnkgRG1pdHJpeSBBbmlzaW1rb3YgPGFuaXNpbWtvdkB5YWhvby5jb20+CiAgICAgICAgU3VwcG9ydCBmb3IgQWRhCiAgICAgICAgU2VlIGh0dHA6Ly96bGliLWFkYS5zb3VyY2Vmb3JnZS5uZXQvCgphbWQ2NC8gICAgICBieSBNaWtoYWlsIFRldGVyaW4gPG1pQEFMREFOLmFsZ2VicmEuY29tPgogICAgICAgIGFzbSBjb2RlIGZvciBBTUQ2NAogICAgICAgIFNlZSBwYXRjaCBhdCBodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9xdWVyeS1wci5jZ2k/cHI9YmluLzk2MzkzCgphc202ODYvICAgICBieSBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPgogICAgICAgIGFzbSBjb2RlIGZvciBQZW50aXVtIGFuZCBQUHJvL1BJSSwgdXNpbmcgdGhlIEFUJlQgKEdOVSBhcykgc3ludGF4CiAgICAgICAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKCmJsYXN0LyAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CiAgICAgICAgRGVjb21wcmVzc29yIGZvciBvdXRwdXQgb2YgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSAoRENMKQoKZGVscGhpLyAgICAgYnkgQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CiAgICAgICAgU3VwcG9ydCBmb3IgRGVscGhpIGFuZCBDKysgQnVpbGRlcgoKZG90emxpYi8gICAgYnkgSGVucmlrIFJhdm4gPGhlbnJpa0ByYXZuLmNvbT4KICAgICAgICBTdXBwb3J0IGZvciBNaWNyb3NvZnQgLk5ldCBhbmQgVmlzdWFsIEMrKyAuTmV0CgpnY2NfZ3ZtYXQ2NC9ieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CiAgICAgICAgR0NDIFZlcnNpb24gb2YgeDg2IDY0LWJpdCAoQU1ENjQgYW5kIEludGVsIEVNNjR0KSBjb2RlIGZvciB4NjQKICAgICAgICBhc3NlbWJsZXIgdG8gcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpCgppbmZiYWNrOS8gICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgogICAgICAgIFVuc3VwcG9ydGVkIGRpZmZzIHRvIGluZmJhY2sgdG8gZGVjb2RlIHRoZSBkZWZsYXRlNjQgZm9ybWF0CgppbmZsYXRlODYvICBieSBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgogICAgICAgIFR1bmVkIHg4NiBnY2MgYXNtIGNvZGUgdG8gcmVwbGFjZSBpbmZsYXRlX2Zhc3QoKQoKaW9zdHJlYW0vICAgYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CiAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKCmlvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CiAgICAgICAgQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCgppb3N0cmVhbTMvICBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KICAgICAgICAgICAgYW5kIEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgogICAgICAgIFlldCBhbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKCm1hc214NjQvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KICAgICAgICB4ODYgNjQtYml0IChBTUQ2NCBhbmQgSW50ZWwgRU02NHQpIGNvZGUgZm9yIHg2NCBhc3NlbWJsZXIgdG8KICAgICAgICByZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksICBhbHNvIG1hc20geDg2CiAgICAgICAgNjQtYml0cyB0cmFuc2xhdGlvbiBvZiBDaHJpcyBBbmRlcnNvbiBpbmZsYXRlX2Zhc3QoKQoKbWFzbXg4Ni8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgogICAgICAgIHg4NiBhc20gY29kZSB0byByZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksCiAgICAgICAgZm9yIFZpc3VhbCBDKysgYW5kIE1BU00gKDMyIGJpdHMpLgogICAgICAgIEJhc2VkIG9uIEJyaWFuIFJhaXRlciAoYXNtNjg2KSBhbmQgQ2hyaXMgQW5kZXJzb24gKGluZmxhdGU4NikKCm1pbml6aXAvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KICAgICAgICBNaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYgogICAgICAgIEluY2x1ZGVzIFppcDY0IHN1cHBvcnQgYnkgTWF0aGlhcyBTdmVuc3NvbiA8bWF0aGlhc0ByZXN1bHQ0Mi5jb20+CiAgICAgICAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAoKcGFzY2FsLyAgICAgYnkgQm9iIERlbGxhY2EgPGJvYmRsQHh0cmEuY28ubno+IGV0IGFsLgogICAgICAgIFN1cHBvcnQgZm9yIFBhc2NhbAoKcHVmZi8gICAgICAgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KICAgICAgICBTbWFsbCwgbG93IG1lbW9yeSB1c2FnZSBpbmZsYXRlLiAgQWxzbyBzZXJ2ZXMgdG8gcHJvdmlkZSBhbgogICAgICAgIHVuYW1iaWd1b3VzIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZsYXRlIGZvcm1hdC4KCnRlc3R6bGliLyAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KICAgICAgICBFeGFtcGxlIG9mIHRoZSB1c2Ugb2YgemxpYgoKdW50Z3ovICAgICAgYnkgUGVkcm8gQS4gQXJhbmRhIEd1dGllcnJleiA8cGFhZ0B0aWQuZXM+CiAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgoKdnN0dWRpby8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgogICAgICAgIEJ1aWxkaW5nIGEgbWluaXppcC1lbmhhbmNlZCB6bGliIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KICAgICAgICBJbmNsdWRlcyB2YzExIGZyb20ga3JldXplcmtyaWVnIGFuZCB2YzEyIGZyb20gZGF2aXNwdWgK