# smd_random_banner 0.3a # Random image or file chosen by category/text/article field. Use for advertising or fun # Stef Dawson # http://stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTc6InNtZF9yYW5kb21fYmFubmVyIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS8iO3M6NzoidmVyc2lvbiI7czo0OiIwLjNhIjtzOjExOiJkZXNjcmlwdGlvbiI7czo4NjoiUmFuZG9tIGltYWdlIG9yIGZpbGUgY2hvc2VuIGJ5IGNhdGVnb3J5L3RleHQvYXJ0aWNsZSBmaWVsZC4gVXNlIGZvciBhZHZlcnRpc2luZyBvciBmdW4iO3M6NDoiaGVscCI7czozNDg3OToiPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmNvZGUge2NvbG9yOiMyMDQ2NmY7fQ0KcHJlIHtwYWRkaW5nOjAuNWVtIDFlbTsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4IGRhc2hlZCAjY2NjO30NCmgxLCBoMiwgaDMsIGgzIGNvZGUge2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OmJvbGQ7fQ0KaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6MGVtO30NCmgyLCBoMyB7bWFyZ2luLXRvcDoyZW07fQ0KaDEge2ZvbnQtc2l6ZTozZW07fQ0KaDIge2ZvbnQtc2l6ZToyZW07fQ0KaDMge2ZvbnQtc2l6ZToxLjVlbTt9DQpsaSBhIGNvZGUge2ZvbnQtd2VpZ2h0Om5vcm1hbDt9DQoucmVxdWlyZWQsIC53YXJuaW5nIHtjb2xvcjpyZWQ7fQ0KI2VndGFiIHRkLCNlZ3RhYiB0aCB7cGFkZGluZzouN2VtOyBib3JkZXI6MXB4IHNvbGlkICM4ODg7dGV4dC1hbGlnbjpjZW50ZXI7fQ0KPC9zdHlsZT4NCjxoMSBpZD0idG9wIj5zbWRfcmFuZG9tX2Jhbm5lcjwvaDE+DQo8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2FnZSwgYnVncywgZmVhdHVyZXMgZXRjLCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE2NDQ4Ij52aXNpdCB0aGUgZm9ydW0gdGhyZWFkPC9hPi48L3A+DQoNCjxwIGNsYXNzPSJyZXF1aXJlZCI+UmVxdWlyZXMgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2Rvd25sb2Fkcy9zbWRfbGliX3YwLjIyLnR4dCI+c21kX2xpYiB2MC4yMjwvYT4gdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQuPHA+DQoNCjxoMiBpZD0iY29udGVudHMiPkNvbnRlbnRzPC9oMj4NCjx1bD4NCjxsaT48YSBocmVmPSIjb3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ21vZGUiPkltYWdlIG1vZGU8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iI2ltZ2F0dHMiPkF0dHJpYnV0ZXM8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iI21vZGUiPm1vZGU8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3N1YmNhdHMiPnN1YmNhdHM8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjbWF0Y2h0ZXh0Ij5tYXRjaF90ZXh0PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2F2b2lkdGV4dCI+YXZvaWRfdGV4dDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNpbWdjb21wYXJldG8iPmNvbXBhcmVfdG88L2E+PC9saT4NCjxsaT48YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW1pdCI+bGltaXQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjYWx3YXlzZGlzcGxheSI+YWx3YXlzX2Rpc3BsYXk8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGh1bWIiPnRodW1iPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ2xpbmtpbiI+bGlua19pbjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW5rcHJlZml4Ij5saW5rX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyZWZlcmVyIj5yZWZlcmVyPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ2ltZ2NsYXNzIj5pbWdjbGFzczwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyYXd1cmwiPnJhd191cmw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGFyZ2V0Ij50YXJnZXQ8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjaW1nZXhhbXBsZXMiPkltYWdlIG1vZGUgZXhhbXBsZXM8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZW1vZGUiPkZpbGUgbW9kZTwvYT4NCjx1bD4NCjxsaT48YSBocmVmPSIjZmlsZXdvcmtzIj5Ib3cgaXQgd29ya3M6IE1JTUUgdHlwZXM8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWF0dHMiPkRpZmZlcmVudCBhdHRyaWJ1dGVzPC9hPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiNmaWxlY29tcGFyZXRvIj5jb21wYXJlX3RvPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ZpbGVsaW5raW4iPmxpbmtfaW48L2E+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWltZ2NsYXNzIj5pbWdjbGFzczwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNjb3VudGRvd25sb2FkcyI+Y291bnRfZG93bmxvYWRzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ZpbGVzZGlyIj5maWxlc19kaXI8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWV4YW1wbGVzIj5GaWxlIG1vZGUgZXhhbXBsZXM8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjY3JlZGl0cyI+Q3JlZGl0czwvYT48L2xpPg0KPC91bD4NCg0KPGgyIGlkPSJvdmVydmlldyI+T3ZlcnZpZXc8L2gyPg0KPHA+UmFuZG9tbHkgZGlzcGxheSBiYW5uZXJzIG9uIGEgcGFnZSBmb3IgY29zbWV0aWMgb3IgYWR2ZXJ0aXNpbmcgcHVycG9zZXMuIFRoZSBjb25jZXB0IGlzOiB3aGF0IGlmIHlvdSB3YW50IHRvIGFkdmVydGlzZSBvdGhlciBwYXJ0cyBvZiB5b3VyIHNpdGUgKGUuZy4gb3RoZXIgcHJvZHVjdHMvc2VydmljZXMpIHVzaW5nIGEgYmFubmVyIGFkPyBZb3Ugd2FudCBhbiBpbWFnZS9hbmltYXRlZCBnaWYvdmlkZW8vd2hhdGV2ZXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBhbmQgd2hlbiBwZW9wbGUgY2xpY2sgb24gdGhlIGJhbm5lcnMsIHRoZXkgc2hvdWxkIGJlIHRha2VuIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIHNpdGUuIFRoZSBjcnVjaWFsIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBsb29rcyB2ZXJ5IGFtYXRldXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0IHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGxvb2tpbmcgYXQgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJvZHVjdCBpdHNlbGYuPC9wPg0KPHA+VGhpcyBwbHVnaW4gYWxsb3dzIHlvdSB0byByYW5kb21seSBpbmNsdWRlL2V4Y2x1ZGUgY2xpY2thYmxlIGltYWdlcyBvciBmaWxlcywgYmFzZWQgb24gZml4ZWQgdGV4dCBzdHJpbmdzIG9yIHRoZSBjb250ZW50cyBvZiBhcnRpY2xlIGZpZWxkcy4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBzaW1wbHkgc3BydWNlIHVwIGEgcGFnZSBhbmQgc2hvdyBhIHJhbmRvbSBpbWFnZSBlYWNoIHRpbWUuPC9wPg0KPHA+RmVhdHVyZXM6PC9wPg0KPHVsPg0KPGxpPlR3byBtb2RlcyBvZiBvcGVyYXRpb246IGNsYXNzc2ljYWwgaW1hZ2VzIGZvciBzdGF0aWMgYmFubmVycywgb3IgZmlsZXMgZm9yIGZsYXNoL3ZpZGVvL21vdmluZyBiYW5uZXJzPC9saT4NCjxsaT5DaG9vc2UgaW1hZ2VzL2ZpbGVzIGJhc2VkIG9uIGdpdmVuIHRleHQsIG9yIGl0ZW1zIHJlYWQgZnJvbSB0aGUgZmllbGRzIG9mIHRoZSBjdXJyZW50IGFydGljbGU8L2xpPg0KPGxpPkFyYml0cmFyeSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGNhdGVnb3JpZXM8L2xpPg0KPGxpPlN1YmNhdGVnb3JpZXM6IHNwZWNpZnkgYSBwYXJlbnQgYW5kIGFsbCBjaGlsZCBjYXRlZ29yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkPC9saT4NCjxsaT5Nb3JlIHRoYW4gb25lIGJhbm5lciBwZXIgcGFnZSBvciB0YWcgc3VwcG9ydGVkPC9saT4NCjxsaT5CYW5uZXJzIGNhbiBsaW5rIHRvIGFueSBvdGhlciBVUkw8L2xpPg0KPGxpPlJ1ZGltZW50YXJ5IHJlZmVycmVyIHRyYWNraW5nIHRvIGFsbG93IGNsaWNrLXRocm91Z2ggcmF0ZXMgdG8gYmUgYW5hbHlzZWQgdmlhIFRYUCdzIGxvZyBmaWxlIHRvIHNlZSB3aGljaCBiYW5uZXJzIGFyZSBtb3N0IHBvcHVsYXI8L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0yMDY5MiI+TXVsdGktbGluZ3VhbCBQYWNrIChNTFApPC9hPiBhd2FyZSBmb3IgaW1hZ2UgY2FwdGlvbi9hbHQgc3RyaW5nczwvbGk+DQo8L3VsPg0KDQo8aDIgaWQ9ImltZ21vZGUiPkltYWdlIG1vZGU8L2gyPg0KPHA+SW4gaXRzIGJhc2UgZm9ybSwgdGhpcyBtb2RlIGZ1bmN0aW9ucyBleGFjdGx5IGFzIGRydV9yYW5kb21faW1hZ2UsIGkuZS4gcGlja3Mgb25lIHJhbmRvbSBpbWFnZSBmcm9tIHRoZSBlbnRpcmUgZGF0YWJhc2Ugb2YgaW1hZ2VzIGFuZCBkaXNwbGF5cyBpdC4gQnV0IGl0IGNhbiBkbyBhIHdob2xlIGxvdCBtb3JlLiBFYWNoIG9wdGlvbiB3aGl0dGxlcyB0aGUgaW1hZ2VzIGRvd24gZnVydGhlciwgYmFzZWQgb24gdmFyaW91cyBjcml0ZXJpYSwgdW50aWwgeW91IGFyZSBsZWZ0IHdpdGggYSBwb3RlbnRpYWwgcG9vbCBvZiBpbWFnZXMsIGZyb20gd2hpY2ggdGhlIHBsdWdpbiB0aGVuIHJhbmRvbWx5IGNob29zZXMuPC9wPg0KDQo8aDIgaWQ9ImltZ2F0dHMiPkF0dHJpYnV0ZXM8L2gyPg0KPGgzIGlkPSJtb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvaDM+DQo8cD5Td2l0Y2hlcyB0aGUgcGx1Z2luIGJldHdlZW4gdGhpcyBkZWZhdWx0IDxhIGhyZWY9IiNpbWdtb2RlIj5pbWFnZSBtb2RlPC9hPiAocHVsbGluZyBwaWN0dXJlcyBmcm9tIHRoZSBpbWFnZSBkYXRhYmFzZSkgb3IgPGEgaHJlZj0iI2ZpbGVtb2RlIj5maWxlIG1vZGU8L2E+IChmcm9tIHVwbG9hZGVkIGZpbGVzKS48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+aW1hZ2U8L2NvZGU+PGJyIC8+DQp0aGUgZGVmYXVsdDwvbGk+DQo8bGk+PGNvZGU+ZmlsZTwvY29kZT48YnIgLz4NCjwvdWw+DQoNCjxoMyBpZD0iY2F0ZWdvcnkiPjxjb2RlPmNhdGVnb3J5PC9jb2RlPjwvaDM+DQo8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIGNhdGVnb3J5IG5hbWVzIHRvIGNob29zZSBmcm9tOyBlaXRoZXIgbmFtZWQgZXhwbGljaXRseSBvciB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPj9jPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IGdsb2JhbCAoYXJ0aWNsZSkgY2F0ZWdvcnkgYXMgdGhlIG5hbWUgb2YgYW4gaW1hZ2UgY2F0ZWdvcnk8L2xpPg0KPGxpPjxjb2RlPiFjPC9jb2RlPjxiciAvPg0KdXNlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnk8L2xpPg0KPGxpPjxjb2RlPj9zPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IFRYUCBzZWN0aW9uIGFzIHRoZSBuYW1lIG9mIGFuIGltYWdlIGNhdGVnb3J5PC9saT4NCjxsaT48Y29kZT4hczwvY29kZT48YnIgLz4NCnVzZXMgZXZlcnl0aGluZyBleGNlcHQgdGhlIGN1cnJlbnQgc2VjdGlvbjwvbGk+DQo8bGk+PGNvZGU+P3Q8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIHVybC10aXRsZSBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeTwvbGk+DQo8bGk+PGNvZGU+IXQ8L2NvZGU+PGJyIC8+DQp1c2VzIGFsbCB1cmwtdGl0bGVzIGV4Y2VwdCB0aGUgY3VycmVudCBhcnRpY2xlIChwcm9iYWJseSBub3QgbXVjaCB1c2UhKTwvbGk+DQo8bGk+PGNvZGU+P2lkPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IGFydGljbGUncyBJRCBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeS4gVGhlIGNhdGVnb3J5IG5hbWUgaXMgbWFkZSB1cCBvZiB0aGUgPGEgaHJlZj0iI2lkcHJlZml4Ij5pZF9wcmVmaXg8L2E+IG9wdGlvbiBhbmQgdGhlIElEIHNvLCBieSBkZWZhdWx0LCBpdCB3aWxsIGJlIGFydGljbGUtPGNvZGU+SUQ8L2NvZGU+LiBUaGlzIGhlbHBzIHdoZW4gY3JlYXRpbmcgcGVyLWFydGljbGUgaW1hZ2UgY2F0ZWdvcmllcyBhbmQgbWVhbnMgeW91IGRvbid0IGhhdmUgdG8gdXNlIGNhdGVnb3J5IG5hbWVzIHRoYXQgYXJlIHNpbXBseSBudW1iZXJzLjwvbGk+DQo8bGk+PGNvZGU+IWlkPC9jb2RlPjxiciAvPg0KdXNlcyBhbGwgaW1hZ2UgSURzIGV4Y2VwdCB0aGUgY3VycmVudCBhcnRpY2xlPC9saT4NCjxsaT48Y29kZT4/ZmllbGRuYW1lPC9jb2RlPjxiciAvPg0KbG9va3MgaW4gdGhlIGdpdmVuIGZpZWxkbmFtZSBvZiB0aGUgY3VycmVudCBhcnRpY2xlIGFuZCB0cmVhdHMgdGhlIGNvbnRlbnRzIGFzIGEgbGlzdCBvZiBjYXRlZ29yaWVzLiBEZXNpZ25lZCBwcmltYXJpbHkgZm9yIHVzZSB3aXRoIGN1c3RvbSBmaWVsZHMgKGUuZy4gPGNvZGU+P2N1c3RvbTE8L2NvZGU+KSwgaXQgY291bGQgYWxzbyBiZSBhbnkgb3RoZXIgZmllbGQgKG9yIGZpZWxkcykgZnJvbSB5b3VyIGFydGljbGVzIChlLmcuIDxjb2RlPj9leGNlcnB0PC9jb2RlPiBvciA8Y29kZT4/Y2F0ZWdvcnkxPC9jb2RlPiBvciA8Y29kZT4/a2V5d29yZHM8L2NvZGU+IG9yIDxjb2RlPj9hdXRob3JpZDwvY29kZT4sIGV0YykuIEJlIHdhcm5lZDogaWYgeW91IHVzZSA8Y29kZT4/Ym9keTwvY29kZT4gb3Igc29tZXRoaW5nIGVxdWFsbHkgb3V0cmFnZW91cywgY2hhbmNlcyBhcmUgdGhlIHBsdWdpbiB3aWxsIGV4cGxvZGU8L2xpPg0KPC91bD4NCg0KPHA+VG8gbmVnYXRlIGFueSBjYXRlZ29yeSBzZWxlY3Rpb24sIHVzZSA8Y29kZT4hY2F0ZWdvcnk8L2NvZGU+IG9yIDxjb2RlPiFmaWVsZF9uYW1lPC9jb2RlPi4gSWYgeW91IGxpc3Qgc3BlY2lmaWMgaW1hZ2UgY2F0ZWdvcmllcyAoZS5nLiA8Y29kZT4hbWFtbWFsczwvY29kZT4pIHRob3NlIGNhdGVnb3JpZXMgd2lsbCBiZSBleGNsdWRlZC4gSWYgeW91IHNwZWNpZnkgYSBmaWVsZCBuYW1lIHN1Y2ggYXMgPGNvZGU+IWtleXdvcmRzPC9jb2RlPiBvciA8Y29kZT4hY3VzdG9tMTwvY29kZT4sIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpZWxkIHdpbGwgYmUgcmVhZCBhbmQgdGhlIGxpc3Qgb2YgaW1hZ2UgY2F0ZWdvcmllcyBmb3VuZCB0aGVyZSB3aWxsIGJlIGV4Y2x1ZGVkLjwvcD4NCg0KPHA+Tm90ZSB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgZmllbGQgbmFtZSBhbmQgdGhhdCBmaWVsZCBpbiB0aGUgYXJ0aWNsZSBpcyBlbXB0eSwgdGhlIG5hbWUgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdhcyBhbiBhY3R1YWwgaW1hZ2UgY2F0ZWdvcnkuIFNvIGlmIHlvdSBzcGVjaWZpZWQgPGNvZGU+P2tleXdvcmRzPC9jb2RlPiBhbmQgdGhlIGtleXdvcmRzIGZpZWxkIGluIHRoZSBjdXJyZW50IGFydGljbGUgd2FzIGVtcHR5LCBpdCB3b3VsZCBsb29rIGZvciBhbiBpbWFnZSBjYXRlZ29yeSBuYW1lZCAia2V5d29yZHMiLjwvcD4NCg0KPHA+QWxzbyBub3RlIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIHlvdSBsaXN0IHRoZW0sIGFsbCAncG9zaXRpdmVzJyB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCwgdGhlbiBhbnkgZXhjbHVzaW9ucyBhcHBsaWVkLjwvcD4NCg0KPGgzIGlkPSJzdWJjYXRzIj48Y29kZT5zdWJjYXRzPC9jb2RlPjwvaDM+DQo8cD5BdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGFsbCBzdWItY2F0ZWdvcmllcyBvZiB0aGUgY2hvc2VuIGltYWdlIGNhdGVnb3JpZXMuPC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPjE8L2NvZGU+PGJyIC8+DQpzd2l0Y2hlcyB0aGUgb3B0aW9uIG9uLiBJdCBpcyBtaXNzaW5nIChpLmUuIG9mZikgYnkgZGVmYXVsdDwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9Im1hdGNodGV4dCI+PGNvZGU+bWF0Y2hfdGV4dDwvY29kZT48L2gzPg0KPHA+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXh0IHN0cmluZ3MgdG8gbG9vayBmb3IgaW4gdGhlIGltYWdlLiBBcyB3aXRoIHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24sIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgb3B0aW9uczoNCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4/YzwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBnbG9iYWwgKGFydGljbGUpIGNhdGVnb3J5IGFzIG9uZSBvZiB0aGUgd29yZHMgdG8gbG9vayBmb3IgaW4gdGhlIGltYWdlPC9saT4NCjxsaT48Y29kZT4/czwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBUWFAgc2VjdGlvbiBhcyBvbmUgb2YgdGhlIHNlYXJjaCB0ZXJtczwvbGk+DQo8bGk+PGNvZGU+P3Q8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIHVybC10aXRsZSBhcyBvbmUgb2YgdGhlIHBocmFzZXMgdG8gbG9vayBmb3I8L2xpPg0KPGxpPjxjb2RlPj9pZDwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgSUQgKGluY2x1ZGluZyA8YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT4pIGFzIG9uZSBvZiB0aGUgdGhpbmdzIHRvIGxvb2sgZm9yPC9saT4NCjxsaT48Y29kZT4/ZmllbGRuYW1lPC9jb2RlPjxiciAvPg0KbG9vayBpbiBhbnkgZ2l2ZW4gYXJ0aWNsZSBmaWVsZCAoZS5nLiBjdXN0b20xLCBjdXN0b20yLCBhcnRpY2xlX2ltYWdlLCBrZXl3b3JkcywgZXhjZXJwdCwgZXRjKSBhbmQgcmVhZCB3aGF0ZXZlciBpcyBmb3VuZCB0aGVyZSBhcyBhIHdvcmQgKG9yIGxpc3Qgb2Ygd29yZHMpIHRvIGxvb2sgZm9yIGluIHRoZSBpbWFnZTwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImF2b2lkdGV4dCI+PGNvZGU+YXZvaWRfdGV4dDwvY29kZT48L2gzPg0KPHA+RXhhY3RseSB0aGUgc2FtZSBhcyA8YSBocmVmPSIjbWF0Y2h0ZXh0Ij5tYXRjaF90ZXh0PC9hPiBleGNlcHQgaXQgZGVmaW5lcyB3b3JkcyB0aGF0IDxzdHJvbmc+bXVzdCBub3Q8L3N0cm9uZz4gYmUgZm91bmQgaW4gdGhlIGltYWdlLiBBbnkgaW1hZ2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHdvcmQocykgYXJlIGZhaXIgZ2FtZS48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+P2M8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgZ2xvYmFsIChhcnRpY2xlKSBjYXRlZ29yeSBhcyBvbmUgb2YgdGhlIHdvcmRzIHRvIGF2b2lkIGluIHRoZSBpbWFnZTwvbGk+DQo8bGk+PGNvZGU+P3M8L2NvZGU+PGJyIC8+DQppZ25vcmUgYW55IGltYWdlcyB0aGF0IGNvbnRhaW4gdGhlIGN1cnJlbnQgVFhQIHNlY3Rpb24gbmFtZSBpbiB0aGVtPC9saT4NCjxsaT48Y29kZT4/dDwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgdXJsLXRpdGxlIGFzIG9uZSBvZiB0aGUgcGhyYXNlcyB0byBhdm9pZCAobm90ZTogaW5jbHVkZXMgdGhlIHVybC10aXRsZS1oeXBoZW5zIGluIHRoZSBjb21wYXJpc29uKTwvbGk+DQo8bGk+PGNvZGU+P2lkPC9jb2RlPjxiciAvPg0KaWdub3JlIGFueSBpbWFnZSB0aGF0IHVzZXMgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIElEIChwbHVzIGFueSBjb3JyZXNwb25kaW5nIDxhIGhyZWY9IiNpZHByZWZpeCI+aWRfcHJlZml4PC9hPikgYXMgb25lIG9mIHRoZSB0aGluZ3MgdG8gYXZvaWQ8L2xpPg0KPGxpPjxjb2RlPj9maWVsZG5hbWU8L2NvZGU+PGJyIC8+DQpsb29rIGluIGFueSBnaXZlbiBhcnRpY2xlIGZpZWxkIChlLmcuIGN1c3RvbTEsIGN1c3RvbTIsIGFydGljbGVfaW1hZ2UsIGtleXdvcmRzLCBleGNlcnB0LCBldGMpIGFuZCByZWFkIHdoYXRldmVyIGlzIGZvdW5kIHRoZXJlIGFzIGEgd29yZCAob3IgbGlzdCBvZiB3b3JkcykgdG8gYXZvaWQgaW4gdGhlIGltYWdlPC9saT4NCjwvdWw+DQoNCjxwPk5vdGUgdGhhdCBhbnkgaW1hZ2VzIG1hdGNoaW5nIHN0dWZmIGluIHRoZSAncG9zaXRpdmUnIDxjb2RlPm1hdGNoX3RleHQ8L2NvZGU+IGxpc3Qgd2lsbCBiZSBjaG9zZW4gZmlyc3QsIGJlZm9yZSBzb21lIG9mIHRoZW0gYXJlIHRoZW4gZXhjbHVkZWQgZnJvbSB0aGUgbGlzdCBpbiA8Y29kZT5hdm9pZF90ZXh0PC9jb2RlPi48L3A+DQoNCjxoMyBpZD0iaW1nY29tcGFyZXRvIj48Y29kZT5jb21wYXJlX3RvPC9jb2RlPjwvaDM+DQo8cD5BbGwgdGhpcyB0YWxrIG9mIGNvbXBhcmluZyB3b3JkcyB0byBpbWFnZXMgaXMgZmluZSwgYnV0IHdoYXQgZXhhY3RseSBpcyBpdCBjb21wYXJpbmcgdG8/IFRoaXMgaXMgd2hlcmUgeW91IGRlY2xhcmUgd2hlcmUgdGhlIHBsdWdpbiBsb29rcy4gQnkgZGVmYXVsdCBpdCB1c2VzIGp1c3QgdGhlIGltYWdlIGZpbGUgbmFtZSwgYnV0IGl0IGNhbiBiZSBleHRlbmRlZCB0byBlbmNvbXBhc3MgYW55IG9mIHRoZSBmb2xsb3dpbmc6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPm5hbWU8L2NvZGU+PGJyIC8+DQp0aGUgZGVmYXVsdDogbG9vayBhdCB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFuZCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNtYXRjaHRleHQiPm1hdGNoX3RleHQ8L2E+IHRoZW4gYWRkIGl0IHRvIHRoZSBwb29sLiBDb252ZXJzZWx5LCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+IHRoZW4gaWdub3JlIHRoZSBpbWFnZTwvbGk+DQo8bGk+PGNvZGU+aWQ8L2NvZGU+PGJyIC8+DQpsb29rIGF0IHRoZSBpZCBvZiB0aGUgaW1hZ2UgYW5kIGluY2x1ZGUvZXhjbHVkZSBpdCBiYXNlZCBvbiB0aGUgbnVtYmVycyBpbiBtYXRjaF90ZXh0L2F2b2lkX3RleHQ8L2xpPg0KPGxpPjxjb2RlPmNhcHRpb248L2NvZGU+PGJyIC8+DQppZiB0aGUgY2FwdGlvbiBjb250YWlucyAoZm9yIG1hdGNoX3RleHQpIG9yIGRvZXMgbm90IGNvbnRhaW4gKGZvciBhdm9pZF90ZXh0KSBhbnkgcGFydGljdWxhciB3b3JkcywgaW5jbHVkZS9leGNsdWRlIHRoaXMgaW1hZ2UgZnJvbSB0aGUgcG9vbDwvbGk+DQo8bGk+PGNvZGU+YWx0PC9jb2RlPjxiciAvPg0KaWYgdGhlIGFsdCB0ZXh0IGNvbnRhaW5zIChmb3IgbWF0Y2hfdGV4dCkgb3IgZG9lcyBub3QgY29udGFpbiAoZm9yIGF2b2lkX3RleHQpIGFueSBwYXJ0aWN1bGFyIHdvcmRzLCBpbmNsdWRlL2V4Y2x1ZGUgdGhpcyBpbWFnZSBmcm9tIHRoZSBwb29sPC9saT4NCjxsaT48Y29kZT5jYXRlZ29yeTwvY29kZT48YnIgLz4NCmFsdGhvdWdoIG5vdCByZWFsbHkgb2YgbXVjaCB1c2UgKHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24gY2FuIGJlIHVzZWQgaW5zdGVhZCksIHlvdSBtYXkgc3BlY2lmeSB0aGUgY2F0ZWdvcnkgYXMgYSBwbGFjZSB0byBsb29rIGZvciBwYXJ0aWN1bGFyIHdvcmRzPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0iaWRwcmVmaXgiPjxjb2RlPmlkX3ByZWZpeDwvY29kZT48L2gzPg0KPHA+VGhlIHN0cmluZyB3aGljaCB3aWxsIGJlIHByZWZpeGVkIGJlZm9yZSBldmVyeSBhcnRpY2xlIElELiBEZWZhdWx0cyB0byA8Y29kZT4iYXJ0aWNsZS0iPC9jb2RlPi4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYXJ0aWNsZSA3NSBhbmQgdXNlIDxjb2RlPm1hdGNoX3RleHQ9Ij9pZCI8L2NvZGU+IHRoZSBwbHVnaW4gd2lsbCBsb29rIGZvciBhbnkgaW1hZ2VzIHRoYXQgY29udGFpbiAiYXJ0aWNsZS03NSIgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWxlcyBpbiB0aGUgcG9vbC48L3A+DQoNCjxwPklmIHlvdSBwcmVmZXIgc29tZXRoaW5nIGVsc2UgYmVmb3JlIHRoZSBJRCwgc3BlY2lmeSBpdCB3aXRoIHRoaXMgb3B0aW9uLiBJZiB5b3Ugd2lzaCB0aGUgYXJ0aWNsZSBJRCB0byBiZSB1c2VkIHdpdGhvdXQgYW55IHByZWZpeCwgdXNlIDxjb2RlPmlkX3ByZWZpeD0iIjwvY29kZT4uPC9wPg0KDQo8aDMgaWQ9ImxpbWl0Ij48Y29kZT5saW1pdDwvY29kZT48L2gzPg0KPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0byBkaXNwbGF5IGZyb20gdGhlIHBvb2wuIE5vdGUgdGhhdCBpZiB0aGUgcG9vbCBjb250YWlucyBmZXdlciBpdGVtcyB0aGFuIHRoZSBudW1iZXIgc3BlY2lmaWVkIGhlcmUsIHRoZSBwbHVnaW4gY2FuIG9ubHkgZGlzcGxheSB0aGUgbWF4aW11bSBudW1iZXIgaXQgaGFzIGZvdW5kIHRoYXQgbWF0Y2ggeW91ciBjcml0ZXJpYS4gRGVmYXVsdDogMS48L3A+DQoNCjxoMyBpZD0iYWx3YXlzZGlzcGxheSI+PGNvZGU+YWx3YXlzX2Rpc3BsYXk8L2NvZGU+PC9oMz4NCjxwPklmIG5vIG1hdGNoaW5nIGltYWdlcyBhcmUgZm91bmQgdGhlIHBsdWdpbiB1c3VhbGx5IHJldHVybnMgbm90aGluZy4gVGhpcyBmb3JjZXMgaXQgdG8gdHJ5IGFnYWluIHdpdGhvdXQgYW55IG1hdGNoX3RleHQvYXZvaWRfdGV4dC4gRGVmYXVsdDogb2ZmLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4wPC9jb2RlPjxiciAvPg0Kb2ZmICh0aGUgZGVmYXVsdCk6IG9ubHkgZGlzcGxheXMgaW1hZ2VzIHRoYXQgbWF0Y2ggeW91ciBjcml0ZXJpYS4gSWYgbm90aGluZyBtYXRjaGVzLCBkaXNwbGF5IG5vdGhpbmc8L2xpPg0KPGxpPjxjb2RlPjE8L2NvZGU+PGJyIC8+DQpvbjogaW4gdGhlIGV2ZW50IHlvdXIgY3JpdGVyaWEgcmV0dXJuIG5vIGltYWdlcyBpbiB0aGUgcG9vbCwgdGhlIHBsdWdpbiB0cmllcyBhZ2FpbiB3aXRoIDxlbT5vbmx5PC9lbT4gdGhlIGNhdGVnb3JpZXMgeW91IGNob3NlLiBBbnkgbWF0Y2hfdGV4dC9hdm9pZF90ZXh0IGlzIGlnbm9yZWQ8L2xpPg0KPC91bD4NCg0KPGgzIGlkPSJ0aHVtYiI+PGNvZGU+dGh1bWI8L2NvZGU+PC9oMz4NCjxwPlRvIGRpc3BsYXkgdGh1bWJuYWlscyBpbnN0ZWFkIG9mIGZ1bGxzaXplIGltYWdlcy4gRGVmYXVsdDogb21pdHRlZCAoaS5lLiBvZmYpLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4xPC9jb2RlPjxiciAvPg0Kc3dpdGNoZXMgdGh1bWJuYWlscyBvbi4gQnkgZGVmdWx0IHRoZSBvcHRpb24gaXMgbWlzc2luZyAoaS5lLiBkaXNwbGF5IGZ1bGwtc2l6ZSBpbWFnZSBiYW5uZXJzKTwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImltZ2xpbmtpbiI+PGNvZGU+bGlua19pbjwvY29kZT48L2gzPg0KPHA+TWFrZXMgdGhlIGJhbm5lciBpbWFnZSBjbGlja2FibGUuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIFRleHRwYXR0ZXJuIHdlIGFyZSBsaW1pdGVkIHRvIHB1dHRpbmcgYSBVUkwgbGluayBlaXRoZXIgaW4gdGhlIGFsdCBvciB0aGUgY2FwdGlvbi4gRm9yIGFjY2Vzc2liaWxpdHksIHRoZSBjYXB0aW9uIGlzIHByb2JhYmx5IGEgYmV0dGVyIGNob2ljZSBidXQgaXQncyB5b3VyIGNhbGwuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiB0aGUgaW1hZ2UgdGhlIFVSTCBpcyBzdG9yZWQgd2l0aCB0aGlzIG9wdGlvbi4gSXQgY2FuIGJlIGVpdGhlciA8Y29kZT5hbHQ8L2NvZGU+IG9yIDxjb2RlPmNhcHRpb248L2NvZGU+IGluIHRoaXMgbW9kZSAoPGEgaHJlZj0iI2ZpbGVsaW5raW4iPmZpbGUgbW9kZTwvYT4gaXMgZGlmZmVyZW50KS4gRGVmYXVsdDogb21pdHRlZCAobm8gbGluaykuPC9wPg0KDQo8cD5JZiB0aGUgbGluayBpcyBhIGZ1bGwgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cDovLyBpdCB3aWxsIGJlIHVzZWQgdmVyYmF0aW0gZm9yIHRoZSBpbWFnZSBsaW5rLiBJZiBpdCBzdGFydHMgd2l0aCBhICcvJyBpdCB3aWxsIGJlIGh1bmcgb2ZmIHRoZSByb290IHNpdGVfdXJsIGRpcmVjdGx5LiBJZiBpdCBzdGFydHMgd2l0aCBhbnl0aGluZyBlbHNlIGl0IGlzIGFzc3VtZWQgYSAncmVsYXRpdmUnIChvciAnbG9jYWwnKSBsaW5rIGFuZCBpbmhlcml0cyB0aGUgY3VycmVudCBzZWN0aW9uLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT5jYXB0aW9uPC9jb2RlPjxiciAvPg0KdGVsbCB0aGUgcGx1Z2luIHRvIG1ha2UgdGhlIGJhbm5lciBjbGlja2FibGUgYW5kIHRoZSBkZXN0aW5hdGlvbiBVUkwgaXMgdG8gYmUgZm91bmQgaW4gdGhlIGNhcHRpb24gb2YgdGhlIGltYWdlPC9saT4NCjxsaT48Y29kZT5hbHQ8L2NvZGU+PGJyIC8+DQp0ZWxsIHRoZSBwbHVnaW4gdG8gbWFrZSB0aGUgYmFubmVyIGNsaWNrYWJsZSBhbmQgdGhlIGRlc3RpbmF0aW9uIFVSTCBpcyB0byBiZSBmb3VuZCBpbiB0aGUgYWx0IHRleHQgb2YgdGhlIGltYWdlPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0ibGlua3ByZWZpeCI+PGNvZGU+bGlua19wcmVmaXg8L2NvZGU+PC9oMz4NCjxwPlN0cmluZyB0byBwcmVwZW5kIHRvIGV2ZXJ5IFVSTCB3aGVuIHVzaW5nIDxhIGhyZWY9IiNpbWdsaW5raW4iPmxpbmtfaW48L2E+LiBVc2VmdWwgaWYgeW91IHJlb3JnYW5pc2UgeW91ciBzaXRlOiB1c2UgdGhpcyBpbnN0ZWFkIG9mIHZpc2l0aW5nIGVhY2ggaW1hZ2UgYW5kIGFsdGVyaW5nIHRoZSBjYXB0aW9uL2FsdCB0ZXh0LiBEZWZhdWx0OiBvbWl0dGVkIChubyB0ZXh0KS48L3A+DQoNCjxwPkFnYWluLCBhcyB3aXRoIDxhIGhyZWY9IiNpbWdsaW5raW4iPmxpbmtfaW48L2E+IGlmIDxjb2RlPmxpbmtfcHJlZml4PC9jb2RlPiBiZWdpbnMgd2l0aCBodHRwOi8vIGl0IGlzIGFzc3VtZWQgYSBmdWxsIFVSTCB0byBhbm90aGVyIHNpdGU7IGlmIGl0IGJlZ2lucyB3aXRoICcvJyBpdCBpcyBhIHJvb3QgbGluazsgYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlY3Rpb24uIE5vdGUgdGhhdCBpZiB5b3UgdXNlIGFuIGh0dHA6Ly8gZnVsbCBVUkwgaW4gdGhlIGltYWdlIGl0c2VsZiwgYW55IDxjb2RlPmxpbmtfcHJlZml4PC9jb2RlPiB3aWxsIGJlIGlnbm9yZWQuPC9wPg0KDQo8aDMgaWQ9InJlZmVyZXIiPjxjb2RlPnJlZmVyZXI8L2NvZGU+IChzaWMhKTwvaDM+DQo8cD5FYWNoIGltYWdlIGhhcyA8Y29kZT4/YmlkPWltYWdlSUQ8L2NvZGU+IGFkZGVkIHRvIGl0LCBzbyBjbGlja3MgY2FuIGJlIHRyYWNrZWQgaW4gdGhlIGxvZ3MgdG8gc2VlIHdoaWNoIGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUgYWRzLiBDaGFuZ2UgdGhlICdiaWQnIHRleHQgaGVyZSB0byBzb21ldGhpbmcgb2YgeW91ciBjaG9vc2luZywgb3IgdXNlIDxjb2RlPnJlZmVyZXI9IiI8L2NvZGU+IHRvIGRpc2FibGUgdHJhY2tpbmcuIERlZmF1bHQ6IGJpZCAod2hlbiA8YSBocmVmPSIjaW1nbGlua2luIj5saW5rX2luPC9hPiBpcyB1c2VkKS4gTm90ZSB0aGF0IHRoZSBvcHRpb24gaXMgbWlzLXNwZWxsZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIEhUVFAgc3BlYyB3YXMgYWxsIHRob3NlIHllYXJzIGFnbyA6LSk8L3A+DQoNCjxoMyBpZD0iaW1naW1nY2xhc3MiPjxjb2RlPmltZ2NsYXNzPC9jb2RlPjwvaDM+DQo8cD5DU1MgY2xhc3MgZm9yIGVhY2ggYmFubmVyIGltYWdlIGRpc3BsYXllZC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpLjwvcD4NCg0KPGgzIGlkPSJyYXd1cmwiPjxjb2RlPnJhd191cmw8L2NvZGU+PC9oMz4NCjxwPkluc3RlYWQgb2YgbGlua2luZyBhbmQgbWFraW5nIGEgZnVsbCBpbWFnZSB0YWcsIHVzaW5nIHRoaXMgb3B0aW9uIGp1c3Qgb3V0cHV0cyB0aGUgVVJMIGRpcmVjdGx5IHRvIHRoZSBwYWdlLiBUaGlzIGNhbiBiZSB1c2VkIGluIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGRlY2xhcmF0aW9ucyB0bywgZm9yIGV4YW1wbGUsIHNldCBhIHJhbmRvbSBDU1Mgb2JqZWN0IGJhY2tncm91bmQuIERlZmF1bHQ6IG9mZi48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+MTwvY29kZT48YnIgLz4NCnN3aXRjaGVzIHJhd191cmwgbW9kZSBvbi4gQnkgZGVmYXVsdCB0aGUgb3B0aW9uIGlzIG1pc3NpbmcgKGkuZS4gcmVuZGVycyBhIGZ1bGwgSFRNTCAmbHQ7aW1nJmd0OyB0YWcpPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0idGFyZ2V0Ij48Y29kZT50YXJnZXQ8L2NvZGU+PC9oMz4NCjxwPlNwZWNpZmllcyB0aGUgYW5jaG9yIHRhcmdldCB3aW5kb3cgKGUuZy4gIl9ibGFuayIpIHdoaWNoIHdpbGwgY2F1c2UgYSBwb3B1cCBlZmZlY3Qgd2hlbiBhIGxpbmtlZCBiYW5uZXIgaXMgY2xpY2tlZC4gPGVtPk5COiBpZiB1c2luZyB0aGUgWEhUTUwgMS4xIERPQ1RZUEUgd2l0aCB0aGlzIG9wdGlvbiwgeW91ciBwYWdlIHdpbGwgbm90IHZhbGlkYXRlIHNpbmNlIHRhcmdldCBpcyBkZXByZWNhdGVkIGJ5IHRoZSBXM0M8L2VtPi4gRGVmYXVsdDogbm90IHNldCAobGlua3Mgb3BlbiBpbiBzYW1lIHdpbmRvdykuPC9wPg0KDQo8aDI+PGEgaWQ9ImltZ2V4YW1wbGVzIj48L2E+SW1hZ2UgbW9kZSBleGFtcGxlczwvaDI+DQo8cD5UbyBoaWdobGlnaHQgdGhlIGZlYXR1cmVzLCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGFuIGV4YW1wbGUgb2YgYSB6b28gd2ViIHNpdGUuIE9uIHRoaXMgc2l0ZSB5b3UgaGF2ZSB0aHJlZSBzZWN0aW9uczogImFib3V0IiwgImFuaW1hbHMiIGFuZCAidG91cnMiLiBZb3UgaGF2ZSBpbWFnZXMgb2YgdmFyaW91cyBhbmltYWxzIHVuZGVyIGFuIGltYWdlIGNhdGVnb3J5IGNhbGxlZCAiYW5pbWFscyIuIEJlbG93IHRoYXQgdGhleSBhcmUgc2VwYXJhdGVkIGludG8gIm1hbW1hbHMiLCAicmVwdGlsZXMiLCBhbmQgImJpcmRzIi4gWW91ciBhbHQgdGV4dCBob2xkcyBzdWl0YWJsZSBhbHRlcm5hdGUgZGVzY3JpcHRpb25zIG9mIHRoZSBhbmltYWxzIGFuZCB0aGUgY2FwdGlvbiB0ZXh0IGlzIGEgdXJsIHRvIGFuIGFydGljbGUgYWJvdXQgZWFjaCBhbmltYWwuIFlvdSBhbHNvIGhhdmUgb3RoZXIgaW1hZ2UgY2F0ZWdvcmllcyBmb3IgdGhlIHJlc3Qgb2YgeW91ciBzaXRlLjwvcD4NCg0KPGgzIGlkPSJlZzEiPkV4YW1wbGUgMTwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIGxpbWl0PSI0IiBzdWJjYXRzPSIxIiAvJmd0OzwvcHJlPg0KDQo8cD5UaGF0IHdvdWxkIHB1bGwgb3V0IGZvdXIgcGljdHVyZXMgb2YgYW55IGFuaW1hbCB0byBzaG93IG9uIHlvdXIgZnJvbnQgcGFnZTsgbWF5YmUgYXJyYW5nZWQgaW50byBhIG5lYXQgc3F1YXJlITwvcD4NCg0KPGgzIGlkPSJlZzIiPkV4YW1wbGUgMjwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9Im1hbW1hbHMsIHJlcHRpbGVzIiBsaW5rX2luPSJjYXB0aW9uIiAvJmd0OzwvcHJlPg0KPHA+V291bGQgZGlzcGxheSBhIHJhbmRvbSBwaWN0dXJlIGZyb20gZWl0aGVyIHRoZSBtYW1tYWxzIG9yIHJlcHRpbGVzIGNhdGVnb3JpZXMuIFRoZSBpbWFnZSB3b3VsZCBiZSBjbGlja2FibGUgYW5kIHRoZSBsaW5rIHdvdWxkIHRha2UgeW91IHRvIHRoZSBVUkwgZ2l2ZW4gaW4gdGhlIGNhcHRpb24gZmllbGQgb2YgdGhhdCBpbWFnZS4gSWYgdGhlIGNhcHRpb24gZmllbGQgaGFwcGVuZWQgdG8gYmUgZW1wdHksIHRoZSBsaW5rIHdvdWxkIGJlIHN1cHJlc3NlZC48L3A+DQoNCjxoMyBpZD0iZWczIj5FeGFtcGxlIDM8L2gzPg0KPHByZT4mbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0Ow0KI215RGl2IHsNCiAgYmFja2dyb3VuZDogdXJsKCZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIHN1YmNhdHM9IjEiIHJhd191cmw9IjEiIC8mZ3Q7KSBuby1yZXBlYXQgdG9wOw0KfQ0KJmx0Oy9zdHlsZSZndDs8L3ByZT4NCjxwPlRoaXMga2luZCBvZiBzeW50YXggY2FuIGJlIHVzZWQgaWYgeW91IG9ubHkgd2FudGVkIHRoZSBiYWNrZ3JvdW5kIG9mIGEgc3BlY2lmaWMgZGl2IHRhZyB0byBob2xkIHlvdXIgcmFuZG9tIGltYWdlLjwvcD4NCg0KPGgzIGlkPSJlZzQiPkV4YW1wbGUgNDwvaDM+DQo8cD5JZiB5b3UgYXJyYW5nZWQgeW91ciBzaXRlIHNvIHRoYXQgeW91IGhhZCBhcnRpY2xlIGNhdGVnb3JpZXMgc3VjaCBhcyAibWFtbWFscyIgYW5kICJyZXB0aWxlcyIgKG1pcnJvcmluZyB5b3VyIGltYWdlIGNhdGVnb3JpZXMpLCB5b3UgY291bGQgZG8gdGhpczo8L3A+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9Ij9jIiBsaW5rX2luPSJjYXB0aW9uIiAvJmd0OzwvcHJlPg0KDQo8cD5UaGUgJz8nIHRlbGxzIHRoZSBwbHVnaW4geW91IGRvbid0IGtub3cgd2hhdCB0aGUgKGltYWdlKSBjYXRlZ29yeSBpcyBnb2luZyB0byBiZSB3aGVuIHlvdSBjb2RlIHRoZSBmb3JtLCBidXQgeW91IHdhbnQgaXQgdG8gYmUgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGFydGljbGUgdGhhdCBhIHZpc2l0b3IgaXMgdmlld2luZy4gU2luY2Ugb3VyIGFydGljbGUgY2F0ZWdvcmllcyBtaW1pYyBvdXIgaW1hZ2UgY2F0ZWdvcmllcyBpbiB0aGlzIGNhc2UsICc/YycgbWVhbnMgInJlYWQgdGhlIGFydGljbGUgY2F0ZWdvcnkgYW5kIHVzZSB0aGF0IGFzIHRoZSBpbWFnZSBjYXRlZ29yeSIuPC9wPg0KPHA+U28gaWYgeW91ciB2aXNpdG9yIHdhcyB2aWV3aW5nIGEgcGFnZSBhYm91dCBhIHJlcHRpbGUsIHRoZSByYW5kb20gaW1hZ2UgZGlzcGxheWVkIG9uIHRoZSBwYWdlIHdvdWxkIGJlIG9mIGFub3RoZXIgcmVwdGlsZSAocG9zc2libHkgdGhlIHNhbWUgb25lKS4gVGhlcmUgYXJlIDxhIGhyZWY9IiNjYXRlZ29yeSI+bWFueSBvdGhlciBvcHRpb25zPC9hPi48L3A+DQoNCjxoMyBpZD0iZWc1Ij5FeGFtcGxlIDU8L2gzPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzLCAhYyIgc3ViY2F0cz0iMSIgbGlua19pbj0iY2FwdGlvbiIgLyZndDs8L3ByZT4NCjxwPlNsaWdodGx5IG1vcmUgdXNlZnVsLCB0aGlzIG9uZS4gSXQgdGVsbHMgdGhlIHBsdWdpbiB0byBzZWxlY3QgYW55IGFuaW1hbCBpbWFnZSBidXQgPGVtPm5vdDwvZW0+IG9uZSBmcm9tIHRoZSBjdXJyZW50IGNhdGVnb3J5IHRoYXQgaXMgYmVpbmcgdmlld2VkLiBTbyBpdCdsbCBlZmZlY3RpdmVseSAnYWR2ZXJ0aXNlJyBvdGhlciBjYXRlZ29yaWVzIGZvciB5b3UuPC9wPg0KDQo8aDMgaWQ9ImVnNiI+RXhhbXBsZSA2PC9oMz4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0icmVwdGlsZXMsID9jdXN0b20xIiBsaW5rX2luPSJjYXB0aW9uIiBzdWJjYXRzPSIxIiAvJmd0OzwvcHJlPg0KPHA+VGhpcyBleGFtcGxlIGdpdmVzIHlvdSBhIHJhbmRvbSBpbWFnZSBjaG9zZW4gZnJvbSB0aGUgJ3JlcHRpbGVzJyBpbWFnZSBjYXRlZ29yeSBhbmQgYWxzbyBhbnkgY2F0ZWdvcmllcyBsaXN0ZWQgaW4gY3VzdG9tMSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBhcnRpY2xlLiBJZiB5b3UgcHV0ICJtYW1tYWxzLCBiaXJkcywgcGVuZ3VpbnMiIGluIGN1c3RvbV8xIHdoZW4geW91IHdyb3RlIHRoZSBhcnRpY2xlIHlvdSB3b3VsZCBnZXQgYW4gaW1hZ2UgY2hvc2VuIGZyb20gYWxsIGZvdXIgY2F0ZWdvcmllcyAoYW5kIHRoZWlyIHN1Yi1jYXRlZ29yaWVzIGluIHRoaXMgY2FzZSkuIFRoaXMgc29ydCBvZiBpZGVhIGNvdWxkIGJlIHVzZWQgd2l0aCA8Y29kZT5jYXRlZ29yeT0iP2tleXdvcmRzIjwvY29kZT4gdG8gZ2V0IGEgbGlzdCBvZiAicmVsYXRlZCBpbWFnZSBjYXRlZ29yaWVzIi4uLjwvcD4NCjxwPk5vdGUgeW91IGNhbiBzaW1wbHkgbmVnYXRlIHRoZSBjaG9pY2UgbGlrZSB0aGlzOjwvcD4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iYW5pbWFscywgIWN1c3RvbTEiIGxpbmtfaW49ImNhcHRpb24iIHN1YmNhdHM9IjEiIC8mZ3Q7PC9wcmU+DQo8cD5TbyB0aGF0IHdvdWxkIGNob29zZSBhbiBpbWFnZSBmcm9tIGFueSBvZiB0aGUgYW5pbWFscyBleGNlcHQgb25lcyB0aGF0IHdlcmUgaW4gYW55IGNhdGVnb3JpZXMgbGlzdGVkIGluIGN1c3RvbTEuPC9wPg0KDQo8aDMgaWQ9ImVnNyI+RXhhbXBsZSA3PC9oMz4NCjxwPkNhdGVnb3JpZXMgb24gdGhlaXIgb3duIG9ubHkgdGVsbCBoYWxmIHRoZSBzdG9yeS4gVGhlcmUgYXJlIHRpbWVzIHlvdSBtaWdodCB3YW50IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBzcGVjaWZpYyBwaWVjZXMgb2YgdGV4dCBmb3VuZCBpbiB5b3VyIGltYWdlcy4gVGhlIHRleHQgY291bGQgYmUgaW4gdGhlIGZpbGVuYW1lLCB0aGUgaWQsIHRoZSBjYXB0aW9uLCB0aGUgYWx0IHRleHQsIG9yIHRoZSBjYXRlZ29yeSBuYW1lLjwvcD4NCjxwPkltYWdpbmUgeW91ciB2aXNpdG9yIGNsaWNrZWQgYSBwaWN0dXJlIG9mIGEgY3JvY29kaWxlIGFuZCB0aGV5IGFyZSB2aWV3aW5nIHRoZSBncmlzbHkgZGV0YWlscyBvbiBhbiBhcnRpY2xlIHBhZ2UuIFlvdSBtaWdodCB3YW50IHRvIHB1dCAiSWYgeW91IGxpa2VkIHRoaXMsIGZpbmQgb3V0IGFib3V0IHRoZXNlIGFuaW1hbHMgdG9vOiIgYW5kIHNob3cgYSBmZXcgcmFuZG9tIGltYWdlcyB0aGF0IGFsbG93IHRoZW0gdG8gc2VlIHN0dWZmIGFib3V0IG90aGVyIGFuaW1hbHMuIE9idmlvdXNseSwgd2UgZG9uJ3Qgd2FudCBhIHBpY3R1cmUgb2YgYSBjcm9jb2RpbGUgdG8gc2hvdyB1cC4gQW5kIG1heWJlIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhbGxpZ2F0b3JzIGVpdGhlciBiZWNhdXNlIHRoZXkncmUgcXVpdGUgc2ltaWxhci4gU28gd2UgY2FuIGRvIHRoaXM6PC9wPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzIiBzdWJjYXRzPSIxIiBsaW5rX2luPSJjYXB0aW9uIg0KICAgICBhdm9pZF90ZXh0PSJjcm9jLCBjcm9jb2RpbGUsIGFsbGlnYXRvciIgLyZndDs8L3ByZT4NCjxwPlRoYXQgd291bGQgY2hvb3NlIGFueSBwaWN0dXJlIGZyb20gdGhlIGFuaW1hbHMgY2F0ZWdvcnkgKGFuZCBhbGwgaXRzIHN1Yi1jYXRlZ29yaWVzKSBhcyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZSA8aT5kaWRuJ3Q8L2k+IGNvbnRhaW4gJ2Nyb2MnIG9yICdjcm9jb2RpbGUnIG9yICdhbGxpZ2F0b3InLjwvcD4NCg0KPGgzIGlkPSJlZzgiPkV4YW1wbGUgODwvaDM+DQo8cD5JZiB5b3VyIGZpbGVuYW1lcyB3ZXJlIGEgbGl0dGxlIHVuc3RydWN0dXJlZCwgbWF5YmUgeW91J2Qgd2FudCB0byBjaGVjayB0aGUgYWx0IHRleHQgYW5kIGNhcHRpb24gdGV4dCBmb3IgYSBtYXRjaCBhcyB3ZWxsLiBVc2UgPGEgaHJlZj0iI2ltZ2NvbXBhcmV0byI+Y29tcGFyZV90bzwvYT4gZm9yIHRoaXM6PC9wPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzIiBzdWJjYXRzPSIxIiBsaW5rX2luPSJjYXB0aW9uIg0KICAgICBhdm9pZF90ZXh0PSJjcm9jLCBjcm9jb2RpbGUsIGFsbGlnYXRvciIgY29tcGFyZV90bz0ibmFtZSwgYWx0LCBjYXB0aW9uIiAvJmd0OzwvcHJlPg0KDQo8aDMgaWQ9ImVnOSI+RXhhbXBsZSA5PC9oMz4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iYW5pbWFscyIgc3ViY2F0cz0iMSIgYXZvaWRfdGV4dD0iP2MiDQogICAgIGNvbXBhcmVfdG89Im5hbWUsIGFsdCwgY2FwdGlvbiwgY2F0ZWdvcnkiIC8mZ3Q7PC9wcmU+DQo8cD5PbiBhbiBhcnRpY2xlIHBhZ2UsIGhhcmQtY29kaW5nIGxpc3RzIG9mIHRoaW5ncyB0byBpbmNsdWRlL2V4Y2x1ZGUgaXMgYWNjZXB0YWJsZS4gQnV0IGlmIHlvdSdyZSB1c2luZyBhIGZvcm0geW91IGRvbid0IHdhbnQgdG8gZG8gdGhhdCwgc28ganVzdCBsaWtlIHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24geW91IGNhbiB1c2UgJz8nIHBsYWNlaG9sZGVycyB0aGF0IHdpbGwgcmVhZCBzdHVmZiBmcm9tIHRoZSBjdXJyZW50IGFydGljbGUuIFRoaXMgZXhhbXBsZSB3aWxsIHBpY2sgYW55IHJhbmRvbSBhbmltYWwgZXhjZXB0IG9uZXMgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlIGNhdGVnb3J5LiBOb3RlIHRoYXQsIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIGl0IGNoZWNrcyBpbiBmb3VyIGxvY2F0aW9ucyB0byBoZWxwIGVuc3VyZSBpdCB3b24ndCBmaW5kIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgY2F0ZWdvcnkuPC9wPg0KDQo8aDIgaWQ9ImZpbGVtb2RlIj5GaWxlIG1vZGU8L2gyPg0KPHA+U2ltaWxhciBpbiBtYW55IHJlc3BlY3RzIHRvIHRoZSA8YSBocmVmPSIjaW1nbW9kZSI+aW1hZ2UgbW9kZTwvYT4gdGhlIHBsdWdpbiBjYW4gY2hvb3NlIHJhbmRvbSBmaWxlcyBmcm9tIHRob3NlIHVwbG9hZGVkIHRvIHRoZSBGaWxlcyB0YWIgaW4gdGhlIFRYUCBpbnRlcmZhY2UuIFRoaXMgZ2l2ZXMgeW91IHRoZSBvcHRpb24gb2YgdXNpbmcgYSByYW5kb20gYmFubmVyIGFzIGEgcGllY2Ugb2YgRmxhc2ggb3IgYSB2aWRlbyBmaWxlIGlmIHlvdSB3YW50LiBJbiB0aGVvcnksIGlmIHRoZXJlJ3MgYSBicm93c2VyIHBsdWdpbiBhdmFpbGFibGUgZm9yIGl0LCB5b3UgY2FuIHBsYXkgaXQgKGJ1dCBub3RlIHRoZSBjYXZlYXRzIGxhdGVyOiBzdXBwb3J0IGZvciBldmVyeXRoaW5nIGlzbid0IGJ1aWx0IGluIG5hdGl2ZWx5KS48L3A+DQo8cD5BcyB3aXRoIHRoZSBpbWFnZSBtb2RlLCBtb3N0IG9mIHRoZSBvcHRpb25zIHdvcmsgdG8gd2hpdHRsZSBkb3duIHRoZSBjaG9pY2VzIHRvIGEgcG9vbCBvZiBmaWxlcyB0aGF0IG1hdGNoIHlvdXIgc3BlY2lmaWMgY3JpdGVyaWEuIFRoZSBwbHVnaW4gdGhlbiByYW5kb21seSBjaG9vc2VzIG9uZSAob3IgbW9yZSBpZiB5b3UgY2hvb3NlKSBhbmQgcmVuZGVycyBpdCBhcyBiZXN0IGl0IGNhbi48L3A+DQo8cD5UaGVyZSBpcyBvbmUgY3J1Y2lhbCBkaWZmZXJlbmNlIGluIHRoaXMgbW9kZTogc2luY2Ugd2UgYXJlIGxpbWl0ZWQgdG8gb25lIGZpZWxkIG9mIGN1c3RvbWlzYWJsZSBjb250ZW50IHdpdGggZmlsZXMgYW5kIHRoZXJlIGFyZSBhIGxvdCBvZiBwb3RlbnRpYWwgaWRpb3N5bmNyYWNpZXMgaW4gZW1iZWRkaW5nIHBsYXlhYmxlIGNvbnRlbnQsIG9ubHkgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBzcGVjaWZpZWQgYXMgcGx1Z2luIG9wdGlvbnMuIEN1c3RvbWlzYXRpb24gYWJvdmUgYW5kIGJleW9uZCB0aGF0IGdvZXMgaW4gdGhlIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBmaWVsZCBhcyBhIGNhdGNoLWFsbCBmb3IgbWFueSBleHRyYSBvcHRpb25zLjwvcD4NCjxwPlVuZm9ydHVuYXRlbHksIHVzaW5nIG9uZSBmaWVsZCBmb3IgbWFueSBwdXJwb3NlcyBpbXBsaWVzIHN0aWNraW5nIHRvIHNvbWUgY29udmVudGlvbnMuIFRvIHRoaXMgZW5kLCB3aGVuIHNwZWNpZnlpbmcgb3B0aW9ucyBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdDo8L3A+DQo8cHJlPg0Kb3B0aW9uTmFtZTE9b3B0aW9uVmFsdWUxOw0Kb3B0aW9uTmFtZTI9b3B0aW9uVmFsdWUyOw0KLi4uDQo8L3ByZT4NCjxwPk5vIHF1b3RlcyBhcmUgbmVjZXNzYXJ5IGFyb3VuZCB0aGUgb3B0aW9uIHZhbHVlcyBhcyB0aGUgcGx1Z2luIHdpbGwgcHV0IHRoZW0gaW4gZm9yIHlvdSwgdGhvdWdoIGl0IGRvZXMgbm8gaGFybSB0byBpbmNsdWRlIHRoZW0uIEFuZCBhbHRob3VnaCBzcGFjZXMgYW5kIG5ld2xpbmVzIGFyZSBhbHNvIG9wdGlvbmFsLCBpdCdsbCBoZWxwIGtlZXAgeW91ciBzYW5pdHkgaWYgeW91IGRvIHRoaW5ncyB0aGlzIHdheSEgSnVzdCBub3RlIHRoYXQgZXZlcnkgb3B0aW9uPXZhbHVlIHBhaXIgZW5kcyB3aXRoIGEgc2VtaWNvbG9uICc7JzwvcD4NCjxwPlsgSXQgaXMgcHJvYmFibHkgYmVzdCB0byBzZXQgYXNpZGUgYSBzcGVjaWZpYyBjYXRlZ29yeS9zdWItY2F0ZWdvcnkgZmlsZSB0cmVlIGZvciB5b3VyIGJhbm5lcnMgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGJlIGhpamFja2luZyB0aGUgZGVzY3JpcHRpb24gZmllbGQgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gaXQgd2FzIGludGVuZGVkLiBdPC9wPg0KDQo8aDMgaWQ9ImZpbGV3b3JrcyI+SG93IGl0IHdvcmtzOiBNSU1FIHR5cGVzPC9oMz4NCjxwPk1JTUUgdHlwZXMgcnVsZTsgZXhjZXB0IHRoZSB0b29scyB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaCBmaWxlIGlzIG9mIHdoYXQgdHlwZSBhcmUgb2Z0ZW4gZXh0ZW5zaW9ucyBhbmQgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgaW5zdGFsbGVkIG9uIGV2ZXJ5IHNlcnZlci4gU28gd2UgaGF2ZSB0byB1c2UgdGhlIG5leHQgYmVzdCB0aGluZzogdGhlIGZpbGUgZXh0ZW5zaW9uLiBZZXMgaXQgY2FuIGJlIG1pc2xlYWRpbmcsIGJ1dCB3ZSdyZSBzdHVjayB3aXRoIGl0LjwvcD4NCjxwPkZpcnN0IHRoaW5ncyBmaXJzdDogb25jZSBhIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQgYmFzZWQgb24geW91ciBvcHRpb25zLCB0aGUgcGx1Z2luIGxvb2tzIGF0IGl0cyBmaWxlIGV4dGVuc2lvbi4gQmFzZWQgb24gdGhhdCBpdCB1c2VzIGEgbG9va3VwIHRhYmxlIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBNSU1FIHR5cGUgYW5kICZsdDtvYmplY3QmZ3Q7IHRhZyB0ZW1wbGF0ZS4gVGhlIE1JTUUgdHlwZSBpcyBvdmVycmlkYWJsZSBvbiBhIHBlci1maWxlIGJhc2lzIGJ1dCB0aGUgdGVtcGxhdGVzIGFyZSBhbGwgaGFyZC1jb2RlZCBmb3Igbm93LiBUaGUgbmV4dCByZXZpc2lvbiBvZiB0aGUgcGx1Z2luIHdpbGwgYWxsb3cgdGhlbSB0byBiZSBleHRlbmRlZC9tb2RpZmllZCB2aWEgcGx1Z2luIG9wdGlvbnMgYW5kIHRvIGFsc28gYWRkIGluIGN1c3RvbSBNSU1FIHR5cGVzLiBXaXRoIGx1Y2suPC9wPg0KPHA+Rm9yIG5vdywgdGhlIG1vc3QgY29tbW9uIHRoaW5ncyBsaWtlIEZsYXNoIGZpbGVzLCBBVkkvTU9WL01QRy9XTVYgbW92aWVzIGFuZCBldmVuIHNvbWUgYXVkaW8gZm9ybWF0cyBsaWtlIFdBVi9PR0cvT1BUSU1GUk9HL0ZMQUMgYXJlIHN1cHBvcnRlZCAoYXVkaW8gYmFubmVycyBhbnlvbmU/ISkgQW5kIHRoZSBnb29kIG5ld3MgaXMgaXQgc2hvdWxkIGJlIGZhaXJseSBhdXRvbWF0aWMgKGlmIGl0IGlzbid0LCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2NvbW1lbnRGb3JtIj5nZXQgaW4gdG91Y2g8L2E+IGFuZCBzdWdnZXN0IGJldHRlciB0ZW1wbGF0ZXMgZm9yIHRoZSBuZXh0IHJldmlzaW9uKS48L3A+DQo8cD5UaGUga2V5IHRvIGl0IGlzIGFsbG93aW5nIG92ZXJyaWRhYmxlIG9wdGlvbnMuIFRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy90YWdfb2JqZWN0LmFzcCI+SFRNTCBvYmplY3QgdGFnPC9hPiBjb250YWlucyBhIGhvc3Qgb2YgYXR0cmlidXRlcywgYWxsIG9mIHdoaWNoIHlvdSBjYW4gb3ZlcnJpZGUgYnkgc3BlY2lmeWluZyB0aGVtIGFzIG9wdGlvbj12YWx1ZSBwYWlycyBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQgb2YgdGhhdCBwYXJ0aWN1bGFyIGZpbGUuIFNlZSA8YSBocmVmPSIjZmVnMSI+ZXhhbXBsZSAxIDwvYT4gYW5kIDxhIGhyZWY9IiNmZWcyIj4yPC9hPiBmb3IgbW9yZS48L3A+DQo8cD5BbnkgYXR0cmlidXRlcyB0aGF0IG1hdGNoIHRoZSBuYW1lcyBpbiB0aGUgSFRNTCBzcGVjIGNhbiBiZSB1c2VkLiBUaGVzZSBhcmUgdGhlIGNvcmUgb25lcyB0aGF0IHRoZSBwbHVnaW4gd2lsbCBzZWxlY3QgZm9yIHlvdSBpZiB5b3UgZG8gbm90IHNwZWNpZnkgeW91ciBvd24gaW4gdGhlIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBmaWVsZDo8L3A+DQo8dWw+DQo8bGk+PGNvZGU+ZGF0YT08L2NvZGU+IHRoZSBVUkwgdG8gdGhlIGZpbGUgaXRzZWxmLiBUYWtlcyB0aGUgZmlsZSdzIFVSTCBmcm9tIHRoZSBUWFAgZGF0YWJhc2UgYnkgZGVmYXVsdCwgb3IgaXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgeW91PC9saT4NCjxsaT48Y29kZT50eXBlPTwvY29kZT4gdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS4gQWdhaW4sIHVzZXMgdGhlIGxvb2t1cCB0YWJsZS4gSWYgaXQgY2hvb3NlcyB3cm9uZ2x5IG9yIHlvdSB3YW50IGEgZmFuY2lmdWwgdHlwZSBub3QgaW5jbHVkZWQsIG92ZXJyaWRlIGl0PC9saT4NCjxsaT48Y29kZT53aWR0aD08L2NvZGU+IHRoZSBob3Jpem9udGFsIHNjcmVlbiByZWFsIGVzdGF0ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBvY2N1cHkuIEJ5IGRlZmF1bHQgaXQgdGFrZXMgdGhlIHZhbHVlcyBvbiBhIHBlci1sYW5ndWFnZSBiYXNpcyAoaWYgTUxQIGlzIGluc3RhbGxlZCkgYmVjYXVzZSBjb250ZW50IG9mdGVuIHZhcmllcyBmcm9tIGNvdW50cnkgdG8gY291bnRyeS4gV2l0aG91dCBNTFAgaXQncyAzMDBweCBzbyB5b3UgcHJvYmFibHkgc2hvdWxkIG92ZXJyaWRlIHRoaXM8L2xpPg0KPGxpPjxjb2RlPmhlaWdodD08L2NvZGU+IHRoZSB2ZXJ0aWNhbCBzY3JlZW4gcmVhbCBlc3RhdGUgdGhlIG9iamVjdCB0YWtlcyB1cC4gTUxQLWF3YXJlLCBhcyBhYm92ZTwvbGk+DQo8bGk+PGNvZGU+aWQ9PC9jb2RlPiBUaGUgdW5pcXVlIElEIGZvciB0aGUgb2JqZWN0LiBJZiBub3Qgb3ZlcnJpZGVuLCB3aWxsIGRlZmF1bHQgdG8gImlkIiBwbHVzIGEgcmFuZG9tIG51bWJlci48L2xpPg0KPC91bD4NCg0KPHA+VGhlIG90aGVyIG9wdGlvbnMgYXJlIHRvbyBudW1lcm91cyB0byBsaXN0LCBidXQgVzNTY2hvb2xzIG9yIEdvb2dsZSB3aWxsIGhlbHAgeW91IGZpbmQgdGhlbSBpZiB5b3UgbmVlZCB0aGVtLjwvcD4NCjxwPkFueSA8Y29kZT5vcHRpb249dmFsdWU8L2NvZGU+IHBhaXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gZmllbGQgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgY29yZSBzcGVjIGlzIGFzc3VtZWQgdG8gYmUgYSAmbHQ7cGFyYW0mZ3Q7IHRhZyB3aXRoaW4gdGhlIG9iamVjdCBpdHNlbGYuIFVzZSB0aGlzIGZhY2lsaXR5IHRvIHNwZWNpZnkgYW55IGV4dHJhIG9wdGlvbnMgeW91ciBjaG9zZW4gZmlsZSB0eXBlIHJlcXVpcmVzIHRvIG9wZXJhdGUgY29ycmVjdGx5LjwvcD4NCg0KPGgzIGlkPSJmaWxlYXR0cyI+RmlsZSBtb2RlIGF0dHJpYnV0ZXM8L2gzPg0KPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHdvcmsgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhleSBkbyBpbiA8YSBocmVmPSIjaW1nbW9kZSI+aW1hZ2UgbW9kZTwvYT4gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgZXZlcnl3aGVyZSBpdCBtZW50aW9ucyAnaW1hZ2UnIHlvdSBjYW4gc3Vic3RpdHV0ZSAnZmlsZSc6PC9wPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiNtb2RlIj5tb2RlPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2NhdGVnb3J5Ij5jYXRlZ29yeTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNzdWJjYXRzIj5zdWJjYXRzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI21hdGNodGV4dCI+bWF0Y2hfdGV4dDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW1pdCI+bGltaXQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjYWx3YXlzZGlzcGxheSI+YWx3YXlzX2Rpc3BsYXk8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjbGlua3ByZWZpeCI+bGlua19wcmVmaXg8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjcmVmZXJlciI+cmVmZXJlcjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyYXd1cmwiPnJhd191cmw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGFyZ2V0Ij50YXJnZXQ8L2E+PC9saT4NCjwvdWw+DQoNCjxwPlRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIGlnbm9yZWQgaW4gdGhpcyBtb2RlOjwvcD4NCjx1bD4NCjxsaT48YSBocmVmPSIjdGh1bWIiPnRodW1iPC9hPjwvbGk+DQo8L3VsPg0KDQo8cD5BbmQgdGhlc2Ugb3B0aW9ucyB3b3JrIGRpZmZlcmVudGx5LCBvciBhcmUgc3BlY2lmaWMgdG8gdGhpcyBtb2RlOjwvcD4NCg0KPGgzIGlkPSJmaWxlY29tcGFyZXRvIj48Y29kZT5jb21wYXJlX3RvPC9jb2RlPiAoZmlsZSBtb2RlKTwvaDM+DQo8cD5EZWNsYXJlIHdoaWNoIGZpZWxkcyBvZiB0aGUgZmlsZSB0aGUgcGx1Z2luIGxvb2tzIHdoZW4gbWF0Y2hpbmcgb3IgYXZvaWRpbmcgdGV4dC4gQnkgZGVmYXVsdCBpdCB1c2VzIGp1c3QgdGhlIGZpbGUgbmFtZSwgYnV0IGl0IGNhbiBiZSBleHRlbmRlZCB0byBlbmNvbXBhc3MgYW55IG9mIHRoZSBmb2xsb3dpbmc6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPmZpbGVuYW1lPC9jb2RlPjxiciAvPg0KdGhlIGRlZmF1bHQ6IGxvb2sgYXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIGFuZCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNtYXRjaHRleHQiPm1hdGNoX3RleHQ8L2E+IHRoZW4gYWRkIGl0IHRvIHRoZSBwb29sLiBDb252ZXJzZWx5LCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+IHRoZW4gaWdub3JlIHRoZSBmaWxlPC9saT4NCjxsaT48Y29kZT5kZXNjcmlwdGlvbjwvY29kZT48YnIgLz4NCmxvb2sgYXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlIGFuZCBpbmNsdWRlL2V4Y2x1ZGUgaXQgYmFzZWQgb24gdGhlIHdvcmRzIGluIG1hdGNoX3RleHQvYXZvaWRfdGV4dDwvbGk+DQo8bGk+PGNvZGU+c3RhdHVzPC9jb2RlPjxiciAvPg0KaWYgdGhlIG51bWVyaWMgZGlzcGxheSBzdGF0dXMgb2YgdGhlIGZpbGUgbWF0Y2hlcyAoZm9yIG1hdGNoX3RleHQpIG9yIGRvZXMgbm90IG1hdGNoIChmb3IgYXZvaWRfdGV4dCkgYW55IG51bWJlcnMsIGluY2x1ZGUvZXhjbHVkZSB0aGlzIGZpbGUgZnJvbSB0aGUgcG9vbDwvbGk+DQo8bGk+PGNvZGU+c2l6ZTwvY29kZT48YnIgLz4NCihvZiBsaW1pdGVkIHVzZSkgaWYgdGhlIGZpbGUgaXMgb2YgYSBwYXJ0aWN1bGFyIHNpemUgKGZvciBtYXRjaF90ZXh0KSBvciBub3Qgb2YgYSBwYXJ0aWN1bGFyIHNpemUgKGZvciBhdm9pZF90ZXh0KSwgaW5jbHVkZS9leGNsdWRlIHRoaXMgZmlsZSBmcm9tIHRoZSBwb29sPC9saT4NCjxsaT48Y29kZT5jYXRlZ29yeTwvY29kZT48YnIgLz4NCmFzIHdpdGggaW1hZ2UgbW9kZSwgdGhpcyBtYXkgbm90IGJlIG9mIG11Y2ggdXNlICh0aGUgPGEgaHJlZj0iI2NhdGVnb3J5Ij5jYXRlZ29yeTwvYT4gb3B0aW9uIGNhbiBiZSB1c2VkIGluc3RlYWQpLCBidXQgeW91IG1heSBzcGVjaWZ5IHRoZSBjYXRlZ29yeSBhcyBhIHBsYWNlIHRvIGxvb2sgZm9yIHBhcnRpY3VsYXIgd29yZHM8L2xpPg0KPC91bD4NCg0KPGgzIGlkPSJmaWxlbGlua2luIj48Y29kZT5saW5rX2luPC9jb2RlPiAoZmlsZSBtb2RlKTwvaDM+DQo8cD5NYWtlcyB0aGUgYmFubmVyIGZpbGUgY2xpY2thYmxlIGJ5IHNwZWNpZnlpbmcgd2hpY2ggZmllbGQgb2YgdGhlIGZpbGUgdGhlIFVSTCBpcyBzdG9yZWQuIENhbiBjdXJyZW50bHkgb25seSBiZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4uIERlZmF1bHQ6IG9taXR0ZWQgKG5vIGxpbmspPC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPjxiciAvPg0KdGVsbCB0aGUgcGx1Z2luIHRvIG1ha2UgdGhlIGZpbGUgYmFubmVyIGNsaWNrYWJsZS4gVGhlIGRlc3RpbmF0aW9uIFVSTCBpcyBmb3VuZCBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQgb2YgdGhlIGZpbGUgYXMgYW4gb3B0aW9uPXZhbHVlIHBhaXIgbGlrZSB0aGlzOiA8Y29kZT5saW5rX3VybD1odHRwOi8vbXkuZG9tYWluLmNvbS9wbGFjZS90by92aXNpdC5waHA7PC9jb2RlPg0KPGJyIC8+QXMgd2l0aCB0aGUgPGEgaHJlZj0iI2ltZ2xpbmtpbiI+aW1hZ2UgbW9kZSBsaW5rX2luPC9hPiBhIGZ1bGwgVVJMIGJlZ2lubmluZyBodHRwOi8vIHdpbGwgYmUgdXNlZCB2ZXJiYXRpbSwgYW55dGhpbmcgYmVnaW5uaW5nIHdpdGggYSAnLycgd2lsbCBhc3N1bWUgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHNpdGUgcm9vdCBhbmQgZXZlcnl0aGluZyBlbHNlIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VjdGlvbi9hcnRpY2xlLjwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImZpbGVpbWdjbGFzcyI+PGNvZGU+aW1nY2xhc3M8L2NvZGU+IChmaWxlIG1vZGUpPC9oMz4NCjxwPkFsdGhvdWdoIHNsaWdodGx5IG1pc2xlYWRpbmcgYXMgYSBuYW1lZCBvcHRpb24sIHRoaXMgZ2l2ZXMgYW4gb3ZlcmFsbCBDU1MgY2xhc3MgYXBwbGllZCB0byBlYWNoIGJhbm5lciBmaWxlJ3MgJmx0O29iamVjdCZndDsgdGFnLiBEZWZhdWx0OiBlbXB0eSAoaS5lLiBubyBjbGFzcykuIENhbiBiZSBvdmVycmlkZGVuIG9uIGEgZmlsZS1ieS1maWxlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgdGhlIHZhbHVlIDxjb2RlPmNsYXNzPW15Q2xhc3NOYW1lOzwvY29kZT4gaW4gdGhlIGRlc2NyaXB0aW9uIGZpZWxkIG9mIGFueSBmaWxlLjwvcD4NCg0KPGgzIGlkPSJjb3VudGRvd25sb2FkcyI+PGNvZGU+Y291bnRfZG93bmxvYWRzPC9jb2RlPjwvaDM+DQo8cD5CeSBkZWZhdWx0IGV2ZXJ5IHRpbWUgYSBiYW5uZXIgZmlsZSBpcyBzZXJ2ZWQsIHRoZSBhc3NvY2lhdGVkIGNvdW50ZXIgZm9yIHRoYXQgZmlsZSBpcyBpbmNyZW1lbnRlZC4gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBkZXNpcmFibGUgc28gaXQgY2FuIGJlIHR1cm5lZCBvZmYgaGVyZS48L3A+DQo8cD5UaGUgcmVhc29uIGl0IGlzIGFuIG9wdGlvbiBpcyBiZWNhdXNlIGl0IGNhbiBpbiBzb21lIGNpcmN1bXN0YW5jZXMgbGVhZCB0byBtaXNsZWFkaW5nIHJlc3VsdHMuIEZvciBleGFtcGxlLCBhIGNlcnRhaW4gYnJvd3NlciB0aGF0IHNoYWxsIHJlbWFpbiBuYW1lbGVzcyByZXF1aXJlcyBhbiAmbHQ7b2JqZWN0Jmd0OyB0YWcgdG8gbm90IG9ubHkgaGF2ZSBhIDxjb2RlPmRhdGE9PC9jb2RlPiBvcHRpb24gYnV0IGFsc28gYSA8Y29kZT5tb3ZpZT08L2NvZGU+IHBhcmFtZXRlciB3aGVuIHNlcnZpbmcgRmxhc2ggY29udGVudC4gV2l0aCBvbmx5IG9uZSBvZiB0aGVzZSBzcGVjaWZpZWQsIHRoZSBmaWxlIHdpbGwgbm90IHBsYXk7IHlldCB3aXRoIGJvdGggdGhlIGZpbGUgaXMgZG93bmxvYWRlZCA8ZW0+dHdpY2U8L2VtPiBhbmQgdGhlIGRvd25sb2FkIGNvdW50ZXIgZ29lcyB1cCBieSB0d28uIFNvIHRoZSBudW1iZXIgb2YgdmlzaXRvcnMgeW91IGhhdmUgdXNpbmcgdGhpcyBicm93c2VyIG1heSBza2V3IHlvdXIgZG93bmxvYWQgc3RhdHMuIElmIHlvdXIgYm9zcyBsaWtlcyB0byByZWx5IG9uIHN1Y2ggdmFsdWVzIGl0IG1pZ2h0IGJlIGJlc3QgdG8gdHVybiB0aGUgb3B0aW9uIG9mZiBhbmQga2VlcCBxdWlldCE8L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+MTwvY29kZT48YnIgLz4NCk9uICh0aGUgZGVmYXVsdCBpZiBvbWl0dGVkKTogZXZlcnkgdGltZSB0aGUgYmFubmVyIGlzIHNlcnZlZCwgdGhlIGRvd25sb2FkIGNvdW50ZXIgb24gdGhlIEZpbGVzIHRhYiB3aWxsIGluY3JlbWVudDwvbGk+DQo8bGk+PGNvZGU+MDwvY29kZT48YnIgLz4NCk9mZjogZXZlcnkgdGltZSB0aGUgYmFubmVyIGlzIHNlcnZlZCwgdGhlIGRvd25sb2FkIGNvdW50ZXIgb24gdGhlIEZpbGVzIHRhYiB3aWxsIDxlbT5ub3Q8L2VtPiBiZSBpbmNyZW1lbnRlZC4gVGhpcyBtYXkgb3IgbWF5IG5vdCByZXF1aXJlIHVzZSBvZiB0aGUgPGEgaHJlZj0iI2ZpbGVzZGlyIj5maWxlc19kaXI8L2E+IG9wdGlvbiBpZiB5b3UgaGF2ZSBjaGFuZ2VkIHlvdXIgZGVmYXVsdCB0ZXh0cGF0dGVybiBkaXJlY3Rvcnkgc3RydWN0dXJlLjwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImZpbGVzZGlyIj48Y29kZT5maWxlc19kaXI8L2NvZGU+PC9oMz4NCjxwPldoZW4gdGhlIDxhIGhyZWY9IiNjb3VudGRvd25sb2FkcyI+Y291bnRfZG93bmxvYWRzPC9hPiBhdHRyaWJ1dGUgaXMgdHVybmVkIG9mZiwgZmlsZXMgYXJlIHNlcnZlZCBieSBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIFVSTCBvZiB0aGUgPGNvZGU+ZmlsZXM8L2NvZGU+IGRpcmVjdG9yeS4gVGhpcyBpcyB1c3VhbGx5IDxlbT5odHRwOi8veW91cmRvbWFpbi5jb20vZmlsZXM8L2VtPi4gSWYgeW91IGhhdmUgY2hhbmdlZCB5b3VyIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIHRoZSBmaWxlcyBkaXJlY3RvcnkgaXMgc29tZXdoZXJlIGVsc2Ugb3IgY2FsbGVkIHNvbWV0aGluZyBlbHNlLCBzcGVjaWZ5IGl0IHdpdGggdGhpcyBvcHRpb24uIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZpbGVzPC9jb2RlPi48L3A+DQoNCjxoMj48YSBpZD0iZmlsZWV4YW1wbGVzIj48L2E+RmlsZSBtb2RlIGV4YW1wbGVzPC9oMj4NCjxwPlRvIGhpZ2hsaWdodCB0aGUgZmVhdHVyZXMsIHdlIGFyZSBnb2luZyB0byB1c2UgdGhlIHNhbWUgem9vIHdlYiBzaXRlIGFzIGluIHRoZSA8YSBocmVmPSIjaW1nZXhhbXBsZXMiPkltYWdlIG1vZGUgZXhhbXBsZXM8L2E+LiBUaGlzIHRpbWUgeW91IGhhdmUgdXBsb2FkZWQgYSBmZXcgU2hvY2t3YXZlIEZsYXNoIGRvY3VtZW50cyBhYm91dCB2YXJpb3VzIGFuaW1hbHMgYW5kIGEgY291cGxlIG9mIHNob3J0IG1vdmllcyBhYm91dCBjaGVldGFocyB1bmRlciBhIGZpbGUgY2F0ZWdvcnkgY2FsbGVkICJhbmltYWxzIi4gVGhlIG1vdmllcyBhcmUgc3ViLWNhdGVnb3Jpc2VkIGFzIGJlZm9yZS4gVGhlIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBmaWVsZCBvZiBlYWNoIGZpbGUgaG9sZHMgYSB1cmwgdG8gYW4gYXJ0aWNsZSBhYm91dCBlYWNoIGFuaW1hbCB1c2luZyA8Y29kZT5saW5rX3VybD0vYW5pbWFscy9hbmltYWxOYW1lOzwvY29kZT48L3A+DQoNCjxwPllvdSBjYW4gZG8gYWxsIHRoZSBzYW1lIHRoaW5ncyBhcyBpbiBpbWFnZSBtb2RlIHRvIGNob29zZSB3aGljaCBmaWxlcyBtYXRjaCB3aGF0IHRleHQvY2F0ZWdvcmllcyBzbyB3ZSdsbCBub3QgY292ZXIgdGhhdCBoZXJlLiBPbmx5IHRoZSBuZXcgb3B0aW9ucyBhcmUgY292ZXJlZCBvciB3aGVyZSBhbiBvcHRpb24gZGlmZmVycyBzaWduaWZpY2FudGx5LjwvcD4NCg0KPGgzIGlkPSJmZWcxIj5FeGFtcGxlIDE8L2gzPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIG1vZGU9ImZpbGUiIGNhdGVnb3J5PSJhbmltYWxzIiBhdm9pZF90ZXh0PSI/a2V5d29yZHMiDQogICAgIGNvbXBhcmVfdG89ImZpbGVuYW1lLCBkZXNjcmlwdGlvbiIgc3ViY2F0cz0iMSIgLyZndDs8L3ByZT4NCg0KPHA+RmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZC4gUGlja3MgYW55IGZpbGUgaW4gdGhlIGNhdGVnb3J5IGNhbGxlZCAnYW5pbWFscycgdGhhdCBkb2VzIG5vdCBjb250YWluIGFueSBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3Mga2V5d29yZHMgaW4gaXRzIGZpbGVuYW1lIG9yIGRlc2NyaXB0aW9uIGZpZWxkcy48L3A+DQo8cD5Bc3N1bWluZyBpdCBzZWxlY3RzIGEgc2hvY2t3YXZlIGZsYXNoIGZpbGUsIHRoZSB0YWcgaXQgb3V0cHV0cyBtaWdodCBiZTo8L3A+DQoNCjxwcmU+DQombHQ7b2JqZWN0IGRhdGE9Imh0dHA6Ly9teWdyZWF0em9vLmNvbS9maWxlX2Rvd25sb2FkLzIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIg0KICAgICAgIHdpZHRoPSIzMDAiIGhlaWdodD0iNzUiIGlkPSJpZDc0NjU4OTMiJmd0Ow0KJmx0O3BhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iaHR0cDovL215Z3JlYXR6b28uY29tL2ZpbGVfZG93bmxvYWQvMiIgLyZndDsNCiZsdDsvb2JqZWN0Jmd0Ow0KPC9wcmU+DQoNCjxoMyBpZD0iZmVnMiI+RXhhbXBsZSAyPC9oMz4NCjxwPlVzaW5nIHRoZSBzYW1lIGV4YW1wbGUgYXMgaW4gPGEgaHJlZj0iI2ZlZzEiPmV4YW1wbGUgMTwvYT4sIGlmIHlvdSBnbyB0byB0aGUgRmlsZXMgdGFiLCBzZWxlY3QgdGhlIEZsYXNoIGZpbGUgaXQgY2hvc2UgYW5kIGVkaXQgdGhlIGRlc2NyaXB0aW9uIGZpZWxkIHRvIHJlYWQ6PC9wPg0KDQo8cHJlPg0KbG9vcD1mYWxzZTsNCndpZHRoPTQ1MDsNCmNvZGViYXNlPWh0dHA6Ly9teWdyZWF0em9vLmNvbS87DQppZD0iem9vYmplY3QiOw0Kc3RhbmRieT0ibG9hZGluZy4uLiI7DQpiZ2NvbG9yPSMwMDY4MDA7DQo8L3ByZT4NCg0KPHA+VGhlbiB5b3Ugd291bGQgZ2V0IGFuIG9iamVjdCB0YWcgdGhhdCByZXNlbWJsZWQgdGhpczo8L3A+DQoNCjxwcmU+DQombHQ7b2JqZWN0IGRhdGE9Imh0dHA6Ly9teWdyZWF0em9vLmNvbS9maWxlX2Rvd25sb2FkLzIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIg0KICAgICAgIHdpZHRoPSI0NTAiIGhlaWdodD0iNzUiIGlkPSJ6b29iamVjdCImZ3Q7DQombHQ7cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJodHRwOi8vbXlncmVhdHpvby5jb20vZmlsZV9kb3dubG9hZC8yIiAvJmd0Ow0KJmx0O3BhcmFtIG5hbWU9Imxvb3AiIHZhbHVlPSJmYWxzZSIgLyZndDsNCiZsdDtwYXJhbSBuYW1lPSJjb2RlYmFzZSIgdmFsdWU9Imh0dHA6Ly9teWdyZWF0em9vLmNvbS8iIC8mZ3Q7DQombHQ7cGFyYW0gbmFtZT0ic3RhbmRieSIgdmFsdWU9ImxvYWRpbmcuLi4iIC8mZ3Q7DQombHQ7cGFyYW0gbmFtZT0iYmdjb2xvciIgdmFsdWU9IiMwMDY4MDAiIC8mZ3Q7DQombHQ7L29iamVjdCZndDsNCjwvcHJlPg0KDQo8cD5Ib3BlZnVsbHkgeW91IGNhbiBzZWUgdGhhdCBpdCdzIHF1aXRlIGZsZXhpYmxlIGFuZCBzaG91bGQgYWxsb3cgeW91IHRvIHR3ZWFrIGFueSBjb250ZW50IHRvIHBsYXkgaW4gbW9zdCBicm93c2Vycy48L3A+DQoNCjxoMyBpZD0iZmVnMyI+RXhhbXBsZSAzPC9oMz4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBtb2RlPSJmaWxlIiBjYXRlZ29yeT0iYW5pbWFscyIgbWF0Y2hfdGV4dD0iY2hlZXRhaCINCiAgICAgc3ViY2F0cz0iMSIgbGlua19pbj0iZGVzY3JpcHRpb24iIGltZ2NsYXNzPSJmbG9iamVjdHMiIC8mZ3Q7PC9wcmU+DQoNCjxwPklmIG9uZSBvZiB0aGUgcm93cyBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQgb2YgdGhlIDxjb2RlPmNoZWV0YWhfY2hhc2luZ19kZWVyLndtdjwvY29kZT4gZmlsZSBpcyA8Y29kZT51cmxfbGluaz0vYW5pbWFscy9jaGVldGFoLWNoYXNpbmctZGVlcjwvY29kZT4gdGhlbiBjbGlja2luZyBvbiB0aGUgZW1iZWRkZWQgbW92aWUgd2lsbCB0YWtlIHRoZSB2aXNpdG9yIHRvIHRoYXQgYXJ0aWNsZS4gSW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsIGF0dHJpYnV0ZXMsIHRoaXMgYW5kIGFsbCBvYmplY3RzIGRpc3BsYXllZCBieSB0aGUgcGx1Z2luIHdpbGwgdGFrZSBvbiBhIDxjb2RlPmNsYXNzPSJmbG9iamVjdHMiPC9jb2RlPiBhdHRyaWJ1dGUuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gb24gYSBmaWxlLWJ5LWZpbGUgYmFzaXMgYnkgYWRkaW5nIDxjb2RlPmNsYXNzPSJhbm90aGVyQ2xhc3NOYW1lIjs8L2NvZGU+IGFzIGFuIGVudHJ5IGluIHRoZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gZmllbGQuPC9wPg0KDQo8aDI+PGEgbmFtZT0iY3JlZGl0cyI+PC9hPkNyZWRpdHM8L2gyPg0KDQo8cD5UaGlzIHBsdWdpbiB3YXMgb3JpZ2luYWxseSBiYXNlZCBvbiBkcnVfcmFuZG9tX2ltYWdlIGFuZCBwbGFnaWFyaXNlcyBpZGVhcyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD01MTc2Ij5Sb2IgU2FibGUncyByc3NfdGh1bWJwb3A8L2E+IGFuZCB2YXJpb3VzIFRYUGVycyBpbiB0aGUgY29tbXVuaXR5IHdobyBoYXZlIHN1Z2dlc3RlZCBmZWF0dXJlcyBhbmQgaW1wcm92ZW1lbnRzLiBNYW55IHRoYW5rcyB0byBhbGwgd2hvIGhhdmUgaGVscGVkIGNyYWZ0IHRoaXMgcGx1Z2luLjwvcD4NCiI7czo0OiJjb2RlIjtzOjE1Mjk0OiIvLyB2MC4xICBJbml0aWFsIHB1YmxpYyByZWxlYXNlDQovLyB2MC4xMSBBZGRlZCBQRlggdG8gcXVlcnkgKHRoYW5rcyBtZXJjdXJ5KQ0KLy8gdjAuMTIgRml4ZWQgaGVscCB0byBpbmNsdWRlIHRyYWlsaW5nIHNsYXNoZXMgKHRoYW5rcyB2aXR0b3JpbykNCi8vIHYwLjEzIFVucmVsZWFzZWQuIEFkZGVkIGxvb2tfaW49Y2F0ZWdvcnkgYW5kIHJlZmVyZXINCi8vIHYwLjE0IEFkZGVkIG1hdGNoX3RleHQgYW5kIHVzZV9hbHQgKHRoYW5rcyBsdWtlcGVybXNuKQ0KLy8gdjAuMTUgQWRkZWQgYWx3YXlzX2Rpc3BsYXkgYW5kIGxpbWl0ICh0aGFua3MgbHVrZXBlcm1zbikNCi8vIHYwLjE1YSBCdWdmaXggZm9yIGxpbmtjYXB0aW9uICh0aGFua3MgbWVyY3VyeSkNCi8vIHYwLjE2IFRpZ2h0ZW5lZCBpbWFnZSgpIHBhcmFtcyBmb3IgdHhwIHY0LjAuNCBjb21wbGlhbmNlDQovLyB2MC4xNyBBZGRlZCB0aHVtYiwgbGlua3ByZWZpeCBhbmQgbGlua2FsdCBvcHRpb25zDQovLyB2MC4xN2EgYmlkIG9wdGlvbiBub3cgd29ya3Mgd2l0aCBleGlzdGluZyB1cmwgcGFyYW1zICh0aGFua3MgUGFwdWFzcykNCi8vIHYwLjE4IEFkZGVkIGltZ2NsYXNzIG9wdGlvbiAodGhhbmtzIERpZ2l0YWxSZWFsbSkNCi8vIHYwLjIgIE1ham9yIG92ZXJoYXVsLiBBZGRlZCBzdWJjYXRlZ29yeSBzdXBwb3J0ICh0aGFua3MgbHVrZXBlcm1zbiBhbmQgc2FudGhlbykuIFVzZXMgc21kX2xpYi4gRW5oYW5jZWQgbWF0Y2hfdGV4dC9hdm9pZF90ZXh0IHNvIGxvb2tfaW4gaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZHJvcHBlZCB1c2VfYWx0IGFuZCBhZGRlZCBjb21wYXJlX3RvOyByZXBsYWNlZCBsaW5rY2FwdGlvbi9saW5rYWx0IHdpdGggbGlua19pbjsgYWRkZWQgaWRfcHJlZml4OyBsaW5rcHJlZml4IGlzIG5vdyBsaW5rX3ByZWZpeA0KLy8gdjAuMjEgQWRkZWQgTUxQKE11bHRpLUxpbmd1YWwgUGFjaykgc3VwcG9ydA0KLy8gdjAuMjIgQWRkZWQgcmF3X3VybCBvcHRpb24NCi8vIHYwLjIzIEFnYWluc3QgYmV0dGVyIGp1ZGdlbWVudCwgYWRkZWQgdGFyZ2V0IG9wdGlvbiAodGhhbmtzIGpzdHViYnMsIGNkdGF2aWppdCkNCi8vIHYwLjMgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGVzIGFzIHdlbGwgYXMgaW1hZ2VzIC0gZmluYWxseSwgdmlkZW8vc3dmIGJhbm5lcnMgYXJlIGEgcmVhbGl0eSENCi8vIHYwLjNhIEZpeGVkOiBpZiBjYXRlZ29yeT0iP2ZpZWxkIiBpcyBlbXB0eS9yZXR1cm5zIG5vIHJlc3VsdHMsIHBsdWdpbiB3aWxsIG5vIGxvbmdlciBkaXNwbGF5IGEgcmFuZG9tIGltYWdlIGZyb20gdGhlIGZ1bGwgcG9vbA0KDQpyZWdpc3Rlcl9jYWxsYmFjaygnc21kX3JiYW5fZW51bV9zdHInLCAnbDEwbi5lbnVtZXJhdGVfc3RyaW5ncycpOw0KZ2xvYmFsICRzbWRfcmJhbl9zdHI7DQokc21kX3JiYW5fc3RyID0gYXJyYXkoDQoJJ3dpZHRoJyA9PiAnMzAwJywNCgknaGVpZ2h0JyA9PiAnNzUnLA0KKTsNCg0KZnVuY3Rpb24gc21kX3JhbmRvbV9iYW5uZXIoJGF0dHMpIHsNCglyZXF1aXJlX3BsdWdpbignc21kX2xpYicpOw0KCWdsb2JhbCAkaW1nX2RpciwgJGZpbGVfYmFzZV9wYXRoLCAkc21kX3JiYW5fc3RyOw0KCWRlZmluZSgnRExNX1RSJywgJ0BAJyk7DQoJZGVmaW5lKCdETE1fUkVDJywgJ3wnKTsNCgkkY291bnRfZG93bmxvYWRzID0gdHJ1ZTsNCg0KCS8vICoqIGFsbG93YWJsZSBvcHRpb25zIChkZWZhdWx0IGxpc3RlZCBmaXJzdCkNCgkkY29tcGFyZVRvID0gYXJyYXkoImltYWdlOm5hbWUiLCJpbWFnZTppZCIsImltYWdlOmFsdCIsImltYWdlOmNhcHRpb24iLCJpbWFnZTpjYXRlZ29yeSIsImZpbGU6ZmlsZW5hbWUiLCJmaWxlOmNhdGVnb3J5IiwiZmlsZTpkZXNjcmlwdGlvbiIsImZpbGU6c3RhdHVzIiwiZmlsZTpzaXplIik7DQoJJGxpbmtJbiA9IGFycmF5KCIiLCJpbWFnZTpjYXB0aW9uIiwiaW1hZ2U6YWx0IiwiZmlsZTpkZXNjcmlwdGlvbiIpOw0KCSRtb2RlcyA9IGFycmF5KCJpbWFnZSIsImZpbGUiKTsNCg0KCS8vICoqIGxvb2t1cCB0YWJsZXMNCgkkaHRtbE9iakZpeGVkID0gYXJyYXkoImlkIiwiZGF0YSIsImhlaWdodCIsInR5cGUiLCJ3aWR0aCIpOw0KCSRodG1sT2JqUGFyYW0gPSBhcnJheSgiY2xhc3MiLCJ0aXRsZSIsInN0eWxlIiwiZGlyIiwibGFuZyIsInhtbDpsYW5nIiwiYWxpZ24iLCJhcmNoaXZlIiwiYm9yZGVyIiwiY2xhc3NpZCIsImNvZGViYXNlIiwiY29kZXR5cGUiLCJkZWNsYXJlIiwiaHNwYWNlIiwibmFtZSIsInN0YW5kYnkiLCJ1c2VtYXAiLCJ2c3BhY2UiKTsNCgkkb2JqTWltZVR5cGUgPSBhcnJheSgiYXZpIiA9PiBhcnJheSgidmlkZW8vYXZpIiwgIlZpZGVvIiksDQoJCQkJCQkJCSJmbGF8ZmxhYyIgPT4gYXJyYXkoImF1ZGlvL2ZsYWMiLCAiQXVkaW8iKSwNCgkJCQkJCQkJImZsdnxzd2YiID0+IGFycmF5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJGbGFzaCIpLA0KCQkJCQkJCQkiamF2YSIgPT4gYXJyYXkoImFwcGxpY2F0aW9uL3gtamF2YS1hcHBsZXQiLCAiQXBwIiksDQoJCQkJCQkJCSJtaWQiID0+IGFycmF5KCJhdWRpby94LW1pZGkiLCAiQXVkaW8iKSwNCgkJCQkJCQkJIm1vdiIgPT4gYXJyYXkoInZpZGVvL3F1aWNrdGltZSIsICJWaWRlbyIpLA0KCQkJCQkJCQkibXBnfG1wZWd8bXA0IiA9PiBhcnJheSgidmlkZW8vbXBlZyIsICJWaWRlbyIpLA0KCQkJCQkJCQkibXAyfG1wM3xtNGEiID0+IGFycmF5KCJhdWRpby9tcGVnIiwgIkF1ZGlvIiksDQoJCQkJCQkJCSJvZ3Z8b2dhfG9neHxvZ2ciID0+IGFycmF5KCJhcHBsaWNhdGlvbi9vZ2ciLCAiQXVkaW8iKSwNCgkJCQkJCQkJIm9mciIgPT4gYXJyYXkoImFwcGxpY2F0aW9uL3gtb2ZyIiwgIkF1ZGlvIiksDQoJCQkJCQkJCSJyYXxybSIgPT4gYXJyYXkoImF1ZGlvL3gtcG4tcmVhbHZpZGVvIiwgIlZpZGVvIiksDQoJCQkJCQkJCSJ3YXYiID0+IGFycmF5KCJhdWRpby94LXdhdiIsICJBdWRpbyIpLA0KCQkJCQkJCQkid212fHdtYXxhc2YiID0+IGFycmF5KCJ2aWRlby94LW1zLXdtdiIsICJBdWRpbyIpLA0KCQkJCQkJCQkpOw0KCSRvYmpUZW1wbGF0ZUZpeGVkID0gJ3R5cGU9IkBAdHlwZSIgZGF0YT0iQEBkYXRhIiB3aWR0aD0iQEB3aWR0aCIgaGVpZ2h0PSJAQGhlaWdodCIgQEBvdGhlcnMgJzsNCgkkb2JqVGVtcGxhdGUgPSBhcnJheSgNCgkJIkZsYXNoIiA9PiAkb2JqVGVtcGxhdGVGaXhlZC4gJ2lkPSJAQGlkIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJAQGRhdGEiIC8+JywNCgkJIkF1ZGlvIiA9PiAkb2JqVGVtcGxhdGVGaXhlZC4gJz48cGFyYW0gbmFtZT0ic3JjIiB2YWx1ZT0iQEBkYXRhIiAvPicsDQoJCSJWaWRlbyIgPT4gJG9ialRlbXBsYXRlRml4ZWQuICc+JywNCgkJKTsNCg0KCS8vICoqIHBsdWdpbiBvcHRpb25zDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoJJGNhdGlkb3B0cyA9IGlzc2V0KCRjYXRlZ29yeSkgPyB0cnVlIDogZmFsc2U7DQoJJGNhdGVnb3J5ID0gaXNzZXQoJGNhdGVnb3J5KSA/IGRvU2xhc2goJGNhdGVnb3J5KSA6ICIiOw0KCSRtYXRjaF90ZXh0ID0gaXNzZXQoJG1hdGNoX3RleHQpID8gJG1hdGNoX3RleHQgOiAiIjsNCgkkYXZvaWRfdGV4dCA9IGlzc2V0KCRhdm9pZF90ZXh0KSA/ICRhdm9pZF90ZXh0IDogIiI7DQoJJG1vZGUgPSAoaXNzZXQoJG1vZGUpICYmIGluX2FycmF5KCRtb2RlLCRtb2RlcykpID8gJG1vZGUgOiAkbW9kZXNbMF07DQoJJHJlZmVyZXIgPSBpc3NldCgkcmVmZXJlcikgPyAkcmVmZXJlciA6ICJiaWQiOw0KCSRsaW1pdCA9IGlzc2V0KCRsaW1pdCkgPyAkbGltaXQ6ICIxIjsNCgkkaW1nY2xhc3MgPSBpc3NldCgkaW1nY2xhc3MpID8gJGltZ2NsYXNzIDogIiI7DQoJJGlkX3ByZWZpeCA9IGlzc2V0KCRpZF9wcmVmaXgpID8gJGlkX3ByZWZpeCA6ICJhcnRpY2xlLSI7DQoJJGxpbmtfcHJlZml4ID0gaXNzZXQoJGxpbmtfcHJlZml4KSA/ICRsaW5rX3ByZWZpeCA6ICIiOw0KCSRsaW5rX2luID0gKGlzc2V0KCRsaW5rX2luKSAmJiBpbl9hcnJheSgkbW9kZS4iOiIuJGxpbmtfaW4sJGxpbmtJbikpID8gJGxpbmtfaW4gOiAkbGlua0luWzBdOw0KCSRzdWJjYXRzID0gaXNzZXQoJHN1YmNhdHMpID8gdHJ1ZSA6IGZhbHNlOw0KCSR0aHVtYiA9IGlzc2V0KCR0aHVtYikgPyB0cnVlIDogZmFsc2U7DQoJJHJhd191cmwgPSBpc3NldCgkcmF3X3VybCkgPyB0cnVlIDogZmFsc2U7DQoJJGFsd2F5c19kaXNwbGF5ID0gaXNzZXQoJGFsd2F5c19kaXNwbGF5KSA/IHRydWUgOiBmYWxzZTsNCgkkdGFyZ2V0ID0gaXNzZXQoJHRhcmdldCkgPyAnIHRhcmdldD0iJyAuJHRhcmdldC4gJyInIDogIiI7DQoJJGNvdW50X2Rvd25sb2FkcyA9IChpc3NldCgkY291bnRfZG93bmxvYWRzKSAmJiAkY291bnRfZG93bmxvYWRzPT0iMSIpID8gdHJ1ZSA6IGZhbHNlOw0KCSRmaWxlc19kaXIgPSBpc3NldCgkZmlsZXNfZGlyKSA/ICRmaWxlc19kaXIgOiAiZmlsZXMiOw0KDQoJLy8gRXhwZXJpbWVudGFsOiBuZWVkcyBxdW90ZS1hYmlsaXR5IGZpeGluZw0KCWlmIChpc3NldCgkdGVtcGxhdGVzKSkgew0KCQlmb3JlYWNoIChleHBsb2RlKCIsIiwgJHRlbXBsYXRlcykgYXMgJHRTdHJpbmcpIHsNCgkJCSR0SXRlbXMgPSBleHBsb2RlKCI6OiIsJHRTdHJpbmcpOw0KCQkJJG9ialRlbXBsYXRlW3RyaW0oJHRJdGVtc1swXSldID0gJG9ialRlbXBsYXRlRml4ZWQudHJpbSgkdEl0ZW1zWzFdKTsNCgkJfQ0KCX0NCg0KCSRjb21wYXJlVG9PcHRzID0gYXJyYXkoKTsNCglpZiAoaXNzZXQoJGNvbXBhcmVfdG8pKSB7DQoJCSRjdExpc3QgPSBwcmVnX3NwbGl0KCcvWyxcc10rLycsJGNvbXBhcmVfdG8sLTEsUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkY3RMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZihpbl9hcnJheSgkbW9kZS4iOiIuJGN0TGlzdFskaWR4XSwkY29tcGFyZVRvKSkgew0KCQkJCSRjb21wYXJlVG9PcHRzW10gPSAkY3RMaXN0WyRpZHhdOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmKGNvdW50KCRjb21wYXJlVG9PcHRzKSA8PSAwKSB7DQoJCS8vIEZpbmQgdGhlIGZpcnN0IGVudHJ5IG1hdGNoaW5nICRtb2RlIGFuZCB1c2UgdGhhdA0KCQlmb3JlYWNoICgkY29tcGFyZVRvIGFzICRjbXApIHsNCgkJCWlmIChzdHJwb3MoJGNtcCwgJG1vZGUuIjoiKSA9PT0gMCkgew0KCQkJCSRjb21wYXJlVG9PcHRzW10gPSBzdWJzdHIoJGNtcCxzdHJsZW4oJG1vZGUpKzEpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gKiogaW5pdCB2YXJpYWJsZXMNCgkkd2hlcmUgPSAiIjsNCgkkZmllbGRzID0gKCRtb2RlPT0iaW1hZ2UiKSA/ICJpZCwgZXh0LCBjYXB0aW9uLCBhbHQiIDogImlkLCBmaWxlbmFtZSwgZGVzY3JpcHRpb24sIHN0YXR1cywgc2l6ZSI7DQoJJGRiVGFibGUgPSAoJG1vZGU9PSJpbWFnZSIpID8gInR4cF9pbWFnZSIgOiAidHhwX2ZpbGUiOw0KCSRtYXRjaEFycmF5ID0gYXJyYXkoKTsNCgkkYXZvaWRBcnJheSA9IGFycmF5KCk7DQoJJG1hdGNoVmFycyA9IGFycmF5KCI/YyIsICI/cyIsICI/dCIsICI/aWQiLCAiP2ZpZWxkIik7DQoJJHdoZXJlQU5EID0gYXJyYXkoKTsNCg0KCS8vICoqIHByb2Nlc3MgbWF0Y2hfdGV4dA0KCWlmICgkbWF0Y2hfdGV4dCAhPSAiIiApIHsNCgkJLy8gQ29udmVydCB0aGUgc3RyaW5nIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJLy8gUHJvY2VzcyB0aGUgc3BlY2lhbCAoJz9zb21ldGhpbmcnKSBjYXNlcyB0b28uDQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRtYXRjaF90ZXh0LCAkbWF0Y2hWYXJzLCAkaWRfcHJlZml4KTsNCgkJJG1hdGNoQXJyYXkgPSAkcmV0QXJyYXlbMF07DQoNCgkJLy8gTWFrZSB1cCB0aGUgV0hFUkUgc3RhdGVtZW50IGZyb20gdGhlIGNvbWJpbmVkIGxpc3Qgb2YgbWF0Y2hlcy4NCgkJLy8gVGhlIGNhdGVnb3JpZXMvaW1hZ2UgSURzIGFyZSBPUmVkIHRvZ2V0aGVyIGluIGJyYWNrZXRzIGZpcnN0DQoJCS8vIGJlZm9yZSB0aGUgbmVnYXRpb24gb3B0aW9ucyBhcmUgdGFja2VkIG9uIGFzIEFORHMgYWZ0ZXJ3YXJkcw0KCQkkd2hlcmVUbXAgPSAiIjsNCgkJJHdoZXJlT1IgPSBhcnJheSgpOw0KDQoJCWlmIChjb3VudCgkbWF0Y2hBcnJheSkgPiAwKSB7DQoJCQlmb3JlYWNoICgkY29tcGFyZVRvT3B0cyBhcyAkY29tcCkgew0KCQkJCSRob2xkID0gYXJyYXkoKTsNCgkJCQlmb3IgKCRpZHggPSBjb3VudCgkbWF0Y2hBcnJheSk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQkJaWYgKGVtcHR5KCRtYXRjaEFycmF5WyRpZHhdKSkgew0KCQkJCQkJdW5zZXQoJG1hdGNoQXJyYXlbJGlkeF0pOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGhvbGRbXSA9ICRjb21wIC4gIiBMSUtFICclIiAuJG1hdGNoQXJyYXlbJGlkeF0uICIlJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHdoZXJlVG1wID0gaW1wbG9kZSgiIE9SICIsJGhvbGQpOw0KDQoJCQkJaWYgKHRyaW0oJHdoZXJlVG1wKSAhPSAiIikgew0KCQkJCQkkd2hlcmVPUltdID0gJHdoZXJlVG1wOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPUikgPiAwKSB7DQoJCQkkd2hlcmVBTkRbXSA9ICcoJyAuaW1wbG9kZSgiIE9SICIsJHdoZXJlT1IpLiAnKSc7DQoJCX0NCgl9DQoNCgkvLyAqKiBkbyB0aGUgc2FtZSBmb3IgYXZvaWRfdGV4dA0KCWlmICgkYXZvaWRfdGV4dCAhPSAiIiApIHsNCgkJLy8gQ29udmVydCB0aGUgc3RyaW5nIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJLy8gUHJvY2VzcyB0aGUgc3BlY2lhbCAoJz9zb21ldGhpbmcnKSBjYXNlcyB0b28uDQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRhdm9pZF90ZXh0LCAkbWF0Y2hWYXJzLCAkaWRfcHJlZml4KTsNCgkJJGF2b2lkQXJyYXkgPSAkcmV0QXJyYXlbMF07DQoNCgkJLy8gTWFrZSB1cCB0aGUgV0hFUkUgc3RhdGVtZW50IGZyb20gdGhlIGNvbWJpbmVkIGxpc3Qgb2YgTk9UIG1hdGNoZXMuDQoJCSR3aGVyZVRtcCA9ICIiOw0KCQkkd2hlcmVPUiA9IGFycmF5KCk7DQoNCgkJaWYgKGNvdW50KCRhdm9pZEFycmF5KSA+IDApIHsNCgkJCWZvcmVhY2ggKCRjb21wYXJlVG9PcHRzIGFzICRjb21wKSB7DQoJCQkJJGhvbGQgPSBhcnJheSgpOw0KCQkJCWZvciAoJGlkeCA9IGNvdW50KCRhdm9pZEFycmF5KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCQlpZiAoZW1wdHkoJGF2b2lkQXJyYXlbJGlkeF0pKSB7DQoJCQkJCQl1bnNldCgkYXZvaWRBcnJheVskaWR4XSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkaG9sZFtdID0gJGNvbXAgLiAiIExJS0UgJyUiIC4kYXZvaWRBcnJheVskaWR4XS4gIiUnIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkkd2hlcmVUbXAgPSBpbXBsb2RlKCIgT1IgIiwkaG9sZCk7DQoNCgkJCQlpZiAodHJpbSgkd2hlcmVUbXApICE9ICIiKSB7DQoJCQkJCSR3aGVyZU9SW10gPSAkd2hlcmVUbXA7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9SKSA+IDApIHsNCgkJCSR3aGVyZUFORFtdID0gJ05PVCAoJyAuaW1wbG9kZSgiIE9SICIsJHdoZXJlT1IpLiAnKSc7DQoJCX0NCgl9DQoNCgkvLyBXb3JrIG91dCB0aGUgY2F0ZWdvcmllcyB0byBzZWFyY2gNCgkkY2F0c2luID0gYXJyYXkoKTsNCgkkZnVsbENhdExpc3QgPSBhcnJheSgpOw0KCSRub3RDYXRMaXN0ID0gYXJyYXkoKTsNCgkkY2F0VmFycyA9IGFycmF5KCI/YyIsIj9pZCIsIj9zIiwiP3QiLCI/ZmllbGQiLCIhYyIsIiFpZCIsIiFzIiwiIXQiLCIhZmllbGQiKTsNCg0KCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRjYXRlZ29yeSwgJGNhdFZhcnMsICRpZF9wcmVmaXgpOw0KCSRmdWxsQ2F0TGlzdCA9ICRyZXRBcnJheVswXTsNCgkkbm90Q2F0TGlzdCA9ICRyZXRBcnJheVsxXTsNCg0KCS8vIGluY2x1ZGVkIGNhdGVnb3JpZXMNCgkkdG1wYSA9IGFycmF5KCk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsQ2F0TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoJHN1YmNhdHMpIHsNCgkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkZnVsbENhdExpc3RbJGlkeF0sJG1vZGUpOw0KCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkdG1wYVtdID0gIiciIC4kZnVsbENhdExpc3RbJGlkeF0uICInIjsNCgkJfQ0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkY2F0c2luW10gPSAiY2F0ZWdvcnkgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgl9DQoNCgkvLyBleGNsdWRlZCBjYXRlZ29yaWVzDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90Q2F0TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoJHN1YmNhdHMpIHsNCgkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkbm90Q2F0TGlzdFskaWR4XSwkbW9kZSk7DQoJCQlmb3IgKCRqZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRub3RDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgl9DQoJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJJGNhdHNpbltdID0gImNhdGVnb3J5IE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCX0NCg0KCWlmIChjb3VudCgkY2F0c2luKSA+IDApIHsNCgkJJHdoZXJlQ2F0ID0gaW1wbG9kZSgiIEFORCAiLCAkY2F0c2luKTsNCgl9IGVsc2Ugew0KCQkvLyBJc3N1ZSBhIG5vbi1leGlzdGVudCBjYXRlZ29yeSBpZiBhbGwgdGhlIHN1cHBsaWVkIGNhdGVnb3JpZXMgYXJlIGJvZ3VzLg0KCQkvLyBUaGlzIGVuc3VyZXMgbm8gbWF0Y2g6IHdpdGhvdXQgaXQsIHRoZSB3aG9sZSBpbWFnZSBwb29sIHdvdWxkIGJlIHVzZWQNCgkJJHdoZXJlQ2F0ID0gImNhdGVnb3J5IExJS0UgJyIgLiAoKCRjYXRpZG9wdHMpID8gInNtZCIubXRfcmFuZCgpIDogIiUiKSAuICInIjsNCgl9DQoNCgkvLyAqKiBtYWtlIHVwIHRoZSBmaW5hbCBXSEVSRSBzdGF0ZW1lbnQNCgkkd2hlcmVPQiA9ICIgT1JERVIgQlkgUkFORCgpIExJTUlUICRsaW1pdCI7DQoJJHdoZXJlID0gJHdoZXJlQ2F0IC4gKChjb3VudCgkd2hlcmVBTkQpPjApID8gIiBBTkQgIiAuaW1wbG9kZSgiIEFORCAiLCR3aGVyZUFORCkgOiAiIikgLiAkd2hlcmVPQjsNCg0KCS8vICoqIHB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgb2JqZWN0cw0KCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAkZGJUYWJsZSwgJHdoZXJlKTsNCglpZiAoISRycykgew0KCQlpZiAoJGFsd2F5c19kaXNwbGF5KSB7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJGRiVGFibGUsICR3aGVyZUNhdCAuICR3aGVyZU9CKTsNCgkJfQ0KCX0NCgkvLyAqKiBkaXNwbGF5IHRoZW0NCgkkc3RhdGljcHJlZml4ID0gImh0dHA6Ly8iOw0KCSRvdXRTdHIgPSAnJzsNCglpZigkcnMpIHsNCgkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJJGxpbmt1cmwgPSAnJzsNCgkJCSRsaW5rTmFtZSA9ICcnOw0KCQkJJHRyaW1PcHRzID0gIiBceDIyXHRcblxyXDBceDBCIjsNCgkJCSRvYmpQYXJhbXMgPSBhcnJheSgpOw0KCQkJJHRoZVBhcmFtcyA9IGFycmF5KCk7DQoJCQkkdGVtcGxhdGVPcHRpb25zID0gYXJyYXkoKTsNCgkJCXN3aXRjaCAoJG1vZGUpIHsNCgkJCQljYXNlICJpbWFnZSI6DQoJCQkJCSRsaW5rTmFtZT10cmltKCgkbGlua19pbj09ImFsdCIpID8gJHJvd1snYWx0J10gOiAoKCRsaW5rX2luPT0iY2FwdGlvbiIpID8gJHJvd1snY2FwdGlvbiddIDogIiIpKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAiZmlsZSI6DQoJCQkJCSR0aGVEZXNjID0gc21kX3NwbGl0UmFuZ2UoJHJvd1snZGVzY3JpcHRpb24nXSwgIjtcbiIpOw0KCQkJCQlmb3JlYWNoICgkdGhlRGVzYyBhcyAkcGFyYW1zKSB7DQoJCQkJCQkkcGFyYW1zID0gdHJpbSgkcGFyYW1zKTsNCgkJCQkJCWlmICgkcGFyYW1zICE9ICIiKSB7DQoJCQkJCQkJJHRoZXNlUGFyYW1zID0gZXhwbG9kZSgiPSIsICRwYXJhbXMpOw0KCQkJCQkJCWlmICgkdGhlc2VQYXJhbXNbMF0gPT0gImxpbmtfdXJsIikgew0KCQkJCQkJCQlpZiAoJGxpbmtfaW4gPT0gImRlc2NyaXB0aW9uIikgew0KCQkJCQkJCQkJJGxpbmtOYW1lID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sICR0cmltT3B0cyk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKGluX2FycmF5KCR0aGVzZVBhcmFtc1swXSwkaHRtbE9iakZpeGVkKSkgew0KCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4kdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQl9IGVsc2UgaWYgKGluX2FycmF5KCR0aGVzZVBhcmFtc1swXSwkaHRtbE9ialBhcmFtKSkgew0KCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4kdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQkJJHRlbXBsYXRlT3B0aW9uc1tdID0gJHRoZXNlUGFyYW1zWzBdLiAnPSInIC5ETE1fVFIuJHRoZXNlUGFyYW1zWzBdLiAnIic7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJJHRoZVBhcmFtc1skdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQkvLyAqKiBoYW5kbGUgbGlua3MNCgkJCWlmIChzdHJsZW4oJGxpbmtOYW1lKSA+IDApIHsNCgkJCQlpZiAoc3Vic3RyKCRsaW5rTmFtZSwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkkbGlua1R5cGUgPSAiRlVMTCI7DQoJCQkJfSBlbHNlIGlmICgkbGlua05hbWVbMF0gPT0gJy8nKSB7DQoJCQkJCWlmICgkbGlua19wcmVmaXggPT0gJycpIHsNCgkJCQkJCSRsaW5rVHlwZSA9ICJST09UX05PX1BSRUZJWCI7DQoJCQkJCX0gZWxzZSBpZiAoc3Vic3RyKCRsaW5rX3ByZWZpeCwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkJJGxpbmtUeXBlID0gIkZVTExfUFJFRklYIjsNCgkJCQkJfSBlbHNlIGlmICgkbGlua19wcmVmaXhbMF0gPT0gJy8nKSB7DQoJCQkJCQkkbGlua1R5cGUgPSAiUk9PVCI7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkbGlua1R5cGUgPSAiUkVMQVRJVkUiOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmICgkbGlua19wcmVmaXggPT0gJycpIHsNCgkJCQkJJGxpbmtUeXBlID0gIlJFTEFUSVZFIjsNCgkJCQl9IGVsc2UgaWYgKCRsaW5rX3ByZWZpeFswXSA9PSAnLycpIHsNCgkJCQkJJGxpbmtUeXBlID0gIlJPT1QiOw0KCQkJCX0gZWxzZSBpZiAoc3Vic3RyKCRsaW5rX3ByZWZpeCwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkkbGlua1R5cGUgPSAiRlVMTF9QUkVGSVgiOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRsaW5rVHlwZSA9ICJSRUxBVElWRSI7DQoJCQkJfQ0KCQkJCXN3aXRjaCAoJGxpbmtUeXBlKSB7DQoJCQkJCWNhc2UgIkZVTEwiOg0KCQkJCQkJJGxpbmt1cmwgPSAkbGlua05hbWU7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAiUk9PVF9OT19QUkVGSVgiOg0KCQkJCQkJJGxpbmt1cmwgPSBzaXRlX3VybCgkYXR0cykgLiBzdWJzdHIoJGxpbmtOYW1lLDEpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIlJPT1QiOg0KCQkJCQkJJGxpbmt1cmwgPSBzaXRlX3VybCgkYXR0cykgLiBzdWJzdHIoJGxpbmtfcHJlZml4LDEpIC4gJGxpbmtOYW1lOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIlJFTEFUSVZFIjoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCSRsaW5rdXJsID0gJGxpbmtfcHJlZml4IC4gJGxpbmtOYW1lOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gKiogdGhyb3cgb2JqZWN0IG91dCB0byB0aGUgcGFnZQ0KCQkJaWYgKCRyYXdfdXJsKSB7DQoJCQkJc3dpdGNoICgkbW9kZSkgew0KCQkJCQljYXNlICJpbWFnZSI6DQoJCQkJCQkkb3V0U3RyID0gaHUuJGltZ19kaXIgLiAiLyIgLiRyb3dbJ2lkJ10gLiAoKCR0aHVtYikgPyAndCcgOiAnJykgLiAkcm93WydleHQnXTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJmaWxlIjoNCgkJCQkJCSRvdXRTdHIgPSAoJGNvdW50X2Rvd25sb2FkcykgPyBodS5nVHh0KCdmaWxlX2Rvd25sb2FkJykuJy8nLiRyb3dbJ2lkJ10gOiBodS4kZmlsZXNfZGlyLicvJy4kcm93WydmaWxlbmFtZSddOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlzd2l0Y2goJG1vZGUpIHsNCgkJCQkJY2FzZSAiaW1hZ2UiOg0KCQkJCQkJJGltZ09wdGlvbnMgPSBhcnJheSgiaWQiID0+ICRyb3dbJ2lkJ10pOw0KCQkJCQkJaWYgKCRpbWdjbGFzcyAhPSAnJykgew0KCQkJCQkJCSRpbWdPcHRpb25zWyJjbGFzcyJdID0gJGltZ2NsYXNzOw0KCQkJCQkJfQ0KCQkJCQkJJG9iak91dCA9ICgoJHRodW1iKSA/IHRodW1ibmFpbCgkaW1nT3B0aW9ucykgOiBpbWFnZSgkaW1nT3B0aW9ucykpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImZpbGUiOg0KCQkJCQkJJHRlbXBsYXRlID0gJyc7DQoJCQkJCQkkZmlsZVBhdGggPSBidWlsZF9maWxlX3BhdGgoJGZpbGVfYmFzZV9wYXRoLCAkcm93WydmaWxlbmFtZSddKTsNCgkJCQkJCSRmaWxlREwgPSAoJGNvdW50X2Rvd25sb2FkcykgPyBodS5nVHh0KCdmaWxlX2Rvd25sb2FkJykuJy8nLiRyb3dbJ2lkJ10gOiBodS4kZmlsZXNfZGlyLicvJy4kcm93WydmaWxlbmFtZSddOw0KCQkJCQkJaWYgKGZpbGVfZXhpc3RzKCRmaWxlUGF0aCkpIHsNCgkJCQkJCQkvLyBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCBsb29rIGl0IHVwIGluIHRoZSB0YWJsZQ0KCQkJCQkJCSRwYXRoQml0ID0gcGF0aGluZm8oJGZpbGVQYXRoKTsNCgkJCQkJCQkkcGF0aEV4dCA9ICRwYXRoQml0WydleHRlbnNpb24nXTsNCgkJCQkJCQlmb3JlYWNoICgkb2JqTWltZVR5cGUgYXMgJGV4dHMgPT4gJHR5cGVzICkgew0KCQkJCQkJCQlpZiAoaW5fYXJyYXkoJHBhdGhFeHQsIGV4cGxvZGUoRExNX1JFQywkZXh0cykpKSB7DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJ0eXBlIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4idHlwZSJdID0gJHR5cGVzWzBdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKERMTV9UUi4iZGF0YSIsICRvYmpQYXJhbXMpKSB7DQoJCQkJCQkJCQkJJG9ialBhcmFtc1tETE1fVFIuImRhdGEiXSA9ICRmaWxlREw7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJpZCIsICRvYmpQYXJhbXMpKSB7DQoJCQkJCQkJCQkJJG9ialBhcmFtc1tETE1fVFIuImlkIl0gPSAiaWQiLm10X3JhbmQoKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICghYXJyYXlfa2V5X2V4aXN0cyhETE1fVFIuIndpZHRoIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4id2lkdGgiXSA9IHNtZF9nVHh0KCRzbWRfcmJhbl9zdHIsJ3dpZHRoJyk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJoZWlnaHQiLCAkb2JqUGFyYW1zKSkgew0KCQkJCQkJCQkJCSRvYmpQYXJhbXNbRExNX1RSLiJoZWlnaHQiXSA9IHNtZF9nVHh0KCRzbWRfcmJhbl9zdHIsJ2hlaWdodCcpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRpbWdjbGFzcyAhPSAnJyAmJiAhYXJyYXlfa2V5X2V4aXN0cyhETE1fVFIuImNsYXNzIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4iY2xhc3MiXSA9ICRpbWdjbGFzczsNCgkJCQkJCQkJCQkkdGVtcGxhdGVPcHRpb25zW10gPSAnY2xhc3M9IicgLkRMTV9UUi4gJ2NsYXNzIic7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkdGVtcGxhdGUgPSAkb2JqVGVtcGxhdGVbJHR5cGVzWzFdXTsNCgkJCQkJCQkJCSR0ZW1wbGF0ZSA9IHN0cl9yZXBsYWNlKERMTV9UUi4ib3RoZXJzIiwgaW1wbG9kZSgiICIsICR0ZW1wbGF0ZU9wdGlvbnMpLCAkdGVtcGxhdGUpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJCSRvYmpPdXQgPSAiPG9iamVjdCAiOw0KCQkJCQkJCSRvYmpPdXQgLj0gc3RydHIoJHRlbXBsYXRlLCAkb2JqUGFyYW1zKTsNCgkJCQkJCQlmb3JlYWNoICgkdGhlUGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkJCQkJCSRvYmpPdXQgLj0gJzxwYXJhbSBuYW1lPSInLiRrZXkuJyIgdmFsdWU9IicuJHZhbHVlLiciIC8+JzsNCgkJCQkJCQl9DQoJCQkJCQkJJG9iak91dCAuPSAiPC9vYmplY3Q+Ii5uOw0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKCgkbGlua19pbiAhPSAiIikgJiYgKHN0cmxlbigkbGlua3VybCkgPiAwKSkgew0KCQkJCQlpZiAoJHJlZmVyZXIgIT0gIiIpIHsNCgkJCQkJCSRyZWZlcnR4dCA9IHNtZF9hZGRRU1ZhcigkbGlua3VybCwgJHJlZmVyZXIsICRyb3dbJ2lkJ10pOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHJlZmVydHh0ID0gJGxpbmt1cmw7DQoJCQkJCX0NCgkJCQkJJG91dFN0ciAuPSAnPGEgaHJlZj0iJyAuJHJlZmVydHh0LiAnIicgLiR0YXJnZXQuICc+JyAuICRvYmpPdXQuICc8L2E+JzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3V0U3RyIC49ICRvYmpPdXQ7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuOw0KCX0NCg0KCXJldHVybiAkb3V0U3RyOw0KfQ0KLy8gQ2FsbGJhY2sgZm9yIE1MUCBzdHJpbmcgcmVwbGFjZW1lbnQNCmZ1bmN0aW9uIHNtZF9yYmFuX2VudW1fc3RyKCRldmVudCwgJHN0ZXA9JycsICRwcmU9MCkgew0KCWdsb2JhbCAkc21kX3JiYW5fc3RyLCAkc21kTUxQOw0KCSRyID0gYXJyYXkJKA0KCQkJJ293bmVyJyA9PiAnc21kX3JhbmRvbV9iYW5uZXInLA0KCQkJJ3ByZWZpeCcgPT4gJHNtZE1MUFsnc21kX3JhbmRvbV9iYW5uZXInXSwNCgkJCSdsYW5nJyA9PiAnZW4tZ2InLCAvLyBEZWZhdWx0IGxhbmd1YWdlDQoJCQknZXZlbnQnID0+ICdwdWJsaWMnLCAvLyBwdWJsaWMvYWRtaW4vY29tbW9uID0gd2hpY2ggaW50ZXJmYWNlIHRoZSBzdHJpbmdzIHdpbGwgYmUgbG9hZGVkIGludG8NCgkJCSdzdHJpbmdzJyA9PiAkc21kX3JiYW5fc3RyLA0KCQkpOw0KCXJldHVybiAkcjsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiM2IzMDY0OTVmNDM4MzNlNTM5MWJlNDgyY2M0OGZhMmIiO30=