Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v7oBo-008BLq-PM for pgsql-hackers@arkaria.postgresql.org; Sun, 12 Oct 2025 05:00:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v7oBk-000W6e-9b for pgsql-hackers@arkaria.postgresql.org; Sun, 12 Oct 2025 05:00:09 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v7oBj-000W6V-QL for pgsql-hackers@lists.postgresql.org; Sun, 12 Oct 2025 05:00:08 +0000 Received: from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v7oBh-001hKT-0T for pgsql-hackers@postgresql.org; Sun, 12 Oct 2025 05:00:08 +0000 Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3ee130237a8so2480162f8f.0 for ; Sat, 11 Oct 2025 22:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760245203; x=1760850003; darn=postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=Cfxga8uEZX9IuCzzQ+phVpSFDSlEL+lUkE57knrho1o=; b=nIgXiD/sxAsK0EjUX5hGo8qHyVqYuLQtT+GizIduIs5Yiw/LKOYPj9yeZwEiYgmj3L pM7tpOFAjZHalbXCACOSUaAbfznEkC55MIqEYGrCjWfwO97Rd9qwQclUXG5zuKmOx5yF bB60WXFn5CHjhND1V4eIDqppGqvrRe6Gd9kegz/t2LJ+917NiOvKYmBDJkXcLaxKi38W kYyrLbCyTnquYYb9brkLuvZh6EvSeaNUpC9aIooycx/JYX4q0cEzrz3Gdu2xjI7ECzhT PG1KWGug/EVTAYmnOhsyItiSYchGuiyp/Lecf9N7EIgkevdVo/P7Y4tYlkHoBNHbbm+F ceug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760245203; x=1760850003; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Cfxga8uEZX9IuCzzQ+phVpSFDSlEL+lUkE57knrho1o=; b=bpVeP+/9LZ5xyTjj37Jn5HLrC3TdU9mcBOewQF6xIcq6QotZfV4uYJFndzaUdCfmJA v+sclo0v4OfUszsLjsf0FayolNwQULmFoqx47RxH1NxCnpLH14SqzO3u54Xc8omqBcoP xuaOIlfcC57p0D+9F2iNyqfPc+n+LEPuV+kV67T38ACKaYT2Nsd2Rd7dnzOlPnAOTS0n oRHrfIAcf19NJspMdqdmvfnRzVtFlwHp9CV32P+OHnIlF6mBCXu52qZg0SCB8f9BT9G/ yfMDWvACiDW2aXycFufu7ZGaXXZsHU+g7eK244/Bc6HRvST7INRUy4tzMwW6JbgVCIwl Ksrg== X-Forwarded-Encrypted: i=1; AJvYcCWGSCns88ziLaufmdlgVEc5Uvrmnglt9EBln8k/Nn+9fIyrV9La+xUNf/YPX7H5KPH7k9Et1CKQYp2+7ZcT@postgresql.org X-Gm-Message-State: AOJu0YzdPCYLysg6+fJdH1hUYPrNtAouPTx4ntvc4zxr8/UvOc7jKWcN LNzCSPtzr5coCivdTyC709DZ3s0qqOqfbXxIHfd2kO+ubUw+zEpxYyj9 X-Gm-Gg: ASbGncskyylfBKou4BPwLUN3xPDiLfbbY1cCrCemz+z3Y2x0aBp03v4dNA0NNuJuGvG oOs6iD3+fhA+rfiul8KIrW5PBxYgZYR2GFS2jQ0YzOou/3yGFvZeSY4NLprykUGs5t05BSiA8rE L91oJUvCP31J+Z7g9ty1KsV3l/M2bDWwuouvbi87xbDcDqK2CvIGuWakmDXEof5aGkhTPc3sTy6 upM1cgmCxHUNmkk4bHiuQFVvZTDzrl5YnNEDwP1o9ic4s5P/DT3JgwtQrZxaCW6I+zIhmjpKTsg dVu+LGpiXoXYxbqIMPjOyReLCt0gO4lVJw4408YI/t/aiGabpl2rm5Too2mWcqaM/+oDnQSaKKa NJjpFVkFg/UkpsgUwKw0LgJbkvlLN5f6oy+HBPJQjDObJ X-Google-Smtp-Source: AGHT+IGjHLabUUWTxS/ofaEt4w8fuhwHIR+H00CSS6YaVJp1/Eejco4kC73CRpz+5e/+SOfilni4EQ== X-Received: by 2002:a05:600c:1d11:b0:46e:3d50:360e with SMTP id 5b1f17b1804b1-46fa9aeff01mr118861455e9.18.1760245202569; Sat, 11 Oct 2025 22:00:02 -0700 (PDT) Received: from [192.168.0.50] ([89.149.120.198]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-46fab36cc32sm98702035e9.0.2025.10.11.22.00.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 11 Oct 2025 22:00:01 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------XcXokEwDRlk0XwT7MKy0kr06" Message-ID: <60bbebf4-0a80-4e5f-83c0-311c85f6bd5c@gmail.com> Date: Sun, 12 Oct 2025 08:00:00 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: IO in wrong state on riscv64 To: Thomas Munro Cc: Andres Freund , pgsql-hackers , greg@burd.me References: Content-Language: en-US From: Alexander Lakhin In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------XcXokEwDRlk0XwT7MKy0kr06 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello Thomas, 12.10.2025 06:35, Thomas Munro wrote: > On Sun, Oct 12, 2025 at 2:00 AM Alexander Lakhin wrote: >> 2025-10-11 11:34:46.793 GMT [1169773:1] PANIC: !!!pgaio_io_wait| ioh->state changed from 0 to 1 at iteration 0 >> # no other iteration number observed > Can you please disassemble pgaio_io_update_state() and > pgaio_io_was_recycled()? I wonder if the memory barriers are not > being generated correctly, causing the state and generation to be > loaded out of order, or something like that... Please find those attached (gdb "disass/m pgaio_io_update_state" misses the start of the function (but it's still disassembled below), so I decided to share the whole output). This is from clean master, without any modifications, but with the issue confirmed for this build: 2025-10-11 20:29:11.724 UTC [1679534:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.725 UTC [1679536:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.726 UTC [1679538:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.724 UTC [1679533:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.724 UTC [1679537:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.724 UTC [1679535:1] [unknown] LOG:  connection received: host=[local] 2025-10-11 20:29:11.729 UTC [1679539:1] [unknown] LOG:  connection received: host=[local ... 2025-10-11 20:29:11.778 UTC [1679537:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_schema 2025-10-11 20:29:11.778 UTC [1679533:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_type 2025-10-11 20:29:11.778 UTC [1679539:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_procedure 2025-10-11 20:29:11.778 UTC [1679536:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_misc 2025-10-11 20:29:11.778 UTC [1679538:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_table 2025-10-11 20:29:11.778 UTC [1679535:3] [unknown] LOG:  connection authorized: user=debian database=regression application_name=pg_regress/create_function_c 2025-10-11 20:29:11.790 UTC [1679534:2] [unknown] FATAL:  IO in wrong state: 0 2025-10-11 20:29:11.790 UTC [1679534:3] [unknown] BACKTRACE:         postgres: debian regression [local] authentication(+0x4371ec) [0x555565cd61ec]         postgres: debian regression [local] authentication(+0x442bb2) [0x555565ce1bb2]         postgres: debian regression [local] authentication(StartBufferIO+0x66) [0x555565ce1a10]         postgres: debian regression [local] authentication(+0x43df60) [0x555565cdcf60]         postgres: debian regression [local] authentication(StartReadBuffer+0x308) [0x555565cdc8a4]         postgres: debian regression [local] authentication(ReadBufferExtended+0x64) [0x555565cdaace] ...         postgres: debian regression [local] authentication(postmaster_child_launch+0x132) [0x555565c7787c]         postgres: debian regression [local] authentication(+0x3dcd52) [0x555565c7bd52]         postgres: debian regression [local] authentication(InitProcessGlobals+0) [0x555565c79c96]         postgres: debian regression [local] authentication(+0x3194b2) [0x555565bb84b2]         /lib/riscv64-linux-gnu/libc.so.6(+0x2791c) [0x7fffa690891c]         /lib/riscv64-linux-gnu/libc.so.6(__libc_start_main+0x74) [0x7fffa69089c4]         postgres: debian regression [local] authentication(_start+0x20) [0x5555659842c8] > The previous failure on greenfly was a TIMEOUT in the same test, as if > a query was hanging. Yeah, I'll try to reproduce it too... > On Sun, Oct 12, 2025 at 2:00 AM Alexander Lakhin wrote: >> I've managed to reproduce it using qemu-system-riscv64 with Debian trixie > Huh, that's interesting. What is the host architecture? When I saw > that error myself and wondered about memory order, I dismissed the > idea of trying with qemu, figuring that my x86 host's TSO would affect > the coherency, but thinking again about that... I guess the compiler > might still reorder during riscv codegen if there is something wrong > with the barrier support, and even if it doesn't, the binary > translation to x86 might also feel free to reorder stuff if there are > no barrier instructions to prevent it? Or maybe that doesn't happen > but your host is ARM? I use AMD Ryzen 9 7900X, Ubuntu 24.04 and run the risc machine with: qemu-system-riscv64 -machine virt -m 1G -smp 8 -cpu rv64 -device virtio-blk-device,drive=hd \ -drive file=.../dqib_riscv64-virt/image.qcow2,if=none,id=hd -device virtio-net-device,netdev=net \ -netdev user,id=net,hostfwd=tcp::22222-:22 -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf \ -kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf -object rng-random,filename=/dev/urandom,id=rng \ -device virtio-rng-device,rng=rng -nographic -append "root=LABEL=rootfs console=ttyS0" I don't know what hardware greenfly uses (CC'ing Greg in case he'd like to share some info on this), but timings are similar to what I'm seeing: https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=greenfly&dt=2025-10-09%2000%3A06%3A03&stg=check ok 160       - select_parallel                          5019 ms `make check` on mine, with select_parallel repeated: ok 160       - select_parallel                          6042 ms ok 161       - select_parallel                          6089 ms ok 162       - select_parallel                          6116 ms copperhead and boomslang, which are using real RISC hardware [1], show better timings: https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=copperhead&dt=2025-10-11%2019%3A36%3A33&stg=check ok 160       - select_parallel                          2677 ms https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=boomslang&dt=2025-10-12%2002%3A17%3A53&stg=check ok 160       - select_parallel                          3651 ms Thank you for looking into this! [1] https://www.postgresql.org/message-id/3db97903-884f-4b0c-b1cd-d7442e71ea75%40app.fastmail.com Best regards, Alexander --------------XcXokEwDRlk0XwT7MKy0kr06 Content-Type: text/plain; charset=UTF-8; name="pgaio_io_update_state.asm" Content-Disposition: attachment; filename="pgaio_io_update_state.asm" Content-Transfer-Encoding: base64 R05VIGdkYiAoRGViaWFuIDE1LjItMSkgMTUuMgpDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMrOiBHTlUgR1BMIHZlcnNp b24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMg aXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmli dXRlIGl0LgpUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LgpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRl dGFpbHMuClRoaXMgR0RCIHdhcyBjb25maWd1cmVkIGFzICJyaXNjdjY0LWxpbnV4LWdudSIu ClR5cGUgInNob3cgY29uZmlndXJhdGlvbiIgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4K Rm9yIGJ1ZyByZXBvcnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOgo8aHR0cHM6Ly93 d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvYnVncy8+LgpGaW5kIHRoZSBHREIgbWFudWFsIGFu ZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNlcyBvbmxpbmUgYXQ6CiAgICA8aHR0cDov L3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9kb2N1bWVudGF0aW9uLz4uCgpGb3IgaGVscCwg dHlwZSAiaGVscCIuClR5cGUgImFwcm9wb3Mgd29yZCIgdG8gc2VhcmNoIGZvciBjb21tYW5k cyByZWxhdGVkIHRvICJ3b3JkIi4uLgpSZWFkaW5nIHN5bWJvbHMgZnJvbSB0bXBfaW5zdGFs bC91c3IvbG9jYWwvcGdzcWwvYmluL3Bvc3RncmVzLi4uCihnZGIpIER1bXAgb2YgYXNzZW1i bGVyIGNvZGUgZm9yIGZ1bmN0aW9uIHBnYWlvX2lvX3VwZGF0ZV9zdGF0ZToKMzQxCQlBc3Nl cnQoaW9oID49IHBnYWlvX2N0bC0+aW9faGFuZGxlcyAmJgogICAweDAwMDAwMDAwMDA0MzY0 OTAgPCs5MD46CWF1aXBjCWEwLDB4NGMzCiAgIDB4MDAwMDAwMDAwMDQzNjQ5NCA8Kzk0PjoJ bGQJYTEsLTYxNihhMCkgIyAweDhmOTIyOCA8cGdhaW9fY3RsPgogICAweDAwMDAwMDAwMDA0 MzY0OTggPCs5OD46CWxkCWEwLDQ4KGExKQogICAweDAwMDAwMDAwMDA0MzY0OWEgPCsxMDA+ OglibHR1CXMxLGEwLDB4NDM2NTUyIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrMjg0PgogICAw eDAwMDAwMDAwMDA0MzY0OWUgPCsxMDQ+Oglsd3UJYTEsNDAoYTEpCiAgIDB4MDAwMDAwMDAw MDQzNjRhMiA8KzEwOD46CWxpCWEyLDE0NAogICAweDAwMDAwMDAwMDA0MzY0YTYgPCsxMTI+ OgltdWwJYTEsYTEsYTIKICAgMHgwMDAwMDAwMDAwNDM2NGFhIDwrMTE2PjoJYWRkCWExLGEx LGEwCiAgIDB4MDAwMDAwMDAwMDQzNjRhYyA8KzExOD46CWJnZXUJczEsYTEsMHg0MzY1NTIg PHBnYWlvX2lvX3VwZGF0ZV9zdGF0ZSsyODQ+CiAgIDB4MDAwMDAwMDAwMDQzNjRiMCA8KzEy Mj46CWF1aXBjCWExLDB4NGMxCiAgIDB4MDAwMDAwMDAwMDQzNjRiNCA8KzEyNj46CWxkCXMz LDI4MChhMSkgIyAweDhmNzVjOAogICAweDAwMDAwMDAwMDA0MzY1NTIgPCsyODQ+OglhdWlw YwlhMCwweDI0MgogICAweDAwMDAwMDAwMDA0MzY1NTYgPCsyODg+OglhZGRpCWEwLGEwLDU0 OSAjIDB4Njc4Nzc3CiAgIDB4MDAwMDAwMDAwMDQzNjU1YSA8KzI5Mj46CWF1aXBjCWExLDB4 MjQyCiAgIDB4MDAwMDAwMDAwMDQzNjU1ZSA8KzI5Nj46CWFkZGkJYTEsYTEsMTYzICMgMHg2 Nzg1ZmQKICAgMHgwMDAwMDAwMDAwNDM2NTYyIDwrMzAwPjoJbGkJYTIsMzQyCiAgIDB4MDAw MDAwMDAwMDQzNjU2NiA8KzMwND46CWF1aXBjCXJhLDB4MTYwCiAgIDB4MDAwMDAwMDAwMDQz NjU2YSA8KzMwOD46CWphbHIJOTk0KHJhKSAjIDB4NTk2OTQ4IDxFeGNlcHRpb25hbENvbmRp dGlvbj4KCjM0MgkJCSAgIGlvaCA8IChwZ2Fpb19jdGwtPmlvX2hhbmRsZXMgKyBwZ2Fpb19j dGwtPmlvX2hhbmRsZV9jb3VudCkpOwozNDMJCXJldHVybiBpb2ggLSBwZ2Fpb19jdGwtPmlv X2hhbmRsZXM7CiAgIDB4MDAwMDAwMDAwMDQzNjRiOCA8KzEzMD46CXN1YglzMCxzMSxhMAog ICAweDAwMDAwMDAwMDA0MzY0YmMgPCsxMzQ+OglzcmFpCXMwLHMwLDB4NAoKMzQ0CX0KMzQ1 CQozNDYJLyoKMzQ3CSAqIFJldHVybiB0aGUgUHJvY051bWJlciBmb3IgdGhlIHByb2Nlc3Mg dGhhdCBjYW4gdXNlIGFuIElPIGhhbmRsZS4gVGhlCjM0OAkgKiBtYXBwaW5nIGZyb20gSU8g aGFuZGxlcyB0byBQR1BST0NzIGlzIHN0YXRpYywgdGhlcmVmb3JlIHRoaXMgZXZlbiB3b3Jr cwozNDkJICogd2hlbiB0aGUgY29ycmVzcG9uZGluZyBQR1BST0MgaXMgbm90IGluIHVzZS4K MzUwCSAqLwozNTEJUHJvY051bWJlcgozNTIJcGdhaW9faW9fZ2V0X293bmVyKFBnQWlvSGFu ZGxlICppb2gpCjM1Mwl7CjM1NAkJcmV0dXJuIGlvaC0+b3duZXJfcHJvY25vOwozNTUJfQoz NTYJCjM1NwkvKgozNTgJICogUmV0dXJuIGEgd2FpdCByZWZlcmVuY2UgZm9yIHRoZSBJTy4g T25seSB3YWl0IHJlZmVyZW5jZXMgY2FuIGJlIHVzZWQgdG8KMzU5CSAqIHdhaXQgZm9yIGFu IElPcyBjb21wbGV0aW9uLCBhcyBoYW5kbGVzIHRoZW1zZWx2ZXMgY2FuIGJlIHJldXNlZCBh ZnRlcgozNjAJICogY29tcGxldGlvbi4gIFNlZSBhbHNvIHRoZSBjb21tZW50IGFib3ZlIHBn YWlvX2lvX2FjcXVpcmUoKS4KMzYxCSAqLwozNjIJdm9pZAozNjMJcGdhaW9faW9fZ2V0X3dy ZWYoUGdBaW9IYW5kbGUgKmlvaCwgUGdBaW9XYWl0UmVmICppb3cpCjM2NAl7CjM2NQkJQXNz ZXJ0KGlvaC0+c3RhdGUgPT0gUEdBSU9fSFNfSEFOREVEX09VVCB8fAozNjYJCQkgICBpb2gt PnN0YXRlID09IFBHQUlPX0hTX0RFRklORUQgfHwKMzY3CQkJICAgaW9oLT5zdGF0ZSA9PSBQ R0FJT19IU19TVEFHRUQpOwozNjgJCUFzc2VydChpb2gtPmdlbmVyYXRpb24gIT0gMCk7CjM2 OQkKMzcwCQlpb3ctPmFpb19pbmRleCA9IGlvaCAtIHBnYWlvX2N0bC0+aW9faGFuZGxlczsK MzcxCQlpb3ctPmdlbmVyYXRpb25fdXBwZXIgPSAodWludDMyKSAoaW9oLT5nZW5lcmF0aW9u ID4+IDMyKTsKMzcyCQlpb3ctPmdlbmVyYXRpb25fbG93ZXIgPSAodWludDMyKSBpb2gtPmdl bmVyYXRpb247CjM3Mwl9CjM3NAkKMzc1CQozNzYJCjM3NwkvKiAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQozNzgJICogSW50ZXJuYWwgRnVuY3Rpb25zIHJlbGF0ZWQgdG8gUGdBaW9I YW5kbGUKMzc5CSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjM4MAkgKi8KMzgxCQoz ODIJc3RhdGljIGlubGluZSB2b2lkCjM4MwlwZ2Fpb19pb191cGRhdGVfc3RhdGUoUGdBaW9I YW5kbGUgKmlvaCwgUGdBaW9IYW5kbGVTdGF0ZSBuZXdfc3RhdGUpCjM4NAl7CiAgIDB4MDAw MDAwMDAwMDQzNjQzNiA8KzA+OglhZGRpCXNwLHNwLC00OAogICAweDAwMDAwMDAwMDA0MzY0 MzggPCsyPjoJc2QJcmEsNDAoc3ApCiAgIDB4MDAwMDAwMDAwMDQzNjQzYSA8KzQ+OglzZAlz MCwzMihzcCkKICAgMHgwMDAwMDAwMDAwNDM2NDNjIDwrNj46CXNkCXMxLDI0KHNwKQogICAw eDAwMDAwMDAwMDA0MzY0M2UgPCs4PjoJc2QJczIsMTYoc3ApCiAgIDB4MDAwMDAwMDAwMDQz NjQ0MCA8KzEwPjoJc2QJczMsOChzcCkKICAgMHgwMDAwMDAwMDAwNDM2NDQyIDwrMTI+Oglz ZAlzNCwwKHNwKQoKMzg1CQkvKgozODYJCSAqIEFsbCBjYWxsZXJzIG5lZWQgdG8gaGF2ZSBo ZWxkIGludGVycnVwdHMgaW4gc29tZSBmb3JtLCBvdGhlcndpc2UKMzg3CQkgKiBpbnRlcnJ1 cHQgcHJvY2Vzc2luZyBjb3VsZCB3YWl0IGZvciB0aGUgSU8gdG8gY29tcGxldGUsIHdoaWxl IGluIGFuCjM4OAkJICogaW50ZXJtZWRpYXJ5IHN0YXRlLgozODkJCSAqLwozOTAJCUFzc2Vy dCghSU5URVJSVVBUU19DQU5fQkVfUFJPQ0VTU0VEKCkpOwogICAweDAwMDAwMDAwMDA0MzY0 NDQgPCsxND46CWF1aXBjCWEyLDB4NGE2CiAgIDB4MDAwMDAwMDAwMDQzNjQ0OCA8KzE4PjoJ bGQJYTIsNTY0KGEyKSAjIDB4OGRjNjc4CiAgIDB4MDAwMDAwMDAwMDQzNjQ0YyA8KzIyPjoJ bHcJYTIsMChhMikKICAgMHgwMDAwMDAwMDAwNDM2NDRlIDwrMjQ+OgltdglzNCxhMQogICAw eDAwMDAwMDAwMDA0MzY0NTAgPCsyNj46CW12CXMxLGEwCiAgIDB4MDAwMDAwMDAwMDQzNjQ1 MiA8KzI4PjoJYm5leglhMiwweDQzNjQ2ZSA8cGdhaW9faW9fdXBkYXRlX3N0YXRlKzU2Pgog ICAweDAwMDAwMDAwMDA0MzY0NTQgPCszMD46CWF1aXBjCWEwLDB4NGE2CiAgIDB4MDAwMDAw MDAwMDQzNjQ1OCA8KzM0PjoJbGQJYTAsNTA4KGEwKSAjIDB4OGRjNjUwCiAgIDB4MDAwMDAw MDAwMDQzNjQ1YyA8KzM4PjoJbHcJYTAsMChhMCkKICAgMHgwMDAwMDAwMDAwNDM2NDVlIDwr NDA+OglibmV6CWEwLDB4NDM2NDZlIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrNTY+CiAgIDB4 MDAwMDAwMDAwMDQzNjQ2MCA8KzQyPjoJYXVpcGMJYTAsMHg0YTYKICAgMHgwMDAwMDAwMDAw NDM2NDY0IDwrNDY+OglsZAlhMCwtMTYxNihhMCkgIyAweDhkYmUxMAogICAweDAwMDAwMDAw MDA0MzY0NjggPCs1MD46CWx3CWEwLDAoYTApCiAgIDB4MDAwMDAwMDAwMDQzNjQ2YSA8KzUy PjoJYmVxeglhMCwweDQzNjU2ZSA8cGdhaW9faW9fdXBkYXRlX3N0YXRlKzMxMj4KICAgMHgw MDAwMDAwMDAwNDM2NTZlIDwrMzEyPjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAw NDM2NTcyIDwrMzE2PjoJYWRkaQlhMCxhMCwxNjcwICMgMHg2NzhiZjQKICAgMHgwMDAwMDAw MDAwNDM2NTc2IDwrMzIwPjoJYXVpcGMJYTEsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTdh IDwrMzI0PjoJYWRkaQlhMSxhMSwxMzUgIyAweDY3ODVmZAogICAweDAwMDAwMDAwMDA0MzY1 N2UgPCszMjg+OglsaQlhMiwzOTAKICAgMHgwMDAwMDAwMDAwNDM2NTgyIDwrMzMyPjoJYXVp cGMJcmEsMHgxNjAKICAgMHgwMDAwMDAwMDAwNDM2NTg2IDwrMzM2PjoJamFscgk5NjYocmEp ICMgMHg1OTY5NDggPEV4Y2VwdGlvbmFsQ29uZGl0aW9uPgoKMzkxCQozOTIJCXBnYWlvX2Rl YnVnX2lvKERFQlVHNSwgaW9oLAogICAweDAwMDAwMDAwMDA0MzY0NmUgPCs1Nj46CWxpCWEw LDEwCiAgIDB4MDAwMDAwMDAwMDQzNjQ3MCA8KzU4PjoJbGkJYTEsMAogICAweDAwMDAwMDAw MDA0MzY0NzIgPCs2MD46CWF1aXBjCXJhLDB4MTYxCiAgIDB4MDAwMDAwMDAwMDQzNjQ3NiA8 KzY0PjoJamFscgktMTIwMChyYSkgIyAweDU5NmZjMiA8ZXJyc3RhcnQ+CiAgIDB4MDAwMDAw MDAwMDQzNjQ3YSA8KzY4PjoJYmVxeglhMCwweDQzNjUzYSA8cGdhaW9faW9fdXBkYXRlX3N0 YXRlKzI2MD4KICAgMHgwMDAwMDAwMDAwNDM2NDdjIDwrNzA+OglsaQlhMCwxCiAgIDB4MDAw MDAwMDAwMDQzNjQ3ZSA8KzcyPjoJYXVpcGMJcmEsMHgxNjMKICAgMHgwMDAwMDAwMDAwNDM2 NDgyIDwrNzY+OglqYWxyCTEyNjQocmEpICMgMHg1OTk5NmUgPGVycmhpZGVzdG10PgogICAw eDAwMDAwMDAwMDA0MzY0ODYgPCs4MD46CWxpCWEwLDEKICAgMHgwMDAwMDAwMDAwNDM2NDg4 IDwrODI+OglhdWlwYwlyYSwweDE2MwogICAweDAwMDAwMDAwMDA0MzY0OGMgPCs4Nj46CWph bHIJMTM1NihyYSkgIyAweDU5OTlkNCA8ZXJyaGlkZWNvbnRleHQ+CiAgIDB4MDAwMDAwMDAw MDQzNjRiZSA8KzEzNj46CW12CWEwLHMxCiAgIDB4MDAwMDAwMDAwMDQzNjRjMCA8KzEzOD46 CWphbAkweDQzOGY5MCA8cGdhaW9faW9fZ2V0X29wX25hbWU+CiAgIDB4MDAwMDAwMDAwMDQz NjRjNCA8KzE0Mj46CW12CXMyLGEwCiAgIDB4MDAwMDAwMDAwMDQzNjRjNiA8KzE0ND46CW12 CWEwLHMxCiAgIDB4MDAwMDAwMDAwMDQzNjRjOCA8KzE0Nj46CWphbAkweDQzOTA3NiA8cGdh aW9faW9fZ2V0X3RhcmdldF9uYW1lPgogICAweDAwMDAwMDAwMDA0MzY0ZDIgPCsxNTY+Oglt dglhMyxhMAogICAweDAwMDAwMDAwMDA0MzY0ZTYgPCsxNzY+OgltdWx3CWExLHMwLHMzCiAg IDB4MDAwMDAwMDAwMDQzNjUwMiA8KzIwND46CW11bHcJYTEsczAsczMKICAgMHgwMDAwMDAw MDAwNDM2NTBjIDwrMjE0PjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTEw IDwrMjE4PjoJYWRkaQlhMCxhMCwxNzk5ICMgMHg2NzhjMTMKICAgMHgwMDAwMDAwMDAwNDM2 NTE0IDwrMjIyPjoJbXYJYTIsczIKICAgMHgwMDAwMDAwMDAwNDM2NTE2IDwrMjI0PjoJYXVp cGMJcmEsMHgxNjEKICAgMHgwMDAwMDAwMDAwNDM2NTFhIDwrMjI4PjoJamFscgktNTIocmEp ICMgMHg1OTc0ZTIgPGVycm1zZ19pbnRlcm5hbD4KICAgMHgwMDAwMDAwMDAwNDM2NTFlIDwr MjMyPjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTIyIDwrMjM2PjoJYWRk aQlhMCxhMCwyMjMgIyAweDY3ODVmZAogICAweDAwMDAwMDAwMDA0MzY1MjYgPCsyNDA+Oglh dWlwYwlhMSwweDI0MgogICAweDAwMDAwMDAwMDA0MzY1MmEgPCsyNDQ+OglhZGRpCWEyLGEx LDE4MzYgIyAweDY3OGM1MgogICAweDAwMDAwMDAwMDA0MzY1MmUgPCsyNDg+OglsaQlhMSwz OTQKICAgMHgwMDAwMDAwMDAwNDM2NTMyIDwrMjUyPjoJYXVpcGMJcmEsMHgxNjEKICAgMHgw MDAwMDAwMDAwNDM2NTM2IDwrMjU2PjoJamFscgktNjk0KHJhKSAjIDB4NTk3MjdjIDxlcnJm aW5pc2g+CgozOTMJCQkJCSAgICJ1cGRhdGluZyBzdGF0ZSB0byAlcyIsCjM5NAkJCQkJICAg cGdhaW9faW9fc3RhdGVfZ2V0X25hbWUobmV3X3N0YXRlKSk7CjM5NQkKMzk2CQkvKgozOTcJ CSAqIEVuc3VyZSB0aGUgY2hhbmdlcyBzaWduaWZpZWQgYnkgdGhlIG5ldyBzdGF0ZSBhcmUg dmlzaWJsZSBiZWZvcmUgdGhlCjM5OAkJICogbmV3IHN0YXRlIGJlY29tZXMgdmlzaWJsZS4K Mzk5CQkgKi8KNDAwCQlwZ193cml0ZV9iYXJyaWVyKCk7CiAgIDB4MDAwMDAwMDAwMDQzNjUz YSA8KzI2MD46CWZlbmNlCXJ3LHcKCjQwMQkKNDAyCQlpb2gtPnN0YXRlID0gbmV3X3N0YXRl OwogICAweDAwMDAwMDAwMDA0MzY1M2UgPCsyNjQ+OglzYglzNCwwKHMxKQogICAweDAwMDAw MDAwMDA0MzY1NDIgPCsyNjg+OglsZAlyYSw0MChzcCkKICAgMHgwMDAwMDAwMDAwNDM2NTQ0 IDwrMjcwPjoJbGQJczAsMzIoc3ApCiAgIDB4MDAwMDAwMDAwMDQzNjU0NiA8KzI3Mj46CWxk CXMxLDI0KHNwKQogICAweDAwMDAwMDAwMDA0MzY1NDggPCsyNzQ+OglsZAlzMiwxNihzcCkK ICAgMHgwMDAwMDAwMDAwNDM2NTRhIDwrMjc2PjoJbGQJczMsOChzcCkKICAgMHgwMDAwMDAw MDAwNDM2NTRjIDwrMjc4PjoJbGQJczQsMChzcCkKCjQwMwl9CiAgIDB4MDAwMDAwMDAwMDQz NjU0ZSA8KzI4MD46CWFkZGkJc3Asc3AsNDgKICAgMHgwMDAwMDAwMDAwNDM2NTUwIDwrMjgy PjoJcmV0Cgo0MDQJCjQwNQlzdGF0aWMgdm9pZAo0MDYJcGdhaW9faW9fcmVzb3duZXJfcmVn aXN0ZXIoUGdBaW9IYW5kbGUgKmlvaCkKNDA3CXsKNDA4CQlBc3NlcnQoIWlvaC0+cmVzb3du ZXIpOwo0MDkJCUFzc2VydChDdXJyZW50UmVzb3VyY2VPd25lcik7CjQxMAkKNDExCQlSZXNv dXJjZU93bmVyUmVtZW1iZXJBaW9IYW5kbGUoQ3VycmVudFJlc291cmNlT3duZXIsICZpb2gt PnJlc293bmVyX25vZGUpOwo0MTIJCWlvaC0+cmVzb3duZXIgPSBDdXJyZW50UmVzb3VyY2VP d25lcjsKNDEzCX0KNDE0CQo0MTUJLyoKNDE2CSAqIFN0YWdlIElPIGZvciBleGVjdXRpb24g YW5kLCBpZiBhcHByb3ByaWF0ZSwgc3VibWl0IGl0IGltbWVkaWF0ZWx5Lgo0MTcJICoKNDE4 CSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHBnYWlvX2lvX3N0YXJ0XyooKS4KNDE5 CSAqLwo0MjAJdm9pZAo0MjEJcGdhaW9faW9fc3RhZ2UoUGdBaW9IYW5kbGUgKmlvaCwgUGdB aW9PcCBvcCkKNDIyCXsKNDIzCQlib29sCQluZWVkc19zeW5jaHJvbm91czsKNDI0CQo0MjUJ CUFzc2VydChpb2gtPnN0YXRlID09IFBHQUlPX0hTX0hBTkRFRF9PVVQpOwo0MjYJCUFzc2Vy dChwZ2Fpb19teV9iYWNrZW5kLT5oYW5kZWRfb3V0X2lvID09IGlvaCk7CjQyNwkJQXNzZXJ0 KHBnYWlvX2lvX2hhc190YXJnZXQoaW9oKSk7CjQyOAkKNDI5CQkvKgo0MzAJCSAqIE90aGVy d2lzZSBhbiBpbnRlcnJ1cHQsIGluIHRoZSBtaWRkbGUgb2Ygc3RhZ2luZyBhbmQgcG9zc2li bHkgZXhlY3V0aW5nCjQzMQkJICogdGhlIElPLCBjb3VsZCBlbmQgdXAgdHJ5aW5nIHRvIHdh aXQgZm9yIHRoZSBJTywgbGVhZGluZyB0byBzdGF0ZQo0MzIJCSAqIGNvbmZ1c2lvbi4KNDMz CQkgKi8KNDM0CQlIT0xEX0lOVEVSUlVQVFMoKTsKNDM1CQo0MzYJCWlvaC0+b3AgPSBvcDsK NDM3CQlpb2gtPnJlc3VsdCA9IDA7CjQzOAkKNDM5CQlwZ2Fpb19pb191cGRhdGVfc3RhdGUo aW9oLCBQR0FJT19IU19ERUZJTkVEKTsKNDQwCQo0NDEJCS8qIGFsbG93IGEgbmV3IElPIHRv IGJlIHN0YWdlZCAqLwo0NDIJCXBnYWlvX215X2JhY2tlbmQtPmhhbmRlZF9vdXRfaW8gPSBO VUxMOwo0NDMJCjQ0NAkJcGdhaW9faW9fY2FsbF9zdGFnZShpb2gpOwo0NDUJCjQ0NgkJcGdh aW9faW9fdXBkYXRlX3N0YXRlKGlvaCwgUEdBSU9fSFNfU1RBR0VEKTsKNDQ3CQo0NDgJCS8q CjQ0OQkJICogU3luY2hyb25vdXMgZXhlY3V0aW9uIGhhcyB0byBiZSBleGVjdXRlZCwgd2Vs bCwgc3luY2hyb25vdXNseSwgc28gY2hlY2sKNDUwCQkgKiB0aGF0IGZpcnN0Lgo0NTEJCSAq Lwo0NTIJCW5lZWRzX3N5bmNocm9ub3VzID0gcGdhaW9faW9fbmVlZHNfc3luY2hyb25vdXNf ZXhlY3V0aW9uKGlvaCk7CjQ1MwkKNDU0CQlwZ2Fpb19kZWJ1Z19pbyhERUJVRzMsIGlvaCwK NDU1CQkJCQkgICAic3RhZ2VkIChzeW5jaHJvbm91czogJWQsIGluX2JhdGNoOiAlZCkiLAo0 NTYJCQkJCSAgIG5lZWRzX3N5bmNocm9ub3VzLCBwZ2Fpb19teV9iYWNrZW5kLT5pbl9iYXRj aG1vZGUpOwo0NTcJCjQ1OAkJaWYgKCFuZWVkc19zeW5jaHJvbm91cykKNDU5CQl7CjQ2MAkJ CXBnYWlvX215X2JhY2tlbmQtPnN0YWdlZF9pb3NbcGdhaW9fbXlfYmFja2VuZC0+bnVtX3N0 YWdlZF9pb3MrK10gPSBpb2g7CjQ2MQkJCUFzc2VydChwZ2Fpb19teV9iYWNrZW5kLT5udW1f c3RhZ2VkX2lvcyA8PSBQR0FJT19TVUJNSVRfQkFUQ0hfU0laRSk7CjQ2MgkKNDYzCQkJLyoK NDY0CQkJICogVW5sZXNzIGNvZGUgZXhwbGljaXRseSBvcHRlZCBpbnRvIGJhdGNoaW5nIElP cywgc3VibWl0IHRoZSBJTwo0NjUJCQkgKiBpbW1lZGlhdGVseS4KNDY2CQkJICovCjQ2NwkJ CWlmICghcGdhaW9fbXlfYmFja2VuZC0+aW5fYmF0Y2htb2RlKQo0NjgJCQkJcGdhaW9fc3Vi bWl0X3N0YWdlZCgpOwo0NjkJCX0KNDcwCQllbHNlCjQ3MQkJewo0NzIJCQlwZ2Fpb19pb19w cmVwYXJlX3N1Ym1pdChpb2gpOwo0NzMJCQlwZ2Fpb19pb19wZXJmb3JtX3N5bmNocm9ub3Vz bHkoaW9oKTsKNDc0CQl9CjQ3NQkKNDc2CQlSRVNVTUVfSU5URVJSVVBUUygpOwo0NzcJfQo0 NzgJCjQ3OQlib29sCjQ4MAlwZ2Fpb19pb19uZWVkc19zeW5jaHJvbm91c19leGVjdXRpb24o UGdBaW9IYW5kbGUgKmlvaCkKNDgxCXsKNDgyCQkvKgo0ODMJCSAqIElmIHRoZSBjYWxsZXIg c2FpZCB0byBleGVjdXRlIHRoZSBJTyBzeW5jaHJvbm91c2x5LCBkbyBzby4KNDg0CQkgKgo0 ODUJCSAqIFhYWDogV2UgY291bGQgb3B0aW1pemUgdGhlIGxvZ2ljIHdoZW4gdG8gZXhlY3V0 ZSBzeW5jaHJvbm91c2x5IGJ5IGZpcnN0CjQ4NgkJICogY2hlY2tpbmcgaWYgdGhlcmUgYXJl IG90aGVyIElPcyBpbiBmbGlnaHQgYW5kIG9ubHkgc3luY2hyb25vdXNseQo0ODcJCSAqIGV4 ZWN1dGluZyBpZiBub3QuIFVuY2xlYXIgd2hldGhlciB0aGF0J2xsIGJlIHN1ZmZpY2llbnRs eSBjb21tb24gdG8gYmUKNDg4CQkgKiB3b3J0aCB3b3JyeWluZyBhYm91dC4KNDg5CQkgKi8K NDkwCQlpZiAoaW9oLT5mbGFncyAmIFBHQUlPX0hGX1NZTkNIUk9OT1VTKQo0OTEJCQlyZXR1 cm4gdHJ1ZTsKNDkyCQo0OTMJCS8qIENoZWNrIGlmIHRoZSBJTyBtZXRob2QgcmVxdWlyZXMg c3luY2hyb25vdXMgZXhlY3V0aW9uIG9mIElPICovCjQ5NAkJaWYgKHBnYWlvX21ldGhvZF9v cHMtPm5lZWRzX3N5bmNocm9ub3VzX2V4ZWN1dGlvbikKNDk1CQkJcmV0dXJuIHBnYWlvX21l dGhvZF9vcHMtPm5lZWRzX3N5bmNocm9ub3VzX2V4ZWN1dGlvbihpb2gpOwo0OTYJCjQ5NwkJ cmV0dXJuIGZhbHNlOwo0OTgJfQo0OTkJCjUwMAkvKgo1MDEJICogSGFuZGxlIElPIGJlaW5n IHByb2Nlc3NlZCBieSBJTyBtZXRob2QuCjUwMgkgKgo1MDMJICogU2hvdWxkIGJlIGNhbGxl ZCBieSBJTyBtZXRob2RzIC8gc3luY2hyb25vdXMgSU8gZXhlY3V0aW9uLCBqdXN0IGJlZm9y ZSB0aGUKNTA0CSAqIElPIGlzIHBlcmZvcm1lZC4KNTA1CSAqLwo1MDYJdm9pZAo1MDcJcGdh aW9faW9fcHJlcGFyZV9zdWJtaXQoUGdBaW9IYW5kbGUgKmlvaCkKNTA4CXsKNTA5CQlwZ2Fp b19pb191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19TVUJNSVRURUQpOwo1MTAJCjUxMQkJ ZGNsaXN0X3B1c2hfdGFpbCgmcGdhaW9fbXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lvcywgJmlv aC0+bm9kZSk7CjUxMgl9CjUxMwkKNTE0CS8qCjUxNQkgKiBIYW5kbGUgSU8gZ2V0dGluZyBj b21wbGV0ZWQgYnkgYSBtZXRob2QuCjUxNgkgKgo1MTcJICogU2hvdWxkIGJlIGNhbGxlZCBi eSBJTyBtZXRob2RzIC8gc3luY2hyb25vdXMgSU8gZXhlY3V0aW9uLCBqdXN0IGFmdGVyIHRo ZQo1MTgJICogSU8gaGFzIGJlZW4gcGVyZm9ybWVkLgo1MTkJICoKNTIwCSAqIEV4cGVjdHMg dG8gYmUgY2FsbGVkIGluIGEgY3JpdGljYWwgc2VjdGlvbi4gV2UgZXhwZWN0IElPcyB0byBi ZSB1c2FibGUgZm9yCjUyMQkgKiBXQUwgZXRjLCB3aGljaCByZXF1aXJlcyBiZWluZyBhYmxl IHRvIGV4ZWN1dGUgY29tcGxldGlvbiBjYWxsYmFja3MgaW4gYQo1MjIJICogY3JpdGljYWwg c2VjdGlvbi4KNTIzCSAqLwo1MjQJdm9pZAo1MjUJcGdhaW9faW9fcHJvY2Vzc19jb21wbGV0 aW9uKFBnQWlvSGFuZGxlICppb2gsIGludCByZXN1bHQpCjUyNgl7CjUyNwkJQXNzZXJ0KGlv aC0+c3RhdGUgPT0gUEdBSU9fSFNfU1VCTUlUVEVEKTsKNTI4CQo1MjkJCUFzc2VydChDcml0 U2VjdGlvbkNvdW50ID4gMCk7CjUzMAkKNTMxCQlpb2gtPnJlc3VsdCA9IHJlc3VsdDsKNTMy CQo1MzMJCXBnYWlvX2lvX3VwZGF0ZV9zdGF0ZShpb2gsIFBHQUlPX0hTX0NPTVBMRVRFRF9J Tyk7CjUzNAkKNTM1CQlJTkpFQ1RJT05fUE9JTlQoImFpby1wcm9jZXNzLWNvbXBsZXRpb24t YmVmb3JlLXNoYXJlZCIsIGlvaCk7CjUzNgkKNTM3CQlwZ2Fpb19pb19jYWxsX2NvbXBsZXRl X3NoYXJlZChpb2gpOwo1MzgJCjUzOQkJcGdhaW9faW9fdXBkYXRlX3N0YXRlKGlvaCwgUEdB SU9fSFNfQ09NUExFVEVEX1NIQVJFRCk7CjU0MAkKNTQxCQkvKiBjb25kaXRpb24gdmFyaWFi bGUgYnJvYWRjYXN0IGVuc3VyZXMgc3RhdGUgaXMgdmlzaWJsZSBiZWZvcmUgd2FrZXVwICov CjU0MgkJQ29uZGl0aW9uVmFyaWFibGVCcm9hZGNhc3QoJmlvaC0+Y3YpOwo1NDMJCjU0NAkJ LyogY29udGFpbnMgY2FsbCB0byBwZ2Fpb19pb19jYWxsX2NvbXBsZXRlX2xvY2FsKCkgKi8K NTQ1CQlpZiAoaW9oLT5vd25lcl9wcm9jbm8gPT0gTXlQcm9jTnVtYmVyKQo1NDYJCQlwZ2Fp b19pb19yZWNsYWltKGlvaCk7CjU0Nwl9CjU0OAkKNTQ5CS8qCjU1MAkgKiBIYXMgdGhlIElP IGNvbXBsZXRlZCBhbmQgdGh1cyB0aGUgSU8gaGFuZGxlIGJlZW4gcmV1c2VkPwo1NTEJICoK NTUyCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gd2FpdGluZyBmb3IgSU8gY29tcGxldGlvbiBh dCBhIGxvdyBsZXZlbCAoZS5nLiBpbiBhbiBJTwo1NTMJICogbWV0aG9kJ3MgLT53YWl0X29u ZSgpIGNhbGxiYWNrKS4KNTU0CSAqLwo1NTUJYm9vbAo1NTYJcGdhaW9faW9fd2FzX3JlY3lj bGVkKFBnQWlvSGFuZGxlICppb2gsIHVpbnQ2NCByZWZfZ2VuZXJhdGlvbiwgUGdBaW9IYW5k bGVTdGF0ZSAqc3RhdGUpCjU1Nwl7CjU1OAkJKnN0YXRlID0gaW9oLT5zdGF0ZTsKNTU5CQo1 NjAJCS8qCjU2MQkJICogRW5zdXJlIHRoYXQgd2UgZG9uJ3Qgc2VlIGFuIGVhcmxpZXIgc3Rh dGUgb2YgdGhlIGhhbmRsZSB0aGFuIGlvaC0+c3RhdGUKNTYyCQkgKiBkdWUgdG8gY29tcGls ZXIgb3IgQ1BVIHJlb3JkZXJpbmcuIFRoaXMgcHJvdGVjdHMgYm90aCAtPmdlbmVyYXRpb24g YXMKNTYzCQkgKiBkaXJlY3RseSB1c2VkIGhlcmUsIGFuZCBvdGhlciBmaWVsZHMgaW4gdGhl IGhhbmRsZSBhY2Nlc3NlZCBpbiB0aGUKNTY0CQkgKiBjYWxsZXIgaWYgdGhlIGhhbmRsZSB3 YXMgbm90IHJldXNlZC4KNTY1CQkgKi8KNTY2CQlwZ19yZWFkX2JhcnJpZXIoKTsKNTY3CQo1 NjgJCXJldHVybiBpb2gtPmdlbmVyYXRpb24gIT0gcmVmX2dlbmVyYXRpb247CjU2OQl9CjU3 MAkKNTcxCS8qCjU3MgkgKiBXYWl0IGZvciBJTyB0byBjb21wbGV0ZS4gRXh0ZXJuYWwgY29k ZSBzaG91bGQgbmV2ZXIgdXNlIHRoaXMsIG91dHNpZGUgb2YKNTczCSAqIHRoZSBBSU8gc3Vi c3lzdGVtIHdhaXRzIGFyZSBvbmx5IGFsbG93ZWQgdmlhIHBnYWlvX3dyZWZfd2FpdCgpLgo1 NzQJICovCjU3NQlzdGF0aWMgdm9pZAo1NzYJcGdhaW9faW9fd2FpdChQZ0Fpb0hhbmRsZSAq aW9oLCB1aW50NjQgcmVmX2dlbmVyYXRpb24pCjU3Nwl7CjU3OAkJUGdBaW9IYW5kbGVTdGF0 ZSBzdGF0ZTsKNTc5CQlib29sCQlhbV9vd25lcjsKNTgwCQo1ODEJCWFtX293bmVyID0gaW9o LT5vd25lcl9wcm9jbm8gPT0gTXlQcm9jTnVtYmVyOwo1ODIJCjU4MwkJaWYgKHBnYWlvX2lv X3dhc19yZWN5Y2xlZChpb2gsIHJlZl9nZW5lcmF0aW9uLCAmc3RhdGUpKQo1ODQJCQlyZXR1 cm47CjU4NQkKNTg2CQlpZiAoYW1fb3duZXIpCjU4NwkJewo1ODgJCQlpZiAoc3RhdGUgIT0g UEdBSU9fSFNfU1VCTUlUVEVECjU4OQkJCQkmJiBzdGF0ZSAhPSBQR0FJT19IU19DT01QTEVU RURfSU8KNTkwCQkJCSYmIHN0YXRlICE9IFBHQUlPX0hTX0NPTVBMRVRFRF9TSEFSRUQKNTkx CQkJCSYmIHN0YXRlICE9IFBHQUlPX0hTX0NPTVBMRVRFRF9MT0NBTCkKNTkyCQkJewo1OTMJ CQkJZWxvZyhQQU5JQywgIndhaXRpbmcgZm9yIG93biBJTyAlZCBpbiB3cm9uZyBzdGF0ZTog JXMiLAo1OTQJCQkJCSBwZ2Fpb19pb19nZXRfaWQoaW9oKSwgcGdhaW9faW9fZ2V0X3N0YXRl X25hbWUoaW9oKSk7CjU5NQkJCX0KNTk2CQl9CjU5NwkKNTk4CQl3aGlsZSAodHJ1ZSkKNTk5 CQl7CjYwMAkJCWlmIChwZ2Fpb19pb193YXNfcmVjeWNsZWQoaW9oLCByZWZfZ2VuZXJhdGlv biwgJnN0YXRlKSkKNjAxCQkJCXJldHVybjsKNjAyCQo2MDMJCQlzd2l0Y2ggKChQZ0Fpb0hh bmRsZVN0YXRlKSBzdGF0ZSkKNjA0CQkJewo2MDUJCQkJY2FzZSBQR0FJT19IU19JRExFOgo2 MDYJCQkJY2FzZSBQR0FJT19IU19IQU5ERURfT1VUOgo2MDcJCQkJCWVsb2coRVJST1IsICJJ TyBpbiB3cm9uZyBzdGF0ZTogJWQiLCBzdGF0ZSk7CjYwOAkJCQkJYnJlYWs7CjYwOQkKNjEw CQkJCWNhc2UgUEdBSU9fSFNfU1VCTUlUVEVEOgo2MTEJCjYxMgkJCQkJLyoKNjEzCQkJCQkg KiBJZiB3ZSBuZWVkIHRvIHdhaXQgdmlhIHRoZSBJTyBtZXRob2QsIGRvIHNvIG5vdy4gRG9u J3QKNjE0CQkJCQkgKiBjaGVjayB2aWEgdGhlIElPIG1ldGhvZCBpZiB0aGUgaXNzdWluZyBi YWNrZW5kIGlzIGV4ZWN1dGluZwo2MTUJCQkJCSAqIHRoZSBJTyBzeW5jaHJvbm91c2x5Lgo2 MTYJCQkJCSAqLwo2MTcJCQkJCWlmIChwZ2Fpb19tZXRob2Rfb3BzLT53YWl0X29uZSAmJiAh KGlvaC0+ZmxhZ3MgJiBQR0FJT19IRl9TWU5DSFJPTk9VUykpCjYxOAkJCQkJewo2MTkJCQkJ CQlwZ2Fpb19tZXRob2Rfb3BzLT53YWl0X29uZShpb2gsIHJlZl9nZW5lcmF0aW9uKTsKNjIw CQkJCQkJY29udGludWU7CjYyMQkJCQkJfQo2MjIJCQkJCS8qIGZhbGx0aHJvdWdoICovCjYy MwkKNjI0CQkJCQkvKiB3YWl0aW5nIGZvciBvd25lciB0byBzdWJtaXQgKi8KNjI1CQkJCWNh c2UgUEdBSU9fSFNfREVGSU5FRDoKNjI2CQkJCWNhc2UgUEdBSU9fSFNfU1RBR0VEOgo2MjcJ CQkJCS8qIHdhaXRpbmcgZm9yIHJlYXBlciB0byBjb21wbGV0ZSAqLwo2MjgJCQkJCS8qIGZh bGx0aHJvdWdoICovCjYyOQkJCQljYXNlIFBHQUlPX0hTX0NPTVBMRVRFRF9JTzoKNjMwCQkJ CQkvKiBzaG91bGRuJ3QgYmUgYWJsZSB0byBoaXQgdGhpcyBvdGhlcndpc2UgKi8KNjMxCQkJ CQlBc3NlcnQoSXNVbmRlclBvc3RtYXN0ZXIpOwo2MzIJCQkJCS8qIGVuc3VyZSB3ZSdyZSBn b2luZyB0byBnZXQgd29rZW4gdXAgKi8KNjMzCQkJCQlDb25kaXRpb25WYXJpYWJsZVByZXBh cmVUb1NsZWVwKCZpb2gtPmN2KTsKNjM0CQo2MzUJCQkJCXdoaWxlICghcGdhaW9faW9fd2Fz X3JlY3ljbGVkKGlvaCwgcmVmX2dlbmVyYXRpb24sICZzdGF0ZSkpCjYzNgkJCQkJewo2MzcJ CQkJCQlpZiAoc3RhdGUgPT0gUEdBSU9fSFNfQ09NUExFVEVEX1NIQVJFRCB8fAo2MzgJCQkJ CQkJc3RhdGUgPT0gUEdBSU9fSFNfQ09NUExFVEVEX0xPQ0FMKQo2MzkJCQkJCQkJYnJlYWs7 CjY0MAkJCQkJCUNvbmRpdGlvblZhcmlhYmxlU2xlZXAoJmlvaC0+Y3YsIFdBSVRfRVZFTlRf QUlPX0lPX0NPTVBMRVRJT04pOwo2NDEJCQkJCX0KNjQyCQo2NDMJCQkJCUNvbmRpdGlvblZh cmlhYmxlQ2FuY2VsU2xlZXAoKTsKNjQ0CQkJCQlicmVhazsKNjQ1CQo2NDYJCQkJY2FzZSBQ R0FJT19IU19DT01QTEVURURfU0hBUkVEOgo2NDcJCQkJY2FzZSBQR0FJT19IU19DT01QTEVU RURfTE9DQUw6CjY0OAkKNjQ5CQkJCQkvKgo2NTAJCQkJCSAqIE5vdGUgdGhhdCBubyBpbnRl cnJ1cHRzIGFyZSBwcm9jZXNzZWQgYmV0d2Vlbgo2NTEJCQkJCSAqIHBnYWlvX2lvX3dhc19y ZWN5Y2xlZCgpIGFuZCB0aGlzIGNoZWNrIC0gdGhhdCdzIGltcG9ydGFudAo2NTIJCQkJCSAq IGFzIG90aGVyd2lzZSBhbiBpbnRlcnJ1cHQgY291bGQgaGF2ZSBhbHJlYWR5IHJlY2xhaW1l ZCB0aGUKNjUzCQkJCQkgKiBoYW5kbGUuCjY1NAkJCQkJICovCjY1NQkJCQkJaWYgKGFtX293 bmVyKQo2NTYJCQkJCQlwZ2Fpb19pb19yZWNsYWltKGlvaCk7CjY1NwkJCQkJcmV0dXJuOwo2 NTgJCQl9CjY1OQkJfQo2NjAJfQo2NjEJCjY2MgkvKgo2NjMJICogTWFrZSBJTyBoYW5kbGUg cmVhZHkgdG8gYmUgcmV1c2VkIGFmdGVyIElPIGhhcyBjb21wbGV0ZWQgb3IgYWZ0ZXIgdGhl CjY2NAkgKiBoYW5kbGUgaGFzIGJlZW4gcmVsZWFzZWQgd2l0aG91dCBiZWluZyB1c2VkLgo2 NjUJICoKNjY2CSAqIE5vdGUgdGhhdCBjYWxsZXJzIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91 dCBvbmx5IGNhbGxpbmcgdGhpcyBpbiB0aGUgcmlnaHQKNjY3CSAqIHN0YXRlIGFuZCB0aGF0 IG5vIGludGVycnVwdHMgY2FuIGJlIHByb2Nlc3NlZCBiZXR3ZWVuIHRoZSBzdGF0ZSBjaGVj ayBhbmQKNjY4CSAqIHRoZSBjYWxsIHRvIHBnYWlvX2lvX3JlY2xhaW0oKS4gT3RoZXJ3aXNl IGludGVycnVwdCBwcm9jZXNzaW5nIGNvdWxkCjY2OQkgKiBhbHJlYWR5IGhhdmUgcmVjbGFp bWVkIHRoZSBoYW5kbGUuCjY3MAkgKi8KNjcxCXN0YXRpYyB2b2lkCjY3MglwZ2Fpb19pb19y ZWNsYWltKFBnQWlvSGFuZGxlICppb2gpCjY3Mwl7CjY3NAkJLyogVGhpcyBpcyBvbmx5IG9r IGlmIGl0J3Mgb3VyIElPICovCjY3NQkJQXNzZXJ0KGlvaC0+b3duZXJfcHJvY25vID09IE15 UHJvY051bWJlcik7CjY3NgkJQXNzZXJ0KGlvaC0+c3RhdGUgIT0gUEdBSU9fSFNfSURMRSk7 CjY3NwkKNjc4CQkvKiBzZWUgY29tbWVudCBpbiBmdW5jdGlvbiBoZWFkZXIgKi8KNjc5CQlI T0xEX0lOVEVSUlVQVFMoKTsKNjgwCQo2ODEJCS8qCjY4MgkJICogSXQncyBhIGJpdCB1Z2x5 LCBidXQgcmlnaHQgbm93IHRoZSBlYXNpZXN0IHBsYWNlIHRvIHB1dCB0aGUgZXhlY3V0aW9u CjY4MwkJICogb2YgbG9jYWwgY29tcGxldGlvbiBjYWxsYmFja3MgaXMgdGhpcyBmdW5jdGlv biwgYXMgd2UgbmVlZCB0byBleGVjdXRlCjY4NAkJICogbG9jYWwgY2FsbGJhY2tzIGp1c3Qg YmVmb3JlIHJlY2xhaW1pbmcgYXQgbXVsdGlwbGUgY2FsbHNpdGVzLgo2ODUJCSAqLwo2ODYJ CWlmIChpb2gtPnN0YXRlID09IFBHQUlPX0hTX0NPTVBMRVRFRF9TSEFSRUQpCjY4NwkJewo2 ODgJCQlQZ0Fpb1Jlc3VsdCBsb2NhbF9yZXN1bHQ7CjY4OQkKNjkwCQkJbG9jYWxfcmVzdWx0 ID0gcGdhaW9faW9fY2FsbF9jb21wbGV0ZV9sb2NhbChpb2gpOwo2OTEJCQlwZ2Fpb19pb191 cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19DT01QTEVURURfTE9DQUwpOwo2OTIJCjY5MwkJ CWlmIChpb2gtPnJlcG9ydF9yZXR1cm4pCjY5NAkJCXsKNjk1CQkJCWlvaC0+cmVwb3J0X3Jl dHVybi0+cmVzdWx0ID0gbG9jYWxfcmVzdWx0Owo2OTYJCQkJaW9oLT5yZXBvcnRfcmV0dXJu LT50YXJnZXRfZGF0YSA9IGlvaC0+dGFyZ2V0X2RhdGE7CjY5NwkJCX0KNjk4CQl9CjY5OQkK NzAwCQlwZ2Fpb19kZWJ1Z19pbyhERUJVRzQsIGlvaCwKNzAxCQkJCQkgICAicmVjbGFpbWlu ZzogZGlzdGlsbGVkX3Jlc3VsdDogKHN0YXR1cyAlcywgaWQgJXUsIGVycm9yX2RhdGEgJWQp LCByYXdfcmVzdWx0OiAlZCIsCjcwMgkJCQkJICAgcGdhaW9fcmVzdWx0X3N0YXR1c19zdHJp bmcoaW9oLT5kaXN0aWxsZWRfcmVzdWx0LnN0YXR1cyksCjcwMwkJCQkJICAgaW9oLT5kaXN0 aWxsZWRfcmVzdWx0LmlkLAo3MDQJCQkJCSAgIGlvaC0+ZGlzdGlsbGVkX3Jlc3VsdC5lcnJv cl9kYXRhLAo3MDUJCQkJCSAgIGlvaC0+cmVzdWx0KTsKNzA2CQo3MDcJCS8qIGlmIHRoZSBJ TyBoYXMgYmVlbiBkZWZpbmVkLCBpdCdzIG9uIHRoZSBpbi1mbGlnaHQgbGlzdCwgcmVtb3Zl ICovCjcwOAkJaWYgKGlvaC0+c3RhdGUgIT0gUEdBSU9fSFNfSEFOREVEX09VVCkKNzA5CQkJ ZGNsaXN0X2RlbGV0ZV9mcm9tKCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zLCAm aW9oLT5ub2RlKTsKNzEwCQo3MTEJCWlmIChpb2gtPnJlc293bmVyKQo3MTIJCXsKNzEzCQkJ UmVzb3VyY2VPd25lckZvcmdldEFpb0hhbmRsZShpb2gtPnJlc293bmVyLCAmaW9oLT5yZXNv d25lcl9ub2RlKTsKNzE0CQkJaW9oLT5yZXNvd25lciA9IE5VTEw7CjcxNQkJfQo3MTYJCjcx NwkJQXNzZXJ0KCFpb2gtPnJlc293bmVyKTsKNzE4CQo3MTkJCS8qCjcyMAkJICogVXBkYXRl IGdlbmVyYXRpb24gJiBzdGF0ZSBmaXJzdCwgYmVmb3JlIHJlc2V0dGluZyB0aGUgSU8ncyBm aWVsZHMsCjcyMQkJICogb3RoZXJ3aXNlIGEgY29uY3VycmVudCAidmlld2VyIiBjb3VsZCB0 aGluayB0aGUgZmllbGRzIGFyZSB2YWxpZCwgZXZlbgo3MjIJCSAqIHRob3VnaCB0aGV5IGFy ZSBiZWluZyByZXNldC4gIEluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBmaXJzdCwgc28gdGhh dAo3MjMJCSAqIHdlIGNhbiBhc3NlcnQgZWxzZXdoZXJlIHRoYXQgd2UgbmV2ZXIgd2FpdCBm b3IgYW4gSURMRSBJTy4gIFdoaWxlIGl0J3MKNzI0CQkgKiBhIGJpdCB3ZWlyZCBmb3IgdGhl IHN0YXRlIHRvIGdvIGJhY2t3YXJkcyBmb3IgYSBnZW5lcmF0aW9uLCBpdCdzIE9LCjcyNQkJ ICogaGVyZSwgYXMgdGhlcmUgY2Fubm90IGJlIHJlZmVyZW5jZXMgdG8gdGhlICJyZWJvcm4i IElPIHlldC4gIENhbid0CjcyNgkJICogdXBkYXRlIGJvdGggYXQgb25jZSwgc28gc29tZXRo aW5nIGhhcyB0byBnaXZlLgo3MjcJCSAqLwo3MjgJCWlvaC0+Z2VuZXJhdGlvbisrOwo3MjkJ CXBnYWlvX2lvX3VwZGF0ZV9zdGF0ZShpb2gsIFBHQUlPX0hTX0lETEUpOwo3MzAJCjczMQkJ LyogZW5zdXJlIHRoZSBzdGF0ZSB1cGRhdGUgaXMgdmlzaWJsZSBiZWZvcmUgd2UgcmVzZXQg ZmllbGRzICovCjczMgkJcGdfd3JpdGVfYmFycmllcigpOwo3MzMJCjczNAkJaW9oLT5vcCA9 IFBHQUlPX09QX0lOVkFMSUQ7CjczNQkJaW9oLT50YXJnZXQgPSBQR0FJT19USURfSU5WQUxJ RDsKNzM2CQlpb2gtPmZsYWdzID0gMDsKNzM3CQlpb2gtPm51bV9jYWxsYmFja3MgPSAwOwo3 MzgJCWlvaC0+aGFuZGxlX2RhdGFfbGVuID0gMDsKNzM5CQlpb2gtPnJlcG9ydF9yZXR1cm4g PSBOVUxMOwo3NDAJCWlvaC0+cmVzdWx0ID0gMDsKNzQxCQlpb2gtPmRpc3RpbGxlZF9yZXN1 bHQuc3RhdHVzID0gUEdBSU9fUlNfVU5LTk9XTjsKNzQyCQo3NDMJCS8qCjc0NAkJICogV2Ug cHVzaCB0aGUgSU8gdG8gdGhlIGhlYWQgb2YgdGhlIGlkbGUgSU8gbGlzdCwgdGhhdCBzZWVt cyBtb3JlIGNhY2hlCjc0NQkJICogZWZmaWNpZW50IGluIGNhc2VzIHdoZXJlIG9ubHkgYSBm ZXcgSU9zIGFyZSB1c2VkLgo3NDYJCSAqLwo3NDcJCWRjbGlzdF9wdXNoX2hlYWQoJnBnYWlv X215X2JhY2tlbmQtPmlkbGVfaW9zLCAmaW9oLT5ub2RlKTsKNzQ4CQo3NDkJCVJFU1VNRV9J TlRFUlJVUFRTKCk7Cjc1MAl9Cjc1MQkKNzUyCS8qCjc1MwkgKiBXYWl0IGZvciBhbiBJTyBo YW5kbGUgdG8gYmVjb21lIHVzYWJsZS4KNzU0CSAqCjc1NQkgKiBUaGlzIG9ubHkgcmVhbGx5 IGlzIHVzZWZ1bCBmb3IgcGdhaW9faW9fYWNxdWlyZSgpLgo3NTYJICovCjc1NwlzdGF0aWMg dm9pZAo3NTgJcGdhaW9faW9fd2FpdF9mb3JfZnJlZSh2b2lkKQo3NTkJewo3NjAJCWludAkJ CXJlY2xhaW1lZCA9IDA7Cjc2MQkKNzYyCQlwZ2Fpb19kZWJ1ZyhERUJVRzIsICJ3YWl0aW5n IGZvciBmcmVlIElPIHdpdGggJWQgcGVuZGluZywgJXUgaW4tZmxpZ2h0LCAldSBpZGxlIElP cyIsCjc2MwkJCQkJcGdhaW9fbXlfYmFja2VuZC0+bnVtX3N0YWdlZF9pb3MsCjc2NAkJCQkJ ZGNsaXN0X2NvdW50KCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zKSwKNzY1CQkJ CQlkY2xpc3RfY291bnQoJnBnYWlvX215X2JhY2tlbmQtPmlkbGVfaW9zKSk7Cjc2NgkKNzY3 CQkvKgo3NjgJCSAqIEZpcnN0IGNoZWNrIGlmIGFueSBvZiBvdXIgSU9zIGFjdHVhbGx5IGhh dmUgY29tcGxldGVkIC0gd2hlbiB1c2luZwo3NjkJCSAqIHdvcmtlciwgdGhhdCdsbCBvZnRl biBiZSB0aGUgY2FzZS4gV2UgY291bGQgZG8gc28gYXMgcGFydCBvZiB0aGUgbG9vcAo3NzAJ CSAqIGJlbG93LCBidXQgdGhhdCdkIHBvdGVudGlhbGx5IGxlYWQgdXMgdG8gd2FpdCBmb3Ig c29tZSBJTyBzdWJtaXR0ZWQKNzcxCQkgKiBiZWZvcmUuCjc3MgkJICovCjc3MwkJZm9yIChp bnQgaSA9IDA7IGkgPCBpb19tYXhfY29uY3VycmVuY3k7IGkrKykKNzc0CQl7Cjc3NQkJCVBn QWlvSGFuZGxlICppb2ggPSAmcGdhaW9fY3RsLT5pb19oYW5kbGVzW3BnYWlvX215X2JhY2tl bmQtPmlvX2hhbmRsZV9vZmYgKyBpXTsKNzc2CQo3NzcJCQlpZiAoaW9oLT5zdGF0ZSA9PSBQ R0FJT19IU19DT01QTEVURURfU0hBUkVEKQo3NzgJCQl7Cjc3OQkJCQkvKgo3ODAJCQkJICog Tm90ZSB0aGF0IG5vIGludGVycnVwdHMgYXJlIHByb2Nlc3NlZCBiZXR3ZWVuIHRoZSBzdGF0 ZSBjaGVjawo3ODEJCQkJICogYW5kIHRoZSBjYWxsIHRvIHJlY2xhaW0gLSB0aGF0J3MgaW1w b3J0YW50IGFzIG90aGVyd2lzZSBhbgo3ODIJCQkJICogaW50ZXJydXB0IGNvdWxkIGhhdmUg YWxyZWFkeSByZWNsYWltZWQgdGhlIGhhbmRsZS4KNzgzCQkJCSAqCjc4NAkJCQkgKiBOZWVk IHRvIGVuc3VyZSB0aGF0IHRoZXJlJ3Mgbm8gcmVvcmRlcmluZywgaW4gdGhlIG1vcmUgY29t bW9uCjc4NQkJCQkgKiBwYXRocywgd2hlcmUgd2Ugd2FpdCBmb3IgSU8sIHRoYXQncyBkb25l IGJ5Cjc4NgkJCQkgKiBwZ2Fpb19pb193YXNfcmVjeWNsZWQoKS4KNzg3CQkJCSAqLwo3ODgJ CQkJcGdfcmVhZF9iYXJyaWVyKCk7Cjc4OQkJCQlwZ2Fpb19pb19yZWNsYWltKGlvaCk7Cjc5 MAkJCQlyZWNsYWltZWQrKzsKNzkxCQkJfQo3OTIJCX0KNzkzCQo3OTQJCWlmIChyZWNsYWlt ZWQgPiAwKQo3OTUJCQlyZXR1cm47Cjc5NgkKNzk3CQkvKgo3OTgJCSAqIElmIHdlIGhhdmUg YW55IHVuc3VibWl0dGVkIElPcywgc3VibWl0IHRoZW0gbm93LiBXZSdsbCBzdGFydCB3YWl0 aW5nIGluCjc5OQkJICogYSBzZWNvbmQsIHNvIGl0J3MgYmV0dGVyIHRoZXkncmUgaW4gZmxp Z2h0LiBUaGlzIGFsc28gYWRkcmVzc2VzIHRoZQo4MDAJCSAqIGVkZ2UtY2FzZSB0aGF0IGFs bCBJT3MgYXJlIHVuc3VibWl0dGVkLgo4MDEJCSAqLwo4MDIJCWlmIChwZ2Fpb19teV9iYWNr ZW5kLT5udW1fc3RhZ2VkX2lvcyA+IDApCjgwMwkJCXBnYWlvX3N1Ym1pdF9zdGFnZWQoKTsK ODA0CQo4MDUJCS8qIHBvc3NpYmx5IHNvbWUgSU9zIGZpbmlzaGVkIGR1cmluZyBzdWJtaXNz aW9uICovCjgwNgkJaWYgKCFkY2xpc3RfaXNfZW1wdHkoJnBnYWlvX215X2JhY2tlbmQtPmlk bGVfaW9zKSkKODA3CQkJcmV0dXJuOwo4MDgJCjgwOQkJaWYgKGRjbGlzdF9jb3VudCgmcGdh aW9fbXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lvcykgPT0gMCkKODEwCQkJZXJlcG9ydChFUlJP UiwKODExCQkJCQllcnJtc2dfaW50ZXJuYWwoIm5vIGZyZWUgSU9zIGRlc3BpdGUgbm8gaW4t ZmxpZ2h0IElPcyIpLAo4MTIJCQkJCWVycmRldGFpbF9pbnRlcm5hbCgiJWQgcGVuZGluZywg JXUgaW4tZmxpZ2h0LCAldSBpZGxlIElPcyIsCjgxMwkJCQkJCQkJCSAgIHBnYWlvX215X2Jh Y2tlbmQtPm51bV9zdGFnZWRfaW9zLAo4MTQJCQkJCQkJCQkgICBkY2xpc3RfY291bnQoJnBn YWlvX215X2JhY2tlbmQtPmluX2ZsaWdodF9pb3MpLAo4MTUJCQkJCQkJCQkgICBkY2xpc3Rf Y291bnQoJnBnYWlvX215X2JhY2tlbmQtPmlkbGVfaW9zKSkpOwo4MTYJCjgxNwkJLyoKODE4 CQkgKiBXYWl0IGZvciB0aGUgb2xkZXN0IGluLWZsaWdodCBJTyB0byBjb21wbGV0ZS4KODE5 CQkgKgo4MjAJCSAqIFhYWDogUmV1c2luZyB0aGUgZ2VuZXJhbCBJTyB3YWl0IGlzIHN1Ym9w dGltYWwsIHdlIGRvbid0IG5lZWQgdG8gd2FpdAo4MjEJCSAqIGZvciB0aGF0IHNwZWNpZmlj IElPIHRvIGNvbXBsZXRlLCB3ZSBqdXN0IG5lZWQgKmFueSogSU8gdG8gY29tcGxldGUuCjgy MgkJICovCjgyMwkJewo4MjQJCQlQZ0Fpb0hhbmRsZSAqaW9oID0gZGNsaXN0X2hlYWRfZWxl bWVudChQZ0Fpb0hhbmRsZSwgbm9kZSwKODI1CQkJCQkJCQkJCQkJICAgJnBnYWlvX215X2Jh Y2tlbmQtPmluX2ZsaWdodF9pb3MpOwo4MjYJCQl1aW50NjQJCWdlbmVyYXRpb24gPSBpb2gt PmdlbmVyYXRpb247CjgyNwkKODI4CQkJc3dpdGNoICgoUGdBaW9IYW5kbGVTdGF0ZSkgaW9o LT5zdGF0ZSkKODI5CQkJewo4MzAJCQkJCS8qIHNob3VsZCBub3QgYmUgaW4gaW4tZmxpZ2h0 IGxpc3QgKi8KODMxCQkJCWNhc2UgUEdBSU9fSFNfSURMRToKODMyCQkJCWNhc2UgUEdBSU9f SFNfREVGSU5FRDoKODMzCQkJCWNhc2UgUEdBSU9fSFNfSEFOREVEX09VVDoKODM0CQkJCWNh c2UgUEdBSU9fSFNfU1RBR0VEOgo4MzUJCQkJY2FzZSBQR0FJT19IU19DT01QTEVURURfTE9D QUw6CjgzNgkJCQkJZWxvZyhFUlJPUiwgInNob3VsZG4ndCBnZXQgaGVyZSB3aXRoIGlvOiVk IGluIHN0YXRlICVkIiwKODM3CQkJCQkJIHBnYWlvX2lvX2dldF9pZChpb2gpLCBpb2gtPnN0 YXRlKTsKODM4CQkJCQlicmVhazsKODM5CQo4NDAJCQkJY2FzZSBQR0FJT19IU19DT01QTEVU RURfSU86Cjg0MQkJCQljYXNlIFBHQUlPX0hTX1NVQk1JVFRFRDoKODQyCQkJCQlwZ2Fpb19k ZWJ1Z19pbyhERUJVRzIsIGlvaCwKODQzCQkJCQkJCQkgICAid2FpdGluZyBmb3IgZnJlZSBp byB3aXRoICV1IGluIGZsaWdodCIsCjg0NAkJCQkJCQkJICAgZGNsaXN0X2NvdW50KCZwZ2Fp b19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zKSk7Cjg0NQkKODQ2CQkJCQkvKgo4NDcJCQkJ CSAqIEluIGEgbW9yZSBnZW5lcmFsIGNhc2UgdGhpcyB3b3VsZCBiZSByYWN5LCBiZWNhdXNl IHRoZQo4NDgJCQkJCSAqIGdlbmVyYXRpb24gY291bGQgaW5jcmVhc2UgYWZ0ZXIgd2UgcmVh ZCBpb2gtPnN0YXRlIGFib3ZlLgo4NDkJCQkJCSAqIEJ1dCB3ZSBhcmUgb25seSBsb29raW5n IGF0IElPcyBieSB0aGUgY3VycmVudCBiYWNrZW5kIGFuZAo4NTAJCQkJCSAqIHRoZSBJTyBj YW4gb25seSBiZSByZWN5Y2xlZCBieSB0aGlzIGJhY2tlbmQuICBFdmVuIHRoaXMgaXMKODUx CQkJCQkgKiBvbmx5IE9LIGJlY2F1c2Ugd2UgZ2V0IHRoZSBoYW5kbGUncyBnZW5lcmF0aW9u IGJlZm9yZQo4NTIJCQkJCSAqIHBvdGVudGlhbGx5IHByb2Nlc3NpbmcgaW50ZXJydXB0cywg ZS5nLiBhcyBwYXJ0IG9mCjg1MwkJCQkJICogcGdhaW9fZGVidWdfaW8oKS4KODU0CQkJCQkg Ki8KODU1CQkJCQlwZ2Fpb19pb193YWl0KGlvaCwgZ2VuZXJhdGlvbik7Cjg1NgkJCQkJYnJl YWs7Cjg1NwkKODU4CQkJCWNhc2UgUEdBSU9fSFNfQ09NUExFVEVEX1NIQVJFRDoKODU5CQo4 NjAJCQkJCS8qCjg2MQkJCQkJICogSXQncyBwb3NzaWJsZSB0aGF0IGFub3RoZXIgYmFja2Vu ZCBqdXN0IGZpbmlzaGVkIHRoaXMgSU8uCjg2MgkJCQkJICoKODYzCQkJCQkgKiBOb3RlIHRo YXQgbm8gaW50ZXJydXB0cyBhcmUgcHJvY2Vzc2VkIGJldHdlZW4gdGhlIHN0YXRlCjg2NAkJ CQkJICogY2hlY2sgYW5kIHRoZSBjYWxsIHRvIHJlY2xhaW0gLSB0aGF0J3MgaW1wb3J0YW50 IGFzCjg2NQkJCQkJICogb3RoZXJ3aXNlIGFuIGludGVycnVwdCBjb3VsZCBoYXZlIGFscmVh ZHkgcmVjbGFpbWVkIHRoZQo4NjYJCQkJCSAqIGhhbmRsZS4KODY3CQkJCQkgKgo4NjgJCQkJ CSAqIE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUncyBubyByZW9yZGVyaW5nLCBpbiB0aGUg bW9yZQo4NjkJCQkJCSAqIGNvbW1vbiBwYXRocywgd2hlcmUgd2Ugd2FpdCBmb3IgSU8sIHRo YXQncyBkb25lIGJ5Cjg3MAkJCQkJICogcGdhaW9faW9fd2FzX3JlY3ljbGVkKCkuCjg3MQkJ CQkJICovCjg3MgkJCQkJcGdfcmVhZF9iYXJyaWVyKCk7Cjg3MwkJCQkJcGdhaW9faW9fcmVj bGFpbShpb2gpOwo4NzQJCQkJCWJyZWFrOwo4NzUJCQl9Cjg3NgkKODc3CQkJaWYgKGRjbGlz dF9jb3VudCgmcGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MpID09IDApCjg3OAkJCQllbG9n KFBBTklDLCAibm8gaWRsZSBJTyBhZnRlciB3YWl0aW5nIGZvciBJTyB0byB0ZXJtaW5hdGUi KTsKODc5CQkJcmV0dXJuOwo4ODAJCX0KODgxCX0KODgyCQo4ODMJLyoKODg0CSAqIEludGVy bmFsIC0gY29kZSBvdXRzaWRlIG9mIEFJTyBzaG91bGQgbmV2ZXIgbmVlZCB0aGlzIGFuZCBp dCdkIGJlIGhhcmQgZm9yCjg4NQkgKiBzdWNoIGNvZGUgdG8gYmUgc2FmZS4KODg2CSAqLwo4 ODcJc3RhdGljIFBnQWlvSGFuZGxlICoKODg4CXBnYWlvX2lvX2Zyb21fd3JlZihQZ0Fpb1dh aXRSZWYgKmlvdywgdWludDY0ICpyZWZfZ2VuZXJhdGlvbikKODg5CXsKODkwCQlQZ0Fpb0hh bmRsZSAqaW9oOwo4OTEJCjg5MgkJQXNzZXJ0KGlvdy0+YWlvX2luZGV4IDwgcGdhaW9fY3Rs LT5pb19oYW5kbGVfY291bnQpOwo4OTMJCjg5NAkJaW9oID0gJnBnYWlvX2N0bC0+aW9faGFu ZGxlc1tpb3ctPmFpb19pbmRleF07Cjg5NQkKODk2CQkqcmVmX2dlbmVyYXRpb24gPSAoKHVp bnQ2NCkgaW93LT5nZW5lcmF0aW9uX3VwcGVyKSA8PCAzMiB8Cjg5NwkJCWlvdy0+Z2VuZXJh dGlvbl9sb3dlcjsKODk4CQo4OTkJCUFzc2VydCgqcmVmX2dlbmVyYXRpb24gIT0gMCk7Cjkw MAkKOTAxCQlyZXR1cm4gaW9oOwo5MDIJfQo5MDMJCjkwNAlzdGF0aWMgY29uc3QgY2hhciAq CjkwNQlwZ2Fpb19pb19zdGF0ZV9nZXRfbmFtZShQZ0Fpb0hhbmRsZVN0YXRlIHMpCjkwNgl7 CjkwNwkjZGVmaW5lIFBHQUlPX0hTX1RPU1RSX0NBU0Uoc3ltKSBjYXNlIFBHQUlPX0hTXyMj c3ltOiByZXR1cm4gI3N5bQo5MDgJCXN3aXRjaCAoKFBnQWlvSGFuZGxlU3RhdGUpIHMpCiAg IDB4MDAwMDAwMDAwMDQzNjRkNCA8KzE1OD46CWJsdHUJYTIsYTEsMHg0MzY1MDAgPHBnYWlv X2lvX3VwZGF0ZV9zdGF0ZSsyMDI+CiAgIDB4MDAwMDAwMDAwMDQzNjRkOCA8KzE2Mj46CXNs bGkJYTEsYTEsMHgzCiAgIDB4MDAwMDAwMDAwMDQzNjRkYSA8KzE2ND46CWF1aXBjCWEwLDB4 NDg1CiAgIDB4MDAwMDAwMDAwMDQzNjRkZSA8KzE2OD46CWFkZGkJYTAsYTAsLTUzMCAjIDB4 OGJiMmM4CiAgIDB4MDAwMDAwMDAwMDQzNjRlMiA8KzE3Mj46CWFkZAlhMCxhMCxhMQogICAw eDAwMDAwMDAwMDA0MzY0ZTQgPCsxNzQ+OglsZAlhNCwwKGEwKQogICAweDAwMDAwMDAwMDA0 MzY0ZWEgPCsxODA+OglibHR1CWEyLHM0LDB4NDM2NTBhIDxwZ2Fpb19pb191cGRhdGVfc3Rh dGUrMjEyPgogICAweDAwMDAwMDAwMDA0MzY0ZWUgPCsxODQ+OglzbGxpCWEwLHM0LDB4Mwog ICAweDAwMDAwMDAwMDA0MzY0ZjIgPCsxODg+OglhdWlwYwlhMiwweDQ4NQogICAweDAwMDAw MDAwMDA0MzY0ZjYgPCsxOTI+OglhZGRpCWEyLGEyLC01NTQgIyAweDhiYjJjOAogICAweDAw MDAwMDAwMDA0MzY0ZmEgPCsxOTY+OglhZGQJYTAsYTAsYTIKICAgMHgwMDAwMDAwMDAwNDM2 NGZjIDwrMTk4PjoJbGQJYTUsMChhMCkKICAgMHgwMDAwMDAwMDAwNDM2NGZlIDwrMjAwPjoJ agkweDQzNjUwYyA8cGdhaW9faW9fdXBkYXRlX3N0YXRlKzIxND4KICAgMHgwMDAwMDAwMDAw NDM2NTAwIDwrMjAyPjoJbGkJYTQsMAogICAweDAwMDAwMDAwMDA0MzY1MDYgPCsyMDg+Ogli Z2V1CWEyLHM0LDB4NDM2NGVlIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrMTg0PgogICAweDAw MDAwMDAwMDA0MzY1MGEgPCsyMTI+OglsaQlhNSwwCgo5MDkJCXsKOTEwCQkJCVBHQUlPX0hT X1RPU1RSX0NBU0UoSURMRSk7CjkxMQkJCQlQR0FJT19IU19UT1NUUl9DQVNFKEhBTkRFRF9P VVQpOwo5MTIJCQkJUEdBSU9fSFNfVE9TVFJfQ0FTRShERUZJTkVEKTsKOTEzCQkJCVBHQUlP X0hTX1RPU1RSX0NBU0UoU1RBR0VEKTsKOTE0CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoU1VC TUlUVEVEKTsKOTE1CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoQ09NUExFVEVEX0lPKTsKOTE2 CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoQ09NUExFVEVEX1NIQVJFRCk7CjkxNwkJCQlQR0FJ T19IU19UT1NUUl9DQVNFKENPTVBMRVRFRF9MT0NBTCk7CjkxOAkJfQo5MTkJI3VuZGVmIFBH QUlPX0hTX1RPU1RSX0NBU0UKOTIwCQo5MjEJCXJldHVybiBOVUxMOwkJCQkvKiBzaWxlbmNl IGNvbXBpbGVyICovCjkyMgl9CjkyMwkKOTI0CWNvbnN0IGNoYXIgKgo5MjUJcGdhaW9faW9f Z2V0X3N0YXRlX25hbWUoUGdBaW9IYW5kbGUgKmlvaCkKOTI2CXsKOTI3CQlyZXR1cm4gcGdh aW9faW9fc3RhdGVfZ2V0X25hbWUoaW9oLT5zdGF0ZSk7CiAgIDB4MDAwMDAwMDAwMDQzNjRj YyA8KzE1MD46CWxidQlhMSwwKHMxKQogICAweDAwMDAwMDAwMDA0MzY0ZDAgPCsxNTQ+Ogls aQlhMiw3CgpFbmQgb2YgYXNzZW1ibGVyIGR1bXAuCihnZGIpIA== --------------XcXokEwDRlk0XwT7MKy0kr06 Content-Type: text/plain; charset=UTF-8; name="pgaio_io_was_recycled.asm" Content-Disposition: attachment; filename="pgaio_io_was_recycled.asm" Content-Transfer-Encoding: base64 R05VIGdkYiAoRGViaWFuIDE1LjItMSkgMTUuMgpDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMrOiBHTlUgR1BMIHZlcnNp b24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMg aXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmli dXRlIGl0LgpUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LgpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRl dGFpbHMuClRoaXMgR0RCIHdhcyBjb25maWd1cmVkIGFzICJyaXNjdjY0LWxpbnV4LWdudSIu ClR5cGUgInNob3cgY29uZmlndXJhdGlvbiIgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4K Rm9yIGJ1ZyByZXBvcnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOgo8aHR0cHM6Ly93 d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvYnVncy8+LgpGaW5kIHRoZSBHREIgbWFudWFsIGFu ZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNlcyBvbmxpbmUgYXQ6CiAgICA8aHR0cDov L3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9kb2N1bWVudGF0aW9uLz4uCgpGb3IgaGVscCwg dHlwZSAiaGVscCIuClR5cGUgImFwcm9wb3Mgd29yZCIgdG8gc2VhcmNoIGZvciBjb21tYW5k cyByZWxhdGVkIHRvICJ3b3JkIi4uLgpSZWFkaW5nIHN5bWJvbHMgZnJvbSB0bXBfaW5zdGFs bC91c3IvbG9jYWwvcGdzcWwvYmluL3Bvc3RncmVzLi4uCihnZGIpIER1bXAgb2YgYXNzZW1i bGVyIGNvZGUgZm9yIGZ1bmN0aW9uIHBnYWlvX2lvX3dhc19yZWN5Y2xlZDoKNTU4CQkqc3Rh dGUgPSBpb2gtPnN0YXRlOwogICAweDAwMDAwMDAwMDA0MzZmOTggPCswPjoJbGJ1CWEzLDAo YTApCiAgIDB4MDAwMDAwMDAwMDQzNmY5YyA8KzQ+OglzdwlhMywwKGEyKQoKNTU5CQo1NjAJ CS8qCjU2MQkJICogRW5zdXJlIHRoYXQgd2UgZG9uJ3Qgc2VlIGFuIGVhcmxpZXIgc3RhdGUg b2YgdGhlIGhhbmRsZSB0aGFuIGlvaC0+c3RhdGUKNTYyCQkgKiBkdWUgdG8gY29tcGlsZXIg b3IgQ1BVIHJlb3JkZXJpbmcuIFRoaXMgcHJvdGVjdHMgYm90aCAtPmdlbmVyYXRpb24gYXMK NTYzCQkgKiBkaXJlY3RseSB1c2VkIGhlcmUsIGFuZCBvdGhlciBmaWVsZHMgaW4gdGhlIGhh bmRsZSBhY2Nlc3NlZCBpbiB0aGUKNTY0CQkgKiBjYWxsZXIgaWYgdGhlIGhhbmRsZSB3YXMg bm90IHJldXNlZC4KNTY1CQkgKi8KNTY2CQlwZ19yZWFkX2JhcnJpZXIoKTsKICAgMHgwMDAw MDAwMDAwNDM2ZjllIDwrNj46CWZlbmNlCXIscncKCjU2NwkKNTY4CQlyZXR1cm4gaW9oLT5n ZW5lcmF0aW9uICE9IHJlZl9nZW5lcmF0aW9uOwogICAweDAwMDAwMDAwMDA0MzZmYTIgPCsx MD46CWxkCWEwLDY0KGEwKQogICAweDAwMDAwMDAwMDA0MzZmYTQgPCsxMj46CXhvcglhMCxh MCxhMQogICAweDAwMDAwMDAwMDA0MzZmYTYgPCsxND46CXNuZXoJYTAsYTAKICAgMHgwMDAw MDAwMDAwNDM2ZmFhIDwrMTg+OglyZXQKCkVuZCBvZiBhc3NlbWJsZXIgZHVtcC4KKGdkYikg --------------XcXokEwDRlk0XwT7MKy0kr06--