From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D81DBC10F1A for ; Tue, 7 May 2024 14:26:18 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s4Lkw-00068B-7v; Tue, 07 May 2024 10:25:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s4Lks-00067j-Cw for qemu-devel@nongnu.org; Tue, 07 May 2024 10:25:18 -0400 Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1s4Lkn-0008BO-JG for qemu-devel@nongnu.org; Tue, 07 May 2024 10:25:18 -0400 Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-41ba1ba5591so24187935e9.1 for ; Tue, 07 May 2024 07:25:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1715091911; x=1715696711; darn=nongnu.org; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:cc:to:from:subject:message-id:from:to :cc:subject:date:message-id:reply-to; bh=ufVuGze0n5qkLaQaZgYaCtxQaOxdc4AgMTcDsVIwIIs=; b=RUEWqyWp3j4Pu4m+J0r7BcjEAY3bVWR9Gqyjp191kL1qFdAfsRPg5+4uX6syiwoyhx /6UlgTW3huYFdV2s8CIuqp01ASqF50/wRA+jZohWtDnSn9h80I82Z5W57r2GI+eDmeGU ZxItTQ58zXimAYJPj9P1DOwsTGoWwdSVtluXOMlsJbpaHZPnF5SZG2XprTc/Vwurvfyu yzGBFvPeAZkilT6uedJ7NBx+JJqAb7qyvA980fwNmgo2k0qeH5Uj8NA6JnnJMh+g8LZH YNb0fV4x4/dbPrniBb/thynjWTP9dhpADG+JYI5CYOarMwi8WAtnA+uSMW+/gtj0nr/P /EEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715091911; x=1715696711; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:cc:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ufVuGze0n5qkLaQaZgYaCtxQaOxdc4AgMTcDsVIwIIs=; b=XapIpYkVFYuq20smj3noohk6+fpJxFH+bKTJ6gJ9M71yB8rviGBGAimXjqLCEJH8Y5 HPQGE321dSZ7kcI0fg/w+xLWoKWbgCV/mstU6PF97FTBUhCg6omr50xZksyYWvxw5gp4 bqT2ahK17hXn5grcE0MzTmgMlu5SpO5a0Nejgz3xOi6QwJYjsBgm6jr9VOC+GGEA+AKh XJgacNthdXucgcc8UlW4cWI8+PL7vs1fpq0Ps/I25fgNINYctGK+fdhbzhmER+LM4/pg RKmLWt8GIcR6xKVG/kiuEJezJ1iR6ZtFPyf3/IjeCRfdqi6LOCdM4+M/JDD77WNgZ3Oe kXdQ== X-Gm-Message-State: AOJu0YxLjJn/7aTNh6ldyRJ1eoZWVQ7O5/vwUuC38bG6nz9i/rZrEIb2 O0hOys11Bq9tldFIjJWwicV20+N1ru97dmrfdQT7ZdKAfWgJRty8YSRiJtJ89Y0= X-Google-Smtp-Source: AGHT+IGXSZjjKzYFcEGs0VhyjUbx4i2z81bH4vPZP3567ZvixSgA93fR2woNiA+g9V7aTnSyNG+9/A== X-Received: by 2002:a05:600c:4f0d:b0:418:ed23:a9f0 with SMTP id l13-20020a05600c4f0d00b00418ed23a9f0mr10234869wmq.18.1715091911226; Tue, 07 May 2024 07:25:11 -0700 (PDT) Received: from [192.168.7.249] ([145.40.191.116]) by smtp.gmail.com with ESMTPSA id l3-20020a05600c4f0300b0041b43d2d745sm19872142wmq.7.2024.05.07.07.25.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 May 2024 07:25:10 -0700 (PDT) Message-ID: <96cfa6318bd2fdfc05e3464342c895672d66bfb8.camel@suse.com> Subject: Re: [PATCH v2 04/10] backends/igvm: Implement parsing and processing of IGVM files From: Roy Hopkins To: "Daniel P." =?ISO-8859-1?Q?Berrang=E9?= Cc: qemu-devel@nongnu.org, Paolo Bonzini , Stefano Garzarella , Marcelo Tosatti , "Michael S . Tsirkin" , Cornelia Huck , Marcel Apfelbaum , Sergio Lopez , Eduardo Habkost , Alistair Francis , Peter Xu , David Hildenbrand , Igor Mammedov , Tom Lendacky , Michael Roth , Ani Sinha , =?ISO-8859-1?Q?J=F6rg?= Roedel Date: Tue, 07 May 2024 15:25:10 +0100 In-Reply-To: References: <9e4268647c2b3dc7fcc59d795575622c4f35a413.1712141833.git.roy.hopkins@suse.com> Autocrypt: addr=roy.hopkins@suse.com; prefer-encrypt=mutual; keydata=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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.50.2 MIME-Version: 1.0 Received-SPF: permerror client-ip=2a00:1450:4864:20::32d; envelope-from=roy.hopkins@suse.com; helo=mail-wm1-x32d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org T24gVHVlLCAyMDI0LTA0LTE2IGF0IDE1OjA1ICswMTAwLCBEYW5pZWwgUC4gQmVycmFuZ8OpIHdy b3RlOgo+IE9uIFdlZCwgQXByIDAzLCAyMDI0IGF0IDEyOjExOjM1UE0gKzAxMDAsIFJveSBIb3Br aW5zIHdyb3RlOgo+ID4gVGhpcyBjb21taXQgYWRkcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBJ R1ZNIGxvYWRlciB3aGljaCBwYXJzZXMgdGhlCj4gPiBmaWxlIHNwZWNpZmllZCBhcyBhIHBhcmFy YW1ldGVyIHRvIENvbmZpZGVudGlhbEd1ZXN0U3VwcG9ydCBhbmQgcHJvdmlkZXMKPiA+IGEgZnVu Y3Rpb24gdGhhdCB1c2VzIHRoZSBpbnRlcmZhY2UgaW4gdGhlIHNhbWUgb2JqZWN0IHRvIGNvbmZp Z3VyZSBhbmQKPiA+IHBvcHVsYXRlIGd1ZXN0IG1lbW9yeSBiYXNlZCBvbiB0aGUgY29udGVudHMg b2YgdGhlIGZpbGUuCj4gPiAKPiA+IFRoZSBJR1ZNIGZpbGUgaXMgcGFyc2VkIHdoZW4gYSBmaWxl bmFtZSBpcyBwcm92aWRlZCBidXQgdGhlIGNvZGUgdG8KPiA+IHByb2Nlc3MgdGhlIElHVk0gZmls ZSBpcyBub3QgeWV0IGhvb2tlZCBpbnRvIHRhcmdldCBzeXN0ZW1zLiBUaGlzIHdpbGwKPiA+IGZv bGxvdyBpbiBhIGxhdGVyIGNvbW1pdC4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogUm95IEhvcGtp bnMgPHJveS5ob3BraW5zQHN1c2UuY29tPgo+ID4gLS0tCj4gPiDCoGJhY2tlbmRzL2NvbmZpZGVu dGlhbC1ndWVzdC1zdXBwb3J0LmPCoMKgwqDCoCB8wqDCoCA0ICsKPiA+IMKgYmFja2VuZHMvaWd2 bS5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8 IDc0NSArKysrKysrKysrKysrKysrKysrKysrCj4gPiDCoGJhY2tlbmRzL21lc29uLmJ1aWxkwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEgKwo+ID4gwqBp bmNsdWRlL2V4ZWMvY29uZmlkZW50aWFsLWd1ZXN0LXN1cHBvcnQuaCB8wqDCoCA1ICsKPiA+IMKg aW5jbHVkZS9leGVjL2lndm0uaMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHzCoCAzNiArKwo+ID4gwqA1IGZpbGVzIGNoYW5nZWQsIDc5MSBpbnNlcnRpb25zKCsp Cj4gPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBiYWNrZW5kcy9pZ3ZtLmMKPiA+IMKgY3JlYXRlIG1v ZGUgMTAwNjQ0IGluY2x1ZGUvZXhlYy9pZ3ZtLmgKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2JhY2tl bmRzL2NvbmZpZGVudGlhbC1ndWVzdC1zdXBwb3J0LmMgYi9iYWNrZW5kcy9jb25maWRlbnRpYWwt Cj4gPiBndWVzdC1zdXBwb3J0LmMKPiA+IGluZGV4IGNiMGJjNTQzYzAuLmFkZmU0NDczMzQgMTAw NjQ0Cj4gPiAtLS0gYS9iYWNrZW5kcy9jb25maWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5jCj4gPiAr KysgYi9iYWNrZW5kcy9jb25maWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5jCj4gPiBAQCAtMTYsNiAr MTYsNyBAQAo+ID4gwqAjaW5jbHVkZSAiZXhlYy9jb25maWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5o Igo+ID4gwqAjaW5jbHVkZSAicWVtdS9lcnJvci1yZXBvcnQuaCIKPiA+IMKgI2luY2x1ZGUgInFh cGkvZXJyb3IuaCIKPiA+ICsjaW5jbHVkZSAiZXhlYy9pZ3ZtLmgiCj4gPiDCoAo+ID4gwqBPQkpF Q1RfREVGSU5FX0FCU1RSQUNUX1RZUEUoQ29uZmlkZW50aWFsR3Vlc3RTdXBwb3J0LAo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29u ZmlkZW50aWFsX2d1ZXN0X3N1cHBvcnQsCj4gPiBAQCAtMzQsNiArMzUsOSBAQCBzdGF0aWMgdm9p ZCBzZXRfaWd2bShPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqdmFsdWUsIEVycm9yCj4gPiAqKmVy cnApCj4gPiDCoMKgwqDCoCBDb25maWRlbnRpYWxHdWVzdFN1cHBvcnQgKmNncyA9IENPTkZJREVO VElBTF9HVUVTVF9TVVBQT1JUKG9iaik7Cj4gPiDCoMKgwqDCoCBnX2ZyZWUoY2dzLT5pZ3ZtX2Zp bGVuYW1lKTsKPiA+IMKgwqDCoMKgIGNncy0+aWd2bV9maWxlbmFtZSA9IGdfc3RyZHVwKHZhbHVl KTsKPiA+ICsjaWYgZGVmaW5lZChDT05GSUdfSUdWTSkKPiA+ICvCoMKgwqAgaWd2bV9maWxlX2lu aXQoY2dzLCBlcnJwKTsKPiA+ICsjZW5kaWYKPiAKPiAKPiA+IMKgfQo+ID4gwqAjZW5kaWYKPiA+ IMKgCj4gPiBkaWZmIC0tZ2l0IGEvYmFja2VuZHMvaWd2bS5jIGIvYmFja2VuZHMvaWd2bS5jCj4g PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMC4uODdlNjAzMmEyZQo+ ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYmFja2VuZHMvaWd2bS5jCj4gPiBAQCAtMCwwICsx LDc0NSBAQAo+ID4gKy8qCj4gPiArICogUUVNVSBJR1ZNIGNvbmZpZ3VyYXRpb24gYmFja2VuZCBm b3IgQ29uZmlkZW50aWFsIEd1ZXN0cwo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChDKSAyMDIz LTIwMjQgU1VTRQo+ID4gKyAqCj4gPiArICogQXV0aG9yczoKPiA+ICsgKsKgIFJveSBIb3BraW5z IDxyb3kuaG9wa2luc0BzdXNlLmNvbT4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgd29yayBpcyBsaWNl bnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvcgo+ID4gbGF0 ZXIuCj4gPiArICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rv cnkuCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKPiA+ICsKPiA+ ICsjaWYgZGVmaW5lZChDT05GSUdfSUdWTSkKPiA+ICsKPiA+ICsjaW5jbHVkZSAiZXhlYy9jb25m aWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5oIgo+ID4gKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCj4g PiArI2luY2x1ZGUgInFlbXUvdHlwZWRlZnMuaCIKPiA+ICsKPiA+ICsjaW5jbHVkZSAiZXhlYy9p Z3ZtLmgiCj4gPiArI2luY2x1ZGUgInFlbXUvZXJyb3ItcmVwb3J0LmgiCj4gPiArI2luY2x1ZGUg Imh3L2JvYXJkcy5oIgo+ID4gKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCj4gPiArI2luY2x1ZGUg ImV4ZWMvYWRkcmVzcy1zcGFjZXMuaCIKPiA+ICsKPiA+ICsjaW5jbHVkZSA8aWd2bS9pZ3ZtLmg+ Cj4gPiArI2luY2x1ZGUgPGlndm0vaWd2bV9kZWZzLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2t2 bS5oPgo+ID4gKwo+ID4gK3R5cGVkZWYgc3RydWN0IElndm1QYXJhbWV0ZXJEYXRhIHsKPiA+ICvC oMKgwqAgUVRBSUxRX0VOVFJZKElndm1QYXJhbWV0ZXJEYXRhKSBuZXh0Owo+ID4gK8KgwqDCoCB1 aW50OF90ICpkYXRhOwo+ID4gK8KgwqDCoCB1aW50MzJfdCBzaXplOwo+ID4gK8KgwqDCoCB1aW50 MzJfdCBpbmRleDsKPiA+ICt9IElndm1QYXJhbWV0ZXJEYXRhOwo+ID4gKwo+ID4gKwo+ID4gK3N0 cnVjdCBJR1ZNRGlyZWN0aXZlSGFuZGxlciB7Cj4gPiArwqDCoMKgIHVpbnQzMl90IHR5cGU7Cj4g PiArwqDCoMKgIGludCAoKmhhbmRsZXIpKENvbmZpZGVudGlhbEd1ZXN0U3VwcG9ydCAqY2dzLCBp bnQgaSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDMyX3Qg Y29tcGF0aWJpbGl0eV9tYXNrLCBjb25zdCB1aW50OF90ICpoZWFkZXJfZGF0YSwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRXJyb3IgKiplcnJwKTsKPiA+ICt9Owo+ ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3QgSUdWTURpcmVjdGl2ZUhhbmRsZXIgZGlyZWN0aXZlX2hh bmRsZXJzW10gPSB7Cj4gPiArwqDCoMKgIHsgSUdWTV9WSFRfUEFHRV9EQVRBLCBkaXJlY3RpdmVf cGFnZV9kYXRhIH0sCj4gPiArwqDCoMKgIHsgSUdWTV9WSFRfVlBfQ09OVEVYVCwgZGlyZWN0aXZl X3ZwX2NvbnRleHQgfSwKPiA+ICvCoMKgwqAgeyBJR1ZNX1ZIVF9QQVJBTUVURVJfQVJFQSwgZGly ZWN0aXZlX3BhcmFtZXRlcl9hcmVhIH0sCj4gPiArwqDCoMKgIHsgSUdWTV9WSFRfUEFSQU1FVEVS X0lOU0VSVCwgZGlyZWN0aXZlX3BhcmFtZXRlcl9pbnNlcnQgfSwKPiA+ICvCoMKgwqAgeyBJR1ZN X1ZIVF9NRU1PUllfTUFQLCBkaXJlY3RpdmVfbWVtb3J5X21hcCB9LAo+ID4gK8KgwqDCoCB7IElH Vk1fVkhUX1ZQX0NPVU5UX1BBUkFNRVRFUiwgZGlyZWN0aXZlX3ZwX2NvdW50IH0sCj4gPiArwqDC oMKgIHsgSUdWTV9WSFRfRU5WSVJPTk1FTlRfSU5GT19QQVJBTUVURVIsIGRpcmVjdGl2ZV9lbnZp cm9ubWVudF9pbmZvIH0sCj4gPiArwqDCoMKgIHsgSUdWTV9WSFRfUkVRVUlSRURfTUVNT1JZLCBk aXJlY3RpdmVfcmVxdWlyZWRfbWVtb3J5IH0sCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50 IGRpcmVjdGl2ZSh1aW50MzJfdCB0eXBlLCBDb25maWRlbnRpYWxHdWVzdFN1cHBvcnQgKmNncywg aW50IGksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVp bnQzMl90IGNvbXBhdGliaWxpdHlfbWFzaywgRXJyb3IgKiplcnJwKQo+ID4gK3sKPiA+ICvCoMKg wqAgc2l6ZV90IGhhbmRsZXI7Cj4gPiArwqDCoMKgIElndm1IYW5kbGUgaGVhZGVyX2hhbmRsZTsK PiA+ICvCoMKgwqAgY29uc3QgdWludDhfdCAqaGVhZGVyX2RhdGE7Cj4gPiArwqDCoMKgIGludCBy ZXN1bHQ7Cj4gPiArCj4gPiArwqDCoMKgIGZvciAoaGFuZGxlciA9IDA7IGhhbmRsZXIgPCAoc2l6 ZW9mKGRpcmVjdGl2ZV9oYW5kbGVycykgLwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKHN0cnVjdCBJR1ZN RGlyZWN0aXZlSGFuZGxlcikpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqAgKytoYW5kbGVyKSB7Cj4g Cj4gTm9ybWFsIHN0eWxlIGlzIHBvc3QtaW5jcmVtZW50IChpZSBoYW5kbGVyKyspLCBhbHNvIHlv dSBjYW4gcmVwbGFjZSB0aGUKPiBzaXplb2YgY2FsY3VsYXRpb24gd2l0aCAiR19OX0VMRU1FTlRT KGRpcmVjdGl2ZV9oYW5kbGVycykiCj4gCj4gPiArwqDCoMKgwqDCoMKgwqAgaWYgKGRpcmVjdGl2 ZV9oYW5kbGVyc1toYW5kbGVyXS50eXBlID09IHR5cGUpIHsKPiAKPiBpZiAoZGlyZWN0aXZlX2hh bmRsZXJzW2hhbmRsZXJdLnR5cGUgIT0gdHlwZSkgewo+IMKgIGNvbnRpbnVlCj4gfQo+IApOb3Rl ZC4KCj4gbWVhbnMgd2UgY2FuIHJlZHVjZSBpbmRlbnQgaW4gdGhlIHJlc3Qgb2YgdGhlIGJsb2Nr Cj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBoZWFkZXJfaGFuZGxlID0KPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWd2bV9nZXRfaGVhZGVyKGNncy0+aWd2bSwgSEVB REVSX1NFQ1RJT05fRElSRUNUSVZFLCBpKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlm IChoZWFkZXJfaGFuZGxlIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBlcnJvcl9zZXRnKAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGVycnAsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIklHVk0g ZmlsZSBpcyBpbnZhbGlkOiBGYWlsZWQgdG8gcmVhZCBkaXJlY3RpdmUgaGVhZGVyCj4gPiAoY29k ZTogJWQpIiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoaW50 KWhlYWRlcl9oYW5kbGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gLTE7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBoZWFkZXJfZGF0YSA9IGlndm1fZ2V0X2J1ZmZlcihjZ3MtPmlndm0sIGhlYWRlcl9o YW5kbGUpICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzaXplb2YoSUdWTV9WSFNfVkFSSUFCTEVfSEVBREVSKTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJlc3VsdCA9IGRpcmVjdGl2ZV9oYW5kbGVyc1toYW5kbGVyXS5oYW5kbGVy KAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjZ3MsIGksIGNvbXBhdGliaWxp dHlfbWFzaywgaGVhZGVyX2RhdGEsIGVycnApOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWd2bV9mcmVlX2J1ZmZlcihjZ3MtPmlndm0sIGhlYWRlcl9oYW5kbGUpOwo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJlc3VsdDsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gPiAr wqDCoMKgIH0KPiA+ICvCoMKgwqAgZXJyb3Jfc2V0ZyhlcnJwLAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgIklHVk06IFVua25vd24gZGlyZWN0aXZlIHR5cGUgZW5jb3VudGVyZWQg d2hlbiBwcm9jZXNzaW5nCj4gPiBmaWxlOiAiCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAiKHR5cGUgMHglWCkiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdHlw ZSk7Cj4gPiArwqDCoMKgIHJldHVybiAtMTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQg Kmlndm1fcHJlcGFyZV9tZW1vcnkodWludDY0X3QgYWRkciwgdWludDY0X3Qgc2l6ZSwKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGludCByZWdpb25faWRlbnRpZmllciwgRXJyb3IgKiplcnJwKQo+ID4gK3sKPiA+ICvC oMKgwqAgTWVtb3J5UmVnaW9uICppZ3ZtX3BhZ2VzID0gTlVMTDsKPiA+ICvCoMKgwqAgSW50MTI4 IGdwYV9yZWdpb25fc2l6ZTsKPiA+ICvCoMKgwqAgTWVtb3J5UmVnaW9uU2VjdGlvbiBtcnMgPQo+ ID4gK8KgwqDCoMKgwqDCoMKgIG1lbW9yeV9yZWdpb25fZmluZChnZXRfc3lzdGVtX21lbW9yeSgp LCBhZGRyLCBzaXplKTsKPiA+ICvCoMKgwqAgaWYgKG1ycy5tcikgewo+ID4gK8KgwqDCoMKgwqDC oMKgIGlmICghbWVtb3J5X3JlZ2lvbl9pc19yYW0obXJzLm1yKSkgewo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbWVtb3J5X3JlZ2lvbl91bnJlZihtcnMubXIpOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZXJyb3Jfc2V0ZygKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZXJycCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlByb2Nlc3Npbmcg b2YgSUdWTSBmaWxlIGZhaWxlZDogQ291bGQgbm90IHByZXBhcmUgbWVtb3J5ICIKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImF0IGFkZHJlc3MgMHglbFggZHVlIHRvIGV4aXN0 aW5nIG5vbi1SQU0gcmVnaW9uIiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg YWRkcik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPiA+ICvCoMKg wqDCoMKgwqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAgZ3BhX3JlZ2lvbl9zaXplID0g aW50MTI4X21ha2U2NChzaXplKTsKPiA+ICvCoMKgwqDCoMKgwqDCoCBpZiAoaW50MTI4X2x0KG1y cy5zaXplLCBncGFfcmVnaW9uX3NpemUpKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBt ZW1vcnlfcmVnaW9uX3VucmVmKG1ycy5tcik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBl cnJvcl9zZXRnKAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJwLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiUHJvY2Vzc2luZyBvZiBJR1ZNIGZpbGUg ZmFpbGVkOiBDb3VsZCBub3QgcHJlcGFyZSBtZW1vcnkgIgo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAiYXQgYWRkcmVzcyAweCVsWDogcmVnaW9uIHNpemUgZXhjZWVkZWQiLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhZGRyKTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+ID4gK8KgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gcWVtdV9tYXBfcmFtX3B0cihtcnMubXItPnJhbV9ibG9jaywKPiA+ IG1ycy5vZmZzZXRfd2l0aGluX3JlZ2lvbik7Cj4gPiArwqDCoMKgIH0gZWxzZSB7Cj4gPiArwqDC oMKgwqDCoMKgwqAgLyoKPiA+ICvCoMKgwqDCoMKgwqDCoMKgICogVGhlIHJlZ2lvbl9pZGVudGlm aWVyIGlzIHRoZSBpcyB0aGUgaW5kZXggb2YgdGhlIElHVk0gZGlyZWN0aXZlCj4gPiB0aGF0Cj4g PiArwqDCoMKgwqDCoMKgwqDCoCAqIGNvbnRhaW5zIHRoZSBwYWdlIHdpdGggdGhlIGxvd2VzdCBH UEEgaW4gdGhlIHJlZ2lvbi4gVGhpcyB3aWxsCj4gPiArwqDCoMKgwqDCoMKgwqDCoCAqIGdlbmVy YXRlIGEgdW5pcXVlIHJlZ2lvbiBuYW1lLgo+ID4gK8KgwqDCoMKgwqDCoMKgwqAgKi8KPiA+ICvC oMKgwqDCoMKgwqDCoCBnX2F1dG9mcmVlIGNoYXIgKnJlZ2lvbl9uYW1lID0KPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGdfc3RyZHVwX3ByaW50ZigiaWd2bS4lWCIsIHJlZ2lvbl9pZGVudGlm aWVyKTsKPiA+ICvCoMKgwqDCoMKgwqDCoCBpZ3ZtX3BhZ2VzID0gZ19tYWxsb2Moc2l6ZW9mKCpp Z3ZtX3BhZ2VzKSk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgaWYgKCFtZW1vcnlfcmVnaW9uX2luaXRf cmFtKGlndm1fcGFnZXMsIE5VTEwsIHJlZ2lvbl9uYW1lLCBzaXplLAo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZXJycCkpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+ID4g K8KgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoCBtZW1vcnlfcmVnaW9uX2FkZF9z dWJyZWdpb24oZ2V0X3N5c3RlbV9tZW1vcnkoKSwgYWRkciwgaWd2bV9wYWdlcyk7Cj4gPiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuIG1lbW9yeV9yZWdpb25fZ2V0X3JhbV9wdHIoaWd2bV9wYWdlcyk7 Cj4gPiArwqDCoMKgIH0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBpZ3ZtX3R5cGVfdG9f Y2dzX3R5cGUoSWd2bVBhZ2VEYXRhVHlwZSBtZW1vcnlfdHlwZSwgYm9vbAo+ID4gdW5tZWFzdXJl ZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJvb2wgemVybykKPiA+ICt7Cj4gPiArwqDCoMKgIHN3aXRjaCAobWVt b3J5X3R5cGUpIHsKPiA+ICvCoMKgwqAgY2FzZSBOT1JNQUw6IHsKPiA+ICvCoMKgwqDCoMKgwqDC oCBpZiAodW5tZWFzdXJlZCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIENH U19QQUdFX1RZUEVfVU5NRUFTVVJFRDsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHplcm8gPyBDR1NfUEFHRV9UWVBFX1pFUk8g OiBDR1NfUEFHRV9UWVBFX05PUk1BTDsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKg IH0KPiA+ICvCoMKgwqAgY2FzZSBTRUNSRVRTOgo+ID4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBD R1NfUEFHRV9UWVBFX1NFQ1JFVFM7Cj4gPiArwqDCoMKgIGNhc2UgQ1BVSURfREFUQToKPiA+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gQ0dTX1BBR0VfVFlQRV9DUFVJRDsKPiA+ICvCoMKgwqAgY2Fz ZSBDUFVJRF9YRjoKPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gQ0dTX1BBR0VfVFlQRV9DUFVJ RDsKPiA+ICvCoMKgwqAgZGVmYXVsdDoKPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4g PiArwqDCoMKgIH0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGJvb2wgcGFnZV9hdHRyc19lcXVh bChJZ3ZtSGFuZGxlIGlndm0sIGludCBpLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IElHVk1fVkhTX1BBR0VfREFUQSAq cGFnZV8xLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGNvbnN0IElHVk1fVkhTX1BBR0VfREFUQSAqcGFnZV8yKQo+ID4gK3sKPiA+ ICvCoMKgwqAgSWd2bUhhbmRsZSBkYXRhX2hhbmRsZTEsIGRhdGFfaGFuZGxlMjsKPiA+ICsKPiA+ ICvCoMKgwqAgLyoKPiA+ICvCoMKgwqDCoCAqIElmIG9uZSBwYWdlIGhhcyBkYXRhIGFuZCB0aGUg b3RoZXIgZG9lc24ndCB0aGVuIHRoaXMgcmVzdWx0cyBpbgo+ID4gZGlmZmVyZW50Cj4gPiArwqDC oMKgwqAgKiBwYWdlIHR5cGVzOiBOT1JNQUwgdnMgWkVSTy4KPiA+ICvCoMKgwqDCoCAqLwo+ID4g K8KgwqDCoCBkYXRhX2hhbmRsZTEgPSBpZ3ZtX2dldF9oZWFkZXJfZGF0YShpZ3ZtLCBIRUFERVJf U0VDVElPTl9ESVJFQ1RJVkUsIGkgLQo+ID4gMSk7Cj4gPiArwqDCoMKgIGRhdGFfaGFuZGxlMiA9 IGlndm1fZ2V0X2hlYWRlcl9kYXRhKGlndm0sIEhFQURFUl9TRUNUSU9OX0RJUkVDVElWRSwgaSk7 Cj4gPiArwqDCoMKgIGlmICgoZGF0YV9oYW5kbGUxID09IElHVk1BUElfTk9fREFUQSkgJiYKPiA+ ICvCoMKgwqDCoMKgwqDCoCAoZGF0YV9oYW5kbGUyICE9IElHVk1BUElfTk9fREFUQSkpIHsKPiA+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4gPiArwqDCoMKgIH0gZWxzZSBpZiAoKGRh dGFfaGFuZGxlMSAhPSBJR1ZNQVBJX05PX0RBVEEpICYmCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoZGF0YV9oYW5kbGUyID09IElHVk1BUElfTk9fREFUQSkpIHsKPiA+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4gPiArwqDCoMKgIH0KPiA+ICvCoMKgwqAgcmV0dXJu ICgoKihjb25zdCB1aW50MzJfdCAqKSZwYWdlXzEtPmZsYWdzID09Cj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICooY29uc3QgdWludDMyX3QgKikmcGFnZV8yLT5mbGFncykgJiYKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChwYWdlXzEtPmRhdGFfdHlwZSA9PSBwYWdlXzItPmRhdGFf dHlwZSkgJiYKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChwYWdlXzEtPmNvbXBhdGliaWxp dHlfbWFzayA9PSBwYWdlXzItPmNvbXBhdGliaWxpdHlfbWFzaykpOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgaW50IGlndm1fcHJvY2Vzc19tZW1fcmVnaW9uKENvbmZpZGVudGlhbEd1ZXN0U3Vw cG9ydCAqY2dzLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIElndm1IYW5kbGUgaWd2bSwgaW50IHN0YXJ0X2lu ZGV4LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGdwYV9zdGFydCwgaW50IHBhZ2VfY291bnQs Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgSWd2bVBhZ2VEYXRhRmxhZ3MgKmZsYWdzLAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNvbnN0IElndm1QYWdlRGF0YVR5cGUgcGFnZV90eXBlLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIEVycm9yICoqZXJycCkKPiA+ICt7Cj4gPiArwqDCoMKgIEVSUlBfR1VBUkQoKTsKPiA+ICvC oMKgwqAgdWludDhfdCAqcmVnaW9uOwo+ID4gK8KgwqDCoCBJZ3ZtSGFuZGxlIGRhdGFfaGFuZGxl Owo+ID4gK8KgwqDCoCBjb25zdCB2b2lkICpkYXRhOwo+ID4gK8KgwqDCoCB1aW50MzJfdCBkYXRh X3NpemU7Cj4gPiArwqDCoMKgIGludCBpOwo+ID4gK8KgwqDCoCBib29sIHplcm8gPSB0cnVlOwo+ ID4gK8KgwqDCoCBjb25zdCB1aW50NjRfdCBwYWdlX3NpemUgPSBmbGFncy0+aXNfMm1iX3BhZ2Ug PyAweDIwMDAwMCA6IDB4MTAwMDsKPiA+ICvCoMKgwqAgaW50IHJlc3VsdDsKPiA+ICvCoMKgwqAg aW50IGNnc19wYWdlX3R5cGU7Cj4gPiArCj4gPiArwqDCoMKgIHJlZ2lvbiA9IGlndm1fcHJlcGFy ZV9tZW1vcnkoZ3BhX3N0YXJ0LCBwYWdlX2NvdW50ICogcGFnZV9zaXplLAo+ID4gc3RhcnRfaW5k ZXgsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlcnJwKTsKPiA+ICvCoMKgwqAgaWYgKCFyZWdpb24pIHsKPiA+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4gPiArwqDCoMKgIH0KPiA+ICsKPiA+ICvCoMKgwqAg Zm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7ICsraSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgIGRh dGFfaGFuZGxlID0gaWd2bV9nZXRfaGVhZGVyX2RhdGEoaWd2bSwgSEVBREVSX1NFQ1RJT05fRElS RUNUSVZFLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpICsgc3RhcnRfaW5kZXgp Owo+ID4gK8KgwqDCoMKgwqDCoMKgIGlmIChkYXRhX2hhbmRsZSA9PSBJR1ZNQVBJX05PX0RBVEEp IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIE5vIGRhdGEgaW5kaWNhdGVzIGEgemVy byBwYWdlICovCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtZW1zZXQoJnJlZ2lvbltpICog cGFnZV9zaXplXSwgMCwgcGFnZV9zaXplKTsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2UgaWYg KGRhdGFfaGFuZGxlIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0 ZygKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJycCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIklHVk0gZmlsZSBjb250YWlucyBpbnZhbGlkIHBhZ2Ug ZGF0YSBmb3IgZGlyZWN0aXZlIHdpdGggIgo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAiaW5kZXggJWQiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpICsg c3RhcnRfaW5kZXgpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4g K8KgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB6ZXJv ID0gZmFsc2U7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkYXRhX3NpemUgPSBpZ3ZtX2dl dF9idWZmZXJfc2l6ZShpZ3ZtLCBkYXRhX2hhbmRsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBpZiAoZGF0YV9zaXplIDwgcGFnZV9zaXplKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIG1lbXNldCgmcmVnaW9uW2kgKiBwYWdlX3NpemVdLCAwLCBwYWdlX3NpemUp Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSBlbHNlIGlmIChkYXRhX3NpemUgPiBwYWdl X3NpemUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0Zyhl cnJwLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgIklHVk0gZmlsZSBjb250YWlucyBwYWdlIGRhdGEgd2l0aCBpbnZhbGlkIHNpemUKPiA+ IGZvciAiCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAiZGlyZWN0aXZlIHdpdGggaW5kZXggJWQiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaSArIHN0YXJ0X2luZGV4KTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGF0YSA9IGlndm1f Z2V0X2J1ZmZlcihpZ3ZtLCBkYXRhX2hhbmRsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBtZW1jcHkoJnJlZ2lvbltpICogcGFnZV9zaXplXSwgZGF0YSwgZGF0YV9zaXplKTsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlndm1fZnJlZV9idWZmZXIoaWd2bSwgZGF0YV9oYW5kbGUp Owo+ID4gK8KgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqAgfQo+ID4gKwo+ID4gK8KgwqDCoCBj Z3NfcGFnZV90eXBlID0gaWd2bV90eXBlX3RvX2Nnc190eXBlKHBhZ2VfdHlwZSwgZmxhZ3MtPnVu bWVhc3VyZWQsCj4gPiB6ZXJvKTsKPiA+ICvCoMKgwqAgaWYgKGNnc19wYWdlX3R5cGUgPCAwKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0ZygKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGVycnAsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiSW52YWxpZCBwYWdlIHR5cGUg aW4gSUdWTSBmaWxlLiBEaXJlY3RpdmVzOiAlZCB0byAlZCwgIgo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgInBhZ2UgdHlwZTogJWQiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3Rh cnRfaW5kZXgsIHN0YXJ0X2luZGV4ICsgcGFnZV9jb3VudCwgcGFnZV90eXBlKTsKPiA+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4gPiArwqDCoMKgIH0KPiA+ICsKPiA+ICvCoMKgwqAgcmVz dWx0ID0gY2dzLT5zZXRfZ3Vlc3Rfc3RhdGUoZ3BhX3N0YXJ0LCByZWdpb24sIHBhZ2Vfc2l6ZSAq Cj4gPiBwYWdlX2NvdW50LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjZ3NfcGFnZV90eXBlLCAwLCBlcnJwKTsK PiA+ICvCoMKgwqAgaWYgKChyZXN1bHQgPCAwKSAmJiAhKmVycnApIHsKPiA+ICvCoMKgwqDCoMKg wqDCoCBlcnJvcl9zZXRnKGVycnAsICJJR1ZNIHNldCBndWVzdCBzdGF0ZSBmYWlsZWQgd2l0aCBj b2RlICVkIiwKPiA+IHJlc3VsdCk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4g K8KgwqDCoCB9Cj4gCj4gSXQgaXMgYmFkIHByYWN0aWNlIHRvIGhhdmUgYSBtZXRob2Qgd2hpY2gg b25seSBmaWxscyAnZXJycCcgaW4gc29tZQo+IGVycm9yIGNvbmRpdGlvbnMuIFdlIHNob3VsZCBl eHBlY3QgdGhhdCBhbnkgaW1wbCBvZiBzZXRfZ3Vlc3Rfc3RhdGUKPiBhbHdheXMgc2V0cyAnZXJy cCcgaWYgaXQgcmV0dXJucyAtMSwgYW5kIHRodXMgbm90IG5lZWQgdGhpcyBlcnJvcl9zZXRnCj4g Y2FsbC4gU2FtZSBwb2ludCBsYXRlciBvbi4KPiAKPiBSZW1vdmluZyB0aGlzIGNoZWNrIG1lYW5z IHdlIGNuYSBhbHNvIHJlbW92ZSB0aGUgRVJSUF9HVUFSRC4KPiAKPiA+ICvCoMKgwqAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgcHJvY2Vzc19tZW1fcGFnZShDb25maWRl bnRpYWxHdWVzdFN1cHBvcnQgKmNncywgaW50IGksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IElHVk1fVkhTX1BBR0VfREFU QSAqcGFnZV9kYXRhLCBFcnJvcgo+ID4gKiplcnJwKQo+ID4gK3sKPiA+ICvCoMKgwqAgRVJSUF9H VUFSRCgpOwo+IAo+IE5vdGhpbmcgZGVyZWZlcmVuY2VzICdlcnJwJyBzbyB0aGlzIEVSUlBfR1VB UkQgaXMgcmVkdW5kYW50Lgo+IAo+ID4gK8KgwqDCoCBzdGF0aWMgSUdWTV9WSFNfUEFHRV9EQVRB IHByZXZfcGFnZV9kYXRhOwo+ID4gK8KgwqDCoCBzdGF0aWMgdWludDY0X3QgcmVnaW9uX3N0YXJ0 Owo+ID4gK8KgwqDCoCBzdGF0aWMgaW50IHJlZ2lvbl9zdGFydF9pOwo+ID4gK8KgwqDCoCBzdGF0 aWMgaW50IGxhc3RfaTsKPiA+ICvCoMKgwqAgc3RhdGljIGludCBwYWdlX2NvdW50Owo+ID4gKwo+ ID4gK8KgwqDCoCBpZiAocGFnZV9kYXRhKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgaWYgKHBhZ2Vf Y291bnQgPT0gMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVnaW9uX3N0YXJ0ID0g cGFnZV9kYXRhLT5ncGE7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZWdpb25fc3RhcnRf aSA9IGk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgfSBlbHNlIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGlmICghcGFnZV9hdHRyc19lcXVhbChjZ3MtPmlndm0sIGksIHBhZ2VfZGF0YSwgJnBy ZXZfcGFnZV9kYXRhKQo+ID4gfHwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KChwcmV2X3BhZ2VfZGF0YS5ncGEgKwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKHByZXZfcGFnZV9kYXRhLmZsYWdzLmlzXzJtYl9wYWdlID8gMHgyMDAwMDAgOiAweDEw MDApKQo+ID4gIT0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwYWdlX2Rh dGEtPmdwYSkgfHwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxhc3RfaSAh PSAoaSAtIDEpKSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBFbmQg b2YgY3VycmVudCByZWdpb24gKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKGlndm1fcHJvY2Vzc19tZW1fcmVnaW9uKGNncywgY2dzLT5pZ3ZtLCByZWdpb25fc3RhcnRf aSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVnaW9uX3N0YXJ0LCBwYWdlX2NvdW50LAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcHJldl9wYWdlX2RhdGEuZmxhZ3MsCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHByZXZfcGFnZV9kYXRhLmRhdGFfdHlwZSwgZXJycCkgPAo+ID4g MCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAt MTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBwYWdlX2NvdW50ID0gMDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmVnaW9uX3N0YXJ0ID0gcGFnZV9kYXRhLT5ncGE7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlZ2lvbl9zdGFydF9pID0gaTsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgwqDCoMKg wqAgbWVtY3B5KCZwcmV2X3BhZ2VfZGF0YSwgcGFnZV9kYXRhLCBzaXplb2YocHJldl9wYWdlX2Rh dGEpKTsKPiA+ICvCoMKgwqDCoMKgwqDCoCBsYXN0X2kgPSBpOwo+ID4gK8KgwqDCoMKgwqDCoMKg ICsrcGFnZV9jb3VudDsKPiA+ICvCoMKgwqAgfSBlbHNlIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCBp ZiAocGFnZV9jb3VudCA+IDApIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChpZ3Zt X3Byb2Nlc3NfbWVtX3JlZ2lvbihjZ3MsIGNncy0+aWd2bSwgcmVnaW9uX3N0YXJ0X2ksCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZWdpb25fc3RhcnQsIHBhZ2VfY291bnQsCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAmcHJldl9wYWdlX2RhdGEuZmxhZ3MsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmV2X3BhZ2VfZGF0 YS5kYXRhX3R5cGUsIGVycnApIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXR1cm4gLTE7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBwYWdlX2NvdW50ID0gMDsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4g PiArwqDCoMKgIH0KPiA+ICvCoMKgwqAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgZGlyZWN0aXZlX3BhZ2VfZGF0YShDb25maWRlbnRpYWxHdWVzdFN1cHBvcnQgKmNncywg aW50IGksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHVpbnQzMl90IGNvbXBhdGliaWxpdHlfbWFzaywKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29u c3QgdWludDhfdCAqaGVhZGVyX2RhdGEsIEVycm9yICoqZXJycCkKPiA+ICt7Cj4gPiArwqDCoMKg IGNvbnN0IElHVk1fVkhTX1BBR0VfREFUQSAqcGFnZV9kYXRhID0KPiA+ICvCoMKgwqDCoMKgwqDC oCAoY29uc3QgSUdWTV9WSFNfUEFHRV9EQVRBICopaGVhZGVyX2RhdGE7Cj4gPiArwqDCoMKgIGlm IChwYWdlX2RhdGEtPmNvbXBhdGliaWxpdHlfbWFzayAmIGNvbXBhdGliaWxpdHlfbWFzaykgewo+ ID4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBwcm9jZXNzX21lbV9wYWdlKGNncywgaSwgcGFnZV9k YXRhLCBlcnJwKTsKPiA+ICvCoMKgwqAgfQo+ID4gK8KgwqDCoCByZXR1cm4gMDsKPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIGludCBkaXJlY3RpdmVfdnBfY29udGV4dChDb25maWRlbnRpYWxHdWVz dFN1cHBvcnQgKmNncywgaW50IGksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDMyX3QgY29tcGF0aWJpbGl0eV9t YXNrLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlcl9kYXRhLCBFcnJvciAqKmVycnAp Cj4gPiArewo+ID4gK8KgwqDCoCBFUlJQX0dVQVJEKCk7Cj4gPiArwqDCoMKgIGNvbnN0IElHVk1f VkhTX1ZQX0NPTlRFWFQgKnZwX2NvbnRleHQgPQo+ID4gK8KgwqDCoMKgwqDCoMKgIChjb25zdCBJ R1ZNX1ZIU19WUF9DT05URVhUICopaGVhZGVyX2RhdGE7Cj4gPiArwqDCoMKgIElndm1IYW5kbGUg ZGF0YV9oYW5kbGU7Cj4gPiArwqDCoMKgIHVpbnQ4X3QgKmRhdGE7Cj4gPiArwqDCoMKgIGludCBy ZXN1bHQ7Cj4gPiArCj4gPiArwqDCoMKgIGlmICh2cF9jb250ZXh0LT5jb21wYXRpYmlsaXR5X21h c2sgJiBjb21wYXRpYmlsaXR5X21hc2spIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCBkYXRhX2hhbmRs ZSA9Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZ3ZtX2dldF9oZWFkZXJfZGF0YShjZ3Mt Pmlndm0sIEhFQURFUl9TRUNUSU9OX0RJUkVDVElWRSwgaSk7Cj4gPiArwqDCoMKgwqDCoMKgwqAg aWYgKGRhdGFfaGFuZGxlIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3Jf c2V0ZyhlcnJwLCAiSW52YWxpZCBWUCBjb250ZXh0IGluIElHVk0gZmlsZS4gRXJyb3IgY29kZToK PiA+ICVYIiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBkYXRhX2hhbmRsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4g PiArwqDCoMKgwqDCoMKgwqAgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgIGRhdGEgPSAodWlu dDhfdCAqKWlndm1fZ2V0X2J1ZmZlcihjZ3MtPmlndm0sIGRhdGFfaGFuZGxlKTsKPiA+ICvCoMKg wqDCoMKgwqDCoCByZXN1bHQgPSBjZ3MtPnNldF9ndWVzdF9zdGF0ZSgKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHZwX2NvbnRleHQtPmdwYSwgZGF0YSwgaWd2bV9nZXRfYnVmZmVyX3NpemUo Y2dzLT5pZ3ZtLAo+ID4gZGF0YV9oYW5kbGUpLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Q0dTX1BBR0VfVFlQRV9WTVNBLCB2cF9jb250ZXh0LT52cF9pbmRleCwgZXJycCk7Cj4gPiArwqDC oMKgwqDCoMKgwqAgaWd2bV9mcmVlX2J1ZmZlcihjZ3MtPmlndm0sIGRhdGFfaGFuZGxlKTsKPiA+ ICvCoMKgwqDCoMKgwqDCoCBpZiAocmVzdWx0ICE9IDApIHsKPiAKPiBPdGhlciBwbGFjZXMgY2hl Y2sgJ3Jlc3VsdCA8IDAnLgo+IAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCEqZXJy cCkgewo+IAo+IEFnYWluLCB3ZcKgIHNob3VsZCBleHBlY3Qgc2V0X2d1ZXN0X3N0YXRlIHRvIGhh dmUgY29ycmVjdGx5Cj4gcmVwb3J0ZWQgZXJyb3JzIGFscmVhZHkuCj4gCj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9yX3NldGcoZXJycCwKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJJR1ZNOiBGYWlsZWQgdG8g c2V0IENQVSBjb250ZXh0Ogo+ID4gZXJyb3JfY29kZT0lZCIsCj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXN1bHQpOwo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0x Owo+ID4gK8KgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqAgfQo+ID4gK8KgwqDCoCByZXR1cm4g MDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBkaXJlY3RpdmVfcGFyYW1ldGVyX2FyZWEo Q29uZmlkZW50aWFsR3Vlc3RTdXBwb3J0ICpjZ3MsIGludCBpLAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dWludDMyX3QgY29tcGF0aWJpbGl0eV9tYXNrLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgdWlu dDhfdCAqaGVhZGVyX2RhdGEsIEVycm9yCj4gPiAqKmVycnApCj4gPiArewo+ID4gK8KgwqDCoCBj b25zdCBJR1ZNX1ZIU19QQVJBTUVURVJfQVJFQSAqcGFyYW1fYXJlYSA9Cj4gPiArwqDCoMKgwqDC oMKgwqAgKGNvbnN0IElHVk1fVkhTX1BBUkFNRVRFUl9BUkVBICopaGVhZGVyX2RhdGE7Cj4gPiAr wqDCoMKgIElndm1QYXJhbWV0ZXJEYXRhICpwYXJhbV9lbnRyeTsKPiA+ICsKPiA+ICvCoMKgwqAg cGFyYW1fZW50cnkgPSBnX25ldzAoSWd2bVBhcmFtZXRlckRhdGEsIDEpOwo+ID4gK8KgwqDCoCBw YXJhbV9lbnRyeS0+c2l6ZSA9IHBhcmFtX2FyZWEtPm51bWJlcl9vZl9ieXRlczsKPiA+ICvCoMKg wqAgcGFyYW1fZW50cnktPmluZGV4ID0gcGFyYW1fYXJlYS0+cGFyYW1ldGVyX2FyZWFfaW5kZXg7 Cj4gPiArwqDCoMKgIHBhcmFtX2VudHJ5LT5kYXRhID0gZ19tYWxsb2MwKHBhcmFtX2VudHJ5LT5z aXplKTsKPiA+ICsKPiA+ICvCoMKgwqAgUVRBSUxRX0lOU0VSVF9UQUlMKCZwYXJhbWV0ZXJfZGF0 YSwgcGFyYW1fZW50cnksIG5leHQpOwo+ID4gK8KgwqDCoCByZXR1cm4gMDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGludCBkaXJlY3RpdmVfcGFyYW1ldGVyX2luc2VydChDb25maWRlbnRpYWxH dWVzdFN1cHBvcnQgKmNncywgaW50IGksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDMyX3Qg Y29tcGF0aWJpbGl0eV9tYXNrLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHVpbnQ4X3Qg KmhlYWRlcl9kYXRhLCBFcnJvcgo+ID4gKiplcnJwKQo+ID4gK3sKPiA+ICvCoMKgwqAgRVJSUF9H VUFSRCgpOwo+ID4gK8KgwqDCoCBjb25zdCBJR1ZNX1ZIU19QQVJBTUVURVJfSU5TRVJUICpwYXJh bSA9Cj4gPiArwqDCoMKgwqDCoMKgwqAgKGNvbnN0IElHVk1fVkhTX1BBUkFNRVRFUl9JTlNFUlQg KiloZWFkZXJfZGF0YTsKPiA+ICvCoMKgwqAgSWd2bVBhcmFtZXRlckRhdGEgKnBhcmFtX2VudHJ5 Owo+ID4gK8KgwqDCoCBpbnQgcmVzdWx0Owo+ID4gK8KgwqDCoCB2b2lkICpyZWdpb247Cj4gPiAr Cj4gPiArwqDCoMKgIFFUQUlMUV9GT1JFQUNIKHBhcmFtX2VudHJ5LCAmcGFyYW1ldGVyX2RhdGEs IG5leHQpCj4gPiArwqDCoMKgIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCBpZiAocGFyYW1fZW50cnkt PmluZGV4ID09IHBhcmFtLT5wYXJhbWV0ZXJfYXJlYV9pbmRleCkgewo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmVnaW9uID0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWd2bV9wcmVwYXJlX21lbW9yeShwYXJhbS0+Z3BhLCBwYXJhbV9lbnRyeS0+c2l6ZSwgaSwKPiA+ IGVycnApOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFyZWdpb24pIHsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtY3B5KHJlZ2lvbiwg cGFyYW1fZW50cnktPmRhdGEsIHBhcmFtX2VudHJ5LT5zaXplKTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdfZnJlZShwYXJhbV9lbnRyeS0+ZGF0YSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwYXJhbV9lbnRyeS0+ZGF0YSA9IE5VTEw7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXN1bHQgPSBjZ3MtPnNldF9ndWVzdF9zdGF0ZShwYXJhbS0+Z3BhLCByZWdp b24sIHBhcmFtX2VudHJ5LQo+ID4gPnNpemUsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBDR1NfUEFHRV9UWVBFX1VOTUVBU1VSRUQsIDAsCj4gPiBlcnJwKTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmIChyZXN1bHQgIT0gMCkgewo+IAo+IFVzZSAnPCAwJwo+IAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoISplcnJwKSB7Cj4gCj4gUmVkdW5kYW50 Cj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0 ZyhlcnJwLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAiSUdWTTogRmFpbGVkIHRvIHNldCBndWVzdCBzdGF0ZToKPiA+IGVy cm9yX2NvZGU9JWQiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXN1bHQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAt MTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4g PiArwqDCoMKgIH0KPiA+ICvCoMKgwqAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgY21wX21tX2VudHJ5KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCj4gPiArewo+ ID4gK8KgwqDCoCBjb25zdCBJR1ZNX1ZIU19NRU1PUllfTUFQX0VOVFJZICplbnRyeV9hID0KPiA+ ICvCoMKgwqDCoMKgwqDCoCAoY29uc3QgSUdWTV9WSFNfTUVNT1JZX01BUF9FTlRSWSAqKWE7Cj4g PiArwqDCoMKgIGNvbnN0IElHVk1fVkhTX01FTU9SWV9NQVBfRU5UUlkgKmVudHJ5X2IgPQo+ID4g K8KgwqDCoMKgwqDCoMKgIChjb25zdCBJR1ZNX1ZIU19NRU1PUllfTUFQX0VOVFJZICopYjsKPiA+ ICvCoMKgwqAgaWYgKGVudHJ5X2EtPnN0YXJ0aW5nX2dwYV9wYWdlX251bWJlciA8IGVudHJ5X2It Cj4gPiA+c3RhcnRpbmdfZ3BhX3BhZ2VfbnVtYmVyKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC0xOwo+ID4gK8KgwqDCoCB9IGVsc2UgaWYgKGVudHJ5X2EtPnN0YXJ0aW5nX2dwYV9wYWdl X251bWJlciA+Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnRyeV9iLT5zdGFy dGluZ19ncGFfcGFnZV9udW1iZXIpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMTsKPiA+ ICvCoMKgwqAgfSBlbHNlIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPiA+ICvCoMKg wqAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGRpcmVjdGl2ZV9tZW1vcnlfbWFwKENv bmZpZGVudGlhbEd1ZXN0U3VwcG9ydCAqY2dzLCBpbnQgaSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50MzJfdCBj b21wYXRpYmlsaXR5X21hc2ssCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgdWludDhfdCAqaGVhZGVyX2RhdGEs IEVycm9yICoqZXJycCkKPiA+ICt7Cj4gPiArwqDCoMKgIGNvbnN0IElHVk1fVkhTX1BBUkFNRVRF UiAqcGFyYW0gPSAoY29uc3QgSUdWTV9WSFNfUEFSQU1FVEVSCj4gPiAqKWhlYWRlcl9kYXRhOwo+ ID4gK8KgwqDCoCBJZ3ZtUGFyYW1ldGVyRGF0YSAqcGFyYW1fZW50cnk7Cj4gPiArwqDCoMKgIGlu dCBtYXhfZW50cnlfY291bnQ7Cj4gPiArwqDCoMKgIGludCBlbnRyeSA9IDA7Cj4gPiArwqDCoMKg IElHVk1fVkhTX01FTU9SWV9NQVBfRU5UUlkgKm1tX2VudHJ5Owo+ID4gK8KgwqDCoCBDb25maWRl bnRpYWxHdWVzdE1lbW9yeU1hcEVudHJ5IGNnbW1fZW50cnk7Cj4gPiArwqDCoMKgIGludCByZXR2 YWwgPSAwOwo+ID4gKwo+ID4gK8KgwqDCoCAvKiBGaW5kIHRoZSBwYXJhbWV0ZXIgYXJlYSB0aGF0 IHNob3VsZCBob2xkIHRoZSBtZW1vcnkgbWFwICovCj4gPiArwqDCoMKgIFFUQUlMUV9GT1JFQUNI KHBhcmFtX2VudHJ5LCAmcGFyYW1ldGVyX2RhdGEsIG5leHQpCj4gPiArwqDCoMKgIHsKPiA+ICvC oMKgwqDCoMKgwqDCoCBpZiAocGFyYW1fZW50cnktPmluZGV4ID09IHBhcmFtLT5wYXJhbWV0ZXJf YXJlYV9pbmRleCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWF4X2VudHJ5X2NvdW50 ID0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFyYW1fZW50cnktPnNpemUg LyBzaXplb2YoSUdWTV9WSFNfTUVNT1JZX01BUF9FTlRSWSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBtbV9lbnRyeSA9IChJR1ZNX1ZIU19NRU1PUllfTUFQX0VOVFJZICopcGFyYW1fZW50 cnktPmRhdGE7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR2YWwgPSBjZ3Mt PmdldF9tZW1fbWFwX2VudHJ5KGVudHJ5LCAmY2dtbV9lbnRyeSwgZXJycCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB3aGlsZSAocmV0dmFsID09IDApIHsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKGVudHJ5ID4gbWF4X2VudHJ5X2NvdW50KSB7Cj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0ZygKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycnAsCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiSUdWTTogZ3Vlc3Qg bWVtb3J5IG1hcCBzaXplIGV4Y2VlZHMgcGFyYW1ldGVyIGFyZWEKPiA+IGRlZmluZWQgaW4gSUdW TSBmaWxlIik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC0xOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1tX2VudHJ5W2VudHJ5XS5zdGFydGluZ19ncGFfcGFn ZV9udW1iZXIgPSBjZ21tX2VudHJ5LmdwYQo+ID4gPj4gMTI7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIG1tX2VudHJ5W2VudHJ5XS5udW1iZXJfb2ZfcGFnZXMgPSBjZ21tX2Vu dHJ5LnNpemUgPj4gMTI7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHN3aXRjaCAoY2dtbV9lbnRyeS50eXBlKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGNhc2UgQ0dTX01FTV9SQU06Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbW1fZW50cnlbZW50cnldLmVudHJ5X3R5cGUgPSBNRU1PUlk7Cj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNhc2UgQ0dTX01FTV9SRVNFUlZFRDoKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtbV9lbnRyeVtlbnRyeV0uZW50cnlfdHlw ZSA9IFBMQVRGT1JNX1JFU0VSVkVEOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjYXNl IENHU19NRU1fQUNQSToKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBtbV9lbnRyeVtlbnRyeV0uZW50cnlfdHlwZSA9IFBMQVRGT1JNX1JFU0VSVkVEOwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjYXNlIENHU19NRU1fTlZTOgo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1tX2VudHJ5W2VudHJ5XS5lbnRyeV90eXBlID0g UEVSU0lTVEVOVDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBi cmVhazsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2FzZSBDR1NfTUVNX1VO VVNBQkxFOgo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1tX2Vu dHJ5W2VudHJ5XS5lbnRyeV90eXBlID0gUExBVEZPUk1fUkVTRVJWRUQ7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dmFsID0gY2dzLT5nZXRfbWVtX21hcF9lbnRyeSgrK2VudHJ5LCAmY2dtbV9lbnRyeSwKPiA+IGVy cnApOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaWYgKHJldHZhbCA8IDApIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIHJldHZhbDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC8qIFRoZSBlbnRyaWVzIG5lZWQgdG8gYmUgc29ydGVkICovCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBxc29ydChtbV9lbnRyeSwgZW50cnksIHNpemVvZihJ R1ZNX1ZIU19NRU1PUllfTUFQX0VOVFJZKSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNtcF9tbV9lbnRyeSk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBicmVhazsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgIH0KPiA+ICvCoMKgwqAg cmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgZGlyZWN0aXZlX3ZwX2NvdW50 KENvbmZpZGVudGlhbEd1ZXN0U3VwcG9ydCAqY2dzLCBpbnQgaSwKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQzMl90IGNv bXBhdGliaWxpdHlfbWFzaywKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlcl9kYXRhLCBFcnJv ciAqKmVycnApCj4gPiArewo+ID4gK8KgwqDCoCBjb25zdCBJR1ZNX1ZIU19QQVJBTUVURVIgKnBh cmFtID0gKGNvbnN0IElHVk1fVkhTX1BBUkFNRVRFUgo+ID4gKiloZWFkZXJfZGF0YTsKPiA+ICvC oMKgwqAgSWd2bVBhcmFtZXRlckRhdGEgKnBhcmFtX2VudHJ5Owo+ID4gK8KgwqDCoCB1aW50MzJf dCAqdnBfY291bnQ7Cj4gPiArwqDCoMKgIENQVVN0YXRlICpjcHU7Cj4gPiArCj4gPiArwqDCoMKg IFFUQUlMUV9GT1JFQUNIKHBhcmFtX2VudHJ5LCAmcGFyYW1ldGVyX2RhdGEsIG5leHQpCj4gPiAr wqDCoMKgIHsKPiA+ICvCoMKgwqDCoMKgwqDCoCBpZiAocGFyYW1fZW50cnktPmluZGV4ID09IHBh cmFtLT5wYXJhbWV0ZXJfYXJlYV9pbmRleCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dnBfY291bnQgPSAodWludDMyX3QgKikocGFyYW1fZW50cnktPmRhdGEgKyBwYXJhbS0KPiA+ID5i eXRlX29mZnNldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqdnBfY291bnQgPSAwOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ1BVX0ZPUkVBQ0goY3B1KQo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKnZw X2NvdW50KSsrOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYnJlYWs7Cj4gPiArwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoCB9Cj4g PiArwqDCoMKgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGRpcmVjdGl2 ZV9lbnZpcm9ubWVudF9pbmZvKENvbmZpZGVudGlhbEd1ZXN0U3VwcG9ydCAqY2dzLCBpbnQgaSwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50MzJfdCBjb21wYXRpYmlsaXR5X21hc2ssCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgdWludDhfdCAqaGVhZGVyX2RhdGEsIEVycm9yCj4gPiAq KmVycnApCj4gPiArewo+ID4gK8KgwqDCoCBjb25zdCBJR1ZNX1ZIU19QQVJBTUVURVIgKnBhcmFt ID0gKGNvbnN0IElHVk1fVkhTX1BBUkFNRVRFUgo+ID4gKiloZWFkZXJfZGF0YTsKPiA+ICvCoMKg wqAgSWd2bVBhcmFtZXRlckRhdGEgKnBhcmFtX2VudHJ5Owo+ID4gK8KgwqDCoCBJZ3ZtRW52aXJv bm1lbnRJbmZvICplbnZpcm9ubWVudGFsX3N0YXRlOwo+ID4gKwo+ID4gK8KgwqDCoCBRVEFJTFFf Rk9SRUFDSChwYXJhbV9lbnRyeSwgJnBhcmFtZXRlcl9kYXRhLCBuZXh0KQo+ID4gK8KgwqDCoCB7 Cj4gPiArwqDCoMKgwqDCoMKgwqAgaWYgKHBhcmFtX2VudHJ5LT5pbmRleCA9PSBwYXJhbS0+cGFy YW1ldGVyX2FyZWFfaW5kZXgpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudmlyb25t ZW50YWxfc3RhdGUgPQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoSWd2bUVu dmlyb25tZW50SW5mbyAqKShwYXJhbV9lbnRyeS0+ZGF0YSArIHBhcmFtLQo+ID4gPmJ5dGVfb2Zm c2V0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudmlyb25tZW50YWxfc3RhdGUtPm1l bW9yeV9pc19zaGFyZWQgPSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4g PiArwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoCB9Cj4gPiArwqDCoMKgIHJldHVybiAwOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGRpcmVjdGl2ZV9yZXF1aXJlZF9tZW1vcnkoQ29u ZmlkZW50aWFsR3Vlc3RTdXBwb3J0ICpjZ3MsIGludCBpLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 aW50MzJfdCBjb21wYXRpYmlsaXR5X21hc2ssCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHVp bnQ4X3QgKmhlYWRlcl9kYXRhLCBFcnJvcgo+ID4gKiplcnJwKQo+ID4gK3sKPiA+ICvCoMKgwqAg RVJSUF9HVUFSRCgpOwo+ID4gK8KgwqDCoCBjb25zdCBJR1ZNX1ZIU19SRVFVSVJFRF9NRU1PUlkg Km1lbSA9Cj4gPiArwqDCoMKgwqDCoMKgwqAgKGNvbnN0IElHVk1fVkhTX1JFUVVJUkVEX01FTU9S WSAqKWhlYWRlcl9kYXRhOwo+ID4gK8KgwqDCoCB1aW50OF90ICpyZWdpb247Cj4gPiArwqDCoMKg IGludCByZXN1bHQ7Cj4gPiArCj4gPiArwqDCoMKgIGlmIChtZW0tPmNvbXBhdGliaWxpdHlfbWFz ayAmIGNvbXBhdGliaWxpdHlfbWFzaykgewo+ID4gK8KgwqDCoMKgwqDCoMKgIHJlZ2lvbiA9IGln dm1fcHJlcGFyZV9tZW1vcnkobWVtLT5ncGEsIG1lbS0+bnVtYmVyX29mX2J5dGVzLCBpLAo+ID4g ZXJycCk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgaWYgKCFyZWdpb24pIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPiA+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKg wqDCoMKgwqAgcmVzdWx0ID0gY2dzLT5zZXRfZ3Vlc3Rfc3RhdGUobWVtLT5ncGEsIHJlZ2lvbiwg bWVtLQo+ID4gPm51bWJlcl9vZl9ieXRlcywKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDR1NfUEFH RV9UWVBFX1JFUVVJUkVEX01FTU9SWSwgMCwKPiA+IGVycnApOwo+ID4gK8KgwqDCoMKgwqDCoMKg IGlmIChyZXN1bHQgPCAwKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoISplcnJw KSB7Cj4gCj4gUmVkeW51ZGF0Cj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGVycm9yX3NldGcoZXJycCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICJJR1ZNOiBGYWlsZWQgdG8gc2V0IGd1ZXN0IHN0YXRlOgo+ID4g ZXJyb3JfY29kZT0lZCIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXN1bHQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4gK8KgwqDCoMKgwqDCoMKg IH0KPiA+ICvCoMKgwqAgfQo+ID4gK8KgwqDCoCByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIHVpbnQzMl90IHN1cHBvcnRlZF9wbGF0Zm9ybV9jb21wYXRfbWFzayhDb25maWRlbnRp YWxHdWVzdFN1cHBvcnQKPiA+ICpjZ3MsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgRXJyb3IgKiplcnJwKQo+ID4gK3sKPiA+ICvCoMKgwqAgaW50MzJfdCByZXN1bHQ7 Cj4gPiArwqDCoMKgIGludCBpOwo+ID4gK8KgwqDCoCBJZ3ZtSGFuZGxlIGhlYWRlcl9oYW5kbGU7 Cj4gPiArwqDCoMKgIElHVk1fVkhTX1NVUFBPUlRFRF9QTEFURk9STSAqcGxhdGZvcm07Cj4gPiAr wqDCoMKgIHVpbnQzMl90IGNvbXBhdGliaWxpdHlfbWFzayA9IDA7Cj4gPiArCj4gPiArwqDCoMKg IHJlc3VsdCA9IGlndm1faGVhZGVyX2NvdW50KGNncy0+aWd2bSwgSEVBREVSX1NFQ1RJT05fUExB VEZPUk0pOwo+ID4gK8KgwqDCoCBpZiAocmVzdWx0IDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKg IGVycm9yX3NldGcoZXJycCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgIkludmFsaWQgcGxhdGZvcm0gaGVhZGVyIGNvdW50IGluIElHVk0gZmlsZS4gRXJyb3IgY29k ZToKPiA+ICVYIiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVz dWx0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPiA+ICvCoMKgwqAgfQo+ID4gKwo+ ID4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgKGludClyZXN1bHQ7ICsraSkgewo+ID4gK8KgwqDC oMKgwqDCoMKgIElndm1WYXJpYWJsZUhlYWRlclR5cGUgdHlwID0KPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGlndm1fZ2V0X2hlYWRlcl90eXBlKGNncy0+aWd2bSwgSEVBREVSX1NFQ1RJT05f UExBVEZPUk0sIGkpOwo+ID4gK8KgwqDCoMKgwqDCoMKgIGlmICh0eXAgPT0gSUdWTV9WSFRfU1VQ UE9SVEVEX1BMQVRGT1JNKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBoZWFkZXJfaGFu ZGxlID0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWd2bV9nZXRfaGVhZGVy KGNncy0+aWd2bSwgSEVBREVSX1NFQ1RJT05fUExBVEZPUk0sIGkpOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaWYgKGhlYWRlcl9oYW5kbGUgPCAwKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGVycm9yX3NldGcoZXJycCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJJbnZhbGlkIHBsYXRmb3JtIGhlYWRl ciBpbiBJR1ZNIGZpbGUuICIKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICJJbmRleDogJWQsIEVycm9yIGNvZGU6ICVYIiwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGksIGhlYWRl cl9oYW5kbGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBsYXRmb3JtID0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKElHVk1fVkhT X1NVUFBPUlRFRF9QTEFURk9STSAqKShpZ3ZtX2dldF9idWZmZXIoY2dzLT5pZ3ZtLAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoAo+ID4gaGVhZGVyX2hhbmRsZSkgKwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoAo+ID4gSUdWTV9WSFNfVkFSSUFCTEVfSEVBREVSKSk7Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0IFNFVi1TTlAu ICovCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocGxhdGZvcm0tPnBsYXRmb3JtX3R5 cGUgPT0gU0VWX1NOUCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKgo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogSUdWTSBkb2VzIG5vdCBkZWZp bmUgYSBwbGF0Zm9ybSB0eXBlcyBvZiBTRVYgb3IgU0VWX0VTLgo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICogVHJhbnNsYXRlIFNFVl9TTlAgaW50byBDR1NfUExBVEZPUk1f U0VWX0VTIGFuZAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQ0dTX1BM QVRGT1JNX1NFViBhbmQgbGV0IHRoZSBjZ3MgZnVuY3Rpb24KPiA+IGltcGxlbWVudGF0aW9ucwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogY2hlY2sgd2hldGhlciBlYWNo IElHVk0gZGlyZWN0aXZlIHJlc3VsdHMgaW4gYW4KPiA+IG9wZXJhdGlvbgo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRp Y3VsYXIgZGVyaXZhdGl2ZSBvZiBTRVYuCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGNncy0+Y2hl Y2tfc3VwcG9ydCgKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIENHU19QTEFURk9STV9TRVZfRVMsIHBsYXRmb3JtLT5wbGF0Zm9ybV92ZXJzaW9uLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhdGZv cm0tPmhpZ2hlc3RfdnRsLCBwbGF0Zm9ybS0KPiA+ID5zaGFyZWRfZ3BhX2JvdW5kYXJ5KSB8fAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNncy0+Y2hlY2tfc3Vw cG9ydCgKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IENHU19QTEFURk9STV9TRVYsIHBsYXRmb3JtLT5wbGF0Zm9ybV92ZXJzaW9uLAo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhdGZvcm0tPmhpZ2hl c3RfdnRsLCBwbGF0Zm9ybS0KPiA+ID5zaGFyZWRfZ3BhX2JvdW5kYXJ5KSkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbXBhdGliaWxpdHlfbWFzayA9IHBs YXRmb3JtLT5jb21wYXRpYmlsaXR5X21hc2s7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlndm1fZnJlZV9idWZmZXIoY2dzLT5pZ3ZtLCBoZWFkZXJfaGFuZGxlKTsKPiA+ICvCoMKg wqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgIH0KPiA+ICvCoMKgwqAgaWYgKGNvbXBhdGliaWxpdHlf bWFzayA9PSAwKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0ZygKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGVycnAsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiSUdWTSBm aWxlIGRvZXMgbm90IGRlc2NyaWJlIGEgY29tcGF0aWJsZSBzdXBwb3J0ZWQgcGxhdGZvcm0iKTsK PiA+ICvCoMKgwqAgfQo+ID4gK8KgwqDCoCByZXR1cm4gY29tcGF0aWJpbGl0eV9tYXNrOwo+ID4g K30KPiA+ICsKPiA+ICtpbnQgaWd2bV9maWxlX2luaXQoQ29uZmlkZW50aWFsR3Vlc3RTdXBwb3J0 ICpjZ3MsIEVycm9yICoqZXJycCkKPiA+ICt7Cj4gPiArwqDCoMKgIGdfYXV0b2ZyZWUgdWludDhf dCAqYnVmID0gTlVMTDsKPiA+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBsZW47Cj4gPiArwqDCoMKg IGdfYXV0b3B0cihHRXJyb3IpIGdlcnIgPSBOVUxMOwo+ID4gKwo+ID4gK8KgwqDCoCBpZiAoIWNn cy0+aWd2bV9maWxlbmFtZSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+ID4gK8Kg wqDCoCB9Cj4gCj4gSSdkIHByZWZlciB0byBzZWUgdGhpcyBjaGVjayBpbiB0aGUgY2FsbGVyLCBh cyBpdCBtYWtlcyBpdCBjbGVhcmVyCj4gdGhhdCB0aGUgaWd2bSBsb2dpYyB3b24ndCBiZSBydW4g d2hlbiB0aGUgZmlsZW5hbWUgaXMgdW5zZXQuCj4gCj4gPiArCj4gPiArwqDCoMKgIGlmICghZ19m aWxlX2dldF9jb250ZW50cyhjZ3MtPmlndm1fZmlsZW5hbWUsIChnY2hhciAqKikmYnVmLCAmbGVu LAo+ID4gJmdlcnIpKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgZXJyb3Jfc2V0ZyhlcnJwLCAiVW5h YmxlIHRvIGxvYWQgJXM6ICVzIiwgY2dzLT5pZ3ZtX2ZpbGVuYW1lLAo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnZXJyLT5tZXNzYWdlKTsKPiA+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm4gLTE7Cj4gPiArwqDCoMKgIH0KPiA+ICsKPiA+ICvCoMKgwqAgY2dzLT5pZ3Zt ID0gaWd2bV9uZXdfZnJvbV9iaW5hcnkoYnVmLCBsZW4pOwo+ID4gK8KgwqDCoCBpZiAoY2dzLT5p Z3ZtIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgIGVycm9yX3NldGcoZXJycCwgIlVuYWJsZSB0 byBwYXJzZSBJR1ZNIGZpbGUgJXM6ICVkIiwgY2dzLQo+ID4gPmlndm1fZmlsZW5hbWUsCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNncy0+aWd2bSk7Cj4gPiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+ID4gK8KgwqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgIHJl dHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtpbnQgaWd2bV9wcm9jZXNzKENvbmZpZGVudGlhbEd1 ZXN0U3VwcG9ydCAqY2dzLCBFcnJvciAqKmVycnApCj4gPiArewo+ID4gK8KgwqDCoCBpbnQzMl90 IHJlc3VsdDsKPiA+ICvCoMKgwqAgaW50IGk7Cj4gPiArwqDCoMKgIHVpbnQzMl90IGNvbXBhdGli aWxpdHlfbWFzazsKPiA+ICvCoMKgwqAgSWd2bVBhcmFtZXRlckRhdGEgKnBhcmFtZXRlcjsKPiA+ ICvCoMKgwqAgaW50IHJldHZhbCA9IDA7Cj4gCj4gQ2hhbmdlIHRvICdyZXR2YWwgPSAtMScKPiAK PiA+ICsKPiA+ICvCoMKgwqAgLyoKPiA+ICvCoMKgwqDCoCAqIElmIHRoaXMgaXMgbm90IGEgQ29u ZmlkZW50aWFsIGd1ZXN0IG9yIG5vIElHVk0gaGFzIGJlZW4gcHJvdmlkZWQKPiA+IHRoZW4KPiA+ ICvCoMKgwqDCoCAqIHRoaXMgaXMgYSBuby1vcC4KPiA+ICvCoMKgwqDCoCAqLwo+ID4gK8KgwqDC oCBpZiAoIWNncy0+aWd2bSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+ID4gK8Kg wqDCoCB9Cj4gCj4gQWdhaW4gSSdkIHByZWZlZHIgdGhlIGNhbGxlciB0byBkbyB0aGlzIGNoZWNr IGFuZCBhdm9pZCBjYWxsaW5nCj4gaWd2bV9wcm9jZXNzLCB0byBtYWtlIGl0IGNsZWFyIGl0IGlz IGEgbm8tb3AuCj4gCj4gPiArCj4gPiArwqDCoMKgIC8qCj4gPiArwqDCoMKgwqAgKiBDaGVjayB0 aGF0IHRoZSBJR1ZNIGZpbGUgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQK PiA+ICvCoMKgwqDCoCAqIHBsYXRmb3JtCj4gPiArwqDCoMKgwqAgKi8KPiA+ICvCoMKgwqAgY29t cGF0aWJpbGl0eV9tYXNrID0gc3VwcG9ydGVkX3BsYXRmb3JtX2NvbXBhdF9tYXNrKGNncywgZXJy cCk7Cj4gPiArwqDCoMKgIGlmIChjb21wYXRpYmlsaXR5X21hc2sgPT0gMCkgewo+ID4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAtMTsKPiA+ICvCoMKgwqAgfQo+ID4gKwo+ID4gK8KgwqDCoCByZXN1 bHQgPSBpZ3ZtX2hlYWRlcl9jb3VudChjZ3MtPmlndm0sIEhFQURFUl9TRUNUSU9OX0RJUkVDVElW RSk7Cj4gPiArwqDCoMKgIGlmIChyZXN1bHQgPCAwKSB7Cj4gCj4gSXMgMCBhIHZhbGlkIGhlYWRl ciBjb3VudCwgb3Igc2hvdWxkIHRoaXMgYmUgJzw9JyBpbnN0ZWFkIG9mICc8JyA/Cj4gCkl0IGlz IHZhbGlkIGFzIGZhciBhcyB0aGUgSUdWTSBsaWJyYXJ5IGlzIGNvbmNlcm5lZCBidXQgbWFrZXMg bm8gc2Vuc2UgaW4gdGhlCmNvbnRleHQgb2YgdGhlIFFFTVUgSUdWTSBsb2FkZXIsIHNvIEkndmUg Y2hhbmdlZCB0aGlzIHRvICc8PSAwJyBhcyBzdWdnZXN0ZWQuCgo+ID4gK8KgwqDCoMKgwqDCoMKg IGVycm9yX3NldGcoCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJwLCAiSW52YWxpZCBk aXJlY3RpdmUgaGVhZGVyIGNvdW50IGluIElHVk0gZmlsZS4gRXJyb3IgY29kZToKPiA+ICVYIiwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlc3VsdCk7Cj4gPiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC0xOwo+ID4gK8KgwqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgIFFUQUlMUV9JTklUKCZw YXJhbWV0ZXJfZGF0YSk7Cj4gPiArCj4gPiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCAoaW50KXJl c3VsdDsgKytpKSB7Cj4gCj4gUHJlZmVycmFibHnCoCAnaSsrICcgZm9yIG1vcmUgY29tbW9uIHN0 eWxlLgo+IAo+ID4gK8KgwqDCoMKgwqDCoMKgIElndm1WYXJpYWJsZUhlYWRlclR5cGUgdHlwZSA9 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZ3ZtX2dldF9oZWFkZXJfdHlwZShjZ3MtPmln dm0sIEhFQURFUl9TRUNUSU9OX0RJUkVDVElWRSwgaSk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgaWYg KGRpcmVjdGl2ZSh0eXBlLCBjZ3MsIGksIGNvbXBhdGliaWxpdHlfbWFzaywgZXJycCkgPCAwKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR2YWwgPSAtMTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGJyZWFrOwo+IAo+IFJlcGxhY2UgdHdvIGxpbmVzIHdpdGggJ2dvdG8gY2xl YW51cCcuCj4gCj4gPiArwqDCoMKgwqDCoMKgwqAgfQo+ID4gK8KgwqDCoCB9Cj4gPiArCj4gPiAr wqDCoMKgIC8qCj4gPiArwqDCoMKgwqAgKiBDb250aWd1b3VzIHBhZ2VzIG9mIGRhdGEgd2l0aCBj b21wYXRpYmxlIGZsYWdzIGFyZSBncm91cGVkIHRvZ2V0aGVyCj4gPiBpbgo+ID4gK8KgwqDCoMKg ICogb3JkZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgd2UgY3JlYXRl LiBNYWtlIHN1cmUKPiA+IHRoZQo+ID4gK8KgwqDCoMKgICogbGFzdCBncm91cCBpcyBwcm9jZXNz ZWQgd2l0aCB0aGlzIGNhbGwuCj4gPiArwqDCoMKgwqAgKi8KPiA+ICvCoMKgwqAgaWYgKHJldHZh bCA9PSAwKSB7Cj4gCj4gQ2FuIHJlbW92ZSB0aGlzIGNvbmRpdGlvbiBjaGVjawo+IAo+ID4gK8Kg wqDCoMKgwqDCoMKgIHJldHZhbCA9IHByb2Nlc3NfbWVtX3BhZ2UoY2dzLCBpLCBOVUxMLCBlcnJw KTsKPiA+ICvCoMKgwqAgfQo+ID4gKwo+IAo+IEhlcmUgYWRkOgo+IAo+IMKgIGNsZWFudXA6Cj4g Cj4gPiArwqDCoMKgIFFUQUlMUV9GT1JFQUNIKHBhcmFtZXRlciwgJnBhcmFtZXRlcl9kYXRhLCBu ZXh0KQo+ID4gK8KgwqDCoCB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgZ19mcmVlKHBhcmFtZXRlci0+ ZGF0YSk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgcGFyYW1ldGVyLT5kYXRhID0gTlVMTDsKPiA+ICvC oMKgwqAgfQo+ID4gKwo+ID4gK8KgwqDCoCByZXR1cm4gcmV0dmFsOwo+ID4gK30KPiA+ICsKPiA+ ICsjZW5kaWYKPiA+IGRpZmYgLS1naXQgYS9iYWNrZW5kcy9tZXNvbi5idWlsZCBiL2JhY2tlbmRz L21lc29uLmJ1aWxkCj4gPiBpbmRleCBkNTUwYWMxOWY3Li5kMDkyODUwYTA3IDEwMDY0NAo+ID4g LS0tIGEvYmFja2VuZHMvbWVzb24uYnVpbGQKPiA+ICsrKyBiL2JhY2tlbmRzL21lc29uLmJ1aWxk Cj4gPiBAQCAtMzIsNiArMzIsNyBAQCBzeXN0ZW1fc3MuYWRkKHdoZW46IGdpbywgaWZfdHJ1ZTog ZmlsZXMoJ2RidXMtdm1zdGF0ZS5jJykpCj4gPiDCoHN5c3RlbV9zcy5hZGQod2hlbjogJ0NPTkZJ R19TR1gnLCBpZl90cnVlOiBmaWxlcygnaG9zdG1lbS1lcGMuYycpKQo+ID4gwqBpZiBpZ3ZtLmZv dW5kKCkKPiA+IMKgwqAgc3lzdGVtX3NzLmFkZChpZ3ZtKQo+ID4gK8KgIHN5c3RlbV9zcy5hZGQo ZmlsZXMoJ2lndm0uYycpKQo+ID4gwqBlbmRpZgo+ID4gwqAKPiA+IMKgc3ViZGlyKCd0cG0nKQo+ ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXhlYy9jb25maWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5o Cj4gPiBiL2luY2x1ZGUvZXhlYy9jb25maWRlbnRpYWwtZ3Vlc3Qtc3VwcG9ydC5oCj4gPiBpbmRl eCBhOGFkODRmYTA3Li45NDE5ZTkxMjQ5IDEwMDY0NAo+ID4gLS0tIGEvaW5jbHVkZS9leGVjL2Nv bmZpZGVudGlhbC1ndWVzdC1zdXBwb3J0LmgKPiA+ICsrKyBiL2luY2x1ZGUvZXhlYy9jb25maWRl bnRpYWwtZ3Vlc3Qtc3VwcG9ydC5oCj4gPiBAQCAtMjcsNiArMjcsMTAgQEAKPiA+IMKgI2luY2x1 ZGUgImlndm0vaWd2bS5oIgo+ID4gwqAjZW5kaWYKPiA+IMKgCj4gPiArI2lmIGRlZmluZWQoQ09O RklHX0lHVk0pCj4gPiArI2luY2x1ZGUgImlndm0vaWd2bS5oIgo+ID4gKyNlbmRpZgo+ID4gKwo+ ID4gwqAjZGVmaW5lIFRZUEVfQ09ORklERU5USUFMX0dVRVNUX1NVUFBPUlQgImNvbmZpZGVudGlh bC1ndWVzdC1zdXBwb3J0Igo+ID4gwqBPQkpFQ1RfREVDTEFSRV9TSU1QTEVfVFlQRShDb25maWRl bnRpYWxHdWVzdFN1cHBvcnQsCj4gPiBDT05GSURFTlRJQUxfR1VFU1RfU1VQUE9SVCkKPiA+IMKg Cj4gPiBAQCAtOTMsNiArOTcsNyBAQCBzdHJ1Y3QgQ29uZmlkZW50aWFsR3Vlc3RTdXBwb3J0IHsK PiA+IMKgwqDCoMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBWaXJ0dWFsIE1h Y2hpbmUgKElHVk0pIGZvcm1hdC4KPiA+IMKgwqDCoMKgwqAgKi8KPiA+IMKgwqDCoMKgIGNoYXIg Kmlndm1fZmlsZW5hbWU7Cj4gPiArwqDCoMKgIElndm1IYW5kbGUgaWd2bTsKPiA+IMKgI2VuZGlm Cj4gPiDCoAo+ID4gwqDCoMKgwqAgLyoKPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2V4ZWMvaWd2 bS5oIGIvaW5jbHVkZS9leGVjL2lndm0uaAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGlu ZGV4IDAwMDAwMDAwMDAuLjU5NTk0ZjA0N2UKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2lu Y2x1ZGUvZXhlYy9pZ3ZtLmgKPiA+IEBAIC0wLDAgKzEsMzYgQEAKPiA+ICsvKgo+ID4gKyAqIFFF TVUgSUdWTSBjb25maWd1cmF0aW9uIGJhY2tlbmQgZm9yIENvbmZpZGVudGlhbCBHdWVzdHMKPiA+ ICsgKgo+ID4gKyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI0IFNVU0UKPiA+ICsgKgo+ID4gKyAq IEF1dGhvcnM6Cj4gPiArICrCoCBSb3kgSG9wa2lucyA8cm95LmhvcGtpbnNAc3VzZS5jb20+Cj4g PiArICoKPiA+ICsgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IKPiA+IGxhdGVyLgo+ID4gKyAqIFNlZSB0aGUgQ09QWUlO RyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Lgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNp Zm5kZWYgRVhFQ19JR1ZNX0gKPiA+ICsjZGVmaW5lIEVYRUNfSUdWTV9ICj4gPiArCj4gPiArI2lu Y2x1ZGUgImV4ZWMvY29uZmlkZW50aWFsLWd1ZXN0LXN1cHBvcnQuaCIKPiA+ICsKPiA+ICsjaWYg ZGVmaW5lZChDT05GSUdfSUdWTSkKPiA+ICsKPiA+ICtpbnQgaWd2bV9maWxlX2luaXQoQ29uZmlk ZW50aWFsR3Vlc3RTdXBwb3J0ICpjZ3MsIEVycm9yICoqZXJycCk7Cj4gPiAraW50IGlndm1fcHJv Y2VzcyhDb25maWRlbnRpYWxHdWVzdFN1cHBvcnQgKmNncywgRXJyb3IgKiplcnApOwo+ID4gKwo+ ID4gKyNlbHNlCj4gPiArCj4gPiArc3RhdGljIGlubGluZSBpbnQgaWd2bV9maWxlX2luaXQoQ29u ZmlkZW50aWFsR3Vlc3RTdXBwb3J0ICpjZ3MsIEVycm9yCj4gPiAqKmVycnApCj4gPiArewo+ID4g K8KgwqDCoCByZXR1cm4gMDsKPiAKPiBUaGlzIHNob3VsZCByZXBvcnQgYW4gZXJyb3IgYW5kIHJl dHVybiAtMSwgc2luY2UgcmVhY2hpbmcKPiB0aGlzIHdvdWxkIGJlIGEgZXJyb3Igc2NlbmFyaW8K PiAKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGlubGluZSBpbnQgaWd2bV9wcm9jZXNzKENvbmZp ZGVudGlhbEd1ZXN0U3VwcG9ydCAqY2dzLCBFcnJvciAqKmVycnApCj4gPiArewo+IAo+IEFsc28g c2hvdWxkIHJlcG9ydCBhbiBlcnJvcgo+IAo+ID4gK30KPiA+ICsKPiA+ICsjZW5kaWYKPiA+ICsK PiA+ICsjZW5kaWYKPiA+IC0tIAo+ID4gMi40My4wCj4gPiAKPiAKPiBXaXRoIHJlZ2FyZHMsCj4g RGFuaWVsCgpUaGFua3MgZm9yIHRoZSByZXZpZXcuIEkndmUgYWdhaW4gcmV2aXNpdGVkIHRoZSBl cnJvciBoYW5kbGluZyBhbmQgbWFkZSB0aGUKY2hhbmdlcyBhcyB5b3UgaGF2ZSBzdWdnZXN0ZWQs IHVzaW5nIHRoZSBhc3N1bXB0aW9uIHRoYXQgYGVycnBgIGlzIGFsd2F5cyBzZXQKY29ycmVjdGx5 IGlmIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdCBhcyBhIHBhcmFtZXRlciByZXR1cm5zIGFuIGVy cm9yIGNvZGUuCgpJJ2xsIGFsc28gYmUgYWRkcmVzc2luZyBhbGwgdGhlIG90aGVyIGNvbW1lbnRz IGluIHRoZSBuZXh0IHZlcnNpb24uCgpSZWdhcmRzLApSb3kK