From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: Re: [PATCH RFC 2/2] virtio_ring: support packed ring Date: Fri, 16 Mar 2018 16:34:28 +0800 Message-ID: <02a3da02-8226-ba4e-1b47-d25755b2c429@redhat.com> References: <20180223111801.15240-1-tiwei.bie@intel.com> <20180223111801.15240-3-tiwei.bie@intel.com> <8f73267a-e20e-de64-d8e0-3fd608dbf368@redhat.com> <20180316061047.o2xdyuqhak3mzjyw@debian> <0a0ecf42-8f7f-9387-8ca4-cb65d0835b56@redhat.com> <20180316074028.lun2jy45qqnfeymw@debian> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Cc: mst@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, wexu@redhat.com To: Tiwei Bie Return-path: In-Reply-To: <20180316074028.lun2jy45qqnfeymw@debian> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org List-Id: netdev.vger.kernel.org CgpPbiAyMDE45bm0MDPmnIgxNuaXpSAxNTo0MCwgVGl3ZWkgQmllIHdyb3RlOgo+IE9uIEZyaSwg TWFyIDE2LCAyMDE4IGF0IDAyOjQ0OjEyUE0gKzA4MDAsIEphc29uIFdhbmcgd3JvdGU6Cj4+IE9u IDIwMTjlubQwM+aciDE25pelIDE0OjEwLCBUaXdlaSBCaWUgd3JvdGU6Cj4+PiBPbiBGcmksIE1h ciAxNiwgMjAxOCBhdCAxMjowMzoyNVBNICswODAwLCBKYXNvbiBXYW5nIHdyb3RlOgo+Pj4+IE9u IDIwMTjlubQwMuaciDIz5pelIDE5OjE4LCBUaXdlaSBCaWUgd3JvdGU6Cj4+Pj4+IFNpZ25lZC1v ZmYtYnk6IFRpd2VpIEJpZSA8dGl3ZWkuYmllQGludGVsLmNvbT4KPj4+Pj4gLS0tCj4+Pj4+ICAg ICBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jIHwgNjk5ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKystLS0tLS0KPj4+Pj4gICAgIGluY2x1ZGUvbGludXgvdmlydGlvX3Jp bmcuaCAgfCAgIDggKy0KPj4+Pj4gICAgIDIgZmlsZXMgY2hhbmdlZCwgNjE4IGluc2VydGlvbnMo KyksIDg5IGRlbGV0aW9ucygtKQo+IFsuLi5dCj4+Pj4+ICAgICAJCQkgICAgICBjcHVfYWRkciwg c2l6ZSwgZGlyZWN0aW9uKTsKPj4+Pj4gICAgIH0KPj4+Pj4gLXN0YXRpYyB2b2lkIHZyaW5nX3Vu bWFwX29uZShjb25zdCBzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSwKPj4+Pj4gLQkJCSAgICBz dHJ1Y3QgdnJpbmdfZGVzYyAqZGVzYykKPj4+Pj4gK3N0YXRpYyB2b2lkIHZyaW5nX3VubWFwX29u ZShjb25zdCBzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSwgdm9pZCAqX2Rlc2MpCj4+Pj4+ICAg ICB7Cj4+Pj4gTGV0J3Mgc3BsaXQgdGhlIGhlbHBlcnMgdG8gcGFja2VkL3NwbGl0IHZlcnNpb24g bGlrZSBvdGhlciBoZWxwZXJzPwo+Pj4+IChDb25zaWRlciB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5 IGtub3duIHRoZSB0eXBlIG9mIHZxKS4KPj4+IE9rYXkuCj4+Pgo+PiBbLi4uXQo+Pgo+Pj4+PiAr CQkJCWRlc2NbaV0uZmxhZ3MgPSBmbGFnczsKPj4+Pj4gKwo+Pj4+PiArCQkJZGVzY1tpXS5hZGRy ID0gY3B1X3RvX3ZpcnRpbzY0KF92cS0+dmRldiwgYWRkcik7Cj4+Pj4+ICsJCQlkZXNjW2ldLmxl biA9IGNwdV90b192aXJ0aW8zMihfdnEtPnZkZXYsIHNnLT5sZW5ndGgpOwo+Pj4+PiArCQkJZGVz Y1tpXS5pZCA9IGNwdV90b192aXJ0aW8zMihfdnEtPnZkZXYsIGhlYWQpOwo+Pj4+IElmIGl0J3Mg YSBwYXJ0IG9mIGNoYWluLCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBmb3IgbGFzdCBidWZmZXIg SSB0aGluay4KPj4+IEknbSBub3Qgc3VyZSBJJ3ZlIGdvdCB5b3VyIHBvaW50IGFib3V0IHRoZSAi bGFzdCBidWZmZXIiLgo+Pj4gQnV0LCB5ZXMsIGlkIGp1c3QgbmVlZHMgdG8gYmUgc2V0IGZvciB0 aGUgbGFzdCBkZXNjLgo+PiBSaWdodCwgSSB0aGluayBJIG1lYW50ICJsYXN0IGRlc2NyaXB0b3Ii IDopCj4+Cj4+Pj4+ICsJCQlwcmV2ID0gaTsKPj4+Pj4gKwkJCWkrKzsKPj4+PiBJdCBsb29rcyB0 byBtZSBwcmV2IGlzIGFsd2F5cyBpIC0gMT8KPj4+IE5vLiBwcmV2IHdpbGwgYmUgKHZxLT52cmlu Z19wYWNrZWQubnVtIC0gMSkgd2hlbiBpIGJlY29tZXMgMC4KPj4gUmlnaHQsIHNvIHByZXYgPSBp ID8gaSAtIDEgOiB2cS0+dnJpbmdfcGFja2VkLm51bSAtIDEuCj4gWWVzLCBpIHdyYXBzIHRvZ2V0 aGVyIHdpdGggdnEtPndyYXBfY291bnRlciBpbiBmb2xsb3dpbmcgY29kZToKPgo+Pj4+PiArCQkJ aWYgKCFpbmRpcmVjdCAmJiBpID49IHZxLT52cmluZ19wYWNrZWQubnVtKSB7Cj4+Pj4+ICsJCQkJ aSA9IDA7Cj4+Pj4+ICsJCQkJdnEtPndyYXBfY291bnRlciBePSAxOwo+Pj4+PiArCQkJfQo+Cj4+ Pj4+ICsJCX0KPj4+Pj4gKwl9Cj4+Pj4+ICsJZm9yICg7IG4gPCAob3V0X3NncyArIGluX3Nncyk7 IG4rKykgewo+Pj4+PiArCQlmb3IgKHNnID0gc2dzW25dOyBzZzsgc2cgPSBzZ19uZXh0KHNnKSkg ewo+Pj4+PiArCQkJZG1hX2FkZHJfdCBhZGRyID0gdnJpbmdfbWFwX29uZV9zZyh2cSwgc2csIERN QV9GUk9NX0RFVklDRSk7Cj4+Pj4+ICsJCQlpZiAodnJpbmdfbWFwcGluZ19lcnJvcih2cSwgYWRk cikpCj4+Pj4+ICsJCQkJZ290byB1bm1hcF9yZWxlYXNlOwo+Pj4+PiArCj4+Pj4+ICsJCQlmbGFn cyA9IGNwdV90b192aXJ0aW8xNihfdnEtPnZkZXYsIFZSSU5HX0RFU0NfRl9ORVhUIHwKPj4+Pj4g KwkJCQkJVlJJTkdfREVTQ19GX1dSSVRFIHwKPj4+Pj4gKwkJCQkJVlJJTkdfREVTQ19GX0FWQUlM KHZxLT53cmFwX2NvdW50ZXIpIHwKPj4+Pj4gKwkJCQkJVlJJTkdfREVTQ19GX1VTRUQoIXZxLT53 cmFwX2NvdW50ZXIpKTsKPj4+Pj4gKwkJCWlmICghaW5kaXJlY3QgJiYgaSA9PSBoZWFkKQo+Pj4+ PiArCQkJCWhlYWRfZmxhZ3MgPSBmbGFnczsKPj4+Pj4gKwkJCWVsc2UKPj4+Pj4gKwkJCQlkZXNj W2ldLmZsYWdzID0gZmxhZ3M7Cj4+Pj4+ICsKPj4+Pj4gKwkJCWRlc2NbaV0uYWRkciA9IGNwdV90 b192aXJ0aW82NChfdnEtPnZkZXYsIGFkZHIpOwo+Pj4+PiArCQkJZGVzY1tpXS5sZW4gPSBjcHVf dG9fdmlydGlvMzIoX3ZxLT52ZGV2LCBzZy0+bGVuZ3RoKTsKPj4+Pj4gKwkJCWRlc2NbaV0uaWQg PSBjcHVfdG9fdmlydGlvMzIoX3ZxLT52ZGV2LCBoZWFkKTsKPj4+Pj4gKwkJCXByZXYgPSBpOwo+ Pj4+PiArCQkJaSsrOwo+Pj4+PiArCQkJaWYgKCFpbmRpcmVjdCAmJiBpID49IHZxLT52cmluZ19w YWNrZWQubnVtKSB7Cj4+Pj4+ICsJCQkJaSA9IDA7Cj4+Pj4+ICsJCQkJdnEtPndyYXBfY291bnRl ciBePSAxOwo+Pj4+PiArCQkJfQo+Pj4+PiArCQl9Cj4+Pj4+ICsJfQo+Pj4+PiArCS8qIExhc3Qg b25lIGRvZXNuJ3QgY29udGludWUuICovCj4+Pj4+ICsJaWYgKCFpbmRpcmVjdCAmJiAoaGVhZCAr IDEpICUgdnEtPnZyaW5nX3BhY2tlZC5udW0gPT0gaSkKPj4+Pj4gKwkJaGVhZF9mbGFncyAmPSBj cHVfdG9fdmlydGlvMTYoX3ZxLT52ZGV2LCB+VlJJTkdfREVTQ19GX05FWFQpOwo+Pj4+IEkgY2Fu J3QgZ2V0IHRoZSB3aHkgd2UgbmVlZCB0aGlzIGhlcmUuCj4+PiBJZiBvbmx5IG9uZSBkZXNjIGlz IHVzZWQsIHdlIHdpbGwgbmVlZCB0byBjbGVhciB0aGUKPj4+IFZSSU5HX0RFU0NfRl9ORVhUIGZs YWcgZnJvbSB0aGUgaGVhZF9mbGFncy4KPj4gWWVzLCBJIG1lYW50IHdoeSBmb2xsb3dpbmcgZGVz Y1twcmV2XS5mbGFncyB3b24ndCB3b3JrIGZvciB0aGlzPwo+IEJlY2F1c2UgdGhlIHVwZGF0ZSBv ZiBkZXNjW2hlYWRdLmZsYWdzIChpbiBhYm92ZSBjYXNlLAo+IHByZXYgPT0gaGVhZCkgaGFzIGJl ZW4gZGVsYXllZC4gVGhlIGZsYWdzIGlzIHNhdmVkIGluCj4gaGVhZF9mbGFncy4KCk9rLCBidXQg bGV0J3MgdHJ5IHRvIGF2b2lkIG1vZHVsYXIgaGVyZSBlLmcgdHJhY2tpbmcgdGhlIG51bWJlciBv ZiBzZ3MgCmluIGEgY291bnRlci4KCkFuZCBJIHNlZSBsb3RzIG9mIGR1cGxpY2F0aW9uIGluIHRo ZSBhYm92ZSB0d28gbG9vcHMsIEkgYmVsaWV2ZSB3ZSBjYW4gCnVuaWZ5IHRoZW0gd2l0aCBhIGEg c2luZ2xlIGxvb3AuIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgZG1hIGRpcmVjdGlvbiAKYW5kIHdy aXRlIGZsYWcuCgo+Cj4+Pj4+ICsJZWxzZQo+Pj4+PiArCQlkZXNjW3ByZXZdLmZsYWdzICY9IGNw dV90b192aXJ0aW8xNihfdnEtPnZkZXYsIH5WUklOR19ERVNDX0ZfTkVYVCk7Cj4+Pj4+ICsKPj4+ Pj4gKwlpZiAoaW5kaXJlY3QpIHsKPj4+Pj4gKwkJLyogRklYTUU6IHRvIGJlIGltcGxlbWVudGVk ICovCj4+Pj4+ICsKPj4+Pj4gKwkJLyogTm93IHRoYXQgdGhlIGluZGlyZWN0IHRhYmxlIGlzIGZp bGxlZCBpbiwgbWFwIGl0LiAqLwo+Pj4+PiArCQlkbWFfYWRkcl90IGFkZHIgPSB2cmluZ19tYXBf c2luZ2xlKAo+Pj4+PiArCQkJdnEsIGRlc2MsIHRvdGFsX3NnICogc2l6ZW9mKHN0cnVjdCB2cmlu Z19wYWNrZWRfZGVzYyksCj4+Pj4+ICsJCQlETUFfVE9fREVWSUNFKTsKPj4+Pj4gKwkJaWYgKHZy aW5nX21hcHBpbmdfZXJyb3IodnEsIGFkZHIpKQo+Pj4+PiArCQkJZ290byB1bm1hcF9yZWxlYXNl Owo+Pj4+PiArCj4+Pj4+ICsJCWhlYWRfZmxhZ3MgPSBjcHVfdG9fdmlydGlvMTYoX3ZxLT52ZGV2 LCBWUklOR19ERVNDX0ZfSU5ESVJFQ1QgfAo+Pj4+PiArCQkJCQkgICAgIFZSSU5HX0RFU0NfRl9B VkFJTCh3cmFwX2NvdW50ZXIpIHwKPj4+Pj4gKwkJCQkJICAgICBWUklOR19ERVNDX0ZfVVNFRCgh d3JhcF9jb3VudGVyKSk7Cj4+Pj4+ICsJCXZxLT52cmluZ19wYWNrZWQuZGVzY1toZWFkXS5hZGRy ID0gY3B1X3RvX3ZpcnRpbzY0KF92cS0+dmRldiwgYWRkcik7Cj4+Pj4+ICsJCXZxLT52cmluZ19w YWNrZWQuZGVzY1toZWFkXS5sZW4gPSBjcHVfdG9fdmlydGlvMzIoX3ZxLT52ZGV2LAo+Pj4+PiAr CQkJCXRvdGFsX3NnICogc2l6ZW9mKHN0cnVjdCB2cmluZ19wYWNrZWRfZGVzYykpOwo+Pj4+PiAr CQl2cS0+dnJpbmdfcGFja2VkLmRlc2NbaGVhZF0uaWQgPSBjcHVfdG9fdmlydGlvMzIoX3ZxLT52 ZGV2LCBoZWFkKTsKPj4+Pj4gKwl9Cj4+Pj4+ICsKPj4+Pj4gKwkvKiBXZSdyZSB1c2luZyBzb21l IGJ1ZmZlcnMgZnJvbSB0aGUgZnJlZSBsaXN0LiAqLwo+Pj4+PiArCXZxLT52cS5udW1fZnJlZSAt PSBkZXNjc191c2VkOwo+Pj4+PiArCj4+Pj4+ICsJLyogVXBkYXRlIGZyZWUgcG9pbnRlciAqLwo+ Pj4+PiArCWlmIChpbmRpcmVjdCkgewo+Pj4+PiArCQluID0gaGVhZCArIDE7Cj4+Pj4+ICsJCWlm IChuID49IHZxLT52cmluZ19wYWNrZWQubnVtKSB7Cj4+Pj4+ICsJCQluID0gMDsKPj4+Pj4gKwkJ CXZxLT53cmFwX2NvdW50ZXIgXj0gMTsKPj4+Pj4gKwkJfQo+Pj4+PiArCQl2cS0+ZnJlZV9oZWFk ID0gbjsKPj4+PiBkZXRhY2hfYnVmX3BhY2tlZCgpIGRvZXMgbm90IGV2ZW4gdG91Y2ggZnJlZV9o ZWFkIGhlcmUsIHNvIG5lZWQgdG8gZXhwbGFpbgo+Pj4+IGl0cyBtZWFuaW5nIGZvciBwYWNrZWQg cmluZy4KPj4+IEFib3ZlIGNvZGUgaXMgZm9yIGluZGlyZWN0IHN1cHBvcnQgd2hpY2ggaXNuJ3Qg cmVhbGx5Cj4+PiBpbXBsZW1lbnRlZCBpbiB0aGlzIHBhdGNoIHlldC4KPj4+Cj4+PiBGb3IgeW91 ciBxdWVzdGlvbiwgZnJlZV9oZWFkIHN0b3JlcyB0aGUgaW5kZXggb2YgdGhlCj4+PiBuZXh0IGF2 YWlsIGRlc2MuIEknbGwgYWRkIGEgY29tbWVudCBmb3IgaXQgb3IgbW92ZSBpdAo+Pj4gdG8gdW5p b24gYW5kIGdpdmUgaXQgYSBiZXR0ZXIgbmFtZSBpbiBuZXh0IHZlcnNpb24uCj4+IFllcywgc29t ZXRoaW5nIGxpa2UgYXZhaWxfaWR4IG1pZ2h0IGJlIGJldHRlci4KPj4KPj4+Pj4gKwl9IGVsc2UK Pj4+Pj4gKwkJdnEtPmZyZWVfaGVhZCA9IGk7Cj4+Pj4gSUQgaXMgb25seSB2YWxpZCBpbiB0aGUg bGFzdCBkZXNjcmlwdG9yIGluIHRoZSBsaXN0LCBzbyBoZWFkICsgMSBzaG91bGQgYmUKPj4+PiBv ayB0b28/Cj4+PiBJIGRvbid0IHJlYWxseSBnZXQgeW91ciBwb2ludC4gVGhlIHZxLT5mcmVlX2hl YWQgc3RvcmVzCj4+PiB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWwgZGVzYy4KPj4gSSB0aGlu ayBJIGdldCB5b3VyIGlkZWEgbm93LCBmcmVlX2hlYWQgaGFzIHR3byBtZWFuaW5nczoKPj4KPj4g LSBuZXh0IGF2YWlsIGluZGV4Cj4+IC0gYnVmZmVyIGlkCj4gSW4gbXkgZGVzaWduLCBmcmVlX2hl YWQgaXMganVzdCB0aGUgaW5kZXggb2YgdGhlIG5leHQKPiBhdmFpbCBkZXNjLgo+Cj4gRHJpdmVy IGNhbiBzZXQgYW55dGhpbmcgdG8gYnVmZmVyIElELgoKVGhlbiB5b3UgbmVlZCBhbm90aGVyIG1l dGhvZCB0byB0cmFjayBpZCB0byBjb250ZXh0IGUuZyBoYXNoaW5nLgoKPiAgIEFuZCBpbiBteSBk ZXNpZ24sCj4gSSBzYXZlIGRlc2MgaW5kZXggaW4gYnVmZmVyIElELgo+Cj4gSSdsbCBhZGQgY29t bWVudHMgZm9yIHRoZW0uCj4KPj4gSWYgSSdtIGNvcnJlY3QsIGxldCdzIGJldHRlciBhZGQgYSBj b21tZW50IGZvciB0aGlzLgo+Pgo+Pj4+PiArCj4+Pj4+ICsJLyogU3RvcmUgdG9rZW4gYW5kIGlu ZGlyZWN0IGJ1ZmZlciBzdGF0ZS4gKi8KPj4+Pj4gKwl2cS0+ZGVzY19zdGF0ZVtoZWFkXS5udW0g PSBkZXNjc191c2VkOwo+Pj4+PiArCXZxLT5kZXNjX3N0YXRlW2hlYWRdLmRhdGEgPSBkYXRhOwo+ Pj4+PiArCWlmIChpbmRpcmVjdCkKPj4+Pj4gKwkJdnEtPmRlc2Nfc3RhdGVbaGVhZF0uaW5kaXJf ZGVzYyA9IGRlc2M7Cj4+Pj4+ICsJZWxzZQo+Pj4+PiArCQl2cS0+ZGVzY19zdGF0ZVtoZWFkXS5p bmRpcl9kZXNjID0gY3R4Owo+Pj4+PiArCj4+Pj4+ICsJdmlydGlvX3dtYih2cS0+d2Vha19iYXJy aWVycyk7Cj4+Pj4gTGV0J3MgYWRkIGEgY29tbWVudCB0byBleHBsYWluIHRoZSBiYXJyaWVyIGhl cmUuCj4+PiBPa2F5Lgo+Pj4KPj4+Pj4gKwl2cS0+dnJpbmdfcGFja2VkLmRlc2NbaGVhZF0uZmxh Z3MgPSBoZWFkX2ZsYWdzOwo+Pj4+PiArCXZxLT5udW1fYWRkZWQrKzsKPj4+Pj4gKwo+Pj4+PiAr CXByX2RlYnVnKCJBZGRlZCBidWZmZXIgaGVhZCAlaSB0byAlcFxuIiwgaGVhZCwgdnEpOwo+Pj4+ PiArCUVORF9VU0UodnEpOwo+Pj4+PiArCj4+Pj4+ICsJcmV0dXJuIDA7Cj4+Pj4+ICsKPj4+Pj4g K3VubWFwX3JlbGVhc2U6Cj4+Pj4+ICsJZXJyX2lkeCA9IGk7Cj4+Pj4+ICsJaSA9IGhlYWQ7Cj4+ Pj4+ICsKPj4+Pj4gKwlmb3IgKG4gPSAwOyBuIDwgdG90YWxfc2c7IG4rKykgewo+Pj4+PiArCQlp ZiAoaSA9PSBlcnJfaWR4KQo+Pj4+PiArCQkJYnJlYWs7Cj4+Pj4+ICsJCXZyaW5nX3VubWFwX29u ZSh2cSwgJmRlc2NbaV0pOwo+Pj4+PiArCQlpKys7Cj4+Pj4+ICsJCWlmICghaW5kaXJlY3QgJiYg aSA+PSB2cS0+dnJpbmdfcGFja2VkLm51bSkKPj4+Pj4gKwkJCWkgPSAwOwo+Pj4+PiArCX0KPj4+ Pj4gKwo+Pj4+PiArCXZxLT53cmFwX2NvdW50ZXIgPSB3cmFwX2NvdW50ZXI7Cj4+Pj4+ICsKPj4+ Pj4gKwlpZiAoaW5kaXJlY3QpCj4+Pj4+ICsJCWtmcmVlKGRlc2MpOwo+Pj4+PiArCj4+Pj4+ICsJ RU5EX1VTRSh2cSk7Cj4+Pj4+ICsJcmV0dXJuIC1FSU87Cj4+Pj4+ICt9Cj4gWy4uLl0KPj4+Pj4g QEAgLTEwOTYsMTcgKzE1OTksMjEgQEAgc3RydWN0IHZpcnRxdWV1ZSAqdnJpbmdfY3JlYXRlX3Zp cnRxdWV1ZSgKPj4+Pj4gICAgIAlpZiAoIXF1ZXVlKSB7Cj4+Pj4+ICAgICAJCS8qIFRyeSB0byBn ZXQgYSBzaW5nbGUgcGFnZS4gWW91IGFyZSBteSBvbmx5IGhvcGUhICovCj4+Pj4+IC0JCXF1ZXVl ID0gdnJpbmdfYWxsb2NfcXVldWUodmRldiwgdnJpbmdfc2l6ZShudW0sIHZyaW5nX2FsaWduKSwK Pj4+Pj4gKwkJcXVldWUgPSB2cmluZ19hbGxvY19xdWV1ZSh2ZGV2LCBfX3ZyaW5nX3NpemUobnVt LCB2cmluZ19hbGlnbiwKPj4+Pj4gKwkJCQkJCQkgICAgIHBhY2tlZCksCj4+Pj4+ICAgICAJCQkJ CSAgJmRtYV9hZGRyLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOwo+Pj4+PiAgICAgCX0KPj4+Pj4g ICAgIAlpZiAoIXF1ZXVlKQo+Pj4+PiAgICAgCQlyZXR1cm4gTlVMTDsKPj4+Pj4gLQlxdWV1ZV9z aXplX2luX2J5dGVzID0gdnJpbmdfc2l6ZShudW0sIHZyaW5nX2FsaWduKTsKPj4+Pj4gLQl2cmlu Z19pbml0KCZ2cmluZywgbnVtLCBxdWV1ZSwgdnJpbmdfYWxpZ24pOwo+Pj4+PiArCXF1ZXVlX3Np emVfaW5fYnl0ZXMgPSBfX3ZyaW5nX3NpemUobnVtLCB2cmluZ19hbGlnbiwgcGFja2VkKTsKPj4+ Pj4gKwlpZiAocGFja2VkKQo+Pj4+PiArCQl2cmluZ19wYWNrZWRfaW5pdCgmdnJpbmcudnJpbmdf cGFja2VkLCBudW0sIHF1ZXVlLCB2cmluZ19hbGlnbik7Cj4+Pj4+ICsJZWxzZQo+Pj4+PiArCQl2 cmluZ19pbml0KCZ2cmluZy52cmluZ19zcGxpdCwgbnVtLCBxdWV1ZSwgdnJpbmdfYWxpZ24pOwo+ Pj4+IExldCdzIHJlbmFtZSB2cmluZ19pbml0IHRvIHZyaW5nX2luaXRfc3BsaXQoKSBsaWtlIG90 aGVyIGhlbHBlcnM/Cj4+PiBUaGUgdnJpbmdfaW5pdCgpIGlzIGEgcHVibGljIEFQSSBpbiBpbmNs dWRlL3VhcGkvbGludXgvdmlydGlvX3JpbmcuaC4KPj4+IEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHJl bmFtZSBpdC4KPj4gSSBzZWUsIHRoZW4gdGhpcyBuZWVkIG1vcmUgdGhvdWdodHMgdG8gdW5pZnkg dGhlIEFQSS4KPiBNeSB0aG91Z2h0IGlzIHRvIGtlZXAgdGhlIG9sZCBBUEkgYXMgaXMsIGFuZCBp bnRyb2R1Y2UKPiBuZXcgdHlwZXMgYW5kIGhlbHBlcnMgZm9yIHBhY2tlZCByaW5nLgoKSSBhZG1p dCBpdCdzIG5vdCBhIGZhdWx0IG9mIHRoaXMgcGF0Y2guIEJ1dCB3ZSdkIGJldHRlciB0aGluayBv ZiB0aGlzIGluIAp0aGUgZnV0dXJlLCBjb25zaWRlciB3ZSBtYXkgaGF2ZSBuZXcga2luZHMgb2Yg cmluZy4KCj4KPiBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoaXMgcGF0Y2g6Cj4gaHR0 cHM6Ly9sa21sLm9yZy9sa21sLzIwMTgvMi8yMy8yNDMKPiAoUFMuIFRoZSB0eXBlIHdoaWNoIGhh cyBiaXQgZmllbGRzIGlzIGp1c3QgZm9yIHJlZmVyZW5jZSwKPiAgIGFuZCB3aWxsIGJlIGNoYW5n ZWQgaW4gbmV4dCB2ZXJzaW9uLikKPgo+IERvIHlvdSBoYXZlIGFueSBvdGhlciBzdWdnZXN0aW9u cz8KCk5vLgoKVGhhbmtzCgo+Cj4gQmVzdCByZWdhcmRzLAo+IFRpd2VpIEJpZQo+Cj4+Pj4+IC0J dnEgPSBfX3ZyaW5nX25ld192aXJ0cXVldWUoaW5kZXgsIHZyaW5nLCB2ZGV2LCB3ZWFrX2JhcnJp ZXJzLCBjb250ZXh0LAo+Pj4+PiAtCQkJCSAgIG5vdGlmeSwgY2FsbGJhY2ssIG5hbWUpOwo+Pj4+ PiArCXZxID0gX192cmluZ19uZXdfdmlydHF1ZXVlKGluZGV4LCB2cmluZywgcGFja2VkLCB2ZGV2 LCB3ZWFrX2JhcnJpZXJzLAo+Pj4+PiArCQkJCSAgIGNvbnRleHQsIG5vdGlmeSwgY2FsbGJhY2ss IG5hbWUpOwo+Pj4+PiAgICAgCWlmICghdnEpIHsKPj4+Pj4gICAgIAkJdnJpbmdfZnJlZV9xdWV1 ZSh2ZGV2LCBxdWV1ZV9zaXplX2luX2J5dGVzLCBxdWV1ZSwKPj4+Pj4gICAgIAkJCQkgZG1hX2Fk ZHIpOwo+IFsuLi5dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QKVmlydHVhbGl6YXRpb25AbGlzdHMubGlu dXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxt YW4vbGlzdGluZm8vdmlydHVhbGl6YXRpb24=