From mboxrd@z Thu Jan 1 00:00:00 1970 From: Felix Kuehling Subject: [PATCH 8/9] lib: Closed hash table with low overhead Date: Sat, 26 Aug 2017 03:19:08 -0400 Message-ID: <1503731949-22742-9-git-send-email-Felix.Kuehling@amd.com> References: <1503731949-22742-1-git-send-email-Felix.Kuehling@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1503731949-22742-1-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org> List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Felix Kuehling VGhpcyBhZGRzIGEgY2xvc2VkIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gd2l0aCBsb3cgbWVt b3J5IGFuZCBDUFUKb3ZlcmhlYWQuIFRoZSBBUEkgaXMgaW5zcGlyZWQgYnkga2ZpZm8uCgpTdG9y aW5nLCByZXRyaWV2aW5nIGFuZCBkZWxldGluZyBkYXRhIGRvZXMgbm90IGludm9sdmUgYW55IGR5 bmFtaWMKbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIG1ha2VzIGl0IGlkZWFsIGZvciB1c2UgaW4g aW50ZXJydXB0IGNvbnRleHQuCk1lbW9yeSBvdmVyaGVhZCBwZXIgZW50cnkgaXMgdGhlIDMyIG9y IDY0IGJpdCBoYXNoIGtleSwgdHdvIGJpdHMgZm9yCmZyZWUvdXNlZCB0cmFja2luZyBhbmQgd2hh dGV2ZXIgdmFsdWUgc2l6ZSBpcyBzdG9yZWQgaW4gdGhlIHRhYmxlLgpObyBsaXN0IGhlYWRzIG9y IHBvaW50ZXJzLCB0aGVyZWZvcmUgdGhpcyBkYXRhIHN0cnVjdHVyZSBzaG91bGQgYmUKcXVpdGUg Y2FjaGUtZnJpZW5kbHksIHRvby4KCkFmdGVyIGVudHJpZXMgYXJlIHJlbW92ZWQsIGZyZWUgc3Bh Y2UgbWFpbnRlbmFuY2UgaXMgbmVjZXNzYXJ5LiBBdAp0aGUgc2FtZSB0aW1lLCBlbnRyaWVzIHRo YXQgaGFkIGhhc2ggY29sbGlzaW9ucyBvbiBpbnNlcnRpb24gY2FuIGJlCnJlbG9jYXRlZCB0byBz cGVlZCB1cCBmdXR1cmUgbG9va3Vwcy4gVGhpcyBpcyBkb25lIGluY3JlbWVudGFsbHkgYW5kCm9w cG9ydHVuaXN0aWNhbGx5IHRvIGF2b2lkIGxvbmcgc3RhbGxzLgoKQ1BVIG92ZXJoZWFkIGlzIHZl cnkgc21hbGwgYXMgbG9uZyBhcyB0aGUgdGFibGUgZG9lc24ndCBmaWxsIHVwIG1vcmUKdGhhbiBh Ym91dCA1MCUuIEl0J3Mgc3RpbGwgcXVpdGUgZWZmaWNpZW50IHVwIHRvIDkwJSBmdWxsLiBUaGUg bGVzcwpmcmVlIHNwYWNlIGlzIGluIHRoZSB0YWJsZSwgdGhlIG1vcmUgbGlrZWx5IGNvbGxpc2lv bnMgZ2V0LCBhbmQgdGhlCm1vcmUgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQgaXMgcmVxdWlyZWQgdG8g bWFpbnRhaW4gZnJlZSBzcGFjZSBhbmQKZWZmaWNpZW5jeS4KCkNoYW5nZS1JZDogSTg2ZTcyNTEw OTQxOTY5ZTc1MjNkZjExZjllNjg5MjZmNDZlZjdhZjEKU2lnbmVkLW9mZi1ieTogRmVsaXggS3Vl aGxpbmcgPEZlbGl4Lkt1ZWhsaW5nQGFtZC5jb20+Ci0tLQogaW5jbHVkZS9saW51eC9jaGFzaC5o IHwgMzQ5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogbGliL0tjb25maWcgICAg ICAgICAgIHwgICA4ICsKIGxpYi9NYWtlZmlsZSAgICAgICAgICB8ICAgMiArCiBsaWIvY2hhc2gu YyAgICAgICAgICAgfCA1MjEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgODgwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBt b2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L2NoYXNoLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIv Y2hhc2guYwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2hhc2guaCBiL2luY2x1ZGUvbGlu dXgvY2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM1NTc1Ci0t LSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jaGFzaC5oCkBAIC0wLDAgKzEsMzQ5IEBA CisvKgorICogQ29weXJpZ2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoK KyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg cGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0 aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRh dGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNv ZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlz IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6 CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURF RCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJ TVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1F UkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBO T05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xE RVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisg KiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9DSEFTSF9ICisjZGVmaW5lIF9M SU5VWF9DSEFTSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4 L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMu aD4KKworc3RydWN0IF9fY2hhc2hfdGFibGUgeworCXU4IGJpdHM7CisJdTgga2V5X3NpemU7CisJ dW5zaWduZWQgaW50IHZhbHVlX3NpemU7CisJdTMyIHNpemVfbWFzazsKKwl1bnNpZ25lZCBsb25n ICpvY2N1cF9iaXRtYXAsICp2YWxpZF9iaXRtYXA7CisJdW5pb24geworCQl1MzIgKmtleXMzMjsK KwkJdTY0ICprZXlzNjQ7CisJfTsKKwl1OCAqdmFsdWVzOworCisjZGVmaW5lIENIQVNIX1NUQVRT CisjaWZkZWYgQ0hBU0hfU1RBVFMKKwl1NjQgdG90YWxfYWRkX2NhbGxzLCB0b3RhbF9hZGRfc3Rl cHM7CisJdTY0IHRvdGFsX2ZpbmRfY2FsbHMsIHRvdGFsX2ZpbmRfc3RlcHM7CisJdTY0IHRvdGFs X25vdF9maW5kX2NhbGxzLCB0b3RhbF9ub3RfZmluZF9zdGVwczsKKwl1NjQgdG90YWxfcmVsb2Nh dGlvbnMsIHRvdGFsX3JlbG9jYXRpb25fZGlzdGFuY2U7CisjZW5kaWYKK307CisKKyNkZWZpbmUg X19DSEFTSF9CSVRNQVBfU0laRShiaXRzKQkJCQlcCisJKCgoMSA8PCAoYml0cykpICsgQklUU19Q RVJfTE9ORyAtIDEpIC8gQklUU19QRVJfTE9ORykKKyNkZWZpbmUgX19DSEFTSF9BUlJBWV9TSVpF KGJpdHMsIHNpemUpCQkJCVwKKwkoKCgoc2l6ZSkgPDwgKGJpdHMpKSArIHNpemVvZihsb25nKSAt IDEpIC8gc2l6ZW9mKGxvbmcpKQorCisjZGVmaW5lIF9fQ0hBU0hfREFUQV9TSVpFKGJpdHMsIGtl eV9zaXplLCB2YWx1ZV9zaXplKQlcCisJKF9fQ0hBU0hfQklUTUFQX1NJWkUoYml0cykgKiAyICsJ CVwKKwkgX19DSEFTSF9BUlJBWV9TSVpFKGJpdHMsIGtleV9zaXplKSArCQlcCisJIF9fQ0hBU0hf QVJSQVlfU0laRShiaXRzLCB2YWx1ZV9zaXplKSkKKworI2RlZmluZSBTVFJVQ1RfQ0hBU0hfVEFC TEUoYml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpCQkJXAorCXN0cnVjdCB7CQkJCQkJCVwKKwkJ c3RydWN0IF9fY2hhc2hfdGFibGUgdGFibGU7CQkJCVwKKwkJdW5zaWduZWQgbG9uZyBkYXRhWwkJ CQkJXAorCQkJX19DSEFTSF9EQVRBX1NJWkUoYml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpXTsJ XAorCX0KKworLyoqCisgKiBzdHJ1Y3QgY2hhc2hfdGFibGUgLSBEeW5hbWljYWxseSBhbGxvY2F0 ZWQgY2xvc2VkIGhhc2ggdGFibGUKKyAqCisgKiBVc2UgdGhpcyBzdHJ1Y3QgZm9yIGR5bmFtaWNh bGx5IGFsbG9jYXRlZCBoYXNoIHRhYmxlcyAodXNpbmcKKyAqIGNoYXNoX3RhYmxlX2FsbG9jIGFu ZCBjaGFzaF90YWJsZV9mcmVlKSwgd2hlcmUgdGhlIHNpemUgaXMKKyAqIGRldGVybWluZWQgYXQg cnVudGltZS4KKyAqLworc3RydWN0IGNoYXNoX3RhYmxlIHsKKwlzdHJ1Y3QgX19jaGFzaF90YWJs ZSB0YWJsZTsKKwl1bnNpZ25lZCBsb25nICpkYXRhOworfTsKKworLyoqCisgKiBERUNMQVJFX0NI QVNIX1RBQkxFIC0gbWFjcm8gdG8gZGVjbGFyZSBhIGNsb3NlZCBoYXNoIHRhYmxlCisgKiBAdGFi bGU6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKKyAqIEBidHM6IFRhYmxlIHNpemUg d2lsbCBiZSAyXmJpdHMgZW50cmllcworICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4g Ynl0ZXMsIDQgb3IgOAorICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywg Y2FuIGJlIDAKKyAqCisgKiBUaGlzIGRlY2xhcmVzIHRoZSBoYXNoIHRhYmxlIHZhcmlhYmxlIHdp dGggYSBzdGF0aWMgc2l6ZS4KKyAqCisgKiBUaGUgY2xvc2VkIGhhc2ggdGFibGUgc3RvcmVzIGtl eS12YWx1ZSBwYWlycyB3aXRoIGxvdyBtZW1vcnkgYW5kCisgKiBsb29rdXAgb3ZlcmhlYWQuIElu IG9wZXJhdGlvbiBpdCBwZXJmb3JtcyBubyBkeW5hbWljIG1lbW9yeQorICogbWFuYWdlbWVudC4g VGhlIGRhdGEgYmVpbmcgc3RvcmVkIGRvZXMgbm90IHJlcXVpcmUgYW55CisgKiBsaXN0X2hlYWRz LiBUaGUgaGFzaCB0YWJsZSBwZXJmb3JtcyBiZXN0IHdpdGggc21hbGwgQHZhbF9zeiBhbmQgYXMK KyAqIGxvbmcgYXMgc29tZSBzcGFjZSAoYWJvdXQgNTAlKSBpcyBsZWZ0IGZyZWUgaW4gdGhlIHRh YmxlLiBCdXQgdGhlCisgKiB0YWJsZSBjYW4gc3RpbGwgd29yayByZWFzb25hYmx5IGVmZmljaWVu dGx5IGV2ZW4gd2hlbiBmaWxsZWQgdXAgdG8KKyAqIGFib3V0IDkwJS4gSWYgYmlnZ2VyIGRhdGEg aXRlbXMgbmVlZCB0byBiZSBzdG9yZWQgYW5kIGxvb2tlZCB1cCwKKyAqIHN0b3JlIHRoZSBwb2lu dGVyIHRvIGl0IGFzIHZhbHVlIGluIHRoZSBoYXNoIHRhYmxlLgorICoKKyAqIEB2YWxfc3ogbWF5 IGJlIDAuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGFsbCB0aGUgc3RvcmVkCisgKiBpbmZvcm1h dGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGtleSBpdHNlbGYgYW5kIHRoZSBmYWN0IHRoYXQgaXQg aXMKKyAqIGluIHRoZSBoYXNoIHRhYmxlIChvciBub3QpLgorICovCisjZGVmaW5lIERFQ0xBUkVf Q0hBU0hfVEFCTEUodGFibGUsIGJ0cywga2V5X3N6LCB2YWxfc3opCQlcCisJU1RSVUNUX0NIQVNI X1RBQkxFKGJ0cywga2V5X3N6LCB2YWxfc3opIHRhYmxlCisKKyNpZmRlZiBDSEFTSF9TVEFUUwor I2RlZmluZSBfX0NIQVNIX1NUQVRTX0lOSVQocHJlZml4KSAsCQkJXAorCQlwcmVmaXgudG90YWxf YWRkX2NhbGxzID0gMCwJCVwKKwkJcHJlZml4LnRvdGFsX2FkZF9zdGVwcyA9IDAsCQlcCisJCXBy ZWZpeC50b3RhbF9maW5kX2NhbGxzID0gMCwJCVwKKwkJcHJlZml4LnRvdGFsX2ZpbmRfc3RlcHMg PSAwLAkJXAorCQlwcmVmaXgudG90YWxfbm90X2ZpbmRfY2FsbHMgPSAwLAlcCisJCXByZWZpeC50 b3RhbF9ub3RfZmluZF9zdGVwcyA9IDAsCVwKKwkJcHJlZml4LnRvdGFsX3JlbG9jYXRpb25zID0g MCwJCVwKKwkJcHJlZml4LnRvdGFsX3JlbG9jYXRpb25fZGlzdGFuY2UgPSAwCisjZWxzZQorI2Rl ZmluZSBfX0NIQVNIX1NUQVRTX0lOSVQocHJlZml4KQorI2VuZGlmCisKKyNkZWZpbmUgX19DSEFT SF9UQUJMRV9JTklUKHByZWZpeCwgZGF0YSwgYnRzLCBrZXlfc3osIHZhbF9zeikJXAorCXByZWZp eC5iaXRzID0gKGJ0cyksCQkJCQlcCisJCXByZWZpeC5rZXlfc2l6ZSA9IChrZXlfc3opLAkJCVwK KwkJcHJlZml4LnZhbHVlX3NpemUgPSAodmFsX3N6KSwJCQlcCisJCXByZWZpeC5zaXplX21hc2sg PSAoKDEgPDwgYnRzKSAtIDEpLAkJXAorCQlwcmVmaXgub2NjdXBfYml0bWFwID0gJmRhdGFbMF0s CQkJXAorCQlwcmVmaXgudmFsaWRfYml0bWFwID0gJmRhdGFbCQkJXAorCQkJX19DSEFTSF9CSVRN QVBfU0laRShidHMpXSwJCVwKKwkJcHJlZml4LmtleXM2NCA9ICh1NjQgKikmZGF0YVsJCQlcCisJ CQlfX0NIQVNIX0JJVE1BUF9TSVpFKGJ0cykgKiAyXSwJCVwKKwkJcHJlZml4LnZhbHVlcyA9ICh1 OCAqKSZkYXRhWwkJCVwKKwkJCV9fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKSAqIDIgKwkJXAorCQkJ X19DSEFTSF9BUlJBWV9TSVpFKGJ0cywga2V5X3N6KV0JXAorCQlfX0NIQVNIX1NUQVRTX0lOSVQo cHJlZml4KQorCisvKioKKyAqIERFRklORV9DSEFTSF9UQUJMRSAtIG1hY3JvIHRvIGRlZmluZSBh bmQgaW5pdGlhbGl6ZSBhIGNsb3NlZCBoYXNoIHRhYmxlCisgKiBAdGJsOiBuYW1lIG9mIHRoZSBk ZWNsYXJlZCBoYXNoIHRhYmxlCisgKiBAYnRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVu dHJpZXMKKyAqIEBrZXlfc3o6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgKKyAq IEB2YWxfc3o6IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwCisgKgorICog Tm90ZTogdGhlIG1hY3JvIGNhbiBiZSB1c2VkIGZvciBnbG9iYWwgYW5kIGxvY2FsIGhhc2ggdGFi bGUgdmFyaWFibGVzLgorICovCisjZGVmaW5lIERFRklORV9DSEFTSF9UQUJMRSh0YmwsIGJ0cywg a2V5X3N6LCB2YWxfc3opCQkJXAorCURFQ0xBUkVfQ0hBU0hfVEFCTEUodGJsLCBidHMsIGtleV9z eiwgdmFsX3N6KSA9IHsJCVwKKwkJLnRhYmxlID0gewkJCQkJCVwKKwkJCV9fQ0hBU0hfVEFCTEVf SU5JVCgsICh0YmwpLmRhdGEsIGJ0cywga2V5X3N6LCB2YWxfc3opIFwKKwkJfSwJCQkJCQkJXAor CQkuZGF0YSA9IHswfQkJCQkJCVwKKwl9CisKKy8qKgorICogSU5JVF9DSEFTSF9UQUJMRSAtIElu aXRpYWxpemUgYSBoYXNoIHRhYmxlIGRlY2xhcmVkIGJ5IERFQ0xBUkVfQ0hBU0hfVEFCTEUKKyAq IEB0Ymw6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKKyAqIEBidHM6IFRhYmxlIHNp emUgd2lsbCBiZSAyXmJpdHMgZW50cmllcworICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMg aW4gYnl0ZXMsIDQgb3IgOAorICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRl cywgY2FuIGJlIDAKKyAqLworI2RlZmluZSBJTklUX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlf c3osIHZhbF9zeikJCQlcCisJX19DSEFTSF9UQUJMRV9JTklUKCgodGJsKS50YWJsZSksICh0Ymwp LmRhdGEsIGJ0cywga2V5X3N6LCB2YWxfc3opCisKK2ludCBjaGFzaF90YWJsZV9hbGxvYyhzdHJ1 Y3QgY2hhc2hfdGFibGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBrZXlfc2l6ZSwKKwkJICAgICAgdW5z aWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90IGdmcF9tYXNrKTsKK3ZvaWQgY2hhc2hfdGFibGVf ZnJlZShzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlKTsKKworLyoqCisgKiBjaGFzaF90YWJsZV9k dW1wX3N0YXRzIC0gRHVtcCBzdGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhhc2ggdGFibGUKKyAqIEB0 Ymw6IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQorICoKKyAqIER1bXBzIHNvbWUgcGVy Zm9ybWFuY2Ugc3RhdGlzdGljcyBvZiB0aGUgdGFibGUgZ2F0aGVyZWQgaW4gb3BlcmF0aW9uLgor ICovCisjaWZkZWYgQ0hBU0hfU1RBVFMKKyNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0cyh0 YmwpIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmKCp0YmwpLnRhYmxlKQorCit2b2lkIF9fY2hh c2hfdGFibGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpOworI2Vsc2UK KyNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0cyh0YmwpCisjZW5kaWYKKworLyoqCisgKiBj aGFzaF90YWJsZV9jb3B5X2luIC0gQ29weSBhIG5ldyB2YWx1ZSBpbnRvIHRoZSBoYXNoIHRhYmxl CisgKiBAdGJsOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUKKyAqIEBrZXk6IEtleSBv ZiB0aGUgZW50cnkgdG8gYWRkIG9yIHVwZGF0ZQorICogQHZhbHVlOiBQb2ludGVyIHRvIHZhbHVl IHRvIGNvcHksIG1heSBiZSBOVUxMCisgKgorICogSWYgQGtleSBhbHJlYWR5IGhhcyBhbiBlbnRy eSwgaXRzIHZhbHVlIGlzIHJlcGxhY2VkLiBPdGhlcndpc2UgYQorICogbmV3IGVudHJ5IGlzIGFk ZGVkLiBJZiBAdmFsdWUgaXMgTlVMTCwgdGhlIHZhbHVlIGlzIGxlZnQgdW5jaGFuZ2VkCisgKiBv ciB1bmluaXRpYWxpemVkLiBSZXR1cm5zIDEgaWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdGVkLCAw IGlmIGEgbmV3CisgKiBlbnRyeSB3YXMgYWRkZWQgb3IgJS1FTk9NRU0gaWYgdGhlcmUgd2FzIG5v IGZyZWUgc3BhY2UgaW4gdGhlCisgKiB0YWJsZS4KKyAqLworI2RlZmluZSBjaGFzaF90YWJsZV9j b3B5X2luKHRibCwga2V5LCB2YWx1ZSkJCQlcCisJX19jaGFzaF90YWJsZV9jb3B5X2luKCYoKnRi bCkudGFibGUsIGtleSwgdmFsdWUpCisKK2ludCBfX2NoYXNoX3RhYmxlX2NvcHlfaW4oc3RydWN0 IF9fY2hhc2hfdGFibGUgKnRhYmxlLCB1NjQga2V5LAorCQkJICBjb25zdCB2b2lkICp2YWx1ZSk7 CisKKy8qKgorICogY2hhc2hfdGFibGVfY29weV9vdXQgLSBDb3B5IGEgdmFsdWUgb3V0IG9mIHRo ZSBoYXNoIHRhYmxlCisgKiBAdGJsOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUKKyAq IEBrZXk6IEtleSBvZiB0aGUgZW50cnkgdG8gZmluZAorICogQHZhbHVlOiBQb2ludGVyIHRvIHZh bHVlIHRvIGNvcHksIG1heSBiZSBOVUxMCisgKgorICogSWYgQHZhbHVlIGlzIG5vdCBOVUxMIGFu ZCB0aGUgdGFibGUgaGFzIGEgbm9uLTAgdmFsdWVfc2l6ZSwgdGhlCisgKiB2YWx1ZSBhdCBAa2V5 IGlzIGNvcGllZCB0byBAdmFsdWUuIFJldHVybnMgdGhlIHNsb3QgaW5kZXggb2YgdGhlCisgKiBl bnRyeSBvciAlLUVJTlZBTCBpZiBAa2V5IHdhcyBub3QgZm91bmQuCisgKi8KKyNkZWZpbmUgY2hh c2hfdGFibGVfY29weV9vdXQodGJsLCBrZXksIHZhbHVlKQkJCVwKKwlfX2NoYXNoX3RhYmxlX2Nv cHlfb3V0KCYoKnRibCkudGFibGUsIGtleSwgdmFsdWUsIGZhbHNlKQorCitpbnQgX19jaGFzaF90 YWJsZV9jb3B5X291dChzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksCisJCQkg ICB2b2lkICp2YWx1ZSwgYm9vbCByZW1vdmUpOworCisvKioKKyAqIGNoYXNoX3RhYmxlX3JlbW92 ZSAtIFJlbW92ZSBhbiBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlCisgKiBAdGJsOiBQb2ludGVy IHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUKKyAqIEBrZXk6IEtleSBvZiB0aGUgZW50cnkgdG8gZmlu ZAorICogQHZhbHVlOiBQb2ludGVyIHRvIHZhbHVlIHRvIGNvcHksIG1heSBiZSBOVUxMCisgKgor ICogSWYgQHZhbHVlIGlzIG5vdCBOVUxMIGFuZCB0aGUgdGFibGUgaGFzIGEgbm9uLTAgdmFsdWVf c2l6ZSwgdGhlCisgKiB2YWx1ZSBhdCBAa2V5IGlzIGNvcGllZCB0byBAdmFsdWUuIFRoZSBlbnRy eSBpcyByZW1vdmVkIGZyb20gdGhlCisgKiB0YWJsZS4gUmV0dXJucyB0aGUgc2xvdCBpbmRleCBv ZiB0aGUgcmVtb3ZlZCBlbnRyeSBvciAlLUVJTlZBTCBpZgorICogQGtleSB3YXMgbm90IGZvdW5k LgorICovCisjZGVmaW5lIGNoYXNoX3RhYmxlX3JlbW92ZSh0YmwsIGtleSwgdmFsdWUpCQkJXAor CV9fY2hhc2hfdGFibGVfY29weV9vdXQoJigqdGJsKS50YWJsZSwga2V5LCB2YWx1ZSwgdHJ1ZSkK KworI2RlZmluZSBDSEFTSF9TRUxGX1RFU1QKKyNpZmRlZiBDSEFTSF9TRUxGX1RFU1QKK2ludCBj aGFzaF9zZWxmX3Rlc3QodTggYml0cywgdTgga2V5X3NpemUsIGludCBtaW5fZmlsbCwgaW50IG1h eF9maWxsLAorCQkgICAgdTY0IGl0ZXJhdGlvbnMpOworI2VuZGlmCisKKy8qCisgKiBMb3cgbGV2 ZWwgaXRlcmF0b3IgQVBJIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgYWJvdmUgZnVuY3Rpb25zLgor ICovCitzdHJ1Y3QgY2hhc2hfaXRlciB7CisJc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlOwor CXVuc2lnbmVkIGxvbmcgbWFzazsKKwlpbnQgc2xvdDsKK307CisKKy8qKgorICogQ0hBU0hfSVRF Ul9JTklUIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgaXRlcmF0b3IKKyAqIEB0Ymw6IFBvaW50 ZXIgdG8gaGFzaCB0YWJsZSB0byBpdGVyYXRlIG92ZXIKKyAqIEBzOiBJbml0aWFsIHNsb3QgbnVt YmVyCisgKi8KKyNkZWZpbmUgQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCBzKSB7CQkJXAorCQl0YWJs ZSwJCQkJCVwKKwkJMVVMIDw8ICgocykgJiAoQklUU19QRVJfTE9ORyAtIDEpKSwJXAorCQlzCQkJ CQlcCisJfQorLyoqCisgKiBDSEFTSF9JVEVSX1NFVCAtIFNldCBoYXNoIHRhYmxlIGl0ZXJhdG9y IHRvIG5ldyBzbG90CisgKiBAaXRlcjogSXRlcmF0b3IKKyAqIEBzOiBTbG90IG51bWJlcgorICov CisjZGVmaW5lIENIQVNIX0lURVJfU0VUKGl0ZXIsIHMpCQkJCQlcCisJKGl0ZXIpLm1hc2sgPSAx VUwgPDwgKChzKSAmIChCSVRTX1BFUl9MT05HIC0gMSkpLAlcCisJKGl0ZXIpLnNsb3QgPSAocykK Ky8qKgorICogQ0hBU0hfSVRFUl9JTkMgLSBJbmNyZW1lbnQgaGFzaCB0YWJsZSBpdGVyYXRvcgor ICogQHRhYmxlOiBIYXNoIHRhYmxlIHRvIGl0ZXJhdGUgb3ZlcgorICoKKyAqIFdyYXBzIGFyb3Vu ZCBhdCB0aGUgZW5kLgorICovCisjZGVmaW5lIENIQVNIX0lURVJfSU5DKGl0ZXIpIGRvIHsJCQkJ CVwKKwkJKGl0ZXIpLm1hc2sgPSAoaXRlcikubWFzayA8PCAxIHwJCQlcCisJCQkoaXRlcikubWFz ayA+PiAoQklUU19QRVJfTE9ORyAtIDEpOwkJXAorCQkoaXRlcikuc2xvdCA9ICgoaXRlcikuc2xv dCArIDEpICYgKGl0ZXIpLnRhYmxlLT5zaXplX21hc2s7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0 aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc192YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRl ciBpdGVyKQoreworCUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFi bGUtPmJpdHMpKTsKKwlyZXR1cm4gISEoaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xv dCA+PiBfQklUT1BTX0xPTkdfU0hJRlRdICYKKwkJICBpdGVyLm1hc2spOworfQorc3RhdGljIGlu bGluZSBib29sIGNoYXNoX2l0ZXJfaXNfZW1wdHkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRl cikKK3sKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5i aXRzKSk7CisJcmV0dXJuICEoaXRlci50YWJsZS0+b2NjdXBfYml0bWFwW2l0ZXIuc2xvdCA+PiBf QklUT1BTX0xPTkdfU0hJRlRdICYKKwkJIGl0ZXIubWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUg dm9pZCBjaGFzaF9pdGVyX3NldF92YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQor eworCUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMp KTsKKwlpdGVyLnRhYmxlLT52YWxpZF9iaXRtYXBbaXRlci5zbG90ID4+IF9CSVRPUFNfTE9OR19T SElGVF0gfD0gaXRlci5tYXNrOworCWl0ZXIudGFibGUtPm9jY3VwX2JpdG1hcFtpdGVyLnNsb3Qg Pj4gX0JJVE9QU19MT05HX1NISUZUXSB8PSBpdGVyLm1hc2s7Cit9CitzdGF0aWMgaW5saW5lIHZv aWQgY2hhc2hfaXRlcl9zZXRfaW52YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQor eworCUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMp KTsKKwlpdGVyLnRhYmxlLT52YWxpZF9iaXRtYXBbaXRlci5zbG90ID4+IF9CSVRPUFNfTE9OR19T SElGVF0gJj0gfml0ZXIubWFzazsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3Nl dF9lbXB0eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTigodW5zaWdu ZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKKwlpdGVyLnRhYmxlLT5v Y2N1cF9iaXRtYXBbaXRlci5zbG90ID4+IF9CSVRPUFNfTE9OR19TSElGVF0gJj0gfml0ZXIubWFz azsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9rZXkzMihjb25zdCBzdHJ1Y3Qg Y2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA0KTsK KwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7 CisJcmV0dXJuIGl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNsb3RdOworfQorc3RhdGljIGlubGlu ZSB1NjQgY2hhc2hfaXRlcl9rZXk2NChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQorewor CUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsKKwlCVUdfT04oKHVuc2lnbmVkKWl0 ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuIGl0ZXIudGFibGUt PmtleXM2NFtpdGVyLnNsb3RdOworfQorc3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXko Y29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKK3sKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIu c2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuIChpdGVyLnRhYmxlLT5r ZXlfc2l6ZSA9PSA0KSA/CisJCWl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNsb3RdIDogaXRlci50 YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0 ZXJfaGFzaDMyKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpCit7CisJQlVHX09OKGl0ZXIu dGFibGUtPmtleV9zaXplICE9IDQpOworCXJldHVybiBoYXNoXzMyKGNoYXNoX2l0ZXJfa2V5MzIo aXRlciksIGl0ZXIudGFibGUtPmJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9p dGVyX2hhc2g2NChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTihpdGVy LnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsKKwlyZXR1cm4gaGFzaF82NChjaGFzaF9pdGVyX2tleTY0 KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2hhc2hf aXRlcl9oYXNoKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpCit7CisJcmV0dXJuIChpdGVy LnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWhhc2hfMzIoY2hhc2hfaXRlcl9rZXkzMihpdGVy KSwgaXRlci50YWJsZS0+Yml0cykgOgorCQloYXNoXzY0KGNoYXNoX2l0ZXJfa2V5NjQoaXRlciks IGl0ZXIudGFibGUtPmJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNoYXNoX2l0ZXJf dmFsdWUoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKK3sKKwlCVUdfT04oKHVuc2lnbmVk KWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuIGl0ZXIudGFi bGUtPnZhbHVlcyArCisJCSgodW5zaWduZWQgbG9uZylpdGVyLnNsb3QgKiBpdGVyLnRhYmxlLT52 YWx1ZV9zaXplKTsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9DSEFTSF9IICovCmRpZmYgLS1naXQg YS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDBjOGI3OGEuLmU1ZTE0MzggMTAwNjQ0 Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC01NjQsNCArNTY0LDEyIEBA IGNvbmZpZyBQQVJNQU4KIGNvbmZpZyBQUklNRV9OVU1CRVJTCiAJdHJpc3RhdGUKIAorIworIyBD bG9zZWQgaGFzaCB0YWJsZQorIworY29uZmlnIENIQVNICisJdHJpc3RhdGUgIkNsb3NlZCBoYXNo IHRhYmxlIgorICAgICAgICBoZWxwCisJIENsb3NlZCBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9u IHdpdGggbG93IG1lbW9yeSBhbmQgQ1BVIG92ZXJoZWFkLgorCiBlbmRtZW51CmRpZmYgLS1naXQg YS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggMDE2NmZiYy4uYTQ0ZWM5ZiAxMDA2 NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtMjQzLDMgKzI0Myw1 IEBAIFVCU0FOX1NBTklUSVpFX3Vic2FuLm8gOj0gbgogb2JqLSQoQ09ORklHX1NCSVRNQVApICs9 IHNiaXRtYXAubwogCiBvYmotJChDT05GSUdfUEFSTUFOKSArPSBwYXJtYW4ubworCitvYmotJChD T05GSUdfQ0hBU0gpICs9IGNoYXNoLm8KZGlmZiAtLWdpdCBhL2xpYi9jaGFzaC5jIGIvbGliL2No YXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjZGFjMQotLS0gL2Rl di9udWxsCisrKyBiL2xpYi9jaGFzaC5jCkBAIC0wLDAgKzEsNTIxIEBACisvKgorICogQ29weXJp Z2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24g aXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlv biBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0 aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJp Z2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1 YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8g cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUg aW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhl IFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK KyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQu ICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9S KFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwK KyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdB UkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoK KyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+ CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1 ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NoYXNoLmg+CisKKy8qKgorICog Y2hhc2hfdGFibGVfYWxsb2MgLSBBbGxvY2F0ZSBjbG9zZWQgaGFzaCB0YWJsZQorICogQHRhYmxl OiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUKKyAqIEBiaXRzOiBUYWJsZSBzaXplIHdp bGwgYmUgMl5iaXRzIGVudHJpZXMKKyAqIEBrZXlfc2l6ZTogU2l6ZSBvZiBoYXNoIGtleXMgaW4g Ynl0ZXMsIDQgb3IgOAorICogQHZhbHVlX3NpemU6IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0 ZXMsIGNhbiBiZSAwCisgKi8KK2ludCBjaGFzaF90YWJsZV9hbGxvYyhzdHJ1Y3QgY2hhc2hfdGFi bGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBrZXlfc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgdmFsdWVf c2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJaWYgKGJpdHMgPiAzMSkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlpZiAoa2V5X3NpemUgIT0gNCAmJiBrZXlfc2l6ZSAhPSA4KQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCXRhYmxlLT5kYXRhID0ga2NhbGxvYyhfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBr ZXlfc2l6ZSwgdmFsdWVfc2l6ZSksCisJCSAgICAgICBzaXplb2YobG9uZyksIGdmcF9tYXNrKTsK KwlpZiAoIXRhYmxlLT5kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCV9fQ0hBU0hfVEFCTEVf SU5JVCh0YWJsZS0+dGFibGUsIHRhYmxlLT5kYXRhLCBiaXRzLCBrZXlfc2l6ZSwgdmFsdWVfc2l6 ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woY2hhc2hfdGFibGVfYWxsb2MpOwor CisvKioKKyAqIGNoYXNoX3RhYmxlX2ZyZWUgLSBGcmVlIGNsb3NlZCBoYXNoIHRhYmxlCisgKiBA dGFibGU6IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQorICovCit2b2lkIGNoYXNoX3Rh YmxlX2ZyZWUoc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSkKK3sKKwlrZnJlZSh0YWJsZS0+ZGF0 YSk7Cit9CitFWFBPUlRfU1lNQk9MKGNoYXNoX3RhYmxlX2ZyZWUpOworCisjaWZkZWYgQ0hBU0hf U1RBVFMKKworI2RlZmluZSBESVZfRlJBQyhub20sIGRlbm9tLCBxdW90LCBmcmFjLCBmcmFjX2Rp Z2l0cykgZG8gewkJXAorCQkocXVvdCkgPSAobm9tKSAvIChkZW5vbSk7CQkJCVwKKwkJKGZyYWMp ID0gKChub20pICUgKGRlbm9tKSAqIChmcmFjX2RpZ2l0cykgKwkJXAorCQkJICAoZGVub20pIC8g MikgLyAoZGVub20pOwkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIF9fY2hhc2hfdGFibGVfZHVt cF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IGNoYXNoX2l0 ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7CisJdTMyIGZpbGxlZCA9IDAsIGVt cHR5ID0gMCwgdG9tYnN0b25lcyA9IDA7CisJdTMyIHF1b3QsIGZyYWM7CisJdTMyIHF1b3QyLCBm cmFjMjsKKworCWRvIHsKKwkJaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpCisJCQlmaWxs ZWQrKzsKKwkJZWxzZSBpZiAoY2hhc2hfaXRlcl9pc19lbXB0eShpdGVyKSkKKwkJCWVtcHR5Kys7 CisJCWVsc2UKKwkJCXRvbWJzdG9uZXMrKzsKKwkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7CisJfSB3 aGlsZSAoaXRlci5zbG90KTsKKworCXByX2luZm8oIkhhc2ggdGFibGUga2V5IHNpemUgJWQsIHZh bHVlIHNpemUgJWRcbiIsCisJCXRhYmxlLT5rZXlfc2l6ZSwgdGFibGUtPnZhbHVlX3NpemUpOwor CXByX2luZm8oIiAgU2xvdHMgdG90YWwvZmlsbGVkL2VtcHR5L3RvbWJzdG9uZXM6ICV1IC8gJXUg LyAldSAvICV1XG4iLAorCQkxIDw8IHRhYmxlLT5iaXRzLCBmaWxsZWQsIGVtcHR5LCB0b21ic3Rv bmVzKTsKKwlwcl9pbmZvKCIgIEF2ZyBudW1iZXIgb2Ygc2VhcmNoIHN0ZXBzIGZvcjpcbiIpOwor CWlmICh0YWJsZS0+dG90YWxfYWRkX2NhbGxzID4gMCkKKwkJRElWX0ZSQUModGFibGUtPnRvdGFs X2FkZF9zdGVwcywgdGFibGUtPnRvdGFsX2FkZF9jYWxscywKKwkJCSBxdW90LCBmcmFjLCAxMDAw KTsKKwllbHNlCisJCXF1b3QgPSBmcmFjID0gMDsKKwlwcl9pbmZvKCIgICAgQWRkICAgICAgICAg ICA6ICV1LiUwM3VcbiIsIHF1b3QsIGZyYWMpOworCWlmICh0YWJsZS0+dG90YWxfZmluZF9jYWxs cyA+IDApCisJCURJVl9GUkFDKHRhYmxlLT50b3RhbF9maW5kX3N0ZXBzLAorCQkJIHRhYmxlLT50 b3RhbF9maW5kX2NhbGxzLCBxdW90LCBmcmFjLCAxMDAwKTsKKwllbHNlCisJCXF1b3QgPSBmcmFj ID0gMDsKKwlpZiAodGFibGUtPnRvdGFsX25vdF9maW5kX2NhbGxzID4gMCkKKwkJRElWX0ZSQUMo dGFibGUtPnRvdGFsX25vdF9maW5kX3N0ZXBzLAorCQkJIHRhYmxlLT50b3RhbF9ub3RfZmluZF9j YWxscywgcXVvdDIsIGZyYWMyLCAxMDAwKTsKKwllbHNlCisJCXF1b3QyID0gZnJhYzIgPSAwOwor CXByX2luZm8oIiAgICBGaW5kKGhpdC9taXNzKTogJXUuJTAzdSAvICV1LiUwM3VcbiIsIHF1b3Qs IGZyYWMsIHF1b3QyLCBmcmFjMik7CisJaWYgKHRhYmxlLT50b3RhbF9yZWxvY2F0aW9ucykgewor CQl1NjQgcXVvdDY0OworCisJCURJVl9GUkFDKHRhYmxlLT50b3RhbF9maW5kX2NhbGxzICsgdGFi bGUtPnRvdGFsX25vdF9maW5kX2NhbGxzLAorCQkJIHRhYmxlLT50b3RhbF9yZWxvY2F0aW9ucywg cXVvdDY0LCBmcmFjLCAxMDAwKTsKKwkJRElWX0ZSQUModGFibGUtPnRvdGFsX3JlbG9jYXRpb25f ZGlzdGFuY2UsCisJCQkgdGFibGUtPnRvdGFsX3JlbG9jYXRpb25zLCBxdW90MiwgZnJhYzIsIDEw MDApOworCQlwcl9pbmZvKCIgIFJlbG9jYXRpb25zIChmcmVxL2F2Zy5kaXN0KTogMTolbGx1LiUw M3UgLyAldS4lMDN1XG4iLAorCQkJcXVvdDY0LCBmcmFjLCBxdW90MiwgZnJhYzIpOworCX0gZWxz ZSB7CisJCXByX2luZm8oIiAgTm8gcmVsb2NhdGlvbnNcbiIpOworCX0KK30KK0VYUE9SVF9TWU1C T0woX19jaGFzaF90YWJsZV9kdW1wX3N0YXRzKTsKKworI3VuZGVmIERJVl9GUkFDCisjZW5kaWYK KworI2RlZmluZSBDSEFTSF9JTkModGFibGUsIGEpICgoYSkgPSAoKGEpICsgMSkgJiAodGFibGUp LT5zaXplX21hc2spCisjZGVmaW5lIENIQVNIX0FERCh0YWJsZSwgYSwgYikgKCgoYSkgKyAoYikp ICYgKHRhYmxlKS0+c2l6ZV9tYXNrKQorI2RlZmluZSBDSEFTSF9TVUIodGFibGUsIGEsIGIpICgo KGEpIC0gKGIpKSAmICh0YWJsZSktPnNpemVfbWFzaykKKyNkZWZpbmUgQ0hBU0hfSU5fUkFOR0Uo dGFibGUsIHNsb3QsIGZpcnN0LCBsYXN0KSBcCisJKENIQVNIX1NVQih0YWJsZSwgc2xvdCwgZmly c3QpIDw9IENIQVNIX1NVQih0YWJsZSwgbGFzdCwgZmlyc3QpKQorCisvKiNkZWZpbmUgQ0hBU0hf REVCVUcgVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIHZlcmJvc2UgZGVidWcgb3V0cHV0Ki8KKyNp ZmRlZiBDSEFTSF9ERUJVRworc3RhdGljIHZvaWQgY2hhc2hfdGFibGVfZHVtcChzdHJ1Y3QgX19j aGFzaF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lU RVJfSU5JVCh0YWJsZSwgMCk7CisKKwlkbyB7CisJCWlmICgoaXRlci5zbG90ICYgMykgPT0gMCkK KwkJCXByX2RlYnVnKCIlMDR4OiAiLCBpdGVyLnNsb3QpOworCisJCWlmIChjaGFzaF9pdGVyX2lz X3ZhbGlkKGl0ZXIpKQorCQkJcHJfZGVidWcoIlslMDE2bGx4XSAiLCBjaGFzaF9pdGVyX2tleShp dGVyKSk7CisJCWVsc2UgaWYgKGNoYXNoX2l0ZXJfaXNfZW1wdHkoaXRlcikpCisJCQlwcl9kZWJ1 ZygiWyAgICA8ZW1wdHk+ICAgICBdICIpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiWyAgPHRvbWJz dG9uZT4gICBdICIpOworCisJCWlmICgoaXRlci5zbG90ICYgMykgPT0gMykKKwkJCXByX2RlYnVn KCJcbiIpOworCisJCUNIQVNIX0lURVJfSU5DKGl0ZXIpOworCX0gd2hpbGUgKGl0ZXIuc2xvdCk7 CisKKwlpZiAoKGl0ZXIuc2xvdCAmIDMpICE9IDApCisJCXByX2RlYnVnKCJcbiIpOworfQorCitz dGF0aWMgaW50IGNoYXNoX3RhYmxlX2NoZWNrKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSkK K3sKKwl1MzIgaGFzaDsKKwlzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyID0gQ0hBU0hfSVRFUl9JTklU KHRhYmxlLCAwKTsKKwlzdHJ1Y3QgY2hhc2hfaXRlciBjdXIgPSBDSEFTSF9JVEVSX0lOSVQodGFi bGUsIDApOworCisJZG8geworCQlpZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpIHsKKwkJ CUNIQVNIX0lURVJfSU5DKGl0ZXIpOworCQkJY29udGludWU7CisJCX0KKworCQloYXNoID0gY2hh c2hfaXRlcl9oYXNoKGl0ZXIpOworCQlDSEFTSF9JVEVSX1NFVChjdXIsIGhhc2gpOworCQl3aGls ZSAoY3VyLnNsb3QgIT0gaXRlci5zbG90KSB7CisJCQlpZiAoY2hhc2hfaXRlcl9pc19lbXB0eShj dXIpKSB7CisJCQkJcHJfZXJyKCJQYXRoIHRvIGVsZW1lbnQgYXQgJXggd2l0aCBoYXNoICV4IGJy b2tlbiBhdCBzbG90ICV4XG4iLAorCQkJCSAgICAgICBpdGVyLnNsb3QsIGhhc2gsIGN1ci5zbG90 KTsKKwkJCQljaGFzaF90YWJsZV9kdW1wKHRhYmxlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJ CX0KKwkJCUNIQVNIX0lURVJfSU5DKGN1cik7CisJCX0KKworCQlDSEFTSF9JVEVSX0lOQyhpdGVy KTsKKwl9IHdoaWxlIChpdGVyLnNsb3QpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3Rh dGljIHZvaWQgY2hhc2hfaXRlcl9yZWxvY2F0ZShzdHJ1Y3QgY2hhc2hfaXRlciBkc3QsIHN0cnVj dCBjaGFzaF9pdGVyIHNyYykKK3sKKwlCVUdfT04oc3JjLnRhYmxlID09IGRzdC50YWJsZSAmJiBz cmMuc2xvdCA9PSBkc3Quc2xvdCk7CisJQlVHX09OKHNyYy50YWJsZS0+a2V5X3NpemUgIT0gc3Jj LnRhYmxlLT5rZXlfc2l6ZSk7CisJQlVHX09OKHNyYy50YWJsZS0+dmFsdWVfc2l6ZSAhPSBzcmMu dGFibGUtPnZhbHVlX3NpemUpOworCisJaWYgKGRzdC50YWJsZS0+a2V5X3NpemUgPT0gNCkKKwkJ ZHN0LnRhYmxlLT5rZXlzMzJbZHN0LnNsb3RdID0gc3JjLnRhYmxlLT5rZXlzMzJbc3JjLnNsb3Rd OworCWVsc2UKKwkJZHN0LnRhYmxlLT5rZXlzNjRbZHN0LnNsb3RdID0gc3JjLnRhYmxlLT5rZXlz NjRbc3JjLnNsb3RdOworCisJaWYgKGRzdC50YWJsZS0+dmFsdWVfc2l6ZSkKKwkJbWVtY3B5KGNo YXNoX2l0ZXJfdmFsdWUoZHN0KSwgY2hhc2hfaXRlcl92YWx1ZShzcmMpLAorCQkgICAgICAgZHN0 LnRhYmxlLT52YWx1ZV9zaXplKTsKKworCWNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGRzdCk7CisJY2hh c2hfaXRlcl9zZXRfaW52YWxpZChzcmMpOworCisjaWZkZWYgQ0hBU0hfU1RBVFMKKwlpZiAoc3Jj LnRhYmxlID09IGRzdC50YWJsZSkgeworCQlkc3QudGFibGUtPnRvdGFsX3JlbG9jYXRpb25zKys7 CisJCWRzdC50YWJsZS0+dG90YWxfcmVsb2NhdGlvbl9kaXN0YW5jZSArPQorCQkJQ0hBU0hfU1VC KGRzdC50YWJsZSwgc3JjLnNsb3QsIGRzdC5zbG90KTsKKwl9CisjZW5kaWYKK30KKworLyoqCisg KiBfX2NoYXNoX3RhYmxlX2ZpbmQgLSBIZWxwZXIgZm9yIGxvb2tpbmcgdXAgYSBoYXNoIHRhYmxl IGVudHJ5CisgKiBAaXRlcjogUG9pbnRlciB0byBoYXNoIHRhYmxlIGl0ZXJhdG9yCisgKiBAa2V5 OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQKKyAqIEBmb3JfcmVtb3ZhbDogc2V0IHRvIHRydWUg aWYgdGhlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkIHNvb24KKyAqCisgKiBTZWFyY2hlcyBmb3Ig YW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgd2l0aCBhIGdpdmVuIGtleS4gaXRlciBtdXN0Cisg KiBiZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyIHRvIHBvaW50IHRvIHRoZSBob21lIHBvc2l0 aW9uIG9mIHRoZQorICogaHlwb3RoZXRpY2FsIGVudHJ5LCBpLmUuIGl0IG11c3QgYmUgaW5pdGlh bGl6ZWQgd2l0aCB0aGUgaGFzaCB0YWJsZQorICogYW5kIHRoZSBrZXkncyBoYXNoIGFzIHRoZSBp bml0aWFsIHNsb3QgZm9yIHRoZSBzZWFyY2guCisgKgorICogVGhpcyBmdW5jdGlvbiBhbHNvIGRv ZXMgc29tZSBsb2NhbCBjbGVhbi11cCB0byBzcGVlZCB1cCBmdXR1cmUKKyAqIGxvb2stdXBzIGJ5 IHJlbG9jYXRpbmcgZW50cmllcyB0byBiZXR0ZXIgc2xvdHMgYW5kIHJlbW92aW5nCisgKiB0b21i c3RvbmVzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogSWYgQGZvcl9yZW1vdmFs IGlzIHRydWUsIHRoZSBmdW5jdGlvbiBhdm9pZHMgcmVsb2NhdGluZyB0aGUgZW50cnkKKyAqIHRo YXQgaXMgYmVpbmcgcmV0dXJuZWQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBzZWFyY2ggaXMg c3VjY2Vzc2Z1bC4gSW4gdGhpcyBjYXNlIGl0ZXIgaXMgdXBkYXRlZAorICogdG8gcG9pbnQgdG8g dGhlIGZvdW5kIGVudHJ5LiBPdGhlcndpc2UgJS1FSU5WQUwgaXMgcmV0dXJuZWQgYW5kIHRoZQor ICogaXRlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgc2xvdCBm b3IgdGhlIGdpdmVuCisgKiBrZXkuIElmIHRoZSB0YWJsZSBpcyBmdWxsLCB0aGUgc2xvdCBpcyBz ZXQgdG8gLTEuCisgKi8KK3N0YXRpYyBpbnQgY2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgY2hhc2hf aXRlciAqaXRlciwgdTY0IGtleSwKKwkJCSAgICBib29sIGZvcl9yZW1vdmFsKQoreworCXUzMiBo YXNoID0gaXRlci0+c2xvdDsKKwlzdHJ1Y3QgY2hhc2hfaXRlciBmaXJzdF9yZWR1bmRhbnQgPSBD SEFTSF9JVEVSX0lOSVQoaXRlci0+dGFibGUsIC0xKTsKKwlpbnQgZmlyc3RfYXZhaWwgPSAoZm9y X3JlbW92YWwgPyAtMiA6IC0xKTsKKworCXdoaWxlICghY2hhc2hfaXRlcl9pc192YWxpZCgqaXRl cikgfHwgY2hhc2hfaXRlcl9rZXkoKml0ZXIpICE9IGtleSkgeworCQlpZiAoY2hhc2hfaXRlcl9p c19lbXB0eSgqaXRlcikpIHsKKwkJCS8qIEZvdW5kIGFuIGVtcHR5IHNsb3QsIHdoaWNoIGVuZHMg dGhlCisJCQkgKiBzZWFyY2guIENsZWFuIHVwIGFueSBwcmVjZWRpbmcgdG9tYnN0b25lcworCQkJ ICogdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNlIHRoZXkgbGVhZAorCQkJICogdG8g bm8td2hlcmUKKwkJCSAqLworCQkJaWYgKChpbnQpZmlyc3RfcmVkdW5kYW50LnNsb3QgPCAwKQor CQkJCWdvdG8gbm90X2ZvdW5kOworCQkJd2hpbGUgKGZpcnN0X3JlZHVuZGFudC5zbG90ICE9IGl0 ZXItPnNsb3QpIHsKKwkJCQlpZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoZmlyc3RfcmVkdW5kYW50 KSkKKwkJCQkJY2hhc2hfaXRlcl9zZXRfZW1wdHkoZmlyc3RfcmVkdW5kYW50KTsKKwkJCQlDSEFT SF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOworCQkJfQorI2lmZGVmIENIQVNIX0RFQlVHCisJ CQljaGFzaF90YWJsZV9jaGVjayhpdGVyLT50YWJsZSk7CisjZW5kaWYKKwkJCWdvdG8gbm90X2Zv dW5kOworCQl9IGVsc2UgaWYgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKCppdGVyKSkgeworCQkJLyog Rm91bmQgYSB0b21ic3RvbmUuIFJlbWVtYmVyIGl0IGFzIGNhbmRpZGF0ZQorCQkJICogZm9yIHJl bG9jYXRpbmcgdGhlIGVudHJ5IHdlJ3JlIGxvb2tpbmcgZm9yCisJCQkgKiBvciBmb3IgYWRkaW5n IGEgbmV3IGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleQorCQkJICovCisJCQlpZiAoZmlyc3RfYXZh aWwgPT0gLTEpCisJCQkJZmlyc3RfYXZhaWwgPSBpdGVyLT5zbG90OworCQkJLyogT3IgbWFyayBp dCBhcyB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YKKwkJCSAqIHBvdGVudGlhbGx5IHJlZHVuZGFu dCB0b21ic3RvbmVzCisJCQkgKi8KKwkJCWVsc2UgaWYgKGZpcnN0X3JlZHVuZGFudC5zbG90ID09 IC0xKQorCQkJCUNIQVNIX0lURVJfU0VUKGZpcnN0X3JlZHVuZGFudCwgaXRlci0+c2xvdCk7CisJ CX0gZWxzZSBpZiAoZmlyc3RfcmVkdW5kYW50LnNsb3QgPj0gMCkgeworCQkJLyogRm91bmQgYSB2 YWxpZCwgb2NjdXBpZWQgc2xvdCB3aXRoIGEKKwkJCSAqIHByZWNlZGluZyBzZXJpZXMgb2YgdG9t YnN0b25lcy4gUmVsb2NhdGUgaXQKKwkJCSAqIHRvIGEgYmV0dGVyIHBvc2l0aW9uIHRoYXQgbm8g bG9uZ2VyIGRlcGVuZHMKKwkJCSAqIG9uIHRob3NlIHRvbWJzdG9uZXMKKwkJCSAqLworCQkJdTMy IGN1cl9oYXNoID0gY2hhc2hfaXRlcl9oYXNoKCppdGVyKTsKKworCQkJaWYgKCFDSEFTSF9JTl9S QU5HRShpdGVyLT50YWJsZSwgY3VyX2hhc2gsCisJCQkJCSAgICBmaXJzdF9yZWR1bmRhbnQuc2xv dCArIDEsCisJCQkJCSAgICBpdGVyLT5zbG90KSkgeworCQkJCS8qIFRoaXMgZW50cnkgaGFzIGEg aGFzaCBhdCBvciBiZWZvcmUKKwkJCQkgKiB0aGUgZmlyc3QgdG9tYnN0b25lIHdlIGZvdW5kLiBX ZQorCQkJCSAqIGNhbiByZWxvY2F0ZSBpdCB0byB0aGF0IHRvbWJzdG9uZQorCQkJCSAqIGFuZCBh ZHZhbmNlIHRvIHRoZSBuZXh0IHRvbWJzdG9uZQorCQkJCSAqLworCQkJCWNoYXNoX2l0ZXJfcmVs b2NhdGUoZmlyc3RfcmVkdW5kYW50LCAqaXRlcik7CisJCQkJZG8geworCQkJCQlDSEFTSF9JVEVS X0lOQyhmaXJzdF9yZWR1bmRhbnQpOworCQkJCX0gd2hpbGUgKGNoYXNoX2l0ZXJfaXNfdmFsaWQo Zmlyc3RfcmVkdW5kYW50KSk7CisJCQl9IGVsc2UgaWYgKGN1cl9oYXNoICE9IGl0ZXItPnNsb3Qp IHsKKwkJCQkvKiBSZWxvY2F0ZSBlbnRyeSB0byBpdHMgaG9tZSBwb3NpdGlvbgorCQkJCSAqIG9y IGEgY2xvc2UgYXMgcG9zc2libGUgc28gaXQgbm8KKwkJCQkgKiBsb25nZXIgZGVwZW5kcyBvbiBh bnkgcHJlY2VkaW5nCisJCQkJICogdG9tYnN0b25lcworCQkJCSAqLworCQkJCXN0cnVjdCBjaGFz aF9pdGVyIG5ld19pdGVyID0KKwkJCQkJQ0hBU0hfSVRFUl9JTklUKGl0ZXItPnRhYmxlLCBjdXJf aGFzaCk7CisKKwkJCQl3aGlsZSAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90ICYmCisJCQkJ ICAgICAgIGNoYXNoX2l0ZXJfaXNfdmFsaWQobmV3X2l0ZXIpKQorCQkJCQlDSEFTSF9JVEVSX0lO QyhuZXdfaXRlcik7CisKKwkJCQlpZiAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90KQorCQkJ CQljaGFzaF9pdGVyX3JlbG9jYXRlKG5ld19pdGVyLCAqaXRlcik7CisJCQl9CisJCX0KKworCQlD SEFTSF9JVEVSX0lOQygqaXRlcik7CisJCWlmIChpdGVyLT5zbG90ID09IGhhc2gpIHsKKwkJCWl0 ZXItPnNsb3QgPSAtMTsKKwkJCWdvdG8gbm90X2ZvdW5kOworCQl9CisJfQorCisjaWZkZWYgQ0hB U0hfU1RBVFMKKwlpdGVyLT50YWJsZS0+dG90YWxfZmluZF9jYWxscysrOworCWl0ZXItPnRhYmxl LT50b3RhbF9maW5kX3N0ZXBzICs9CisJCUNIQVNIX1NVQihpdGVyLT50YWJsZSwgaXRlci0+c2xv dCwgaGFzaCkgKyAxOworI2VuZGlmCisKKwlpZiAoZmlyc3RfYXZhaWwgPj0gMCkgeworCQlDSEFT SF9JVEVSX1NFVChmaXJzdF9yZWR1bmRhbnQsIGZpcnN0X2F2YWlsKTsKKwkJY2hhc2hfaXRlcl9y ZWxvY2F0ZShmaXJzdF9yZWR1bmRhbnQsICppdGVyKTsKKwkJaXRlci0+c2xvdCA9IGZpcnN0X3Jl ZHVuZGFudC5zbG90OworCQlpdGVyLT5tYXNrID0gZmlyc3RfcmVkdW5kYW50Lm1hc2s7CisJfQor CisJcmV0dXJuIDA7CisKK25vdF9mb3VuZDoKKyNpZmRlZiBDSEFTSF9TVEFUUworCWl0ZXItPnRh YmxlLT50b3RhbF9ub3RfZmluZF9jYWxscysrOworCWl0ZXItPnRhYmxlLT50b3RhbF9ub3RfZmlu ZF9zdGVwcyArPSAoaXRlci0+c2xvdCA8IDApID8KKwkJKDEgPDwgaXRlci0+dGFibGUtPmJpdHMp IDoKKwkJQ0hBU0hfU1VCKGl0ZXItPnRhYmxlLCBpdGVyLT5zbG90LCBoYXNoKSArIDE7CisjZW5k aWYKKwlpZiAoZmlyc3RfYXZhaWwgPj0gMCkKKwkJQ0hBU0hfSVRFUl9TRVQoKml0ZXIsIGZpcnN0 X2F2YWlsKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IF9fY2hhc2hfdGFibGVfY29weV9p bihzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksCisJCQkgIGNvbnN0IHZvaWQg KnZhbHVlKQoreworCXUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWhhc2hf MzIoa2V5LCB0YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJpdHMpOworCXN0cnVj dCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIGhhc2gpOworCWludCBy ID0gY2hhc2hfdGFibGVfZmluZCgmaXRlciwga2V5LCBmYWxzZSk7CisKKwkvKiBGb3VuZCBhbiBl eGlzdGluZyBlbnRyeSAqLworCWlmICghcikgeworCQlpZiAodmFsdWUgJiYgdGFibGUtPnZhbHVl X3NpemUpCisJCQltZW1jcHkoY2hhc2hfaXRlcl92YWx1ZShpdGVyKSwgdmFsdWUsCisJCQkgICAg ICAgdGFibGUtPnZhbHVlX3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJcyB0aGVyZSBh IHBsYWNlIHRvIGFkZCBhIG5ldyBlbnRyeT8gKi8KKwlpZiAoaXRlci5zbG90IDwgMCkgeworCQlw cl9lcnIoIkhhc2ggdGFibGUgb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK KwljaGFzaF9pdGVyX3NldF92YWxpZChpdGVyKTsKKworCWlmICh0YWJsZS0+a2V5X3NpemUgPT0g NCkKKwkJdGFibGUtPmtleXMzMltpdGVyLnNsb3RdID0ga2V5OworCWVsc2UKKwkJdGFibGUtPmtl eXM2NFtpdGVyLnNsb3RdID0ga2V5OworCWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkK KwkJbWVtY3B5KGNoYXNoX2l0ZXJfdmFsdWUoaXRlciksIHZhbHVlLCB0YWJsZS0+dmFsdWVfc2l6 ZSk7CisKKyNpZmRlZiBDSEFTSF9TVEFUUworCXRhYmxlLT50b3RhbF9hZGRfY2FsbHMrKzsKKwl0 YWJsZS0+dG90YWxfYWRkX3N0ZXBzICs9IENIQVNIX1NVQih0YWJsZSwgaXRlci5zbG90LCBoYXNo KSArIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19jaGFzaF90YWJs ZV9jb3B5X2luKTsKKworaW50IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hf dGFibGUgKnRhYmxlLCB1NjQga2V5LAorCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKQor eworCXUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWhhc2hfMzIoa2V5LCB0 YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJpdHMpOworCXN0cnVjdCBjaGFzaF9p dGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIGhhc2gpOworCWludCByID0gY2hhc2hf dGFibGVfZmluZCgmaXRlciwga2V5LCByZW1vdmUpOworCisJaWYgKHIgPCAwKQorCQlyZXR1cm4g cjsKKworCWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkKKwkJbWVtY3B5KHZhbHVlLCBj aGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB0YWJsZS0+dmFsdWVfc2l6ZSk7CisKKwlpZiAocmVtb3Zl KQorCQljaGFzaF9pdGVyX3NldF9pbnZhbGlkKGl0ZXIpOworCisJcmV0dXJuIGl0ZXIuc2xvdDsK K30KK0VYUE9SVF9TWU1CT0woX19jaGFzaF90YWJsZV9jb3B5X291dCk7CisKKyNpZmRlZiBDSEFT SF9TRUxGX1RFU1QKKy8qKgorICogY2hhc2hfc2VsZl90ZXN0IC0gUnVuIGEgc2VsZi10ZXN0IG9m IHRoZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uCisgKiBAYml0czogVGFibGUgc2l6ZSB3aWxs IGJlIDJeYml0cyBlbnRyaWVzCisgKiBAa2V5X3NpemU6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5 dGVzLCA0IG9yIDgKKyAqIEBtaW5fZmlsbDogTWluaW11bSBmaWxsIGxldmVsIGR1cmluZyB0aGUg dGVzdAorICogQG1heF9maWxsOiBNYXhpbXVtIGZpbGwgbGV2ZWwgZHVyaW5nIHRoZSB0ZXN0Cisg KiBAaXRlcmF0aW9uczogTnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucworICoKKyAqIFRoZSB0ZXN0 IGFkZHMgYW5kIHJlbW92ZXMgZW50cmllcyBmcm9tIGEgaGFzaCB0YWJsZSwgY3ljbGluZyB0aGUK KyAqIGZpbGwgbGV2ZWwgYmV0d2VlbiBtaW5fZmlsbCBhbmQgbWF4X2ZpbGwgZW50cmllcy4gQWxz byB0ZXN0cyBsb29rdXAKKyAqIGFuZCB2YWx1ZSByZXRyaWV2YWwuCisgKi8KK2ludCBjaGFzaF9z ZWxmX3Rlc3QodTggYml0cywgdTgga2V5X3NpemUsIGludCBtaW5fZmlsbCwgaW50IG1heF9maWxs LAorCQkgICAgdTY0IGl0ZXJhdGlvbnMpCit7CisJc3RydWN0IGNoYXNoX3RhYmxlIHRhYmxlOwor CWludCByZXQ7CisJdTY0IGFkZF9jb3VudCwgcm12X2NvdW50OworCXU2NCB2YWx1ZTsKKworCWlm IChrZXlfc2l6ZSA9PSA0ICYmIGl0ZXJhdGlvbnMgPiAweGZmZmZmZmZmKQorCQlyZXR1cm4gLUVJ TlZBTDsKKwlpZiAobWluX2ZpbGwgPj0gbWF4X2ZpbGwpCisJCXJldHVybiAtRUlOVkFMOworCisJ cmV0ID0gY2hhc2hfdGFibGVfYWxsb2MoJnRhYmxlLCBiaXRzLCBrZXlfc2l6ZSwgc2l6ZW9mKHU2 NCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImNoYXNoX3RhYmxl X2FsbG9jIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChh ZGRfY291bnQgPSAwLCBybXZfY291bnQgPSAwOyBhZGRfY291bnQgPCBpdGVyYXRpb25zOworCSAg ICAgYWRkX2NvdW50KyspIHsKKwkJLyogV2hlbiB3ZSBoaXQgdGhlIG1heF9maWxsIGxldmVsLCBy ZW1vdmUgZW50cmllcyBkb3duCisJCSAqIHRvIG1pbl9maWxsICovCisJCWlmIChhZGRfY291bnQg LSBybXZfY291bnQgPT0gbWF4X2ZpbGwpIHsKKwkJCXU2NCBmaW5kX2NvdW50ID0gcm12X2NvdW50 OworCisJCQkvKiBGaXJzdCB0cnkgdG8gZmluZCBhbGwgZW50cmllcyB0aGF0IHdlJ3JlCisJCQkg KiBhYm91dCB0byByZW1vdmUsIGNvbmZpcm0gdGhlaXIgdmFsdWUsIHRlc3QKKwkJCSAqIHdyaXRp bmcgdGhlbSBiYWNrIGEgc2Vjb25kIHRpbWUuICovCisJCQlmb3IgKDsgYWRkX2NvdW50IC0gZmlu ZF9jb3VudCA+IG1pbl9maWxsOworCQkJICAgICBmaW5kX2NvdW50KyspIHsKKwkJCQlyZXQgPSBj aGFzaF90YWJsZV9jb3B5X291dCgmdGFibGUsIGZpbmRfY291bnQsCisJCQkJCQkJICAgJnZhbHVl KTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlwcl9lcnIoImNoYXNoX3RhYmxlX2NvcHlfb3V0 IGZhaWxlZDogJWRcbiIsCisJCQkJCSAgICAgICByZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9 CisJCQkJaWYgKHZhbHVlICE9IH5maW5kX2NvdW50KSB7CisJCQkJCXByX2VycigiV3JvbmcgdmFs dWUgcmV0cmlldmVkIGZvciBrZXkgMHglbGx4LCBleHBlY3RlZCAweCVsbHggZ290IDB4JWxseFxu IiwKKwkJCQkJICAgICAgIGZpbmRfY291bnQsIH5maW5kX2NvdW50LCB2YWx1ZSk7CisjaWZkZWYg Q0hBU0hfREVCVUcKKwkJCQkJY2hhc2hfdGFibGVfZHVtcCgmdGFibGUudGFibGUpOworI2VuZGlm CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlyZXQgPSBj aGFzaF90YWJsZV9jb3B5X2luKCZ0YWJsZSwgZmluZF9jb3VudCwKKwkJCQkJCQkgICZ2YWx1ZSk7 CisJCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJCXByX2VycigiY29weV9pbiBzZWNvbmQgdGltZSBy ZXR1cm5lZCAlZCwgZXhwZWN0ZWQgMVxuIiwKKwkJCQkJICAgICAgIHJldCk7CisJCQkJCXJldCA9 IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJCS8qIFJlbW92ZSB0aGVt IHVudGlsIHdlIGhpdCBtaW5fZmlsbCBsZXZlbCAqLworCQkJZm9yICg7IGFkZF9jb3VudCAtIHJt dl9jb3VudCA+IG1pbl9maWxsOyBybXZfY291bnQrKykgeworCQkJCXJldCA9IGNoYXNoX3RhYmxl X3JlbW92ZSgmdGFibGUsIHJtdl9jb3VudCwgTlVMTCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJ CQkJcHJfZXJyKCJjaGFzaF90YWJsZV9yZW1vdmUgZmFpbGVkOiAlZFxuIiwKKwkJCQkJICAgICAg IHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEFkZCBhIG5l dyB2YWx1ZSAqLworCQl2YWx1ZSA9IH5hZGRfY291bnQ7CisJCXJldCA9IGNoYXNoX3RhYmxlX2Nv cHlfaW4oJnRhYmxlLCBhZGRfY291bnQsICZ2YWx1ZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJ cHJfZXJyKCJjb3B5X2luIGZpcnN0IHRpbWUgcmV0dXJuZWQgJWQsIGV4cGVjdGVkIDBcbiIsCisJ CQkgICAgICAgcmV0KTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0K KworI2lmZGVmIENIQVNIX1NUQVRTCisJY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmdGFibGUpOwor I2VuZGlmCisKK291dDoKKwljaGFzaF90YWJsZV9mcmVlKCZ0YWJsZSk7CisJcmV0dXJuIHJldDsK K30KK0VYUE9SVF9TWU1CT0woY2hhc2hfc2VsZl90ZXN0KTsKKworI2VuZGlmIC8qIENIQVNIX1NF TEZfVEVTVCAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNsb3NlZCBoYXNoIHRhYmxlIik7CitN T0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwotLSAKMi43LjQKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmFtZC1nZnggbWFp bGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=