Re: XDP CPU maps & shared umem
Yuval El-Hanany <[email protected]> Tue, 28 May 2024 16:03:48 +0000
| Newsgroups | org.kernel.vger.xdp-newbies |
|---|---|
| Message-ID | <[email protected]> |
SGksDQogICAgICAgIHRoaXMgaXMgbXkgdGVtcG9yYXJ5IHBhdGNoIHRvIGdldCB0aGUgcmVjZWl2 ZSBxdWV1ZSBhY3Jvc3MgdGhlIENQVS1zLiBJ4oCZbSBub3Qgc3VyZSBJIHJlY29tbWVuZCBpdC4g SSBhdm9pZGVkIGluY3JlYXNpbmcgdGhlIGZyYW1lIHNpemUgYnkgcGlnZ3kgYmFja2luZyBvbiB0 aGUgbWVtb3J5IG1vZGVsIHR5cGUgd2hpY2ggcGxhY2VzIGRhdGEgaW4gbm9uIHJlbGV2YW50IHN0 cnVjdHVyZXMuIEl0IGFsc28gbGltaXRzIHRoZSByZWNlaXZlIHF1ZXVlIGluZGV4IHRvIHUxNiAo MjQgYml0cyB3b3VsZCBhbHNvIGJlIHBvc3NpYmxlKS4gSXQgZG9lcyB3b3JrIGFuZCB0cmFmZmlj IGlzIHJ1bm5pbmcgKEnigJlsbCBwcm9iYWJseSBoYXZlIGEgZm9sbG93dXAgcXVlc3Rpb24gb24g cGVyZm9ybWFuY2UgSSBleHBlY3RlZCBiZXR0ZXIgYnV0IEknbGwgZG8gc29tZSBtb3JlIHRlc3Rp bmcpLiBBbm90aGVyIGlzc3VlIC0gaXQgdXBkYXRlcyB0aGUgcnhxIGluIHhkcF9idWZmLiBJbiB0 aGUgY29udGV4dCBvZiBjcHVtYXAgaXTigJlzIG9rYXkgYXMgcnhxIGlzIG9ubHkgdXNlZCBpbW1l ZGlhdGVseSBpbiB0aGUgbG9vcCBhbmQgZGlzY2FyZGVkIGFmdGVyIHRoZSBsb29wLiBJIGhhdmVu 4oCZdCBmb3VuZCBhbnl3aGVyZSBpdOKAmXMgd3JvbmcuIEJ1dCB0aGVvcmV0aWNhbGx5IHJ4cSBt YXkgaGF2ZSBhIGxvbmdlciB0aW1lc3BhbiwgYW5kIG1heSBiZSBzaGFyZWQgYWNyb3NzIG11bHRp cGxlIGJ1ZmZlcnMuIE1vZGlmeWluZyBpdCwgbWF5IGFmZmVjdCBvdGhlciBidWZmZXJzIHRoYXQg YmVsb25nIHRvIGRpZmZlcmVudCByZWNlaXZlIHF1ZXVlIGluZGV4Lg0KDQogICAgICAgIChTb3Jy eSBmb3IgdGhlIGRvdWJsZSBtZXNzYWdlLCBwcmV2aW91cyBvbmUgd2FzIG5vdCBwbGFpbnRleHQg c28gaXQgd2FzIHJlamVjdGVkIGJ5IGdyb3VwIHNlcnZlcikNCg0KICAgICAgICBDaGVlcnMsDQog ICAgICAgICAgICAgICAgWXV2YWwuDQoNCmRpZmYgLXVyTiBhL2luY2x1ZGUvbmV0L3hkcC5oIGIv aW5jbHVkZS9uZXQveGRwLmgNCi0tLSBhL2luY2x1ZGUvbmV0L3hkcC5oIDIwMjMtMDYtMDUgMDc6 MjE6MjcuMDAwMDAwMDAwICswMDAwDQorKysgYi9pbmNsdWRlL25ldC94ZHAuaCAyMDI0LTA1LTI4 IDA3OjA0OjAwLjU0OTUwNzMxNiArMDAwMA0KQEAgLTQ4LDcgKzQ4LDggQEANCiAjZGVmaW5lIFhE UF9YTUlUX0ZMQUdTX01BU0sgICAgWERQX1hNSVRfRkxVU0gNCg0KIHN0cnVjdCB4ZHBfbWVtX2lu Zm8gew0KLSAgICAgICB1MzIgdHlwZTsgLyogZW51bSB4ZHBfbWVtX3R5cGUsIGJ1dCBrbm93biBz aXplIHR5cGUgKi8NCisgICAgICAgdTMyIHR5cGUgOiAxNjsgLyogZW51bSB4ZHBfbWVtX3R5cGUs IGJ1dCBrbm93biBzaXplIHR5cGUgKi8NCisgICAgdTMyIHJ4X3F1ZXVlX2luZGV4IDogMTY7DQog ICAgICAgIHUzMiBpZDsNCiB9Ow0KDQpAQCAtMTgwLDYgKzE4MSwxMCBAQA0KICAgICAgICB4ZHAt PmRhdGFfZW5kID0gZnJhbWUtPmRhdGEgKyBmcmFtZS0+bGVuOw0KICAgICAgICB4ZHAtPmRhdGFf bWV0YSA9IGZyYW1lLT5kYXRhIC0gZnJhbWUtPm1ldGFzaXplOw0KICAgICAgICB4ZHAtPmZyYW1l X3N6ID0gZnJhbWUtPmZyYW1lX3N6Ow0KKyAgICAgICBpZiAoeGRwLT5yeHEgIT0gTlVMTCkNCisg ICAgICAgew0KKyAgICAgICAgICAgICAgIHhkcC0+cnhxLT5xdWV1ZV9pbmRleCA9IGZyYW1lLT5t ZW0ucnhfcXVldWVfaW5kZXg7DQorICAgICAgIH0NCiB9DQoNCiBzdGF0aWMgaW5saW5lDQpAQCAt MjA2LDYgKzIxMSw4IEBADQogICAgICAgIHhkcF9mcmFtZS0+aGVhZHJvb20gPSBoZWFkcm9vbSAt IHNpemVvZigqeGRwX2ZyYW1lKTsNCiAgICAgICAgeGRwX2ZyYW1lLT5tZXRhc2l6ZSA9IG1ldGFz aXplOw0KICAgICAgICB4ZHBfZnJhbWUtPmZyYW1lX3N6ID0geGRwLT5mcmFtZV9zejsNCisgICAg ICAgeGRwX2ZyYW1lLT5tZW0ucnhfcXVldWVfaW5kZXggPQ0KKyAgICAgICAgICAgICAgICh4ZHAt PnJ4cSAhPSBOVUxMKSA/IHhkcC0+cnhxLT5xdWV1ZV9pbmRleCA6IDA7DQoNCiAgICAgICAgcmV0 dXJuIDA7DQogfQ0KQEAgLTIyNiw2ICsyMzMsNyBAQA0KDQogICAgICAgIC8qIHJ4cSBvbmx5IHZh bGlkIHVudGlsIG5hcGlfc2NoZWR1bGUgZW5kcywgY29udmVydCB0byB4ZHBfbWVtX2luZm8gKi8N CiAgICAgICAgeGRwX2ZyYW1lLT5tZW0gPSB4ZHAtPnJ4cS0+bWVtOw0KKyAgICAgICB4ZHBfZnJh bWUtPm1lbS5yeF9xdWV1ZV9pbmRleCA9IHhkcC0+cnhxLT5xdWV1ZV9pbmRleDsNCg0KICAgICAg ICByZXR1cm4geGRwX2ZyYW1lOw0KIH0NCmRpZmYgLXVyTiBhL25ldC9jb3JlL3hkcC5jIGIvbmV0 L2NvcmUveGRwLmMNCi0tLSBhL25ldC9jb3JlL3hkcC5jICAgIDIwMjMtMDYtMDUgMDc6MjE6Mjcu MDAwMDAwMDAwICswMDAwDQorKysgYi9uZXQvY29yZS94ZHAuYyAgICAyMDI0LTA1LTI4IDE0OjA1 OjI0LjUzMTYxNzI3OSArMDAwMA0KQEAgLTUzNiw2ICs1MzYsNyBAQA0KICAgICAgICB4ZHBmLT5t ZXRhc2l6ZSA9IG1ldGFzaXplOw0KICAgICAgICB4ZHBmLT5mcmFtZV9zeiA9IFBBR0VfU0laRTsN CiAgICAgICAgeGRwZi0+bWVtLnR5cGUgPSBNRU1fVFlQRV9QQUdFX09SREVSMDsNCisgICAgeGRw Zi0+bWVtLnJ4X3F1ZXVlX2luZGV4ID0gKHhkcC0+cnhxICE9IE5VTEwpID8geGRwLT5yeHEtPnF1 ZXVlX2luZGV4IDogMDsNCg0KICAgICAgICB4c2tfYnVmZl9mcmVlKHhkcCk7DQogICAgICAgIHJl dHVybiB4ZHBmOw0KDQo+IE9uIDI4IE1heSAyMDI0LCBhdCAxNTozOCwgWXV2YWwgRWwtSGFuYW55 IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0KPg0KPiBDQVVUSU9OOkV4dGVybmFsIEVtYWls LCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJl Y29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+DQo+IFN1 cmUuIFRoZSB0d28gcGF0Y2hlcyAodGhlIHNlY29uZCBpcyBqdXN0IGRvY3VtZW50YXRpb24pIGFy ZSBiZWxvdy4NCj4NCj4gICAgICAgIEnigJltIHRyeWluZyB0byBhZGQgdGhlIHJ4IHF1ZXVlIGZy b20geGRwX2J1ZmYgdG8gdGhlIHhkcF9mcmFtZSBhbmQgZXh0cmFjdCBpdCBiYWNrLiBJcyB0aGUg c2l6ZSBvciBhbGlnbm1lbnQgb2YgeGRwX2ZyYW1lIGNyaXRpY2FsPyBJcyBpdCBva2F5IHRvIGFk ZCB0aGUgcnggcXVldWUgYXMgYW4gZXh0cmEgZmllbGQsIG9yIHNob3VsZCBJIHRyeSB0byBhZGQg aXQgYXMgYSBiaXQgZmllbGQgb24gYW4gZXhpc3RpbmcgZmllbGQgbGlrZSB0aGUgbWVtb3J5IHR5 cGUgdGhhdCB0YWtlcyAzMiBiaXRzIGJ1dCBoYXMgb25seSA0IHZhbHVlcz8NCj4NCj4gICAgICAg IENoZWVycywNCj4gICAgICAgICAgICAgICAgWXV2YWwuDQo+DQo+IEZyb206IE1hZ251cyBLYXJs c3NvbiA8bWFnbnVzLmthcmxzc29uQGdtYWlsLmNvbT4NCj4gU3ViamVjdDogW1BBVENIIGJwZi1u ZXh0IDEvMl0geHNrOiBzdXBwb3J0IHJlZGlyZWN0IHRvIGFueSBzb2NrZXQgYm91bmQgdG8gdGhl IHNhbWUgdW1lbQ0KPiBEYXRlOiA1IEZlYnJ1YXJ5IDIwMjQgYXQgMTQ6MzU6NTAgR01UKzINCj4g VG86IG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20sIGJqb3JuQGtlcm5lbC5vcmcsIGFzdEBrZXJu ZWwub3JnLCBkYW5pZWxAaW9nZWFyYm94Lm5ldCwgbmV0ZGV2QHZnZXIua2VybmVsLm9yZywgbWFj aWVqLmZpamFsa293c2tpQGludGVsLmNvbSwgeXV2YWxlQHJhZHdhcmUuY29tDQo+IENjOiBicGZA dmdlci5rZXJuZWwub3JnDQo+DQo+IENBVVRJT046RXh0ZXJuYWwgRW1haWwsIERvIG5vdCBjbGlj ayBvbiBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRoZSBz ZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4NCj4gRnJvbTogTWFnbnVzIEth cmxzc29uIDxtYWdudXMua2FybHNzb25AaW50ZWwuY29tPg0KPg0KPiBBZGQgc3VwcG9ydCBmb3Ig ZGlyZWN0aW5nIGEgcGFja2V0IHRvIGFueSBzb2NrZXQgYm91bmQgdG8gdGhlIHNhbWUNCj4gdW1l bS4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFhEUCBwcm9ncmFtIHRvIHNlbGVj dCB3aGF0DQo+IHNvY2tldCB0aGUgcGFja2V0IHNob3VsZCBiZSByZWNlaXZlZCBvbi4gVGhlIHVz ZXIgY2FuIHBvcHVsYXRlIHRoZQ0KPiBYU0tNQVAgd2l0aCB2YXJpb3VzIHNvY2tldHMgYW5kIGFz IGxvbmcgYXMgdGhleSBzaGFyZSB0aGUgc2FtZSB1bWVtLA0KPiB0aGUgWERQIHByb2dyYW0gY2Fu IHBpY2sgYW55IG9uZSBvZiB0aGVtLg0KPg0KPiBTdWdnZXN0ZWQtYnk6IFl1dmFsIEVsLUhhbmFu eSA8eXV2YWxlQHJhZHdhcmUuY29tPg0KPiBTaWduZWQtb2ZmLWJ5OiBNYWdudXMgS2FybHNzb24g PG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQo+IC0tLQ0KPiBuZXQveGRwL3hzay5jIHwgNSAr KysrLQ0KPiAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pDQo+ DQo+IGRpZmYgLS1naXQgYS9uZXQveGRwL3hzay5jIGIvbmV0L3hkcC94c2suYw0KPiBpbmRleCAx ZWFkZmFjMDNjYzQuLmEzMzllOWExYjU1NyAxMDA2NDQNCj4gLS0tIGEvbmV0L3hkcC94c2suYw0K PiArKysgYi9uZXQveGRwL3hzay5jDQo+IEBAIC0zMTMsMTAgKzMxMywxMyBAQCBzdGF0aWMgYm9v bCB4c2tfaXNfYm91bmQoc3RydWN0IHhkcF9zb2NrICp4cykNCj4NCj4gc3RhdGljIGludCB4c2tf cmN2X2NoZWNrKHN0cnVjdCB4ZHBfc29jayAqeHMsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwLCB1MzIg bGVuKQ0KPiB7DQo+ICsgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHhkcC0+cnhxLT5k ZXY7DQo+ICsgICAgICAgdTMyIHFpZCA9IHhkcC0+cnhxLT5xdWV1ZV9pbmRleDsNCj4gKw0KPiAg ICAgICBpZiAoIXhza19pc19ib3VuZCh4cykpDQo+ICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJ TzsNCj4NCj4gLSAgICAgICBpZiAoeHMtPmRldiAhPSB4ZHAtPnJ4cS0+ZGV2IHx8IHhzLT5xdWV1 ZV9pZCAhPSB4ZHAtPnJ4cS0+cXVldWVfaW5kZXgpDQo+ICsgICAgICAgaWYgKCFkZXYtPl9yeFtx aWRdLnBvb2wgfHwgeHMtPnVtZW0gIT0gZGV2LT5fcnhbcWlkXS5wb29sLT51bWVtKQ0KPiAgICAg ICAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPg0KPiAgICAgICBpZiAobGVuID4geHNrX3Bvb2xf Z2V0X3J4X2ZyYW1lX3NpemUoeHMtPnBvb2wpICYmICF4cy0+c2cpIHsNCj4gLS0NCj4gMi40Mi4w DQo+DQo+IEZyb206IE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGludGVsLmNvbT4N Cj4NCj4gRG9jdW1lbnQgdGhlIGFiaWxpdHkgdG8gcmVkaXJlY3QgdG8gYW55IHNvY2tldCBib3Vu ZCB0byB0aGUgc2FtZSB1bWVtLg0KPg0KPiBTaWduZWQtb2ZmLWJ5OiBNYWdudXMgS2FybHNzb24g PG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQo+IC0tLQ0KPiBEb2N1bWVudGF0aW9uL25ldHdv cmtpbmcvYWZfeGRwLnJzdCB8IDMzICsrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tDQo+IDEg ZmlsZSBjaGFuZ2VkLCAxOSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkNCj4NCj4gZGlm ZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0IGIvRG9jdW1lbnRh dGlvbi9uZXR3b3JraW5nL2FmX3hkcC5yc3QNCj4gaW5kZXggZGNlZWIwZDc2M2FhLi43MmRhNzA1 N2U0Y2YgMTAwNjQ0DQo+IC0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0 DQo+ICsrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0DQo+IEBAIC0zMjks MjMgKzMyOSwyNCBAQCBYRFBfU0hBUkVEX1VNRU0gb3B0aW9uIGFuZCBwcm92aWRlIHRoZSBpbml0 aWFsIHNvY2tldCdzIGZkIGluIHRoZQ0KPiBzeGRwX3NoYXJlZF91bWVtX2ZkIGZpZWxkIGFzIHlv dSByZWdpc3RlcmVkIHRoZSBVTUVNIG9uIHRoYXQNCj4gc29ja2V0LiBUaGVzZSB0d28gc29ja2V0 cyB3aWxsIG5vdyBzaGFyZSBvbmUgYW5kIHRoZSBzYW1lIFVNRU0uDQo+DQo+IC1UaGVyZSBpcyBu byBuZWVkIHRvIHN1cHBseSBhbiBYRFAgcHJvZ3JhbSBsaWtlIHRoZSBvbmUgaW4gdGhlIHByZXZp b3VzDQo+IC1jYXNlIHdoZXJlIHNvY2tldHMgd2VyZSBib3VuZCB0byB0aGUgc2FtZSBxdWV1ZSBp ZCBhbmQNCj4gLWRldmljZS4gSW5zdGVhZCwgdXNlIHRoZSBOSUMncyBwYWNrZXQgc3RlZXJpbmcg Y2FwYWJpbGl0aWVzIHRvIHN0ZWVyDQo+IC10aGUgcGFja2V0cyB0byB0aGUgcmlnaHQgcXVldWUu IEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGVyZSBpcyBvbmx5DQo+IC1vbmUgcXVldWUgc2hh cmVkIGFtb25nIHNvY2tldHMsIHNvIHRoZSBOSUMgY2Fubm90IGRvIHRoaXMgc3RlZXJpbmcuIEl0 DQo+IC1jYW4gb25seSBzdGVlciBiZXR3ZWVuIHF1ZXVlcy4NCj4gLQ0KPiAtSW4gbGliYnBmLCB5 b3UgbmVlZCB0byB1c2UgdGhlIHhza19zb2NrZXRfX2NyZWF0ZV9zaGFyZWQoKSBBUEkgYXMgaXQN Cj4gLXRha2VzIGEgcmVmZXJlbmNlIHRvIGEgRklMTCByaW5nIGFuZCBhIENPTVBMRVRJT04gcmlu ZyB0aGF0IHdpbGwgYmUNCj4gLWNyZWF0ZWQgZm9yIHlvdSBhbmQgYm91bmQgdG8gdGhlIHNoYXJl ZCBVTUVNLiBZb3UgY2FuIHVzZSB0aGlzDQo+IC1mdW5jdGlvbiBmb3IgYWxsIHRoZSBzb2NrZXRz IHlvdSBjcmVhdGUsIG9yIHlvdSBjYW4gdXNlIGl0IGZvciB0aGUNCj4gLXNlY29uZCBhbmQgZm9s bG93aW5nIG9uZXMgYW5kIHVzZSB4c2tfc29ja2V0X19jcmVhdGUoKSBmb3IgdGhlIGZpcnN0DQo+ IC1vbmUuIEJvdGggbWV0aG9kcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQuDQo+ICtJbiB0aGlzIGNh c2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgTklDJ3MgcGFja2V0IHN0ZWVyaW5nDQo+ICtj YXBhYmlsaXRpZXMgdG8gc3RlZXIgdGhlIHBhY2tldHMgdG8gdGhlIHJpZ2h0IHF1ZXVlLiBUaGlz IGlzIG5vdA0KPiArcG9zc2libGUgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUgYXMgdGhlcmUgaXMg b25seSBvbmUgcXVldWUgc2hhcmVkDQo+ICthbW9uZyBzb2NrZXRzLCBzbyB0aGUgTklDIGNhbm5v dCBkbyB0aGlzIHN0ZWVyaW5nIGFzIGl0IGNhbiBvbmx5IHN0ZWVyDQo+ICtiZXR3ZWVuIHF1ZXVl cy4NCj4gKw0KPiArSW4gbGlieGRwIChvciBsaWJicGYgcHJpb3IgdG8gdmVyc2lvbiAxLjApLCB5 b3UgbmVlZCB0byB1c2UgdGhlDQo+ICt4c2tfc29ja2V0X19jcmVhdGVfc2hhcmVkKCkgQVBJIGFz IGl0IHRha2VzIGEgcmVmZXJlbmNlIHRvIGEgRklMTCByaW5nDQo+ICthbmQgYSBDT01QTEVUSU9O IHJpbmcgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHlvdSBhbmQgYm91bmQgdG8gdGhlDQo+ICtz aGFyZWQgVU1FTS4gWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgYWxsIHRoZSBzb2NrZXRz IHlvdSBjcmVhdGUsDQo+ICtvciB5b3UgY2FuIHVzZSBpdCBmb3IgdGhlIHNlY29uZCBhbmQgZm9s bG93aW5nIG9uZXMgYW5kIHVzZQ0KPiAreHNrX3NvY2tldF9fY3JlYXRlKCkgZm9yIHRoZSBmaXJz dCBvbmUuIEJvdGggbWV0aG9kcyB5aWVsZCB0aGUgc2FtZQ0KPiArcmVzdWx0Lg0KPg0KPiBOb3Rl IHRoYXQgYSBVTUVNIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBzb2NrZXRzIG9uIHRoZSBzYW1lIHF1 ZXVlIGlkDQo+IGFuZCBkZXZpY2UsIGFzIHdlbGwgYXMgYmV0d2VlbiBxdWV1ZXMgb24gdGhlIHNh bWUgZGV2aWNlIGFuZCBiZXR3ZWVuDQo+IC1kZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUuDQo+ICtk ZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkaXJlY3Qg dG8gYW55DQo+ICtzb2NrZXQgYXMgbG9uZyBhcyBpdCBpcyBib3VuZCB0byB0aGUgc2FtZSB1bWVt IHdpdGggWERQX1NIQVJFRF9VTUVNLg0KPg0KPiBYRFBfVVNFX05FRURfV0FLRVVQIGJpbmQgZmxh Zw0KPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBAQCAtODIyLDYgKzgyMywxMCBA QCBBOiBUaGUgc2hvcnQgYW5zd2VyIGlzIG5vLCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhl IG1vbWVudC4gVGhlDQo+ICAgc3dpdGNoLCBvciBvdGhlciBkaXN0cmlidXRpb24gbWVjaGFuaXNt LCBpbiB5b3VyIE5JQyB0byBkaXJlY3QNCj4gICB0cmFmZmljIHRvIHRoZSBjb3JyZWN0IHF1ZXVl IGlkIGFuZCBzb2NrZXQuDQo+DQo+ICsgICBOb3RlIHRoYXQgaWYgeW91IGFyZSB1c2luZyB0aGUg WERQX1NIQVJFRF9VTUVNIG9wdGlvbiwgaXQgaXMNCj4gKyAgIHBvc3NpYmxlIHRvIHN3aXRjaCB0 cmFmZmljIGJldHdlZW4gYW55IHNvY2tldCBib3VuZCB0byB0aGUgc2FtZQ0KPiArICAgdW1lbS4N Cj4gKw0KPiBROiBNeSBwYWNrZXRzIGFyZSBzb21ldGltZXMgY29ycnVwdGVkLiBXaGF0IGlzIHdy b25nPw0KPg0KPiBBOiBDYXJlIGhhcyB0byBiZSB0YWtlbiBub3QgdG8gZmVlZCB0aGUgc2FtZSBi dWZmZXIgaW4gdGhlIFVNRU0gaW50bw0KPiAtLQ0KPiAyLjQyLjANCj4NCj4+IE9uIDI4IE1heSAy MDI0LCBhdCAxNToyMSwgTWFnbnVzIEthcmxzc29uIDxtYWdudXMua2FybHNzb25AZ21haWwuY29t PiB3cm90ZToNCj4+DQo+PiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24g bGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVy IGFuZCBrbm93IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pg0KPj4gT24gTW9uLCAyNyBNYXkgMjAy NCBhdCAxMDoxMSwgTWFnbnVzIEthcmxzc29uIDxtYWdudXMua2FybHNzb25AZ21haWwuY29tPiB3 cm90ZToNCj4+Pg0KPj4+IE9uIE1vbiwgMjcgTWF5IDIwMjQgYXQgMDk6MzQsIFl1dmFsIEVsLUhh bmFueSA8eXV2YWxlQHJhZHdhcmUuY29tPiB3cm90ZToNCj4+Pj4NCj4+Pj4gWWVhaCwNCj4+Pj4g ICAgICAgYXMgZmFyIGRvd24gYXMgSSBkdWcgaW4gdGhlIGNvZGUsIGl0IHNlZW1zIGl04oCZcyB0 aGUgb25seSBvbmUgdGhhdOKAmXMgdXNlZC4gVGhlIG90aGVyIG1lbWJlcnMgYXJlIHJlZ19zdGF0 ZSAmIG5hcGlfaWQuIEnigJltIHVuZmFtaWxpYXIgd2l0aCB0aGVpciBleGFjdCBwdXJwb3Nlcywg YnV0IGRvZXNu4oCZdCBzb3VuZCBsaWtlIHRoZXnigJlyZSBuZWNlc3NhcnkgZG93biB0aGUgbGlu ZS4gT25lIG90aGVyIGNvbmNlcm4gaXMgdHhxIElNTy4gSXQgaXMgbm90IGluaXRpYWxpc2VkIHRv IGFueSB2YWx1ZSBpbiB4ZHBfYnVmZi4gV2hpbGUgaXQgbWF5IG5vdCBiZSByZWxldmFudCBjb25z aWRlcmluZyBpdOKAmXMgYSByZWNlaXZlZCBwYWNrZXQsIGl0IHNlZW1zIHdyb25nIHRvIGtlZXAg YSBkYW5nbGluZyBwb2ludGVyIGJvdGggaW4gdGVybXMgb2Ygc2VjdXJpdHkgKGxlYWtpbmcgcHJl dmlvdXMgdmFsdWVzKSBhbmQgcm9idXN0bmVzcy4gTWF5YmUganVzdCBzZXQgaXQgdG8gTlVMTD8N Cj4+Pj4NCj4+Pj4gICAgICAgSeKAmXZlIGJlZW4gcmFja2luZyBteSBicmFpbiBhcyB0byB3aGF0 IGlzIHRoZSBhY2NlcHRlZCBtZXRob2QgdG8gcGFzcyB0aGUgcmVjZWl2ZSBxdWV1ZS4gUGFzc2lu ZyBpdCBvbiB0aGUgcGFja2V0IGhlYWRyb29tIHNlZW1lZCBsaWtlIGEgcmVhc29uYWJsZSBzb2x1 dGlvbiwgYnV0IGl0IHdvdWxkIG1lYW4gbWVtb3J5IGFjY2VzcyB0byB0aGUgcGFja2V0IG1lbW9y eSBvbiBwYWNrZXQgYXJyaXZhbCBvbiB0aGUgc2Vjb25kIENQVSB3aGljaCBtYXkgYmUgaGFybWZ1 bCB0byBwZXJmb3JtYW5jZS4gVGhlIHF1ZXVlIGl0c2VsZiBpcyBqdXN0IGEgcG9pbnRlciBxdWV1 ZSBzbyBjYW7igJl0IHBpZ2d5YmFjayBvbiBpdCB1bmxlc3MgdXNpbmcgYSBkaWZmZXJlbnQga2lu ZCBvZiBxdWV1ZS4gV291bGQgYmUgZ3JlYXQgdG8gaGVhciBob3cgaXQgc2hvdWxkIGJlIGRvbmUu DQo+Pj4NCj4+PiBMZXQgbWUgZ2V0IGludG8gdGhpcyBwaWVjZSBvZiBjb2RlIGFuZCBzY3JhdGNo IG15IGhlYWQgZm9yIGEgd2hpbGUgYW5kDQo+Pj4gSSB3aWxsIGdldCBiYWNrIHRvIHlvdS4gRG8g bm90IGhhdmUgYSBzb2x1dGlvbiBvbiB0b3Agb2YgbXkgaGVhZC4gV2lsbA0KPj4+IGxvb3AgaW4g TWFjaWVqIHRvby4NCj4+DQo+PiBZdXZhbCwNCj4+DQo+PiBDb3VsZCB5b3UgcGxlYXNlIHNlbmQg bWUgdGhlIHBhdGNoIHRoYXQgeW91IGFyZSB1c2luZz8gSSBjYW5ub3QNCj4+IHJlbWVtYmVyIHdo YXQgSSBzZW50IHlvdSA6LSkuDQo+Pg0KPj4+IC9NYWdudXMNCj4+Pg0KPj4+PiAgICAgICBUaGFu a3MsDQo+Pj4+ICAgICAgICAgICAgICAgWXV2YWwuDQo+Pj4+DQo+Pj4+PiBPbiAyNyBNYXkgMjAy NCwgYXQgODo0OCwgTWFnbnVzIEthcmxzc29uIDxtYWdudXMua2FybHNzb25AZ21haWwuY29tPiB3 cm90ZToNCj4+Pj4+DQo+Pj4+PiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sg b24gbGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2Vu ZGVyIGFuZCBrbm93IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pj4+Pg0KPj4+Pj4gT24gU3VuLCAy NiBNYXkgMjAyNCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+ IHdyb3RlOg0KPj4+Pj4+DQo+Pj4+Pj4gQ29ycmVjdGlvbiwNCj4+Pj4+PiAgICAgIHRoZSByeHEg cG9pbnRlciBpcyBpbml04oCZZCBnbG9iYWxseSBmb3IgYWxsIGZyYW1lcyBiZWZvcmUgdGhlIGZy YW1lIGxvb3BzLCBidXQgb25seSB0aGUgZGV2aWNlIGFuZCB0aGUgbWVtb3J5IGluZm9ybWF0aW9u IGFyZSBzZXQgZnJvbSB0aGUgWERQIGZyYW1lLiBTbyBzdGlsbCBhbiBpc3N1ZSB3aXRoIHRoZSBx dWV1ZV9pbmRleCwgYnV0IHRoZSB0ZXN0cyBvbiB0aGUgZGV2aWNlIGFuZCBtZW1vcnkgaW5mbyBp biB4c2tfcmN2IHNob3VsZCBiZSBmaW5lLg0KPj4+Pj4+DQo+Pj4+Pj4gICAgICBDaGVlcnMsDQo+ Pj4+Pj4gICAgICAgICAgICAgIFl1dmFsLg0KPj4+Pj4NCj4+Pj4+IEhpIFl1dmFsLA0KPj4+Pj4N Cj4+Pj4+IE5vdyBJIGFtIGJhY2suIFllcywgdGhpcyBzZWVtcyB0byBiZSBhIGJ1ZyBzbyB0aGFu ayB5b3UgZm9yIHNwb3R0aW5nDQo+Pj4+PiBpdC4gVGhpcyBpcyBub3RoaW5nIEkgaGF2ZSBldmVy IHRlc3RlZCBzaW5jZSBJIHRob3VnaHQgeW91IHdvdWxkIGRvIGFuDQo+Pj4+PiBYU0tNQVAgcmVk aXJlY3QgdG8gdGhlICJyaWdodCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhpbmcNCj4+ Pj4+IGhpbmRlcmluZyB0aGF0IHNvbWVvbmUgd291bGQgZG8gYSBDUFVNQVAgcmVkaXJlY3QgZmly c3QgdGhlbiBhbiBYU0tNQVANCj4+Pj4+IHJlZGlyZWN0LCBzbyBzaG91bGQgYmUgc3VwcG9ydGVk LiBTbyBpbiB5b3VyIGFuYWx5c2lzLCBpcyBpdCBvbmx5DQo+Pj4+PiBxdWV1ZV9pbmRleCB0aGF0 IG5lZWRzIHRvIGJlIHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4+Pj4+ IHRoaXMgdG8gd29yaz8NCj4+Pj4+DQo+Pj4+PiBUaGFua3M6IE1hZ251cw0KPj4+Pj4NCj4+Pj4+ Pj4gT24gMjYgTWF5IDIwMjQsIGF0IDEyOjAyLCBZdXZhbCBFbC1IYW5hbnkgPHl1dmFsZUByYWR3 YXJlLmNvbT4gd3JvdGU6DQo+Pj4+Pj4+DQo+Pj4+Pj4+IEhpLA0KPj4+Pj4+PiBzbyBJ4oCZdmUg ZHVnIGEgYml0IGRlZXBlci4gSXQgc2VlbXMgdGhlIHJlY2VpdmUgcXVldWUgaXMgbm90IG1haW50 YWluZWQgYWNyb3NzIENQVXMgYW5kIHRoaXMgbWF5IG1ha2UgdGhlIHdob2xlIHByYWN0aWNlIG9m IHJlZGlyZWN0aW5nIHRvIFhTSyB1bnNhZmUgaWYgSSByZWFkIHRoZSBjb2RlIGNvcnJlY3RseS4g SXQgYWxzbyBzZWVtcyB0aGlzIHBlcnNpc3RzIHRvIGtlcm5lbCA2LjYuOC4gQW0gSSBtaXNzaW5n IHNvbWV0aGluZz8NCj4+Pj4+Pj4NCj4+Pj4+Pj4gVGhlIGNvZGUgaW4gY3B1bWFwIHJ1bnMgWERQ IHByb2dyYW1zIEJVVCBkb2VzbuKAmXQgZmlsbCB0aGUgcnhxIChzZWUgYWxzbyB0aGUgVE9ETyBj b21tZW50IGluIHRoZSBjb2RlKS4gVGhlIFhEUCBmcmFtZSBpcyBjb252ZXJ0ZWQgdG8gWERQIGJ1 ZmZlciBidXQgdGhlIHJ4cSBhbmQgdHhxIGFyZSBub3QgZmlsbGVkLiBJdCBzZWVtcyB0aGV5IHJl bWFpbiBhcyBkYW5nbGluZyBwb2ludGVycy4gV2hlbiBfX3hza19tYXBfcmVkaXJlY3QgaXMgY2Fs bGVkIGFuZCBpbiB0dXJuIHhza19yY3YgdGhlIHJ4cSBpcyBjb25zdWx0ZWQgYm90aCB0byBjaGVj ayBpZiB0aGUgdW1lbSBpcyBzaGFyZWQgKGluIHRoZSBuZXcgcGF0Y2gpIGFzIHdlbGwgYXMgZGVj aWRlIHdoZXRoZXIgemVybyBjb3B5IGlzIHVzZWQgb3Igbm90LiBTaW5jZSByeHEgaXMgbm90IHZh bGlkLCBJ4oCZbSBub3QgY2VydGFpbiB3aGF0IHRoZSBvdXRjb21lIGlzLiBPbmNlIEkgYnlwYXNz ZWQgdW1lbSBjaGVjaywgSSBubyBsb25nZXIgY3Jhc2ggdGhlIGtlcm5lbCBidXQgSSdtIGRlZmlu aXRlbHkgbm90IHNlZWluZyB0cmFmZmljIHJ1bm5pbmcuDQo+Pj4+Pj4+DQo+Pj4+Pj4+IFRoYW5r cywNCj4+Pj4+Pj4gWXV2YWwuDQo+Pj4+Pj4+DQo+Pj4+Pj4+IEhlcmUgYXJlIHRoZSBleGNlcnB0 cyBmcm9tIHRoZSBjb2RlICg1LjE1LjExNyk6DQo+Pj4+Pj4+DQo+Pj4+Pj4+IGNwdW1hcC5jOjIx MiA8Y3B1X21hcF9icGZfcHJvZ19ydW5feGRwPiA9PT09PSBOb3RlIHRoZSBjb21tZW50IGluIHRo ZSBjb2RlLiA9PT09PQ0KPj4+Pj4+PiBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQo+Pj4+Pj4+ ICAgICBzdHJ1Y3QgeGRwX2ZyYW1lICp4ZHBmID0gZnJhbWVzW2ldOw0KPj4+Pj4+PiAgICAgdTMy IGFjdDsNCj4+Pj4+Pj4gICAgIGludCBlcnI7DQo+Pj4+Pj4+DQo+Pj4+Pj4+IHJ4cS5kZXYgPSB4 ZHBmLT5kZXZfcng7DQo+Pj4+Pj4+ICAgICByeHEubWVtID0geGRwZi0+bWVtOw0KPj4+Pj4+PiAg ICAgLyogVE9ETzogcmVwb3J0IHF1ZXVlX2luZGV4IHRvIHhkcF9yeHFfaW5mbyAqLw0KPj4+Pj4+ Pg0KPj4+Pj4+PiAgICAgeGRwX2NvbnZlcnRfZnJhbWVfdG9fYnVmZih4ZHBmLCAmeGRwKTsNCj4+ Pj4+Pj4NCj4+Pj4+Pj4gICAgIGFjdCA9IGJwZl9wcm9nX3J1bl94ZHAocmNwdS0+cHJvZywgJnhk cCk7DQo+Pj4+Pj4+DQo+Pj4+Pj4+IHhkcC5oOjE3NSA9PT09PSByeHEgJiB0eHEgaW4gdGhlIHhk cF9idWZmIGFyZSBub3QgZmlsbGVkIG9yIGV2ZW4gcmVzZXQuID09PT09DQo+Pj4+Pj4+IHN0YXRp YyBpbmxpbmUNCj4+Pj4+Pj4gdm9pZCB4ZHBfY29udmVydF9mcmFtZV90b19idWZmKHN0cnVjdCB4 ZHBfZnJhbWUgKmZyYW1lLCBzdHJ1Y3QgeGRwX2J1ZmYgKnhkcCkNCj4+Pj4+Pj4gew0KPj4+Pj4+ PiB4ZHAtPmRhdGFfaGFyZF9zdGFydCA9IGZyYW1lLT5kYXRhIC0gZnJhbWUtPmhlYWRyb29tIC0g c2l6ZW9mKCpmcmFtZSk7DQo+Pj4+Pj4+IHhkcC0+ZGF0YSA9IGZyYW1lLT5kYXRhOw0KPj4+Pj4+ PiB4ZHAtPmRhdGFfZW5kID0gZnJhbWUtPmRhdGEgKyBmcmFtZS0+bGVuOw0KPj4+Pj4+PiB4ZHAt PmRhdGFfbWV0YSA9IGZyYW1lLT5kYXRhIC0gZnJhbWUtPm1ldGFzaXplOw0KPj4+Pj4+PiB4ZHAt PmZyYW1lX3N6ID0gZnJhbWUtPmZyYW1lX3N6Ow0KPj4+Pj4+PiB9DQo+Pj4+Pj4+DQo+Pj4+Pj4+ IHhzay5jOjI2OSA9PT09PSB4c2tfcmN2IGNvbnN1bHRzIHJ4cSBpbiB4ZHBfYnVmZiB3aGljaCBp cyBub3QgZmlsbGVkISA9PT09PQ0KPj4+Pj4+PiBzdGF0aWMgaW50IHhza19yY3Yoc3RydWN0IHhk cF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4+IHsNCj4+Pj4+Pj4gaW50 IGVycjsNCj4+Pj4+Pj4gdTMyIGxlbjsNCj4+Pj4+Pj4NCj4+Pj4+Pj4gZXJyID0geHNrX3Jjdl9j aGVjayh4cywgeGRwKTsNCj4+Pj4+Pj4gaWYgKGVycikNCj4+Pj4+Pj4gICAgIHJldHVybiBlcnI7 DQo+Pj4+Pj4+DQo+Pj4+Pj4+IGlmICh4ZHAtPnJ4cS0+bWVtLnR5cGUgPT0gTUVNX1RZUEVfWFNL X0JVRkZfUE9PTCkgew0KPj4+Pj4+PiBsZW4gPSB4ZHAtPmRhdGFfZW5kIC0geGRwLT5kYXRhOw0K Pj4+Pj4+PiAgICAgcmV0dXJuIF9feHNrX3Jjdl96Yyh4cywgeGRwLCBsZW4pOw0KPj4+Pj4+PiB9 DQo+Pj4+Pj4+DQo+Pj4+Pj4+IGVyciA9IF9feHNrX3Jjdih4cywgeGRwKTsNCj4+Pj4+Pj4gaWYg KCFlcnIpDQo+Pj4+Pj4+IHhkcF9yZXR1cm5fYnVmZih4ZHApOw0KPj4+Pj4+PiByZXR1cm4gZXJy Ow0KPj4+Pj4+PiB9DQo+Pj4+Pj4+DQo+Pj4+Pj4+IGludCBfX3hza19tYXBfcmVkaXJlY3Qoc3Ry dWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4+IHsNCj4+Pj4+ Pj4gc3RydWN0IGxpc3RfaGVhZCAqZmx1c2hfbGlzdCA9IHRoaXNfY3B1X3B0cigmeHNrbWFwX2Zs dXNoX2xpc3QpOw0KPj4+Pj4+PiBpbnQgZXJyOw0KPj4+Pj4+Pg0KPj4+Pj4+PiBlcnIgPSB4c2tf cmN2KHhzLCB4ZHApOw0KPj4+Pj4+PiBpZiAoZXJyKQ0KPj4+Pj4+PiByZXR1cm4gZXJyOw0KPj4+ Pj4+Pg0KPj4+Pj4+PiBpZiAoIXhzLT5mbHVzaF9ub2RlLnByZXYpDQo+Pj4+Pj4+ICAgICBsaXN0 X2FkZCgmeHMtPmZsdXNoX25vZGUsIGZsdXNoX2xpc3QpOw0KPj4+Pj4+Pg0KPj4+Pj4+PiByZXR1 cm4gMDsNCj4+Pj4+Pj4gfQ0KPj4+Pj4+Pg0KPj4+Pj4+Pj4gT24gMjQgTWF5IDIwMjQsIGF0IDE4 OjQ5LCBZdXZhbCBFbC1IYW5hbnkgPFl1dmFsRUBSYWR3YXJlLmNvbT4gd3JvdGU6DQo+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4gQ0FVVElPTjpFeHRlcm5hbCBFbWFpbCwgRG8gbm90IGNsaWNrIG9uIGxpbmtz IG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSByZWNvZ25pemUgdGhlIHNlbmRlciBhbmQg a25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IEhpIEFsbCwNCj4+ Pj4+Pj4+ICAgIEkgd291bGQgcmVhbGx5IGFwcHJlY2lhdGUgc29tZSBndWlkYW5jZSBoZXJlLiBB cyB0aGlzIGlzc3VlIHNwYW5zIGJvdGggbmV0d29yayBYRFAgYW5kIENQVSBtYXAsIGl04oCZcyBh IGJpdCBtb3JlIGRpZmZpY3VsdCBmb3IgbWUgdG8gZm9sbG93IGluIHRoZSBrZXJuZWwgY29kZS4g SSBhdHRlbXB0ZWQgdG8gdHJhY2UgdGhlIGlzc3VlIGluIHRoZSBzb3VyY2UsIGJ1dCBpdOKAmXMg YSBiaXQgY29tcGxleCB0byBlbnRlciBleGlzdGluZyBjb2RlIGJhc2UuDQo+Pj4+Pj4+Pg0KPj4+ Pj4+Pj4gICAgSXQgd2lsbCBiZSBlYXNpZXIgaWYgeW91IGNhbiB0ZWxsIG1lIHRoZSBmb2xsb3dp bmc6DQo+Pj4+Pj4+PiAxLiBJcyB0aGUgcmVjZWl2ZSBxdWV1ZSBtZXRhZGF0YSBtYWludGFpbmVk IGNvcnJlY3RseSB0aHJvdWdoIHRoZSBDUFUgc3dpdGNoIGluIENQVSBtYXA/IEluIHRoZSBkZXNj cmlwdGlvbiBvZiBDUFUgbWFwIGluIFhEUCAoaHR0cHM6Ly9kZXZlbG9wZXJzLnJlZGhhdC5jb20v YmxvZy8yMDIxLzA1LzEzL3JlY2VpdmUtc2lkZS1zY2FsaW5nLXJzcy13aXRoLWVicGYtYW5kLWNw dW1hcCksIGl0IGlzIG1lbnRpb25lZCB0aGF0IHNvbWUgbWV0YWRhdGEgaXMgbm90IG1haW50YWlu ZWQgYWNyb3NzIHRoZSBDUFUgc3dpdGNoLCBidXQgdGhhdCB3b3VsZCBtYWtlIHRoZSB1bWVtIHRl c3QgcHJvYmxlbWF0aWMuIFNob3VsZCBJIGFzc3VtZSB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBtYWlu dGFpbmVkPw0KPj4+Pj4+Pj4gMi4gRG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3Mg dG8gdGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBh IGRpZmZlcmVudCBwb2ludGVyLCBidXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhl IHBhY2tldCBoZWFkcm9vbSBpbiB0aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4+Pj4+ DQo+Pj4+Pj4+PiAgICBJZiB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgbWFpbnRhaW5lZCBhY3Jv c3MgQ1BVIHN3aXRjaCB0aGVuIEkgdGhpbmsgdGhlIHNoYXJlZCB1bWVtIHRlc3Qgc2hvdWxkIHJ1 biBhbG9uZyB0aGUgbGluZXMgb2YgdXNpbmcgc29tZSBkZWZhdWx0IHJlY2VpdmUgcXVldWUgYWZ0 ZXIgc3dpdGNoaW5nIENQVXMuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHByb2JhYmx5IGRyb3AgcGFj a2V0cyB3aXRoIGludmFsaWQgcmVjZWl2ZSBxdWV1ZXMuDQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gICAg VGhhbmtzLA0KPj4+Pj4+Pj4gICAgICAgICAgICBZdXZhbC4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4g T24gMjAgTWF5IDIwMjQsIGF0IDE4OjI0LCBZdXZhbCBFbC1IYW5hbnkgPFl1dmFsRUBSYWR3YXJl LmNvbT4gd3JvdGU6DQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBIaSwNCj4+Pj4+Pj4+Pg0KPj4+Pj4+ Pj4+IFNob3J0IFZlcnNpb24NCj4+Pj4+Pj4+PiBJ4oCZdmUgZW5jb3VudGVyZWQgYW4gaXNzdWUg cmVkaXJlY3RpbmcgdHJhZmZpYyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2luZyBzaGFyZWQgVU1F TS4gVGhlIGZyYW1lIGFycml2ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdpdGggaW52YWxpZCBy ZWNlaXZlIHF1ZXVlLiBUaGlzIGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0aGUgcGF0Y2ggdGhh dCBzdXBwb3J0cyByZWRpcmVjdGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1ZSB3aXRoIHRoZSBz YW1lIHVtZW0gZHVlIHRvIGEgdGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+ Pj4+Pg0KPj4+Pj4+Pj4+IExvbmcgVmVyc2lvbg0KPj4+Pj4+Pj4+IEnigJl2ZSBjcmVhdGVkIGEg dGVzdCBwcm9ncmFtIHRoYXQgcmVkaXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNl cyAocmVwbGFjaW5nIHRoZSBNQUMgYWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4gSXQgc3Rh cnRzIHR3byBzZXBhcmF0ZSBwcm9jZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4gV2hlbiBk aXJlY3RpbmcgdHJhZmZpYyBkaXJlY3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3JrcyB3ZWxs LiBJ4oCZbSBydW5uaW5nIG9uIGtlcm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRjaCBmb3Ig c2hhcmVkIHVtZW0uDQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBUaGUgbmV4dCBzdGVwIHdhcyBhbiBY RFAgcHJvZ3JhbSB0aGF0IHJlZGlyZWN0cyBlYWNoIHBhY2tldCB0byB0aGUgb3RoZXIgQ1BVLCBh bmQgdGhlIHhkcCBDUFUgcHJvZ3JhbSByZWRpcmVjdCB0aGUgcGFja2V0cyB0byBhbiBYRFAgc29j a2V0LiBJbml0aWFsbHkgdGhpcyByZXN1bHRlZCBpbiBhIGtlcm5lbCBjcmFzaC4gVGhlIHJlYXNv biBpcyB0aGF0IHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCByZWNlaXZlZCBjb3JyZWN0bHkgb25j ZSB0aGUgcGFja2V0IHN3aXRjaGVzIENQVS4NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IEnigJl2ZSBw YXRjaGVkIHRoZSBrZXJuZWwgc28gaXQgZG9lcyBzYW5pdHkgY2hlY2sgYW5kIGRvZXMgbm90IGNy YXNoIGJ1dCBkZWZhdWx0cyB0byBxdWV1ZSAwIGp1c3QgZm9yIHRoZSB1bWVtIHRlc3QuDQo+Pj4+ Pj4+Pj4NCj4+Pj4+Pj4+PiBUaGUga2VybmVsIG5vIGxvbmdlciBjcmFzaGVzIGJ1dCBJIGRvbuKA mXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRoZSBYU0sgc29ja2V0cywgYW5kIEkgbG9nIHRoZSByZWNl aXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBub3Qgc2VlbSByYW5kb206DQo+Pj4+Pj4+Pj4gT24gZmly c3QgaW50ZXJmYWNlOg0KPj4+Pj4+Pj4+IDB4QzEzMjNENTANCj4+Pj4+Pj4+PiAweEMxMzQzRDE5 DQo+Pj4+Pj4+Pj4gMHhDMTM0M0Q1MA0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gT24gc2Vjb25kIGlu dGVyZmFjZToNCj4+Pj4+Pj4+PiAweEMxMzRCRDUwDQo+Pj4+Pj4+Pj4gMHhDMTM1QkQ1MA0KPj4+ Pj4+Pj4+DQo+Pj4+Pj4+Pj4gVmVyeSBmZXcgYml0cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2gg b2YgdGhlIOKAnHJlY2VpdmUgcXVldWVz4oCdLiBJIGNvdWxkbuKAmXQgcmVhbGx5IGZpbmQgc29t ZXRoaW5nIGluIG15IHByb2dyYW0gd2l0aCB0aG9zZSBvciBzaW1pbGFyIHZhbHVlcywgb3IgaW4g dGhlIHBhY2tldHMgc28gaXQgbWFrZXMgaXQgbGVzcyBsaWtlbHkgaXQgY29tZXMgZnJvbSBzb21l dGhpbmcgSSBkbyBpbiB1c2Vyc3BhY2UuIFNlZW1zIHRvIHN1Z2dlc3Qgc29tZSBmbGFncyBmaWVs ZD8gVGhlIHZhbHVlcyBhcmUgbm90IGFsd2F5cyB0aGUgc2FtZSBhY3Jvc3MgcmVib290cyBidXQg cHJldHR5IGNsb3NlLg0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gQW0gSSBkb2luZyBzb21ldGhpbmcg d3Jvbmc/IEl0IHNlZW1zIHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgWERQ IHByb2dyYW0gd2FzIGp1c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4gVGhlIG9ubHkgb2RkaXR5IHBl cmhhcHMgaXMgdXNpbmcgdGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gVGhh bmtzLA0KPj4+Pj4+Pj4+IFl1dmFsLg0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gSeKAmW0gYXR0YWNo aW5nIHRoZSBwcm9ncmFtIGFuZCB2YWx1ZXMgZnJvbSBteSAiZGVidWcgbWFw4oCdLiBJbiB0aGUg ZGVidWcgbWFwOg0KPj4+Pj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBXaGljaCB0eXBlIG9mIHByb2dy YW0gcmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4NCj4+Pj4+Pj4+PiAxLiBWYWx1 ZXMgMlhZIC0gcGFja2V0IHJlZGlyZWN0ZWQgZnJvbSBjb3JlIFggdG8gY29yZSBZICgxc3Qgc3Rh Z2UpLg0KPj4+Pj4+Pj4+IDIuIFZhbHVlcyA0WFkgLSBwYWNrZXQgb24gY29yZSBYIHJldHVybnMg YWN0aW9uIFkgKDFzdCBzdGFnZSkuDQo+Pj4+Pj4+Pj4gKFRoZXNlIHN1Z2dlc3QgdGhhdCAxc3Qg c3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+Pj4+Pj4gMy4gVmFsdWVzIDFYWFlZIC0gcGFj a2V0IHJlY2VpdmUgcXVldWUgWFggb24gY29yZSBZWSAoWFggPSAxMCBpcyBpbnZhbGlkIHJlY2Vp dmUgcXVldWUgb3V0c2lkZSAyLi41KS4NCj4+Pj4+Pj4+PiA0LiAyWFhYWCAtIHBhY2tldCByZWNl aXZlIHF1ZXVlIG9uIGFueSBjb3JlIChYWFhYIC0gNDk5OSBpbWVhbnMgcXVldWUgZ3JlYXRlciB0 aGFuIDUwMDApLg0KPj4+Pj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2ZSBxdWV1ZS4N Cj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IERlYnVnIG1hcCB2YWx1ZXMgd2l0aG91dCBDUFUgcmVkaXJl Y3Rpb246DQo+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+Pj4+ Pj4gfCBQb3J0IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0t LS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+Pj4+Pj4gfCAgICAwIHwgMTAzMiB8ICAgICAgICAgIDUw NCB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgMTAyNCB8ICAgICAzNzAwNTk5MiB8DQo+Pj4+Pj4+Pj4g fCAgICAwIHwgMTAzNCB8ICAgICAzNzU0NDA1MiB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgICAgMCB8 ICAgICA3NDU0Njg3NSB8DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgMTAzNCB8ICAgICAzNTc2NTk2MSB8 DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgICAgMCB8ICAgICA3MTQ5Mjc3MyB8DQo+Pj4+Pj4+Pj4gfCAg ICAxIHwgMTAyNCB8ICAgICAzNTcyOTEwNyB8DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgMTAzMiB8ICAg ICAgICAgIDI3NyB8DQo+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+ Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWUgd2l0aCBDUFUgcmVkaXJlY3Rpb24g KG5vIG90aGVyIGNoYW5nZSk6DQo+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0t LS0rDQo+Pj4+Pj4+Pj4gfCBQb3J0IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+Pj4+Pj4g Ky0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+Pj4+Pj4gfCAgICAwIHwgICAgMSB8 ICAgICAgICAgMzQwMCB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgIDIyMyB8ICAgICAgICAgMjk0NyB8 DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgIDIzMiB8ICAgICAgICAgIDQ1NCB8DQo+Pj4+Pj4+Pj4gfCAg ICAwIHwgIDQyNCB8ICAgICAgICAgIDQ1NCB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgIDQzNCB8ICAg ICAgICAgMjk0NyB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgMTEwMDIgfCAgICAgICAgICA0NTQgfA0K Pj4+Pj4+Pj4+IHwgICAgMCB8IDExMDAzIHwgICAgICAgICAyOTQ3IHwNCj4+Pj4+Pj4+PiB8ICAg IDAgfCAyMDAwMCB8ICAgICAgICAgIDEwNiB8DQo+Pj4+Pj4+Pj4gfCAgICAwIHwgMjAwMTYgfCAg ICAgICAgICAgIDcgfA0KPj4+Pj4+Pj4+IHwgICAgMCB8IDIwMDI0IHwgICAgICAgICAxMDU4IHwN Cj4+Pj4+Pj4+PiB8ICAgIDAgfCAyMDU4MiB8ICAgICAgICAgICAgMiB8DQo+Pj4+Pj4+Pj4gfCAg ICAwIHwgMjQ5OTkgfCAgICAgICAgIDIyMzEgfA0KPj4+Pj4+Pj4+IHwgICAgMCB8IDMyNDEyOTUx ODQgfCAgICAgICAgICAzMzkgfA0KPj4+Pj4+Pj4+IHwgICAgMCB8IDMyNDE0MjYyMDEgfCAgICAg ICAgICAgIDMgfA0KPj4+Pj4+Pj4+IHwgICAgMCB8IDMyNDE0MjYyNTYgfCAgICAgICAgIDE4OTEg fA0KPj4+Pj4+Pj4+IHwgICAgMSB8ICAgIDEgfCAgICAgICAgIDEwMTMgfA0KPj4+Pj4+Pj4+IHwg ICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4+IHwgICAgMSB8ICAyMzIgfCAg ICAgICAgICA0MDQgfA0KPj4+Pj4+Pj4+IHwgICAgMSB8ICA0MjQgfCAgICAgICAgICA0MDQgfA0K Pj4+Pj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4+IHwgICAg MSB8IDExMDAyIHwgICAgICAgICAgNDA0IHwNCj4+Pj4+Pj4+PiB8ICAgIDEgfCAxMTAwMyB8ICAg ICAgICAgIDYxMCB8DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgMjAwMDAgfCAgICAgICAgICAgMTcgfA0K Pj4+Pj4+Pj4+IHwgICAgMSB8IDIwMDI0IHwgICAgICAgICAgMzA5IHwNCj4+Pj4+Pj4+PiB8ICAg IDEgfCAyNDk5OSB8ICAgICAgICAgIDY4OSB8DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgMzI0MTQ1OTAy NCB8ICAgICAgICAgIDMwOSB8DQo+Pj4+Pj4+Pj4gfCAgICAxIHwgMzI0MTUyNDU2MCB8ICAgICAg ICAgIDM4MSB8DQo+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+ Pj4+Pj4NCj4+Pj4+Pj4+PiBUaGUgWERQIGNvZGUgKCNpZiAwIGlzIGZvciB0aGUgbm8gQ1BVIHJl ZGlyZWN0aW9uKToNCj4+Pj4+Pj4+PiAvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCAqLw0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+DQo+ Pj4+Pj4+Pj4gI2luY2x1ZGUgPGxpbnV4L2JwZi5oPg0KPj4+Pj4+Pj4+ICNpbmNsdWRlIDxsaW51 eC9pbi5oPg0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gI2luY2x1ZGUgPGJwZi9icGZfaGVscGVycy5o Pg0KPj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4+Pj4+DQo+Pj4+ Pj4+Pj4gI2luY2x1ZGUgInhkcC9wYXJzaW5nX2hlbHBlcnMuaCINCj4+Pj4+Pj4+Pg0KPj4+Pj4+ Pj4+IC8qIFJlZGlyZWN0IHRvIFNQIHF1ZXVlcyBtYXAuICovDQo+Pj4+Pj4+Pj4gc3RydWN0DQo+ Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX1hTS01BUCk7 DQo+Pj4+Pj4+Pj4gX190eXBlIChrZXksIF9fdTMyKTsNCj4+Pj4+Pj4+PiBfX3R5cGUgKHZhbHVl LCBfX3UzMik7DQo+Pj4+Pj4+Pj4gX191aW50IChtYXhfZW50cmllcywgMTI4KTsNCj4+Pj4+Pj4+ PiB9IHhza3NfbWFwIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IC8qIFJlZGly ZWN0IHRvIENQVXMgbWFwLiAqLw0KPj4+Pj4+Pj4+IHN0cnVjdA0KPj4+Pj4+Pj4+IHsNCj4+Pj4+ Pj4+PiBfX3VpbnQgKHR5cGUsIEJQRl9NQVBfVFlQRV9DUFVNQVApOw0KPj4+Pj4+Pj4+IF9fdWlu dCAoa2V5X3NpemUsIHNpemVvZiAoX191MzIpKTsNCj4+Pj4+Pj4+PiBfX3VpbnQgKHZhbHVlX3Np emUsIHNpemVvZiAoc3RydWN0IGJwZl9jcHVtYXBfdmFsKSk7DQo+Pj4+Pj4+Pj4gX191aW50ICht YXhfZW50cmllcywgMzIpOw0KPj4+Pj4+Pj4+IH0gY3B1X21hcCBTRUMoIi5tYXBzIik7DQo+Pj4+ Pj4+Pj4NCj4+Pj4+Pj4+PiAvKiBTdGF0aXN0aWNzIGFuZCBkZWJ1ZyBtYXBzLiAqLw0KPj4+Pj4+ Pj4+IHN0cnVjdA0KPj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+PiBfX3VpbnQgKHR5cGUsIEJQRl9NQVBf VFlQRV9QRVJDUFVfQVJSQVkpOw0KPj4+Pj4+Pj4+IF9fdHlwZSAoa2V5LCBfX3UzMik7DQo+Pj4+ Pj4+Pj4gX190eXBlICh2YWx1ZSwgX191MzIpOw0KPj4+Pj4+Pj4+IF9fdWludCAobWF4X2VudHJp ZXMsIDY0KTsNCj4+Pj4+Pj4+PiB9IHhkcF9zdGF0c19tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4+ Pj4+DQo+Pj4+Pj4+Pj4gc3RydWN0DQo+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+IF9fdWludCAodHlw ZSwgQlBGX01BUF9UWVBFX0hBU0gpOw0KPj4+Pj4+Pj4+IF9fdHlwZSAoa2V5LCBfX3UzMik7DQo+ Pj4+Pj4+Pj4gX190eXBlICh2YWx1ZSwgX191MzIpOw0KPj4+Pj4+Pj4+IF9fdWludCAobWF4X2Vu dHJpZXMsIDY0KTsNCj4+Pj4+Pj4+PiB9IHhkcF9kZWJ1Z19wcm90byBTRUMoIi5tYXBzIik7DQo+ Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBzdGF0aWMgX191MzIgb25ldmFsID0gMTsNCj4+Pj4+Pj4+Pg0K Pj4+Pj4+Pj4+IGludCBteV9wYXJzZV9ldGhoZHIgKHN0cnVjdCBoZHJfY3Vyc29yKiBuaCwgdm9p ZCogZGF0YWVuZCwgc3RydWN0IGV0aGhkcioqIGV0aCkNCj4+Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4g X191MTYgZXRodHlwZTsNCj4+Pj4+Pj4+PiAqZXRoID0gbmgtPnBvczsNCj4+Pj4+Pj4+PiBpZiAo KHZvaWQqKSAmKCpldGgpIFsxXSA+IGRhdGFlbmQpDQo+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+IHJl dHVybiAoLTEpOw0KPj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IGV0aHR5cGUgPSAo KmV0aCktPmhfcHJvdG87DQo+Pj4+Pj4+Pj4gbmgtPnBvcyA9ICYoKmV0aCkgWzFdOw0KPj4+Pj4+ Pj4+IGlmIChldGh0eXBlID09IGJwZl9udG9ocyAoRVRIX1BfODAyMVEpKQ0KPj4+Pj4+Pj4+IHsN Cj4+Pj4+Pj4+PiBzdHJ1Y3Qgdmxhbl9oZHIqIHZsYW4gPSAoc3RydWN0IHZsYW5faGRyKikgJigq ZXRoKSBbMV07DQo+Pj4+Pj4+Pj4gaWYgKCh2b2lkKikgJnZsYW4gWzFdID4gZGF0YWVuZCkNCj4+ Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4gICAgICAgIHJldHVybiAoLTEpOw0KPj4+Pj4+Pj4+IH0NCj4+ Pj4+Pj4+PiAgICBldGh0eXBlID0gdmxhbi0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsNCj4+ Pj4+Pj4+PiAvKiBpbmNfZGVidWdfbWFwICgxMDAwMCsoYnBmX250b2hzICh2bGFuLT5oX3ZsYW5f VENJKSAmIDB4MEZGRikpOyAqLw0KPj4+Pj4+Pj4+IC8qIGluY19kZWJ1Z19tYXAgKHZsYW4tPmhf dmxhbl9UQ0kpOyAqLw0KPj4+Pj4+Pj4+IG5oLT5wb3MgPSAmdmxhbiBbMV07DQo+Pj4+Pj4+Pj4g fQ0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gcmV0dXJuIChldGh0eXBlKTsNCj4+Pj4+Pj4+PiB9DQo+ Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBzdGF0aWMgdm9pZCBpbmNfZGVidWdfbWFwIChfX3UzMiBrZXkp DQo+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+ICNpZmRlZiBXSVRIX1NUQVRTDQo+Pj4+Pj4+Pj4gYnBm X21hcF91cGRhdGVfZWxlbSAoJnhkcF9kZWJ1Z19wcm90bywNCj4+Pj4+Pj4+PiAgICAgICAgICAg ICAgICAgICAgICZrZXksIChfX3UzMiopICZvbmV2YWwsIEJQRl9OT0VYSVNUKTsNCj4+Pj4+Pj4+ PiBfX3UzMiogcmVjID0gYnBmX21hcF9sb29rdXBfZWxlbSAoJnhkcF9kZWJ1Z19wcm90bywgKF9f dTMyKikgJmtleSk7DQo+Pj4+Pj4+Pj4gaWYgKHJlYyAhPSBOVUxMKQ0KPj4+Pj4+Pj4+IHsNCj4+ Pj4+Pj4+PiArKygqcmVjKTsNCj4+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pj4gI2VuZGlmDQo+Pj4+Pj4+ Pj4gfQ0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IFNFQyAoInhk cCIpDQo+Pj4+Pj4+Pj4gaW50IHJkd3JfeHNrX3Byb2cgKHN0cnVjdCB4ZHBfbWQgKmN0eCkNCj4+ Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4gZW51bSB4ZHBfYWN0aW9uIGFjdGlvbjsNCj4+Pj4+Pj4+PiBp bnQgaW5kZXggPSBjdHgtPnJ4X3F1ZXVlX2luZGV4Ow0KPj4+Pj4+Pj4+IHZvaWQqIGRhdGFlbmQg PSAodm9pZCAqKShsb25nKWN0eC0+ZGF0YV9lbmQ7DQo+Pj4+Pj4+Pj4gdm9pZCogZGF0YSA9ICh2 b2lkICopKGxvbmcpY3R4LT5kYXRhOw0KPj4+Pj4+Pj4+IGludCBzdGFnZSA9IDA7DQo+Pj4+Pj4+ Pj4NCj4+Pj4+Pj4+PiBzdHJ1Y3QgaGRyX2N1cnNvciBuaDsNCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+ IF9fdTMyICpwa3RfY291bnQ7DQo+Pj4+Pj4+Pj4gc3RydWN0IGV0aGhkciogZXRoOw0KPj4+Pj4+ Pj4+DQo+Pj4+Pj4+Pj4gI2lmZGVmIFdJVEhfU1RBVFMNCj4+Pj4+Pj4+PiBwa3RfY291bnQgPSBi cGZfbWFwX2xvb2t1cF9lbGVtKCZ4ZHBfc3RhdHNfbWFwLCAmaW5kZXgpOw0KPj4+Pj4+Pj4+IGlm IChwa3RfY291bnQgIT0gTlVMTCkNCj4+Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4gKysqcGt0X2NvdW50 Ow0KPj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+PiAjZW5kaWYNCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IC8q IFBhcnNlIEV0aGVybmV0ICYgVkxBTiAqLw0KPj4+Pj4+Pj4+IG5oLnBvcyA9IGRhdGE7DQo+Pj4+ Pj4+Pj4gaW50IGV0aHR5cGUgPSBteV9wYXJzZV9ldGhoZHIgKCZuaCwgZGF0YWVuZCwgJmV0aCk7 DQo+Pj4+Pj4+Pj4gaWYgKGV0aHR5cGUgIT0gYnBmX250b2hzICgweDA4MDApKQ0KPj4+Pj4+Pj4+ IHsNCj4+Pj4+Pj4+PiByZXR1cm4gKFhEUF9QQVNTKTsNCj4+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pj4N Cj4+Pj4+Pj4+PiAvKiBEaXJlY3QgWFNLIHJlZGlyZWN0LiAqLw0KPj4+Pj4+Pj4+ICNpZiAwDQo+ Pj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoc3RhZ2UpOw0KPj4+Pj4+Pj4+IGFjdGlvbiA9ICBicGZf cmVkaXJlY3RfbWFwICgmeHNrc19tYXAsIGluZGV4LCBYRFBfUEFTUyk7DQo+Pj4+Pj4+Pj4gaW5j X2RlYnVnX21hcCAoMTAwMCArIGluZGV4KjEwICsgYWN0aW9uKTsNCj4+Pj4+Pj4+PiAjZW5kaWYN Cj4+Pj4+Pj4+PiAvKiBDUFUgbWFwIHJlZGlyZWN0LiAqLw0KPj4+Pj4+Pj4+IF9fdTMyIGNwdWlk ID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4+Pj4+IF9fdTMyIHRhcmdldGNw dSA9IGNwdWlkIF4gMHgwMTsNCj4+Pj4+Pj4+PiArK3N0YWdlOw0KPj4+Pj4+Pj4+IGluY19kZWJ1 Z19tYXAgKHN0YWdlKTsNCj4+Pj4+Pj4+PiBpbmNfZGVidWdfbWFwICgyMDAgKyBjcHVpZCAqIDEw ICsgdGFyZ2V0Y3B1KTsNCj4+Pj4+Pj4+PiBhY3Rpb24gPSAgYnBmX3JlZGlyZWN0X21hcCAoJmNw dV9tYXAsIHRhcmdldGNwdSwgWERQX1BBU1MpOw0KPj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKDQw MCArIHRhcmdldGNwdSAqIDEwICsgYWN0aW9uKTsNCj4+Pj4+Pj4+PiByZXR1cm4gKGFjdGlvbik7 DQo+Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gU0VDICgieGRwL2NwdW1hcCIpDQo+ Pj4+Pj4+Pj4gaW50IHJkd3JfY3B1X3Byb2coc3RydWN0IHhkcF9tZCAqY3R4KQ0KPj4+Pj4+Pj4+ IHsNCj4+Pj4+Pj4+PiBfX3U2NCogZGF0YWVuZDY0ID0gKF9fdTY0KikgKGxvbmcpIGN0eC0+ZGF0 YV9lbmQ7DQo+Pj4+Pj4+Pj4gX191NjQqIGRhdGE2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRh dGE7DQo+Pj4+Pj4+Pj4gX191MzIgcnhxdWV1ZSA9IGN0eC0+cnhfcXVldWVfaW5kZXg7DQo+Pj4+ Pj4+Pj4gaWYgKHJ4cXVldWUgPCA1MDAwKQ0KPj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+PiBpbmNfZGVi dWdfbWFwICgyMDAwMCArIHJ4cXVldWUpOw0KPj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+PiBlbHNlDQo+ Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKHJ4cXVldWUpOw0KPj4+Pj4+Pj4+ IGluY19kZWJ1Z19tYXAgKDI0OTk5KTsNCj4+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+ PiByeHF1ZXVlID0gKHJ4cXVldWUgPj0gMiAmJiByeHF1ZXVlIDwgNikgPyByeHF1ZXVlIDogMTA7 DQo+Pj4+Pj4+Pj4gX191MzIgY3B1aWQgPSBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQgKCk7DQo+ Pj4+Pj4+Pj4gY3B1aWQgPSAoY3B1aWQgPCAxMikgPyBjcHVpZCA6IDIwOw0KPj4+Pj4+Pj4+IGlu Y19kZWJ1Z19tYXAgKDEwMDAwICsgMTAwKnJ4cXVldWUgKyBjcHVpZCk7DQo+Pj4+Pj4+Pj4NCj4+ Pj4+Pj4+PiByZXR1cm4gYnBmX3JlZGlyZWN0X21hcCAoJnhza3NfbWFwLCBicGZfZ2V0X3NtcF9w cm9jZXNzb3JfaWQgKCksIDApOw0KPj4+Pj4+Pj4+IH0NCg0KDQo=