From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by sourceware.org (Postfix) with ESMTPS id E2D2A3858017 for ; Thu, 22 Sep 2022 12:36:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E2D2A3858017 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ed1-x531.google.com with SMTP id q21so13370729edc.9 for ; Thu, 22 Sep 2022 05:36:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=fD3AbModXpcV2kAyIqqrULC2kqtGX6joevkZNw687+U=; b=U2NLGCvwnS3cXnJQc0criKgQ4HLY+kDyugQswQxuN7Uhm1Ia8k7HeI7nYqKVqmyrXa 9YYN04rEJGs77b7HG2IMMfXbFF2c8Uc8C8vs23wtXicoZ0tj9SGVExxFHR6MhOnB54wF JN3skp7xD5KvjNzJcNbCcz8l58D/FGxPKP3pDxo5mxjz54lRzRWnv4Y36rCXblih1lAf GCHwxjGr67ot47/6PlXS92RvkjQfVT5akUEbMu9QRDX4lyYNV2OzfXB8q3NKaZmsdXrR LEPowi401pfALmJA+b7lI/nFpXZxcEU8hnJprizp+EkBWu1JLLSchmKq0py8iwnL+FWH smzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=fD3AbModXpcV2kAyIqqrULC2kqtGX6joevkZNw687+U=; b=VKr0xW5QWcOkJKhWK9Oxk+O9IUZyKTm/MLHK8GWzad52m3BYPFdItP0x63xARwS1wK LJIDnsNzzyWns35j+i6zgnTJaI9LpGIp9PVZ5WsUoLFWNZLLWvztTgOXT1Dk4EmrSOkS JQYhVL7wj6jMBBX9ERmO4xj/BiP/8xwDHqOwO1d0o5tihpX5NzR4gQJ1/H5p5K3eqln2 DpK6MAb5UddsidzGu/QHCLXHZ3cF8X09+jQSkvnmLzyALSfebVojN/zPkhJ31uyGdIpB YvodbQwZI7OzKAOSXmZNJUn9v5vjOuTUFYAn9eCQHVxopynOij9pkgt0dTJMO0fdIUrM 6l3g== X-Gm-Message-State: ACrzQf1iyAsfy8XtrfEZdXDqXAB+qIMQJJNfk0M+5dRDSZ51jzIbqEEd nugZOAOz0orcRG8ELJk8k98VjYGPF/bFYHWwKSrGNASr X-Google-Smtp-Source: AMsMyM7JcyscLARWeiZkEu0DLKROsc8s4VIrG3iLz3X1B0V4xQKQpYo0Sg9no3gNfad0aazmOQ8czRWcWZDn9zyxG6A= X-Received: by 2002:a05:6402:11cd:b0:452:199e:7cf6 with SMTP id j13-20020a05640211cd00b00452199e7cf6mr3156622edw.366.1663850205565; Thu, 22 Sep 2022 05:36:45 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Richard Biener Date: Thu, 22 Sep 2022 14:36:33 +0200 Message-ID: Subject: Re: PING^2: [PATCH v5] tree-optimization/101186 - extend FRE with "equivalence map" for condition prediction To: Di Zhao OS Cc: "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary="0000000000007675bc05e94350b4" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --0000000000007675bc05e94350b4 Content-Type: text/plain; charset="UTF-8" On Thu, Sep 22, 2022 at 2:34 PM Richard Biener wrote: > > On Wed, Sep 7, 2022 at 9:30 AM Di Zhao OS wrote: > > > > Gentle ping again. > > So I got the chance to review the change again on the travel to GNU > Cauldron 2022. > > There's quite some factoring / moving of stuff in the patch. I've > already pushed to trunk > a change that factores out can_track_predicate_on_edge (your vn_tracking_edge), > factoring out is_vn_valid_at_bb also looks useful, so I'll followup > with a similar change. > > I'm going to attach a commented quoted patch (because that's what I > produced during > the travel). An overall comment (also in that attachment) would be > > "why are equivalences recorded in the expression hash table at all? Are > they not predicated values of an SSA name and thus should be a > vn_pval chain in vn_ssa_aux itself? > > conditional equivalences are expensive to handle (so are the existing > predicated values which I do not like too much and which, frankly, I've > probably designed too general - ATM we only ever insert predicated > values 'true' and 'false' which could be used to simplify a lot of logic > but would break this patch?) > > At some point I wanted to see whether we can use ranger relations > for all of this. > > Then, for "true" equivalence tracking it might be interesting to explore > "path value numbering", aka allow revisiting code from the equivalence > op defs to the equivalence producing edge(s) with the equivalence fully > reflected in the value number. The interesting thing might be that we > can track whether there's any equivalence on the side and based on > use heuristic decide whether that's going to pay off. It might be also > possible to re-use this to improve jump threading costing. If we'd be > able to "fork" the VN state we could re-run from the later definition > of an equivalence to the point it is established. > > So, overall I wasn't able to get at what this patch will catch and what > it will not catch - that is, to what extent equivalences affect > previously and future recorded expressions. Plus the implementation > feels like it bolts on the wrong place. > > As I'm not happy with my predicated values implementation either I'm > of course a bit biased here (note the implementation was mostly added > to avoid regressions with respect to the previous VN implementation > and I should probably make it less general and more optimized - but > as said, using ranger might be an option here). > > You have one testcase, ssa-fre-102.c, that seems to require VN > with equivalences, the others should be catched by rangers relation > handling, no?" > > I've looked into using ranger for what the existing predicated value > handling does, plus catch more cases transparently. I'm not sure > rangers equivalences handling is a good fit so to handle those an > approach like yours might be necessary. Note I'm not really happy > about the patch as-is (nor I am happy about what I implemented > with predicated values - sorry for that). I'm not even sure equivalences > can be handled "nicely" :/ Meh, I said I would attach something. Here it is. Richard. --0000000000007675bc05e94350b4 Content-Type: application/octet-stream; name=review Content-Disposition: attachment; filename=review Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l8d1fyv40 PiBkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvcHI4MzU0MS5DIGIvZ2NjL3Rlc3Rz dWl0ZS9nKysuZGcvcHI4MzU0MS5DCj4gaW5kZXggZjViMTgxZTA2NGEuLmM5YTU1MGE2ZDA4IDEw MDY0NAo+IC0tLSBhL2djYy90ZXN0c3VpdGUvZysrLmRnL3ByODM1NDEuQwo+ICsrKyBiL2djYy90 ZXN0c3VpdGUvZysrLmRnL3ByODM1NDEuQwo+IEBAIC0xLDYgKzEsNiBAQAo+ICAvLyBQUiB0cmVl LW9wdGltaXphdGlvbi84MzU0MQo+ICAvLyB7IGRnLWRvIGNvbXBpbGUgfQo+IC0vLyB7IGRnLW9w dGlvbnMgIi1PMyAtc3RkPWMrKzE3IC1mZmFzdC1tYXRoIC1mZHVtcC10cmVlLWV2cnAiICB9Cj4g Ky8vIHsgZGctb3B0aW9ucyAiLU8zIC1mbm8tdHJlZS1mcmUgLXN0ZD1jKysxNyAtZmZhc3QtbWF0 aCAtZmR1bXAtdHJlZS1ldnJwIiAgfQo+ICAKPiAgI2luY2x1ZGUgPGxpbWl0cz4KPiAgCj4gZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNjg2MTktMi5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHI2ODYxOS0yLmMKPiBpbmRleCBjY2E3MDZlMGM0 Zi4uMGE5OWMzYzYyMGUgMTAwNjQ0Cj4gLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvcHI2ODYxOS0yLmMKPiArKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjY4 NjE5LTIuYwo+IEBAIC0xLDUgKzEsNSBAQAo+ICAvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwo+IC0v KiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS1kb20yLWRldGFpbHMgLXciIH0gKi8KPiAr LyogeyBkZy1vcHRpb25zICItTzIgLWZuby10cmVlLWZyZSAtZmR1bXAtdHJlZS1kb20yLWRldGFp bHMgLXciIH0gKi8KPiAgCj4gIHR5cGVkZWYgdW5pb24gdHJlZV9ub2RlICp0cmVlOwo+ICBzdHJ1 Y3QgZ2NjX29wdGlvbnMKPiBkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvcHI3MTk0Ny0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTEu Ywo+IGluZGV4IGFjODI3MWNjNTc0Li5lOWE3OTdlODJiMCAxMDA2NDQKPiAtLS0gYS9nY2MvdGVz dHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTEuYwo+ICsrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctMS5jCj4gQEAgLTEsNSArMSw1IEBACj4gIC8qIHsgZGct ZG8gY29tcGlsZSB9ICovIAo+IC0vKiB7IGRnLW9wdGlvbnMgIi1PMiAtZm5vLXRyZWUtdnJwIC1m ZHVtcC10cmVlLWRvbS1kZXRhaWxzIiB9ICovCj4gKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mbm8t dHJlZS12cnAgLWZuby10cmVlLWZyZSAtZmR1bXAtdHJlZS1kb20tZGV0YWlscyIgfSAqLwo+ICAK PiAgCj4gIGludCBmKGludCB4LCBpbnQgeSkKPiBkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdHJlZS1zc2EvcHI3MTk0Ny0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNz YS9wcjcxOTQ3LTIuYwo+IGluZGV4IGIyYzA5Y2JiMDIxLi5iY2JjNDE5NTc1YyAxMDA2NDQKPiAt LS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTIuYwo+ICsrKyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctMi5jCj4gQEAgLTEsNSArMSw1IEBA Cj4gIC8qIHsgZGctZG8gY29tcGlsZSB9ICovCj4gLS8qIHsgZGctb3B0aW9ucyAiLU8yIC1mbm8t dHJlZS12cnAgLWZkdW1wLXRyZWUtZG9tLWRldGFpbHMiIH0gKi8KPiArLyogeyBkZy1vcHRpb25z ICItTzIgLWZuby10cmVlLXZycCAtZm5vLXRyZWUtZnJlIC1mZHVtcC10cmVlLWRvbS1kZXRhaWxz IiB9ICovCj4gIAo+ICAKPiAgaW50IGYoaW50IHgsIGludCB5KQo+IGRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTMuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL3ByNzE5NDctMy5jCj4gaW5kZXggMjMxNmY3ZTFjMDQuLmQ2MzI5MWRhNDQw IDEwMDY0NAo+IC0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctMy5j Cj4gKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHI3MTk0Ny0zLmMKPiBAQCAt MSw1ICsxLDUgQEAKPiAgLyogeyBkZy1kbyBjb21waWxlIH0gKi8KPiAtLyogeyBkZy1vcHRpb25z ICItTzIgLWZuby10cmVlLXZycCAtZmR1bXAtdHJlZS1kb20tZGV0YWlscyIgfSAqLwo+ICsvKiB7 IGRnLW9wdGlvbnMgIi1PMiAtZm5vLXRyZWUtdnJwIC1mbm8tdHJlZS1mcmUgLWZkdW1wLXRyZWUt ZG9tLWRldGFpbHMiIH0gKi8KPiAgCj4gIGludCBmKGludCB4LCBpbnQgeSkKPiAgewo+IGRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTUuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctNS5jCj4gaW5kZXggZTcwMzhkMDIzN2Yu LmMxZTU2NjdiNDVhIDEwMDY0NAo+IC0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3Nh L3ByNzE5NDctNS5jCj4gKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHI3MTk0 Ny01LmMKPiBAQCAtMSw1ICsxLDUgQEAKPiAgLyogeyBkZy1kbyBjb21waWxlIH0gKi8KPiAtLyog eyBkZy1vcHRpb25zICItTzIgLWZuby10cmVlLXZycCAtZmR1bXAtdHJlZS1kb20tZGV0YWlscyIg fSAqLwo+ICsvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZm5vLXRyZWUtdnJwIC1mbm8tdHJlZS1mcmUg LWZkdW1wLXRyZWUtZG9tLWRldGFpbHMiIH0gKi8KPiAgCj4gIAo+ICBzdGF0aWMgaW5saW5lIGxv bmcgbG9hZChsb25nICpwKQo+IGRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVl LXNzYS9wcjcxOTQ3LTcuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDct Ny5jCj4gaW5kZXggYjQ0YzA2NGFhMjMuLjA2OWU0YTEwNmMzIDEwMDY0NAo+IC0tLSBhL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctNy5jCj4gKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvdHJlZS1zc2EvcHI3MTk0Ny03LmMKPiBAQCAtMSw1ICsxLDUgQEAKPiAgLyogeyBk Zy1kbyBjb21waWxlIH0gKi8KPiAtLyogeyBkZy1vcHRpb25zICItTzIgLWZuby10cmVlLXZycCAt ZmR1bXAtdHJlZS1kb20tZGV0YWlscyIgfSAqLwo+ICsvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZm5v LXRyZWUtdnJwIC1mbm8tdHJlZS1mcmUgLWZkdW1wLXRyZWUtZG9tLWRldGFpbHMiIH0gKi8KPiAg Cj4gIAo+ICBpbnQgZihpbnQgeCwgaW50IHkpCj4gZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctOC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvcHI3MTk0Ny04LmMKPiBpbmRleCAyNmU1YWJiZGMyOS4uMjZiMzAzZTg5NmUgMTAwNjQ0Cj4g LS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHI3MTk0Ny04LmMKPiArKysgYi9n Y2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTguYwo+IEBAIC0xLDUgKzEsNSBA QAo+ICAvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwo+IC0vKiB7IGRnLW9wdGlvbnMgIi1PMiAtZm5v LXRyZWUtdnJwIC1mZHVtcC10cmVlLWRvbS1kZXRhaWxzIiB9ICovCj4gKy8qIHsgZGctb3B0aW9u cyAiLU8yIC1mbm8tdHJlZS12cnAgLWZuby10cmVlLWZyZSAtZmR1bXAtdHJlZS1kb20tZGV0YWls cyIgfSAqLwo+ICAKPiAgCj4gIGludCBmKGludCB4LCBpbnQgeSkKPiBkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHI3MTk0Ny05LmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy90cmVlLXNzYS9wcjcxOTQ3LTkuYwo+IGluZGV4IDIyYjY4ZDVlZGUwLi4zZWQzYmY2YWQy OSAxMDA2NDQKPiAtLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjcxOTQ3LTku Ywo+ICsrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByNzE5NDctOS5jCj4gQEAg LTEsNSArMSw1IEBACj4gIC8qIHsgZGctZG8gY29tcGlsZSB9ICovCj4gLS8qIHsgZGctb3B0aW9u cyAiLU8yIC1mbm8tdHJlZS12cnAgLWZkdW1wLXRyZWUtZG9tLWRldGFpbHMiIH0gKi8KPiArLyog eyBkZy1vcHRpb25zICItTzIgLWZuby10cmVlLXZycCAtZm5vLXRyZWUtZnJlIC1mZHVtcC10cmVl LWRvbS1kZXRhaWxzIiB9ICovCj4gIAo+ICAKPiAgaW50IGYoaW50IHgsIGludCB5KQo+IGRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS92cnAwMy5jIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwMDMuYwo+IGluZGV4IDRjYmFjYTQxMzMyLi42OWI4M2I2 Y2MzMCAxMDA2NDQKPiAtLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS92cnAwMy5j Cj4gKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwMDMuYwo+IEBAIC0xLDUg KzEsNSBAQAo+ICAvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwo+IC0vKiB7IGRnLW9wdGlvbnMgIi1P MiAtZmRpc2FibGUtdHJlZS1ldnJwIC1mZHVtcC10cmVlLXZycDEgLWZuby10aHJlYWQtanVtcHMi IH0gKi8KPiArLyogeyBkZy1vcHRpb25zICItTzIgLWZkaXNhYmxlLXRyZWUtZXZycCAtZmR1bXAt dHJlZS12cnAxIC1mbm8tdGhyZWFkLWp1bXBzIC1mbm8tdHJlZS1mcmUiIH0gKi8KPiAgCj4gIHN0 cnVjdCBBCj4gIHsKPiBkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtc3NhLXNjY3ZuLmNjIGIvZ2NjL3Ry ZWUtc3NhLXNjY3ZuLmNjCj4gaW5kZXggNzRiOGQ4ZDE4ZWYuLjg2YTQ3OThhZjk0IDEwMDY0NAo+ IC0tLSBhL2djYy90cmVlLXNzYS1zY2N2bi5jYwo+ICsrKyBiL2djYy90cmVlLXNzYS1zY2N2bi5j Ywo+IEBAIC0zNTUsNiArMzU1LDggQEAgc3RhdGljIHZuX3JlZmVyZW5jZV90IGxhc3RfaW5zZXJ0 ZWRfcmVmOwo+ICBzdGF0aWMgdm5fcGhpX3QgbGFzdF9pbnNlcnRlZF9waGk7Cj4gIHN0YXRpYyB2 bl9uYXJ5X29wX3QgbGFzdF9pbnNlcnRlZF9uYXJ5Owo+ICBzdGF0aWMgdm5fc3NhX2F1eF90IGxh c3RfcHVzaGVkX2F2YWlsOwo+ICtzdGF0aWMgdm5fc3NhX2F1eF90IGxhc3RfcHVzaGVkX25hcnlf cmVmOwo+ICtzdGF0aWMgbmFyeV9yZWYqIG5hcnlfcmVmX2ZyZWVsaXN0Owo+ICAKPiAgLyogVmFs aWQgaGFzaHRhYmxlcyBzdG9yaW5nIGluZm9ybWF0aW9uIHdlIGhhdmUgcHJvdmVuIHRvIGJlCj4g ICAgIGNvcnJlY3QuICAqLwo+IEBAIC00OTAsOSArNDkyLDkgQEAgVk5fSU5GTyAodHJlZSBuYW1l KQo+ICAJICAgIG5hcnktPnByZWRpY2F0ZWRfdmFsdWVzID0gMDsKPiAgCSAgICBuYXJ5LT51LnJl c3VsdCA9IGJvb2xlYW5fdHJ1ZV9ub2RlOwo+ICAJICAgIHZuX25hcnlfb3BfaW5zZXJ0X2ludG8g KG5hcnksIHZhbGlkX2luZm8tPm5hcnkpOwo+IC0JICAgIGdjY19hc3NlcnQgKG5hcnktPnVud2lu ZF90byA9PSBOVUxMKTsKCndoeSdzIHRoYXQ/ICBkb2Vzbid0IHRoaXMgbWVhbiB1bndpbmRpbmcg d2lsbCBiZSBicm9rZW4/Cgo+ICAJICAgIC8qIEFsc28gZG8gbm90IGxpbmsgaXQgaW50byB0aGUg dW5kbyBjaGFpbi4gICovCj4gIAkgICAgbGFzdF9pbnNlcnRlZF9uYXJ5ID0gbmFyeS0+bmV4dDsK PiArCSAgICAvKiBUaGVyZSBjb3VsZCBiZSBhIHByZWRpY2F0ZSBhbHJlYWR5LiAgKi8KPiAgCSAg ICBuYXJ5LT5uZXh0ID0gKHZuX25hcnlfb3BfdCkodm9pZCAqKS0xOwo+ICAJICAgIG5hcnkgPSBh bGxvY192bl9uYXJ5X29wX25vaW5pdCAoMiwgJnZuX3RhYmxlc19pbnNlcnRfb2JzdGFjayk7Cj4g IAkgICAgaW5pdF92bl9uYXJ5X29wX2Zyb21fcGllY2VzIChuYXJ5LCAyLCBFUV9FWFBSLAo+IEBA IC01MDAsNyArNTAyLDYgQEAgVk5fSU5GTyAodHJlZSBuYW1lKQo+ICAJICAgIG5hcnktPnByZWRp Y2F0ZWRfdmFsdWVzID0gMDsKPiAgCSAgICBuYXJ5LT51LnJlc3VsdCA9IGJvb2xlYW5fZmFsc2Vf bm9kZTsKPiAgCSAgICB2bl9uYXJ5X29wX2luc2VydF9pbnRvIChuYXJ5LCB2YWxpZF9pbmZvLT5u YXJ5KTsKPiAtCSAgICBnY2NfYXNzZXJ0IChuYXJ5LT51bndpbmRfdG8gPT0gTlVMTCk7Cj4gIAkg ICAgbGFzdF9pbnNlcnRlZF9uYXJ5ID0gbmFyeS0+bmV4dDsKPiAgCSAgICBuYXJ5LT5uZXh0ID0g KHZuX25hcnlfb3BfdCkodm9pZCAqKS0xOwo+ICAJICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCj4gQEAgLTQwOTMsNiArNDA5NCwxMjEgQEAgdm5fcmVmZXJl bmNlX2luc2VydF9waWVjZXMgKHRyZWUgdnVzZSwgYWxpYXNfc2V0X3R5cGUgc2V0LAo+ICAgIHJl dHVybiB2cjE7Cj4gIH0KPiAgCj4gK3N0YXRpYyBib29sCj4gK2RvbWluYXRlZF9ieV9wX3dfdW5l eCAoYmFzaWNfYmxvY2sgYmIxLCBiYXNpY19ibG9jayBiYjIsIGJvb2wpOwo+ICsKPiArc3RhdGlj IHRyZWUKPiArdm5fbmFyeV9vcF9nZXRfcHJlZGljYXRlZF92YWx1ZSAodm5fbmFyeV9vcF90IHZu bywgYmFzaWNfYmxvY2sgYmIpCj4gK3sKPiArICBpZiAoISB2bm8tPnByZWRpY2F0ZWRfdmFsdWVz KQo+ICsgICAgcmV0dXJuIHZuby0+dS5yZXN1bHQ7Cj4gKyAgZm9yICh2bl9wdmFsICp2YWwgPSB2 bm8tPnUudmFsdWVzOyB2YWw7IHZhbCA9IHZhbC0+bmV4dCkKPiArICAgIGZvciAodW5zaWduZWQg aSA9IDA7IGkgPCB2YWwtPm47ICsraSkKPiArICAgICAgewo+ICsJLyogRG8gbm90IGhhbmRsZSBi YWNrZWRnZSBleGVjdXRhYmlsaXR5IG9wdGltaXN0aWNhbGx5IHNpbmNlCj4gKwkgd2hlbiBmaWd1 cmluZyBvdXQgd2hldGhlciB0byBpdGVyYXRlIHdlIGRvIG5vdCBjb25zaWRlcgo+ICsJIGNoYW5n ZWQgcHJlZGljYXRpb24uICAqLwo+ICsJaWYgKGRvbWluYXRlZF9ieV9wX3dfdW5leCAoCj4gKwkg ICAgICBiYiwgQkFTSUNfQkxPQ0tfRk9SX0ZOIChjZnVuLCB2YWwtPnZhbGlkX2RvbWluYXRlZF9i eV9wW2ldKSwKPiArCSAgICAgIGZhbHNlKSkKPiArCXJldHVybiB2YWwtPnJlc3VsdDsKPiArICAg ICAgfQo+ICsgIHJldHVybiBOVUxMX1RSRUU7Cj4gK30KPiArCj4gKy8qIFdoZXRoZXIgYSBwcmVk aWNhdGVkIHZhbHVlIFZBTCBpcyB2YWxpZCBhdCBCQi4gICovCj4gKwo+ICtzdGF0aWMgaW5saW5l IGJvb2wKPiAraXNfdm5fdmFsaWRfYXRfYmIgKHZuX3B2YWwgKnZhbCwgYmFzaWNfYmxvY2sgYmIp Cj4gK3sKPiArICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsLT5uOyArK2kpCj4gKyAgICB7 Cj4gKyAgICAgIGJhc2ljX2Jsb2NrIHZhbF9iYgo+ICsJPSBCQVNJQ19CTE9DS19GT1JfRk4gKGNm dW4sIHZhbC0+dmFsaWRfZG9taW5hdGVkX2J5X3BbaV0pOwo+ICsgICAgICBpZiAoZG9taW5hdGVk X2J5X3Bfd191bmV4IChiYiwgdmFsX2JiLCBmYWxzZSkpCj4gKwlyZXR1cm4gdHJ1ZTsKPiArICAg IH0KPiArICByZXR1cm4gZmFsc2U7Cj4gK30KClBsZWFzZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiB2 bl9uYXJ5X29wX2dldF9wcmVkaWNhdGVkX3ZhbHVlCgo+ICsKPiArLyogTG9va3VwIHRoZSB2YXJp YWJsZSB0aGF0IHJlcHJlc2VudHMgYSBzZXQgb2YgZXF1aXZhbGVuY2VzIG9mIE5BTUUgYXQKPiAr ICAgYmFzaWMtYmxvY2sgQkIuICBUaGlzIHZhcmlhYmxlIGlzIGNhbGxlZCB0aGUgImVxdWl2YWxl bmNlIGhlYWQiIG9mIE5BTUUuICAqLwo+ICsKPiArc3RhdGljIHRyZWUKPiArbG9va3VwX2VxdWl2 X2hlYWQgKHRyZWUgbmFtZSwgYmFzaWNfYmxvY2sgYmIpCj4gK3sKPiArICBpZiAoVFJFRV9DT0RF IChuYW1lKSAhPSBTU0FfTkFNRSkKPiArICAgIHJldHVybiBuYW1lOwo+ICsgIHRyZWUgcmVzdWx0 ID0gVk5fSU5GTyAobmFtZSktPnZhbG51bTsKPiArICBpZiAocmVzdWx0ID09IFZOX1RPUCkKPiAr ICAgIC8qIFZOX1RPUCBpcyBub3QgYWxsb3dlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdG9vIG9w dGltaXN0aWMgZm9yCj4gKyAgICAgICBub24taXRlcmF0aW5nIG1vZGUuICAqLwo+ICsgICAgcmV0 dXJuIG5hbWU7Cj4gKwo+ICsgIC8qIEZvbGRpbmcgZXhwcmVzc2lvbnMgZnJvbSBlcXVpdmFsZW5j ZXMgY2FuIGdlbmVyYXRlIGluY29ycmVjdCB2YWx1ZXMuCj4gKyAgICAgRm9yIGV4Y2FtcGxlLCBv cGVyYXRpb25zIG9uIDAuMCBhbmQgLTAuMC4gU28gZm9yIGZsb2F0aW5nLXBvaW50IHZhbHVlcywK PiArICAgICBlcXVpdmFsZW5jZXMgYXJlIG5vdCB1c2VkLiAgKi8KPiArICBpZiAoRkxPQVRfVFlQ RV9QIChUUkVFX1RZUEUgKG5hbWUpKSkKPiArICAgIHJldHVybiByZXN1bHQ7Cj4gKwo+ICsgIHZu X25hcnlfb3BfdCB2bnJlc3VsdDsKPiArICAvKiBBcyB3ZSBpbnNlcnQgbmV3IHZhbHVlIGF0IGZy b250IGluIHZuX25hcnlfb3BfaW5zZXJ0X2ludG8sIHdlIGRvbid0IG5lZWQKPiArICAgICBzZWFy Y2ggaXRlcmF0aXZlbHkgZm9yIHRoZSBtb3N0IGdlbmVyYWwgZXF1aXYtaGVhZC4gICovCj4gKyAg dm5fbmFyeV9vcF9sb29rdXBfcGllY2VzICgxLCBOT1BfRVhQUiwgVFJFRV9UWVBFIChyZXN1bHQp LCAmcmVzdWx0LAo+ICsJCQkgICAgJnZucmVzdWx0KTsKPiArICBpZiAodm5yZXN1bHQgJiYgdm5y ZXN1bHQtPnByZWRpY2F0ZWRfdmFsdWVzKQo+ICsgICAgewo+ICsgICAgICB0cmVlIGVxID0gdm5f bmFyeV9vcF9nZXRfcHJlZGljYXRlZF92YWx1ZSAodm5yZXN1bHQsIGJiKTsKPiArICAgICAgaWYg KGVxKQo+ICsJcmV0dXJuIGVxOwo+ICsgICAgfQo+ICsgIHJldHVybiByZXN1bHQ7Cj4gK30KPiAr Cj4gKy8qIExvb2t1cCB0aGUgImVxdWl2YWxlbmNlIGhlYWQicyBvZiBPUFMgYXQgQkIsIGFuZCBz dG9yZSB0aGVtIGluIFRPLiAgTiBpcyB0aGUKPiArICAgc2l6ZSBvZiBPUFMuICAqLwo+ICsKPiAr c3RhdGljIHZvaWQKPiArbG9va3VwX2VxdWl2X2hlYWRzICh1bnNpZ25lZCBuLCB0cmVlICpvcHMs IHRyZWUgKnRvLCBiYXNpY19ibG9jayBiYikKPiArewo+ICsgIGZvciAodW5zaWduZWQgaSA9IDA7 IGkgPCBuOyBpKyspCj4gKyAgICB7Cj4gKyAgICAgIHRyZWUgZXF1aXZfaGVhZCA9IGxvb2t1cF9l cXVpdl9oZWFkIChvcHNbaV0sIGJiKTsKPiArICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSAmJiBlcXVpdl9oZWFkICE9IG9wc1tpXSkKPiArCXsKPiArCSAg ZnByaW50ZiAoZHVtcF9maWxlLCAiVXNlIGVxdWl2LWhlYWQgIik7Cj4gKwkgIHByaW50X2dlbmVy aWNfZXhwciAoZHVtcF9maWxlLCBlcXVpdl9oZWFkLCBUREZfTk9ORSk7Cj4gKwkgIGZwcmludGYg KGR1bXBfZmlsZSwgIiBmb3IgIik7Cj4gKwkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxl LCBvcHNbaV0sIFRERl9OT05FKTsKPiArCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKPiAr CX0KPiArICAgICAgdG9baV0gPSBlcXVpdl9oZWFkOwo+ICsgICAgfQo+ICt9Cj4gKwo+ICsvKiBS ZXR1cm5zIHdoZXRoZXIgZWRnZSBQUkVEX0UgaXMgY3VycmVudGx5IGJlaW5nIHRyYWNrZWQuICAq Lwo+ICsKPiArc3RhdGljIGlubGluZSBib29sCj4gK3ZuX3RyYWNraW5nX2VkZ2UgKGVkZ2UgcHJl ZF9lKQo+ICt7Cj4gKyAgaWYgKCFzaW5nbGVfcHJlZF9wIChwcmVkX2UtPmRlc3QpKQo+ICsgICAg ewo+ICsgICAgICAvKiBOZXZlciByZWNvcmQgZm9yIGJhY2tlZGdlcy4gICovCj4gKyAgICAgIGlm IChwcmVkX2UtPmZsYWdzICYgRURHRV9ERlNfQkFDSykKPiArCXJldHVybiBmYWxzZTsKPiArICAg ICAgZWRnZV9pdGVyYXRvciBlaTsKPiArICAgICAgZWRnZSBlOwo+ICsgICAgICBpbnQgY250ID0g MDsKPiArICAgICAgLyogSWdub3JlIGJhY2tlZGdlcy4gICovCj4gKyAgICAgIEZPUl9FQUNIX0VE R0UgKGUsIGVpLCBwcmVkX2UtPmRlc3QtPnByZWRzKQo+ICsJaWYgKCFkb21pbmF0ZWRfYnlfcCAo Q0RJX0RPTUlOQVRPUlMsIGUtPnNyYywgZS0+ZGVzdCkpCj4gKwkgIGNudCsrOwoKd2h5IGNoZWNr IEVER0VfREZTX0JBQ0sgYWJvdmUgYnV0IHVzZSBkb21pbmFuY2UgaGVyZT8gIFNvIGFuIGVkZ2UK aXMgdHJhY2tlZCBpZiBpdCBpcyB0aGUgc2luZ2xlIG5vbi1iYWNrZWRnZSBpbnRvIHRoZSBkZXN0 aW5hdGlvbj8KCj4gKyAgICAgIGlmIChjbnQgIT0gMSkKPiArCXJldHVybiBmYWxzZTsKPiArICAg IH0KPiArICByZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiAgLyogQ29tcHV0ZSBhbmQgcmV0dXJuIHRo ZSBoYXNoIHZhbHVlIGZvciBuYXJ5IG9wZXJhdGlvbiBWQk8xLiAgKi8KPiAgCj4gIGhhc2h2YWxf dAo+IEBAIC00MjI2LDYgKzQzNDIsOSBAQCBpbml0X3ZuX25hcnlfb3BfZnJvbV9zdG10ICh2bl9u YXJ5X29wX3Qgdm5vLCBnYXNzaWduICpzdG10KQo+ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdm5v LT5sZW5ndGg7ICsraSkKPiAgCXZuby0+b3BbaV0gPSBnaW1wbGVfb3AgKHN0bXQsIGkgKyAxKTsK PiAgICAgIH0KPiArICAvKiBJbnNlcnQgYW5kIGxvb2t1cCBOLWFyeSByZXN1bHRzIGJ5IHRoZSBv cGVyYW5kcycgZXF1aXZhbGVuY2UgaGVhZHMuICAqLwo+ICsgIGlmIChnaW1wbGVfYmIgKHN0bXQp KQo+ICsgICAgbG9va3VwX2VxdWl2X2hlYWRzICh2bm8tPmxlbmd0aCwgdm5vLT5vcCwgdm5vLT5v cCwgZ2ltcGxlX2JiIChzdG10KSk7CgpUaGF0IHNlZW1zIGxpa2UgdGhlIHdyb25nIHBsYWNlLCB0 aGUgZnVuY3Rpb24gZGlkbid0IGV2ZW4gdmFsdWVpemUgYmVmb3JlLgoKPiAgfQo+ICAKPiAgLyog Q29tcHV0ZSB0aGUgaGFzaGNvZGUgZm9yIFZOTyBhbmQgbG9vayBmb3IgaXQgaW4gdGhlIGhhc2gg dGFibGU7Cj4gQEAgLTQzNzAsMTMgKzQ0ODksMTMgQEAgdm5fbmFyeV9vcF9pbnNlcnRfaW50byAo dm5fbmFyeV9vcF90IHZubywgdm5fbmFyeV9vcF90YWJsZV90eXBlICp0YWJsZSkKPiAgCSAgYmFz aWNfYmxvY2sgdm5vX2JiCj4gIAkgICAgPSBCQVNJQ19CTE9DS19GT1JfRk4gKGNmdW4sIHZuby0+ dS52YWx1ZXMtPnZhbGlkX2RvbWluYXRlZF9ieV9wWzBdKTsKPiAgCSAgdm5fcHZhbCAqbnZhbCA9 IHZuby0+dS52YWx1ZXM7Cj4gKwkgIC8qIEF2b2lkIGluc2VydGluZyBkdXBsaWNhdGVkIHJlc3Vs dC4gICovCj4gKwkgIHZuby0+dS52YWx1ZXMgPSBOVUxMOwo+ICAJICB2bl9wdmFsICoqbmV4dCA9 ICZ2bm8tPnUudmFsdWVzOwo+IC0JICBib29sIGZvdW5kID0gZmFsc2U7Cj4gIAkgIGZvciAodm5f cHZhbCAqdmFsID0gKCpzbG90KS0+dS52YWx1ZXM7IHZhbDsgdmFsID0gdmFsLT5uZXh0KQo+ICAJ ICAgIHsKPiAgCSAgICAgIGlmIChleHByZXNzaW9uc19lcXVhbF9wICh2YWwtPnJlc3VsdCwgbnZh bC0+cmVzdWx0KSkKPiAgCQl7Cj4gLQkJICBmb3VuZCA9IHRydWU7Cj4gIAkJICBmb3IgKHVuc2ln bmVkIGkgPSAwOyBpIDwgdmFsLT5uOyArK2kpCj4gIAkJICAgIHsKPiAgCQkgICAgICBiYXNpY19i bG9jayB2YWxfYmIKPiBAQCAtNDM5MSwxNyArNDUxMCwxNSBAQCB2bl9uYXJ5X29wX2luc2VydF9p bnRvICh2bl9uYXJ5X29wX3Qgdm5vLCB2bl9uYXJ5X29wX3RhYmxlX3R5cGUgKnRhYmxlKQo+ICAJ CQkJCQkgICAgIHZhbF9iYiwgdm5vX2JiKSk7Cj4gIAkJICAgIH0KPiAgCQkgIC8qIEFwcGVuZCB2 YWx1ZS4gICovCj4gLQkJICAqbmV4dCA9ICh2bl9wdmFsICopIG9ic3RhY2tfYWxsb2MgKCZ2bl90 YWJsZXNfb2JzdGFjaywKPiAtCQkJCQkJICAgICBzaXplb2YgKHZuX3B2YWwpCj4gLQkJCQkJCSAg ICAgKyB2YWwtPm4gKiBzaXplb2YgKGludCkpOwo+IC0JCSAgKCpuZXh0KS0+bmV4dCA9IE5VTEw7 Cj4gLQkJICAoKm5leHQpLT5yZXN1bHQgPSB2YWwtPnJlc3VsdDsKPiAtCQkgICgqbmV4dCktPm4g PSB2YWwtPm4gKyAxOwo+IC0JCSAgbWVtY3B5ICgoKm5leHQpLT52YWxpZF9kb21pbmF0ZWRfYnlf cCwKPiAtCQkJICB2YWwtPnZhbGlkX2RvbWluYXRlZF9ieV9wLAo+ICsJCSAgbnZhbCA9ICh2bl9w dmFsICopIG9ic3RhY2tfYWxsb2MgKCZ2bl90YWJsZXNfb2JzdGFjaywKPiArCQkJCQkJICAgIHNp emVvZiAodm5fcHZhbCkKPiArCQkJCQkJICAgICAgKyB2YWwtPm4gKiBzaXplb2YgKGludCkpOwo+ ICsJCSAgbnZhbC0+bmV4dCA9IE5VTEw7Cj4gKwkJICBudmFsLT5yZXN1bHQgPSB2YWwtPnJlc3Vs dDsKPiArCQkgIG52YWwtPm4gPSB2YWwtPm4gKyAxOwo+ICsJCSAgbWVtY3B5IChudmFsLT52YWxp ZF9kb21pbmF0ZWRfYnlfcCwgdmFsLT52YWxpZF9kb21pbmF0ZWRfYnlfcCwKPiAgCQkJICB2YWwt Pm4gKiBzaXplb2YgKGludCkpOwo+IC0JCSAgKCpuZXh0KS0+dmFsaWRfZG9taW5hdGVkX2J5X3Bb dmFsLT5uXSA9IHZub19iYi0+aW5kZXg7Cj4gLQkJICBuZXh0ID0gJigqbmV4dCktPm5leHQ7Cj4g KwkJICBudmFsLT52YWxpZF9kb21pbmF0ZWRfYnlfcFt2YWwtPm5dID0gdm5vX2JiLT5pbmRleDsK PiAgCQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCj4gIAkJ ICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIkFwcGVuZGluZyBwcmVkaWNhdGUgdG8gdmFsdWUuXG4i KTsKPiAgCQkgIGNvbnRpbnVlOwo+IEBAIC00NDE0LDggKzQ1MzEsMTAgQEAgdm5fbmFyeV9vcF9p bnNlcnRfaW50byAodm5fbmFyeV9vcF90IHZubywgdm5fbmFyeV9vcF90YWJsZV90eXBlICp0YWJs ZSkKPiAgCSAgICAgICgqbmV4dCktPm5leHQgPSBOVUxMOwo+ICAJICAgICAgbmV4dCA9ICYoKm5l eHQpLT5uZXh0Owo+ICAJICAgIH0KPiAtCSAgaWYgKCFmb3VuZCkKPiAtCSAgICAqbmV4dCA9IG52 YWw7Cj4gKwkgIC8qIFB1dCBuZXcgcmVzdWx0IGF0IGZyb250LCBzbyBsb29rdXBfZXF1aXZfaGVh ZCBjYW4gZmluZCB0aGUgbGFzdAo+ICsJICAgICBpbnNlcnRlZCAobW9zdCBnZW5lcmFsKSByZXN1 bHQuICAqLwo+ICsJICBudmFsLT5uZXh0ID0gdm5vLT51LnZhbHVlczsKPiArCSAgdm5vLT51LnZh bHVlcyA9IG52YWw7Cj4gIAo+ICAJICAqc2xvdCA9IHZubzsKPiAgCSAgdm5vLT5uZXh0ID0gbGFz dF9pbnNlcnRlZF9uYXJ5Owo+IEBAIC00NDYwLDYgKzQ1NzksODYgQEAgdm5fbmFyeV9vcF9pbnNl cnRfcGllY2VzICh1bnNpZ25lZCBpbnQgbGVuZ3RoLCBlbnVtIHRyZWVfY29kZSBjb2RlLAo+ICAg IHJldHVybiB2bl9uYXJ5X29wX2luc2VydF9pbnRvICh2bm8xLCB2YWxpZF9pbmZvLT5uYXJ5KTsK PiAgfQo+ICAKPiArLyogU2ltaWxhciB3aXRoIHZuX25hcnlfb3BfaW5zZXJ0X3BpZWNlcywgYnV0 IGluc2VydCBhcyBwcmVkaWNhdGVkIHZhbHVlcy4gICovCj4gKwo+ICtzdGF0aWMgdm5fbmFyeV9v cF90Cj4gK3ZuX25hcnlfb3BfaW5zZXJ0X3BpZWNlc19wcmVkaWNhdGVkXzEgKHVuc2lnbmVkIGlu dCBsZW5ndGgsIGVudW0gdHJlZV9jb2RlIGNvZGUsCj4gKwkJCQkgICAgICAgdHJlZSB0eXBlLCB0 cmVlICpvcHMsIHRyZWUgcmVzdWx0LAo+ICsJCQkJICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZV9p ZCwgYmFzaWNfYmxvY2sgYmIpCj4gK3sKPiArICB2bl9uYXJ5X29wX3Qgdm5vMSA9IGFsbG9jX3Zu X25hcnlfb3AgKGxlbmd0aCwgTlVMTF9UUkVFLCB2YWx1ZV9pZCk7Cj4gKyAgaW5pdF92bl9uYXJ5 X29wX2Zyb21fcGllY2VzICh2bm8xLCBsZW5ndGgsIGNvZGUsIHR5cGUsIG9wcyk7Cj4gKyAgdm5v MS0+cHJlZGljYXRlZF92YWx1ZXMgPSAxOwo+ICsgIHZubzEtPnUudmFsdWVzCj4gKyAgICA9ICh2 bl9wdmFsICopIG9ic3RhY2tfYWxsb2MgKCZ2bl90YWJsZXNfb2JzdGFjaywgc2l6ZW9mICh2bl9w dmFsKSk7Cj4gKyAgdm5vMS0+dS52YWx1ZXMtPm5leHQgPSBOVUxMOwo+ICsgIHZubzEtPnUudmFs dWVzLT5yZXN1bHQgPSByZXN1bHQ7Cj4gKyAgdm5vMS0+dS52YWx1ZXMtPm4gPSAxOwo+ICsgIHZu bzEtPnUudmFsdWVzLT52YWxpZF9kb21pbmF0ZWRfYnlfcFswXSA9IGJiLT5pbmRleDsKPiArICBy ZXR1cm4gdm5fbmFyeV9vcF9pbnNlcnRfaW50byAodm5vMSwgdmFsaWRfaW5mby0+bmFyeSk7Cj4g K30KPiArCj4gKy8qIEZvbGQgTi1hcnkgZXhwcmVzc2lvbiBvZiBlcXVpdi1oZWFkcywgcmV0dXJu IE5VTExfVFJFRSBpZiBub3QgZm9sZGVkLiAgKi8KPiArCj4gK3N0YXRpYyB0cmVlCj4gK2ZvbGRf Y29uc3RfZnJvbV9lcXVpdl9oZWFkcyAodW5zaWduZWQgbGVuZ3RoLCB0cmVlX2NvZGUgb3Bjb2Rl LCB0cmVlICpvcCwKPiArCQkJICAgICB0cmVlIHR5cGUpCj4gK3sKPiArICB0cmVlIHJlc3VsdCA9 IE5VTExfVFJFRTsKPiArICAvKiBXZSdyZSB1c2luZyBlcXVpdi1oZWFkcywgaS5lLiB0aGUgbW9z dCBnZW5lcmFsIG9wZXJhbmRzLCBzaG9ydGN1dCBmb3IKPiArICAgICBzaXR1YXRpb25zIHRoYXQg Y2FuIGZvbGQuICAqLwo+ICsgIHN3aXRjaCAobGVuZ3RoKQo+ICsgICAgewo+ICsgICAgY2FzZSAx Ogo+ICsgICAgICBpZiAoQ09OU1RBTlRfQ0xBU1NfUCAob3BbMF0pKQo+ICsJcmVzdWx0Cj4gKwkg ID0gZ2ltcGxlX3NpbXBsaWZ5IChvcGNvZGUsIHR5cGUsIG9wWzBdLCBOVUxMLCBub19mb2xsb3df c3NhX2VkZ2VzKTsKPiArICAgICAgYnJlYWs7Cj4gKyAgICBjYXNlIDI6Cj4gKyAgICAgIGlmICgo Q09OU1RBTlRfQ0xBU1NfUCAob3BbMF0pICYmIENPTlNUQU5UX0NMQVNTX1AgKG9wWzFdKSkKPiAr CSAgfHwgb3BbMF0gPT0gb3BbMV0pCj4gKwlyZXN1bHQgPSBnaW1wbGVfc2ltcGxpZnkgKG9wY29k ZSwgdHlwZSwgb3BbMF0sIG9wWzFdLCBOVUxMLAo+ICsJCQkJICBub19mb2xsb3dfc3NhX2VkZ2Vz KTsKPiArICAgICAgYnJlYWs7Cj4gKyAgICBjYXNlIDM6Cj4gKyAgICAgIGlmIChDT05TVEFOVF9D TEFTU19QIChvcFswXSkgJiYgQ09OU1RBTlRfQ0xBU1NfUCAob3BbMV0pCj4gKwkgICYmIENPTlNU QU5UX0NMQVNTX1AgKG9wWzJdKSkKPiArCXJlc3VsdCA9IGdpbXBsZV9zaW1wbGlmeSAob3Bjb2Rl LCB0eXBlLCBvcFswXSwgb3BbMV0sIG9wWzJdLCBOVUxMLAo+ICsJCQkJICBub19mb2xsb3dfc3Nh X2VkZ2VzKTsKPiArICAgICAgYnJlYWs7Cj4gKyAgICBkZWZhdWx0Ogo+ICsgICAgICBicmVhazsK PiArICAgIH0KPiArICBpZiAocmVzdWx0ICYmICF1c2VsZXNzX3R5cGVfY29udmVyc2lvbl9wICh0 eXBlLCBUUkVFX1RZUEUgKHJlc3VsdCkpKQo+ICsgICAgcmVzdWx0ID0gZm9sZF9jb252ZXJ0ICh0 eXBlLCByZXN1bHQpOwo+ICsgIHJldHVybiByZXN1bHQ7Cj4gK30KPiArCj4gKy8qIEluc2VydCBh IGJhY2stcmVmZXJlbmNlIHRvIHZuX25hcnlfb3BfdCBpbiB2bl9zc2FfYXV4LiAgKi8KPiArCj4g K3N0YXRpYyBpbmxpbmUgdm9pZAo+ICtwdXNoX25ld19uYXJ5X3JlZiAodm5fbmFyeV9vcF90IHNs b3QsIHZuX3NzYV9hdXhfdCBpbmZvKQo+ICt7Cj4gKyAgbmFyeV9yZWYgKnJlZjsKPiArICBpZiAo bmFyeV9yZWZfZnJlZWxpc3QpCj4gKyAgICB7Cj4gKyAgICAgIHJlZiA9IG5hcnlfcmVmX2ZyZWVs aXN0Owo+ICsgICAgICBuYXJ5X3JlZl9mcmVlbGlzdCA9IG5hcnlfcmVmX2ZyZWVsaXN0LT5uZXh0 Owo+ICsgICAgfQo+ICsgIGVsc2UKPiArICAgIHJlZiA9IFhPQk5FVyAoJnZuX3NzYV9hdXhfb2Jz dGFjaywgbmFyeV9yZWYpOwo+ICsgIHJlZi0+bmV4dCA9IGluZm8tPnJlZjsKPiArICByZWYtPm5l eHRfdW5kbyA9IGxhc3RfcHVzaGVkX25hcnlfcmVmOwo+ICsgIHJlZi0+c2xvdCA9IHNsb3Q7Cj4g KyAgbGFzdF9wdXNoZWRfbmFyeV9yZWYgPSBpbmZvOwo+ICsgIGluZm8tPnJlZiA9IHJlZjsKPiAr ICArK2luZm8tPm51bV9uYXJ5X3JlZjsKPiArICBnY2NfYXNzZXJ0IChpbmZvLT5udW1fbmFyeV9y ZWYgPiAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZuX25hcnlfb3BfdAo+ICt2YWxfZXF1aXZfaW5z ZXJ0ICh0cmVlIG9wMSwgdHJlZSBvcDIsIGVkZ2UgZSk7Cj4gKwo+ICBzdGF0aWMgdm5fbmFyeV9v cF90Cj4gIHZuX25hcnlfb3BfaW5zZXJ0X3BpZWNlc19wcmVkaWNhdGVkICh1bnNpZ25lZCBpbnQg bGVuZ3RoLCBlbnVtIHRyZWVfY29kZSBjb2RlLAo+ICAJCQkJICAgICB0cmVlIHR5cGUsIHRyZWUg Km9wcywKPiBAQCAtNDQ2NywyMSArNDY2NiwxNSBAQCB2bl9uYXJ5X29wX2luc2VydF9waWVjZXNf cHJlZGljYXRlZCAodW5zaWduZWQgaW50IGxlbmd0aCwgZW51bSB0cmVlX2NvZGUgY29kZSwKPiAg CQkJCSAgICAgZWRnZSBwcmVkX2UpCj4gIHsKPiAgICAvKiA/Pz8gIEN1cnJlbnRseSB0cmFja2lu ZyBCQnMuICAqLwo+IC0gIGlmICghIHNpbmdsZV9wcmVkX3AgKHByZWRfZS0+ZGVzdCkpCj4gLSAg ICB7Cj4gLSAgICAgIC8qIE5ldmVyIHJlY29yZCBmb3IgYmFja2VkZ2VzLiAgKi8KPiAtICAgICAg aWYgKHByZWRfZS0+ZmxhZ3MgJiBFREdFX0RGU19CQUNLKQo+IC0JcmV0dXJuIE5VTEw7Cj4gLSAg ICAgIGVkZ2VfaXRlcmF0b3IgZWk7Cj4gLSAgICAgIGVkZ2UgZTsKPiAtICAgICAgaW50IGNudCA9 IDA7Cj4gLSAgICAgIC8qIElnbm9yZSBiYWNrZWRnZXMuICAqLwo+IC0gICAgICBGT1JfRUFDSF9F REdFIChlLCBlaSwgcHJlZF9lLT5kZXN0LT5wcmVkcykKPiAtCWlmICghIGRvbWluYXRlZF9ieV9w IChDRElfRE9NSU5BVE9SUywgZS0+c3JjLCBlLT5kZXN0KSkKPiAtCSAgY250Kys7Cj4gLSAgICAg IGlmIChjbnQgIT0gMSkKPiAtCXJldHVybiBOVUxMOwo+IC0gICAgfQo+ICsgIGlmICghdm5fdHJh Y2tpbmdfZWRnZSAocHJlZF9lKSkKPiArICAgIHJldHVybiBOVUxMOwo+ICsgIC8qIEVxdWl2YWxl bmNlIGNhbiByZXByZXNlbnQgdGhpcy4gICovCj4gKyAgaWYgKGNvZGUgPT0gRVFfRVhQUiAmJiBy ZXN1bHQgPT0gYm9vbGVhbl90cnVlX25vZGUpCj4gKyAgICByZXR1cm4gdmFsX2VxdWl2X2luc2Vy dCAob3BzWzBdLCBvcHNbMV0sIHByZWRfZSk7Cj4gKyAgLyogTGVhdmUgdGhpcyBmb3IgaW52ZXJ0 ZWQgY29uZGl0aW9uLiAgKi8KPiArICBpZiAoY29kZSA9PSBORV9FWFBSICYmIHJlc3VsdCA9PSBi b29sZWFuX2ZhbHNlX25vZGUpCj4gKyAgICByZXR1cm4gTlVMTDsKPiArCj4gICAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKQo+ICAgICAgICAvKiA/Pz8gIEZpeCBk dW1waW5nLCBidXQgY3VycmVudGx5IHdlIG9ubHkgZ2V0IGNvbXBhcmlzb25zLiAgKi8KPiAgICAg ICAgJiYgVFJFRV9DT0RFX0NMQVNTIChjb2RlKSA9PSB0Y2NfY29tcGFyaXNvbikKPiBAQCAtNDQ5 NCwzNiArNDY4NywyNTUgQEAgdm5fbmFyeV9vcF9pbnNlcnRfcGllY2VzX3ByZWRpY2F0ZWQgKHVu c2lnbmVkIGludCBsZW5ndGgsIGVudW0gdHJlZV9jb2RlIGNvZGUsCj4gICAgICAgIGZwcmludGYg KGR1bXBfZmlsZSwgIiA9PSAlc1xuIiwKPiAgCSAgICAgICBpbnRlZ2VyX3plcm9wIChyZXN1bHQp ID8gImZhbHNlIiA6ICJ0cnVlIik7Cj4gICAgICB9Cj4gLSAgdm5fbmFyeV9vcF90IHZubzEgPSBh bGxvY192bl9uYXJ5X29wIChsZW5ndGgsIE5VTExfVFJFRSwgdmFsdWVfaWQpOwo+IC0gIGluaXRf dm5fbmFyeV9vcF9mcm9tX3BpZWNlcyAodm5vMSwgbGVuZ3RoLCBjb2RlLCB0eXBlLCBvcHMpOwo+ IC0gIHZubzEtPnByZWRpY2F0ZWRfdmFsdWVzID0gMTsKPiAtICB2bm8xLT51LnZhbHVlcyA9ICh2 bl9wdmFsICopIG9ic3RhY2tfYWxsb2MgKCZ2bl90YWJsZXNfb2JzdGFjaywKPiAtCQkJCQkgICAg ICBzaXplb2YgKHZuX3B2YWwpKTsKPiAtICB2bm8xLT51LnZhbHVlcy0+bmV4dCA9IE5VTEw7Cj4g LSAgdm5vMS0+dS52YWx1ZXMtPnJlc3VsdCA9IHJlc3VsdDsKPiAtICB2bm8xLT51LnZhbHVlcy0+ biA9IDE7Cj4gLSAgdm5vMS0+dS52YWx1ZXMtPnZhbGlkX2RvbWluYXRlZF9ieV9wWzBdID0gcHJl ZF9lLT5kZXN0LT5pbmRleDsKPiAtICByZXR1cm4gdm5fbmFyeV9vcF9pbnNlcnRfaW50byAodm5v MSwgdmFsaWRfaW5mby0+bmFyeSk7Cj4gKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0 aDsgaSsrKQo+ICsgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAobG9va3VwX2VxdWl2X2hlYWQgKG9w c1tpXSwgcHJlZF9lLT5kZXN0KSA9PSBvcHNbaV0pOwo+ICsKPiArICAvKiBTa2lwIGlmIHRoZSBy ZXN1bHQgaXMga25vd24uIChDYXVzZWQgYnkgcmUtaW5zZXJ0aW5nIHByZWRpY2F0ZXMuKSAgKi8K PiArICB0cmVlIHNpbXBsaWZpZWQgPSBmb2xkX2NvbnN0X2Zyb21fZXF1aXZfaGVhZHMgKGxlbmd0 aCwgY29kZSwgb3BzLCB0eXBlKTsKPiArICBpZiAoc2ltcGxpZmllZCkKPiArICAgIHsKPiArICAg ICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKPiArCXsKPiAr CSAgZnByaW50ZiAoZHVtcF9maWxlLCAiUmVzdWx0IGlzIGtub3duOiAiKTsKPiArCSAgcHJpbnRf Z2VuZXJpY19leHByIChkdW1wX2ZpbGUsIHNpbXBsaWZpZWQsIFRERl9OT05FKTsKPiArCSAgZnBy aW50ZiAoZHVtcF9maWxlLCAiLCBza2lwcGVkLlxuIik7Cj4gKwl9Cj4gKyAgICAgIHJldHVybiBO VUxMOwo+ICsgICAgfQo+ICsKPiArICB2bl9uYXJ5X29wX3QgdmFsCj4gKyAgICA9IHZuX25hcnlf b3BfaW5zZXJ0X3BpZWNlc19wcmVkaWNhdGVkXzEgKGxlbmd0aCwgY29kZSwgdHlwZSwgb3BzLAo+ ICsJCQkJCSAgICAgcmVzdWx0LCB2YWx1ZV9pZCwgcHJlZF9lLT5kZXN0KTsKPiArICAvKiBJbnNl cnQgYmFjay1yZWZzIChvcGVyYW5kLT5zbG90KSB0byB2bl9zc2FfYXV4IHN0cnVjdHVyZS4gICov Cj4gKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQo+ICsgICAgaWYgKFRS RUVfQ09ERSAob3BzW2ldKSA9PSBTU0FfTkFNRSkKPiArICAgICAgewo+ICsJdm5fc3NhX2F1eF90 IGluZm8gPSBWTl9JTkZPIChvcHNbaV0pOwo+ICsJaWYgKGluZm8tPnZhbG51bSA9PSBvcHNbaV0p Cj4gKwkgIHB1c2hfbmV3X25hcnlfcmVmICh2YWwsIGluZm8pOwo+ICsgICAgICB9Cj4gKyAgcmV0 dXJuIHZhbDsKPiAgfQo+ICAKPiAtc3RhdGljIGJvb2wKPiAtZG9taW5hdGVkX2J5X3Bfd191bmV4 IChiYXNpY19ibG9jayBiYjEsIGJhc2ljX2Jsb2NrIGJiMiwgYm9vbCk7Cj4gKy8qIFJlY29yZCB0 aGUgZXF1aXZhbGVuY2Ugb2YgT1AxIGFuZCBPUDIgb24gZWRnZSBFLiAgKi8KPiAgCj4gLXN0YXRp YyB0cmVlCj4gLXZuX25hcnlfb3BfZ2V0X3ByZWRpY2F0ZWRfdmFsdWUgKHZuX25hcnlfb3BfdCB2 bm8sIGJhc2ljX2Jsb2NrIGJiKQo+ICtzdGF0aWMgdm5fbmFyeV9vcF90Cj4gK3ZhbF9lcXVpdl9p bnNlcnQgKHRyZWUgb3AxLCB0cmVlIG9wMiwgZWRnZSBlKQo+ICB7Cj4gLSAgaWYgKCEgdm5vLT5w cmVkaWNhdGVkX3ZhbHVlcykKPiAtICAgIHJldHVybiB2bm8tPnUucmVzdWx0Owo+ICsgIC8qIFJl Y29yZCBieSBlcXVpdmFsZW5jZSBoZWFkcy4gICovCj4gKyAgYmFzaWNfYmxvY2sgYmIgPSBlLT5k ZXN0Owo+ICsgIHRyZWUgbGhzID0gbG9va3VwX2VxdWl2X2hlYWQgKG9wMSwgYmIpOwo+ICsgIHRy ZWUgcmhzID0gbG9va3VwX2VxdWl2X2hlYWQgKG9wMiwgYmIpOwo+ICsgIGlmIChsaHMgPT0gcmhz KQo+ICsgICAgcmV0dXJuIE5VTEw7Cj4gKyAgLyogU2V0IFJIUyB0byBiZSBuZXcgZXF1aXYtaGVh ZCBmb3IgTEhTLiAgTEhTIG11c3QgYmUgU1NBX05BTUUuICAqLwo+ICsgIGlmIChUUkVFX0NPREUg KGxocykgIT0gU1NBX05BTUUpCj4gKyAgICB7Cj4gKyAgICAgIGlmIChUUkVFX0NPREUgKHJocykg PT0gU1NBX05BTUUpCj4gKwlzdGQ6OnN3YXAgKGxocywgcmhzKTsKPiArICAgICAgZWxzZQo+ICsJ cmV0dXJuIE5VTEw7Cj4gKyAgICB9Cj4gKyAgdm5fc3NhX2F1eF90IHJoc19pbmZvID0gTlVMTCwg bGhzX2luZm8gPSBWTl9JTkZPIChsaHMpOwo+ICsKPiArICAvKiBDaG9vc2UgdGhlIGhhbmQtc2lk ZSB3aXRoIG1vcmUgcmVjb3JkZWQgbi1hcnkgZXhwcmVzc2lvbnMgYXMgbmV3Cj4gKyAgICAgZXF1 aXZhbGVuY2UgaGVhZCwgdG8gbWFrZSBmZXdlciByZS1pbnNlcnRpb25zLiAgKi8KPiArICBpZiAo VFJFRV9DT0RFIChyaHMpID09IFNTQV9OQU1FKQo+ICsgICAgewo+ICsgICAgICByaHNfaW5mbyA9 IFZOX0lORk8gKHJocyk7Cj4gKyAgICAgIGlmIChyaHNfaW5mby0+bnVtX25hcnlfcmVmIDwgbGhz X2luZm8tPm51bV9uYXJ5X3JlZikKPiArCXsKPiArCSAgc3RkOjpzd2FwIChsaHMsIHJocyk7Cj4g KwkgIHN0ZDo6c3dhcCAocmhzX2luZm8sIGxoc19pbmZvKTsKPiArCX0KPiArICAgIH0KPiArCj4g KyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKPiArICAgIHsK PiArICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiUmVjb3JkaW5nIGVxdWl2YWxlbmNlIG9mICIp Owo+ICsgICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1bXBfZmlsZSwgbGhzKTsKPiArICAgICAg ZnByaW50ZiAoZHVtcF9maWxlLCAiIGFuZCAiKTsKPiArICAgICAgcHJpbnRfZ2VuZXJpY19leHBy IChkdW1wX2ZpbGUsIHJocyk7Cj4gKyAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIiBhdCBCQiVk XG4iLCBiYi0+aW5kZXgpOwo+ICsgICAgfQo+ICsgIC8qIFJlY29yZCBlcXVpdmFsZW5jZSBhcyB1 bmFyeSBOT1BfRVhQUi4gICovCj4gKyAgdm5fbmFyeV9vcF90IHZhbAo+ICsgICAgPSB2bl9uYXJ5 X29wX2luc2VydF9waWVjZXNfcHJlZGljYXRlZF8xICgxLCBOT1BfRVhQUiwgVFJFRV9UWVBFIChs aHMpLAo+ICsJCQkJCSAgICAgJmxocywgcmhzLCAwLCBiYik7Cgp3aHkgYXJlIGVxdWl2YWxlbmNl cyByZWNvcmRlZCBpbiB0aGUgZXhwcmVzc2lvbiBoYXNoIHRhYmxlIGF0IGFsbD8gIEFyZQp0aGV5 IG5vdCBwcmVkaWNhdGVkIHZhbHVlcyBvZiBhbiBTU0EgbmFtZSBhbmQgdGh1cyBzaG91bGQgYmUg YQp2bl9wdmFsIGNoYWluIGluIHZuX3NzYV9hdXggaXRzZWxmPwoKY29uZGl0aW9uYWwgZXF1aXZh bGVuY2VzIGFyZSBleHBlbnNpdmUgdG8gaGFuZGxlIChzbyBhcmUgdGhlIGV4aXN0aW5nCnByZWRp Y2F0ZWQgdmFsdWVzIHdoaWNoIEkgZG8gbm90IGxpa2UgdG9vIG11Y2ggYW5kIHdoaWNoLCBmcmFu a2x5LCBJJ3ZlCnByb2JhYmx5IGRlc2lnbmVkIHRvbyBnZW5lcmFsIC0gQVRNIHdlIG9ubHkgZXZl ciBpbnNlcnQgcHJlZGljYXRlZAp2YWx1ZXMgJ3RydWUnIGFuZCAnZmFsc2UnIHdoaWNoIGNvdWxk IGJlIHVzZWQgdG8gc2ltcGxpZnkgYSBsb3Qgb2YgbG9naWMKYnV0IHdvdWxkIGJyZWFrIHRoaXMg cGF0Y2g/KQoKQXQgc29tZSBwb2ludCBJIHdhbnRlZCB0byBzZWUgd2hldGhlciB3ZSBjYW4gdXNl IHJhbmdlciByZWxhdGlvbnMKZm9yIGFsbCBvZiB0aGlzLgoKVGhlbiwgZm9yICJ0cnVlIiBlcXVp dmFsZW5jZSB0cmFja2luZyBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBleHBsb3JlCiJwYXRo IHZhbHVlIG51bWJlcmluZyIsIGFrYSBhbGxvdyByZXZpc2l0aW5nIGNvZGUgZnJvbSB0aGUgZXF1 aXZhbGVuY2UKb3AgZGVmcyB0byB0aGUgZXF1aXZhbGVuY2UgcHJvZHVjaW5nIGVkZ2Uocykgd2l0 aCB0aGUgZXF1aXZhbGVuY2UgZnVsbHkKcmVmbGVjdGVkIGluIHRoZSB2YWx1ZSBudW1iZXIuICBU aGUgaW50ZXJlc3RpbmcgdGhpbmcgbWlnaHQgYmUgdGhhdCB3ZQpjYW4gdHJhY2sgd2hldGhlciB0 aGVyZSdzIGFueSBlcXVpdmFsZW5jZSBvbiB0aGUgc2lkZSBhbmQgYmFzZWQgb24KdXNlIGhldXJp c3RpYyBkZWNpZGUgd2hldGhlciB0aGF0J3MgZ29pbmcgdG8gcGF5IG9mZi4gIEl0IG1pZ2h0IGJl IGFsc28KcG9zc2libGUgdG8gcmUtdXNlIHRoaXMgdG8gaW1wcm92ZSBqdW1wIHRocmVhZGluZyBj b3N0aW5nLgoKU28sIG92ZXJhbGwgSSB3YXNuJ3QgYWJsZSB0byBnZXQgYXQgd2hhdCB0aGlzIHBh dGNoIHdpbGwgY2F0Y2ggYW5kIHdoYXQKaXQgd2lsbCBub3QgY2F0Y2ggLSB0aGF0IGlzLCB0byB3 aGF0IGV4dGVudCBlcXVpdmFsZW5jZXMgYWZmZWN0CnByZXZpb3VzbHkgYW5kIGZ1dHVyZSByZWNv cmRlZCBleHByZXNzaW9ucy4gIFBsdXMgdGhlIGltcGxlbWVudGF0aW9uCmZlZWxzIGxpa2UgaXQg Ym9sdHMgb24gdGhlIHdyb25nIHBsYWNlLgoKQXMgSSdtIG5vdCBoYXBweSB3aXRoIG15IHByZWRp Y2F0ZWQgdmFsdWVzIGltcGxlbWVudGF0aW9uIGVpdGhlciBJJ20Kb2YgY291cnNlIGEgYml0IGJp YXNlZCBoZXJlIChub3RlIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgbW9zdGx5IGFkZGVkCnRvIGF2 b2lkIHJlZ3Jlc3Npb25zIHdpdGggcmVzcGVjdCB0byB0aGUgcHJldmlvdXMgVk4gaW1wbGVtZW50 YXRpb24KYW5kIEkgc2hvdWxkIHByb2JhYmx5IG1ha2UgaXQgbGVzcyBnZW5lcmFsIGFuZCBtb3Jl IG9wdGltaXplZCAtIGJ1dAphcyBzYWlkLCB1c2luZyByYW5nZXIgbWlnaHQgYmUgYW4gb3B0aW9u IGhlcmUpLgoKWW91IGhhdmUgb25lIHRlc3RjYXNlLCBzc2EtZnJlLTEwMi5jLCB0aGF0IHNlZW1z IHRvIHJlcXVpcmUgVk4Kd2l0aCBlcXVpdmFsZW5jZXMsIHRoZSBvdGhlcnMgc2hvdWxkIGJlIGNh dGNoZWQgYnkgcmFuZ2VycyByZWxhdGlvbgpoYW5kbGluZywgbm8/Cgo+ICsgIC8qIEJhY2stcmVm IGZvciBlcXVpdmFsZW5jZXMgaXMgcmVzdWx0LT5zbG90IHJhdGhlciB0aGFuIG9wLT5zbG90LCBz byB0aGF0Cj4gKyAgICAgd2hlbiBuZXcgZXF1aXYtaGVhZCBpcyBhcHBlbmRlZCwgd2UgY2FuIHVw ZGF0ZSB0aGVtLiAgKi8KPiArICBpZiAoVFJFRV9DT0RFIChyaHMpID09IFNTQV9OQU1FKQo+ICsg ICAgcHVzaF9uZXdfbmFyeV9yZWYgKHZhbCwgcmhzX2luZm8pOwo+ICsKPiArICAvKiBJdGVyYXRl IG9uIExIUydzIHJlZmVyZW5jZXMsIGZpcnN0IHVwZGF0ZSBlcXVpdi1oZWFkcywgdGhlbiByZS1p bnNlcnQKPiArICAgICBmb3JtZXIgcHJlZGljYXRlcywgc28gdGhhdCB0aGUgcmVzdWx0IHdpbGwg YmUgbGF0ZXN0LiAgKi8KPiArICBoYXNoX21hcDx2bl9uYXJ5X29wX3QsIHRyZWU+IHByZWRpY2F0 ZXM7Cj4gKyAgdm5fbmFyeV9vcF90IHNsb3Q7Cj4gKyAgdHJlZSBvbGRfaGVhZCA9IGxoc19pbmZv LT52YWxudW07Cj4gKyAgbmFyeV9yZWYgKnJlZiA9IGxoc19pbmZvLT5yZWY7Cj4gKyAgZm9yICg7 IHJlZjsgcmVmID0gcmVmLT5uZXh0KQo+ICsgICAgewo+ICsgICAgICBzbG90ID0gcmVmLT5zbG90 Owo+ICsgICAgICBpZiAoIXNsb3QtPnByZWRpY2F0ZWRfdmFsdWVzKQo+ICsJY29udGludWU7Cj4g KyAgICAgIC8qIFVwZGF0ZSByZWNvcmRlZCBlcXVpdmFsZW5jZXMgd2l0aCBuZXcgZXF1aXYtaGVh ZC4gICovCj4gKyAgICAgIGlmIChzbG90LT5vcGNvZGUgPT0gTk9QX0VYUFIgJiYgc2xvdC0+bGVu Z3RoID09IDEpCj4gKwl7Cj4gKwkgIGlmIChzbG90LT5vcFswXSA9PSByaHMpCj4gKwkgICAgY29u dGludWU7Cj4gKwkgIGZvciAodm5fcHZhbCAqcHZhbCA9IHNsb3QtPnUudmFsdWVzOyBwdmFsOyBw dmFsID0gcHZhbC0+bmV4dCkKPiArCSAgICBpZiAoZXhwcmVzc2lvbnNfZXF1YWxfcCAocHZhbC0+ cmVzdWx0LCBvbGRfaGVhZCkKPiArCQkmJiBpc192bl92YWxpZF9hdF9iYiAocHZhbCwgYmIpKQo+ ICsJICAgICAgewo+ICsJCWlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCj4gKwkJICB7Cj4gKwkJICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlVwZGF0aW5nIGVxdWl2 LWhlYWQgb2YgIik7Cj4gKwkJICAgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCBzbG90 LT5vcFswXSwgVERGX1NMSU0pOwo+ICsJCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICIgdG8gIik7 Cj4gKwkJICAgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCByaHMsIFRERl9TTElNKTsK PiArCQkgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiIGF0IEJCJWRcbiIsIGJiLT5pbmRleCk7Cj4g KwkJICB9Cj4gKwkJdm5fbmFyeV9vcF90IG5ld192YWwKPiArCQkgID0gdm5fbmFyeV9vcF9pbnNl cnRfcGllY2VzX3ByZWRpY2F0ZWRfMSAoMSwgTk9QX0VYUFIsCj4gKwkJCQkJCQkgICBzbG90LT50 eXBlLCBzbG90LT5vcCwKPiArCQkJCQkJCSAgIHJocywgMCwgYmIpOwo+ICsJCS8qIFB1c2ggYmFj ay1yZWYgKHJlc3VsdC0+c2xvdCkgZm9yIG5ldyBlcXVpdmFsZW5jZS4gICovCj4gKwkJaWYgKFRS RUVfQ09ERSAocmhzKSA9PSBTU0FfTkFNRSkKPiArCQkgIHB1c2hfbmV3X25hcnlfcmVmIChuZXdf dmFsLCByaHNfaW5mbyk7Cj4gKwkgICAgICB9Cj4gKwl9Cj4gKyAgICAgIGVsc2UKPiArCS8qIFBy ZWRpY2F0ZWQgdmFsdWVzIGFyZSBjb2xsZWN0ZWQsIHRvIGJlIHJlLWluc2VydGVkIGxhdGVyLiAg Ki8KPiArCWZvciAodm5fcHZhbCAqcHZhbCA9IHNsb3QtPnUudmFsdWVzOyBwdmFsOyBwdmFsID0g cHZhbC0+bmV4dCkKPiArCSAgewo+ICsJICAgIGlmICghaXNfdm5fdmFsaWRfYXRfYmIgKHB2YWws IGJiKSkKPiArCSAgICAgIGNvbnRpbnVlOwo+ICsJICAgIHByZWRpY2F0ZXMucHV0IChzbG90LCBw dmFsLT5yZXN1bHQpOwo+ICsJICAgIGJyZWFrOwo+ICsJICB9Cj4gKyAgICB9Cj4gKwo+ICsgIGlm ICghcHJlZGljYXRlcy5pc19lbXB0eSAoKSAmJiBkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBU REZfREVUQUlMUykpCj4gKyAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJSZS1pbnNlcnRpbmcgJWxk IHByZWRpY2F0ZXMuLi5cbiIsCj4gKwkgICAgIHByZWRpY2F0ZXMuZWxlbWVudHMgKCkpOwo+ICsg IHRyZWUgbmV3X29wc1szXTsKPiArICBmb3IgKGF1dG8gaSA9IHByZWRpY2F0ZXMuYmVnaW4gKCks IGVuZCA9IHByZWRpY2F0ZXMuZW5kICgpOyBpICE9IGVuZDsgKytpKQo+ICsgICAgewo+ICsgICAg ICB2bl9uYXJ5X29wX3Qgc2xvdCA9ICgqaSkuZmlyc3Q7Cj4gKyAgICAgIHRyZWUgcmVzdWx0ID0g KCppKS5zZWNvbmQ7Cj4gKyAgICAgIGxvb2t1cF9lcXVpdl9oZWFkcyAoc2xvdC0+bGVuZ3RoLCBz bG90LT5vcCwgbmV3X29wcywgZS0+ZGVzdCk7Cj4gKyAgICAgIHZuX25hcnlfb3BfaW5zZXJ0X3Bp ZWNlc19wcmVkaWNhdGVkIChzbG90LT5sZW5ndGgsIHNsb3QtPm9wY29kZSwKPiArCQkJCQkgICBz bG90LT50eXBlLCBuZXdfb3BzLCByZXN1bHQsCj4gKwkJCQkJICAgc2xvdC0+dmFsdWVfaWQsIGUp Owo+ICsgICAgfQo+ICsgIHJldHVybiB2YWw7Cj4gK30KPiArCj4gKy8qIFJlY29yZCB0ZW1wb3Jh cnkgZXF1aXZhbGVuY2VzIGdlbmVyYXRlZCBieSBQSEkgbm9kZXMsIGFuZCBhcmUgdmFsaWQgd2hl bgo+ICsgICBCQidzIG91dGdvaW5nIGVkZ2UgRSBpcyB0YWtlbi4gIFZOTyBjb250YWlucyB0aGUg aW50ZXJlc3RlZCBleHByZXNzaW9uLgo+ICsgICBSRVNVTFQgaXMgdmFsdWUgdGhhdCBuZWVkIHRv IGJlIHJ1bGVkIG91dC4gICovCj4gKwo+ICtzdGF0aWMgdm9pZAo+ICtyZWNvcmRfZXF1aXZfZnJv bV9wcmV2X3BoaV8xICh2bl9uYXJ5X29wX3Qgdm5vLCBlZGdlIGUsIGJhc2ljX2Jsb2NrIGJiLAo+ ICsJCQkgICAgICB0cmVlIHJlc3VsdCkKPiArewo+ICsgIGlmICghKHZubyAmJiB2bm8tPnByZWRp Y2F0ZWRfdmFsdWVzKSkKPiArICAgIHJldHVybjsKPiArCj4gKyAgLyogUHJvY2VzcyBwcmVkaWNh dGVkIHZhbHVlcyBpbiBWTk8sIGxvb2tpbmcgZm9yIGEgY29uZmxpY3RpbmcgcmVzdWx0LCBhbmQK PiArICAgICB0aGUgbG9jYXRpb24ncyBzaW5nbGVfcHJlZCBkb21pbmF0ZXMgQkIuICAqLwo+ICAg IGZvciAodm5fcHZhbCAqdmFsID0gdm5vLT51LnZhbHVlczsgdmFsOyB2YWwgPSB2YWwtPm5leHQp Cj4gLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsLT5uOyArK2kpCj4gLSAgICAgIC8q IERvIG5vdCBoYW5kbGUgYmFja2VkZ2UgZXhlY3V0YWJpbGl0eSBvcHRpbWlzdGljYWxseSBzaW5j ZQo+IC0JIHdoZW4gZmlndXJpbmcgb3V0IHdoZXRoZXIgdG8gaXRlcmF0ZSB3ZSBkbyBub3QgY29u c2lkZXIKPiAtCSBjaGFuZ2VkIHByZWRpY2F0aW9uLiAgKi8KPiAtICAgICAgaWYgKGRvbWluYXRl ZF9ieV9wX3dfdW5leAo+IC0JICAgIChiYiwgQkFTSUNfQkxPQ0tfRk9SX0ZOIChjZnVuLCB2YWwt PnZhbGlkX2RvbWluYXRlZF9ieV9wW2ldKSwKPiAtCSAgICAgZmFsc2UpKQo+IC0JcmV0dXJuIHZh bC0+cmVzdWx0Owo+IC0gIHJldHVybiBOVUxMX1RSRUU7Cj4gKyAgICB7Cj4gKyAgICAgIGlmICgh ZXhwcmVzc2lvbnNfZXF1YWxfcCAodmFsLT5yZXN1bHQsIHJlc3VsdCkpCj4gKwljb250aW51ZTsK PiArICAgICAgLyogRm91bmQgYSByZXN1bHQgdG8gcnVsZSBvdXQsIHByb2Nlc3MgZWFjaCBsb2Nh dGlvbi4gICovCj4gKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWwtPm47ICsraSkK PiArCXsKPiArCSAgYmFzaWNfYmxvY2sgYmIxCj4gKwkgICAgPSBCQVNJQ19CTE9DS19GT1JfRk4g KGNmdW4sIHZhbC0+dmFsaWRfZG9taW5hdGVkX2J5X3BbaV0pOwo+ICsJICBpZiAoIXNpbmdsZV9w cmVkX3AgKGJiMSkpCj4gKwkgICAgY29udGludWU7Cj4gKwkgIGJhc2ljX2Jsb2NrIHAgPSBzaW5n bGVfcHJlZCAoYmIxKTsKPiArCSAgaWYgKCFkb21pbmF0ZWRfYnlfcF93X3VuZXggKGJiLCBwLCBm YWxzZSkpCj4gKwkgICAgY29udGludWU7Cj4gKwkgIGdjY19hc3NlcnQgKEVER0VfQ09VTlQgKHAt PnN1Y2NzKSA9PSAyKTsKPiArCSAgLyogSXRlcmF0ZSBvbiBwb3NzaWJsZSBwaGlfYmJzIChjYW4g YmUgQkIgaXRzZWxmKS4gQ29uc2lkZXJpbmcKPiArCSAgICAgbm9uLWV4ZWN1dGFibGUgZWRnZXMs IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBwaGlfYmJzLiAgKi8KPiArCSAgZm9yIChiYXNpY19ibG9j ayBwaGlfYmIgOiBnZXRfZG9taW5hdGVkX2J5IChDRElfRE9NSU5BVE9SUywgcCkpCj4gKwkgICAg ewo+ICsJICAgICAgaWYgKCFkb21pbmF0ZWRfYnlfcF93X3VuZXggKGJiLCBwaGlfYmIsIGZhbHNl KSkKPiArCQljb250aW51ZTsKPiArCSAgICAgIC8qIFByb2Nlc3MgUEhJcywgcnVsZSBvdXQgaW5j b21pbmcgZWRnZXMgdGhhdCBkZWZpbml0ZWx5IGNvbWUKPiArCQkgZnJvbSBwLT5iYjEuICBJZiB0 aGVyZSdzIGEgc2luZ2xlIFBISSBhcmd1bWVudCBYIGxlZnQsIHJlY29yZAo+ICsJCSB0aGUgZXF1 aXZhbGVuY2Ugb2YgWCBhbmQgUEhJIHJlc3VsdCBhdCBlZGdlIGUuICAqLwo+ICsJICAgICAgZm9y IChncGhpX2l0ZXJhdG9yIGdzaSA9IGdzaV9zdGFydF9ub252aXJ0dWFsX3BoaXMgKHBoaV9iYik7 Cj4gKwkJICAgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHRfbm9udmlydHVhbF9waGkgKCZnc2kp KQo+ICsJCXsKPiArCQkgIGdwaGkgKnBoaSA9IGdzaS5waGkgKCk7Cj4gKwkJICB0cmVlIGVxdWl2 ID0gTlVMTF9UUkVFOwo+ICsJCSAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGdpbXBsZV9waGlf bnVtX2FyZ3MgKHBoaSk7ICsraikKPiArCQkgICAgewo+ICsJCSAgICAgIGVkZ2UgaW4gPSBnaW1w bGVfcGhpX2FyZ19lZGdlIChwaGksIGopOwo+ICsJCSAgICAgIGlmIChpbi0+c3JjID09IGJiMQo+ ICsJCQkgIHx8IGRvbWluYXRlZF9ieV9wX3dfdW5leCAoaW4tPnNyYywgYmIxLCBmYWxzZSkpCj4g KwkJCS8qIERlZmluaXRlbHkgY29tZXMgZnJvbSBwLT5iYjEuICAqLwo+ICsJCQljb250aW51ZTsK PiArCQkgICAgICB0cmVlIGFyZyA9IHZuX3ZhbHVlaXplIChnaW1wbGVfcGhpX2FyZ19kZWYgKHBo aSwgaikpOwo+ICsJCSAgICAgIGlmIChlcXVpdiAmJiBlcXVpdiAhPSBhcmcpCj4gKwkJCXsKPiAr CQkJICBlcXVpdiA9IE5VTExfVFJFRTsKPiArCQkJICBicmVhazsKPiArCQkJfQo+ICsJCSAgICAg IGVxdWl2ID0gYXJnOwo+ICsJCSAgICB9Cj4gKwkJICBpZiAoZXF1aXYpCj4gKwkJICAgIHZhbF9l cXVpdl9pbnNlcnQgKGVxdWl2LCBQSElfUkVTVUxUIChwaGkpLCBlKTsKPiArCQl9Cj4gKwkgICAg fQo+ICsJfQo+ICsgICAgfQo+ICt9Cj4gKwo+ICsvKiBSZWNvcmQgdGVtcG9yYXJ5IGVxdWl2YWxl bmNlcyBnZW5lcmF0ZWQgYnkgUEhJIG5vZGVzLCBhbmQgYXJlIHZhbGlkIHdoZW4KPiArICAgQkIn cyBvdXRnb2luZyBlZGdlIEUgaXMgdGFrZW4uICBDT0RFLCBPUFMgYW5kIFJFU1VMVCBhcmUgdGhl IGNvbmRpdGlvbiBhbmQKPiArICAgcmVzdWx0IGZvciBFIHRvIGJlIHRha2VuLiAgVk5PIGNvbnRh aW5zIHRoZSBjb25kaXRpb24ncyByZXN1bHRzIHJlY29yZGVkIGluCj4gKyAgIG5hcnkgbWFwLgo+ ICsKPiArICAgVGhlIGlkZWEgaXMgdG8gZmluZCBhIGNvbmZsaWN0aW5nIHByZWRpY2F0ZSBhdCBz b21lIGxvY2F0aW9uIEwsIHdoZXJlIEwncwo+ICsgICBwcmVkZWNlc3NvciBQIGRvbWluYXRlcyBC Qiwgc28gd2Uga25vdyBwYXRoIFAtPkwgd2lsbCBub3QgYmUgdGFrZW4gaWYgRSBpcwo+ICsgICB0 YWtlbi4gIElmIGJ5IHJ1bGluZyBvdXQgUC0+TCBjYW4gZ2VuZXJhdGUgc29tZSBlcXVpdmFsZW5j ZXMsIHJlY29yZCB0aGVtIGF0Cj4gKyAgIEUtPmRlc3QuICAqLwo+ICsKPiArc3RhdGljIHZvaWQK PiArcmVjb3JkX2VxdWl2X2Zyb21fcHJldl9waGkgKHZuX25hcnlfb3BfdCB2bm8sIGVkZ2UgZSwg YmFzaWNfYmxvY2sgYmIsCj4gKwkJCSAgICB0cmVlX2NvZGUgY29kZSwgdHJlZSAqb3BzLCB0cmVl IHJlc3VsdCkKPiArewo+ICsgIGlmICghdm5fdHJhY2tpbmdfZWRnZSAoZSkpCj4gKyAgICByZXR1 cm47Cj4gKyAgdHJlZSByZXZlcnNlCj4gKyAgICA9IHJlc3VsdCA9PSBib29sZWFuX3RydWVfbm9k ZSA/IGJvb2xlYW5fZmFsc2Vfbm9kZSA6IGJvb2xlYW5fdHJ1ZV9ub2RlOwo+ICsgIHJlY29yZF9l cXVpdl9mcm9tX3ByZXZfcGhpXzEgKHZubywgZSwgYmIsIHJldmVyc2UpOwo+ICsKPiArICAvKiBG b3IgcHJlZGljYXRlcyBsaWtlICJhPT1iIGlzIGZhbHNlIiBvciAiYSE9YiBpcyB0cnVlIiwgY29u ZmxpY3RpbmcgcmVzdWx0cwo+ICsgICAgIGFyZSBlcXVpdmFsZW5jZXMsIGkuZS4gIk5PX09QIChh KSBpcyBiIiBvciAiTk9fT1AgKGIpIGlzIGEiLiAgKi8KPiArICBpZiAoKHJlc3VsdCA9PSBib29s ZWFuX3RydWVfbm9kZQo+ICsgICAgICAgJiYgKGNvZGUgPT0gTkVfRVhQUiB8fCBjb2RlID09IEdU X0VYUFIgfHwgY29kZSA9PSBMVF9FWFBSKSkKPiArICAgICAgfHwgKHJlc3VsdCA9PSBib29sZWFu X2ZhbHNlX25vZGUgJiYgY29kZSA9PSBFUV9FWFBSKSkKPiArICAgIHsKPiArICAgICAgdm5fbmFy eV9vcF90IHZucmVzdWx0Owo+ICsgICAgICBpZiAoVFJFRV9DT0RFIChvcHNbMF0pID09IFNTQV9O QU1FKQo+ICsJewo+ICsJICB2bl9uYXJ5X29wX2xvb2t1cF9waWVjZXMgKDEsIE5PUF9FWFBSLCBU UkVFX1RZUEUgKG9wc1swXSksIG9wcywKPiArCQkJCSAgICAmdm5yZXN1bHQpOwo+ICsJICByZWNv cmRfZXF1aXZfZnJvbV9wcmV2X3BoaV8xICh2bnJlc3VsdCwgZSwgYmIsIG9wc1sxXSk7Cj4gKwl9 Cj4gKyAgICAgIGlmIChUUkVFX0NPREUgKG9wc1sxXSkgPT0gU1NBX05BTUUpCj4gKwl7Cj4gKwkg IHZuX25hcnlfb3BfbG9va3VwX3BpZWNlcyAoMSwgTk9QX0VYUFIsIFRSRUVfVFlQRSAob3BzWzFd KSwgJm9wc1sxXSwKPiArCQkJCSAgICAmdm5yZXN1bHQpOwo+ICsJICByZWNvcmRfZXF1aXZfZnJv bV9wcmV2X3BoaV8xICh2bnJlc3VsdCwgZSwgYmIsIG9wc1swXSk7Cj4gKwl9Cj4gKyAgICB9Cj4g IH0KPiAgCj4gIC8qIEluc2VydCB0aGUgcmhzIG9mIFNUTVQgaW50byB0aGUgY3VycmVudCBoYXNo IHRhYmxlIHdpdGggYSB2YWx1ZSBudW1iZXIgb2YKPiBAQCAtNTE0OSw4ICs1NTYxLDI1IEBAIHN0 YXRpYyBib29sCj4gIHZpc2l0X25hcnlfb3AgKHRyZWUgbGhzLCBnYXNzaWduICpzdG10KQo+ICB7 Cj4gICAgdm5fbmFyeV9vcF90IHZucmVzdWx0Owo+IC0gIHRyZWUgcmVzdWx0ID0gdm5fbmFyeV9v cF9sb29rdXBfc3RtdCAoc3RtdCwgJnZucmVzdWx0KTsKPiAtICBpZiAoISByZXN1bHQgJiYgdm5y ZXN1bHQpCj4gKyAgdW5zaWduZWQgbGVuZ3RoID0gdm5fbmFyeV9sZW5ndGhfZnJvbV9zdG10IChz dG10KTsKPiArICB2bl9uYXJ5X29wX3Qgdm5vCj4gKyAgICA9IFhBTExPQ0FWQVIgKHN0cnVjdCB2 bl9uYXJ5X29wX3MsIHNpemVvZl92bl9uYXJ5X29wIChsZW5ndGgpKTsKPiArICBpbml0X3ZuX25h cnlfb3BfZnJvbV9zdG10ICh2bm8sIHN0bXQpOwo+ICsgIHRyZWUgcmVzdWx0ID0gTlVMTF9UUkVF Owo+ICsgIC8qIFRyeSB0byBnZXQgYSBzaW1wbGlmaWVkIHJlc3VsdC4gICovCj4gKyAgLyogRG8g bm90IHNpbXBsaWZ5IHZhcmlhYmxlIHVzZWQgaW4gUEhJIGF0IGxvb3AgZXhpdCwgb3IKPiArICAg ICBzaW1wbGlmeV9wZWVsZWRfY2hyZWMvY29uc3RhbnRfYWZ0ZXJfcGVlbGluZyBtYXkgbWlzcyB0 aGUgbG9vcC4gICovCj4gKyAgZ2ltcGxlICp1c2Vfc3RtdDsKPiArICB1c2Vfb3BlcmFuZF9wIHVz ZV9wOwo+ICsgIGlmICghKHNpbmdsZV9pbW1fdXNlIChsaHMsICZ1c2VfcCwgJnVzZV9zdG10KQo+ ICsJJiYgZ2ltcGxlX2NvZGUgKHVzZV9zdG10KSA9PSBHSU1QTEVfUEhJCj4gKwkmJiBzaW5nbGVf c3VjY19wIChnaW1wbGVfYmIgKHVzZV9zdG10KSkKPiArCSYmIChzaW5nbGVfc3VjY19lZGdlIChn aW1wbGVfYmIgKHVzZV9zdG10KSktPmZsYWdzICYgRURHRV9ERlNfQkFDSykpKQo+ICsgICAgcmVz dWx0ID0gZm9sZF9jb25zdF9mcm9tX2VxdWl2X2hlYWRzICh2bm8tPmxlbmd0aCwgdm5vLT5vcGNv ZGUsIHZuby0+b3AsCj4gKwkJCQkJICB2bm8tPnR5cGUpOwoKY29weSBwcm9wYWdhdGluZyBjb25k aXRpb25hbCBlcXVpdmFsZW5jZXMgaGFzIHByb3ZlZCBwcm9ibGVtYXRpYywgd2h5CmRvIHRoaXMg YXQgYWxsIHdoZW4gdGhlcmUncyBubyBhY3R1YWwgc2ltcGxpZmljYXRpb24/ICBJdCdzIGEgYml0 IG9kZCB0aGF0CndlIG5lZWQgYSBzcGVjaWFsIGZvbGRfY29uc3RfZnJvbV9lcXVpdl9oZWFkcyBo ZXJlLCB3aHkgaXMgZ2VuZXJhbAp2YWx1ZWl6YXRpb24gbm90IGhhbmRsaW5nIGVxdWl2YWxlbmNl cz8gIEFyZSB0aGV5IHN1cHBvc2VkIHRvIGJlIG9ubHkKdXNlZCBmb3Igc2ltcGxpZnlpbmcgY29u ZGl0aW9uYWxzPwoKPiArICBpZiAoIXJlc3VsdCkKPiArICAgIHJlc3VsdCA9IHZuX25hcnlfb3Bf bG9va3VwXzEgKHZubywgJnZucmVzdWx0KTsKPiArICBpZiAoIXJlc3VsdCAmJiB2bnJlc3VsdCkK PiAgICAgIHJlc3VsdCA9IHZuX25hcnlfb3BfZ2V0X3ByZWRpY2F0ZWRfdmFsdWUgKHZucmVzdWx0 LCBnaW1wbGVfYmIgKHN0bXQpKTsKPiAgICBpZiAocmVzdWx0KQo+ICAgICAgcmV0dXJuIHNldF9z c2FfdmFsX3RvIChsaHMsIHJlc3VsdCk7Cj4gQEAgLTc1NjAsMTIgKzc5ODksOCBAQCBpbnNlcnRf cmVsYXRlZF9wcmVkaWNhdGVzX29uX2VkZ2UgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHRyZWUgKm9w cywgZWRnZSBwcmVkX2UpCj4gIAkJCQkJICAgb3BzLCBib29sZWFuX2ZhbHNlX25vZGUsIDAsIHBy ZWRfZSk7Cj4gICAgICAgIGJyZWFrOwo+ICAgICAgY2FzZSBFUV9FWFBSOgo+IC0gICAgICAvKiBh ID09IGIgLT4gISBhIHs8LD59IGIgKi8KPiAtICAgICAgdm5fbmFyeV9vcF9pbnNlcnRfcGllY2Vz X3ByZWRpY2F0ZWQgKDIsIExUX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2RlLAo+IC0JCQkJCSAgIG9w cywgYm9vbGVhbl9mYWxzZV9ub2RlLCAwLCBwcmVkX2UpOwo+IC0gICAgICB2bl9uYXJ5X29wX2lu c2VydF9waWVjZXNfcHJlZGljYXRlZCAoMiwgR1RfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsCj4g LQkJCQkJICAgb3BzLCBib29sZWFuX2ZhbHNlX25vZGUsIDAsIHByZWRfZSk7Cj4gLSAgICAgIGJy ZWFrOwo+ICsgICAgICAvKiBObyBuZWVkIHRvIGluc2VydCBkZXJpdmVkIHByZWRpY2F0ZXMgZm9y ICc9PScsIGFzIHRoZXkgY2FuIGJlIGNvbXB1dGVkCj4gKwkgYnkgZXF1aXYtaGVhZHMgJiBmb2xk X2NvbnN0X2Zyb21fZXF1aXZfaGVhZHMuICAqLwo+ICAgICAgY2FzZSBMRV9FWFBSOgo+ICAgICAg Y2FzZSBHRV9FWFBSOgo+ICAgICAgY2FzZSBORV9FWFBSOgo+IEBAIC03NzAzLDYgKzgxMjgsNyBA QCBwcm9jZXNzX2JiIChycG9fZWxpbSAmYXZhaWwsIGJhc2ljX2Jsb2NrIGJiLAo+ICAJICAgIH0K PiAgCX0KPiAgICAgIH0KPiArICBib29sIGNoYW5nZWQgPSBmYWxzZTsKPiAgICBmb3IgKGdpbXBs ZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdzaV9zdGFydF9iYiAoYmIpOwo+ICAgICAgICAgIWdzaV9l bmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZnc2kpKQo+ICAgICAgewo+IEBAIC03NzI1LDMxICs4MTUx LDM4IEBAIHByb2Nlc3NfYmIgKHJwb19lbGltICZhdmFpbCwgYmFzaWNfYmxvY2sgYmIsCj4gIAkg ICAgIHRoZSB2aXNpdGVkIGZsYWcgaW4gU1NBX1ZBTC4gICovCj4gIAl9Cj4gIAo+IC0gICAgICB2 aXNpdF9zdG10IChnc2lfc3RtdCAoZ3NpKSk7Cj4gKyAgICAgIGNoYW5nZWQgfD0gdmlzaXRfc3Rt dCAoZ3NpX3N0bXQgKGdzaSkpOwo+ICAKPiAgICAgICAgZ2ltcGxlICpsYXN0ID0gZ3NpX3N0bXQg KGdzaSk7Cj4gICAgICAgIGUgPSBOVUxMOwo+ICAgICAgICBzd2l0Y2ggKGdpbXBsZV9jb2RlIChs YXN0KSkKPiAgCXsKPiAgCWNhc2UgR0lNUExFX1NXSVRDSDoKPiArCSAgLyogVE9ETzogdXRpbGl6 ZSB0ZW1wb3JhcnkgZXF1aXZhbGVuY2VzLiAgKi8KPiAgCSAgZSA9IGZpbmRfdGFrZW5fZWRnZSAo YmIsIHZuX3ZhbHVlaXplIChnaW1wbGVfc3dpdGNoX2luZGV4Cj4gIAkJCQkJCShhc19hIDxnc3dp dGNoICo+IChsYXN0KSkpKTsKPiAgCSAgYnJlYWs7Cj4gIAljYXNlIEdJTVBMRV9DT05EOgo+ICAJ ICB7Cj4gLQkgICAgdHJlZSBsaHMgPSB2bl92YWx1ZWl6ZSAoZ2ltcGxlX2NvbmRfbGhzIChsYXN0 KSk7Cj4gLQkgICAgdHJlZSByaHMgPSB2bl92YWx1ZWl6ZSAoZ2ltcGxlX2NvbmRfcmhzIChsYXN0 KSk7Cj4gLQkgICAgdHJlZSB2YWwgPSBnaW1wbGVfc2ltcGxpZnkgKGdpbXBsZV9jb25kX2NvZGUg KGxhc3QpLAo+IC0JCQkJCWJvb2xlYW5fdHlwZV9ub2RlLCBsaHMsIHJocywKPiAtCQkJCQlOVUxM LCB2bl92YWx1ZWl6ZSk7Cj4gKwkgICAgdHJlZSBsaHMgPSBsb29rdXBfZXF1aXZfaGVhZCAoZ2lt cGxlX2NvbmRfbGhzIChsYXN0KSwgYmIpOwo+ICsJICAgIHRyZWUgcmhzID0gbG9va3VwX2VxdWl2 X2hlYWQgKGdpbXBsZV9jb25kX3JocyAobGFzdCksIGJiKTsKPiArCSAgICB0cmVlIG9wc1syXTsK PiArCSAgICBvcHNbMF0gPSBsaHM7Cj4gKwkgICAgb3BzWzFdID0gcmhzOwo+ICsJICAgIHRyZWUg dmFsID0gZm9sZF9jb25zdF9mcm9tX2VxdWl2X2hlYWRzICgyLCBnaW1wbGVfY29uZF9jb2RlIChs YXN0KSwKPiArCQkJCQkJICAgIG9wcywgYm9vbGVhbl90eXBlX25vZGUpOwo+ICsJICAgIGlmICh2 YWwgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCj4gKwkgICAgICB7Cj4gKwkJZnByaW50 ZiAoZHVtcF9maWxlLCAiR290IHNpbXBsaWZpZWQgcmVzdWx0ICIpOwo+ICsJCXByaW50X2dlbmVy aWNfZXhwciAoZHVtcF9maWxlLCB2YWwsIFRERl9OT05FKTsKPiArCQlmcHJpbnRmIChkdW1wX2Zp bGUsICIgZm9yICIpOwo+ICsJCXByaW50X2dpbXBsZV9zdG10IChkdW1wX2ZpbGUsIGxhc3QsIFRE Rl9TTElNKTsKPiArCSAgICAgIH0KPiArCSAgICB2bl9uYXJ5X29wX3Qgdm5yZXN1bHQgPSBOVUxM Owo+ICAJICAgIC8qIElmIHRoZSBjb25kaXRpb24gZGlkbid0IHNpbXBsZnkgc2VlIGlmIHdlIGhh dmUgcmVjb3JkZWQKPiAgCSAgICAgICBhbiBleHByZXNzaW9uIGZyb20gc29mYXIgdGFrZW4gZWRn ZXMuICAqLwo+ICAJICAgIGlmICghIHZhbCB8fCBUUkVFX0NPREUgKHZhbCkgIT0gSU5URUdFUl9D U1QpCj4gIAkgICAgICB7Cj4gLQkJdm5fbmFyeV9vcF90IHZucmVzdWx0Owo+IC0JCXRyZWUgb3Bz WzJdOwo+IC0JCW9wc1swXSA9IGxoczsKPiAtCQlvcHNbMV0gPSByaHM7Cj4gIAkJdmFsID0gdm5f bmFyeV9vcF9sb29rdXBfcGllY2VzICgyLCBnaW1wbGVfY29uZF9jb2RlIChsYXN0KSwKPiAgCQkJ CQkJYm9vbGVhbl90eXBlX25vZGUsIG9wcywKPiAgCQkJCQkJJnZucmVzdWx0KTsKPiBAQCAtNzc4 MCwxNSArODIxMywxNyBAQCBwcm9jZXNzX2JiIChycG9fZWxpbSAmYXZhaWwsIGJhc2ljX2Jsb2Nr IGJiLAo+ICAJCWVudW0gdHJlZV9jb2RlIGNvZGUgPSBnaW1wbGVfY29uZF9jb2RlIChsYXN0KTsK PiAgCQllbnVtIHRyZWVfY29kZSBpY29kZQo+ICAJCSAgPSBpbnZlcnRfdHJlZV9jb21wYXJpc29u IChjb2RlLCBIT05PUl9OQU5TIChsaHMpKTsKPiAtCQl0cmVlIG9wc1syXTsKPiAtCQlvcHNbMF0g PSBsaHM7Cj4gLQkJb3BzWzFdID0gcmhzOwo+ICAJCWlmIChkb19yZWdpb24KPiAgCQkgICAgJiYg Yml0bWFwX2JpdF9wIChleGl0X2JicywgdHJ1ZV9lLT5kZXN0LT5pbmRleCkpCj4gIAkJICB0cnVl X2UgPSBOVUxMOwo+ICAJCWlmIChkb19yZWdpb24KPiAgCQkgICAgJiYgYml0bWFwX2JpdF9wIChl eGl0X2JicywgZmFsc2VfZS0+ZGVzdC0+aW5kZXgpKQo+ICAJCSAgZmFsc2VfZSA9IE5VTEw7Cj4g KwkJaWYgKGNoYW5nZWQgJiYgKHRydWVfZSB8fCBmYWxzZV9lKSkKPiArCQkgIHsKPiArCQkgICAg b3BzWzBdID0gbG9va3VwX2VxdWl2X2hlYWQgKGxocywgYmIpOwo+ICsJCSAgICBvcHNbMV0gPSBs b29rdXBfZXF1aXZfaGVhZCAocmhzLCBiYik7Cj4gKwkJICB9Cj4gIAkJaWYgKHRydWVfZSkKPiAg CQkgIHZuX25hcnlfb3BfaW5zZXJ0X3BpZWNlc19wcmVkaWNhdGVkCj4gIAkJICAgICgyLCBjb2Rl LCBib29sZWFuX3R5cGVfbm9kZSwgb3BzLAo+IEBAIC03ODE3LDYgKzgyNTIsMTUgQEAgcHJvY2Vz c19iYiAocnBvX2VsaW0gJmF2YWlsLCBiYXNpY19ibG9jayBiYiwKPiAgCQkgICAgaWYgKGZhbHNl X2UpCj4gIAkJICAgICAgaW5zZXJ0X3JlbGF0ZWRfcHJlZGljYXRlc19vbl9lZGdlIChpY29kZSwg b3BzLCBmYWxzZV9lKTsKPiAgCQkgIH0KPiArCj4gKwkJLyogVHJ5IHRvIHJlY29yZCBlcXVpdmFs ZW5jZXMgZ2VuZXJhdGVkIGJ5IHByZXZpb3VzIFBISSBub2Rlcwo+ICsJCSAgICBvbiBjdXJyZW50 IHRydWUgJiBmYWxzZSBlZGdlcy4gICovCj4gKwkJaWYgKHRydWVfZSkKPiArCQkgIHJlY29yZF9l cXVpdl9mcm9tX3ByZXZfcGhpICh2bnJlc3VsdCwgdHJ1ZV9lLCBiYiwgY29kZSwgb3BzLAo+ICsJ CQkJCSAgICAgIGJvb2xlYW5fdHJ1ZV9ub2RlKTsKPiArCQlpZiAoZmFsc2VfZSkKPiArCQkgIHJl Y29yZF9lcXVpdl9mcm9tX3ByZXZfcGhpICh2bnJlc3VsdCwgZmFsc2VfZSwgYmIsIGNvZGUsIG9w cywKPiArCQkJCQkgICAgICBib29sZWFuX2ZhbHNlX25vZGUpOwo+ICAJICAgICAgfQo+ICAJICAg IGJyZWFrOwo+ICAJICB9Cj4gQEAgLTc5MzksNiArODM4Myw3IEBAIHN0cnVjdCB1bndpbmRfc3Rh dGUKPiAgICB2bl9waGlfdCBwaGlfdG9wOwo+ICAgIHZuX25hcnlfb3BfdCBuYXJ5X3RvcDsKPiAg ICB2bl9hdmFpbCAqYXZhaWxfdG9wOwo+ICsgIG5hcnlfcmVmICpuYXJ5X3JlZl90b3A7Cj4gIH07 Cj4gIAo+ICAvKiBVbndpbmQgdGhlIFJQTyBWTiBzdGF0ZSBmb3IgaXRlcmF0aW9uLiAgKi8KPiBA QCAtNzk4OCw2ICs4NDMzLDE3IEBAIGRvX3Vud2luZCAodW53aW5kX3N0YXRlICp0bywgcnBvX2Vs aW0gJmF2YWlsKQo+ICAgICAgICBhdi0+bmV4dCA9IGF2YWlsLm1fYXZhaWxfZnJlZWxpc3Q7Cj4g ICAgICAgIGF2YWlsLm1fYXZhaWxfZnJlZWxpc3QgPSBhdjsKPiAgICAgIH0KPiArICAvKiBEcmFp biBuYXJ5X3JlZnMgdG8gZnJlZWxpc3QsIHRvIHJldXNlIHRoZSBtZW1vcnkuICAqLwo+ICsgIGZv ciAoOyBsYXN0X3B1c2hlZF9uYXJ5X3JlZiAmJiBsYXN0X3B1c2hlZF9uYXJ5X3JlZi0+cmVmICE9 IHRvLT5uYXJ5X3JlZl90b3A7KQo+ICsgICAgewo+ICsgICAgICB2bl9zc2FfYXV4X3QgdmFsID0g bGFzdF9wdXNoZWRfbmFyeV9yZWY7Cj4gKyAgICAgIG5hcnlfcmVmICpyZWYgPSB2YWwtPnJlZjsK PiArICAgICAgdmFsLT5yZWYgPSByZWYtPm5leHQ7Cj4gKyAgICAgIGxhc3RfcHVzaGVkX25hcnlf cmVmID0gcmVmLT5uZXh0X3VuZG87Cj4gKyAgICAgIHJlZi0+bmV4dCA9IG5hcnlfcmVmX2ZyZWVs aXN0Owo+ICsgICAgICBuYXJ5X3JlZl9mcmVlbGlzdCA9IHJlZjsKPiArICAgICAgLS12YWwtPm51 bV9uYXJ5X3JlZjsKPiArICAgIH0KPiAgfQo+ICAKPiAgLyogRG8gVk4gb24gYSBTRU1FIHJlZ2lv biBzcGVjaWZpZWQgYnkgRU5UUlkgYW5kIEVYSVRfQkJTIGluIEZOLgo+IEBAIC04MTAyLDYgKzg1 NTgsOCBAQCBkb19ycG9fdm5fMSAoZnVuY3Rpb24gKmZuLCBlZGdlIGVudHJ5LCBiaXRtYXAgZXhp dF9iYnMsCj4gICAgbGFzdF9pbnNlcnRlZF9waGkgPSBOVUxMOwo+ICAgIGxhc3RfaW5zZXJ0ZWRf bmFyeSA9IE5VTEw7Cj4gICAgbGFzdF9wdXNoZWRfYXZhaWwgPSBOVUxMOwo+ICsgIGxhc3RfcHVz aGVkX25hcnlfcmVmID0gTlVMTDsKPiArICBuYXJ5X3JlZl9mcmVlbGlzdCA9IE5VTEw7Cj4gIAo+ ICAgIHZuX3ZhbHVlaXplID0gcnBvX3ZuX3ZhbHVlaXplOwo+ICAKPiBAQCAtODE5Niw2ICs4NjU0 LDggQEAgZG9fcnBvX3ZuXzEgKGZ1bmN0aW9uICpmbiwgZWRnZSBlbnRyeSwgYml0bWFwIGV4aXRf YmJzLAo+ICAJICAgIHJwb19zdGF0ZVtpZHhdLm5hcnlfdG9wID0gbGFzdF9pbnNlcnRlZF9uYXJ5 Owo+ICAJICAgIHJwb19zdGF0ZVtpZHhdLmF2YWlsX3RvcAo+ICAJICAgICAgPSBsYXN0X3B1c2hl ZF9hdmFpbCA/IGxhc3RfcHVzaGVkX2F2YWlsLT5hdmFpbCA6IE5VTEw7Cj4gKwkgICAgcnBvX3N0 YXRlW2lkeF0ubmFyeV9yZWZfdG9wCj4gKwkgICAgICA9IGxhc3RfcHVzaGVkX25hcnlfcmVmID8g bGFzdF9wdXNoZWRfbmFyeV9yZWYtPnJlZiA6IE5VTEw7Cj4gIAkgIH0KPiAgCj4gIAlpZiAoIShi Yi0+ZmxhZ3MgJiBCQl9FWEVDVVRBQkxFKSkKPiBkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtc3NhLXNj Y3ZuLmggYi9nY2MvdHJlZS1zc2Etc2Njdm4uaAo+IGluZGV4IGFiY2Y3ZTY2NmMyLi5iYmE3YTYw N2RmYiAxMDA2NDQKPiAtLS0gYS9nY2MvdHJlZS1zc2Etc2Njdm4uaAo+ICsrKyBiL2djYy90cmVl LXNzYS1zY2N2bi5oCj4gQEAgLTIxNyw2ICsyMTcsMTYgQEAgc3RydWN0IHZuX2F2YWlsCj4gICAg c3RydWN0IHZuX3NzYV9hdXggKm5leHRfdW5kbzsKPiAgfTsKPiAgCj4gKy8qIEluIHZuX3NzYV9h dXggc3RydWN0dXJlLCBob2xkIGEgbGlzdHMgb2YgcmVmZXJlbmNlcyB0byB0aGUgbmFyeSBtYXAg ZW50cmllcywKPiArICAgc28gdGhhdCB3aGVuIHJlY29yZGluZyBuZXcgZXF1aXZhbGVuY2UgdG8g dGhlIHZhbHVlIG51bWJlciwgd2UgY2FuIHJlLWluc2VydAo+ICsgICBleHByZXNzaW9ucycgcmVz dWx0cyBiYXNlZCBvbiB0aGlzLiAgKi8KPiArc3RydWN0IG5hcnlfcmVmCj4gK3sKPiArICBuYXJ5 X3JlZiAqbmV4dDsKPiArICB2bl9uYXJ5X29wX3Qgc2xvdDsKPiArICBzdHJ1Y3Qgdm5fc3NhX2F1 eCAqbmV4dF91bmRvOwo+ICt9Owo+ICsKPiAgdHlwZWRlZiBzdHJ1Y3Qgdm5fc3NhX2F1eAo+ICB7 Cj4gICAgLyogU1NBIG5hbWUgdGhpcyB2bl9zc2FfYXV4IGlzIGFzc29jaWF0ZWQgd2l0aCBpbiB0 aGUgbGF0dGljZS4gICovCj4gQEAgLTIzMCw5ICsyNDAsMTUgQEAgdHlwZWRlZiBzdHJ1Y3Qgdm5f c3NhX2F1eAo+ICAgICAgIGZvciBTU0EgbmFtZXMgYWxzbyBzZXJ2aW5nIGFzIHZhbHVlcyAoTkFN RSA9PSBWQUxOVU0pLiAgKi8KPiAgICB2bl9hdmFpbCAqYXZhaWw7Cj4gIAo+ICsgIC8qIFJlZmVy ZW5jZXMgdG8gc2xvdHMgaW4gdGhlIG5hcnkgbWFwLCB3aXRoIFZBTE5VTSBhcyBvcGVyYW5kLiAg Ki8KPiArICBuYXJ5X3JlZiAqcmVmOwo+ICsKPiAgICAvKiBVbmlxdWUgaWRlbnRpZmllciB0aGF0 IGFsbCBleHByZXNzaW9ucyB3aXRoIHRoZSBzYW1lIHZhbHVlIGhhdmUuICovCj4gICAgdW5zaWdu ZWQgaW50IHZhbHVlX2lkOwo+ICAKPiArICAvKiBuYXJ5X3JlZiBjb3VudC4gICovCj4gKyAgdW5z aWduZWQgc2hvcnQgbnVtX25hcnlfcmVmOwo+ICsKPiAgICAvKiBXaGV0aGVyIHRoZSBTU0FfTkFN RSBoYXMgYmVlbiBwcm9jZXNzZWQgYXQgbGVhc3Qgb25jZS4gICovCj4gICAgdW5zaWduZWQgdmlz aXRlZCA6IDE7Cj4gIAo= --0000000000007675bc05e94350b4--