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.96) (envelope-from ) id 1w5VqE-003KDC-0j for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 21:32:42 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5VqB-00Gfol-0E for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 21:32:39 +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.96) (envelope-from ) id 1w5VqA-00Gfod-2I for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 21:32:39 +0000 Received: from mail-ua1-x931.google.com ([2607:f8b0:4864:20::931]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5Vq8-000000018gO-14Ea for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 21:32:38 +0000 Received: by mail-ua1-x931.google.com with SMTP id a1e0cc1a2514c-950cd03fb5eso99564241.0 for ; Wed, 25 Mar 2026 14:32:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774474355; cv=none; d=google.com; s=arc-20240605; b=jkepw+tV7dHQj7nwAlmc7r2uhkTrhH6mUQ0CUN4Cgki8MhahpablI4QOpDSEgZ9myk A1mdcI9zXcwk2+vf5Pa9gUEL8XDb41g2szGPwdgBkgIhoOD1GE8FaOL7X3NPxqkInGg+ LtiR4PdyA/f6eXU4ZvJFrd006k0wybrLwR3nI6ap7AcFPsnA9GF6Fektab1WLFU5o1K/ xKK6z5R6v3y9JFJZze/zz/xmjRrNE221Jet/quwyE8bXAL4VzTiKkr5egO3rW8fik35Y owNG5vViCDIp9XZWwduCsw9jVDqgj8BqzLWm8lwbwAKyWtX0R+6yobJsDpDvVdP9f5Lw 9t1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=7sP/zgAnqRrt4xOYf9e2vaHzgD3pmydYp6kv/wTboCU=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=D0deYaHmtTNqBPBNZoWfnbm+LIUupElG6VSmuo/guZOL0pf77oMn92L4WmZs4vgk4W v0tqrE2llxuiDoCzn4c6mpOrnh2T5xcPuBy8cFaW7xDWt+DzBUIDfdaJQuAcISddEA9p b69ZJ7nBDCRomf9nMQ7u+02y9E3Nd0BZinNuX5dGj/82xTCI8bjagGb9xOdTHu7kjQ8X 3Xvf30Yd18p6JM0nBJlstXiVrSyVgUbA4w9ruUlL9qOm4LNHeo1RLT/zIwLtOiFKn5Lb WT4qnxkbC2klEcVkb70eJ/DfTe/xc7Y9ugIpttxL7cnnK4CoRqm4UBR5Q/Bq54Jw3Gkt pAgA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774474355; x=1775079155; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=7sP/zgAnqRrt4xOYf9e2vaHzgD3pmydYp6kv/wTboCU=; b=IO6d3I3d8UT7hBfysoXI2U44NH0C8ihLz7oTpKAyph0XF0gAE9M4ce8v2PvtV7soSr MfqryRBB/gSyg/geD321K/HyvpONhjcEhwkZiTDe71G6QFsCCQCSbbxkE/XQ6xQi+V2G SDVC+7pmkVdZ8g2XqSluqyziXVkqGiFYzFUX7evz4+7CKVjG8nwhS6+tvNiKwhkvKcr0 sCdbv7haifK3p1Nd24Ky3A+Dbl+NUONFEmKBS4pfe3KHjVvXvpQJfBYOZVdgrwEm6l/B AKvZ6r2RFXrbngyTEjLP1KkkTfeeazTJIrLwoHKdRDR2/f+CH7c7etNPo7oNKavTJXuP ARTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774474355; x=1775079155; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7sP/zgAnqRrt4xOYf9e2vaHzgD3pmydYp6kv/wTboCU=; b=seOvKu/9qLBpe5jA+ljdkskTOm1bu5Wj5NJH1jQCZvgbIihgf34UCkSA46i9YDqr8z mAO9UafwSkBWpt26iX+/RJbYY7amd2okdOqTyWf7f+GFET0Jd8oyxI7syobsPbHWmmEq o1gzgTFDu3KWIN0Ud3Otr2QSL6520P6mBudUI/cI0MoOi/XjFIpHhZD5Czez96LTjDzL mOtFLyv9YTtkMHygCungwapHESX/I/QXt4kY6dOx8qQRAhE/xrJP9ewmpJLIyT6iPRUD rWjeeKMloESjsU4rYVGQb6FEZu+dG2gX0YEZLnxCa6SUy70tLDOP/VD2HZLkD+G7I26a /exQ== X-Gm-Message-State: AOJu0YxgW0nKlZQwtenUo5l2F309ZSO3zYU9umfgeFfDl6MLjnngpMog kxitRYEhBIo8nq2p/CWQUvunBDgRl9SugRLp7M7hvc+7+IPI/eQdmImwtKyfjznkYv/vQ9aTmwy Evnj1ugxH59PIBJuDXasfrJArxR27qUgwKLdq X-Gm-Gg: ATEYQzyGVKaFj4PZVJ4brkzJ9hQNzEkFT17v6OCzkeCZdYUK5Vf9wTac0JUeAq+Hsyv dvcxG79+1kdHgGwroj8Zzjrbv8opY/YPCiXiaKvBA6FNk6ZJu9VmNSyvol8rn083FaISwzTleVf 2Q6BPEmHQpoOGRYXtgLA2Ludpe1VT4ef/JgoIvDHnxLngE4ix5GYx/kMUDWrTVTvegKIJcE0EQ4 89XUZfRKHIJi5FcbqpVUhdTuStb9XvcpDclEOuDc0IkJshSKC6/v3zN5ALlL8UbkNANBr/Sl2Am WWnAKj4= X-Received: by 2002:a05:6102:f95:b0:602:aac7:b8bc with SMTP id ada2fe7eead31-6038753a637mr2674219137.30.1774474355038; Wed, 25 Mar 2026 14:32:35 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Wed, 25 Mar 2026 14:32:23 -0700 X-Gm-Features: AQROBzC0gLAbUv8avuuD2HUUMXr7EKNnpAC3G5roLeKBIZp_cFXueVXi0YBeS1M Message-ID: Subject: Make pg_prewarm, autoprewarm yield for waiting DDL To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000009875d8064de001bb" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009875d8064de001bb Content-Type: multipart/alternative; boundary="0000000000009875d7064de001b9" --0000000000009875d7064de001b9 Content-Type: text/plain; charset="UTF-8" Both pg_prewarm() and the autoprewarm background worker hold AccessShareLock on the target relation for the entire duration of prewarming. On large tables this can take a long time, which means that any DDL that needs a stronger lock (TRUNCATE, DROP TABLE, ALTER TABLE, etc.) is blocked for the full duration. VACUUM already solves this same problem during heap truncation: it periodically calls LockHasWaitersRelation() and backs off when a conflicting waiter is detected (see lazy_truncate_heap()). The attached patch applies the same pattern to pg_prewarm and autoprewarm. Every 1024 blocks, each code path checks for a waiter and if found then the lock is released so that the DDL can proceed. Patch handles the relation truncation, drop cases by emitting an error message. If the relation was only partially truncated, the endpoint is adjusted downward and prewarming continues. When no DDL is waiting, the only overhead is one lock-table probe per 1024 blocks. While developing this patch I discovered that LockHasWaiters() crashes with a segfault when the lock in question was acquired via the fast-path optimization, details in [1]. The patch includes a TAP test (t/002_lock_yield.pl) that exercises the TRUNCATE and DROP TABLE scenarios using injection points. Thanks, Satya [1]: https://www.postgresql.org/message-id/CAHg%2BQDe_%3DZahnRx37bzrqYenKn_S5YDQ00fTfwe-ZUmjqO%3DqLg%40mail.gmail.com --0000000000009875d7064de001b9 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Both pg_prewarm() and the autoprewarm background worker ho= ld AccessShareLock on the target relation for the entire duration of prewar= ming. On large tables this can take a long time, which means
that any DD= L that needs a stronger lock (TRUNCATE, DROP TABLE, ALTER TABLE, etc.) is b= locked for the full duration.

VACUUM already solves this same proble= m during heap truncation: it periodically calls LockHasWaitersRelation() an= d backs off when a conflicting waiter is detected (see lazy_truncate_heap()= ).

The attached patch applies the same pattern to pg_prewarm and aut= oprewarm. Every 1024 blocks, each code path checks for a waiter and if foun= d then the lock is released so that the DDL can proceed. Patch handles the = relation truncation, drop cases by emitting an error message. If the relati= on was only partially truncated, the endpoint is adjusted downward and prew= arming continues.
When no DDL is waiting, the only overhead is one lock-= table probe per 1024 blocks.

While developing this patch I discovere= d that LockHasWaiters() crashes with a segfault when the lock in question w= as acquired via the fast-path optimization, details in [1].

The patc= h includes a TAP test (t/002_lock_yiel= d.pl) that exercises the TRUNCATE and DROP TABLE scenarios using inject= ion points.

Thanks,
--0000000000009875d7064de001b9-- --0000000000009875d8064de001bb Content-Type: application/octet-stream; name="0001-pg_prewarm-yield-lock-for-ddl.patch" Content-Disposition: attachment; filename="0001-pg_prewarm-yield-lock-for-ddl.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn6k6hk90 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfcHJld2FybS9NYWtlZmlsZSBiL2NvbnRyaWIvcGdfcHJl d2FybS9NYWtlZmlsZQppbmRleCA2MTdhYzhlMC4uNTNiY2U0NDkgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcGdfcHJld2FybS9NYWtlZmlsZQorKysgYi9jb250cmliL3BnX3ByZXdhcm0vTWFrZWZpbGUK QEAgLTEyLDYgKzEyLDkgQEAgUEdGSUxFREVTQyA9ICJwZ19wcmV3YXJtIC0gcHJlbG9hZCByZWxh dGlvbiBkYXRhIGludG8gc3lzdGVtIGJ1ZmZlciBjYWNoZSIKIAogUkVHUkVTUyA9IHBnX3ByZXdh cm0KIAorRVhUUkFfSU5TVEFMTCA9IHNyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cwor ZXhwb3J0IGVuYWJsZV9pbmplY3Rpb25fcG9pbnRzCisKIFRBUF9URVNUUyA9IDEKIAogaWZkZWYg VVNFX1BHWFMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfcHJld2FybS9hdXRvcHJld2FybS5jIGIv Y29udHJpYi9wZ19wcmV3YXJtL2F1dG9wcmV3YXJtLmMKaW5kZXggYmEwYmM4ZTYuLjJjMjA3ZWZh IDEwMDY0NAotLS0gYS9jb250cmliL3BnX3ByZXdhcm0vYXV0b3ByZXdhcm0uYworKysgYi9jb250 cmliL3BnX3ByZXdhcm0vYXV0b3ByZXdhcm0uYwpAQCAtMzksMTIgKzM5LDE0IEBACiAjaW5jbHVk ZSAic3RvcmFnZS9mZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9sYXRjaC5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgogI2luY2x1ZGUgInN0b3Jh Z2UvbHdsb2NrLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jc2lnbmFsLmgiCiAjaW5jbHVkZSAi c3RvcmFnZS9yZWFkX3N0cmVhbS5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc21nci5oIgogI2luY2x1 ZGUgInRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9ndWMuaCIKKyNpbmNsdWRlICJ1 dGlscy9pbmplY3Rpb25fcG9pbnQuaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKICNpbmNsdWRl ICJ1dGlscy9yZWxmaWxlbnVtYmVybWFwLmgiCiAjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgi CkBAIC01Miw2ICs1NCwxMSBAQAogCiAjZGVmaW5lIEFVVE9QUkVXQVJNX0ZJTEUgImF1dG9wcmV3 YXJtLmJsb2NrcyIKIAorLyoKKyAqIEJsb2NrIGludGVydmFsIGZvciBjaGVja2luZyBjb25mbGlj dGluZyBsb2NrIHdhaXRlcnMgZHVyaW5nIHByZXdhcm1pbmcuCisgKi8KKyNkZWZpbmUgUFJFV0FS TV9XQUlURVJfQ0hFQ0tfSU5URVJWQUwJCTEwMjQKKwogLyogTWV0YWRhdGEgZm9yIGVhY2ggYmxv Y2sgd2UgZHVtcC4gKi8KIHR5cGVkZWYgc3RydWN0IEJsb2NrSW5mb1JlY29yZAogewpAQCAtNjM1 LDEzICs2NDIsODMgQEAgYXV0b3ByZXdhcm1fZGF0YWJhc2VfbWFpbihEYXR1bSBtYWluX2FyZykK IAkJCSAqIHJlYWQgc3RyZWFtIGNhbGxiYWNrIHdpbGwgY2hlY2sgdGhhdCB3ZSBzdGlsbCBoYXZl IGZyZWUgYnVmZmVycwogCQkJICogYmVmb3JlIHJlcXVlc3RpbmcgZWFjaCBibG9jayBmcm9tIHRo ZSByZWFkIHN0cmVhbSBBUEkuCiAJCQkgKi8KLQkJCXdoaWxlICgoYnVmID0gcmVhZF9zdHJlYW1f bmV4dF9idWZmZXIoc3RyZWFtLCBOVUxMKSkgIT0gSW52YWxpZEJ1ZmZlcikKIAkJCXsKLQkJCQlh cHdfc3RhdGUtPnByZXdhcm1lZF9ibG9ja3MrKzsKLQkJCQlSZWxlYXNlQnVmZmVyKGJ1Zik7Ci0J CQl9CisJCQkJaW50CQkJYmxvY2tzX3NpbmNlX2NoZWNrID0gMDsKKwkJCQlib29sCQlyZWxfZHJv cHBlZCA9IGZhbHNlOwogCi0JCQlyZWFkX3N0cmVhbV9lbmQoc3RyZWFtKTsKKwkJCQl3aGlsZSAo KGJ1ZiA9IHJlYWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCkpICE9IEludmFsaWRC dWZmZXIpCisJCQkJeworCQkJCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCQkJCQlhcHdfc3Rh dGUtPnByZXdhcm1lZF9ibG9ja3MrKzsKKwkJCQkJUmVsZWFzZUJ1ZmZlcihidWYpOworCQkJCQli bG9ja3Nfc2luY2VfY2hlY2srKzsKKworCQkJCQkvKgorCQkJCQkgKiBQZXJpb2RpY2FsbHkgY2hl Y2sgZm9yIGNvbmZsaWN0aW5nIGxvY2sgd2FpdGVycy4gIElmCisJCQkJCSAqIGZvdW5kLCBlbmQg dGhlIGN1cnJlbnQgcmVhZCBzdHJlYW0gYW5kIHlpZWxkIG91ciBsb2NrCisJCQkJCSAqIHNvIHRo ZSB3YWl0ZXIgY2FuIHByb2NlZWQuCisJCQkJCSAqLworCQkJCQlpZiAoYmxvY2tzX3NpbmNlX2No ZWNrID49IFBSRVdBUk1fV0FJVEVSX0NIRUNLX0lOVEVSVkFMKQorCQkJCQl7CisJCQkJCQlibG9j a3Nfc2luY2VfY2hlY2sgPSAwOworCisJCQkJCQlJTkpFQ1RJT05fUE9JTlQoImF1dG9wcmV3YXJt LWJlZm9yZS1jaGVjay1hbmQteWllbGQiLCBOVUxMKTsKKworCQkJCQkJaWYgKExvY2tIYXNXYWl0 ZXJzUmVsYXRpb24ocmVsLCBBY2Nlc3NTaGFyZUxvY2spKQorCQkJCQkJeworCQkJCQkJCXJlYWRf c3RyZWFtX2VuZChzdHJlYW0pOworCQkJCQkJCXJlbGF0aW9uX2Nsb3NlKHJlbCwgQWNjZXNzU2hh cmVMb2NrKTsKKworCQkJCQkJCS8qIFJlYWNxdWlyZSBhbmQgY2hlY2sgaWYgcmVsYXRpb24gaXMg c3RpbGwgdmFsaWQuICovCisJCQkJCQkJcmVsID0gdHJ5X3JlbGF0aW9uX29wZW4ocmVsb2lkLCBB Y2Nlc3NTaGFyZUxvY2spOworCQkJCQkJCWlmIChyZWwgPT0gTlVMTCkKKwkJCQkJCQl7CisJCQkJ CQkJCXJlbF9kcm9wcGVkID0gdHJ1ZTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCisJCQkJ CQkJLyoKKwkJCQkJCQkgKiBSZWNhbGN1bGF0ZSBmb3JrIHNpemU7IHNraXAgcmVtYWluZGVyIGlm CisJCQkJCQkJICogdHJ1bmNhdGVkLgorCQkJCQkJCSAqLworCQkJCQkJCWlmICghc21ncmV4aXN0 cyhSZWxhdGlvbkdldFNtZ3IocmVsKSwgZm9ya251bSkpCisJCQkJCQkJeworCQkJCQkJCQlpID0g cC5wb3M7CisJCQkJCQkJCWJsayA9IGJsb2NrX2luZm9baV07CisJCQkJCQkJCWJyZWFrOworCQkJ CQkJCX0KKwkJCQkJCQlwLm5ibG9ja3MgPSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzSW5Gb3Jr KHJlbCwgZm9ya251bSk7CisKKwkJCQkJCQkvKiBSZXN0YXJ0IHN0cmVhbSBmb3IgcmVtYWluaW5n IGJsb2Nrcy4gKi8KKwkJCQkJCQlzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihS RUFEX1NUUkVBTV9NQUlOVEVOQU5DRSB8CisJCQkJCQkJCQkJCQkJCQkJUkVBRF9TVFJFQU1fREVG QVVMVCB8CisJCQkJCQkJCQkJCQkJCQkJUkVBRF9TVFJFQU1fVVNFX0JBVENISU5HLAorCQkJCQkJ CQkJCQkJCQkJCU5VTEwsCisJCQkJCQkJCQkJCQkJCQkJcmVsLAorCQkJCQkJCQkJCQkJCQkJCXAu Zm9ya251bSwKKwkJCQkJCQkJCQkJCQkJCQlhcHdfcmVhZF9zdHJlYW1fbmV4dF9ibG9jaywKKwkJ CQkJCQkJCQkJCQkJCQkmcCwKKwkJCQkJCQkJCQkJCQkJCQkwKTsKKwkJCQkJCX0KKwkJCQkJfQor CQkJCX0KKworCQkJCWlmIChyZWxfZHJvcHBlZCkKKwkJCQl7CisJCQkJCS8qIEZhc3QtZm9yd2Fy ZCBwYXN0IHJlbWFpbmluZyBibG9ja3MgZm9yIHRoaXMgcmVsYXRpb24uICovCisJCQkJCWZvciAo OyBpIDwgYXB3X3N0YXRlLT5wcmV3YXJtX3N0b3BfaWR4OyBpKyspCisJCQkJCXsKKwkJCQkJCWJs ayA9IGJsb2NrX2luZm9baV07CisJCQkJCQlpZiAoYmxrLnRhYmxlc3BhY2UgIT0gdGFibGVzcGFj ZSB8fAorCQkJCQkJCWJsay5maWxlbnVtYmVyICE9IGZpbGVudW1iZXIpCisJCQkJCQkJYnJlYWs7 CisJCQkJCX0KKwkJCQkJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisJCQkJCWNvbnRpbnVl OwkvKiBvdXRlciB3aGlsZSBsb29wICovCisJCQkJfQorCisJCQkJcmVhZF9zdHJlYW1fZW5kKHN0 cmVhbSk7CisJCQl9CiAKIAkJCS8qIEFkdmFuY2UgaSBwYXN0IGFsbCB0aGUgYmxvY2tzIGp1c3Qg cHJld2FybWVkLiAqLwogCQkJaSA9IHAucG9zOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3 YXJtL21lc29uLmJ1aWxkIGIvY29udHJpYi9wZ19wcmV3YXJtL21lc29uLmJ1aWxkCmluZGV4IGU3 MDU0NmE0Li44Y2M2NjA3MyAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19wcmV3YXJtL21lc29uLmJ1 aWxkCisrKyBiL2NvbnRyaWIvcGdfcHJld2FybS9tZXNvbi5idWlsZApAQCAtMzcsNiArMzcsNyBA QCB0ZXN0cyArPSB7CiAgICd0YXAnOiB7CiAgICAgJ3Rlc3RzJzogWwogICAgICAgJ3QvMDAxX2Jh c2ljLnBsJywKKyAgICAgICd0LzAwMl9sb2NrX3lpZWxkLnBsJywKICAgICBdLAogICB9LAogfQpk aWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0uYyBiL2NvbnRyaWIvcGdf cHJld2FybS9wZ19wcmV3YXJtLmMKaW5kZXggYzI3MTYwODYuLjZlOGYyZDkzIDEwMDY0NAotLS0g YS9jb250cmliL3BnX3ByZXdhcm0vcGdfcHJld2FybS5jCisrKyBiL2NvbnRyaWIvcGdfcHJld2Fy bS9wZ19wcmV3YXJtLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJzdG9yYWdlL3NtZ3Iu aCIKICNpbmNsdWRlICJ1dGlscy9hY2wuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgor I2luY2x1ZGUgInV0aWxzL2luamVjdGlvbl9wb2ludC5oIgogI2luY2x1ZGUgInV0aWxzL2xzeXNj YWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogCkBAIC00NCw2ICs0NSw3NCBAQCB0eXBl ZGVmIGVudW0KIAogc3RhdGljIFBHSU9BbGlnbmVkQmxvY2sgYmxvY2tidWZmZXI7CiAKKy8qCisg KiBCbG9jayBpbnRlcnZhbCBmb3IgY2hlY2tpbmcgY29uZmxpY3RpbmcgbG9jayB3YWl0ZXJzLiBD aGVja2luZyBldmVyeQorICogYmxvY2sgaXMgdG9vIGV4cGVuc2l2ZSBiZWNhdXNlIExvY2tIYXNX YWl0ZXJzUmVsYXRpb24gcGVyZm9ybXMgYQorICogbG9jay10YWJsZSBwcm9iZSwgYnV0IHdlIGRv bid0IHdhbnQgdG8gY2hlY2sgdG9vIGluZnJlcXVlbnRseSBlaXRoZXIsIHRvIGF2b2lkCisgKiBs b25nIHN0YWxscyB3aGVuIHRoZXJlIGFyZSB3YWl0ZXJzLgorICovCisjZGVmaW5lIFBSRVdBUk1f V0FJVEVSX0NIRUNLX0lOVEVSVkFMCQkxMDI0CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGFueSBz ZXNzaW9uIGlzIHdhaXRpbmcgZm9yIGEgbG9jayB0aGF0IGNvbmZsaWN0cyB3aXRoCisgKiBBY2Nl c3NTaGFyZUxvY2sgb24gdGhlIHJlbGF0aW9uLiAgSWYgc28sIHJlbGVhc2UgdGhlIGxvY2sgdG8g bGV0IHRoZQorICogd2FpdGVyIHByb2NlZWQsIHRoZW4gdHJ5IHRvIHJlYWNxdWlyZSBpdC4KKyAq CisgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlbGF0aW9uIHdhcyBkcm9wcGVkIG9yIHRydW5j YXRlZCBwYXN0ICduZXh0X2Jsb2NrJyB3aGlsZQorICogdGhlIGxvY2sgd2FzIG5vdCBoZWxkLgor ICovCitzdGF0aWMgUmVsYXRpb24KK3BnX3ByZXdhcm1fY2hlY2tfYW5kX3lpZWxkKFJlbGF0aW9u IHJlbCwgT2lkIHJlbE9pZCwgT2lkIHByaXZPaWQsCisJCQkJCQkgICBGb3JrTnVtYmVyIGZvcmtO dW1iZXIsIGludDY0IG5leHRfYmxvY2ssCisJCQkJCQkgICBpbnQ2NCBibG9ja3NfZG9uZSwgaW50 NjQgKmxhc3RfYmxvY2spCit7CisJaW50NjQJCW5ibG9ja3M7CisKKwlJTkpFQ1RJT05fUE9JTlQo InBnX3ByZXdhcm0tYmVmb3JlLWNoZWNrLWFuZC15aWVsZCIsIE5VTEwpOworCisJLyogTm90aGlu ZyB0byBkbyBpZiBub2JvZHkgaXMgd2FpdGluZyBmb3IgYSBjb25mbGljdGluZyBsb2NrLiAqLwor CWlmICghTG9ja0hhc1dhaXRlcnNSZWxhdGlvbihyZWwsIEFjY2Vzc1NoYXJlTG9jaykpCisJCXJl dHVybiByZWw7CisKKwkvKiBSZWxlYXNlIGFsbCBsb2NrcyB0byBsZXQgdGhlIHdhaXRlciBwcm9j ZWVkLiAqLworCXJlbGF0aW9uX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlpZiAocHJp dk9pZCAhPSByZWxPaWQpCisJCVVubG9ja1JlbGF0aW9uT2lkKHByaXZPaWQsIEFjY2Vzc1NoYXJl TG9jayk7CisKKwkvKiBSZWFjcXVpcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXI6IHBhcmVudCB0YWJs ZSBiZWZvcmUgaW5kZXguICovCisJaWYgKHByaXZPaWQgIT0gcmVsT2lkKQorCQlMb2NrUmVsYXRp b25PaWQocHJpdk9pZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlyZWwgPSB0cnlfcmVsYXRpb25fb3Bl bihyZWxPaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJaWYgKHJlbCA9PSBOVUxMKQorCXsKKwkJaWYg KHByaXZPaWQgIT0gcmVsT2lkKQorCQkJVW5sb2NrUmVsYXRpb25PaWQocHJpdk9pZCwgQWNjZXNz U2hhcmVMb2NrKTsKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX09CSkVD VF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJCQkgZXJybXNnKCJyZWxhdGlvbiB3YXMg ZHJvcHBlZCBkdXJpbmcgcGdfcHJld2FybSBhZnRlciAlIiBQUklkNjQgIiBibG9ja3MiLAorCQkJ CQkJYmxvY2tzX2RvbmUpKSk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGZvcmsgc3RpbGwgZXhp c3RzIGFuZCBoYXMgZW5vdWdoIGJsb2Nrcy4gKi8KKwlpZiAoIXNtZ3JleGlzdHMoUmVsYXRpb25H ZXRTbWdyKHJlbCksIGZvcmtOdW1iZXIpIHx8CisJCShuYmxvY2tzID0gUmVsYXRpb25HZXROdW1i ZXJPZkJsb2Nrc0luRm9yayhyZWwsIGZvcmtOdW1iZXIpKSA8PSBuZXh0X2Jsb2NrKQorCXsKKwkJ cmVsYXRpb25fY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCQlpZiAocHJpdk9pZCAhPSBy ZWxPaWQpCisJCQlVbmxvY2tSZWxhdGlvbk9pZChwcml2T2lkLCBBY2Nlc3NTaGFyZUxvY2spOwor CQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVS RVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coInJlbGF0aW9uIHdhcyB0cnVuY2F0ZWQgZHVy aW5nIHBnX3ByZXdhcm0gYWZ0ZXIgJSIgUFJJZDY0ICIgYmxvY2tzIiwKKwkJCQkJCWJsb2Nrc19k b25lKSkpOworCX0KKworCS8qIEFkanVzdCBlbmRwb2ludCBpZiB0aGUgcmVsYXRpb24gd2FzIHBh cnRpYWxseSB0cnVuY2F0ZWQuICovCisJaWYgKCpsYXN0X2Jsb2NrID49IG5ibG9ja3MpCisJCSps YXN0X2Jsb2NrID0gbmJsb2NrcyAtIDE7CisKKwlyZXR1cm4gcmVsOworfQorCiAvKgogICogcGdf cHJld2FybShyZWdjbGFzcywgbW9kZSB0ZXh0LCBmb3JrIHRleHQsCiAgKgkJCSAgZmlyc3RfYmxv Y2sgaW50OCwgbGFzdF9ibG9jayBpbnQ4KQpAQCAtMjA4LDYgKzI3NywxMSBAQCBwZ19wcmV3YXJt KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCWZvciAoYmxvY2sgPSBmaXJzdF9ibG9jazsgYmxvY2sgPD0g bGFzdF9ibG9jazsgKytibG9jaykKIAkJewogCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwkJ CWlmIChibG9ja3NfZG9uZSA+IDAgJiYKKwkJCQlibG9ja3NfZG9uZSAlIFBSRVdBUk1fV0FJVEVS X0NIRUNLX0lOVEVSVkFMID09IDApCisJCQkJcmVsID0gcGdfcHJld2FybV9jaGVja19hbmRfeWll bGQocmVsLCByZWxPaWQsIHByaXZPaWQsCisJCQkJCQkJCQkJCQkgZm9ya051bWJlciwgYmxvY2ss CisJCQkJCQkJCQkJCQkgYmxvY2tzX2RvbmUsICZsYXN0X2Jsb2NrKTsKIAkJCVByZWZldGNoQnVm ZmVyKHJlbCwgZm9ya051bWJlciwgYmxvY2spOwogCQkJKytibG9ja3NfZG9uZTsKIAkJfQpAQCAt MjI3LDYgKzMwMSwxMSBAQCBwZ19wcmV3YXJtKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCWZvciAoYmxv Y2sgPSBmaXJzdF9ibG9jazsgYmxvY2sgPD0gbGFzdF9ibG9jazsgKytibG9jaykKIAkJewogCQkJ Q0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwkJCWlmIChibG9ja3NfZG9uZSA+IDAgJiYKKwkJCQli bG9ja3NfZG9uZSAlIFBSRVdBUk1fV0FJVEVSX0NIRUNLX0lOVEVSVkFMID09IDApCisJCQkJcmVs ID0gcGdfcHJld2FybV9jaGVja19hbmRfeWllbGQocmVsLCByZWxPaWQsIHByaXZPaWQsCisJCQkJ CQkJCQkJCQkgZm9ya051bWJlciwgYmxvY2ssCisJCQkJCQkJCQkJCQkgYmxvY2tzX2RvbmUsICZs YXN0X2Jsb2NrKTsKIAkJCXNtZ3JyZWFkKFJlbGF0aW9uR2V0U21ncihyZWwpLCBmb3JrTnVtYmVy LCBibG9jaywgYmxvY2tidWZmZXIuZGF0YSk7CiAJCQkrK2Jsb2Nrc19kb25lOwogCQl9CkBAIC0y NjYsNiArMzQ1LDMzIEBAIHBnX3ByZXdhcm0oUEdfRlVOQ1RJT05fQVJHUykKIAkJCWJ1ZiA9IHJl YWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCk7CiAJCQlSZWxlYXNlQnVmZmVyKGJ1 Zik7CiAJCQkrK2Jsb2Nrc19kb25lOworCisJCQkvKgorCQkJICogUGVyaW9kaWNhbGx5IGNoZWNr IGZvciBjb25mbGljdGluZyBsb2NrIHdhaXRlcnMuICBJZiBmb3VuZCwgZW5kCisJCQkgKiB0aGUg Y3VycmVudCByZWFkIHN0cmVhbSBhbmQgeWllbGQsIHRoZW4gc3RhcnQgYSBuZXcgc3RyZWFtIGZv cgorCQkJICogdGhlIHJlbWFpbmluZyBibG9ja3MuCisJCQkgKi8KKwkJCWlmIChibG9ja3NfZG9u ZSAlIFBSRVdBUk1fV0FJVEVSX0NIRUNLX0lOVEVSVkFMID09IDAgJiYKKwkJCQlibG9jayA8IGxh c3RfYmxvY2spCisJCQl7CisJCQkJcmVhZF9zdHJlYW1fZW5kKHN0cmVhbSk7CisJCQkJcmVsID0g cGdfcHJld2FybV9jaGVja19hbmRfeWllbGQocmVsLCByZWxPaWQsIHByaXZPaWQsCisJCQkJCQkJ CQkJCQkgZm9ya051bWJlciwgYmxvY2sgKyAxLAorCQkJCQkJCQkJCQkJIGJsb2Nrc19kb25lLCAm bGFzdF9ibG9jayk7CisKKwkJCQkvKiBSZXN0YXJ0IHN0cmVhbSBmb3IgcmVtYWluaW5nIGJsb2Nr cy4gKi8KKwkJCQlwLmN1cnJlbnRfYmxvY2tudW0gPSBibG9jayArIDE7CisJCQkJcC5sYXN0X2V4 Y2x1c2l2ZSA9IGxhc3RfYmxvY2sgKyAxOworCQkJCXN0cmVhbSA9IHJlYWRfc3RyZWFtX2JlZ2lu X3JlbGF0aW9uKFJFQURfU1RSRUFNX01BSU5URU5BTkNFIHwKKwkJCQkJCQkJCQkJCQlSRUFEX1NU UkVBTV9GVUxMIHwKKwkJCQkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCisJCQkJ CQkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJCQkJCQlyZWwsCisJCQkJCQkJCQkJCQkJZm9ya051bWJl ciwKKwkJCQkJCQkJCQkJCQlibG9ja19yYW5nZV9yZWFkX3N0cmVhbV9jYiwKKwkJCQkJCQkJCQkJ CQkmcCwKKwkJCQkJCQkJCQkJCQkwKTsKKwkJCX0KIAkJfQogCQlBc3NlcnQocmVhZF9zdHJlYW1f bmV4dF9idWZmZXIoc3RyZWFtLCBOVUxMKSA9PSBJbnZhbGlkQnVmZmVyKTsKIAkJcmVhZF9zdHJl YW1fZW5kKHN0cmVhbSk7CmRpZmYgLS1naXQgYS9jb250cmliL3BnX3ByZXdhcm0vdC8wMDJfbG9j a195aWVsZC5wbCBiL2NvbnRyaWIvcGdfcHJld2FybS90LzAwMl9sb2NrX3lpZWxkLnBsCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5iNWFmN2MwOAotLS0gL2Rldi9udWxsCisr KyBiL2NvbnRyaWIvcGdfcHJld2FybS90LzAwMl9sb2NrX3lpZWxkLnBsCkBAIC0wLDAgKzEsMTUy IEBACisjIENvcHlyaWdodCAoYykgMjAyNS0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9w bWVudCBHcm91cAorIworIyBUZXN0IHRoYXQgcGdfcHJld2FybSB5aWVsZHMgaXRzIEFjY2Vzc1No YXJlTG9jayB3aGVuIGEgY29uZmxpY3RpbmcKKyMgRERMIG9wZXJhdGlvbiAoVFJVTkNBVEUsIERS T1AgVEFCTEUpIGlzIHdhaXRpbmcsIGFuZCB0aGF0IHBnX3ByZXdhcm0KKyMgcmVwb3J0cyBhbiBh cHByb3ByaWF0ZSBlcnJvciBhZnRlcndhcmRzLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdz IEZBVEFMID0+ICdhbGwnOworCit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQ b3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCitpZiAoJEVOVntlbmFi bGVfaW5qZWN0aW9uX3BvaW50c30gbmUgJ3llcycpCit7CisJcGxhbiBza2lwX2FsbCA9PiAnSW5q ZWN0aW9uIHBvaW50cyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQnOworfQorCitteSAkbm9k ZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbWFpbicpOworJG5vZGUtPmluaXQ7 Ciskbm9kZS0+c3RhcnQ7CisKK2lmICghJG5vZGUtPmNoZWNrX2V4dGVuc2lvbignaW5qZWN0aW9u X3BvaW50cycpKQoreworCXBsYW4gc2tpcF9hbGwgPT4gJ0V4dGVuc2lvbiBpbmplY3Rpb25fcG9p bnRzIG5vdCBpbnN0YWxsZWQnOworfQorCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHEo CisJQ1JFQVRFIEVYVEVOU0lPTiBwZ19wcmV3YXJtOworCUNSRUFURSBFWFRFTlNJT04gaW5qZWN0 aW9uX3BvaW50czsKKykpOworCisjIENyZWF0ZSB0YWJsZXMgbGFyZ2UgZW5vdWdoIHRvIHRyaWdn ZXIgdGhlIHdhaXRlciBjaGVjaworIyAoPiBQUkVXQVJNX1dBSVRFUl9DSEVDS19JTlRFUlZBTCA9 IDEwMjQgYmxvY2tzKS4KKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcSgKKwlDUkVBVEUg VEFCTEUgdHJ1bmNfdGVzdCBBUworCQlTRUxFQ1QgaSwgcmVwZWF0KCd4JywgMjAwKSBBUyBwYWRk aW5nCisJCUZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMDAwKSBpOworCUNSRUFURSBUQUJMRSBk cm9wX3Rlc3QgQVMKKwkJU0VMRUNUIGksIHJlcGVhdCgneCcsIDIwMCkgQVMgcGFkZGluZworCQlG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCA1MDAwMCkgaTsKKykpOworCitteSAkbmJsb2NrcyA9ICRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIHBnX3JlbGF0aW9uX3NpemUoJ3Ry dW5jX3Rlc3QnKSAvIGN1cnJlbnRfc2V0dGluZygnYmxvY2tfc2l6ZScpOjppbnQiKTsKK29rKCRu YmxvY2tzID4gMTAyNCwgInRydW5jX3Rlc3QgaGFzIG1vcmUgdGhhbiAxMDI0IGJsb2NrcyAoJG5i bG9ja3MpIik7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgMTogTm9ybWFsIHBnX3ByZXdhcm0gb24g YSBsYXJnZSB0YWJsZSB3aXRoIG5vIGNvbmZsaWN0aW5nIHdhaXRlcnMuCisjIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor bXkgJHJlc3VsdCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIHBnX3By ZXdhcm0oJ3RydW5jX3Rlc3QnLCAnYnVmZmVyJykiKTsKK2xpa2UoJHJlc3VsdCwgcXIvXlsxLTld WzAtOV0qJC8sICdwZ19wcmV3YXJtIGJ1ZmZlciBtb2RlIHN1Y2NlZWRzIG5vcm1hbGx5Jyk7CisK KyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisjIFRlc3QgMjogVFJVTkNBVEUgcHJvY2VlZHMgZHVyaW5nIHBnX3ByZXdh cm0uCisjCisjIHBnX3ByZXdhcm0gcGF1c2VzIGF0IHRoZSBpbmplY3Rpb24gcG9pbnQgd2hpbGUg aG9sZGluZyBBY2Nlc3NTaGFyZUxvY2suCisjIFRSVU5DQVRFIGJsb2NrcyB3YWl0aW5nIGZvciBB Y2Nlc3NFeGNsdXNpdmVMb2NrLiAgQWZ0ZXIgd2Ugd2FrZSB1cAorIyBwZ19wcmV3YXJtIGl0IGRl dGVjdHMgdGhlIHdhaXRlciwgeWllbGRzLCBhbmQgVFJVTkNBVEUgY29tcGxldGVzLgorIyBwZ19w cmV3YXJtIHRoZW4gZXJyb3JzIGJlY2F1c2UgdGhlIHJlbGF0aW9uIHdhcyB0cnVuY2F0ZWQuCisj IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJTRUxFQ1QgaW5qZWN0 aW9uX3BvaW50c19hdHRhY2goJ3BnX3ByZXdhcm0tYmVmb3JlLWNoZWNrLWFuZC15aWVsZCcsICd3 YWl0JykiKTsKKworbXkgJHByZXdhcm0gPSAkbm9kZS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3Jl cycsIG9uX2Vycm9yX3N0b3AgPT4gMCk7CiskcHJld2FybS0+cXVlcnlfdW50aWwocXIvc3RhcnRp bmdfcHJld2FybS8sIHEoCisJXGVjaG8gc3RhcnRpbmdfcHJld2FybQorCVNFTEVDVCBwZ19wcmV3 YXJtKCd0cnVuY190ZXN0JywgJ2J1ZmZlcicpOworKSk7CisKKyMgV2FpdCBmb3IgcGdfcHJld2Fy bSB0byBoaXQgdGhlIGluamVjdGlvbiBwb2ludC4KKyRub2RlLT5wb2xsX3F1ZXJ5X3VudGlsKCdw b3N0Z3JlcycsIHEoCisJU0VMRUNUIGNvdW50KCopID4gMCBGUk9NIHBnX3N0YXRfYWN0aXZpdHkK KwlXSEVSRSB3YWl0X2V2ZW50ID0gJ3BnX3ByZXdhcm0tYmVmb3JlLWNoZWNrLWFuZC15aWVsZCc7 CispLCAndCcpOworCisjIFN0YXJ0IFRSVU5DQVRFIGluIGEgc2Vjb25kIHNlc3Npb24g4oCUIGl0 IHdpbGwgYmxvY2sgb24gdGhlIGxvY2suCitteSAkdHJ1bmNhdGUgPSAkbm9kZS0+YmFja2dyb3Vu ZF9wc3FsKCdwb3N0Z3JlcycpOworJHRydW5jYXRlLT5xdWVyeV91bnRpbChxci9zdGFydGluZ190 cnVuY2F0ZS8sIHEoCisJXGVjaG8gc3RhcnRpbmdfdHJ1bmNhdGUKKwlUUlVOQ0FURSB0cnVuY190 ZXN0OworKSk7CisKKyMgQ29uZmlybSBUUlVOQ0FURSBpcyB3YWl0aW5nIGZvciBhIGxvY2suCisk bm9kZS0+cG9sbF9xdWVyeV91bnRpbCgncG9zdGdyZXMnLCBxKAorCVNFTEVDVCBjb3VudCgqKSA+ IDAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5CisJV0hFUkUgcXVlcnkgTElLRSAnJVRSVU5DQVRFIHRy dW5jX3Rlc3QlJworCUFORCB3YWl0X2V2ZW50X3R5cGUgPSAnTG9jayc7CispLCAndCcpOworCisj IERldGFjaCB0aGUgaW5qZWN0aW9uIHBvaW50IHNvIHBnX3ByZXdhcm0gd29uJ3QgcGF1c2UgYWdh aW4gYXQgdGhlCisjIG5leHQgY2hlY2sgaW50ZXJ2YWwsIHRoZW4gd2FrZSBpdCB1cC4KKyRub2Rl LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIGluamVjdGlvbl9wb2ludHNfZGV0YWNo KCdwZ19wcmV3YXJtLWJlZm9yZS1jaGVjay1hbmQteWllbGQnKSIpOworJG5vZGUtPnNhZmVfcHNx bCgncG9zdGdyZXMnLAorCSJTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c193YWtldXAoJ3BnX3ByZXdh cm0tYmVmb3JlLWNoZWNrLWFuZC15aWVsZCcpIik7CisKKyMgVFJVTkNBVEUgc2hvdWxkIG5vdyBj b21wbGV0ZSBiZWNhdXNlIHBnX3ByZXdhcm0geWllbGRlZCBpdHMgbG9jay4KKyR0cnVuY2F0ZS0+ cXVpdDsKK3Bhc3MoJ1RSVU5DQVRFIGNvbXBsZXRlZCBkdXJpbmcgcGdfcHJld2FybScpOworCisj IHBnX3ByZXdhcm0gc2hvdWxkIGhhdmUgcmVwb3J0ZWQgdGhhdCB0aGUgcmVsYXRpb24gd2FzIHRy dW5jYXRlZC4KKyRwcmV3YXJtLT5xdWl0OworbGlrZSgkcHJld2FybS0+e3N0ZGVycn0sCisJcXIv cmVsYXRpb24gd2FzIHRydW5jYXRlZCBkdXJpbmcgcGdfcHJld2FybS8sCisJJ3BnX3ByZXdhcm0g cmVwb3J0cyB0cnVuY2F0aW9uIGFmdGVyIFRSVU5DQVRFJyk7CisKKyMgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRl c3QgMzogRFJPUCBUQUJMRSBwcm9jZWVkcyBkdXJpbmcgcGdfcHJld2FybS4KKyMgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIlNFTEVDVCBpbmplY3Rpb25fcG9pbnRz X2F0dGFjaCgncGdfcHJld2FybS1iZWZvcmUtY2hlY2stYW5kLXlpZWxkJywgJ3dhaXQnKSIpOwor CitteSAkcHJld2FybTIgPSAkbm9kZS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3JlcycsIG9uX2Vy cm9yX3N0b3AgPT4gMCk7CiskcHJld2FybTItPnF1ZXJ5X3VudGlsKHFyL3N0YXJ0aW5nX3ByZXdh cm0vLCBxKAorCVxlY2hvIHN0YXJ0aW5nX3ByZXdhcm0KKwlTRUxFQ1QgcGdfcHJld2FybSgnZHJv cF90ZXN0JywgJ2J1ZmZlcicpOworKSk7CisKKyRub2RlLT5wb2xsX3F1ZXJ5X3VudGlsKCdwb3N0 Z3JlcycsIHEoCisJU0VMRUNUIGNvdW50KCopID4gMCBGUk9NIHBnX3N0YXRfYWN0aXZpdHkKKwlX SEVSRSB3YWl0X2V2ZW50ID0gJ3BnX3ByZXdhcm0tYmVmb3JlLWNoZWNrLWFuZC15aWVsZCc7Cisp LCAndCcpOworCitteSAkZHJvcCA9ICRub2RlLT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVzJyk7 CiskZHJvcC0+cXVlcnlfdW50aWwocXIvc3RhcnRpbmdfZHJvcC8sIHEoCisJXGVjaG8gc3RhcnRp bmdfZHJvcAorCURST1AgVEFCTEUgZHJvcF90ZXN0OworKSk7CisKKyRub2RlLT5wb2xsX3F1ZXJ5 X3VudGlsKCdwb3N0Z3JlcycsIHEoCisJU0VMRUNUIGNvdW50KCopID4gMCBGUk9NIHBnX3N0YXRf YWN0aXZpdHkKKwlXSEVSRSBxdWVyeSBMSUtFICclRFJPUCBUQUJMRSBkcm9wX3Rlc3QlJworCUFO RCB3YWl0X2V2ZW50X3R5cGUgPSAnTG9jayc7CispLCAndCcpOworCiskbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsCisJIlNFTEVDVCBpbmplY3Rpb25fcG9pbnRzX2RldGFjaCgncGdfcHJld2Fy bS1iZWZvcmUtY2hlY2stYW5kLXlpZWxkJykiKTsKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywKKwkiU0VMRUNUIGluamVjdGlvbl9wb2ludHNfd2FrZXVwKCdwZ19wcmV3YXJtLWJlZm9yZS1j aGVjay1hbmQteWllbGQnKSIpOworCiskZHJvcC0+cXVpdDsKK3Bhc3MoJ0RST1AgVEFCTEUgY29t cGxldGVkIGR1cmluZyBwZ19wcmV3YXJtJyk7CisKKyRwcmV3YXJtMi0+cXVpdDsKK2xpa2UoJHBy ZXdhcm0yLT57c3RkZXJyfSwKKwlxci9yZWxhdGlvbiB3YXMgZHJvcHBlZCBkdXJpbmcgcGdfcHJl d2FybS8sCisJJ3BnX3ByZXdhcm0gcmVwb3J0cyBkcm9wIGFmdGVyIERST1AgVEFCTEUnKTsKKwor JG5vZGUtPnN0b3A7Citkb25lX3Rlc3RpbmcoKTsK --0000000000009875d8064de001bb--