From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by sourceware.org (Postfix) with ESMTPS id 1C7553895FE1 for ; Tue, 15 Nov 2022 13:46:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1C7553895FE1 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wm1-x329.google.com with SMTP id 5so9704327wmo.1 for ; Tue, 15 Nov 2022 05:46:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=Gq6ruaXtqSgRCB1B3j8luIEukIZbXOSpdwQSz0zNc2k=; b=G+ReXL7fmvXiRZdkwAQm3bYCo44IOjVQIl7uk+1HjyR3/3lONX5a8gxBOYcGYiZGoA m978ZgM+HhvBB+UqKDI1tetmXZn97wmkgPjJCIvLhIkP4on9EzbUbtuX3qSmIWcJaxyQ 47NkD2VahY252O40hSbM5A3TNXidE9KhGWrSkJmpVZP9D/GWDaiETSgMLXsfnF6ZtfXR 42Me7UTPl4uUVAg+/79NXXwtvlG2aakkMBSBlrMNJX3i4vOmZyXcdJFWlMvjEkFqQGkG YyAUyp/2GapF/8/EWk42YnIvCAr/6yGLypSXzqsrbt5bCyVRh8CITdepe2hpSaod/UEM dAAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Gq6ruaXtqSgRCB1B3j8luIEukIZbXOSpdwQSz0zNc2k=; b=u2Bu5FLCfaxhPYAPqXsqq2Rzti86u51yJkEyRvUMSPx5iyLQ6L6x89fKDeLGR6lwo5 NomJvvz4LaJr28ujReaSbCqv2upKqpFErNcQJK+XPiFEf3YsvOh0BRTfVg7+ZwsS4LOP icQ2gYNyViKhceNaYplc5zvUBntZ7pbABiyFQpz7XXWP/ZV88IJ61lnu82Mnm8rBCGnG y9uJW1+0Ucy3Fx/sRchrMEJMFaSwos/DYlcY+Iydzz42H8HBbDBqgsTa/vWSgngR7ic0 jwJblQbVVDbe+tnI0et2R8WyFnbPdteEbNftfOb+5vilY+WSSI3FwTj607fOm5JtYAmy eHBQ== X-Gm-Message-State: ANoB5pklrYIkIfsJwWqN34y0kLhw5FDhe470+PPjRPgyQAvibwKL1TI6 NSnHX7zon5DnwAWGr0sGPrJb X-Google-Smtp-Source: AA0mqf6IiO7OyY5oMAwGZLUaIV4MKaAm89K0v+OEOC9zyavStizGFtj7jKgWLxDaHmW14/xhOzWnfw== X-Received: by 2002:a7b:c40a:0:b0:3cf:b1c2:c92c with SMTP id k10-20020a7bc40a000000b003cfb1c2c92cmr1564520wmi.193.1668520011129; Tue, 15 Nov 2022 05:46:51 -0800 (PST) Received: from ?IPV6:2001:861:5e4c:3bb0:6424:328a:1734:3249? ([2001:861:5e4c:3bb0:6424:328a:1734:3249]) by smtp.gmail.com with ESMTPSA id bv13-20020a0560001f0d00b0022cce7689d3sm9093230wrb.36.2022.11.15.05.46.50 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 15 Nov 2022 05:46:50 -0800 (PST) Message-ID: Date: Tue, 15 Nov 2022 14:49:53 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org, 90.abbasfaisal@gmail.com References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-39-arthur.cohen@embecosm.com> From: Arthur Cohen Autocrypt: addr=arthur.cohen@embecosm.com; keydata= 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 Subject: Re: [PATCH Rust front-end v3 38/46] gccrs: Add HIR to GCC GENERIC lowering entry point In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------7BxEAyKzfoksLaXzE90ZRp08" X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,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: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------7BxEAyKzfoksLaXzE90ZRp08 Content-Type: multipart/mixed; boundary="------------rTp5U7w0O6QsNbIgDyMv7KVt"; protected-headers="v1" From: Arthur Cohen To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org, 90.abbasfaisal@gmail.com Message-ID: Subject: Re: [PATCH Rust front-end v3 38/46] gccrs: Add HIR to GCC GENERIC lowering entry point References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-39-arthur.cohen@embecosm.com> In-Reply-To: --------------rTp5U7w0O6QsNbIgDyMv7KVt Content-Type: multipart/mixed; boundary="------------MTeKvnkCaOChoCrgeUGSKZOp" --------------MTeKvnkCaOChoCrgeUGSKZOp Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 DQoNCk9uIDExLzkvMjIgMTQ6NTMsIFJpY2hhcmQgQmllbmVyIHdyb3RlOg0KPiBPbiBXZWQs IE9jdCAyNiwgMjAyMiBhdCAxMDozNyBBTSA8YXJ0aHVyLmNvaGVuQGVtYmVjb3NtLmNvbT4g d3JvdGU6DQo+Pg0KPj4gRnJvbTogUGhpbGlwIEhlcnJvbiA8cGhpbGlwLmhlcnJvbkBlbWJl Y29zbS5jb20+DQo+Pg0KPj4gVGhpcyBwYXRjaCBjb250YWlucyB0aGUgZW50cnkgcG9pbnQg YW5kIHV0aWxpdGllcyB1c2VkIGZvciB0aGUgbG93ZXJpbmcNCj4+IG9mIEhJUiBub2RlcyB0 byBgdHJlZWBzLiBJdCBhbHNvIGNvbnRhaW5zIGEgY29uc3RhbnQgZXZhbHVhdG9yLCBwb3J0 ZWQNCj4+IG92ZXIgZnJvbSB0aGUgQysrIGZyb250ZW5kLg0KPj4NCj4+IENvLWF1dGhvcmVk LWJ5OiBEYXZpZCBGYXVzdCA8ZGF2aWQuZmF1c3RAb3JhY2xlLmNvbT4NCj4+IENvLWF1dGhv cmVkLWJ5OiBGYWlzYWwgQWJiYXMgPDkwLmFiYmFzZmFpc2FsQGdtYWlsLmNvbT4NCj4+IC0t LQ0KPj4gICBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1jb250ZXh0LmNjIHwgMTQ2 ICsrKysrKysrDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWNvbnRleHQu aCAgfCAzNDMgKysrKysrKysrKysrKysrKysrDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVz dC1jb21waWxlLmNjICAgICAgICAgfCA0MTQgKysrKysrKysrKysrKysrKysrKysrDQo+PiAg IGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLmggICAgICAgICAgfCAgNDcgKysrDQo+ PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb25zdGV4cHIuY2MgICAgICAgfCA0NDEgKysr KysrKysrKysrKysrKysrKysrKysNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbnN0 ZXhwci5oICAgICAgICB8ICAzMSArKw0KPj4gICA2IGZpbGVzIGNoYW5nZWQsIDE0MjIgaW5z ZXJ0aW9ucygrKQ0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9y dXN0LWNvbXBpbGUtY29udGV4dC5jYw0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1 c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtY29udGV4dC5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS5jYw0KPj4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUuaA0KPj4gICBjcmVhdGUg bW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbnN0ZXhwci5jYw0KPj4gICBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbnN0ZXhwci5oDQo+ Pg0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWNvbnRl eHQuY2MgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1jb250ZXh0LmNjDQo+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLmNiMmFkZGY2YzIx DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29t cGlsZS1jb250ZXh0LmNjDQo+PiBAQCAtMCwwICsxLDE0NiBAQA0KPj4gKy8vIENvcHlyaWdo dCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0K Pj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBp dCB1bmRlcg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIN Cj4+ICsvLyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsv LyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNI QU5UQUJJTElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3Jl IGRldGFpbHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRo IEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1j b21waWxlLWNvbnRleHQuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLXR5cGUuaCIN Cj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNwYWNlIENvbXBpbGUgew0K Pj4gKw0KPj4gK0NvbnRleHQ6OkNvbnRleHQgKDo6QmFja2VuZCAqYmFja2VuZCkNCj4+ICsg IDogYmFja2VuZCAoYmFja2VuZCksIHJlc29sdmVyIChSZXNvbHZlcjo6UmVzb2x2ZXI6Omdl dCAoKSksDQo+PiArICAgIHR5Y3R4IChSZXNvbHZlcjo6VHlwZUNoZWNrQ29udGV4dDo6Z2V0 ICgpKSwNCj4+ICsgICAgbWFwcGluZ3MgKEFuYWx5c2lzOjpNYXBwaW5nczo6Z2V0ICgpKSwg bWFuZ2xlciAoTWFuZ2xlciAoKSkNCj4+ICt7DQo+PiArICBzZXR1cF9idWlsdGlucyAoKTsN Cj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbnRleHQ6OnNldHVwX2J1aWx0aW5zICgp DQo+PiArew0KPj4gKyAgYXV0byBidWlsdGlucyA9IHJlc29sdmVyLT5nZXRfYnVpbHRpbl90 eXBlcyAoKTsNCj4+ICsgIGZvciAoYXV0byBpdCA9IGJ1aWx0aW5zLmJlZ2luICgpOyBpdCAh PSBidWlsdGlucy5lbmQgKCk7IGl0KyspDQo+PiArICAgIHsNCj4+ICsgICAgICBIaXJJZCBy ZWY7DQo+PiArICAgICAgYm9vbCBvayA9IHR5Y3R4LT5sb29rdXBfdHlwZV9ieV9ub2RlX2lk ICgoKml0KS0+Z2V0X25vZGVfaWQgKCksICZyZWYpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0 IChvayk7DQo+PiArDQo+PiArICAgICAgVHlUeTo6QmFzZVR5cGUgKmxvb2t1cDsNCj4+ICsg ICAgICBvayA9IHR5Y3R4LT5sb29rdXBfdHlwZSAocmVmLCAmbG9va3VwKTsNCj4+ICsgICAg ICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgICAgIFR5VHlSZXNvbHZlQ29tcGls ZTo6Y29tcGlsZSAodGhpcywgbG9va3VwKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ ICtoYXNodmFsX3QNCj4+ICtDb250ZXh0Ojp0eXBlX2hhc2hlciAodHJlZSB0eXBlKQ0KPj4g K3sNCj4+ICsgIGluY2hhc2g6Omhhc2ggaHN0YXRlOw0KPj4gKw0KPj4gKyAgaHN0YXRlLmFk ZF9pbnQgKFRSRUVfQ09ERSAodHlwZSkpOw0KPj4gKw0KPj4gKyAgaWYgKFRZUEVfTkFNRSAo dHlwZSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBoYXNodmFsX3QgcmVjb3JkX25hbWVfaGFz aA0KPj4gKyAgICAgICA9IElERU5USUZJRVJfSEFTSF9WQUxVRSAoREVDTF9OQU1FIChUWVBF X05BTUUgKHR5cGUpKSk7DQo+PiArICAgICAgaHN0YXRlLmFkZF9vYmplY3QgKHJlY29yZF9u YW1lX2hhc2gpOw0KPj4gKyAgICB9DQo+IA0KPiBUaGUgZm9sbG93aW5nIGRvZXMgbG9vayBh IGJpdCBsaWtlIHR5cGVfaGFzaF9jYW5vbl9oYXNoLiAgSSdsbCBwcm9iYWJseSBzZWUgd2hh dA0KPiB3ZSB1c2UgdHJlZSB0eXBlIGhhc2hpbmcgZm9yLCBqdXN0IHdvbmRlcmluZyBoZXJl Lg0KPiANCj4+ICsgIGZvciAodHJlZSB0ID0gVFlQRV9BVFRSSUJVVEVTICh0eXBlKTsgdDsg dCA9IFRSRUVfQ0hBSU4gKHQpKQ0KPj4gKyAgICAvKiBKdXN0IHRoZSBpZGVudGlmaWVyIGlz IGFkZXF1YXRlIHRvIGRpc3Rpbmd1aXNoLiAgKi8NCj4+ICsgICAgaHN0YXRlLmFkZF9vYmpl Y3QgKElERU5USUZJRVJfSEFTSF9WQUxVRSAoVFJFRV9QVVJQT1NFICh0KSkpOw0KPj4gKw0K Pj4gKyAgc3dpdGNoIChUUkVFX0NPREUgKHR5cGUpKQ0KPj4gKyAgICB7DQo+PiArICAgIGNh c2UgTUVUSE9EX1RZUEU6DQo+PiArICAgICAgaHN0YXRlLmFkZF9vYmplY3QgKFRZUEVfSEFT SCAoVFlQRV9NRVRIT0RfQkFTRVRZUEUgKHR5cGUpKSk7DQo+PiArICAgICAgLyogRkFMTFRI Uk9VR0guICovDQo+PiArICAgIGNhc2UgRlVOQ1RJT05fVFlQRToNCj4+ICsgICAgICBmb3Ig KHRyZWUgdCA9IFRZUEVfQVJHX1RZUEVTICh0eXBlKTsgdDsgdCA9IFRSRUVfQ0hBSU4gKHQp KQ0KPj4gKyAgICAgICBpZiAoVFJFRV9WQUxVRSAodCkgIT0gZXJyb3JfbWFya19ub2RlKQ0K Pj4gKyAgICAgICAgIGhzdGF0ZS5hZGRfb2JqZWN0IChUWVBFX0hBU0ggKFRSRUVfVkFMVUUg KHQpKSk7DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgT0ZGU0VUX1RZ UEU6DQo+PiArICAgICAgaHN0YXRlLmFkZF9vYmplY3QgKFRZUEVfSEFTSCAoVFlQRV9PRkZT RVRfQkFTRVRZUEUgKHR5cGUpKSk7DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAg ICAgY2FzZSBBUlJBWV9UWVBFOiB7DQo+IA0KPiBHQ0MgY29kaW5nIGNvbnZlbnRpb25zIHdv dWxkIHNheSB0aGUgeyBnb2VzIHRvIHRoZSBuZXh0IGxpbmUgYW5kIGluZGVudGVkLg0KPiBU aGUgcnVzdCBGRSBtaWdodCBpbnRlbnRpb25hbGx5IGRpdmVyZ2UgZnJvbSB0aGF0IHN0YW5k YXJkLCBpZiBzbyBhDQo+IHBvaW50ZXIgaW4gc29tZQ0KPiBSRUFETUUgaW4gcnVzdC8gd291 bGQgYmUgaGVscGZ1bC4NCg0KVGhpcyBpcyBub3Qgb3VyIGludGVudGlvbi4gV2Ugd291bGQg bGlrZSB0byBzdGljayB0byB0aGUgR0NDIGNvZGluZyANCmNvbnZlbnRpb24sIGFuZCB1c2Ug YSBgLmNsYW5nLWZvcm1hdGAgZmlsZSB0byBkbyBzbyBhbmQgYXBwbHkgaXQgYmVmb3JlIA0K bWVyZ2luZyBhbnkgY29kZS4gSG93ZXZlciBpdCBjbGVhcmx5IGhhcyBzb21lIGxpbWl0YXRp b25zLiBJJ2xsIGJlIG9uIA0KdGhlIGxvb2tvdXQgZm9yIHRoZXNlIHBhdHRlcm5zIGFuZCBm aXggdGhlbSBieSBoYW5kLCBvciB0cnkgYW5kIGZpZ3VyZSANCm91dCBob3cgdG8gZWRpdCB0 aGUgY2xhbmctZm9ybWF0IGZpbGUuDQoNCj4+ICsgICAgICAgaWYgKFRZUEVfRE9NQUlOICh0 eXBlKSkNCj4+ICsgICAgICAgICBoc3RhdGUuYWRkX29iamVjdCAoVFlQRV9IQVNIIChUWVBF X0RPTUFJTiAodHlwZSkpKTsNCj4+ICsgICAgICAgaWYgKCFBR0dSRUdBVEVfVFlQRV9QIChU UkVFX1RZUEUgKHR5cGUpKSkNCj4+ICsgICAgICAgICB7DQo+PiArICAgICAgICAgICB1bnNp Z25lZCB0eXBlbGVzcyA9IFRZUEVfVFlQRUxFU1NfU1RPUkFHRSAodHlwZSk7DQo+PiArICAg ICAgICAgICBoc3RhdGUuYWRkX29iamVjdCAodHlwZWxlc3MpOw0KPj4gKyAgICAgICAgIH0N Cj4+ICsgICAgICB9DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAgY2FzZSBJ TlRFR0VSX1RZUEU6IHsNCj4+ICsgICAgICAgdHJlZSB0ID0gVFlQRV9NQVhfVkFMVUUgKHR5 cGUpOw0KPj4gKyAgICAgICBpZiAoIXQpDQo+PiArICAgICAgICAgdCA9IFRZUEVfTUlOX1ZB TFVFICh0eXBlKTsNCj4+ICsgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUUkVFX0lOVF9D U1RfTlVOSVRTICh0KTsgaSsrKQ0KPj4gKyAgICAgICAgIGhzdGF0ZS5hZGRfb2JqZWN0IChU UkVFX0lOVF9DU1RfRUxUICh0LCBpKSk7DQo+PiArICAgICAgIGJyZWFrOw0KPj4gKyAgICAg IH0NCj4+ICsNCj4+ICsgICAgY2FzZSBSRUFMX1RZUEU6DQo+PiArICAgICAgY2FzZSBGSVhF RF9QT0lOVF9UWVBFOiB7DQo+PiArICAgICAgIHVuc2lnbmVkIHByZWMgPSBUWVBFX1BSRUNJ U0lPTiAodHlwZSk7DQo+PiArICAgICAgIGhzdGF0ZS5hZGRfb2JqZWN0IChwcmVjKTsNCj4+ ICsgICAgICAgYnJlYWs7DQo+PiArICAgICAgfQ0KPj4gKw0KPj4gKyAgICBjYXNlIFZFQ1RP Ul9UWVBFOg0KPj4gKyAgICAgIGhzdGF0ZS5hZGRfcG9seV9pbnQgKFRZUEVfVkVDVE9SX1NV QlBBUlRTICh0eXBlKSk7DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2Ug UkVDT1JEX1RZUEU6DQo+PiArICAgIGNhc2UgVU5JT05fVFlQRToNCj4+ICsgICAgICBjYXNl IFFVQUxfVU5JT05fVFlQRTogew0KPj4gKyAgICAgICBmb3IgKHRyZWUgdCA9IFRZUEVfRklF TERTICh0eXBlKTsgdDsgdCA9IFRSRUVfQ0hBSU4gKHQpKQ0KPj4gKyAgICAgICAgIHsNCj4+ ICsgICAgICAgICAgIGhhc2h2YWxfdCBuYW1lX2hhc2ggPSBJREVOVElGSUVSX0hBU0hfVkFM VUUgKERFQ0xfTkFNRSAodCkpOw0KPj4gKyAgICAgICAgICAgaGFzaHZhbF90IHR5cGVfaGFz aCA9IHR5cGVfaGFzaGVyIChUUkVFX1RZUEUgKHQpKTsNCj4+ICsgICAgICAgICAgIGhzdGF0 ZS5hZGRfb2JqZWN0IChuYW1lX2hhc2gpOw0KPj4gKyAgICAgICAgICAgaHN0YXRlLmFkZF9v YmplY3QgKHR5cGVfaGFzaCk7DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgIH0NCj4+ICsg ICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgY2FzZSBCT09MRUFOX1RZUEU6DQo+PiArICAg ICAgYnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgUkVGRVJFTkNFX1RZUEU6DQo+PiArICAg ICAgY2FzZSBQT0lOVEVSX1RZUEU6IHsNCj4+ICsgICAgICAgaGFzaHZhbF90IHR5cGVfaGFz aCA9IHR5cGVfaGFzaGVyIChUUkVFX1RZUEUgKHR5cGUpKTsNCj4+ICsgICAgICAgaHN0YXRl LmFkZF9vYmplY3QgKHR5cGVfaGFzaCk7DQo+PiArICAgICAgfQ0KPj4gKyAgICAgIGJyZWFr Ow0KPj4gKw0KPj4gKyAgICBkZWZhdWx0Og0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKyAgICB9 DQo+PiArDQo+PiArICByZXR1cm4gaHN0YXRlLmVuZCAoKTsNCj4+ICt9DQo+PiArDQo+PiAr fSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+IGRp ZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1jb250ZXh0LmggYi9n Y2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1jb250ZXh0LmgNCj4+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uMDk2YjY1ZjhiMzkNCj4+IC0tLSAv ZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWNvbnRl eHQuaA0KPj4gQEAgLTAsMCArMSwzNDMgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAt MjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlz IGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVy c2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkg b3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0K Pj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0 aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2lmbmRlZiBSVVNUX0NPTVBJTEVfQ09OVEVY VA0KPj4gKyNkZWZpbmUgUlVTVF9DT01QSUxFX0NPTlRFWFQNCj4+ICsNCj4+ICsjaW5jbHVk ZSAicnVzdC1zeXN0ZW0uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1oaXItbWFwLmgiDQo+PiAr I2luY2x1ZGUgInJ1c3QtbmFtZS1yZXNvbHZlci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWhp ci10eXBlLWNoZWNrLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtYmFja2VuZC5oIg0KPj4gKyNp bmNsdWRlICJydXN0LWhpci1mdWxsLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtbWFuZ2xlLmgi DQo+PiArI2luY2x1ZGUgInJ1c3QtdHJlZS5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0 IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+PiArDQo+PiArc3RydWN0IGZuY29udGV4 dA0KPj4gK3sNCj4+ICsgIHRyZWUgZm5kZWNsOw0KPj4gKyAgOjpCdmFyaWFibGUgKnJldF9h ZGRyOw0KPj4gK307DQo+PiArDQo+PiArY2xhc3MgQ29udGV4dA0KPj4gK3sNCj4+ICtwdWJs aWM6DQo+PiArICBDb250ZXh0ICg6OkJhY2tlbmQgKmJhY2tlbmQpOw0KPj4gKw0KPj4gKyAg dm9pZCBzZXR1cF9idWlsdGlucyAoKTsNCj4+ICsNCj4+ICsgIGJvb2wgbG9va3VwX2NvbXBp bGVkX3R5cGVzICh0cmVlIHQsIHRyZWUgKnR5cGUpDQo+PiArICB7DQo+PiArICAgIGhhc2h2 YWxfdCBoID0gdHlwZV9oYXNoZXIgKHQpOw0KPj4gKyAgICBhdXRvIGl0ID0gY29tcGlsZWRf dHlwZV9tYXAuZmluZCAoaCk7DQo+PiArICAgIGlmIChpdCA9PSBjb21waWxlZF90eXBlX21h cC5lbmQgKCkpDQo+PiArICAgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgICAqdHlw ZSA9IGl0LT5zZWNvbmQ7DQo+PiArICAgIHJldHVybiB0cnVlOw0KPj4gKyAgfQ0KPj4gKw0K Pj4gKyAgdHJlZSBpbnNlcnRfY29tcGlsZWRfdHlwZSAodHJlZSB0eXBlKQ0KPj4gKyAgew0K Pj4gKyAgICBoYXNodmFsX3QgaCA9IHR5cGVfaGFzaGVyICh0eXBlKTsNCj4+ICsgICAgYXV0 byBpdCA9IGNvbXBpbGVkX3R5cGVfbWFwLmZpbmQgKGgpOw0KPj4gKyAgICBpZiAoaXQgIT0g Y29tcGlsZWRfdHlwZV9tYXAuZW5kICgpKQ0KPj4gKyAgICAgIHJldHVybiBpdC0+c2Vjb25k Ow0KPj4gKw0KPj4gKyAgICBjb21waWxlZF90eXBlX21hcC5pbnNlcnQgKHtoLCB0eXBlfSk7 DQo+PiArICAgIHB1c2hfdHlwZSAodHlwZSk7DQo+PiArICAgIHJldHVybiB0eXBlOw0KPj4g KyAgfQ0KPj4gKw0KPj4gKyAgdHJlZSBpbnNlcnRfbWFpbl92YXJpYW50ICh0cmVlIHR5cGUp DQo+PiArICB7DQo+PiArICAgIGhhc2h2YWxfdCBoID0gdHlwZV9oYXNoZXIgKHR5cGUpOw0K Pj4gKyAgICBhdXRvIGl0ID0gbWFpbl92YXJpYW50cy5maW5kIChoKTsNCj4+ICsgICAgaWYg KGl0ICE9IG1haW5fdmFyaWFudHMuZW5kICgpKQ0KPj4gKyAgICAgIHJldHVybiBpdC0+c2Vj b25kOw0KPj4gKw0KPj4gKyAgICBtYWluX3ZhcmlhbnRzLmluc2VydCAoe2gsIHR5cGV9KTsN Cj4+ICsgICAgcmV0dXJuIHR5cGU7DQo+PiArICB9DQo+PiArDQo+PiArICA6OkJhY2tlbmQg KmdldF9iYWNrZW5kICgpIHsgcmV0dXJuIGJhY2tlbmQ7IH0NCj4+ICsgIFJlc29sdmVyOjpS ZXNvbHZlciAqZ2V0X3Jlc29sdmVyICgpIHsgcmV0dXJuIHJlc29sdmVyOyB9DQo+PiArICBS ZXNvbHZlcjo6VHlwZUNoZWNrQ29udGV4dCAqZ2V0X3R5Y3R4ICgpIHsgcmV0dXJuIHR5Y3R4 OyB9DQo+PiArICBBbmFseXNpczo6TWFwcGluZ3MgKmdldF9tYXBwaW5ncyAoKSB7IHJldHVy biBtYXBwaW5nczsgfQ0KPj4gKw0KPj4gKyAgdm9pZCBwdXNoX2Jsb2NrICh0cmVlIHNjb3Bl KQ0KPj4gKyAgew0KPj4gKyAgICBzY29wZV9zdGFjay5wdXNoX2JhY2sgKHNjb3BlKTsNCj4+ ICsgICAgc3RhdGVtZW50cy5wdXNoX2JhY2sgKHt9KTsNCj4+ICsgIH0NCj4+ICsNCj4+ICsg IHRyZWUgcG9wX2Jsb2NrICgpDQo+PiArICB7DQo+PiArICAgIGF1dG8gYmxvY2sgPSBzY29w ZV9zdGFjay5iYWNrICgpOw0KPj4gKyAgICBzY29wZV9zdGFjay5wb3BfYmFjayAoKTsNCj4+ ICsNCj4+ICsgICAgYXV0byBzdG10cyA9IHN0YXRlbWVudHMuYmFjayAoKTsNCj4+ICsgICAg c3RhdGVtZW50cy5wb3BfYmFjayAoKTsNCj4+ICsNCj4+ICsgICAgYmFja2VuZC0+YmxvY2tf YWRkX3N0YXRlbWVudHMgKGJsb2NrLCBzdG10cyk7DQo+PiArDQo+PiArICAgIHJldHVybiBi bG9jazsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHRyZWUgcGVla19lbmNsb3Npbmdfc2NvcGUg KCkNCj4+ICsgIHsNCj4+ICsgICAgaWYgKHNjb3BlX3N0YWNrLnNpemUgKCkgPT0gMCkNCj4+ ICsgICAgICByZXR1cm4gbnVsbHB0cjsNCj4+ICsNCj4+ICsgICAgcmV0dXJuIHNjb3BlX3N0 YWNrLmJhY2sgKCk7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lkIGFkZF9zdGF0ZW1lbnRf dG9fZW5jbG9zaW5nX3Njb3BlICh0cmVlIHN0bXQpDQo+PiArICB7DQo+PiArICAgIHN0YXRl bWVudHMuYXQgKHN0YXRlbWVudHMuc2l6ZSAoKSAtIDIpLnB1c2hfYmFjayAoc3RtdCk7DQo+ PiArICB9DQo+PiArDQo+PiArICB2b2lkIGFkZF9zdGF0ZW1lbnQgKHRyZWUgc3RtdCkgeyBz dGF0ZW1lbnRzLmJhY2sgKCkucHVzaF9iYWNrIChzdG10KTsgfQ0KPj4gKw0KPj4gKyAgdm9p ZCBpbnNlcnRfdmFyX2RlY2wgKEhpcklkIGlkLCA6OkJ2YXJpYWJsZSAqZGVjbCkNCj4+ICsg IHsNCj4+ICsgICAgY29tcGlsZWRfdmFyX2RlY2xzW2lkXSA9IGRlY2w7DQo+PiArICB9DQo+ PiArDQo+PiArICBib29sIGxvb2t1cF92YXJfZGVjbCAoSGlySWQgaWQsIDo6QnZhcmlhYmxl ICoqZGVjbCkNCj4+ICsgIHsNCj4+ICsgICAgYXV0byBpdCA9IGNvbXBpbGVkX3Zhcl9kZWNs cy5maW5kIChpZCk7DQo+PiArICAgIGlmIChpdCA9PSBjb21waWxlZF92YXJfZGVjbHMuZW5k ICgpKQ0KPj4gKyAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsNCj4+ICsgICAgKmRlY2wgPSBp dC0+c2Vjb25kOw0KPj4gKyAgICByZXR1cm4gdHJ1ZTsNCj4+ICsgIH0NCj4+ICsNCj4+ICsg IHZvaWQgaW5zZXJ0X2Z1bmN0aW9uX2RlY2wgKGNvbnN0IFR5VHk6OkZuVHlwZSAqcmVmLCB0 cmVlIGZuKQ0KPiANCj4gSXQncyBhIGJpdCBjb25mdXNpbmcgdGhhdCBzb21lIG9mIHRoZXNl IGluc2VydC9sb29rdXAgJ3RyZWUnIGRlY2wvdHlwZSBidXQgc29tZQ0KPiBpbnNlcnQvbG9v a3VwIHJ1c3Qgc3BlY2lmaWMgY2xhc3MgaW5zdGFuY2VzLiAgTWF5YmUgaXQgbWFrZXMgc2Vu c2UgdG8gZ3JvdXANCj4gdGhvc2UgbG9naWNhbGx5IHNvbWVob3c/DQo+IA0KDQpJJ2xsIHRy eSBhbmQgZmlndXJlIG91dCBhIHdheSB0byBncm91cCB0aGVtIHRvZ2V0aGVyLiBJZGVhbGx5 LCBpbiB0aGlzIA0KY29udGV4dCwgb25seSBgdHJlZWBzIHNob3VsZCBiZSBsb29rZWQgdXAg b3IgaW5zZXJ0ZWQgYnV0IG1heSBiZSANCnJlZmVyZW5jZWQgdGhyb3VnaHQgdGhlaXIgInJ1 c3QiIEhJUiBub2RlIHRoYXQgd2Ugc3RpbGwga2VlcCBhdCB0aGlzIA0KcG9pbnQuIElmIHlv dSBhcmUgcmVmZXJpbmcgdG8gdGhlIHVzZSBvZiBgQnZhcmlhYmxlYCBpbiB0aGUgZnVuY3Rp b24gDQphYm92ZSwgaXQncyBzaW1wbHkgYSB0aW55IHdyYXBwZXIgYXJvdW5kIGB0cmVlYCB0 aGF0IHdlIHVzZSBmb3IgdmFyaWFibGVzLg0KDQo+PiArICB7DQo+PiArICAgIGF1dG8gaWQg PSByZWYtPmdldF90eV9yZWYgKCk7DQo+PiArICAgIGF1dG8gZElkID0gcmVmLT5nZXRfaWQg KCk7DQo+PiArDQo+PiArICAgIHJ1c3RfYXNzZXJ0IChjb21waWxlZF9mbl9tYXAuZmluZCAo aWQpID09IGNvbXBpbGVkX2ZuX21hcC5lbmQgKCkpOw0KPj4gKyAgICBjb21waWxlZF9mbl9t YXBbaWRdID0gZm47DQo+PiArDQo+PiArICAgIGF1dG8gaXQgPSBtb25vX2Zucy5maW5kIChk SWQpOw0KPj4gKyAgICBpZiAoaXQgPT0gbW9ub19mbnMuZW5kICgpKQ0KPj4gKyAgICAgIG1v bm9fZm5zW2RJZF0gPSB7fTsNCj4+ICsNCj4+ICsgICAgbW9ub19mbnNbZElkXS5wdXNoX2Jh Y2sgKHtyZWYsIGZufSk7DQo+PiArICB9DQo+PiArDQo+PiArICBib29sIGxvb2t1cF9mdW5j dGlvbl9kZWNsIChIaXJJZCBpZCwgdHJlZSAqZm4sIERlZklkIGRJZCA9IFVOS05PV05fREVG SUQsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6OkJhc2VU eXBlICpyZWYgPSBudWxscHRyKQ0KPj4gKyAgew0KPj4gKyAgICAvLyBmb3IgZm9yIGFueSBt b25vbW9ycGhpemVkIGZucw0KPj4gKyAgICBpZiAocmVmICE9IG51bGxwdHIpDQo+PiArICAg ICAgew0KPj4gKyAgICAgICBydXN0X2Fzc2VydCAoZElkICE9IFVOS05PV05fREVGSUQpOw0K Pj4gKw0KPj4gKyAgICAgICBhdXRvIGl0ID0gbW9ub19mbnMuZmluZCAoZElkKTsNCj4+ICsg ICAgICAgaWYgKGl0ID09IG1vbm9fZm5zLmVuZCAoKSkNCj4+ICsgICAgICAgICByZXR1cm4g ZmFsc2U7DQo+PiArDQo+PiArICAgICAgIGZvciAoYXV0byAmZSA6IG1vbm9fZm5zW2RJZF0p DQo+IA0KPiBsaW5lYXIgc2VhcmNoIC0gdGhhdCdzIG5ldmVyIGdvaW5nIHRvIGJlIGFuIGlz c3VlPw0KPiANCg0KTGV0J3MgaG9wZSBub3QgOkQgU2luY2UgdGhlIHZlY3RvciBpcyBvbmx5 IHVzZWQgZm9yIG11bHRpcGxlIA0KbW9ub21vcnBoaXplZCBpbnN0YW5jZXMgb2YgdGhlIHNh bWUgZnVuY3Rpb25zLCBJIGFzc3VtZSBpdCB3b24ndCBiZSB0b28gDQptdWNoIG9mIGEgcHJv YmxlbS4gSWYgaXQgZG9lcyBlbmQgdXAgc2xvd2luZyB1cyBkb3duIG1hc3NpdmVseSBvbiBi aWcgDQpjb2RlYmFzZXMsIHdlIHdpbGwgc3dpdGNoIGl0IHRvIGEgbW9yZSBlZmZlY3RpdmUg ZGF0YSBzdHJ1Y3R1cmUgbGlrZSBhIA0Kc2V0IG9mIGB0cmVlYHMgb3Igc2ltaWxhci4NCg0K V2UgaGF2ZSBub3Qgc3BlbnQgYSBsb3Qgb2YgdGltZSBmb2N1c2luZyBvbiBwZXJmb3JtYW5j ZSBmb3Igbm93LiBUaGVyZSANCmFyZSBsb3RzIG9mIGFyZWFzIGluIHRoZSBmcm9udGVuZCB0 aGF0IGNvdWxkIGJlIGltcHJvdmVkIGFuZCBhcmUgDQpwcm9iYWJseSB2ZXJ5IHNsb3csIG1l bW9yeS1odW5ncnkgb3IganVzdCBvdmVyYWxsIHVub3B0aW1pemVkLg0KDQo+PiArICAgICAg ICAgew0KPj4gKyAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5cGUgKnIgPSBlLmZpcnN0 Ow0KPj4gKyAgICAgICAgICAgdHJlZSBmID0gZS5zZWNvbmQ7DQo+PiArICAgICAgICAgICBp ZiAocmVmLT5pc19lcXVhbCAoKnIpKQ0KPj4gKyAgICAgICAgICAgICB7DQo+PiArICAgICAg ICAgICAgICAgKmZuID0gZjsNCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCj4+ ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAgICAgcmV0dXJuIGZh bHNlOw0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsgICAgYXV0byBpdCA9IGNvbXBpbGVkX2Zu X21hcC5maW5kIChpZCk7DQo+PiArICAgIGlmIChpdCA9PSBjb21waWxlZF9mbl9tYXAuZW5k ICgpKQ0KPj4gKyAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsNCj4+ICsgICAgKmZuID0gaXQt PnNlY29uZDsNCj4+ICsgICAgcmV0dXJuIHRydWU7DQo+PiArICB9DQo+PiArDQo+PiArICB2 b2lkIGluc2VydF9jb25zdF9kZWNsIChIaXJJZCBpZCwgdHJlZSBleHByKSB7IGNvbXBpbGVk X2NvbnN0c1tpZF0gPSBleHByOyB9DQo+PiArDQo+PiArICBib29sIGxvb2t1cF9jb25zdF9k ZWNsIChIaXJJZCBpZCwgdHJlZSAqZXhwcikNCj4+ICsgIHsNCj4+ICsgICAgYXV0byBpdCA9 IGNvbXBpbGVkX2NvbnN0cy5maW5kIChpZCk7DQo+PiArICAgIGlmIChpdCA9PSBjb21waWxl ZF9jb25zdHMuZW5kICgpKQ0KPj4gKyAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsNCj4+ICsg ICAgKmV4cHIgPSBpdC0+c2Vjb25kOw0KPj4gKyAgICByZXR1cm4gdHJ1ZTsNCj4+ICsgIH0N Cj4+ICsNCj4+ICsgIHZvaWQgaW5zZXJ0X2xhYmVsX2RlY2wgKEhpcklkIGlkLCB0cmVlIGxh YmVsKSB7IGNvbXBpbGVkX2xhYmVsc1tpZF0gPSBsYWJlbDsgfQ0KPj4gKw0KPj4gKyAgYm9v bCBsb29rdXBfbGFiZWxfZGVjbCAoSGlySWQgaWQsIHRyZWUgKmxhYmVsKQ0KPj4gKyAgew0K Pj4gKyAgICBhdXRvIGl0ID0gY29tcGlsZWRfbGFiZWxzLmZpbmQgKGlkKTsNCj4+ICsgICAg aWYgKGl0ID09IGNvbXBpbGVkX2xhYmVscy5lbmQgKCkpDQo+PiArICAgICAgcmV0dXJuIGZh bHNlOw0KPj4gKw0KPj4gKyAgICAqbGFiZWwgPSBpdC0+c2Vjb25kOw0KPj4gKyAgICByZXR1 cm4gdHJ1ZTsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHZvaWQgaW5zZXJ0X3BhdHRlcm5fYmlu ZGluZyAoSGlySWQgaWQsIHRyZWUgYmluZGluZykNCj4+ICsgIHsNCj4+ICsgICAgaW1wbGlj aXRfcGF0dGVybl9iaW5kaW5nc1tpZF0gPSBiaW5kaW5nOw0KPj4gKyAgfQ0KPj4gKw0KPj4g KyAgYm9vbCBsb29rdXBfcGF0dGVybl9iaW5kaW5nIChIaXJJZCBpZCwgdHJlZSAqYmluZGlu ZykNCj4+ICsgIHsNCj4+ICsgICAgYXV0byBpdCA9IGltcGxpY2l0X3BhdHRlcm5fYmluZGlu Z3MuZmluZCAoaWQpOw0KPj4gKyAgICBpZiAoaXQgPT0gaW1wbGljaXRfcGF0dGVybl9iaW5k aW5ncy5lbmQgKCkpDQo+PiArICAgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgICAq YmluZGluZyA9IGl0LT5zZWNvbmQ7DQo+PiArICAgIHJldHVybiB0cnVlOw0KPj4gKyAgfQ0K Pj4gKw0KPj4gKyAgdm9pZCBwdXNoX2ZuICh0cmVlIGZuLCA6OkJ2YXJpYWJsZSAqcmV0X2Fk ZHIpDQo+PiArICB7DQo+PiArICAgIGZuX3N0YWNrLnB1c2hfYmFjayAoZm5jb250ZXh0e2Zu LCByZXRfYWRkcn0pOw0KPj4gKyAgfQ0KPj4gKyAgdm9pZCBwb3BfZm4gKCkgeyBmbl9zdGFj ay5wb3BfYmFjayAoKTsgfQ0KPj4gKw0KPj4gKyAgYm9vbCBpbl9mbiAoKSB7IHJldHVybiBm bl9zdGFjay5zaXplICgpICE9IDA7IH0NCj4+ICsNCj4+ICsgIC8vIE5vdGU6IGl0IGlzIHVu ZGVmaW5lZCBiZWhhdmlvciB0byBjYWxsIHBlZWtfZm4gKCkgaWYgZm5fc3RhY2sgaXMgZW1w dHkuDQo+PiArICBmbmNvbnRleHQgcGVla19mbiAoKQ0KPj4gKyAgew0KPj4gKyAgICBydXN0 X2Fzc2VydCAoIWZuX3N0YWNrLmVtcHR5ICgpKTsNCj4+ICsgICAgcmV0dXJuIGZuX3N0YWNr LmJhY2sgKCk7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lkIHB1c2hfdHlwZSAodHJlZSB0 KSB7IHR5cGVfZGVjbHMucHVzaF9iYWNrICh0KTsgfQ0KPj4gKyAgdm9pZCBwdXNoX3ZhciAo OjpCdmFyaWFibGUgKnYpIHsgdmFyX2RlY2xzLnB1c2hfYmFjayAodik7IH0NCj4+ICsgIHZv aWQgcHVzaF9jb25zdCAodHJlZSBjKSB7IGNvbnN0X2RlY2xzLnB1c2hfYmFjayAoYyk7IH0N Cj4+ICsgIHZvaWQgcHVzaF9mdW5jdGlvbiAodHJlZSBmKSB7IGZ1bmNfZGVjbHMucHVzaF9i YWNrIChmKTsgfQ0KPj4gKw0KPj4gKyAgdm9pZCB3cml0ZV90b19iYWNrZW5kICgpDQo+PiAr ICB7DQo+PiArICAgIGJhY2tlbmQtPndyaXRlX2dsb2JhbF9kZWZpbml0aW9ucyAodHlwZV9k ZWNscywgY29uc3RfZGVjbHMsIGZ1bmNfZGVjbHMsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB2YXJfZGVjbHMpOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAg Ym9vbCBmdW5jdGlvbl9jb21wbGV0ZWQgKHRyZWUgZm4pDQo+PiArICB7DQo+PiArICAgIGZv ciAoYXV0byBpdCA9IGZ1bmNfZGVjbHMuYmVnaW4gKCk7IGl0ICE9IGZ1bmNfZGVjbHMuZW5k ICgpOyBpdCsrKQ0KPiANCj4gTGlrZXdpc2UuICBJbiB0aGUgYmFja2VuZCB3ZSBoYXZlIHRo aW5ncyBsaWtlIFRSRUVfQVNNX1dSSVRURU4sIHNvIG1heWJlDQo+IHlvdSB3YW50IHRvIGRl ZGljYXRlIG9uZSBvZiB0aGUgREVDTF9MQU5HX0ZMQUdzIHRvIHRoaXM/ICBUaGVyZSBhcmUN Cj4gbGFuZy1zcGVjaWZpYyBmbGFncyBmb3IgdHJlZXMsIHR5cGVzIGFuZCBkZWNscy4NCj4g DQo+PiArICAgICAgew0KPj4gKyAgICAgICB0cmVlIGkgPSAoKml0KTsNCj4+ICsgICAgICAg aWYgKGkgPT0gZm4pDQo+PiArICAgICAgICAgew0KPj4gKyAgICAgICAgICAgcmV0dXJuIHRy dWU7DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgIH0NCj4+ICsgICAgcmV0dXJuIGZhbHNl Ow0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCBwdXNoX2xvb3BfY29udGV4dCAoQnZhcmlh YmxlICp2YXIpIHsgbG9vcF92YWx1ZV9zdGFjay5wdXNoX2JhY2sgKHZhcik7IH0NCj4+ICsN Cj4+ICsgIEJ2YXJpYWJsZSAqcGVla19sb29wX2NvbnRleHQgKCkgeyByZXR1cm4gbG9vcF92 YWx1ZV9zdGFjay5iYWNrICgpOyB9DQo+PiArDQo+PiArICBCdmFyaWFibGUgKnBvcF9sb29w X2NvbnRleHQgKCkNCj4+ICsgIHsNCj4+ICsgICAgYXV0byBiYWNrID0gbG9vcF92YWx1ZV9z dGFjay5iYWNrICgpOw0KPj4gKyAgICBsb29wX3ZhbHVlX3N0YWNrLnBvcF9iYWNrICgpOw0K Pj4gKyAgICByZXR1cm4gYmFjazsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHZvaWQgcHVzaF9s b29wX2JlZ2luX2xhYmVsICh0cmVlIGxhYmVsKQ0KPj4gKyAgew0KPj4gKyAgICBsb29wX2Jl Z2luX2xhYmVscy5wdXNoX2JhY2sgKGxhYmVsKTsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHRy ZWUgcGVla19sb29wX2JlZ2luX2xhYmVsICgpIHsgcmV0dXJuIGxvb3BfYmVnaW5fbGFiZWxz LmJhY2sgKCk7IH0NCj4+ICsNCj4+ICsgIHRyZWUgcG9wX2xvb3BfYmVnaW5fbGFiZWwgKCkN Cj4+ICsgIHsNCj4+ICsgICAgdHJlZSBwb3AgPSBsb29wX2JlZ2luX2xhYmVscy5iYWNrICgp Ow0KPj4gKyAgICBsb29wX2JlZ2luX2xhYmVscy5wb3BfYmFjayAoKTsNCj4+ICsgICAgcmV0 dXJuIHBvcDsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHZvaWQgcHVzaF9jb25zdF9jb250ZXh0 ICh2b2lkKSB7IGNvbnN0X2NvbnRleHQrKzsgfQ0KPj4gKyAgdm9pZCBwb3BfY29uc3RfY29u dGV4dCAodm9pZCkNCj4+ICsgIHsNCj4+ICsgICAgaWYgKGNvbnN0X2NvbnRleHQgPiAwKQ0K Pj4gKyAgICAgIGNvbnN0X2NvbnRleHQtLTsNCj4+ICsgIH0NCj4+ICsgIGJvb2wgY29uc3Rf Y29udGV4dF9wICh2b2lkKSB7IHJldHVybiAoY29uc3RfY29udGV4dCA+IDApOyB9DQo+PiAr DQo+PiArICBzdGQ6OnN0cmluZyBtYW5nbGVfaXRlbSAoY29uc3QgVHlUeTo6QmFzZVR5cGUg KnR5LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzb2x2ZXI6OkNh bm9uaWNhbFBhdGggJnBhdGgpIGNvbnN0DQo+PiArICB7DQo+PiArICAgIHJldHVybiBtYW5n bGVyLm1hbmdsZV9pdGVtICh0eSwgcGF0aCk7DQo+PiArICB9DQo+PiArDQo+PiArICBzdGQ6 OnZlY3Rvcjx0cmVlPiAmZ2V0X3R5cGVfZGVjbHMgKCkgeyByZXR1cm4gdHlwZV9kZWNsczsg fQ0KPiANCj4gWW91IHNlZW0gdG8gaGF2ZSBzdGQ6OnZlY3Rvcjw+IChhbmQgb3RoZXIgc3Rh bmRhcmQgbGlicmFyeSBjb250YWluZXJzKSBvZg0KPiAndHJlZScgd2hpY2ggYXJlIGdhcmJh Z2UgY29sbGVjdGVkLiAgVGhvc2UgYXJlIG5vdCBoYW5kbGVkIGFzIEdDIHJvb3RzIHNvDQo+ IHlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gbm90IEdDIGNvbGxlY3QgYmVmb3JlIHlvdSBn ZXQgcmlkIG9mIHRoZXNlDQo+IHJlZmVyZW5jZXMuICBNYXliZSBJJ2xsIGZpZ3VyZSBob3cg eW91IGRlYWwgd2l0aCB0aGlzIGlzc3VlIGJ1dCBtb3N0IGRlZmluaXRlbHkNCj4gdGhlIGRl YnVnIGxhbmd1YWdlIGhvb2tzIHdpbGwgY2FsbCBiYWNrIGludG8gdGhlIGZyb250ZW5kIGFm dGVyIHRoZSBmaXJzdA0KPiBnYXJiYWdlIGNvbGxlY3Rpb24gcG9pbnQuICBZb3UgY2FuIGdy ZXAgZm9yIGdnY19jb2xsZWN0IChvciBzZXQgYSBicmVha3BvaW50DQo+IGFuZCBydW4gc29t ZSBydXN0IGNvbXBpbGUpIHRvIGNoZWNrIHdoZXRoZXIgYmFkIHRoaW5ncyBhbHJlYWR5IGhh cHBlbi4NCj4gDQo+IFRoZXJlIGFyZSBHQ0MgdmVjdG9yLCBoYXNodGFibGUgYW5kIGhhc2gt c2V0IGNvbnRhaW5lcnMgdGhhdCBoYXZlIEdDDQo+IGFsbG9jYXRpb24gc3VwcG9ydC4NCj4g DQoNCkRhdmlkIE1hbGNvbG0gbWVudGlvbmVkIHNvbWV0aGluZyBzaW1pbGFyLiBXZSByYW4g dGhlIHRlc3RzdWl0ZSwgZm9yY2luZyANCmFzIG1hbnkgZ2FyYmFnZSBjb2xsZWN0aW9uIHBv aW50cyBhcyBwb3NzaWJsZSwgYW5kIGRpZCBub3QgcnVuIGludG8gYW55IA0KaXNzdWVzLg0K DQpJJ3ZlIHRyaWVkIHJ1bm5pbmcgYSBjb21waWxhdGlvbiwgYnJlYWtpbmcgb24gdGhlIGZp cnN0IGNhbGwgdG8gDQpgZ2djX2NvbGxlY3RgIGFuZCBpdCBkb2VzIG5vdCB0cmlnZ2VyIHdo aWxlIGluIG91ciBmcm9udGVuZC4gT25seSBhZnRlciANCndlJ3ZlIGhhbmRlZCB0aGUgZXhl Y3V0aW9uIG92ZXIgdG8gdGhlIGJhY2tlbmQuDQoNCkRvIHlvdSBzdWdnZXN0IHJlcGxhY2lu ZyBhbGwgb3VyIHVzZXMgb2YgdGVtcGxhdGUgY29udGFpbmVycyBieSB0aGUgR0NDIA0KZXF1 aXZhbGVudHM/DQoNCj4+ICsgIHN0ZDo6dmVjdG9yPDo6QnZhcmlhYmxlICo+ICZnZXRfdmFy X2RlY2xzICgpIHsgcmV0dXJuIHZhcl9kZWNsczsgfQ0KPj4gKyAgc3RkOjp2ZWN0b3I8dHJl ZT4gJmdldF9jb25zdF9kZWNscyAoKSB7IHJldHVybiBjb25zdF9kZWNsczsgfQ0KPj4gKyAg c3RkOjp2ZWN0b3I8dHJlZT4gJmdldF9mdW5jX2RlY2xzICgpIHsgcmV0dXJuIGZ1bmNfZGVj bHM7IH0NCj4+ICsNCj4+ICsgIHN0YXRpYyBoYXNodmFsX3QgdHlwZV9oYXNoZXIgKHRyZWUg dHlwZSk7DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ICsgIDo6QmFja2VuZCAqYmFja2VuZDsN Cj4+ICsgIFJlc29sdmVyOjpSZXNvbHZlciAqcmVzb2x2ZXI7DQo+PiArICBSZXNvbHZlcjo6 VHlwZUNoZWNrQ29udGV4dCAqdHljdHg7DQo+PiArICBBbmFseXNpczo6TWFwcGluZ3MgKm1h cHBpbmdzOw0KPj4gKyAgTWFuZ2xlciBtYW5nbGVyOw0KPj4gKw0KPj4gKyAgLy8gc3RhdGUN Cj4+ICsgIHN0ZDo6dmVjdG9yPGZuY29udGV4dD4gZm5fc3RhY2s7DQo+PiArICBzdGQ6Om1h cDxIaXJJZCwgOjpCdmFyaWFibGUgKj4gY29tcGlsZWRfdmFyX2RlY2xzOw0KPj4gKyAgc3Rk OjptYXA8aGFzaHZhbF90LCB0cmVlPiBjb21waWxlZF90eXBlX21hcDsNCj4+ICsgIHN0ZDo6 bWFwPEhpcklkLCB0cmVlPiBjb21waWxlZF9mbl9tYXA7DQo+PiArICBzdGQ6Om1hcDxIaXJJ ZCwgdHJlZT4gY29tcGlsZWRfY29uc3RzOw0KPj4gKyAgc3RkOjptYXA8SGlySWQsIHRyZWU+ IGNvbXBpbGVkX2xhYmVsczsNCj4+ICsgIHN0ZDo6dmVjdG9yPDo6c3RkOjp2ZWN0b3I8dHJl ZT4+IHN0YXRlbWVudHM7DQo+PiArICBzdGQ6OnZlY3Rvcjx0cmVlPiBzY29wZV9zdGFjazsN Cj4+ICsgIHN0ZDo6dmVjdG9yPDo6QnZhcmlhYmxlICo+IGxvb3BfdmFsdWVfc3RhY2s7DQo+ PiArICBzdGQ6OnZlY3Rvcjx0cmVlPiBsb29wX2JlZ2luX2xhYmVsczsNCj4+ICsgIHN0ZDo6 bWFwPERlZklkLCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgVHlUeTo6QmFzZVR5cGUg KiwgdHJlZT4+Pg0KPj4gKyAgICBtb25vX2ZuczsNCj4+ICsgIHN0ZDo6bWFwPEhpcklkLCB0 cmVlPiBpbXBsaWNpdF9wYXR0ZXJuX2JpbmRpbmdzOw0KPj4gKyAgc3RkOjptYXA8aGFzaHZh bF90LCB0cmVlPiBtYWluX3ZhcmlhbnRzOw0KPj4gKw0KPj4gKyAgLy8gVG8gR0NDIG1pZGRs ZS1lbmQNCj4+ICsgIHN0ZDo6dmVjdG9yPHRyZWU+IHR5cGVfZGVjbHM7DQo+PiArICBzdGQ6 OnZlY3Rvcjw6OkJ2YXJpYWJsZSAqPiB2YXJfZGVjbHM7DQo+PiArICBzdGQ6OnZlY3Rvcjx0 cmVlPiBjb25zdF9kZWNsczsNCj4+ICsgIHN0ZDo6dmVjdG9yPHRyZWU+IGZ1bmNfZGVjbHM7 DQo+PiArDQo+PiArICAvLyBOb256ZXJvIGlmZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBpbGlu ZyBzb21ldGhpbmcgaW5zaWRlIGEgY29uc3RhbnQgY29udGV4dC4NCj4+ICsgIHVuc2lnbmVk IGludCBjb25zdF9jb250ZXh0ID0gMDsNCj4+ICt9Ow0KPj4gKw0KPj4gK30gLy8gbmFtZXNw YWNlIENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiArDQo+PiArI2VuZGlm IC8vIFJVU1RfQ09NUElMRV9DT05URVhUDQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvYmFj a2VuZC9ydXN0LWNvbXBpbGUuY2MgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS5j Yw0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi4wY2Ni OThkOWUxMg0KPj4gLS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9y dXN0LWNvbXBpbGUuY2MNCj4+IEBAIC0wLDAgKzEsNDE0IEBADQo+PiArLy8gQ29weXJpZ2h0 IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+ PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0 IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0K Pj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8v IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hB TlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUg ZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGgg R0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6 Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LWNv bXBpbGUuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWl0ZW0uaCINCj4+ICsjaW5j bHVkZSAicnVzdC1jb21waWxlLWltcGxpdGVtLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29t cGlsZS1leHByLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1zdHJ1Y3QtZmllbGQt ZXhwci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtc3RtdC5oIg0KPj4gKyNpbmNs dWRlICJydXN0LWhpci10cmFpdC1yZXNvbHZlLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtaGly LXBhdGgtcHJvYmUuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1oaXItdHlwZS1ib3VuZHMuaCIN Cj4+ICsjaW5jbHVkZSAicnVzdC1oaXItZG90LW9wZXJhdG9yLmgiDQo+PiArI2luY2x1ZGUg InJ1c3QtY29tcGlsZS1ibG9jay5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+PiArDQo+PiArQ29tcGlsZUNyYXRlOjpDb21waWxl Q3JhdGUgKEhJUjo6Q3JhdGUgJmNyYXRlLCBDb250ZXh0ICpjdHgpDQo+PiArICA6IGNyYXRl IChjcmF0ZSksIGN0eCAoY3R4KQ0KPj4gK3t9DQo+PiArDQo+PiArQ29tcGlsZUNyYXRlOjp+ Q29tcGlsZUNyYXRlICgpIHt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVDcmF0ZTo6 Q29tcGlsZSAoSElSOjpDcmF0ZSAmY3JhdGUsIENvbnRleHQgKmN0eCkNCj4+ICt7DQo+PiAr ICBDb21waWxlQ3JhdGUgYyAoY3JhdGUsIGN0eCk7DQo+PiArICBjLmdvICgpOw0KPj4gK30N Cj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUNyYXRlOjpnbyAoKQ0KPj4gK3sNCj4+ICsg IGZvciAoYXV0byAmaXRlbSA6IGNyYXRlLml0ZW1zKQ0KPj4gKyAgICBDb21waWxlSXRlbTo6 Y29tcGlsZSAoaXRlbS5nZXQgKCksIGN0eCk7DQo+PiArfQ0KPj4gKw0KPj4gKy8vIFNoYXJl ZCBtZXRob2RzIGluIGNvbXBpbGF0aW9uDQo+PiArDQo+PiArdHJlZQ0KPj4gK0hJUkNvbXBp bGVCYXNlOjpjb2VyY2lvbl9zaXRlIChIaXJJZCBpZCwgdHJlZSBydmFsdWUsDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5cGUgKnJ2YWws DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5 cGUgKmx2YWwsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24g bHZhbHVlX2xvY3VzLCBMb2NhdGlvbiBydmFsdWVfbG9jdXMpDQo+PiArew0KPj4gKyAgc3Rk Ojp2ZWN0b3I8UmVzb2x2ZXI6OkFkanVzdG1lbnQ+ICphZGp1c3RtZW50cyA9IG51bGxwdHI7 DQo+PiArICBib29sIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9hdXRvZGVyZWZf bWFwcGluZ3MgKGlkLCAmYWRqdXN0bWVudHMpOw0KPj4gKyAgaWYgKG9rKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgcnZhbHVlID0gcmVzb2x2ZV9hZGp1c3RlbWVudHMgKCphZGp1c3RtZW50 cywgcnZhbHVlLCBydmFsdWVfbG9jdXMpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1 cm4gY29lcmNpb25fc2l0ZTEgKHJ2YWx1ZSwgcnZhbCwgbHZhbCwgbHZhbHVlX2xvY3VzLCBy dmFsdWVfbG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArSElSQ29tcGlsZUJh c2U6OmNvZXJjaW9uX3NpdGUxICh0cmVlIHJ2YWx1ZSwgY29uc3QgVHlUeTo6QmFzZVR5cGUg KnJ2YWwsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6 OkJhc2VUeXBlICpsdmFsLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM b2NhdGlvbiBsdmFsdWVfbG9jdXMsIExvY2F0aW9uIHJ2YWx1ZV9sb2N1cykNCj4+ICt7DQo+ PiArICBpZiAocnZhbHVlID09IGVycm9yX21hcmtfbm9kZSkNCj4+ICsgICAgcmV0dXJuIGVy cm9yX21hcmtfbm9kZTsNCj4+ICsNCj4+ICsgIGNvbnN0IFR5VHk6OkJhc2VUeXBlICphY3R1 YWwgPSBydmFsLT5kZXN0cnVjdHVyZSAoKTsNCj4+ICsgIGNvbnN0IFR5VHk6OkJhc2VUeXBl ICpleHBlY3RlZCA9IGx2YWwtPmRlc3RydWN0dXJlICgpOw0KPj4gKw0KPj4gKyAgaWYgKGV4 cGVjdGVkLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6UkVGKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgLy8gdGhpcyBpcyBhIGR5biBvYmplY3QNCj4+ICsgICAgICBpZiAoU0xJ Q0VfVFlQRV9QIChUUkVFX1RZUEUgKHJ2YWx1ZSkpKQ0KPj4gKyAgICAgICB7DQo+PiArICAg ICAgICAgcmV0dXJuIHJ2YWx1ZTsNCj4+ICsgICAgICAgfQ0KPiANCj4gR0NDcyBjb2Rpbmcg Y29udmVudGlvbiB3b3VsZCBhc2sgeW91IHRvIGVsaWRlIHRoZSB7fXMNCj4gDQo+PiArDQo+ PiArICAgICAgLy8gYmFkIGNvZXJjaW9uLi4uIG9mIHNvbWV0aGluZyB0byBhIHJlZmVyZW5j ZQ0KPj4gKyAgICAgIGlmIChhY3R1YWwtPmdldF9raW5kICgpICE9IFR5VHk6OlR5cGVLaW5k OjpSRUYpDQo+PiArICAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArDQo+PiAr ICAgICAgY29uc3QgVHlUeTo6UmVmZXJlbmNlVHlwZSAqZXhwDQo+PiArICAgICAgID0gc3Rh dGljX2Nhc3Q8Y29uc3QgVHlUeTo6UmVmZXJlbmNlVHlwZSAqPiAoZXhwZWN0ZWQpOw0KPj4g KyAgICAgIGNvbnN0IFR5VHk6OlJlZmVyZW5jZVR5cGUgKmFjdA0KPj4gKyAgICAgICA9IHN0 YXRpY19jYXN0PGNvbnN0IFR5VHk6OlJlZmVyZW5jZVR5cGUgKj4gKGFjdHVhbCk7DQo+PiAr DQo+PiArICAgICAgdHJlZSBkZXJlZl9ydmFsdWUgPSBpbmRpcmVjdF9leHByZXNzaW9uIChy dmFsdWUsIHJ2YWx1ZV9sb2N1cyk7DQo+PiArICAgICAgdHJlZSBjb2VyY2VkDQo+PiArICAg ICAgID0gY29lcmNpb25fc2l0ZTEgKGRlcmVmX3J2YWx1ZSwgYWN0LT5nZXRfYmFzZSAoKSwg ZXhwLT5nZXRfYmFzZSAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgbHZhbHVl X2xvY3VzLCBydmFsdWVfbG9jdXMpOw0KPj4gKyAgICAgIGlmIChleHAtPmlzX2R5bl9vYmpl Y3QgKCkgJiYgU0xJQ0VfVFlQRV9QIChUUkVFX1RZUEUgKGNvZXJjZWQpKSkNCj4+ICsgICAg ICAgcmV0dXJuIGNvZXJjZWQ7DQo+PiArDQo+PiArICAgICAgcmV0dXJuIGFkZHJlc3NfZXhw cmVzc2lvbiAoY29lcmNlZCwgcnZhbHVlX2xvY3VzKTsNCj4+ICsgICAgfQ0KPj4gKyAgZWxz ZSBpZiAoZXhwZWN0ZWQtPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpQT0lOVEVS KQ0KPj4gKyAgICB7DQo+PiArICAgICAgLy8gdGhpcyBpcyBhIGR5biBvYmplY3QNCj4+ICsg ICAgICBpZiAoU0xJQ0VfVFlQRV9QIChUUkVFX1RZUEUgKHJ2YWx1ZSkpKQ0KPj4gKyAgICAg ICB7DQo+PiArICAgICAgICAgcmV0dXJuIHJ2YWx1ZTsNCj4+ICsgICAgICAgfQ0KPj4gKw0K Pj4gKyAgICAgIC8vIGJhZCBjb2VyY2lvbi4uLiBvZiBzb21ldGhpbmcgdG8gYSByZWZlcmVu Y2UNCj4+ICsgICAgICBib29sIHZhbGlkX2NvZXJjaW9uID0gYWN0dWFsLT5nZXRfa2luZCAo KSA9PSBUeVR5OjpUeXBlS2luZDo6UkVGDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgfHwgYWN0dWFsLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6UE9JTlRFUjsN Cj4+ICsgICAgICBpZiAoIXZhbGlkX2NvZXJjaW9uKQ0KPj4gKyAgICAgICByZXR1cm4gZXJy b3JfbWFya19ub2RlOw0KPj4gKw0KPj4gKyAgICAgIGNvbnN0IFR5VHk6OlJlZmVyZW5jZVR5 cGUgKmV4cA0KPj4gKyAgICAgICA9IHN0YXRpY19jYXN0PGNvbnN0IFR5VHk6OlJlZmVyZW5j ZVR5cGUgKj4gKGV4cGVjdGVkKTsNCj4+ICsNCj4+ICsgICAgICBUeVR5OjpCYXNlVHlwZSAq YWN0dWFsX2Jhc2UgPSBudWxscHRyOw0KPj4gKyAgICAgIGlmIChhY3R1YWwtPmdldF9raW5k ICgpID09IFR5VHk6OlR5cGVLaW5kOjpSRUYpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAg ICBjb25zdCBUeVR5OjpSZWZlcmVuY2VUeXBlICphY3QNCj4+ICsgICAgICAgICAgID0gc3Rh dGljX2Nhc3Q8Y29uc3QgVHlUeTo6UmVmZXJlbmNlVHlwZSAqPiAoYWN0dWFsKTsNCj4+ICsN Cj4+ICsgICAgICAgICBhY3R1YWxfYmFzZSA9IGFjdC0+Z2V0X2Jhc2UgKCk7DQo+PiArICAg ICAgIH0NCj4+ICsgICAgICBlbHNlIGlmIChhY3R1YWwtPmdldF9raW5kICgpID09IFR5VHk6 OlR5cGVLaW5kOjpQT0lOVEVSKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgY29uc3Qg VHlUeTo6UG9pbnRlclR5cGUgKmFjdA0KPj4gKyAgICAgICAgICAgPSBzdGF0aWNfY2FzdDxj b25zdCBUeVR5OjpQb2ludGVyVHlwZSAqPiAoYWN0dWFsKTsNCj4+ICsNCj4+ICsgICAgICAg ICBhY3R1YWxfYmFzZSA9IGFjdC0+Z2V0X2Jhc2UgKCk7DQo+PiArICAgICAgIH0NCj4+ICsg ICAgICBydXN0X2Fzc2VydCAoYWN0dWFsX2Jhc2UgIT0gbnVsbHB0cik7DQo+PiArDQo+PiAr ICAgICAgdHJlZSBkZXJlZl9ydmFsdWUgPSBpbmRpcmVjdF9leHByZXNzaW9uIChydmFsdWUs IHJ2YWx1ZV9sb2N1cyk7DQo+PiArICAgICAgdHJlZSBjb2VyY2VkDQo+PiArICAgICAgID0g Y29lcmNpb25fc2l0ZTEgKGRlcmVmX3J2YWx1ZSwgYWN0dWFsX2Jhc2UsIGV4cC0+Z2V0X2Jh c2UgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIGx2YWx1ZV9sb2N1cywgcnZh bHVlX2xvY3VzKTsNCj4+ICsNCj4+ICsgICAgICBpZiAoZXhwLT5pc19keW5fb2JqZWN0ICgp ICYmIFNMSUNFX1RZUEVfUCAoVFJFRV9UWVBFIChjb2VyY2VkKSkpDQo+PiArICAgICAgIHJl dHVybiBjb2VyY2VkOw0KPj4gKw0KPj4gKyAgICAgIHJldHVybiBhZGRyZXNzX2V4cHJlc3Np b24gKGNvZXJjZWQsIHJ2YWx1ZV9sb2N1cyk7DQo+PiArICAgIH0NCj4+ICsgIGVsc2UgaWYg KGV4cGVjdGVkLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6QVJSQVkpDQo+PiAr ICAgIHsNCj4+ICsgICAgICBpZiAoYWN0dWFsLT5nZXRfa2luZCAoKSAhPSBUeVR5OjpUeXBl S2luZDo6QVJSQVkpDQo+PiArICAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiAr DQo+PiArICAgICAgdHJlZSB0cmVlX3J2YWxfdHlwZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6 Y29tcGlsZSAoY3R4LCBhY3R1YWwpOw0KPj4gKyAgICAgIHRyZWUgdHJlZV9sdmFsX3R5cGUg PSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgZXhwZWN0ZWQpOw0KPj4gKyAg ICAgIGlmICghdmVyaWZ5X2FycmF5X2NhcGFjaXRpZXMgKHRyZWVfbHZhbF90eXBlLCB0cmVl X3J2YWxfdHlwZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2 YWx1ZV9sb2N1cywgcnZhbHVlX2xvY3VzKSkNCj4+ICsgICAgICAgcmV0dXJuIGVycm9yX21h cmtfbm9kZTsNCj4+ICsgICAgfQ0KPj4gKyAgZWxzZSBpZiAoZXhwZWN0ZWQtPmdldF9raW5k ICgpID09IFR5VHk6OlR5cGVLaW5kOjpTTElDRSkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8v IGJhZCBjb2VyY2lvbg0KPj4gKyAgICAgIGJvb2wgdmFsaWRfY29lcmNpb24gPSBhY3R1YWwt PmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpTTElDRQ0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIHx8IGFjdHVhbC0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtp bmQ6OkFSUkFZOw0KPj4gKyAgICAgIGlmICghdmFsaWRfY29lcmNpb24pDQo+PiArICAgICAg IHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArDQo+PiArICAgICAgLy8gbm90aGluZyB0 byBkbyBoZXJlDQo+PiArICAgICAgaWYgKGFjdHVhbC0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6 VHlwZUtpbmQ6OlNMSUNFKQ0KPj4gKyAgICAgICByZXR1cm4gcnZhbHVlOw0KPj4gKw0KPj4g KyAgICAgIC8vIHJldHVybiBhbiB1bnNpemVkIGNvZXJjaW9uDQo+PiArICAgICAgUmVzb2x2 ZXI6OkFkanVzdG1lbnQgdW5zaXplX2FkaiAoDQo+PiArICAgICAgIFJlc29sdmVyOjpBZGp1 c3RtZW50OjpBZGp1c3RtZW50VHlwZTo6VU5TSVpFLCBhY3R1YWwsIGV4cGVjdGVkKTsNCj4+ ICsgICAgICByZXR1cm4gcmVzb2x2ZV91bnNpemVkX2FkanVzdG1lbnQgKHVuc2l6ZV9hZGos IHJ2YWx1ZSwgcnZhbHVlX2xvY3VzKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJu IHJ2YWx1ZTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0hJUkNvbXBpbGVCYXNlOjpj b2VyY2VfdG9fZHluX29iamVjdCAodHJlZSBjb21waWxlZF9yZWYsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6OkJhc2VUeXBlICphY3R1 YWwsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5 VHk6OkR5bmFtaWNPYmplY3RUeXBlICp0eSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTG9jYXRpb24gbG9jdXMpDQo+PiArew0KPj4gKyAgdHJlZSBkeW5h bWljX29iamVjdCA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0eSk7DQo+ PiArICB0cmVlIGR5bmFtaWNfb2JqZWN0X2ZpZWxkcyA9IFRZUEVfRklFTERTIChkeW5hbWlj X29iamVjdCk7DQo+PiArICB0cmVlIHZ0YWJsZV9maWVsZCA9IERFQ0xfQ0hBSU4gKGR5bmFt aWNfb2JqZWN0X2ZpZWxkcyk7DQo+PiArICBydXN0X2Fzc2VydCAoVFJFRV9DT0RFIChUUkVF X1RZUEUgKHZ0YWJsZV9maWVsZCkpID09IEFSUkFZX1RZUEUpOw0KPj4gKw0KPj4gKyAgLy8n IHRoaXMgYXNzdW1lcyBvcmRlcmluZyBhbmQgY3VycmVudCB0aGUgc3RydWN0dXJlIGlzDQo+ PiArICAvLyBfX3RyYWl0X29iamVjdF9wdHINCj4+ICsgIC8vIFtsaXN0IG9mIGZ1bmN0aW9u IHB0cnNdDQo+PiArDQo+PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UmVzb2x2ZXI6OlRy YWl0UmVmZXJlbmNlICosIEhJUjo6SW1wbEJsb2NrICo+Pg0KPj4gKyAgICBwcm9iZWRfYm91 bmRzX2Zvcl9yZWNlaXZlciA9IFJlc29sdmVyOjpUeXBlQm91bmRzUHJvYmU6OlByb2JlIChh Y3R1YWwpOw0KPj4gKw0KPj4gKyAgdHJlZSBhZGRyZXNzX29mX2NvbXBpbGVkX3JlZiA9IG51 bGxfcG9pbnRlcl9ub2RlOw0KPj4gKyAgaWYgKCFhY3R1YWwtPmlzX3VuaXQgKCkpDQo+PiAr ICAgIGFkZHJlc3Nfb2ZfY29tcGlsZWRfcmVmID0gYWRkcmVzc19leHByZXNzaW9uIChjb21w aWxlZF9yZWYsIGxvY3VzKTsNCj4+ICsNCj4+ICsgIHN0ZDo6dmVjdG9yPHRyZWU+IHZ0YWJs ZV9jdG9yX2VsZW1zOw0KPj4gKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgbG9uZz4gdnRhYmxl X2N0b3JfaWR4Ow0KPj4gKyAgdW5zaWduZWQgbG9uZyBpID0gMDsNCj4+ICsgIGZvciAoYXV0 byAmYm91bmQgOiB0eS0+Z2V0X29iamVjdF9pdGVtcyAoKSkNCj4+ICsgICAgew0KPj4gKyAg ICAgIGNvbnN0IFJlc29sdmVyOjpUcmFpdEl0ZW1SZWZlcmVuY2UgKml0ZW0gPSBib3VuZC5m aXJzdDsNCj4+ICsgICAgICBjb25zdCBUeVR5OjpUeXBlQm91bmRQcmVkaWNhdGUgKnByZWRp Y2F0ZSA9IGJvdW5kLnNlY29uZDsNCj4+ICsNCj4+ICsgICAgICBhdXRvIGFkZHJlc3MgPSBj b21wdXRlX2FkZHJlc3NfZm9yX3RyYWl0X2l0ZW0gKGl0ZW0sIHByZWRpY2F0ZSwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJv YmVkX2JvdW5kc19mb3JfcmVjZWl2ZXIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCwgYWN0dWFsLCBsb2N1cyk7DQo+ PiArICAgICAgdnRhYmxlX2N0b3JfZWxlbXMucHVzaF9iYWNrIChhZGRyZXNzKTsNCj4+ICsg ICAgICB2dGFibGVfY3Rvcl9pZHgucHVzaF9iYWNrIChpKyspOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICB0cmVlIHZ0YWJsZV9jdG9yID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+YXJyYXlf Y29uc3RydWN0b3JfZXhwcmVzc2lvbiAoDQo+PiArICAgIFRSRUVfVFlQRSAodnRhYmxlX2Zp ZWxkKSwgdnRhYmxlX2N0b3JfaWR4LCB2dGFibGVfY3Rvcl9lbGVtcywgbG9jdXMpOw0KPj4g Kw0KPj4gKyAgc3RkOjp2ZWN0b3I8dHJlZT4gZHluX2N0b3IgPSB7YWRkcmVzc19vZl9jb21w aWxlZF9yZWYsIHZ0YWJsZV9jdG9yfTsNCj4+ICsgIHJldHVybiBjdHgtPmdldF9iYWNrZW5k ICgpLT5jb25zdHJ1Y3Rvcl9leHByZXNzaW9uIChkeW5hbWljX29iamVjdCwgZmFsc2UsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBkeW5fY3RvciwgLTEsIGxvY3VzKTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0hJ UkNvbXBpbGVCYXNlOjpjb21wdXRlX2FkZHJlc3NfZm9yX3RyYWl0X2l0ZW0gKA0KPj4gKyAg Y29uc3QgUmVzb2x2ZXI6OlRyYWl0SXRlbVJlZmVyZW5jZSAqcmVmLA0KPj4gKyAgY29uc3Qg VHlUeTo6VHlwZUJvdW5kUHJlZGljYXRlICpwcmVkaWNhdGUsDQo+PiArICBzdGQ6OnZlY3Rv cjxzdGQ6OnBhaXI8UmVzb2x2ZXI6OlRyYWl0UmVmZXJlbmNlICosIEhJUjo6SW1wbEJsb2Nr ICo+Pg0KPj4gKyAgICAmcmVjZWl2ZXJfYm91bmRzLA0KPj4gKyAgY29uc3QgVHlUeTo6QmFz ZVR5cGUgKnJlY2VpdmVyLCBjb25zdCBUeVR5OjpCYXNlVHlwZSAqcm9vdCwgTG9jYXRpb24g bG9jdXMpDQo+PiArew0KPj4gKyAgLy8gVGhlcmUgYXJlIHR3byBjYXNlcyBoZXJlIG9uZSB3 aGVyZSBpdHMgYW4gaXRlbSB3aGljaCBoYXMgYW4gaW1wbGVtZW50YXRpb24NCj4+ICsgIC8v IHdpdGhpbiBhIHRyYWl0LWltcGwtYmxvY2suIFRoZW4gdGhlcmUgaXMgdGhlIGNhc2Ugd2hl cmUgdGhlcmUgaXMgYSBkZWZhdWx0DQo+PiArICAvLyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhp cyB3aXRoaW4gdGhlIHRyYWl0Lg0KPj4gKyAgLy8NCj4+ICsgIC8vIFRoZSBhd2t3YXJkIHBh cnQgaGVyZSBpcyB0aGF0IHRoaXMgbWlnaHQgYmUgYSBnZW5lcmljIHRyYWl0IGFuZCB3ZSBu ZWVkIHRvDQo+PiArICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IG1vbm9tb3JwaGl6ZWQg dHlwZSBmb3IgdGhpcyBzbyB3ZSBjYW4gcmVzb2x2ZSB0aGUNCj4+ICsgIC8vIGFkZHJlc3Mg b2YgdGhlIGZ1bmN0aW9uICwgdGhpcyBpcyBzdG9yZWQgYXMgcGFydCBvZiB0aGUNCj4+ICsg IC8vIHR5cGUtYm91bmQtcHJlZGljYXRlDQo+PiArICAvLw0KPj4gKyAgLy8gQWxnbzoNCj4+ ICsgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGltcGwtaXRlbSBmb3IgdGhpcyB0cmFpdC1p dGVtLXJlZiBmaXJzdA0KPj4gKyAgLy8gZWxzZSBhc3NlcnQgdGhhdCB0aGUgdHJhaXQtaXRl bS1yZWYgaGFzIGFuIGltcGxlbWVudGF0aW9uDQo+PiArDQo+PiArICBUeVR5OjpUeXBlQm91 bmRQcmVkaWNhdGVJdGVtIHByZWRpY2F0ZV9pdGVtDQo+PiArICAgID0gcHJlZGljYXRlLT5s b29rdXBfYXNzb2NpYXRlZF9pdGVtIChyZWYtPmdldF9pZGVudGlmaWVyICgpKTsNCj4+ICsg IHJ1c3RfYXNzZXJ0ICghcHJlZGljYXRlX2l0ZW0uaXNfZXJyb3IgKCkpOw0KPj4gKw0KPj4g KyAgLy8gdGhpcyBpcyB0aGUgZXhwZWN0ZWQgZW5kIHR5cGUNCj4+ICsgIFR5VHk6OkJhc2VU eXBlICp0cmFpdF9pdGVtX3R5cGUgPSBwcmVkaWNhdGVfaXRlbS5nZXRfdHl0eV9mb3JfcmVj ZWl2ZXIgKHJvb3QpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKHRyYWl0X2l0ZW1fdHlwZS0+Z2V0 X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkZOREVGKTsNCj4+ICsgIFR5VHk6OkZuVHlw ZSAqdHJhaXRfaXRlbV9mbnR5cGUNCj4+ICsgICAgPSBzdGF0aWNfY2FzdDxUeVR5OjpGblR5 cGUgKj4gKHRyYWl0X2l0ZW1fdHlwZSk7DQo+PiArDQo+PiArICAvLyBmaW5kIGltcGwtYmxv Y2sgZm9yIHRoaXMgdHJhaXQtaXRlbS1yZWYNCj4+ICsgIEhJUjo6SW1wbEJsb2NrICphc3Nv Y2lhdGVkX2ltcGxfYmxvY2sgPSBudWxscHRyOw0KPj4gKyAgY29uc3QgUmVzb2x2ZXI6OlRy YWl0UmVmZXJlbmNlICpwcmVkaWNhdGVfdHJhaXRfcmVmID0gcHJlZGljYXRlLT5nZXQgKCk7 DQo+PiArICBmb3IgKGF1dG8gJml0ZW0gOiByZWNlaXZlcl9ib3VuZHMpDQo+PiArICAgIHsN Cj4+ICsgICAgICBSZXNvbHZlcjo6VHJhaXRSZWZlcmVuY2UgKnRyYWl0X3JlZiA9IGl0ZW0u Zmlyc3Q7DQo+PiArICAgICAgSElSOjpJbXBsQmxvY2sgKmltcGxfYmxvY2sgPSBpdGVtLnNl Y29uZDsNCj4+ICsgICAgICBpZiAocHJlZGljYXRlX3RyYWl0X3JlZi0+aXNfZXF1YWwgKCp0 cmFpdF9yZWYpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgYXNzb2NpYXRlZF9pbXBs X2Jsb2NrID0gaW1wbF9ibG9jazsNCj4+ICsgICAgICAgICBicmVhazsNCj4+ICsgICAgICAg fQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBGSVhNRSB0aGlzIHByb2JhYmx5IHNob3Vs ZCBqdXN0IHJldHVybiBlcnJvcl9tYXJrX25vZGUgYnV0IHRoaXMgaGVscHMNCj4+ICsgIC8v IGRlYnVnIGZvciBub3cgc2luY2Ugd2UgYXJlIHdyb25nbHkgcmV0dXJuaW5nIGVhcmx5IG9u IHR5cGUtcmVzb2x1dGlvbg0KPj4gKyAgLy8gZmFpbHVyZXMsIHVudGlsIHdlIHRha2UgYWR2 YW50YWdlIG9mIG1vcmUgZXJyb3IgdHlwZXMgYW5kIGVycm9yX21hcmtfbm9kZQ0KPj4gKyAg cnVzdF9hc3NlcnQgKGFzc29jaWF0ZWRfaW1wbF9ibG9jayAhPSBudWxscHRyKTsNCj4+ICsN Cj4+ICsgIC8vIGxvb2t1cCBzZWxmIGZvciB0aGUgYXNzb2NpYXRlZCBpbXBsDQo+PiArICBz dGQ6OnVuaXF1ZV9wdHI8SElSOjpUeXBlPiAmc2VsZl90eXBlX3BhdGgNCj4+ICsgICAgPSBh c3NvY2lhdGVkX2ltcGxfYmxvY2stPmdldF90eXBlICgpOw0KPj4gKyAgVHlUeTo6QmFzZVR5 cGUgKnNlbGYgPSBudWxscHRyOw0KPj4gKyAgYm9vbCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgp LT5sb29rdXBfdHlwZSAoDQo+PiArICAgIHNlbGZfdHlwZV9wYXRoLT5nZXRfbWFwcGluZ3Mg KCkuZ2V0X2hpcmlkICgpLCAmc2VsZik7DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4g Kw0KPj4gKyAgLy8gbG9va3VwIHRoZSBwcmVkaWNhdGUgaXRlbSBmcm9tIHRoZSBzZWxmDQo+ PiArICBUeVR5OjpUeXBlQm91bmRQcmVkaWNhdGUgKnNlbGZfYm91bmQgPSBudWxscHRyOw0K Pj4gKyAgZm9yIChhdXRvICZib3VuZCA6IHNlbGYtPmdldF9zcGVjaWZpZWRfYm91bmRzICgp KQ0KPj4gKyAgICB7DQo+PiArICAgICAgY29uc3QgUmVzb2x2ZXI6OlRyYWl0UmVmZXJlbmNl ICpib3VuZF9yZWYgPSBib3VuZC5nZXQgKCk7DQo+PiArICAgICAgY29uc3QgUmVzb2x2ZXI6 OlRyYWl0UmVmZXJlbmNlICpzcGVjaWZpZWRfcmVmID0gcHJlZGljYXRlLT5nZXQgKCk7DQo+ PiArICAgICAgaWYgKGJvdW5kX3JlZi0+aXNfZXF1YWwgKCpzcGVjaWZpZWRfcmVmKSkNCj4+ ICsgICAgICAgew0KPj4gKyAgICAgICAgIHNlbGZfYm91bmQgPSAmYm91bmQ7DQo+PiArICAg ICAgICAgYnJlYWs7DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKyAgcnVzdF9hc3Nl cnQgKHNlbGZfYm91bmQgIT0gbnVsbHB0cik7DQo+PiArDQo+PiArICAvLyBsb29rdXAgdGhl IGFzc29jaWF0ZWQgaXRlbSBmcm9tIHRoZSBhc3NvY2lhdGVkIGltcGwgYmxvY2sNCj4+ICsg IFR5VHk6OlR5cGVCb3VuZFByZWRpY2F0ZUl0ZW0gYXNzb2NpYXRlZF9zZWxmX2l0ZW0NCj4+ ICsgICAgPSBzZWxmX2JvdW5kLT5sb29rdXBfYXNzb2NpYXRlZF9pdGVtIChyZWYtPmdldF9p ZGVudGlmaWVyICgpKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0ICghYXNzb2NpYXRlZF9zZWxmX2l0 ZW0uaXNfZXJyb3IgKCkpOw0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKm1vbm8xID0g YXNzb2NpYXRlZF9zZWxmX2l0ZW0uZ2V0X3R5dHlfZm9yX3JlY2VpdmVyIChzZWxmKTsNCj4+ ICsgIHJ1c3RfYXNzZXJ0IChtb25vMSAhPSBudWxscHRyKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0 IChtb25vMS0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkZOREVGKTsNCj4+ICsg IFR5VHk6OkZuVHlwZSAqYXNzb2NhdGVkX2l0ZW1fdHkxID0gc3RhdGljX2Nhc3Q8VHlUeTo6 Rm5UeXBlICo+IChtb25vMSk7DQo+PiArDQo+PiArICAvLyBMb29rdXAgdGhlIGltcGwtYmxv Y2sgZm9yIHRoZSBhc3NvY2lhdGVkIGltcGxfaXRlbSBpZiBpdCBleGlzdHMNCj4+ICsgIEhJ Ujo6RnVuY3Rpb24gKmFzc29jaWF0ZWRfZnVuY3Rpb24gPSBudWxscHRyOw0KPj4gKyAgZm9y IChhdXRvICZpbXBsX2l0ZW0gOiBhc3NvY2lhdGVkX2ltcGxfYmxvY2stPmdldF9pbXBsX2l0 ZW1zICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IGltcGxf aXRlbS0+Z2V0X2ltcGxfaXRlbV90eXBlICgpDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgPT0gSElSOjpJbXBsSXRlbTo6SW1wbEl0ZW1UeXBlOjpGVU5DVElPTjsNCj4+ICsgICAg ICBpZiAoIWlzX2Z1bmN0aW9uKQ0KPj4gKyAgICAgICBjb250aW51ZTsNCj4+ICsNCj4+ICsg ICAgICBISVI6OkZ1bmN0aW9uICpmbiA9IHN0YXRpY19jYXN0PEhJUjo6RnVuY3Rpb24gKj4g KGltcGxfaXRlbS5nZXQgKCkpOw0KPj4gKyAgICAgIGJvb2wgZm91bmRfYXNzb2NpYXRlZF9p dGVtDQo+PiArICAgICAgID0gZm4tPmdldF9mdW5jdGlvbl9uYW1lICgpLmNvbXBhcmUgKHJl Zi0+Z2V0X2lkZW50aWZpZXIgKCkpID09IDA7DQo+PiArICAgICAgaWYgKGZvdW5kX2Fzc29j aWF0ZWRfaXRlbSkNCj4+ICsgICAgICAgYXNzb2NpYXRlZF9mdW5jdGlvbiA9IGZuOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICAvLyB3ZSBmb3VuZCBhbiBpbXBsX2l0ZW0gZm9yIHRoaXMN Cj4+ICsgIGlmIChhc3NvY2lhdGVkX2Z1bmN0aW9uICE9IG51bGxwdHIpDQo+PiArICAgIHsN Cj4+ICsgICAgICAvLyBsb29rdXAgdGhlIGFzc29jaWF0ZWQgdHlwZSBmb3IgdGhpcyBpdGVt DQo+PiArICAgICAgVHlUeTo6QmFzZVR5cGUgKmxvb2t1cCA9IG51bGxwdHI7DQo+PiArICAg ICAgYm9vbCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoDQo+PiArICAg ICAgIGFzc29jaWF0ZWRfZnVuY3Rpb24tPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCks ICZsb29rdXApOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArICAgICAgcnVz dF9hc3NlcnQgKGxvb2t1cC0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkZOREVG KTsNCj4+ICsgICAgICBUeVR5OjpGblR5cGUgKmxvb2t1cF9mbnR5cGUgPSBzdGF0aWNfY2Fz dDxUeVR5OjpGblR5cGUgKj4gKGxvb2t1cCk7DQo+PiArDQo+PiArICAgICAgaWYgKGxvb2t1 cF9mbnR5cGUtPm5lZWRzX3N1YnN0aXR1dGlvbiAoKSkNCj4+ICsgICAgICAgew0KPj4gKyAg ICAgICAgIFR5VHk6OlN1YnN0aXR1dGlvbkFyZ3VtZW50TWFwcGluZ3MgbWFwcGluZ3MNCj4+ ICsgICAgICAgICAgID0gYXNzb2NhdGVkX2l0ZW1fdHkxLT5zb2x2ZV9taXNzaW5nX21hcHBp bmdzX2Zyb21fdGhpcyAoDQo+PiArICAgICAgICAgICAgICp0cmFpdF9pdGVtX2ZudHlwZSwg Kmxvb2t1cF9mbnR5cGUpOw0KPj4gKyAgICAgICAgIGxvb2t1cF9mbnR5cGUgPSBsb29rdXBf Zm50eXBlLT5oYW5kbGVfc3Vic3RpdGlvbnMgKG1hcHBpbmdzKTsNCj4+ICsgICAgICAgfQ0K Pj4gKw0KPj4gKyAgICAgIHJldHVybiBDb21waWxlSW5oZXJlbnRJbXBsSXRlbTo6Q29tcGls ZSAoYXNzb2NpYXRlZF9mdW5jdGlvbiwgY3R4LA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBfZm50eXBlLCB0cnVlLCBsb2N1cyk7 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIHdlIGNhbiBvbmx5IGNvbXBpbGUgdHJhaXQt aXRlbXMgd2l0aCBhIGJvZHkNCj4+ICsgIGJvb2wgdHJhaXRfaXRlbV9oYXNfZGVmaW5pdGlv biA9IHJlZi0+aXNfb3B0aW9uYWwgKCk7DQo+PiArICBydXN0X2Fzc2VydCAodHJhaXRfaXRl bV9oYXNfZGVmaW5pdGlvbik7DQo+PiArDQo+PiArICBISVI6OlRyYWl0SXRlbSAqdHJhaXRf aXRlbSA9IHJlZi0+Z2V0X2hpcl90cmFpdF9pdGVtICgpOw0KPj4gKyAgcmV0dXJuIENvbXBp bGVUcmFpdEl0ZW06OkNvbXBpbGUgKHRyYWl0X2l0ZW0sIGN0eCwgdHJhaXRfaXRlbV9mbnR5 cGUsIHRydWUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2N1 cyk7DQo+PiArfQ0KPj4gKw0KPj4gK2Jvb2wNCj4+ICtISVJDb21waWxlQmFzZTo6dmVyaWZ5 X2FycmF5X2NhcGFjaXRpZXMgKHRyZWUgbHR5cGUsIHRyZWUgcnR5cGUsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIGx2YWx1ZV9sb2N1 cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRp b24gcnZhbHVlX2xvY3VzKQ0KPj4gK3sNCj4+ICsgIHJ1c3RfYXNzZXJ0IChsdHlwZSAhPSBO VUxMX1RSRUUpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKHJ0eXBlICE9IE5VTExfVFJFRSk7DQo+ PiArDQo+PiArICAvLyBsZXRzIGp1c3QgcmV0dXJuIG9rIGFzIG90aGVyIGVycm9ycyBoYXZl IGFscmVhZHkgb2NjdXJyZWQNCj4+ICsgIGlmIChsdHlwZSA9PSBlcnJvcl9tYXJrX25vZGUg fHwgcnR5cGUgPT0gZXJyb3JfbWFya19ub2RlKQ0KPj4gKyAgICByZXR1cm4gdHJ1ZTsNCj4+ ICsNCj4+ICsgIHRyZWUgbHR5cGVfZG9tYWluID0gVFlQRV9ET01BSU4gKGx0eXBlKTsNCj4+ ICsgIGlmICghbHR5cGVfZG9tYWluKQ0KPj4gKyAgICByZXR1cm4gZmFsc2U7DQo+PiArDQo+ PiArICBpZiAoIVRSRUVfQ09OU1RBTlQgKFRZUEVfTUFYX1ZBTFVFIChsdHlwZV9kb21haW4p KSkNCj4+ICsgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgdW5zaWduZWQgSE9TVF9X SURFX0lOVCBsdHlwZV9sZW5ndGgNCj4+ICsgICAgPSB3aTo6ZXh0ICh3aTo6dG9fb2Zmc2V0 IChUWVBFX01BWF9WQUxVRSAobHR5cGVfZG9tYWluKSkNCj4+ICsgICAgICAgICAgICAgICAg LSB3aTo6dG9fb2Zmc2V0IChUWVBFX01JTl9WQUxVRSAobHR5cGVfZG9tYWluKSkgKyAxLA0K PiANCj4gVFlQRV9NSU5fVkFMVUUgaXMgbm90IGNoZWNrZWQgdG8gYmUgY29uc3RhbnQsIGFs c28gdGhlIGNvcnJlY3QNCj4gY2hlY2sgd291bGQgYmUgdG8gdXNlIFRSRUVfQ09ERSAoLi4p ID09IElOVEVHRVJfQ1NULCBpbg0KPiB0aGUgR0NDIG1pZGRsZS1lbmQgYW4gZXhwcmVzc2lv biAnMSArIDInIChhIFBMVVNfRVhQUikgd291bGQNCj4gYmUgVFJFRV9DT05TVEFOVCBidXQg d2k6OnRvX29mZnNldCB3b3VsZCBJQ0UuDQo+IA0KPj4gKyAgICAgICAgICAgICAgVFlQRV9Q UkVDSVNJT04gKFRSRUVfVFlQRSAobHR5cGVfZG9tYWluKSksDQo+PiArICAgICAgICAgICAg ICBUWVBFX1NJR04gKFRSRUVfVFlQRSAobHR5cGVfZG9tYWluKSkpDQo+PiArICAgICAgIC50 b191aHdpICgpOw0KPiANCj4gLnRvX3Vod2kgd2lsbCBqdXN0IHRydW5jYXRlIGlmIHRoZSB2 YWx1ZSBkb2Vzbid0IGZpdCwgdGhlIHNhbWUgcmVzdWx0IGFzDQo+IGFib3ZlIGlzIGFjaGll dmVkIHdpdGgNCj4gDQo+ICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBsdHlwZV9sZW5ndGgN Cj4gICAgICA9IFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfTUFYX1ZBTFVFICguLikpDQo+ICAg ICAgICAtIFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfTUlOX1ZBTFVFICguLi4pKSArIDE7DQo+ IA0KPiBzbyBpdCBhcHBlYXJzIHlvdSB3YW50ZWQgdG8gYmUgIm1vcmUgY29ycmVjdCIgaGVy ZSAoYnV0IGlmIEkgc2VlDQo+IGNvcnJlY3RseSB5b3UgZmFpbCBvbiB0aGF0IGF0dGVtcHQp Pw0KPiANCj4+ICsNCj4+ICsgIHRyZWUgcnR5cGVfZG9tYWluID0gVFlQRV9ET01BSU4gKHJ0 eXBlKTsNCj4+ICsgIGlmICghcnR5cGVfZG9tYWluKQ0KPj4gKyAgICByZXR1cm4gZmFsc2U7 DQo+PiArDQo+PiArICBpZiAoIVRSRUVfQ09OU1RBTlQgKFRZUEVfTUFYX1ZBTFVFIChydHlw ZV9kb21haW4pKSkNCj4+ICsgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBydHlwZV9sZW5ndGgNCj4+ICsgICAgPSB3aTo6ZXh0ICh3aTo6 dG9fb2Zmc2V0IChUWVBFX01BWF9WQUxVRSAocnR5cGVfZG9tYWluKSkNCj4+ICsgICAgICAg ICAgICAgICAgLSB3aTo6dG9fb2Zmc2V0IChUWVBFX01JTl9WQUxVRSAocnR5cGVfZG9tYWlu KSkgKyAxLA0KPj4gKyAgICAgICAgICAgICAgVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAo cnR5cGVfZG9tYWluKSksDQo+PiArICAgICAgICAgICAgICBUWVBFX1NJR04gKFRSRUVfVFlQ RSAocnR5cGVfZG9tYWluKSkpDQo+PiArICAgICAgIC50b191aHdpICgpOw0KPj4gKw0KPj4g KyAgaWYgKGx0eXBlX2xlbmd0aCAhPSBydHlwZV9sZW5ndGgpDQo+PiArICAgIHsNCj4+ICsg ICAgICBydXN0X2Vycm9yX2F0ICgNCj4+ICsgICAgICAgcnZhbHVlX2xvY3VzLA0KPj4gKyAg ICAgICAiZXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhIGZpeGVkIHNpemUgb2YgIiBIT1NUX1dJ REVfSU5UX1BSSU5UX1VOU0lHTkVEDQo+PiArICAgICAgICIgZWxlbWVudHMsIGZvdW5kIG9u ZSB3aXRoICIgSE9TVF9XSURFX0lOVF9QUklOVF9VTlNJR05FRCAiIGVsZW1lbnRzIiwNCj4+ ICsgICAgICAgbHR5cGVfbGVuZ3RoLCBydHlwZV9sZW5ndGgpOw0KPiANCj4gSSB3b25kZXIg d2h5IHlvdSB1c2UgdGhlICd0cmVlJyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJyYXkgdHlw ZXMgZm9yIHRoaXMNCj4gZGlhZ25vc3RpYz8gIEkgd291bGQgaGF2ZSBleHBlY3RlZCBzdWNo IHZlcmlmaWNhdGlvbiB0byBiZSBkb25lIG9uIHRoZQ0KPiBvcmlnaW5hbCBBU1QNCj4gZGF0 YSBzdHJ1Y3R1cmVzPw0KPiANCg0KVHJ1ZSwgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBkb25l IGluIG91ciBBU1Qgb3IgSElSLiBJIHRoaW5rIHRoZXJlIGFyZSANCnN0aWxsIHNvbWUgcGxh Y2VzIHdoZXJlIHdlIHBlcmZvcm0gc29tZSBjaGVja3Mgb24gR0VORVJJQyByYXRoZXIgdGhh biBvbiANCm91ciBISVIuIEknbGwgbG9vayBpbnRvIG1vdmluZyB0aGVtLg0KDQo+PiArICAg ICAgcmV0dXJuIGZhbHNlOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1cm4gdHJ1ZTsN Cj4+ICt9DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFt ZXNwYWNlIFJ1c3QNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29t cGlsZS5oIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUuaA0KPj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi42MmViYWM2OWNjMQ0KPj4gLS0t IC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUuaA0K Pj4gQEAgLTAsMCArMSw0NyBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8vIFRoaXMgZmlsZSBp cyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8vIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9uLg0K Pj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0KPj4g Ky8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+PiArDQo+ PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxl IENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4NCj4+ICsNCj4+ICsjaWZuZGVmIFJVU1RfQ09NUElMRV9IDQo+PiArI2RlZmlu ZSBSVVNUX0NPTVBJTEVfSA0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LXN5c3RlbS5oIg0K Pj4gKyNpbmNsdWRlICJydXN0LWhpci1mdWxsLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29t cGlsZS1jb250ZXh0LmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gK25hbWVz cGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtjbGFzcyBDb21waWxlQ3JhdGUNCj4+ICt7DQo+ PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHZvaWQgQ29tcGlsZSAoSElSOjpDcmF0ZSAmY3Jh dGUsIENvbnRleHQgKmN0eCk7DQo+PiArDQo+PiArICB+Q29tcGlsZUNyYXRlICgpOw0KPj4g Kw0KPj4gK3ByaXZhdGU6DQo+PiArICBDb21waWxlQ3JhdGUgKEhJUjo6Q3JhdGUgJmNyYXRl LCBDb250ZXh0ICpjdHgpOw0KPj4gKyAgdm9pZCBnbyAoKTsNCj4+ICsNCj4+ICsgIEhJUjo6 Q3JhdGUgJmNyYXRlOw0KPj4gKyAgQ29udGV4dCAqY3R4Ow0KPj4gK307DQo+PiArDQo+PiAr fSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsN Cj4+ICsjZW5kaWYgLy8gUlVTVF9DT01QSUxFX0gNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVz dC9iYWNrZW5kL3J1c3QtY29uc3RleHByLmNjIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNv bnN0ZXhwci5jYw0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAw MDAwLi41M2M2ZWY2YTY2OA0KPj4gLS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3Qv YmFja2VuZC9ydXN0LWNvbnN0ZXhwci5jYw0KPj4gQEAgLTAsMCArMSw0NDEgQEANCj4+ICsv LyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5k ZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiAr Ly8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC SUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRh aWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7 IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3QtY29uc3Rl eHByLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtbG9jYXRpb24uaCINCj4+ICsjaW5jbHVkZSAi cnVzdC1kaWFnbm9zdGljcy5oIg0KPj4gKyNpbmNsdWRlICJydXN0LXRyZWUuaCINCj4+ICsN Cj4+ICsjaW5jbHVkZSAiZm9sZC1jb25zdC5oIg0KPj4gKyNpbmNsdWRlICJyZWFsbXBmci5o Ig0KPj4gKyNpbmNsdWRlICJjb252ZXJ0LmgiDQo+PiArI2luY2x1ZGUgInByaW50LXRyZWUu aCINCj4+ICsjaW5jbHVkZSAiZ2ltcGxpZnkuaCINCj4+ICsjaW5jbHVkZSAidHJlZS1pdGVy YXRvci5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29t cGlsZSB7DQo+PiArDQo+PiArc3RydWN0IGNvbnN0ZXhwcl9nbG9iYWxfY3R4DQo+PiArew0K Pj4gKyAgSE9TVF9XSURFX0lOVCBjb25zdGV4cHJfb3BzX2NvdW50Ow0KPiANCj4gSWYgdGhp cyBpc24ndCBhIElOVEVHRVJfQ1NUIHJlbGF0ZWQgdmFsdWUgdGhlbiBwbGVhc2UgYXZvaWQg SE9TVF9XSURFX0lOVA0KPiBhbmQgaW5zdGVhZCB1c2UgdWludDY0X3QgKG9yIG90aGVyIG1v cmUgYXBwcm9wcmlhdGUgdHlwZXMpLg0KPiANCj4+ICsNCj4+ICsgIGNvbnN0ZXhwcl9nbG9i YWxfY3R4ICgpIDogY29uc3RleHByX29wc19jb3VudCAoMCkge30NCj4+ICt9Ow0KPj4gKw0K Pj4gK3N0cnVjdCBjb25zdGV4cHJfY3R4DQo+PiArew0KPj4gKyAgY29uc3RleHByX2dsb2Jh bF9jdHggKmdsb2JhbDsNCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArY29u c3RhbnRfdmFsdWVfMSAodHJlZSBkZWNsLCBib29sIHN0cmljdF9wLCBib29sIHJldHVybl9h Z2dyZWdhdGVfY3N0X29rX3AsDQo+PiArICAgICAgICAgICAgICAgICBib29sIHVuc2hhcmVf cCk7DQo+PiArdHJlZQ0KPj4gK2RlY2xfY29uc3RhbnRfdmFsdWUgKHRyZWUgZGVjbCwgYm9v bCB1bnNoYXJlX3ApOw0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkDQo+PiArbm9uX2NvbnN0X3Zh cl9lcnJvciAobG9jYXRpb25fdCBsb2MsIHRyZWUgcik7DQo+PiArDQo+PiArc3RhdGljIHRy ZWUNCj4+ICtjb25zdGV4cHJfZXhwcmVzc2lvbiAoY29uc3QgY29uc3RleHByX2N0eCAqY3R4 LCB0cmVlKTsNCj4+ICsNCj4+ICtzdGF0aWMgdHJlZQ0KPj4gK2NvbnN0ZXhwcl9mbl9yZXR2 YWwgKGNvbnN0IGNvbnN0ZXhwcl9jdHggKmN0eCwgdHJlZSByKTsNCj4+ICsNCj4+ICtzdGF0 aWMgdHJlZQ0KPj4gK2V2YWxfc3RvcmVfZXhwcmVzc2lvbiAoY29uc3QgY29uc3RleHByX2N0 eCAqY3R4LCB0cmVlIHIpOw0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArZXZhbF9jYWxs X2V4cHJlc3Npb24gKGNvbnN0IGNvbnN0ZXhwcl9jdHggKmN0eCwgdHJlZSByKTsNCj4+ICsN Cj4+ICtzdGF0aWMgdHJlZQ0KPj4gK2V2YWxfYmluYXJ5X2V4cHJlc3Npb24gKGNvbnN0IGNv bnN0ZXhwcl9jdHggKmN0eCwgdHJlZSByKTsNCj4+ICsNCj4+ICtzdGF0aWMgdHJlZQ0KPj4g K2dldF9mdW5jdGlvbl9uYW1lZF9pbl9jYWxsICh0cmVlIHQpOw0KPj4gKw0KPj4gK3RyZWUN Cj4+ICtmb2xkX2V4cHIgKHRyZWUgZXhwcikNCj4+ICt7DQo+PiArICBjb25zdGV4cHJfZ2xv YmFsX2N0eCBnbG9iYWxfY3R4Ow0KPj4gKyAgY29uc3RleHByX2N0eCBjdHggPSB7Jmdsb2Jh bF9jdHh9Ow0KPj4gKw0KPj4gKyAgdHJlZSBmb2xkZWQgPSBjb25zdGV4cHJfZXhwcmVzc2lv biAoJmN0eCwgZXhwcik7DQo+PiArICBydXN0X2Fzc2VydCAoZm9sZGVkICE9IE5VTExfVFJF RSk7DQo+PiArICByZXR1cm4gZm9sZGVkOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdHJl ZQ0KPj4gK2NvbnN0ZXhwcl9leHByZXNzaW9uIChjb25zdCBjb25zdGV4cHJfY3R4ICpjdHgs IHRyZWUgdCkNCj4+ICt7DQo+PiArICBsb2NhdGlvbl90IGxvYyA9IEVYUFJfTE9DQVRJT04g KHQpOw0KPj4gKw0KPj4gKyAgaWYgKENPTlNUQU5UX0NMQVNTX1AgKHQpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgaWYgKFRSRUVfT1ZFUkZMT1cgKHQpKQ0KPj4gKyAgICAgICB7DQo+PiAr ICAgICAgICAgZXJyb3JfYXQgKGxvYywgIm92ZXJmbG93IGluIGNvbnN0YW50IGV4cHJlc3Np b24iKTsNCj4+ICsgICAgICAgICByZXR1cm4gdDsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4g KyAgICAgIHJldHVybiB0Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBBdm9pZCBleGNl c3NpdmVseSBsb25nIGNvbnN0ZXhwciBldmFsdWF0aW9ucw0KPj4gKyAgaWYgKCsrY3R4LT5n bG9iYWwtPmNvbnN0ZXhwcl9vcHNfY291bnQgPj0gY29uc3RleHByX29wc19saW1pdCkNCj4+ ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKA0KPj4gKyAgICAgICBMb2NhdGlv biAobG9jKSwNCj4+ICsgICAgICAgIiU8Y29uc3RleHByJT4gZXZhbHVhdGlvbiBvcGVyYXRp b24gY291bnQgZXhjZWVkcyBsaW1pdCBvZiAiDQo+PiArICAgICAgICIld2QgKHVzZSAlPC1m Y29uc3RleHByLW9wcy1saW1pdD0lPiB0byBpbmNyZWFzZSB0aGUgbGltaXQpIiwNCj4+ICsg ICAgICAgY29uc3RleHByX29wc19saW1pdCk7DQo+PiArDQo+PiArICAgICAgcmV0dXJuIHQ7 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUgciA9IHQ7DQo+PiArICB0cmVlX2NvZGUg dGNvZGUgPSBUUkVFX0NPREUgKHQpOw0KPj4gKyAgc3dpdGNoICh0Y29kZSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIGNhc2UgQ09OU1RfREVDTDogew0KPj4gKyAgICAgICByID0gZGVjbF9j b25zdGFudF92YWx1ZSAodCwgLyp1bnNoYXJlX3A9Ki9mYWxzZSk7DQo+PiArICAgICAgIGlm IChUUkVFX0NPREUgKHIpID09IFRBUkdFVF9FWFBSDQo+PiArICAgICAgICAgICAmJiBUUkVF X0NPREUgKFRBUkdFVF9FWFBSX0lOSVRJQUwgKHIpKSA9PSBDT05TVFJVQ1RPUikNCj4+ICsg ICAgICAgICByID0gVEFSR0VUX0VYUFJfSU5JVElBTCAocik7DQo+PiArICAgICAgIGlmIChE RUNMX1AgKHIpKQ0KPj4gKyAgICAgICAgIHsNCj4+ICsgICAgICAgICAgIG5vbl9jb25zdF92 YXJfZXJyb3IgKGxvYywgcik7DQo+PiArICAgICAgICAgICByZXR1cm4gcjsNCj4+ICsgICAg ICAgICB9DQo+PiArICAgICAgfQ0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICBj YXNlIFBPSU5URVJfUExVU19FWFBSOg0KPj4gKyAgICBjYXNlIFBPSU5URVJfRElGRl9FWFBS Og0KPj4gKyAgICBjYXNlIFBMVVNfRVhQUjoNCj4+ICsgICAgY2FzZSBNSU5VU19FWFBSOg0K Pj4gKyAgICBjYXNlIE1VTFRfRVhQUjoNCj4+ICsgICAgY2FzZSBUUlVOQ19ESVZfRVhQUjoN Cj4+ICsgICAgY2FzZSBDRUlMX0RJVl9FWFBSOg0KPj4gKyAgICBjYXNlIEZMT09SX0RJVl9F WFBSOg0KPj4gKyAgICBjYXNlIFJPVU5EX0RJVl9FWFBSOg0KPj4gKyAgICBjYXNlIFRSVU5D X01PRF9FWFBSOg0KPj4gKyAgICBjYXNlIENFSUxfTU9EX0VYUFI6DQo+PiArICAgIGNhc2Ug Uk9VTkRfTU9EX0VYUFI6DQo+PiArICAgIGNhc2UgUkRJVl9FWFBSOg0KPj4gKyAgICBjYXNl IEVYQUNUX0RJVl9FWFBSOg0KPj4gKyAgICBjYXNlIE1JTl9FWFBSOg0KPj4gKyAgICBjYXNl IE1BWF9FWFBSOg0KPj4gKyAgICBjYXNlIExTSElGVF9FWFBSOg0KPj4gKyAgICBjYXNlIFJT SElGVF9FWFBSOg0KPj4gKyAgICBjYXNlIExST1RBVEVfRVhQUjoNCj4+ICsgICAgY2FzZSBS Uk9UQVRFX0VYUFI6DQo+PiArICAgIGNhc2UgQklUX0lPUl9FWFBSOg0KPj4gKyAgICBjYXNl IEJJVF9YT1JfRVhQUjoNCj4+ICsgICAgY2FzZSBCSVRfQU5EX0VYUFI6DQo+PiArICAgIGNh c2UgVFJVVEhfWE9SX0VYUFI6DQo+PiArICAgIGNhc2UgTFRfRVhQUjoNCj4+ICsgICAgY2Fz ZSBMRV9FWFBSOg0KPj4gKyAgICBjYXNlIEdUX0VYUFI6DQo+PiArICAgIGNhc2UgR0VfRVhQ UjoNCj4+ICsgICAgY2FzZSBFUV9FWFBSOg0KPj4gKyAgICBjYXNlIE5FX0VYUFI6DQo+PiAr ICAgIGNhc2UgU1BBQ0VTSElQX0VYUFI6DQo+PiArICAgIGNhc2UgVU5PUkRFUkVEX0VYUFI6 DQo+PiArICAgIGNhc2UgT1JERVJFRF9FWFBSOg0KPj4gKyAgICBjYXNlIFVOTFRfRVhQUjoN Cj4+ICsgICAgY2FzZSBVTkxFX0VYUFI6DQo+PiArICAgIGNhc2UgVU5HVF9FWFBSOg0KPj4g KyAgICBjYXNlIFVOR0VfRVhQUjoNCj4+ICsgICAgY2FzZSBVTkVRX0VYUFI6DQo+PiArICAg IGNhc2UgTFRHVF9FWFBSOg0KPj4gKyAgICBjYXNlIFJBTkdFX0VYUFI6DQo+PiArICAgIGNh c2UgQ09NUExFWF9FWFBSOg0KPj4gKyAgICAgIHIgPSBldmFsX2JpbmFyeV9leHByZXNzaW9u IChjdHgsIHQpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICBjYXNlIENBTExf RVhQUjoNCj4+ICsgICAgICByID0gZXZhbF9jYWxsX2V4cHJlc3Npb24gKGN0eCwgdCk7DQo+ PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgUkVUVVJOX0VYUFI6DQo+PiAr ICAgICAgcnVzdF9hc3NlcnQgKFRSRUVfT1BFUkFORCAodCwgMCkgIT0gTlVMTF9UUkVFKTsN Cj4+ICsgICAgICByID0gY29uc3RleHByX2V4cHJlc3Npb24gKGN0eCwgVFJFRV9PUEVSQU5E ICh0LCAwKSk7DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgTU9ESUZZ X0VYUFI6DQo+PiArICAgICAgciA9IGV2YWxfc3RvcmVfZXhwcmVzc2lvbiAoY3R4LCB0KTsN Cj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgZGVmYXVsdDoNCj4+ICsgICAgICBi cmVhazsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIHI7DQo+PiArfQ0KPj4gKw0K Pj4gK3N0YXRpYyB0cmVlDQo+PiArZXZhbF9zdG9yZV9leHByZXNzaW9uIChjb25zdCBjb25z dGV4cHJfY3R4ICpjdHgsIHRyZWUgdCkNCj4+ICt7DQo+PiArICB0cmVlIGluaXQgPSBUUkVF X09QRVJBTkQgKHQsIDEpOw0KPj4gKyAgaWYgKFRSRUVfQ0xPQkJFUl9QIChpbml0KSkNCj4+ ICsgICAgLyogSnVzdCBpZ25vcmUgY2xvYmJlcnMuICAqLw0KPj4gKyAgICByZXR1cm4gdm9p ZF9ub2RlOw0KPj4gKw0KPj4gKyAgLyogRmlyc3Qgd2UgZmlndXJlIG91dCB3aGVyZSB3ZSdy ZSBzdG9yaW5nIHRvLiAgKi8NCj4+ICsgIHRyZWUgdGFyZ2V0ID0gVFJFRV9PUEVSQU5EICh0 LCAwKTsNCj4+ICsNCj4+ICsgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAodGFyZ2V0KTsNCj4+ ICsgIGJvb2wgcHJlZXZhbCA9IFNDQUxBUl9UWVBFX1AgKHR5cGUpIHx8IFRSRUVfQ09ERSAo dCkgPT0gTU9ESUZZX0VYUFI7DQo+PiArICBpZiAocHJlZXZhbCkNCj4+ICsgICAgew0KPj4g KyAgICAgIC8qIEV2YWx1YXRlIHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgd2l0aG91dCBrbm93 aW5nIHdoYXQgb2JqZWN0IGl0IHdpbGwgYmUNCj4+ICsgICAgICAgIHN0b3JlZCBpbiwgc28g dGhhdCBhbnkgc2lkZS1lZmZlY3RzIGhhcHBlbiBmaXJzdC4gICovDQo+PiArICAgICAgaW5p dCA9IGZvbGRfZXhwciAoaW5pdCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGJvb2wgZXZh bHVhdGVkID0gZmFsc2U7DQo+PiArICB0cmVlIG9iamVjdCA9IE5VTExfVFJFRTsNCj4+ICsg IGZvciAodHJlZSBwcm9iZSA9IHRhcmdldDsgb2JqZWN0ID09IE5VTExfVFJFRTspDQo+PiAr ICAgIHsNCj4+ICsgICAgICBzd2l0Y2ggKFRSRUVfQ09ERSAocHJvYmUpKQ0KPj4gKyAgICAg ICB7DQo+PiArICAgICAgIGRlZmF1bHQ6DQo+PiArICAgICAgICAgaWYgKGV2YWx1YXRlZCkN Cj4+ICsgICAgICAgICAgIG9iamVjdCA9IHByb2JlOw0KPj4gKyAgICAgICAgIGVsc2UNCj4+ ICsgICAgICAgICAgIHsNCj4+ICsgICAgICAgICAgICAgcHJvYmUgPSBjb25zdGV4cHJfZXhw cmVzc2lvbiAoY3R4LCBwcm9iZSk7DQo+PiArICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRy dWU7DQo+PiArICAgICAgICAgICB9DQo+PiArICAgICAgICAgYnJlYWs7DQo+PiArICAgICAg IH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIGluaXQ7DQo+PiArfQ0KPj4gKw0K Pj4gKy8qIFN1YnJvdXRpbmUgb2YgY3h4X2V2YWxfY29uc3RhbnRfZXhwcmVzc2lvbi4NCj4+ ICsgTGlrZSBjeHhfZXZhbF91bmFyeV9leHByZXNzaW9uLCBleGNlcHQgZm9yIGJpbmFyeSBl eHByZXNzaW9ucy4gICovDQo+PiArc3RhdGljIHRyZWUNCj4+ICtldmFsX2JpbmFyeV9leHBy ZXNzaW9uIChjb25zdCBjb25zdGV4cHJfY3R4ICpjdHgsIHRyZWUgdCkNCj4+ICt7DQo+PiAr ICB0cmVlIG9yaWdfbGhzID0gVFJFRV9PUEVSQU5EICh0LCAwKTsNCj4+ICsgIHRyZWUgb3Jp Z19yaHMgPSBUUkVFX09QRVJBTkQgKHQsIDEpOw0KPj4gKyAgdHJlZSBsaHMsIHJoczsNCj4+ ICsNCj4+ICsgIGxocyA9IGNvbnN0ZXhwcl9leHByZXNzaW9uIChjdHgsIG9yaWdfbGhzKTsN Cj4+ICsgIHJocyA9IGNvbnN0ZXhwcl9leHByZXNzaW9uIChjdHgsIG9yaWdfcmhzKTsNCj4+ ICsNCj4+ICsgIGxvY2F0aW9uX3QgbG9jID0gRVhQUl9MT0NBVElPTiAodCk7DQo+PiArICBl bnVtIHRyZWVfY29kZSBjb2RlID0gVFJFRV9DT0RFICh0KTsNCj4+ICsgIHRyZWUgdHlwZSA9 IFRSRUVfVFlQRSAodCk7DQo+PiArDQo+PiArICByZXR1cm4gZm9sZF9iaW5hcnlfbG9jIChs b2MsIGNvZGUsIHR5cGUsIGxocywgcmhzKTsNCj4gDQo+IEl0IHNlZW1zIHlvdSByZWx5IG9u IHRoZSBtaWRkbGUtZW5kIHRvIGRldGVybWluZSBjb25zdGV4cHIgY29ycmVjdG5lc3MgaGVy ZT8NCj4gTGlrZSByZWx5IG9uIHggLSB4IHRvIGV2YWx1YXRlIHRvIHplcm8/ICBJZiB5b3Ug anVzdCByZWx5IG9uIHJlc29sdmluZw0KPiBleHByZXNzaW9ucw0KPiB3aXRoIGNvbnN0YW50 IG9wZXJhbmRzIHlvdSBtaWdodCB3YW50IHRvIHVzZSBjb25zdF97YmluLHVufW9wIGluc3Rl YWQuDQo+IA0KDQpUaGlzIHdhcyBwb3J0ZWQgb3ZlciBmcm9tIHRoZSBDKysgZnJvbnRlbmQg YW5kIGlzIG1pc3NpbmcgYSBsb3Qgb2YgDQpwaWVjZXMuIFdlIGRvIG5vdCBjdXJyZW50bHkg ZG8gYSBsb3Qgb2YgY29uc3RhbnQgZm9sZGluZyBhbmQgdGhpcyB3aWxsIA0KbmVlZCBhIGxv dCBvZiBpbXByb3ZlbWVudCBvdmVyIHRpbWUuDQoNCj4+ICt9DQo+PiArDQo+PiArLy8gU3Vi cm91dGluZSBvZiBjeHhfZXZhbF9jb25zdGFudF9leHByZXNzaW9uLg0KPj4gKy8vIEV2YWx1 YXRlIHRoZSBjYWxsIGV4cHJlc3Npb24gdHJlZSBUIGluIHRoZSBjb250ZXh0IG9mIE9MRF9D QUxMIGV4cHJlc3Npb24NCj4+ICsvLyBldmFsdWF0aW9uLg0KPj4gK3N0YXRpYyB0cmVlDQo+ PiArZXZhbF9jYWxsX2V4cHJlc3Npb24gKGNvbnN0IGNvbnN0ZXhwcl9jdHggKmN0eCwgdHJl ZSB0KQ0KPj4gK3sNCj4+ICsgIHRyZWUgZnVuID0gZ2V0X2Z1bmN0aW9uX25hbWVkX2luX2Nh bGwgKHQpOw0KPj4gKyAgcmV0dXJuIGNvbnN0ZXhwcl9mbl9yZXR2YWwgKGN0eCwgREVDTF9T QVZFRF9UUkVFIChmdW4pKTsNCj4+ICt9DQo+PiArDQo+PiArLy8gU3Vicm91dGluZSBvZiBj aGVja19jb25zdGV4cHJfZnVuZGVmLiAgQk9EWSBpcyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9u DQo+PiArLy8gZGVjbGFyZWQgdG8gYmUgY29uc3RleHByLCBvciBhIHN1Yi1zdGF0ZW1lbnQg dGhlcmVvZi4gIFJldHVybnMgdGhlDQo+PiArLy8gcmV0dXJuIHZhbHVlIGlmIHN1aXRhYmxl LCBlcnJvcl9tYXJrX25vZGUgZm9yIGEgc3RhdGVtZW50IG5vdCBhbGxvd2VkIGluDQo+PiAr Ly8gYSBjb25zdGV4cHIgZnVuY3Rpb24sIG9yIE5VTExfVFJFRSBpZiBubyByZXR1cm4gdmFs dWUgd2FzIGZvdW5kLg0KPj4gK3N0YXRpYyB0cmVlDQo+PiArY29uc3RleHByX2ZuX3JldHZh bCAoY29uc3QgY29uc3RleHByX2N0eCAqY3R4LCB0cmVlIGJvZHkpDQo+PiArew0KPj4gKyAg c3dpdGNoIChUUkVFX0NPREUgKGJvZHkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgY2FzZSBT VEFURU1FTlRfTElTVDogew0KPj4gKyAgICAgICB0cmVlIGV4cHIgPSBOVUxMX1RSRUU7DQo+ PiArICAgICAgIGZvciAodHJlZSBzdG10IDogdHNpX3JhbmdlIChib2R5KSkNCj4+ICsgICAg ICAgICB7DQo+PiArICAgICAgICAgICB0cmVlIHMgPSBjb25zdGV4cHJfZm5fcmV0dmFsIChj dHgsIHN0bXQpOw0KPj4gKyAgICAgICAgICAgaWYgKHMgPT0gZXJyb3JfbWFya19ub2RlKQ0K Pj4gKyAgICAgICAgICAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOw0KPj4gKyAgICAgICAg ICAgZWxzZSBpZiAocyA9PSBOVUxMX1RSRUUpDQo+PiArICAgICAgICAgICAgIC8qIEtlZXAg aXRlcmF0aW5nLiAgKi87DQo+PiArICAgICAgICAgICBlbHNlIGlmIChleHByKQ0KPj4gKyAg ICAgICAgICAgICAvKiBNdWx0aXBsZSByZXR1cm4gc3RhdGVtZW50cy4gICovDQo+PiArICAg ICAgICAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArICAgICAgICAgICBlbHNl DQo+PiArICAgICAgICAgICAgIGV4cHIgPSBzOw0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAg ICAgcmV0dXJuIGV4cHI7DQo+PiArICAgICAgfQ0KPj4gKw0KPj4gKyAgICBjYXNlIFJFVFVS Tl9FWFBSOg0KPj4gKyAgICAgIHJldHVybiBjb25zdGV4cHJfZXhwcmVzc2lvbiAoY3R4LCBi b2R5KTsNCj4+ICsNCj4+ICsgICAgICBjYXNlIERFQ0xfRVhQUjogew0KPj4gKyAgICAgICB0 cmVlIGRlY2wgPSBERUNMX0VYUFJfREVDTCAoYm9keSk7DQo+PiArICAgICAgIGlmIChUUkVF X0NPREUgKGRlY2wpID09IFVTSU5HX0RFQ0wNCj4+ICsgICAgICAgICAgIC8qIEFjY2VwdCBf X2Z1bmNfXywgX19GVU5DVElPTl9fLCBhbmQgX19QUkVUVFlfRlVOQ1RJT05fXy4gICovDQo+ PiArICAgICAgICAgICB8fCBERUNMX0FSVElGSUNJQUwgKGRlY2wpKQ0KPj4gKyAgICAgICAg IHJldHVybiBOVUxMX1RSRUU7DQo+PiArICAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7 DQo+PiArICAgICAgfQ0KPj4gKw0KPj4gKyAgICBjYXNlIENMRUFOVVBfUE9JTlRfRVhQUjoN Cj4+ICsgICAgICByZXR1cm4gY29uc3RleHByX2ZuX3JldHZhbCAoY3R4LCBUUkVFX09QRVJB TkQgKGJvZHksIDApKTsNCj4+ICsNCj4+ICsgICAgICBjYXNlIEJJTkRfRVhQUjogew0KPj4g KyAgICAgICB0cmVlIGIgPSBCSU5EX0VYUFJfQk9EWSAoYm9keSk7DQo+PiArICAgICAgIHJl dHVybiBjb25zdGV4cHJfZm5fcmV0dmFsIChjdHgsIGIpOw0KPj4gKyAgICAgIH0NCj4+ICsg ICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgZGVmYXVsdDoNCj4+ICsgICAgICByZXR1cm4g ZXJyb3JfbWFya19ub2RlOw0KPj4gKyAgICB9DQo+PiArICByZXR1cm4gZXJyb3JfbWFya19u b2RlOw0KPj4gK30NCj4+ICsNCj4+ICsvLyBUYWtlbiBmcm9tIGNwL2NvbnN0ZXhwci5jYw0K Pj4gKy8vDQo+PiArLy8gSWYgREVDTCBpcyBhIHNjYWxhciBlbnVtZXJhdGlvbiBjb25zdGFu dCBvciB2YXJpYWJsZSB3aXRoIGENCj4+ICsvLyBjb25zdGFudCBpbml0aWFsaXplciwgcmV0 dXJuIHRoZSBpbml0aWFsaXplciAob3IsIGl0cyBpbml0aWFsaXplcnMsDQo+PiArLy8gcmVj dXJzaXZlbHkpOyBvdGhlcndpc2UsIHJldHVybiBERUNMLiAgSWYgU1RSSUNUX1AsIHRoZQ0K Pj4gKy8vIGluaXRpYWxpemVyIGlzIG9ubHkgcmV0dXJuZWQgaWYgREVDTCBpcyBhDQo+PiAr Ly8gY29uc3RhbnQtZXhwcmVzc2lvbi4gIElmIFJFVFVSTl9BR0dSRUdBVEVfQ1NUX09LX1As IGl0IGlzIG9rIHRvDQo+PiArLy8gcmV0dXJuIGFuIGFnZ3JlZ2F0ZSBjb25zdGFudC4gIElm IFVOU0hBUkVfUCwgcmV0dXJuIGFuIHVuc2hhcmVkDQo+PiArLy8gY29weSBvZiB0aGUgaW5p dGlhbGl6ZXIuDQo+PiArc3RhdGljIHRyZWUNCj4+ICtjb25zdGFudF92YWx1ZV8xICh0cmVl IGRlY2wsIGJvb2wgc3RyaWN0X3AsIGJvb2wgcmV0dXJuX2FnZ3JlZ2F0ZV9jc3Rfb2tfcCwN Cj4+ICsgICAgICAgICAgICAgICAgIGJvb2wgdW5zaGFyZV9wKQ0KPj4gK3sNCj4+ICsgIHdo aWxlIChUUkVFX0NPREUgKGRlY2wpID09IENPTlNUX0RFQ0wpDQo+PiArICAgIHsNCj4+ICsg ICAgICB0cmVlIGluaXQ7DQo+PiArICAgICAgLyogSWYgREVDTCBpcyBhIHN0YXRpYyBkYXRh IG1lbWJlciBpbiBhIHRlbXBsYXRlDQo+PiArICAgICAgICBzcGVjaWFsaXphdGlvbiwgd2Ug bXVzdCBpbnN0YW50aWF0ZSBpdCBoZXJlLiAgVGhlDQo+PiArICAgICAgICBpbml0aWFsaXpl ciBmb3IgdGhlIHN0YXRpYyBkYXRhIG1lbWJlciBpcyBub3QgcHJvY2Vzc2VkDQo+PiArICAg ICAgICB1bnRpbCBuZWVkZWQ7IHdlIG5lZWQgaXQgbm93LiAgKi8NCj4+ICsNCj4+ICsgICAg ICBpbml0ID0gREVDTF9JTklUSUFMIChkZWNsKTsNCj4+ICsgICAgICBpZiAoaW5pdCA9PSBl cnJvcl9tYXJrX25vZGUpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBpZiAoVFJFRV9D T0RFIChkZWNsKSA9PSBDT05TVF9ERUNMKQ0KPj4gKyAgICAgICAgICAgLyogVHJlYXQgdGhl IGVycm9yIGFzIGEgY29uc3RhbnQgdG8gYXZvaWQgY2FzY2FkaW5nIGVycm9ycyBvbg0KPj4g KyAgICAgICAgICAgICAgZXhjZXNzaXZlbHkgcmVjdXJzaXZlIHRlbXBsYXRlIGluc3RhbnRp YXRpb24gKGMrKy85MzM1KS4gICovDQo+PiArICAgICAgICAgICByZXR1cm4gaW5pdDsNCj4+ ICsgICAgICAgICBlbHNlDQo+PiArICAgICAgICAgICByZXR1cm4gZGVjbDsNCj4+ICsgICAg ICAgfQ0KPj4gKw0KPj4gKyAgICAgIGRlY2wgPSBpbml0Ow0KPj4gKyAgICB9DQo+PiArICBy ZXR1cm4gdW5zaGFyZV9wID8gdW5zaGFyZV9leHByIChkZWNsKSA6IGRlY2w7DQo+PiArfQ0K Pj4gKw0KPj4gKy8vIEEgbW9yZSByZWxheGVkIHZlcnNpb24gb2YgZGVjbF9yZWFsbHlfY29u c3RhbnRfdmFsdWUsIHVzZWQgYnkgdGhlDQo+PiArLy8gY29tbW9uIEMvQysrIGNvZGUuDQo+ PiArdHJlZQ0KPj4gK2RlY2xfY29uc3RhbnRfdmFsdWUgKHRyZWUgZGVjbCwgYm9vbCB1bnNo YXJlX3ApDQo+PiArew0KPj4gKyAgcmV0dXJuIGNvbnN0YW50X3ZhbHVlXzEgKGRlY2wsIC8q c3RyaWN0X3A9Ki9mYWxzZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmV0 dXJuX2FnZ3JlZ2F0ZV9jc3Rfb2tfcD0qL3RydWUsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAvKnVuc2hhcmVfcD0qL3Vuc2hhcmVfcCk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0 YXRpYyB2b2lkDQo+PiArbm9uX2NvbnN0X3Zhcl9lcnJvciAobG9jYXRpb25fdCBsb2MsIHRy ZWUgcikNCj4+ICt7DQo+PiArICBlcnJvcl9hdCAobG9jLA0KPj4gKyAgICAgICAgICAgInRo ZSB2YWx1ZSBvZiAlcUQgaXMgbm90IHVzYWJsZSBpbiBhIGNvbnN0YW50ICINCj4+ICsgICAg ICAgICAgICJleHByZXNzaW9uIiwNCj4+ICsgICAgICAgICAgIHIpOw0KPj4gKyAgLyogQXZv aWQgZXJyb3IgY2FzY2FkZS4gICovDQo+PiArICBpZiAoREVDTF9JTklUSUFMIChyKSA9PSBl cnJvcl9tYXJrX25vZGUpDQo+PiArICAgIHJldHVybjsNCj4+ICsNCj4+ICsgIC8vIG1vcmUg aW4gY3AvY29uc3RleHByLmNjDQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiAr Z2V0X2NhbGxlZSAodHJlZSBjYWxsKQ0KPj4gK3sNCj4+ICsgIGlmIChjYWxsID09IE5VTExf VFJFRSkNCj4+ICsgICAgcmV0dXJuIGNhbGw7DQo+PiArICBlbHNlIGlmIChUUkVFX0NPREUg KGNhbGwpID09IENBTExfRVhQUikNCj4+ICsgICAgcmV0dXJuIENBTExfRVhQUl9GTiAoY2Fs bCk7DQo+PiArDQo+PiArICByZXR1cm4gTlVMTF9UUkVFOw0KPj4gK30NCj4+ICsNCj4+ICsv LyBXZSBoYXZlIGFuIGV4cHJlc3Npb24gdHJlZSBUIHRoYXQgcmVwcmVzZW50cyBhIGNhbGws IGVpdGhlciBDQUxMX0VYUFINCj4+ICsvLyBvciBBR0dSX0lOSVRfRVhQUi4gSWYgdGhlIGNh bGwgaXMgbGV4aWNhbGx5IHRvIGEgbmFtZWQgZnVuY3Rpb24sDQo+IA0KPiBpdCBzZWVtcyBB R0dSX0lOSVRfRVhQUiBpc24ndCBoYW5kbGVkIGluIGdldF9jYWxsZWUuID4NCg0KU2ltaWxh cmx5LCB0aGlzIGlzIGR1ZSB0byBwb3J0aW5nIG92ZXIgYml0cyBhbmQgcGllY2VzIGZyb20g dGhlIEMrKyANCmNvbnN0YW50IGV2YWx1YXRvci4NCg0KPj4gKy8vIHJldHVybiB0aGUgX0RF Q0wgZm9yIHRoYXQgZnVuY3Rpb24uDQo+IA0KPiBUaGUgZnVuY3Rpb24gc2VlbXMgdG8gcmV0 dXJuIGEgZnVuY3Rpb24gcG9pbnRlciBpZiBpdCBpc24ndCBvZiB0aGUgJmZuZGVjbCBmb3Jt DQo+IHRob3VnaC4gIFdlIGhhdmUgZ2V0X2NhbGxlZV9mbmRlY2wgdGhhdCByZXR1cm5zIHRo ZSBfREVDTCBvciBOVUxMIGlmIGl0DQo+IGlzIG5vdCB0byBhIG5hbWVkIGZ1bmN0aW9uLg0K PiANCj4+ICtzdGF0aWMgdHJlZQ0KPj4gK2dldF9mdW5jdGlvbl9uYW1lZF9pbl9jYWxsICh0 cmVlIHQpDQo+PiArew0KPj4gKyAgdHJlZSBmdW4gPSBnZXRfY2FsbGVlICh0KTsNCj4+ICsg IGlmIChmdW4gJiYgVFJFRV9DT0RFIChmdW4pID09IEFERFJfRVhQUg0KPj4gKyAgICAgICYm IFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChmdW4sIDApKSA9PSBGVU5DVElPTl9ERUNMKQ0K Pj4gKyAgICBmdW4gPSBUUkVFX09QRVJBTkQgKGZ1biwgMCk7DQo+PiArICByZXR1cm4gZnVu Ow0KPj4gK30NCj4+ICsNCj4+ICsvLyBmb3JrZWQgZnJvbSBnY2MvY3AvY29uc3RleHByLmNj IG1heWJlX2NvbnN0ZXhwcl9mbg0KPj4gKw0KPj4gKy8qIFRydWUgaWYgYSBmdW5jdGlvbiBt aWdodCBiZSBkZWNsYXJlZCBjb25zdGV4cHIgICovDQo+PiArDQo+PiArYm9vbA0KPj4gK21h eWJlX2NvbnN0ZXhwcl9mbiAodHJlZSB0KQ0KPj4gK3sNCj4+ICsgIHJldHVybiAoREVDTF9E RUNMQVJFRF9DT05TVEVYUFJfUCAodCkpOw0KPj4gK30NCj4+ICsNCj4+ICsvLyBmb3JrZWQg ZnJvbSBnY2MvY3AvY29uc3RleHByLmNjIGdldF9udGhfY2FsbGFyZw0KPj4gKw0KPj4gKy8q IFdlIGhhdmUgYW4gZXhwcmVzc2lvbiB0cmVlIFQgdGhhdCByZXByZXNlbnRzIGEgY2FsbCwg ZWl0aGVyIENBTExfRVhQUi4NCj4+ICsgIFJldHVybiB0aGUgTnRoIGFyZ3VtZW50LiAgKi8N Cj4+ICsNCj4+ICtpbmxpbmUgdHJlZQ0KPj4gK2dldF9udGhfY2FsbGFyZyAodHJlZSB0LCBp bnQgbikNCj4+ICt7DQo+PiArICBzd2l0Y2ggKFRSRUVfQ09ERSAodCkpDQo+PiArICAgIHsN Cj4+ICsgICAgY2FzZSBDQUxMX0VYUFI6DQo+PiArICAgICAgcmV0dXJuIENBTExfRVhQUl9B UkcgKHQsIG4pOw0KPj4gKw0KPj4gKyAgICBkZWZhdWx0Og0KPj4gKyAgICAgIGdjY191bnJl YWNoYWJsZSAoKTsNCj4gDQo+IHRyZWUgY2hlY2tpbmcgc2hvdWxkIGFscmVhZHkgY292ZXIg dGhpcyBzbyB0aGUgd3JhcHBlciBjb3VsZCBiZSBqdXN0DQo+IA0KPiAgICByZXR1cm4gQ0FM TF9FWFBSX0FSRyAodCwgbik7DQo+IA0KPiBub3Qgc3VyZSBpZiBpdCBpcyB3b3J0aCB3cmFw cGluZyBhdCBhbGwgLi4uDQo+IA0KPj4gKyAgICAgIHJldHVybiBOVUxMOw0KPj4gKyAgICB9 DQo+PiArfQ0KPj4gKw0KPj4gKy8vIGZvcmtlZCBmcm9tIGdjYy9jcC9jb25zdGV4cHIuY2Mg dmFyX2luX21heWJlX2NvbnN0ZXhwcl9mbg0KPj4gKw0KPj4gKy8qIFRydWUgaWYgVCB3YXMg ZGVjbGFyZWQgaW4gYSBmdW5jdGlvbiB0aGF0IG1pZ2h0IGJlIGNvbnN0ZXhwcjogZWl0aGVy IGENCj4+ICsgICBmdW5jdGlvbiB0aGF0IHdhcyBkZWNsYXJlZCBjb25zdGV4cHIuICAqLw0K Pj4gKw0KPj4gK2Jvb2wNCj4+ICt2YXJfaW5fbWF5YmVfY29uc3RleHByX2ZuICh0cmVlIHQp DQo+PiArew0KPj4gKyAgcmV0dXJuIChERUNMX0ZVTkNUSU9OX1NDT1BFX1AgKHQpICYmIG1h eWJlX2NvbnN0ZXhwcl9mbiAoREVDTF9DT05URVhUICh0KSkpOw0KPj4gK30NCj4+ICsNCj4+ ICt9IC8vIG5hbWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4g ZGlmZiAtLWdpdCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb25zdGV4cHIuaCBiL2djYy9y dXN0L2JhY2tlbmQvcnVzdC1jb25zdGV4cHIuaA0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQN Cj4+IGluZGV4IDAwMDAwMDAwMDAwLi4zY2ZjZWM4MTdhOQ0KPj4gLS0tIC9kZXYvbnVsbA0K Pj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbnN0ZXhwci5oDQo+PiBAQCAtMCww ICsxLDMxIEBADQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4g Ky8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24p IGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VU IEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiAr Ly8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8v IGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+ PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5k ZWYgUlVTVF9DT05TVEVYUFINCj4+ICsjZGVmaW5lIFJVU1RfQ09OU1RFWFBSDQo+PiArDQo+ PiArI2luY2x1ZGUgInJ1c3Qtc3lzdGVtLmgiDQo+PiArI2luY2x1ZGUgInRyZWUuaCINCj4+ ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNwYWNlIENvbXBpbGUgew0KPj4g Kw0KPj4gK2V4dGVybiB0cmVlIGZvbGRfZXhwciAodHJlZSk7DQo+PiArDQo+PiArfSAvLyBu YW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsj ZW5kaWYgLy8gUlVTVF9DT05TVEVYUFINCj4+IC0tDQo+PiAyLjM3LjINCj4gDQo+IE92ZXJh bGwgdGhpcyBwYXJ0IG9mIHRoZSBydXN0IGZyb250ZW5kIGxvb2tzIE9LLiAgVGFrZSB0aGUg Y29tbWVudHMgYXMNCj4gc3VnZ2VzdGlvbnMgKGZvciBmdXR1cmUNCj4gZW5oYW5jZW1lbnRz KS4NCg0KVGhhbmsgeW91ISBUaGlzIGlzIGFsbCB2ZXJ5IHdlbGNvbWUgYW5kIEknbSBnbGFk IHlvdSB0b29rIHRoZSB0aW1lIHRvIA0Kc2VuZCB0aGVzZSBjb21tZW50cy4gSSBhbSBjb250 YWN0aW5nIHRoZSBhdXRob3Igb2Ygb3VyIGNvbnN0YW50IA0KZXZhbHVhdG9yICh3aG8gc2hv dWxkIGhhdmUgYmVlbiBDY2VkIGlmIEkgaGFkbid0IG1lc3NlZCBpdCB1cCkgdG8gc2VlIA0K YWJvdXQgaW1wcm92aW5nIHRoZSBwYXJ0cyB5b3Ugbm90ZWQuDQoNCj4gDQo+IFRoYW5rcywN Cj4gUmljaGFyZC4NCg0KDQpBbGwgdGhlIGJlc3QsDQoNCkFydGh1cg0K --------------MTeKvnkCaOChoCrgeUGSKZOp Content-Type: application/pgp-keys; name="OpenPGP_0x1B3465B044AD9C65.asc" Content-Disposition: attachment; filename="OpenPGP_0x1B3465B044AD9C65.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- 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 7FJmBg=3D=3D =3DQnyj -----END PGP PUBLIC KEY BLOCK----- --------------MTeKvnkCaOChoCrgeUGSKZOp-- --------------rTp5U7w0O6QsNbIgDyMv7KVt-- --------------7BxEAyKzfoksLaXzE90ZRp08 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmNzmQEFAwAAAAAACgkQGzRlsEStnGXo Kg//Qga6LGQHELZkKl+o2oTkKcj2eno/hrSOMXhwT9loAikSPYIPaAZppIribWPDUzvMXprjQFkR Nnsoaso3aGqMvjUsavABJ2xMLS0x5MJVlRyiYqlByCljhpwwaNZqpjfQBKDuGAfHk6KfwOmayLGL fuwTiLvvGKzXcMusK2Eq5UrAssN75l5KinP7M0oZHfxF40o04a0b56oc/p907qM8K8wLGw2MudDP wHnPgrQ/Um5mwLdS8X2hPmjw8CWU9EW/bnBm91RGSgJO7CSFa/QHYNwb1+LSxK9+Gocbt0sTJOE+ T3SfGGWaTmaYh7vBboU0nMOzxiQWTX2jlNdn6ebLun+BCAG+zhCeBjM7ypQEmzOoAF15FUwgyqJM mrszejr1SsuMM9VUdeOoUw1DpY2bCjjgESTlg1JIsTUKYVTF/+ipMuaRcBja7J3o4M5EdyKBD0KW QrYfTidtSQxEd19DrDldMsaadi7Vao1uqIouny8GnN9KzrTvHZXoBEDtGQBp0x26J+dPoSeXvtaK tf2ES5d/D1L8xa56hm8LTxMXXzA32/kfmhYRlLybH4hVj5CjE2TZdHMHdJINfz1HsnzZHx4Hlxfh 3Is6ZnniLHHb6J2u5WM9Rzq0+rJdn7MUbsC8beIQG2C7GD5M12fArkOyHfQDmOrZ+Ikhlty3rN2w Law= =sMrw -----END PGP SIGNATURE----- --------------7BxEAyKzfoksLaXzE90ZRp08--