From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Safonov Subject: Re: [PATCHv3] lib/ratelimit: Lockless ratelimiting Date: Tue, 21 Aug 2018 00:14:35 +0100 Message-ID: <1534806875.30457.28.camel@arista.com> References: <20180703225628.25684-1-dima@arista.com> <20180815151047.qgjam3t3ujyacmaf@pathway.suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180815151047.qgjam3t3ujyacmaf@pathway.suse.cz> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Petr Mladek Cc: Theodore Ts'o , dri-devel@lists.freedesktop.org, Arnd Bergmann , David Airlie , Greg Kroah-Hartman , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, Steven Rostedt , Andy Shevchenko , Rodrigo Vivi , Thomas Gleixner List-Id: dri-devel@lists.freedesktop.org SGkgUGV0ciwgdGhhbmtzIGZvciByZXZpZXcsCgpPbiBXZWQsIDIwMTgtMDgtMTUgYXQgMTc6MTAg KzAyMDAsIFBldHIgTWxhZGVrIHdyb3RlOgo+IE9uIFR1ZSAyMDE4LTA3LTAzIDIzOjU2OjI4LCBE bWl0cnkgU2Fmb25vdiB3cm90ZToKPiA+IEN1cnJlbnRseSByYXRlbGltaXRfc3RhdGUgaXMgcHJv dGVjdGVkIHdpdGggc3Bpbl9sb2NrLiBJZiB0aGUgLmxvY2sKPiA+IGlzCj4gPiB0YWtlbiBhdCB0 aGUgbW9tZW50IG9mIF9fX3JhdGVsaW1pdCgpIGNhbGwsIHRoZSBtZXNzYWdlIGlzCj4gPiBzdXBw cmVzc2VkIHRvCj4gPiBtYWtlIHJhdGVsaW1pdGluZyByb2J1c3QuCj4gPiAKPiA+IFRoYXQgcmVz dWx0cyBpbiB0aGUgZm9sbG93aW5nIGlzc3VlIGlzc3VlOgo+ID4gICAgICAgQ1BVMCAgICAgICAg ICAgICAgICAgICAgICAgICAgQ1BVMQo+ID4gLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAt LS0tLS0tLS0tLS0tLS0tLS0KPiA+IHByaW50a19yYXRlbGltaXQoKSAgICAgICAgICAgcHJpbnRr X3JhdGVsaW1pdCgpCj4gPiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK PiA+ICAgdHJ5X3NwaW5fbG9jaygpICAgICAgICAgICAgICB0cnlfc3Bpbl9sb2NrKCkKPiA+ICAg ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gdGltZV9pc19iZWZvcmVf amlmZmllcygpICAgICAgICAgIHJldHVybiAwOyAvLyBzdXBwcmVzcwo+ID4gCj4gPiBTbywgY29u Y3VycmVudCBjYWxsIG9mIF9fX3JhdGVsaW1pdCgpIHJlc3VsdHMgaW4gc2lsZW50bHkKPiA+IHN1 cHByZXNzaW5nCj4gPiBvbmUgb2YgdGhlIG1lc3NhZ2VzLCByZWdhcmRsZXNzIGlmIHRoZSBsaW1p dCBpcyByZWFjaGVkIG9yIG5vdC4KPiA+IEFuZCByYy0+bWlzc2VkIGlzIG5vdCBpbmNyZWFzZWQg aW4gc3VjaCBjYXNlIHNvIHRoZSBpc3N1ZSBpcwo+ID4gY292ZXJlZAo+ID4gZnJvbSB1c2VyLgo+ ID4gCj4gPiBDb252ZXJ0IHJhdGVsaW1pdGluZyB0byB1c2UgYXRvbWljIGNvdW50ZXJzIGFuZCBk cm9wIHNwaW5fbG9jay4KPiA+IAo+ID4gTm90ZTogVGhhdCBtaWdodCBiZSB1bmV4cGVjdGVkLCBi dXQgd2l0aCB0aGUgZmlyc3QgaW50ZXJ2YWwgb2YKPiA+IG1lc3NhZ2VzCj4gPiBzdG9ybSBvbmUg Y2FuIHByaW50IHVwIHRvIGJ1cnN0KjIgbWVzc2FnZXMuIFNvLCBpdCBkb2Vzbid0Cj4gPiBndWFy YW50ZWUKPiA+IHRoYXQgaW4gKmFueSogaW50ZXJ2YWwgYW1vdW50IG9mIG1lc3NhZ2VzIGlzIGxl c3NlciB0aGFuIGJ1cnN0Lgo+ID4gQnV0LCB0aGF0IGRpZmZlcnMgbGlnaHRseSBmcm9tIHByZXZp b3VzIGJlaGF2aW9yIHdoZXJlIG9uZSBjYW4KPiA+IHN0YXJ0Cj4gPiBidXJzdD01IGludGVydmFs IGFuZCBwcmludCA0IG1lc3NhZ2VzIG9uIHRoZSBsYXN0IG1pbGxpc2Vjb25kcyBvZgo+ID4gaW50 ZXJ2YWwgKyBuZXcgNSBtZXNzYWdlcyBmcm9tIG5ldyBpbnRlcnZhbCAodG90YWxseSA5IG1lc3Nh Z2VzIGluCj4gPiBsZXNzZXIgdGhhbiBpbnRlcnZhbCB2YWx1ZSk6Cj4gCj4gSSBhbSBzdGlsbCBj b25mdXNlZCBieSB0aGlzIHBhcmFncmFwaC4gRG9lcyB0aGlzIHBhdGNoIGNoYW5nZSB0aGUKPiBi ZWhhdmlvcj8gV2hhdCBpcyB0aGUgb3JpZ2luYWwgYW5kIHdoYXQgaXMgdGhlIG5ldyBvbmUsIHBs ZWFzZT8KClllYWgsIEkgY291bGQgYmUgYSBiaXQgY2xlYW5lciBhYm91dCB0aGUgY2hhbmdlLgpP cmlnaW5hbGx5IG1vcmUgdGhhbiBgYnVyc3RgIG1lc3NhZ2VzIGNvdWxkIGJlIHByaW50ZWQgaWYg dGhlIHByZXZpb3VzCnBlcmlvZCBoYXNuJ3QgZW5kZWQ6Cgo+IAo+ID4gICAgbXNnMCAgICAgICAg ICAgICAgbXNnMS1tc2c0IG1zZzAtbXNnNAo+ID4gICAgIHwgICAgICAgICAgICAgICAgICAgICB8 ICAgICAgIHwKPiA+ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Cj4gPiAgfC0t by0tLS0tLS0tLS0tLS0tLS0tLS0tLW8tfC0tLS0tby0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tPiAo dCkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0+Cj4gPiAgICAgICAgICAg ICAgICAgICAgICAgIExlc3NlciB0aGFuIGJ1cnN0CgpCdXQgbm93LCBiZWNhdXNlIEkgY2hlY2s6 CisgICAgICAgaWYgKGF0b21pY19hZGRfdW5sZXNzKCZycy0+cHJpbnRlZCwgMSwgcnMtPmJ1cnN0 KSkKKyAgICAgICAgICAgICAgIHJldHVybiAxOwoKKmJlZm9yZSogY2hlY2tpbmcgdGhlIGVuZCBv ZiBpbnRlcnZhbCwgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCmluIHRoZSBwZWFrIHdp bGwgYmUgdGhlIHNhbWUsIGJ1cnN0KjIgKGJ1cnN0KjIgLSAxIGluIG9yaWdpbmFsKS4KV2h5IGRv IEkgY2hlY2sgaXQgYmVmb3JlIHRoZSBlbmQgb2YgaW50ZXJ2YWw/CkkgdGhvdWdodCBpdCB3b3Vs ZCBiZSBhIG5pY2Ugb3B0aW1pemF0aW9uLCBtYWtpbmcgYXRvbWljX2FkZF91bmxlc3MoKQp0aGUg b25seSBjYWxsZWQgZnVuY3Rpb24gb24gdGhlIGZhc3QtcGF0aCAod2hlbiB3ZSBoYXZlbid0IGhp dCB0aGUKbGltaXQgeWV0KS4gSWYgeW91IHdhbnQsIEkgY2FuIG1vdmUgaXQgaW50byBhIHNlcGFy YXRlIHBhdGNoLi4KCj4gPiAKPiA+IERyb3BwZWQgZGV2L3JhbmRvbSBwYXRjaCBzaW5jZSB2MSB2 ZXJzaW9uOgo+ID4gbGttbC5rZXJuZWwub3JnL3IvPDIwMTgwNTEwMTI1MjExLjEyNTgzLTEtZGlt YUBhcmlzdGEuY29tPgo+ID4gCj4gPiBEcm9wcGVkIGBuYW1lJyBpbiBhcyBpdCdzIHVudXNlZCBp biBSQVRFTElNSVRfU1RBVEVfSU5JVCgpCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9saWIvcmF0ZWxp bWl0LmMgYi9saWIvcmF0ZWxpbWl0LmMKPiA+IGluZGV4IGQwMWY0NzEzNTIzOS4uZDliNzQ5ZDQw MTA4IDEwMDY0NAo+ID4gLS0tIGEvbGliL3JhdGVsaW1pdC5jCj4gPiArKysgYi9saWIvcmF0ZWxp bWl0LmMKPiA+IEBAIC0xMyw2ICsxMywxOCBAQAo+ID4gICNpbmNsdWRlIDxsaW51eC9qaWZmaWVz Lmg+Cj4gPiAgI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgo+ID4gIAo+ID4gK3N0YXRpYyB2b2lk IHJhdGVsaW1pdF9lbmRfaW50ZXJ2YWwoc3RydWN0IHJhdGVsaW1pdF9zdGF0ZSAqcnMsCj4gPiBj b25zdCBjaGFyICpmdW5jKQo+ID4gK3sKPiA+ICsJcnMtPmJlZ2luID0gamlmZmllczsKPiA+ICsK PiA+ICsJaWYgKCEocnMtPmZsYWdzICYgUkFURUxJTUlUX01TR19PTl9SRUxFQVNFKSkgewo+ID4g KwkJdW5zaWduZWQgaW50IG1pc3NlZCA9IGF0b21pY194Y2hnKCZycy0+bWlzc2VkLCAwKTsKPiA+ ICsKPiA+ICsJCWlmIChtaXNzZWQpCj4gPiArCQkJcHJfd2FybigiJXM6ICV1IGNhbGxiYWNrcyBz dXBwcmVzc2VkXG4iLAo+ID4gZnVuYywgbWlzc2VkKTsKPiA+ICsJfQo+ID4gK30KPiA+ICsKPiA+ ICAvKgo+ID4gICAqIF9fcmF0ZWxpbWl0IC0gcmF0ZSBsaW1pdGluZwo+ID4gICAqIEByczogcmF0 ZWxpbWl0X3N0YXRlIGRhdGEKPiA+IEBAIC0yNyw0NSArMzksMzAgQEAKPiA+ICAgKi8KPiA+ICBp bnQgX19fcmF0ZWxpbWl0KHN0cnVjdCByYXRlbGltaXRfc3RhdGUgKnJzLCBjb25zdCBjaGFyICpm dW5jKQo+ID4gIHsKPiA+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+IC0JaW50IHJldDsKPiA+ IC0KPiA+ICAJaWYgKCFycy0+aW50ZXJ2YWwpCj4gPiAgCQlyZXR1cm4gMTsKPiA+ICAKPiA+IC0J LyoKPiA+IC0JICogSWYgd2UgY29udGVuZCBvbiB0aGlzIHN0YXRlJ3MgbG9jayB0aGVuIGFsbW9z dAo+ID4gLQkgKiBieSBkZWZpbml0aW9uIHdlIGFyZSB0b28gYnVzeSB0byBwcmludCBhIG1lc3Nh Z2UsCj4gPiAtCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHByaW50ZWQg YnkKPiA+IC0JICogdGhlIGVudGl0eSB0aGF0IGlzIGhvbGRpbmcgdGhlIGxvY2sgYWxyZWFkeToK PiA+IC0JICovCj4gPiAtCWlmICghcmF3X3NwaW5fdHJ5bG9ja19pcnFzYXZlKCZycy0+bG9jaywg ZmxhZ3MpKQo+ID4gKwlpZiAodW5saWtlbHkoIXJzLT5idXJzdCkpIHsKPiA+ICsJCWF0b21pY19h ZGRfdW5sZXNzKCZycy0+bWlzc2VkLCAxLCAtMSk7Cj4gPiArCQlpZiAodGltZV9pc19iZWZvcmVf amlmZmllcyhycy0+YmVnaW4gKyBycy0KPiA+ID5pbnRlcnZhbCkpCj4gPiArCQkJcmF0ZWxpbWl0 X2VuZF9pbnRlcnZhbChycywgZnVuYyk7Cj4gCj4gVGhpcyBpcyByYWN5LiB0aW1lX2lzX2JlZm9y ZV9qaWZmaWVzKCkgbWlnaHQgYmUgdmFsaWQgb24gdHdvCj4gQ1BVcyBpbiBwYXJhbGxlbC4gVGhl eSB3b3VsZCBib3RoIGNhbGwgcmF0ZWxpbWl0X2VuZF9pbnRlcnZhbCgpLgo+IFRoaXMgaXMgbm90 IGxvbmdlciBhdG9taWMgY29udGV4dC4gVGhlcmVmb3JlIG9uZSBtaWdodCBnZXQgc2NoZWR1bGVk Cj4gYW5kIHNldCBycy0+YmVnaW4gPSBqaWZmaWVzIHNlY29uZHMgbGF0ZXIuIEkgYW0gc3VyZSB0 aGF0IHRoZXJlIG1pZ2h0Cj4gYmUgbW9yZSBjcmF6eSBzY2VuYXJpb3MuCgpUaGF0J3MgdGhlIGNh c2Ugd2l0aCBycy0+YnVyc3QgPT0gMC4KU28sIGluIHRoaXMgc2l0dWF0aW9uIGFsbCB0aGUgbWVz c2FnZXMgd2lsbCBiZSBzdXBwcmVzc2VkLgpBbmQgdGhlIG9ubHkgcmVhc29uIHRvIGNhbGwgcmF0 ZWxpbWl0X2VuZF9pbnRlcnZhbCgpIGlzIHRvIHVwZGF0ZSB0aGUKc3RhcnQgdGltZSBhbmQgbnVt YmVyIG9mIG1lc3NhZ2VzIG5vdCBwcmludGVkLgpJIGRpZG4ndCB3YW50IHRvIGFkZCBhbnkgY29t cGxleGlvbiBmb3IgdGhpcyBjYXNlIC0gdGhlIHdvcnN0IHdpbGwgYmUKdGhlIGNvdW50IG9mIG1l c3NhZ2VzIHN1cHByZXNzZWQgd2lsbCBiZSBpbXByZWNpc2UgZm9yIHJzLT5idXJzdCA9PSAwCmNh c2UuIE5vdCBhIGJpZyBkZWFsLCBodWg/Cgo+IAo+ID4gKwo+ID4gIAkJcmV0dXJuIDA7Cj4gPiAr CX0KPiA+ICAKPiA+IC0JaWYgKCFycy0+YmVnaW4pCj4gPiAtCQlycy0+YmVnaW4gPSBqaWZmaWVz Owo+ID4gKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnJzLT5wcmludGVkLCAxLCBycy0+YnVyc3Qp KQo+ID4gKwkJcmV0dXJuIDE7Cj4gPiAgCj4gPiAgCWlmICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVz KHJzLT5iZWdpbiArIHJzLT5pbnRlcnZhbCkpIHsKPiA+IC0JCWlmIChycy0+bWlzc2VkKSB7Cj4g PiAtCQkJaWYgKCEocnMtPmZsYWdzICYKPiA+IFJBVEVMSU1JVF9NU0dfT05fUkVMRUFTRSkpIHsK PiA+IC0JCQkJcHJpbnRrX2RlZmVycmVkKEtFUk5fV0FSTklORwo+ID4gLQkJCQkJCSIlczogJWQg Y2FsbGJhY2tzCj4gPiBzdXBwcmVzc2VkXG4iLAo+ID4gLQkJCQkJCWZ1bmMsIHJzLT5taXNzZWQp Owo+ID4gLQkJCQlycy0+bWlzc2VkID0gMDsKPiA+IC0JCQl9Cj4gPiAtCQl9Cj4gPiAtCQlycy0+ YmVnaW4gICA9IGppZmZpZXM7Cj4gPiAtCQlycy0+cHJpbnRlZCA9IDA7Cj4gPiAtCX0KPiA+IC0J aWYgKHJzLT5idXJzdCAmJiBycy0+YnVyc3QgPiBycy0+cHJpbnRlZCkgewo+ID4gLQkJcnMtPnBy aW50ZWQrKzsKPiA+IC0JCXJldCA9IDE7Cj4gPiAtCX0gZWxzZSB7Cj4gPiAtCQlycy0+bWlzc2Vk Kys7Cj4gPiAtCQlyZXQgPSAwOwo+ID4gKwkJaWYgKGF0b21pY19jbXB4Y2hnKCZycy0+cHJpbnRl ZCwgcnMtPmJ1cnN0LCAwKSkKPiA+ICsJCQlyYXRlbGltaXRfZW5kX2ludGVydmFsKHJzLCBmdW5j KTsKPiA+ICAJfQo+ID4gLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnMtPmxvY2ssIGZs YWdzKTsKPiA+ICAKPiA+IC0JcmV0dXJuIHJldDsKPiA+ICsJaWYgKGF0b21pY19hZGRfdW5sZXNz KCZycy0+cHJpbnRlZCwgMSwgcnMtPmJ1cnN0KSkKPiA+ICsJCXJldHVybiAxOwo+IAo+IFRoZSBl bnRpcmUgbG9naWMgaXMgY29tcGxpY2F0ZWQgYW5kIGhhcmQgdG8gdW5kZXJzdGFuZC4gRXNwZWNp YWxseQo+IGNhbGxpbmcKPiByYXRlbGltaXRfZW5kX2ludGVydmFsKCkgYW5kIGF0b21pY19hZGRf dW5sZXNzKCZycy0+cHJpbnRlZCkgdHdpY2UuCgpQcm9iYWJseSwgSSd2ZSBkZXNjcmliZWQgdGhl IHJlYXNvbnMgYWJvdmUuLiBJIG1heSBhZGQgYSBjb21tZW50IG9yCmRyb3AgdGhlIGZpcnN0IGF0 b21pY19hZGRfdW5sZXNzKCksIGJ1dCBJIHdvdWxkIHByZWZlciBzdGlsbCBrZWVwIGl0CnRoZXJl LCBoYXZpbmcgb25seSBvbmUgY2hlY2sgZm9yIGZhc3QtcGF0aC4KCj4gCj4gPiArCWF0b21pY19h ZGRfdW5sZXNzKCZycy0+bWlzc2VkLCAxLCAtMSk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4g IH0KPiAKPiAKPiBJIHdvbmRlciBpZiB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZG8gdGhlIGpv YiAobm90IGV2ZW4gY29tcGlsZQo+IHRlc3RlZCEpOgo+IAo+IHN0YXRpYyB2b2lkIHJhdGVsaW1p dF9lbmRfaW50ZXJ2YWwoc3RydWN0IHJhdGVsaW1pdF9zdGF0ZSAqcnMsIGNvbnN0Cj4gY2hhciAq ZnVuYykKPiB7Cj4gCXJzLT5iZWdpbiA9IGppZmZpZXM7Cj4gCj4gCWlmICghKHJzLT5mbGFncyAm IFJBVEVMSU1JVF9NU0dfT05fUkVMRUFTRSkpIHsKPiAJCXVuc2lnbmVkIGludCBtaXNzZWQgPSBh dG9taWNfeGNoZygmcnMtPm1pc3NlZCwgMCk7Cj4gCj4gCQlpZiAobWlzc2VkKQo+IAkJCXByX3dh cm4oIiVzOiAldSBjYWxsYmFja3Mgc3VwcHJlc3NlZFxuIiwgZnVuYywKPiBtaXNzZWQpOwo+IAl9 Cj4gCj4gCWF0b21pY194Y2hnKCZycy0+cHJpbnRlZCwgMCk7Cj4gfQo+IAo+IC8qCj4gICogX19y YXRlbGltaXQgLSByYXRlIGxpbWl0aW5nCj4gICogQHJzOiByYXRlbGltaXRfc3RhdGUgZGF0YQo+ ICAqIEBmdW5jOiBuYW1lIG9mIGNhbGxpbmcgZnVuY3Rpb24KPiAgKgo+ICAqIFRoaXMgZW5mb3Jj ZXMgYSByYXRlIGxpbWl0OiBub3QgbW9yZSB0aGFuIEBycy0+YnVyc3QgY2FsbGJhY2tzCj4gICog aW4gZXZlcnkgQHJzLT5pbnRlcnZhbAo+ICAqCj4gICogUkVUVVJOUzoKPiAgKiAwIG1lYW5zIGNh bGxiYWNrcyB3aWxsIGJlIHN1cHByZXNzZWQuCj4gICogMSBtZWFucyBnbyBhaGVhZCBhbmQgZG8g aXQuCj4gICovCj4gaW50IF9fX3JhdGVsaW1pdChzdHJ1Y3QgcmF0ZWxpbWl0X3N0YXRlICpycywg Y29uc3QgY2hhciAqZnVuYykKPiB7Cj4gCXVuc2lnbmVkIGxvbmcgYmVnaW4sIG9sZF9iZWdpbiA9 IHJzLT5iZWdpbjsKPiAKPiAJaWYgKCFycy0+aW50ZXJ2YWwpCj4gCQlyZXR1cm4gMTsKPiAKPiAJ aWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMocnMtPmJlZ2luICsgcnMtPmludGVydmFsKSAmJgo+ IAkgICAgY21weGNoZygmcnMtPmJlZ2luLCBiZWdpbiwgYmVnaW4gKyBycy0+aW50ZXJ2YWwpID09 IGJlZ2luKSAKClByb2JhYmx5LCBjbXB4Y2hnKCZycy0+YmVnaW4sIGJlZ2luLCBqaWZmaWVzKT8K T3RoZXJ3aXNlIGhpdHRpbmcgaXQgbGF0ZXIgd2lsbCBiZSBidWdneS4KQWxzbyBgYmVnaW5gIG1p Z2h0IGJlIHVuaW5pdGlhbGl6ZWQ/IChpZiBjbXB4Y2hnKCkgZmFpbHMpCgo+IHsKPiAJCXJhdGVs aW1pdF9lbmRfaW50ZXJ2YWwocnMsIGZ1bmMpOwo+IAl9Cj4gCj4gCWlmIChhdG9taWNfYWRkX3Vu bGVzcygmcnMtPnByaW50ZWQsIDEsIHJzLT5idXJzdCkpCj4gCQlyZXR1cm4gMTsKPiAKPiAJYXRv bWljX2FkZF91bmxlc3MoJnJzLT5taXNzZWQsIDEsIC0xKTsKPiAJcmV0dXJuIDA7Cj4gfQo+IEVY UE9SVF9TWU1CT0woX19fcmF0ZWxpbWl0KTsKPiAKPiAKPiBUaGUgbWFpbiBsb2dpYyBpcyB0aGUg c2FtZSBhcyBpbiB0aGUgb3JpZ2luYWwgY29kZS4gT25seSBvbmUgQ1BVIGlzCj4gYWJsZSB0byBy ZXNldCB0aGUgaW50ZXJ2YWwgYW5kIGNvdW50ZXJzICh0aGFua3MgdG8gY21weGNoZykuCj4gRXZl cnkgY2FsbGVyIGluY3JlYXNlcyBlaXRoZXIgInByaW50ZWQiIG9yICJtaXNzZWQiIGNvdW50ZXIu CgpEbyB3ZSBjYXJlIGFib3V0IGZhc3QtcGF0aCBhcmd1bWVudCBJIGRpZCBhYm92ZT8KCi0tIApU aGFua3MsCiAgICAgICAgICAgICBEbWl0cnkKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cg==