Re: XDP CPU maps & shared umem
Yuval El-Hanany <[email protected]> Tue, 28 May 2024 12:38:44 +0000
| Newsgroups | org.kernel.vger.xdp-newbies |
|---|---|
| Message-ID | <[email protected]> |
U3VyZS4gVGhlIHR3byBwYXRjaGVzICh0aGUgc2Vjb25kIGlzIGp1c3QgZG9jdW1lbnRhdGlvbikg YXJlIGJlbG93Lg0KDQogICAgICAgIEnigJltIHRyeWluZyB0byBhZGQgdGhlIHJ4IHF1ZXVlIGZy b20geGRwX2J1ZmYgdG8gdGhlIHhkcF9mcmFtZSBhbmQgZXh0cmFjdCBpdCBiYWNrLiBJcyB0aGUg c2l6ZSBvciBhbGlnbm1lbnQgb2YgeGRwX2ZyYW1lIGNyaXRpY2FsPyBJcyBpdCBva2F5IHRvIGFk ZCB0aGUgcnggcXVldWUgYXMgYW4gZXh0cmEgZmllbGQsIG9yIHNob3VsZCBJIHRyeSB0byBhZGQg aXQgYXMgYSBiaXQgZmllbGQgb24gYW4gZXhpc3RpbmcgZmllbGQgbGlrZSB0aGUgbWVtb3J5IHR5 cGUgdGhhdCB0YWtlcyAzMiBiaXRzIGJ1dCBoYXMgb25seSA0IHZhbHVlcz8NCg0KICAgICAgICBD aGVlcnMsDQogICAgICAgICAgICAgICAgWXV2YWwuDQoNCkZyb206IE1hZ251cyBLYXJsc3NvbiA8 bWFnbnVzLmthcmxzc29uQGdtYWlsLmNvbT4NClN1YmplY3Q6IFtQQVRDSCBicGYtbmV4dCAxLzJd IHhzazogc3VwcG9ydCByZWRpcmVjdCB0byBhbnkgc29ja2V0IGJvdW5kIHRvIHRoZSBzYW1lIHVt ZW0NCkRhdGU6IDUgRmVicnVhcnkgMjAyNCBhdCAxNDozNTo1MCBHTVQrMg0KVG86IG1hZ251cy5r YXJsc3NvbkBpbnRlbC5jb20sIGJqb3JuQGtlcm5lbC5vcmcsIGFzdEBrZXJuZWwub3JnLCBkYW5p ZWxAaW9nZWFyYm94Lm5ldCwgbmV0ZGV2QHZnZXIua2VybmVsLm9yZywgbWFjaWVqLmZpamFsa293 c2tpQGludGVsLmNvbSwgeXV2YWxlQHJhZHdhcmUuY29tDQpDYzogYnBmQHZnZXIua2VybmVsLm9y Zw0KDQpDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Igb3Bl biBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93IHRo ZSBjb250ZW50IGlzIHNhZmUuDQoNCkZyb206IE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxz c29uQGludGVsLmNvbT4NCg0KQWRkIHN1cHBvcnQgZm9yIGRpcmVjdGluZyBhIHBhY2tldCB0byBh bnkgc29ja2V0IGJvdW5kIHRvIHRoZSBzYW1lDQp1bWVtLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxl IHRvIHVzZSB0aGUgWERQIHByb2dyYW0gdG8gc2VsZWN0IHdoYXQNCnNvY2tldCB0aGUgcGFja2V0 IHNob3VsZCBiZSByZWNlaXZlZCBvbi4gVGhlIHVzZXIgY2FuIHBvcHVsYXRlIHRoZQ0KWFNLTUFQ IHdpdGggdmFyaW91cyBzb2NrZXRzIGFuZCBhcyBsb25nIGFzIHRoZXkgc2hhcmUgdGhlIHNhbWUg dW1lbSwNCnRoZSBYRFAgcHJvZ3JhbSBjYW4gcGljayBhbnkgb25lIG9mIHRoZW0uDQoNClN1Z2dl c3RlZC1ieTogWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+DQpTaWduZWQtb2Zm LWJ5OiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQotLS0NCm5l dC94ZHAveHNrLmMgfCA1ICsrKystDQoxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCAx IGRlbGV0aW9uKC0pDQoNCmRpZmYgLS1naXQgYS9uZXQveGRwL3hzay5jIGIvbmV0L3hkcC94c2su Yw0KaW5kZXggMWVhZGZhYzAzY2M0Li5hMzM5ZTlhMWI1NTcgMTAwNjQ0DQotLS0gYS9uZXQveGRw L3hzay5jDQorKysgYi9uZXQveGRwL3hzay5jDQpAQCAtMzEzLDEwICszMTMsMTMgQEAgc3RhdGlj IGJvb2wgeHNrX2lzX2JvdW5kKHN0cnVjdCB4ZHBfc29jayAqeHMpDQoNCnN0YXRpYyBpbnQgeHNr X3Jjdl9jaGVjayhzdHJ1Y3QgeGRwX3NvY2sgKnhzLCBzdHJ1Y3QgeGRwX2J1ZmYgKnhkcCwgdTMy IGxlbikNCnsNCisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHhkcC0+cnhxLT5kZXY7 DQorICAgICAgIHUzMiBxaWQgPSB4ZHAtPnJ4cS0+cXVldWVfaW5kZXg7DQorDQogICAgICAgaWYg KCF4c2tfaXNfYm91bmQoeHMpKQ0KICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsNCg0KLSAg ICAgICBpZiAoeHMtPmRldiAhPSB4ZHAtPnJ4cS0+ZGV2IHx8IHhzLT5xdWV1ZV9pZCAhPSB4ZHAt PnJ4cS0+cXVldWVfaW5kZXgpDQorICAgICAgIGlmICghZGV2LT5fcnhbcWlkXS5wb29sIHx8IHhz LT51bWVtICE9IGRldi0+X3J4W3FpZF0ucG9vbC0+dW1lbSkNCiAgICAgICAgICAgICAgIHJldHVy biAtRUlOVkFMOw0KDQogICAgICAgaWYgKGxlbiA+IHhza19wb29sX2dldF9yeF9mcmFtZV9zaXpl KHhzLT5wb29sKSAmJiAheHMtPnNnKSB7DQotLQ0KMi40Mi4wDQoNCkZyb206IE1hZ251cyBLYXJs c3NvbiA8bWFnbnVzLmthcmxzc29uQGludGVsLmNvbT4NCg0KRG9jdW1lbnQgdGhlIGFiaWxpdHkg dG8gcmVkaXJlY3QgdG8gYW55IHNvY2tldCBib3VuZCB0byB0aGUgc2FtZSB1bWVtLg0KDQpTaWdu ZWQtb2ZmLWJ5OiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQot LS0NCkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0IHwgMzMgKysrKysrKysrKysr KysrKystLS0tLS0tLS0tLS0NCjEgZmlsZSBjaGFuZ2VkLCAxOSBpbnNlcnRpb25zKCspLCAxNCBk ZWxldGlvbnMoLSkNCg0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94 ZHAucnN0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2FmX3hkcC5yc3QNCmluZGV4IGRjZWVi MGQ3NjNhYS4uNzJkYTcwNTdlNGNmIDEwMDY0NA0KLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3Jr aW5nL2FmX3hkcC5yc3QNCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0 DQpAQCAtMzI5LDIzICszMjksMjQgQEAgWERQX1NIQVJFRF9VTUVNIG9wdGlvbiBhbmQgcHJvdmlk ZSB0aGUgaW5pdGlhbCBzb2NrZXQncyBmZCBpbiB0aGUNCnN4ZHBfc2hhcmVkX3VtZW1fZmQgZmll bGQgYXMgeW91IHJlZ2lzdGVyZWQgdGhlIFVNRU0gb24gdGhhdA0Kc29ja2V0LiBUaGVzZSB0d28g c29ja2V0cyB3aWxsIG5vdyBzaGFyZSBvbmUgYW5kIHRoZSBzYW1lIFVNRU0uDQoNCi1UaGVyZSBp cyBubyBuZWVkIHRvIHN1cHBseSBhbiBYRFAgcHJvZ3JhbSBsaWtlIHRoZSBvbmUgaW4gdGhlIHBy ZXZpb3VzDQotY2FzZSB3aGVyZSBzb2NrZXRzIHdlcmUgYm91bmQgdG8gdGhlIHNhbWUgcXVldWUg aWQgYW5kDQotZGV2aWNlLiBJbnN0ZWFkLCB1c2UgdGhlIE5JQydzIHBhY2tldCBzdGVlcmluZyBj YXBhYmlsaXRpZXMgdG8gc3RlZXINCi10aGUgcGFja2V0cyB0byB0aGUgcmlnaHQgcXVldWUuIElu IHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGVyZSBpcyBvbmx5DQotb25lIHF1ZXVlIHNoYXJlZCBh bW9uZyBzb2NrZXRzLCBzbyB0aGUgTklDIGNhbm5vdCBkbyB0aGlzIHN0ZWVyaW5nLiBJdA0KLWNh biBvbmx5IHN0ZWVyIGJldHdlZW4gcXVldWVzLg0KLQ0KLUluIGxpYmJwZiwgeW91IG5lZWQgdG8g dXNlIHRoZSB4c2tfc29ja2V0X19jcmVhdGVfc2hhcmVkKCkgQVBJIGFzIGl0DQotdGFrZXMgYSBy ZWZlcmVuY2UgdG8gYSBGSUxMIHJpbmcgYW5kIGEgQ09NUExFVElPTiByaW5nIHRoYXQgd2lsbCBi ZQ0KLWNyZWF0ZWQgZm9yIHlvdSBhbmQgYm91bmQgdG8gdGhlIHNoYXJlZCBVTUVNLiBZb3UgY2Fu IHVzZSB0aGlzDQotZnVuY3Rpb24gZm9yIGFsbCB0aGUgc29ja2V0cyB5b3UgY3JlYXRlLCBvciB5 b3UgY2FuIHVzZSBpdCBmb3IgdGhlDQotc2Vjb25kIGFuZCBmb2xsb3dpbmcgb25lcyBhbmQgdXNl IHhza19zb2NrZXRfX2NyZWF0ZSgpIGZvciB0aGUgZmlyc3QNCi1vbmUuIEJvdGggbWV0aG9kcyB5 aWVsZCB0aGUgc2FtZSByZXN1bHQuDQorSW4gdGhpcyBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0byB1 c2UgdGhlIE5JQydzIHBhY2tldCBzdGVlcmluZw0KK2NhcGFiaWxpdGllcyB0byBzdGVlciB0aGUg cGFja2V0cyB0byB0aGUgcmlnaHQgcXVldWUuIFRoaXMgaXMgbm90DQorcG9zc2libGUgaW4gdGhl IHByZXZpb3VzIGV4YW1wbGUgYXMgdGhlcmUgaXMgb25seSBvbmUgcXVldWUgc2hhcmVkDQorYW1v bmcgc29ja2V0cywgc28gdGhlIE5JQyBjYW5ub3QgZG8gdGhpcyBzdGVlcmluZyBhcyBpdCBjYW4g b25seSBzdGVlcg0KK2JldHdlZW4gcXVldWVzLg0KKw0KK0luIGxpYnhkcCAob3IgbGliYnBmIHBy aW9yIHRvIHZlcnNpb24gMS4wKSwgeW91IG5lZWQgdG8gdXNlIHRoZQ0KK3hza19zb2NrZXRfX2Ny ZWF0ZV9zaGFyZWQoKSBBUEkgYXMgaXQgdGFrZXMgYSByZWZlcmVuY2UgdG8gYSBGSUxMIHJpbmcN CithbmQgYSBDT01QTEVUSU9OIHJpbmcgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHlvdSBhbmQg Ym91bmQgdG8gdGhlDQorc2hhcmVkIFVNRU0uIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gZm9y IGFsbCB0aGUgc29ja2V0cyB5b3UgY3JlYXRlLA0KK29yIHlvdSBjYW4gdXNlIGl0IGZvciB0aGUg c2Vjb25kIGFuZCBmb2xsb3dpbmcgb25lcyBhbmQgdXNlDQoreHNrX3NvY2tldF9fY3JlYXRlKCkg Zm9yIHRoZSBmaXJzdCBvbmUuIEJvdGggbWV0aG9kcyB5aWVsZCB0aGUgc2FtZQ0KK3Jlc3VsdC4N Cg0KTm90ZSB0aGF0IGEgVU1FTSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gc29ja2V0cyBvbiB0aGUg c2FtZSBxdWV1ZSBpZA0KYW5kIGRldmljZSwgYXMgd2VsbCBhcyBiZXR3ZWVuIHF1ZXVlcyBvbiB0 aGUgc2FtZSBkZXZpY2UgYW5kIGJldHdlZW4NCi1kZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUuDQor ZGV2aWNlcyBhdCB0aGUgc2FtZSB0aW1lLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0 IHRvIGFueQ0KK3NvY2tldCBhcyBsb25nIGFzIGl0IGlzIGJvdW5kIHRvIHRoZSBzYW1lIHVtZW0g d2l0aCBYRFBfU0hBUkVEX1VNRU0uDQoNClhEUF9VU0VfTkVFRF9XQUtFVVAgYmluZCBmbGFnDQot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQEAgLTgyMiw2ICs4MjMsMTAgQEAgQTogVGhl IHNob3J0IGFuc3dlciBpcyBubywgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQu IFRoZQ0KICAgc3dpdGNoLCBvciBvdGhlciBkaXN0cmlidXRpb24gbWVjaGFuaXNtLCBpbiB5b3Vy IE5JQyB0byBkaXJlY3QNCiAgIHRyYWZmaWMgdG8gdGhlIGNvcnJlY3QgcXVldWUgaWQgYW5kIHNv Y2tldC4NCg0KKyAgIE5vdGUgdGhhdCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBYRFBfU0hBUkVEX1VN RU0gb3B0aW9uLCBpdCBpcw0KKyAgIHBvc3NpYmxlIHRvIHN3aXRjaCB0cmFmZmljIGJldHdlZW4g YW55IHNvY2tldCBib3VuZCB0byB0aGUgc2FtZQ0KKyAgIHVtZW0uDQorDQpROiBNeSBwYWNrZXRz IGFyZSBzb21ldGltZXMgY29ycnVwdGVkLiBXaGF0IGlzIHdyb25nPw0KDQpBOiBDYXJlIGhhcyB0 byBiZSB0YWtlbiBub3QgdG8gZmVlZCB0aGUgc2FtZSBidWZmZXIgaW4gdGhlIFVNRU0gaW50bw0K LS0NCjIuNDIuMA0KDQo+IE9uIDI4IE1heSAyMDI0LCBhdCAxNToyMSwgTWFnbnVzIEthcmxzc29u IDxtYWdudXMua2FybHNzb25AZ21haWwuY29tPiB3cm90ZToNCj4NCj4gQ0FVVElPTjpFeHRlcm5h bCBFbWFpbCwgRG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNz IHlvdSByZWNvZ25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0K Pg0KPiBPbiBNb24sIDI3IE1heSAyMDI0IGF0IDEwOjExLCBNYWdudXMgS2FybHNzb24gPG1hZ251 cy5rYXJsc3NvbkBnbWFpbC5jb20+IHdyb3RlOg0KPj4NCj4+IE9uIE1vbiwgMjcgTWF5IDIwMjQg YXQgMDk6MzQsIFl1dmFsIEVsLUhhbmFueSA8eXV2YWxlQHJhZHdhcmUuY29tPiB3cm90ZToNCj4+ Pg0KPj4+IFllYWgsDQo+Pj4gICAgICAgIGFzIGZhciBkb3duIGFzIEkgZHVnIGluIHRoZSBjb2Rl LCBpdCBzZWVtcyBpdOKAmXMgdGhlIG9ubHkgb25lIHRoYXTigJlzIHVzZWQuIFRoZSBvdGhlciBt ZW1iZXJzIGFyZSByZWdfc3RhdGUgJiBuYXBpX2lkLiBJ4oCZbSB1bmZhbWlsaWFyIHdpdGggdGhl aXIgZXhhY3QgcHVycG9zZXMsIGJ1dCBkb2VzbuKAmXQgc291bmQgbGlrZSB0aGV54oCZcmUgbmVj ZXNzYXJ5IGRvd24gdGhlIGxpbmUuIE9uZSBvdGhlciBjb25jZXJuIGlzIHR4cSBJTU8uIEl0IGlz IG5vdCBpbml0aWFsaXNlZCB0byBhbnkgdmFsdWUgaW4geGRwX2J1ZmYuIFdoaWxlIGl0IG1heSBu b3QgYmUgcmVsZXZhbnQgY29uc2lkZXJpbmcgaXTigJlzIGEgcmVjZWl2ZWQgcGFja2V0LCBpdCBz ZWVtcyB3cm9uZyB0byBrZWVwIGEgZGFuZ2xpbmcgcG9pbnRlciBib3RoIGluIHRlcm1zIG9mIHNl Y3VyaXR5IChsZWFraW5nIHByZXZpb3VzIHZhbHVlcykgYW5kIHJvYnVzdG5lc3MuIE1heWJlIGp1 c3Qgc2V0IGl0IHRvIE5VTEw/DQo+Pj4NCj4+PiAgICAgICAgSeKAmXZlIGJlZW4gcmFja2luZyBt eSBicmFpbiBhcyB0byB3aGF0IGlzIHRoZSBhY2NlcHRlZCBtZXRob2QgdG8gcGFzcyB0aGUgcmVj ZWl2ZSBxdWV1ZS4gUGFzc2luZyBpdCBvbiB0aGUgcGFja2V0IGhlYWRyb29tIHNlZW1lZCBsaWtl IGEgcmVhc29uYWJsZSBzb2x1dGlvbiwgYnV0IGl0IHdvdWxkIG1lYW4gbWVtb3J5IGFjY2VzcyB0 byB0aGUgcGFja2V0IG1lbW9yeSBvbiBwYWNrZXQgYXJyaXZhbCBvbiB0aGUgc2Vjb25kIENQVSB3 aGljaCBtYXkgYmUgaGFybWZ1bCB0byBwZXJmb3JtYW5jZS4gVGhlIHF1ZXVlIGl0c2VsZiBpcyBq dXN0IGEgcG9pbnRlciBxdWV1ZSBzbyBjYW7igJl0IHBpZ2d5YmFjayBvbiBpdCB1bmxlc3MgdXNp bmcgYSBkaWZmZXJlbnQga2luZCBvZiBxdWV1ZS4gV291bGQgYmUgZ3JlYXQgdG8gaGVhciBob3cg aXQgc2hvdWxkIGJlIGRvbmUuDQo+Pg0KPj4gTGV0IG1lIGdldCBpbnRvIHRoaXMgcGllY2Ugb2Yg Y29kZSBhbmQgc2NyYXRjaCBteSBoZWFkIGZvciBhIHdoaWxlIGFuZA0KPj4gSSB3aWxsIGdldCBi YWNrIHRvIHlvdS4gRG8gbm90IGhhdmUgYSBzb2x1dGlvbiBvbiB0b3Agb2YgbXkgaGVhZC4gV2ls bA0KPj4gbG9vcCBpbiBNYWNpZWogdG9vLg0KPg0KPiBZdXZhbCwNCj4NCj4gQ291bGQgeW91IHBs ZWFzZSBzZW5kIG1lIHRoZSBwYXRjaCB0aGF0IHlvdSBhcmUgdXNpbmc/IEkgY2Fubm90DQo+IHJl bWVtYmVyIHdoYXQgSSBzZW50IHlvdSA6LSkuDQo+DQo+PiAvTWFnbnVzDQo+Pg0KPj4+ICAgICAg ICBUaGFua3MsDQo+Pj4gICAgICAgICAgICAgICAgWXV2YWwuDQo+Pj4NCj4+Pj4gT24gMjcgTWF5 IDIwMjQsIGF0IDg6NDgsIE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGdtYWlsLmNv bT4gd3JvdGU6DQo+Pj4+DQo+Pj4+IENBVVRJT046RXh0ZXJuYWwgRW1haWwsIERvIG5vdCBjbGlj ayBvbiBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRoZSBz ZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4+Pj4NCj4+Pj4gT24gU3VuLCAy NiBNYXkgMjAyNCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+ IHdyb3RlOg0KPj4+Pj4NCj4+Pj4+IENvcnJlY3Rpb24sDQo+Pj4+PiAgICAgICB0aGUgcnhxIHBv aW50ZXIgaXMgaW5pdOKAmWQgZ2xvYmFsbHkgZm9yIGFsbCBmcmFtZXMgYmVmb3JlIHRoZSBmcmFt ZSBsb29wcywgYnV0IG9ubHkgdGhlIGRldmljZSBhbmQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiBh cmUgc2V0IGZyb20gdGhlIFhEUCBmcmFtZS4gU28gc3RpbGwgYW4gaXNzdWUgd2l0aCB0aGUgcXVl dWVfaW5kZXgsIGJ1dCB0aGUgdGVzdHMgb24gdGhlIGRldmljZSBhbmQgbWVtb3J5IGluZm8gaW4g eHNrX3JjdiBzaG91bGQgYmUgZmluZS4NCj4+Pj4+DQo+Pj4+PiAgICAgICBDaGVlcnMsDQo+Pj4+ PiAgICAgICAgICAgICAgIFl1dmFsLg0KPj4+Pg0KPj4+PiBIaSBZdXZhbCwNCj4+Pj4NCj4+Pj4g Tm93IEkgYW0gYmFjay4gWWVzLCB0aGlzIHNlZW1zIHRvIGJlIGEgYnVnIHNvIHRoYW5rIHlvdSBm b3Igc3BvdHRpbmcNCj4+Pj4gaXQuIFRoaXMgaXMgbm90aGluZyBJIGhhdmUgZXZlciB0ZXN0ZWQg c2luY2UgSSB0aG91Z2h0IHlvdSB3b3VsZCBkbyBhbg0KPj4+PiBYU0tNQVAgcmVkaXJlY3QgdG8g dGhlICJyaWdodCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhpbmcNCj4+Pj4gaGluZGVy aW5nIHRoYXQgc29tZW9uZSB3b3VsZCBkbyBhIENQVU1BUCByZWRpcmVjdCBmaXJzdCB0aGVuIGFu IFhTS01BUA0KPj4+PiByZWRpcmVjdCwgc28gc2hvdWxkIGJlIHN1cHBvcnRlZC4gU28gaW4geW91 ciBhbmFseXNpcywgaXMgaXQgb25seQ0KPj4+PiBxdWV1ZV9pbmRleCB0aGF0IG5lZWRzIHRvIGJl IHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4+Pj4gdGhpcyB0byB3b3Jr Pw0KPj4+Pg0KPj4+PiBUaGFua3M6IE1hZ251cw0KPj4+Pg0KPj4+Pj4+IE9uIDI2IE1heSAyMDI0 LCBhdCAxMjowMiwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0K Pj4+Pj4+DQo+Pj4+Pj4gSGksDQo+Pj4+Pj4gc28gSeKAmXZlIGR1ZyBhIGJpdCBkZWVwZXIuIEl0 IHNlZW1zIHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFVzIGFu ZCB0aGlzIG1heSBtYWtlIHRoZSB3aG9sZSBwcmFjdGljZSBvZiByZWRpcmVjdGluZyB0byBYU0sg dW5zYWZlIGlmIEkgcmVhZCB0aGUgY29kZSBjb3JyZWN0bHkuIEl0IGFsc28gc2VlbXMgdGhpcyBw ZXJzaXN0cyB0byBrZXJuZWwgNi42LjguIEFtIEkgbWlzc2luZyBzb21ldGhpbmc/DQo+Pj4+Pj4N Cj4+Pj4+PiBUaGUgY29kZSBpbiBjcHVtYXAgcnVucyBYRFAgcHJvZ3JhbXMgQlVUIGRvZXNu4oCZ dCBmaWxsIHRoZSByeHEgKHNlZSBhbHNvIHRoZSBUT0RPIGNvbW1lbnQgaW4gdGhlIGNvZGUpLiBU aGUgWERQIGZyYW1lIGlzIGNvbnZlcnRlZCB0byBYRFAgYnVmZmVyIGJ1dCB0aGUgcnhxIGFuZCB0 eHEgYXJlIG5vdCBmaWxsZWQuIEl0IHNlZW1zIHRoZXkgcmVtYWluIGFzIGRhbmdsaW5nIHBvaW50 ZXJzLiBXaGVuIF9feHNrX21hcF9yZWRpcmVjdCBpcyBjYWxsZWQgYW5kIGluIHR1cm4geHNrX3Jj diB0aGUgcnhxIGlzIGNvbnN1bHRlZCBib3RoIHRvIGNoZWNrIGlmIHRoZSB1bWVtIGlzIHNoYXJl ZCAoaW4gdGhlIG5ldyBwYXRjaCkgYXMgd2VsbCBhcyBkZWNpZGUgd2hldGhlciB6ZXJvIGNvcHkg aXMgdXNlZCBvciBub3QuIFNpbmNlIHJ4cSBpcyBub3QgdmFsaWQsIEnigJltIG5vdCBjZXJ0YWlu IHdoYXQgdGhlIG91dGNvbWUgaXMuIE9uY2UgSSBieXBhc3NlZCB1bWVtIGNoZWNrLCBJIG5vIGxv bmdlciBjcmFzaCB0aGUga2VybmVsIGJ1dCBJJ20gZGVmaW5pdGVseSBub3Qgc2VlaW5nIHRyYWZm aWMgcnVubmluZy4NCj4+Pj4+Pg0KPj4+Pj4+IFRoYW5rcywNCj4+Pj4+PiBZdXZhbC4NCj4+Pj4+ Pg0KPj4+Pj4+IEhlcmUgYXJlIHRoZSBleGNlcnB0cyBmcm9tIHRoZSBjb2RlICg1LjE1LjExNyk6 DQo+Pj4+Pj4NCj4+Pj4+PiBjcHVtYXAuYzoyMTIgPGNwdV9tYXBfYnBmX3Byb2dfcnVuX3hkcD4g PT09PT0gTm90ZSB0aGUgY29tbWVudCBpbiB0aGUgY29kZS4gPT09PT0NCj4+Pj4+PiAgZm9yIChp ID0gMDsgaSA8IG47IGkrKykgew0KPj4+Pj4+ICAgICAgc3RydWN0IHhkcF9mcmFtZSAqeGRwZiA9 IGZyYW1lc1tpXTsNCj4+Pj4+PiAgICAgIHUzMiBhY3Q7DQo+Pj4+Pj4gICAgICBpbnQgZXJyOw0K Pj4+Pj4+DQo+Pj4+Pj4gcnhxLmRldiA9IHhkcGYtPmRldl9yeDsNCj4+Pj4+PiAgICAgIHJ4cS5t ZW0gPSB4ZHBmLT5tZW07DQo+Pj4+Pj4gICAgICAvKiBUT0RPOiByZXBvcnQgcXVldWVfaW5kZXgg dG8geGRwX3J4cV9pbmZvICovDQo+Pj4+Pj4NCj4+Pj4+PiAgICAgIHhkcF9jb252ZXJ0X2ZyYW1l X3RvX2J1ZmYoeGRwZiwgJnhkcCk7DQo+Pj4+Pj4NCj4+Pj4+PiAgICAgIGFjdCA9IGJwZl9wcm9n X3J1bl94ZHAocmNwdS0+cHJvZywgJnhkcCk7DQo+Pj4+Pj4NCj4+Pj4+PiB4ZHAuaDoxNzUgPT09 PT0gcnhxICYgdHhxIGluIHRoZSB4ZHBfYnVmZiBhcmUgbm90IGZpbGxlZCBvciBldmVuIHJlc2V0 LiA9PT09PQ0KPj4+Pj4+IHN0YXRpYyBpbmxpbmUNCj4+Pj4+PiB2b2lkIHhkcF9jb252ZXJ0X2Zy YW1lX3RvX2J1ZmYoc3RydWN0IHhkcF9mcmFtZSAqZnJhbWUsIHN0cnVjdCB4ZHBfYnVmZiAqeGRw KQ0KPj4+Pj4+IHsNCj4+Pj4+PiAgeGRwLT5kYXRhX2hhcmRfc3RhcnQgPSBmcmFtZS0+ZGF0YSAt IGZyYW1lLT5oZWFkcm9vbSAtIHNpemVvZigqZnJhbWUpOw0KPj4+Pj4+ICB4ZHAtPmRhdGEgPSBm cmFtZS0+ZGF0YTsNCj4+Pj4+PiAgeGRwLT5kYXRhX2VuZCA9IGZyYW1lLT5kYXRhICsgZnJhbWUt PmxlbjsNCj4+Pj4+PiAgeGRwLT5kYXRhX21ldGEgPSBmcmFtZS0+ZGF0YSAtIGZyYW1lLT5tZXRh c2l6ZTsNCj4+Pj4+PiAgeGRwLT5mcmFtZV9zeiA9IGZyYW1lLT5mcmFtZV9zejsNCj4+Pj4+PiB9 DQo+Pj4+Pj4NCj4+Pj4+PiB4c2suYzoyNjkgPT09PT0geHNrX3JjdiBjb25zdWx0cyByeHEgaW4g eGRwX2J1ZmYgd2hpY2ggaXMgbm90IGZpbGxlZCEgPT09PT0NCj4+Pj4+PiBzdGF0aWMgaW50IHhz a19yY3Yoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4g ew0KPj4+Pj4+ICBpbnQgZXJyOw0KPj4+Pj4+ICB1MzIgbGVuOw0KPj4+Pj4+DQo+Pj4+Pj4gIGVy ciA9IHhza19yY3ZfY2hlY2soeHMsIHhkcCk7DQo+Pj4+Pj4gIGlmIChlcnIpDQo+Pj4+Pj4gICAg ICByZXR1cm4gZXJyOw0KPj4+Pj4+DQo+Pj4+Pj4gIGlmICh4ZHAtPnJ4cS0+bWVtLnR5cGUgPT0g TUVNX1RZUEVfWFNLX0JVRkZfUE9PTCkgew0KPj4+Pj4+IGxlbiA9IHhkcC0+ZGF0YV9lbmQgLSB4 ZHAtPmRhdGE7DQo+Pj4+Pj4gICAgICByZXR1cm4gX194c2tfcmN2X3pjKHhzLCB4ZHAsIGxlbik7 DQo+Pj4+Pj4gIH0NCj4+Pj4+Pg0KPj4+Pj4+ICBlcnIgPSBfX3hza19yY3YoeHMsIHhkcCk7DQo+ Pj4+Pj4gIGlmICghZXJyKQ0KPj4+Pj4+IHhkcF9yZXR1cm5fYnVmZih4ZHApOw0KPj4+Pj4+ICBy ZXR1cm4gZXJyOw0KPj4+Pj4+IH0NCj4+Pj4+Pg0KPj4+Pj4+IGludCBfX3hza19tYXBfcmVkaXJl Y3Qoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4gew0K Pj4+Pj4+ICBzdHJ1Y3QgbGlzdF9oZWFkICpmbHVzaF9saXN0ID0gdGhpc19jcHVfcHRyKCZ4c2tt YXBfZmx1c2hfbGlzdCk7DQo+Pj4+Pj4gIGludCBlcnI7DQo+Pj4+Pj4NCj4+Pj4+PiAgZXJyID0g eHNrX3Jjdih4cywgeGRwKTsNCj4+Pj4+PiAgaWYgKGVycikNCj4+Pj4+PiByZXR1cm4gZXJyOw0K Pj4+Pj4+DQo+Pj4+Pj4gIGlmICgheHMtPmZsdXNoX25vZGUucHJldikNCj4+Pj4+PiAgICAgIGxp c3RfYWRkKCZ4cy0+Zmx1c2hfbm9kZSwgZmx1c2hfbGlzdCk7DQo+Pj4+Pj4NCj4+Pj4+PiAgcmV0 dXJuIDA7DQo+Pj4+Pj4gfQ0KPj4+Pj4+DQo+Pj4+Pj4+IE9uIDI0IE1heSAyMDI0LCBhdCAxODo0 OSwgWXV2YWwgRWwtSGFuYW55IDxZdXZhbEVAUmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+Pj4+Pg0K Pj4+Pj4+PiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Ig b3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93 IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pj4+Pj4+DQo+Pj4+Pj4+IEhpIEFsbCwNCj4+Pj4+Pj4g ICAgIEkgd291bGQgcmVhbGx5IGFwcHJlY2lhdGUgc29tZSBndWlkYW5jZSBoZXJlLiBBcyB0aGlz IGlzc3VlIHNwYW5zIGJvdGggbmV0d29yayBYRFAgYW5kIENQVSBtYXAsIGl04oCZcyBhIGJpdCBt b3JlIGRpZmZpY3VsdCBmb3IgbWUgdG8gZm9sbG93IGluIHRoZSBrZXJuZWwgY29kZS4gSSBhdHRl bXB0ZWQgdG8gdHJhY2UgdGhlIGlzc3VlIGluIHRoZSBzb3VyY2UsIGJ1dCBpdOKAmXMgYSBiaXQg Y29tcGxleCB0byBlbnRlciBleGlzdGluZyBjb2RlIGJhc2UuDQo+Pj4+Pj4+DQo+Pj4+Pj4+ICAg ICBJdCB3aWxsIGJlIGVhc2llciBpZiB5b3UgY2FuIHRlbGwgbWUgdGhlIGZvbGxvd2luZzoNCj4+ Pj4+Pj4gMS4gSXMgdGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWFpbnRhaW5lZCBjb3JyZWN0 bHkgdGhyb3VnaCB0aGUgQ1BVIHN3aXRjaCBpbiBDUFUgbWFwPyBJbiB0aGUgZGVzY3JpcHRpb24g b2YgQ1BVIG1hcCBpbiBYRFAgKGh0dHBzOi8vZGV2ZWxvcGVycy5yZWRoYXQuY29tL2Jsb2cvMjAy MS8wNS8xMy9yZWNlaXZlLXNpZGUtc2NhbGluZy1yc3Mtd2l0aC1lYnBmLWFuZC1jcHVtYXApLCBp dCBpcyBtZW50aW9uZWQgdGhhdCBzb21lIG1ldGFkYXRhIGlzIG5vdCBtYWludGFpbmVkIGFjcm9z cyB0aGUgQ1BVIHN3aXRjaCwgYnV0IHRoYXQgd291bGQgbWFrZSB0aGUgdW1lbSB0ZXN0IHByb2Js ZW1hdGljLiBTaG91bGQgSSBhc3N1bWUgdGhlIHJlY2VpdmUgcXVldWUgaXMgbWFpbnRhaW5lZD8N Cj4+Pj4+Pj4gMi4gRG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJl Y2VpdmUgcXVldWUgbWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBhIGRpZmZlcmVu dCBwb2ludGVyLCBidXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhlIHBhY2tldCBo ZWFkcm9vbSBpbiB0aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4+Pj4NCj4+Pj4+Pj4g ICAgIElmIHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFUgc3dp dGNoIHRoZW4gSSB0aGluayB0aGUgc2hhcmVkIHVtZW0gdGVzdCBzaG91bGQgcnVuIGFsb25nIHRo ZSBsaW5lcyBvZiB1c2luZyBzb21lIGRlZmF1bHQgcmVjZWl2ZSBxdWV1ZSBhZnRlciBzd2l0Y2hp bmcgQ1BVcy4gT3RoZXJ3aXNlLCBpdCBzaG91bGQgcHJvYmFibHkgZHJvcCBwYWNrZXRzIHdpdGgg aW52YWxpZCByZWNlaXZlIHF1ZXVlcy4NCj4+Pj4+Pj4NCj4+Pj4+Pj4gICAgIFRoYW5rcywNCj4+ Pj4+Pj4gICAgICAgICAgICAgWXV2YWwuDQo+Pj4+Pj4+DQo+Pj4+Pj4+PiBPbiAyMCBNYXkgMjAy NCwgYXQgMTg6MjQsIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUuY29tPiB3cm90ZToN Cj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBIaSwNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBTaG9ydCBWZXJzaW9u DQo+Pj4+Pj4+PiBJ4oCZdmUgZW5jb3VudGVyZWQgYW4gaXNzdWUgcmVkaXJlY3RpbmcgdHJhZmZp YyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2luZyBzaGFyZWQgVU1FTS4gVGhlIGZyYW1lIGFycml2 ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdpdGggaW52YWxpZCByZWNlaXZlIHF1ZXVlLiBUaGlz IGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0aGUgcGF0Y2ggdGhhdCBzdXBwb3J0cyByZWRpcmVj dGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1ZSB3aXRoIHRoZSBzYW1lIHVtZW0gZHVlIHRvIGEg dGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBMb25n IFZlcnNpb24NCj4+Pj4+Pj4+IEnigJl2ZSBjcmVhdGVkIGEgdGVzdCBwcm9ncmFtIHRoYXQgcmVk aXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNlcyAocmVwbGFjaW5nIHRoZSBNQUMg YWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4gSXQgc3RhcnRzIHR3byBzZXBhcmF0ZSBwcm9j ZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4gV2hlbiBkaXJlY3RpbmcgdHJhZmZpYyBkaXJl Y3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3JrcyB3ZWxsLiBJ4oCZbSBydW5uaW5nIG9uIGtl cm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRjaCBmb3Igc2hhcmVkIHVtZW0uDQo+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4gVGhlIG5leHQgc3RlcCB3YXMgYW4gWERQIHByb2dyYW0gdGhhdCByZWRpcmVj dHMgZWFjaCBwYWNrZXQgdG8gdGhlIG90aGVyIENQVSwgYW5kIHRoZSB4ZHAgQ1BVIHByb2dyYW0g cmVkaXJlY3QgdGhlIHBhY2tldHMgdG8gYW4gWERQIHNvY2tldC4gSW5pdGlhbGx5IHRoaXMgcmVz dWx0ZWQgaW4gYSBrZXJuZWwgY3Jhc2guIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgcmVjZWl2ZSBx dWV1ZSBpcyBub3QgcmVjZWl2ZWQgY29ycmVjdGx5IG9uY2UgdGhlIHBhY2tldCBzd2l0Y2hlcyBD UFUuDQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gSeKAmXZlIHBhdGNoZWQgdGhlIGtlcm5lbCBzbyBpdCBk b2VzIHNhbml0eSBjaGVjayBhbmQgZG9lcyBub3QgY3Jhc2ggYnV0IGRlZmF1bHRzIHRvIHF1ZXVl IDAganVzdCBmb3IgdGhlIHVtZW0gdGVzdC4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBUaGUga2VybmVs IG5vIGxvbmdlciBjcmFzaGVzIGJ1dCBJIGRvbuKAmXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRoZSBY U0sgc29ja2V0cywgYW5kIEkgbG9nIHRoZSByZWNlaXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBub3Qg c2VlbSByYW5kb206DQo+Pj4+Pj4+PiBPbiBmaXJzdCBpbnRlcmZhY2U6DQo+Pj4+Pj4+PiAweEMx MzIzRDUwDQo+Pj4+Pj4+PiAweEMxMzQzRDE5DQo+Pj4+Pj4+PiAweEMxMzQzRDUwDQo+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4gT24gc2Vjb25kIGludGVyZmFjZToNCj4+Pj4+Pj4+IDB4QzEzNEJENTANCj4+ Pj4+Pj4+IDB4QzEzNUJENTANCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBWZXJ5IGZldyBiaXRzIGRpZmZl cmVuY2VzIGJldHdlZW4gZWFjaCBvZiB0aGUg4oCccmVjZWl2ZSBxdWV1ZXPigJ0uIEkgY291bGRu 4oCZdCByZWFsbHkgZmluZCBzb21ldGhpbmcgaW4gbXkgcHJvZ3JhbSB3aXRoIHRob3NlIG9yIHNp bWlsYXIgdmFsdWVzLCBvciBpbiB0aGUgcGFja2V0cyBzbyBpdCBtYWtlcyBpdCBsZXNzIGxpa2Vs eSBpdCBjb21lcyBmcm9tIHNvbWV0aGluZyBJIGRvIGluIHVzZXJzcGFjZS4gU2VlbXMgdG8gc3Vn Z2VzdCBzb21lIGZsYWdzIGZpZWxkPyBUaGUgdmFsdWVzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1l IGFjcm9zcyByZWJvb3RzIGJ1dCBwcmV0dHkgY2xvc2UuDQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gQW0g SSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/IEl0IHNlZW1zIHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0 aGUgY29kZSBpbiB0aGUgWERQIHByb2dyYW0gd2FzIGp1c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4g VGhlIG9ubHkgb2RkaXR5IHBlcmhhcHMgaXMgdXNpbmcgdGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4+ Pj4NCj4+Pj4+Pj4+IFRoYW5rcywNCj4+Pj4+Pj4+IFl1dmFsLg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+ IEnigJltIGF0dGFjaGluZyB0aGUgcHJvZ3JhbSBhbmQgdmFsdWVzIGZyb20gbXkgImRlYnVnIG1h cOKAnS4gSW4gdGhlIGRlYnVnIG1hcDoNCj4+Pj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBXaGljaCB0 eXBlIG9mIHByb2dyYW0gcmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4NCj4+Pj4+ Pj4+IDEuIFZhbHVlcyAyWFkgLSBwYWNrZXQgcmVkaXJlY3RlZCBmcm9tIGNvcmUgWCB0byBjb3Jl IFkgKDFzdCBzdGFnZSkuDQo+Pj4+Pj4+PiAyLiBWYWx1ZXMgNFhZIC0gcGFja2V0IG9uIGNvcmUg WCByZXR1cm5zIGFjdGlvbiBZICgxc3Qgc3RhZ2UpLg0KPj4+Pj4+Pj4gKFRoZXNlIHN1Z2dlc3Qg dGhhdCAxc3Qgc3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+Pj4+PiAzLiBWYWx1ZXMgMVhY WVkgLSBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSBYWCBvbiBjb3JlIFlZIChYWCA9IDEwIGlzIGludmFs aWQgcmVjZWl2ZSBxdWV1ZSBvdXRzaWRlIDIuLjUpLg0KPj4+Pj4+Pj4gNC4gMlhYWFggLSBwYWNr ZXQgcmVjZWl2ZSBxdWV1ZSBvbiBhbnkgY29yZSAoWFhYWCAtIDQ5OTkgaW1lYW5zIHF1ZXVlIGdy ZWF0ZXIgdGhhbiA1MDAwKS4NCj4+Pj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2ZSBx dWV1ZS4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWVzIHdpdGhvdXQgQ1BVIHJl ZGlyZWN0aW9uOg0KPj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+ Pj4+PiB8IFBvcnQgfCBLZXkgIHwgICAgIFJlY2VpdmVkIHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0t LS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4gfCAgICAwIHwgMTAzMiB8ICAgICAgICAgIDUw NCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAxMDI0IHwgICAgIDM3MDA1OTkyIHwNCj4+Pj4+Pj4+IHwg ICAgMCB8IDEwMzQgfCAgICAgMzc1NDQwNTIgfA0KPj4+Pj4+Pj4gfCAgICAwIHwgICAgMCB8ICAg ICA3NDU0Njg3NSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAxMDM0IHwgICAgIDM1NzY1OTYxIHwNCj4+ Pj4+Pj4+IHwgICAgMSB8ICAgIDAgfCAgICAgNzE0OTI3NzMgfA0KPj4+Pj4+Pj4gfCAgICAxIHwg MTAyNCB8ICAgICAzNTcyOTEwNyB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAxMDMyIHwgICAgICAgICAg Mjc3IHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4N Cj4+Pj4+Pj4+IERlYnVnIG1hcCB2YWx1ZSB3aXRoIENQVSByZWRpcmVjdGlvbiAobm8gb3RoZXIg Y2hhbmdlKToNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+ Pj4gfCBQb3J0IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+Pj4+PiArLS0tLS0tKy0tLS0t LSstLS0tLS0tLS0tLS0tLSsNCj4+Pj4+Pj4+IHwgICAgMCB8ICAgIDEgfCAgICAgICAgIDM0MDAg fA0KPj4+Pj4+Pj4gfCAgICAwIHwgIDIyMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+Pj4+PiB8ICAg IDAgfCAgMjMyIHwgICAgICAgICAgNDU0IHwNCj4+Pj4+Pj4+IHwgICAgMCB8ICA0MjQgfCAgICAg ICAgICA0NTQgfA0KPj4+Pj4+Pj4gfCAgICAwIHwgIDQzNCB8ICAgICAgICAgMjk0NyB8DQo+Pj4+ Pj4+PiB8ICAgIDAgfCAxMTAwMiB8ICAgICAgICAgIDQ1NCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAx MTAwMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDAwMCB8ICAgICAgICAg IDEwNiB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDAxNiB8ICAgICAgICAgICAgNyB8DQo+Pj4+Pj4+ PiB8ICAgIDAgfCAyMDAyNCB8ICAgICAgICAgMTA1OCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDU4 MiB8ICAgICAgICAgICAgMiB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyNDk5OSB8ICAgICAgICAgMjIz MSB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAzMjQxMjk1MTg0IHwgICAgICAgICAgMzM5IHwNCj4+Pj4+ Pj4+IHwgICAgMCB8IDMyNDE0MjYyMDEgfCAgICAgICAgICAgIDMgfA0KPj4+Pj4+Pj4gfCAgICAw IHwgMzI0MTQyNjI1NiB8ICAgICAgICAgMTg5MSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAgICAxIHwg ICAgICAgICAxMDEzIHwNCj4+Pj4+Pj4+IHwgICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0K Pj4+Pj4+Pj4gfCAgICAxIHwgIDIzMiB8ICAgICAgICAgIDQwNCB8DQo+Pj4+Pj4+PiB8ICAgIDEg fCAgNDI0IHwgICAgICAgICAgNDA0IHwNCj4+Pj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAgICAgICAg ICA2MTAgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMTEwMDIgfCAgICAgICAgICA0MDQgfA0KPj4+Pj4+ Pj4gfCAgICAxIHwgMTEwMDMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjAw MDAgfCAgICAgICAgICAgMTcgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjAwMjQgfCAgICAgICAgICAz MDkgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjQ5OTkgfCAgICAgICAgICA2ODkgfA0KPj4+Pj4+Pj4g fCAgICAxIHwgMzI0MTQ1OTAyNCB8ICAgICAgICAgIDMwOSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAz MjQxNTI0NTYwIHwgICAgICAgICAgMzgxIHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0t LS0tLS0tLS0tKw0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IFRoZSBYRFAgY29kZSAoI2lmIDAgaXMgZm9y IHRoZSBubyBDUFUgcmVkaXJlY3Rpb24pOg0KPj4+Pj4+Pj4gLyogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAgKi8NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAjaW5jbHVkZSA8bGludXgvaWZf ZXRoZXIuaD4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxsaW51eC9icGYuaD4NCj4+Pj4+Pj4+ICNpbmNs dWRlIDxsaW51eC9pbi5oPg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2hl bHBlcnMuaD4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4+Pj4N Cj4+Pj4+Pj4+ICNpbmNsdWRlICJ4ZHAvcGFyc2luZ19oZWxwZXJzLmgiDQo+Pj4+Pj4+Pg0KPj4+ Pj4+Pj4gLyogUmVkaXJlY3QgdG8gU1AgcXVldWVzIG1hcC4gKi8NCj4+Pj4+Pj4+IHN0cnVjdA0K Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4gX191aW50ICh0eXBlLCBCUEZfTUFQX1RZUEVfWFNLTUFQKTsN Cj4+Pj4+Pj4+IF9fdHlwZSAoa2V5LCBfX3UzMik7DQo+Pj4+Pj4+PiBfX3R5cGUgKHZhbHVlLCBf X3UzMik7DQo+Pj4+Pj4+PiBfX3VpbnQgKG1heF9lbnRyaWVzLCAxMjgpOw0KPj4+Pj4+Pj4gfSB4 c2tzX21hcCBTRUMoIi5tYXBzIik7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gLyogUmVkaXJlY3QgdG8g Q1BVcyBtYXAuICovDQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+IF9fdWlu dCAodHlwZSwgQlBGX01BUF9UWVBFX0NQVU1BUCk7DQo+Pj4+Pj4+PiBfX3VpbnQgKGtleV9zaXpl LCBzaXplb2YgKF9fdTMyKSk7DQo+Pj4+Pj4+PiBfX3VpbnQgKHZhbHVlX3NpemUsIHNpemVvZiAo c3RydWN0IGJwZl9jcHVtYXBfdmFsKSk7DQo+Pj4+Pj4+PiBfX3VpbnQgKG1heF9lbnRyaWVzLCAz Mik7DQo+Pj4+Pj4+PiB9IGNwdV9tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+ IC8qIFN0YXRpc3RpY3MgYW5kIGRlYnVnIG1hcHMuICovDQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+ Pj4+IHsNCj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSk7 DQo+Pj4+Pj4+PiBfX3R5cGUgKGtleSwgX191MzIpOw0KPj4+Pj4+Pj4gX190eXBlICh2YWx1ZSwg X191MzIpOw0KPj4+Pj4+Pj4gX191aW50IChtYXhfZW50cmllcywgNjQpOw0KPj4+Pj4+Pj4gfSB4 ZHBfc3RhdHNfbWFwIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+ Pj4+Pj4+IHsNCj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOw0KPj4+ Pj4+Pj4gX190eXBlIChrZXksIF9fdTMyKTsNCj4+Pj4+Pj4+IF9fdHlwZSAodmFsdWUsIF9fdTMy KTsNCj4+Pj4+Pj4+IF9fdWludCAobWF4X2VudHJpZXMsIDY0KTsNCj4+Pj4+Pj4+IH0geGRwX2Rl YnVnX3Byb3RvIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBzdGF0aWMgX191MzIg b25ldmFsID0gMTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBpbnQgbXlfcGFyc2VfZXRoaGRyIChzdHJ1 Y3QgaGRyX2N1cnNvciogbmgsIHZvaWQqIGRhdGFlbmQsIHN0cnVjdCBldGhoZHIqKiBldGgpDQo+ Pj4+Pj4+PiB7DQo+Pj4+Pj4+PiBfX3UxNiBldGh0eXBlOw0KPj4+Pj4+Pj4gKmV0aCA9IG5oLT5w b3M7DQo+Pj4+Pj4+PiBpZiAoKHZvaWQqKSAmKCpldGgpIFsxXSA+IGRhdGFlbmQpDQo+Pj4+Pj4+ PiB7DQo+Pj4+Pj4+PiAgcmV0dXJuICgtMSk7DQo+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pg0KPj4+Pj4+ Pj4gZXRodHlwZSA9ICgqZXRoKS0+aF9wcm90bzsNCj4+Pj4+Pj4+IG5oLT5wb3MgPSAmKCpldGgp IFsxXTsNCj4+Pj4+Pj4+IGlmIChldGh0eXBlID09IGJwZl9udG9ocyAoRVRIX1BfODAyMVEpKQ0K Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4gIHN0cnVjdCB2bGFuX2hkciogdmxhbiA9IChzdHJ1Y3Qgdmxh bl9oZHIqKSAmKCpldGgpIFsxXTsNCj4+Pj4+Pj4+IGlmICgodm9pZCopICZ2bGFuIFsxXSA+IGRh dGFlbmQpDQo+Pj4+Pj4+PiB7DQo+Pj4+Pj4+PiAgICAgICAgIHJldHVybiAoLTEpOw0KPj4+Pj4+ Pj4gfQ0KPj4+Pj4+Pj4gICAgIGV0aHR5cGUgPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3By b3RvOw0KPj4+Pj4+Pj4gLyogaW5jX2RlYnVnX21hcCAoMTAwMDArKGJwZl9udG9ocyAodmxhbi0+ aF92bGFuX1RDSSkgJiAweDBGRkYpKTsgKi8NCj4+Pj4+Pj4+IC8qIGluY19kZWJ1Z19tYXAgKHZs YW4tPmhfdmxhbl9UQ0kpOyAqLw0KPj4+Pj4+Pj4gbmgtPnBvcyA9ICZ2bGFuIFsxXTsNCj4+Pj4+ Pj4+IH0NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiByZXR1cm4gKGV0aHR5cGUpOw0KPj4+Pj4+Pj4gfQ0K Pj4+Pj4+Pj4NCj4+Pj4+Pj4+IHN0YXRpYyB2b2lkIGluY19kZWJ1Z19tYXAgKF9fdTMyIGtleSkN Cj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICNpZmRlZiBXSVRIX1NUQVRTDQo+Pj4+Pj4+PiBicGZfbWFw X3VwZGF0ZV9lbGVtICgmeGRwX2RlYnVnX3Byb3RvLA0KPj4+Pj4+Pj4gICAgICAgICAgICAgICAg ICAgICAgJmtleSwgKF9fdTMyKikgJm9uZXZhbCwgQlBGX05PRVhJU1QpOw0KPj4+Pj4+Pj4gX191 MzIqIHJlYyA9IGJwZl9tYXBfbG9va3VwX2VsZW0gKCZ4ZHBfZGVidWdfcHJvdG8sIChfX3UzMiop ICZrZXkpOw0KPj4+Pj4+Pj4gaWYgKHJlYyAhPSBOVUxMKQ0KPj4+Pj4+Pj4gew0KPj4+Pj4+Pj4g ICsrKCpyZWMpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4gI2VuZGlmDQo+Pj4+Pj4+PiB9DQo+Pj4+ Pj4+Pg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBTRUMgKCJ4ZHAiKQ0KPj4+Pj4+Pj4g aW50IHJkd3JfeHNrX3Byb2cgKHN0cnVjdCB4ZHBfbWQgKmN0eCkNCj4+Pj4+Pj4+IHsNCj4+Pj4+ Pj4+IGVudW0geGRwX2FjdGlvbiBhY3Rpb247DQo+Pj4+Pj4+PiBpbnQgaW5kZXggPSBjdHgtPnJ4 X3F1ZXVlX2luZGV4Ow0KPj4+Pj4+Pj4gdm9pZCogZGF0YWVuZCA9ICh2b2lkICopKGxvbmcpY3R4 LT5kYXRhX2VuZDsNCj4+Pj4+Pj4+IHZvaWQqIGRhdGEgPSAodm9pZCAqKShsb25nKWN0eC0+ZGF0 YTsNCj4+Pj4+Pj4+IGludCBzdGFnZSA9IDA7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gc3RydWN0IGhk cl9jdXJzb3Igbmg7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gX191MzIgKnBrdF9jb3VudDsNCj4+Pj4+ Pj4+IHN0cnVjdCBldGhoZHIqIGV0aDsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAjaWZkZWYgV0lUSF9T VEFUUw0KPj4+Pj4+Pj4gcGt0X2NvdW50ID0gYnBmX21hcF9sb29rdXBfZWxlbSgmeGRwX3N0YXRz X21hcCwgJmluZGV4KTsNCj4+Pj4+Pj4+IGlmIChwa3RfY291bnQgIT0gTlVMTCkNCj4+Pj4+Pj4+ IHsNCj4+Pj4+Pj4+ICArKypwa3RfY291bnQ7DQo+Pj4+Pj4+PiB9DQo+Pj4+Pj4+PiAjZW5kaWYN Cj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAvKiBQYXJzZSBFdGhlcm5ldCAmIFZMQU4gKi8NCj4+Pj4+Pj4+ IG5oLnBvcyA9IGRhdGE7DQo+Pj4+Pj4+PiBpbnQgZXRodHlwZSA9IG15X3BhcnNlX2V0aGhkciAo Jm5oLCBkYXRhZW5kLCAmZXRoKTsNCj4+Pj4+Pj4+IGlmIChldGh0eXBlICE9IGJwZl9udG9ocyAo MHgwODAwKSkNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICByZXR1cm4gKFhEUF9QQVNTKTsNCj4+Pj4+ Pj4+IH0NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAvKiBEaXJlY3QgWFNLIHJlZGlyZWN0LiAqLw0KPj4+ Pj4+Pj4gI2lmIDANCj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+Pj4+IGFj dGlvbiA9ICBicGZfcmVkaXJlY3RfbWFwICgmeHNrc19tYXAsIGluZGV4LCBYRFBfUEFTUyk7DQo+ Pj4+Pj4+PiBpbmNfZGVidWdfbWFwICgxMDAwICsgaW5kZXgqMTAgKyBhY3Rpb24pOw0KPj4+Pj4+ Pj4gI2VuZGlmDQo+Pj4+Pj4+PiAvKiBDUFUgbWFwIHJlZGlyZWN0LiAqLw0KPj4+Pj4+Pj4gX191 MzIgY3B1aWQgPSBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQgKCk7DQo+Pj4+Pj4+PiBfX3UzMiB0 YXJnZXRjcHUgPSBjcHVpZCBeIDB4MDE7DQo+Pj4+Pj4+PiArK3N0YWdlOw0KPj4+Pj4+Pj4gaW5j X2RlYnVnX21hcCAoc3RhZ2UpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoMjAwICsgY3B1aWQg KiAxMCArIHRhcmdldGNwdSk7DQo+Pj4+Pj4+PiBhY3Rpb24gPSAgYnBmX3JlZGlyZWN0X21hcCAo JmNwdV9tYXAsIHRhcmdldGNwdSwgWERQX1BBU1MpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAo NDAwICsgdGFyZ2V0Y3B1ICogMTAgKyBhY3Rpb24pOw0KPj4+Pj4+Pj4gcmV0dXJuIChhY3Rpb24p Ow0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IFNFQyAoInhkcC9jcHVtYXAiKQ0KPj4+ Pj4+Pj4gaW50IHJkd3JfY3B1X3Byb2coc3RydWN0IHhkcF9tZCAqY3R4KQ0KPj4+Pj4+Pj4gew0K Pj4+Pj4+Pj4gX191NjQqIGRhdGFlbmQ2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGFfZW5k Ow0KPj4+Pj4+Pj4gX191NjQqIGRhdGE2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGE7DQo+ Pj4+Pj4+PiBfX3UzMiByeHF1ZXVlID0gY3R4LT5yeF9xdWV1ZV9pbmRleDsNCj4+Pj4+Pj4+IGlm IChyeHF1ZXVlIDwgNTAwMCkNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICBpbmNfZGVidWdfbWFwICgy MDAwMCArIHJ4cXVldWUpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4gZWxzZQ0KPj4+Pj4+Pj4gew0K Pj4+Pj4+Pj4gIGluY19kZWJ1Z19tYXAgKHJ4cXVldWUpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21h cCAoMjQ5OTkpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IHJ4cXVldWUgPSAocnhx dWV1ZSA+PSAyICYmIHJ4cXVldWUgPCA2KSA/IHJ4cXVldWUgOiAxMDsNCj4+Pj4+Pj4+IF9fdTMy IGNwdWlkID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4+Pj4gY3B1aWQgPSAo Y3B1aWQgPCAxMikgPyBjcHVpZCA6IDIwOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoMTAwMDAg KyAxMDAqcnhxdWV1ZSArIGNwdWlkKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiByZXR1cm4gYnBmX3Jl ZGlyZWN0X21hcCAoJnhza3NfbWFwLCBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQgKCksIDApOw0K Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4NCj4+Pj4+Pg0KPj4+Pj4NCj4+Pg0KDQo=