PCEtLQogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgoKIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KCiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KCiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCgogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKIHF1ZXN0aW9ucy4KLS0+Cgo8aHRtbD4KPGJvZHkgYmdjb2xvcj13aGl0ZT4KCjxoMSBhbGlnbj1jZW50ZXI+QVdUIFRocmVhZGluZyBJc3N1ZXM8L2gxPgoKPGEgbmFtZT0iTGlzdGVuZXJzVGhyZWFkcyI+PC9hPgo8aDI+TGlzdGVuZXJzIGFuZCB0aHJlYWRzPC9oMj4KClVubGVzcyBvdGhlcndpc2Ugbm90ZWQgYWxsIEFXVCBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIG9uIHRoZSBldmVudApkaXNwYXRjaCB0aHJlYWQuIEl0IGlzIHNhZmUgdG8gcmVtb3ZlL2FkZCBsaXN0ZW5lcnMgZnJvbSBhbnkgdGhyZWFkCmR1cmluZyBkaXNwYXRjaGluZywgYnV0IHRoZSBjaGFuZ2VzIG9ubHkgZWZmZWN0IHN1YnNlcXVlbnQgbm90aWZpY2F0aW9uLgo8YnI+Rm9yIGV4YW1wbGUsIGlmIGEga2V5IGxpc3RlbmVycyBpcyBhZGRlZCBmcm9tIGFub3RoZXIga2V5IGxpc3RlbmVyLCB0aGUKbmV3bHkgYWRkZWQgbGlzdGVuZXIgaXMgb25seSBub3RpZmllZCBvbiBzdWJzZXF1ZW50IGtleSBldmVudHMuCgo8YSBuYW1lPSJBdXRvc2h1dGRvd24iPjwvYT4KPGgyPkF1dG8tc2h1dGRvd248L2gyPgoKQWNjb3JkaW5nIHRvIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy92bXNwZWMvMm5kLWVkaXRpb24vaHRtbC9WTVNwZWNUT0MuZG9jLmh0bWwiPjxpPlRoZSAKSmF2YTwvaT48c3VwPjxzbWFsbD5UTTwvc21hbGw+PC9zdXA+IDxpPlZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uLApTZWNvbmQgZWRpdGlvbjwvaT48L2E+IChzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8ybmQtZWRpdGlvbi9odG1sL0NvbmNlcHRzLmRvYy5odG1sIzE5MTUyIj6nMi4xNy45PC9hPgphbmQgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8ybmQtZWRpdGlvbi9odG1sL0NvbmNlcHRzLmRvYy5odG1sIzMzMzA4Ij6nMi4xOTwvYT4pLAp0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUgKEpWTSkgaW5pdGlhbGx5IHN0YXJ0cyB1cCB3aXRoIGEgc2luZ2xlIG5vbi1kYWVtb24KdGhyZWFkLCB3aGljaCB0eXBpY2FsbHkgY2FsbHMgdGhlIDxjb2RlPm1haW48L2NvZGU+IG1ldGhvZCBvZiBzb21lIGNsYXNzLgpUaGUgdmlydHVhbCBtYWNoaW5lIHRlcm1pbmF0ZXMgYWxsIGl0cyBhY3Rpdml0eSBhbmQgZXhpdHMgd2hlbgpvbmUgb2YgdHdvIHRoaW5ncyBoYXBwZW5zOgo8dWw+CiAgPGxpPiBBbGwgdGhlIHRocmVhZHMgdGhhdCBhcmUgbm90IGRhZW1vbiB0aHJlYWRzIHRlcm1pbmF0ZS4KICA8bGk+IFNvbWUgdGhyZWFkIGludm9rZXMgdGhlIDxjb2RlPmV4aXQ8L2NvZGU+IG1ldGhvZCBvZiBjbGFzcyAKICA8Y29kZT5SdW50aW1lPC9jb2RlPiBvciBjbGFzcyA8Y29kZT5TeXN0ZW08L2NvZGU+LCBhbmQgdGhlIGV4aXQKICBvcGVyYXRpb24gaXMgcGVybWl0dGVkIGJ5IHRoZSBzZWN1cml0eSBtYW5hZ2VyLgo8L3VsPgo8cD4KVGhpcyBpbXBsaWVzIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gZG9lc24ndCBzdGFydCBhbnkgdGhyZWFkcyBpdHNlbGYsCnRoZSBKVk0gd2lsbCBleGl0IGFzIHNvb24gYXMgPGNvZGU+bWFpbjwvY29kZT4gdGVybWluYXRlcy4KVGhpcyBpcyBub3QgdGhlIGNhc2UsIGhvd2V2ZXIsIGZvciBhIHNpbXBsZSBhcHBsaWNhdGlvbgp0aGF0IGNyZWF0ZXMgYW5kIGRpc3BsYXlzIGEgPGNvZGU+amF2YS5hd3QuRnJhbWU8L2NvZGU+Ogo8cHJlPgogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgICAgRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUoKTsKICAgICAgICAgICAgZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICAgfQo8L3ByZT4KVGhlIHJlYXNvbiBpcyB0aGF0IEFXVCBlbmNhcHN1bGF0ZXMgYXN5bmNocm9ub3VzIGV2ZW50IGRpc3BhdGNoCm1hY2hpbmVyeSB0byBwcm9jZXNzIGV2ZW50cyBBV1Qgb3IgU3dpbmcgY29tcG9uZW50cyBjYW4gZmlyZS4gVGhlCmV4YWN0IGJlaGF2aW9yIG9mIHRoaXMgbWFjaGluZXJ5IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gSW4KcGFydGljdWxhciwgaXQgY2FuIHN0YXJ0IG5vbi1kYWVtb24gaGVscGVyIHRocmVhZHMgZm9yIGl0cyBpbnRlcm5hbApwdXJwb3Nlcy4gSW4gZmFjdCwgdGhlc2UgYXJlIHRoZSB0aHJlYWRzIHRoYXQgcHJldmVudCB0aGUgZXhhbXBsZQphYm92ZSBmcm9tIGV4aXRpbmcuIFRoZSBvbmx5IHJlc3RyaWN0aW9ucyBpbXBvc2VkIG9uIHRoZSBiZWhhdmlvciBvZgp0aGlzIG1hY2hpbmVyeSBhcmUgYXMgZm9sbG93czoKPHVsPgogIDxsaT4gPGEgaHJlZj0iLi4vRXZlbnRRdWV1ZS5odG1sI2lzRGlzcGF0Y2hUaHJlYWQoKSI+PGNvZGU+RXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkPC9jb2RlPjwvYT4KICAgICAgIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHRoZQogICAgICAgZXZlbnQgZGlzcGF0Y2ggdGhyZWFkIHN0YXJ0ZWQgYnkgdGhlIG1hY2hpbmVyeTsKICA8bGk+IDxjb2RlPkFXVEV2ZW50czwvY29kZT4gd2hpY2ggd2VyZSBhY3R1YWxseSBlbnF1ZXVlZCB0byBhCiAgICAgICBwYXJ0aWN1bGFyIDxjb2RlPkV2ZW50UXVldWU8L2NvZGU+IChub3RlIHRoYXQgZXZlbnRzIGJlaW5nCiAgICAgICBwb3N0ZWQgdG8gdGhlIDxjb2RlPkV2ZW50UXVldWU8L2NvZGU+IGNhbiBiZSBjb2FsZXNjZWQpIGFyZQogICAgICAgZGlzcGF0Y2hlZDoKICAgICAgIDx1bD4KICAgICAgICAgICA8bGk+IFNlcXVlbnRpYWxseS4KICAgICAgICAgICA8ZGQ+IFRoYXQgaXMsIGl0IGlzIG5vdCBwZXJtaXR0ZWQgdGhhdCBzZXZlcmFsIGV2ZW50cyBmcm9tCgkgICAgICAgIHRoaXMgcXVldWUgYXJlIGRpc3BhdGNoZWQgc2ltdWx0YW5lb3VzbHkuIAogICAgICAgICAgIDxsaT4gSW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgZW5xdWV1ZWQuCiAgICAgICAgICAgPGRkPiBUaGF0IGlzLCBpZiA8Y29kZT5BV1RFdmVudDwvY29kZT4mbmJzcDtBIGlzIGVucXVldWVkCgkgICAgICAgIHRvIHRoZSA8Y29kZT5FdmVudFF1ZXVlPC9jb2RlPiBiZWZvcmUKCQk8Y29kZT5BV1RFdmVudDwvY29kZT4mbmJzcDtCIHRoZW4gZXZlbnQgQiB3aWxsIG5vdCBiZSAKICAgICAgICAgICAgICAgIGRpc3BhdGNoZWQgYmVmb3JlIGV2ZW50IEEuCiAgICAgICA8L3VsPgogIDxsaT4gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGFsaXZlIG5vbi1kYWVtb24gdGhyZWFkIHdoaWxlIHRoZXJlIGlzIGF0CiAgICAgICBsZWFzdCBvbmUgZGlzcGxheWFibGUgQVdUIG9yIFN3aW5nIGNvbXBvbmVudCB3aXRoaW4gdGhlCiAgICAgICBhcHBsaWNhdGlvbiAoc2VlCiAgICAgICA8YSBocmVmPSIuLi9Db21wb25lbnQuaHRtbCNpc0Rpc3BsYXlhYmxlKCkiPjxjb2RlPkNvbXBvbmVudC5pc0Rpc3BsYXlhYmxlPC9jb2RlPjwvYT4pLgo8L3VsPgpUaGUgaW1wbGljYXRpb25zIG9mIHRoZSB0aGlyZCByZXN0cmljdGlvbiBhcmUgYXMgZm9sbG93czogCjx1bD4KICA8bGk+IFRoZSBKVk0gd2lsbCBleGl0IGlmIHNvbWUgdGhyZWFkIGludm9rZXMgdGhlIDxjb2RlPmV4aXQ8L2NvZGU+CiAgbWV0aG9kIG9mIGNsYXNzIDxjb2RlPlJ1bnRpbWU8L2NvZGU+IG9yIGNsYXNzIDxjb2RlPlN5c3RlbTwvY29kZT4KICByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZW5jZSBvZiBkaXNwbGF5YWJsZSBjb21wb25lbnRzOwogIDxsaT4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcyBhbGwgbm9uLWRhZW1vbiB0aHJlYWRzIGl0CiAgc3RhcnRlZCwgdGhlIEpWTSB3aWxsIG5vdCBleGl0IHdoaWxlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQogIGRpc3BsYXlhYmxlIGNvbXBvbmVudC4KPC91bD4KSXQgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gaWYgYW5kIHdoZW4gdGhlIG5vbi1kYWVtb24gaGVscGVyCnRocmVhZHMgYXJlIHRlcm1pbmF0ZWQgb25jZSBhbGwgY29tcG9uZW50cyBhcmUgbWFkZSB1bmRpc3BsYXlhYmxlLiAKVGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGRldGFpbHMgYXJlIGdpdmVuIGJlbG93LiAKCjxoMz4KSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGJlaGF2aW9yLgo8L2gzPgoKUHJpb3IgdG8gMS40LCB0aGUgaGVscGVyIHRocmVhZHMgd2VyZSBuZXZlciB0ZXJtaW5hdGVkLgo8cD4KU3RhcnRpbmcgd2l0aCAxLjQsIHRoZSBiZWhhdmlvciBoYXMgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgZml4IGZvcgo8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDAzMDcxOC5odG1sIj4KNDAzMDcxODwvYT4uIFdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIEFXVCB0ZXJtaW5hdGVzIGFsbCBpdHMKaGVscGVyIHRocmVhZHMgYWxsb3dpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIGV4aXQgY2xlYW5seSB3aGVuIHRoZQpmb2xsb3dpbmcgdGhyZWUgY29uZGl0aW9ucyBhcmUgdHJ1ZToKPHVsPgogIDxsaT4gVGhlcmUgYXJlIG5vIGRpc3BsYXlhYmxlIEFXVCBvciBTd2luZyBjb21wb25lbnRzLgogIDxsaT4gVGhlcmUgYXJlIG5vIG5hdGl2ZSBldmVudHMgaW4gdGhlIG5hdGl2ZSBldmVudCBxdWV1ZS4KICA8bGk+IFRoZXJlIGFyZSBubyBBV1QgZXZlbnRzIGluIGphdmEgRXZlbnRRdWV1ZXMuCjwvdWw+ClRoZXJlZm9yZSwgYSBzdGFuZC1hbG9uZSBBV1QgYXBwbGljYXRpb24gdGhhdCB3aXNoZXMgdG8gZXhpdApjbGVhbmx5IHdpdGhvdXQgY2FsbGluZyA8Y29kZT5TeXN0ZW0uZXhpdDwvY29kZT4gbXVzdDoKPHVsPgogIDxsaT4gTWFrZSBzdXJlIHRoYXQgYWxsIEFXVCBvciBTd2luZyBjb21wb25lbnRzIGFyZSBtYWRlCiAgICAgICB1bmRpc3BsYXlhYmxlIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGZpbmlzaGVzLiBUaGlzIGNhbiBiZSBkb25lCiAgICAgICBieSBjYWxsaW5nCjxhIGhyZWY9Ii4uL1dpbmRvdy5odG1sI2Rpc3Bvc2UoKSI+PGNvZGU+V2luZG93LmRpc3Bvc2U8L2NvZGU+PC9hPgogICAgICAgb24gYWxsIHRvcC1sZXZlbCA8Y29kZT5XaW5kb3dzPC9jb2RlPi4gU2VlCjxhIGhyZWY9Ii4uL0ZyYW1lLmh0bWwjZ2V0RnJhbWVzKCkiPjxjb2RlPkZyYW1lLmdldEZyYW1lczwvY29kZT48L2E+LgogIDxsaT4gTWFrZSBzdXJlIHRoYXQgbm8gbWV0aG9kIG9mIEFXVCBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBieQogICAgICAgdGhlIGFwcGxpY2F0aW9uIHdpdGggYW55IEFXVCBvciBTd2luZyBjb21wb25lbnQgY2FuIHJ1biBpbnRvIGFuCiAgICAgICBpbmZpbml0ZSBsb29wIG9yIGhhbmcgaW5kZWZpbml0ZWx5LiBGb3IgZXhhbXBsZSwgYW4gQVdUIGxpc3RlbmVyCiAgICAgICBtZXRob2QgdHJpZ2dlcmVkIGJ5IHNvbWUgQVdUIGV2ZW50IGNhbiBwb3N0IGEgbmV3IEFXVCBldmVudCBvZgogICAgICAgdGhlIHNhbWUgdHlwZSB0byB0aGUgPGNvZGU+RXZlbnRRdWV1ZTwvY29kZT4uCiAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhhdCBtZXRob2RzCiAgICAgICBvZiBBV1QgZXZlbnQgbGlzdGVuZXJzIGFyZSB0eXBpY2FsbHkgZXhlY3V0ZWQgb24gaGVscGVyCiAgICAgICB0aHJlYWRzLgo8L3VsPgpOb3RlLCB0aGF0IHdoaWxlIGFuIGFwcGxpY2F0aW9uIGZvbGxvd2luZyB0aGVzZSByZWNvbW1lbmRhdGlvbnMgd2lsbApleGl0IGNsZWFubHkgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMsIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgaXQKd2lsbCBleGl0IGNsZWFubHkgaW4gYWxsIGNhc2VzLiBUd28gZXhhbXBsZXM6IAo8dWw+CiAgPGxpPiBPdGhlciBwYWNrYWdlcyBjYW4gY3JlYXRlIGRpc3BsYXlhYmxlIGNvbXBvbmVudHMgZm9yIGludGVybmFsCiAgICAgICBuZWVkcyBhbmQgbmV2ZXIgbWFrZSB0aGVtIHVuZGlzcGxheWFibGUuIFNlZQo8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDUxNTA1OC5odG1sIj4KNDUxNTA1ODwvYT4sCjxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80NjcxMDI1Lmh0bWwiPgo0NjcxMDI1PC9hPiwgYW5kCjxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80NDY1NTM3Lmh0bWwiPgo0NDY1NTM3PC9hPi4gCiAgPGxpPiBCb3RoIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBYMTEgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZCBuYXRpdmUKICAgICAgIGV2ZW50cyB0byB3aW5kb3dzIHRoYXQgYmVsb25nIHRvIGFub3RoZXIgYXBwbGljYXRpb24uIFdpdGggdGhpcwogICAgICAgZmVhdHVyZSBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIG1hbGljaW91cyBwcm9ncmFtIHRoYXQgd2lsbAogICAgICAgY29udGludW91c2x5IHNlbmQgZXZlbnRzIHRvIGFsbCBhdmFpbGFibGUgd2luZG93cyBwcmV2ZW50aW5nCiAgICAgICBhbnkgQVdUIGFwcGxpY2F0aW9uIGZyb20gZXhpdGluZyBjbGVhbmx5Lgo8L3VsPgpPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IHJlcXVpcmUgdGhlIEpWTSB0byBjb250aW51ZSBydW5uaW5nIGV2ZW4gYWZ0ZXIKdGhlIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFsbCBjb21wb25lbnRzIHVuZGlzcGxheWFibGUgeW91IHNob3VsZCBzdGFydCBhCm5vbi1kYWVtb24gdGhyZWFkIHRoYXQgYmxvY2tzIGZvcmV2ZXIuIAoKPHByZT4KICAgICAgICA8Li4uPgogICAgICAgIFJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgIE9iamVjdCBvID0gbmV3IE9iamVjdCgpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgby53YWl0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHIpOwogICAgICAgIHQuc2V0RGFlbW9uKGZhbHNlKTsKICAgICAgICB0LnN0YXJ0KCk7CiAgICAgICAgPC4uLj4KPC9wcmU+CgpUaGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbiBndWFyYW50ZWVzCnRoYXQgdGhlIEpWTSBkb2Vzbid0IGV4aXQgdW50aWwgdGhpcyB0aHJlYWQgdGVybWluYXRlcy4KPC9ib2R5Pgo8L2h0bWw+Cg==