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 1w0R0Z-001txg-0e for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Mar 2026 21:22:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w0R0X-00Bskn-2E for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Mar 2026 21:22:22 +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 1w0R0X-00Bske-0r for pgsql-hackers@lists.postgresql.org; Wed, 11 Mar 2026 21:22:21 +0000 Received: from mail-dl1-x1233.google.com ([2607:f8b0:4864:20::1233]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w0R0U-00000002CNv-2u28 for pgsql-hackers@lists.postgresql.org; Wed, 11 Mar 2026 21:22:21 +0000 Received: by mail-dl1-x1233.google.com with SMTP id a92af1059eb24-12732165d1eso428978c88.1 for ; Wed, 11 Mar 2026 14:22:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773264136; cv=none; d=google.com; s=arc-20240605; b=k2caU3pIF0kdSGkZ1QJFxwvvwnQjGluH8usoAjpsPbSDTAWWCEowyLqIaQ8V+0LBgM 2fBWf5hsVOHAWW6Btg7+RImdNmGRw+9wTNOFboO9SEEmY3YFwDhF5Zh5CBoDyuhX6SV+ mQuxFb0xevamwusS19EIMH9BGvIwiHdW95HX2UPbBy0jsp5qMTSc6L8LW/RRb1PTY1gm OXh10wqjfo5WwbmBjIcOoLui5f8bAky9GbLGQhhyH05odHQLgxtzx32bbPeJ9+fUili7 PFAe/C0Ahck4n9FPRgIAoUol9HYWmTdF5fw1sZx5m9GD5YTliHgUV0v8UssFUdF+XUae rv6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:mime-version:from:dkim-signature; bh=vA2zj45PZBXP++BGu5Ezw3Kp8erH4lEE7e3GFN+aveQ=; fh=IFDNp7M6C0OC9lVw74S9lJvKBn+ZoR5d5hV3qc/qOrc=; b=CVyMir/gfBx2V6Wj2f+3piZi6gDotZ6MHU5OaB86SafHhJO3c6Aj6FqlJ8Xe5dwyfl WJqCfHg4y5m1cCpgcFWiGMnIPQKHddtspO2sheYk0aiW4ErEhFbnz1+67TGjYIFxf3h3 gzyK/9OtGgmeaQjV1MoHdpS4/eWXdMdrMQ49rqHQpBGy/TUipwiTPJrZShnFrVnQMR4T 6u+vXu4blUZ9IJhhu0NgUmP6tOe4i6eY3o3b7BAWn1r0AukahJFXzuryG08NwdLMTcfS IGW8EvJBK9yfpWsVz2AO86eOQWgKQ4f9cXbEq2HLI2HhoFVAhQWhwbvOcXhBa69pspB+ rszA==; 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=postgres.ai; s=google; t=1773264136; x=1773868936; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=vA2zj45PZBXP++BGu5Ezw3Kp8erH4lEE7e3GFN+aveQ=; b=am+pAZ/Hkx0679QM5NNSiri49BkXieP6+/dAkhhoBZe3G0kcHK1eqSj3/lB5IsHLtN 8OfF6ZYjLqS//mjofC9ggKSUUON3IPq+DhtraynTg5Z6GtJskCmlCD5eFHJR7WxuumHT e0G6jCXF4eWomF8A0QjjMmcVw9Ll5k/CHutnldwIkLiSOIMAC8wWmnR0Wlclbp06Sxbt axtgLd7+Zaqt42WuKqyXSkSAYAs7rwmynQmWvuXh+WbaonnCrZmGV7M0zxXmNx84ja09 gJw9Fn6HB6BBUfx41S+C+RFYrXeeZ0+h/Vk1us2vOxk4Niy6gVmyePoRGAyLNAvjk4uK mWSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773264136; x=1773868936; h=cc:to:subject:message-id:date:mime-version:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vA2zj45PZBXP++BGu5Ezw3Kp8erH4lEE7e3GFN+aveQ=; b=KPX/uHqF+PCw39YklWSjGYLycCYnIG/GUP/A4wtuiKKM0YjnLZ6i2OkYk2RlUcu4hF 5EuMIvmht6Hfgpi/pn+DoFkRor2OkRuBuDHGl0ONb2JHukhGoytgRroypWGV3Tr0ZF4r UlcOUiEF8kumrzxQs2iwrwf61XgJukYz2l7Ayc9vZvsk8LuizKr0FjROkMklF+tND6Q4 15QVdNTo8KTKRejOvgLtC7gYqW+jBTXbZ+xdb6MGlozOS4W7KGbDMDmhOy0k/FTCeZu5 FiOE7/YroBTiiYBt4F/PT50/C7Ts1Qw7jt6cHr0tO6twX2+YBuMi3WS5hMafHEDm/mTa dC/A== X-Gm-Message-State: AOJu0YzLbTRb2E5+0F4BjfzGQ/i/E0dYAsUFAcXIoyTzUiJUTd1Bwy7N ORaXE/lxWdM/V4aYmv5cftzXQDOCquduFTReqY3z1HACshLoINBJ1FyW1JnTa651KqCqiBHzkcH RSDNgRebtsJELhHi4ZhyhdnTvTNX77yGiOrGM5vmez7uQSzcoBDjofoE2BA== X-Gm-Gg: ATEYQzySjLOBxbv9L5ByjPq2ifJS6+dwja8gCkkUXOLo2/ZWPRNaAALgGOqsS5xvfOS 88reXRqhU+rgm7Jm9QmJH7PfcLQzbq7EI3ylEYICq3HX1ZjZEKu1cW+xNrOuZ3jxtERxdjlbIeW 2XDpeOgyqpvJUbK4ATiTJTg30eYTBe+4OB8u26qdX8kDuba7rciK6hPBpHAtk5/p4Z4w/xelg9f qvgVKHzLz7rfa5Wit687To6kjBetkrH2H9FvsifHNhgBxPJcX/RBaWTLWap/1Q75aDHmyCKY2SU fsHEXTaDRJljcMAc X-Received: by 2002:a05:7022:223:b0:128:cf9b:c0b with SMTP id a92af1059eb24-128e75fa578mr1762874c88.0.1773264135861; Wed, 11 Mar 2026 14:22:15 -0700 (PDT) Received: from 307454771367 named unknown by gmailapi.google.com with HTTPREST; Wed, 11 Mar 2026 21:22:14 +0000 Received: from 307454771367 named unknown by gmailapi.google.com with HTTPREST; Wed, 11 Mar 2026 21:22:14 +0000 From: nik@postgres.ai MIME-Version: 1.0 Date: Wed, 11 Mar 2026 21:22:14 +0000 X-Gm-Features: AaiRm52H77gvoMEK2rCO5z2sESk1qROkZaUgmfiPN8geX_AjPSOoOq5hlMPqc8s Message-ID: Subject: =?UTF-8?Q?=5BPATCH_v1=5D_command=5Ftag=5Fformat_=E2=80=94_protocol=2Dlevel_com?= =?UTF-8?Q?mand_tag_negotiation_via_=5Fpq=5F?= To: pgsql-hackers@lists.postgresql.org Cc: wolakk@gmail.com, amborodin86@gmail.com Content-Type: multipart/mixed; boundary="000000000000e9c79e064cc63ab0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e9c79e064cc63ab0 Content-Type: text/plain; charset="UTF-8" Hi hackers, PostgreSQL has had a protocol feature negotiation framework since 7.4 (the _pq_ namespace in startup parameters) -- over 20 years -- but it's never been used in practice. During a recent "hacking Postgres" session with Andrey Borodin and Kirk Wolak [1], we drafted a proof-of-concept that puts _pq_ to real use. One thing that keeps coming up is confusion around INSERT's command tag: "INSERT 0 1" -- what is that zero? [2][3] It's a vestigial OID field, hardcoded to zero since PG12 dropped table OIDs. We can't change the default without breaking every existing client (libpq's PQcmdTuples hardcodes the "INSERT oid count" pattern), but protocol negotiation could solve this cleanly. There are also cases where seeing the table name in the command tag would be genuinely useful -- for example, when restoring from a dump with many tables, it helps to see which table is receiving INSERTs at any given moment. The attached patch (not meant to be taken as-is, just to raise discussion) implements protocol-level command tag negotiation via _pq_.command_tag_format. The client sends it in the startup packet and gets one of three formats: legacy - INSERT 0 N (default, fully backward compatible) verbose - INSERT tablename N fqn - INSERT schema.tablename N The GUC is PGC_INTERNAL (cannot be changed via SET or options=-c), stored in a separate Port field, and applied via PGC_S_OVERRIDE after GUC init. Old clients always get legacy. New clients connecting to old servers have _pq_ silently ignored. Test results with stock PG17 psql (old client) and a Python script that sends raw _pq_ startup packets (also attached): Old PG17 psql, default -> INSERT 0 1 (safe) Old PG17 psql, options=-c -> FATAL: cannot be changed (blocked) Old PG17 psql, SET -> ERROR: cannot be changed (blocked) _pq_ verbose -> INSERT proto_test 1 (works) _pq_ fqn -> INSERT public.proto_test 1 (works) _pq_ not sent -> INSERT 0 1 (legacy default) Does this all make sense? Is it worth thinking further in this direction? [1] https://www.youtube.com/watch?v=VKuxQZlvd8E [2] https://www.linkedin.com/posts/l%C3%A6titia-avrot_postgresql-database-backend-activity-7431694565855617024-Lb1u [3] https://mydbanotebook.org/posts/what-does-insert-0-1-actually-tell-you/ -- Nik --000000000000e9c79e064cc63ab0 Content-Type: text/x-patch; charset="utf-8"; name="v1-0001-Add-command_tag_format-protocol-negotiation.patch" Content-Disposition: attachment; filename="v1-0001-Add-command_tag_format-protocol-negotiation.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: 78606d82288c3308_0.1 RnJvbSBhNzY3YTI3MjA5YTVkYWUwZmRiMGFiNTlkNTI4YjE4OGQyN2FkODEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtvbGF5IFNhbW9raHZhbG92IDxuaWtAcG9zdGdyZXMuYWk+ CkRhdGU6IFdlZCwgMTEgTWFyIDIwMjYgMjA6NTc6MjQgKzAwMDAKU3ViamVjdDogW1BBVENIXSBB ZGQgY29tbWFuZF90YWdfZm9ybWF0IHByb3RvY29sLWxldmVsIG5lZ290aWF0aW9uCgpBZGQgYSBu ZXcgcHJvdG9jb2wtbGV2ZWwgb3B0aW9uIF9wcV8uY29tbWFuZF90YWdfZm9ybWF0IHRoYXQgYWxs b3dzCmNsaWVudHMgdG8gbmVnb3RpYXRlIHJpY2hlciBjb21tYW5kIGNvbXBsZXRpb24gdGFncyBh dCBjb25uZWN0aW9uIHRpbWUuCgpUaGUgSU5TRVJUIGNvbW1hbmQgY29tcGxldGlvbiB0YWcgaGFz IGNhcnJpZWQgYSB2ZXN0aWdpYWwgT0lEIGZpZWxkCnNpbmNlIFBvc3RncmVTUUwgMTIgZHJvcHBl ZCBzdXBwb3J0IGZvciB0YWJsZSBPSURzOiBJTlNFUlQgYWx3YXlzCnJldHVybnMgJ0lOU0VSVCAw IE4nIHdoZXJlIHRoZSAnMCcgaXMgbWVhbmluZ2xlc3MuICBDaGFuZ2luZyB0aGlzCmluIHRoZSBk ZWZhdWx0IHdpcmUgZm9ybWF0IHdvdWxkIGJyZWFrIGV4aXN0aW5nIGNsaWVudHMsIHNpbmNlCmxp YnBxJ3MgUFFjbWRUdXBsZXMoKSBoYXJkY29kZXMgdGhlICdJTlNFUlQgb2lkIGNvdW50JyBwYXJz ZSBwYXR0ZXJuLgoKVGhpcyBwYXRjaCBhZGRzIHByb3RvY29sLWxldmVsIG5lZ290aWF0aW9uIHZp YSBfcHFfLmNvbW1hbmRfdGFnX2Zvcm1hdAppbiB0aGUgc3RhcnR1cCBwYWNrZXQsIHdpdGggdGhy ZWUgbW9kZXM6CgogIGxlZ2FjeSAgLSBJTlNFUlQgMCBOICAoZGVmYXVsdCwgZnVsbHkgYmFja3dh cmQgY29tcGF0aWJsZSkKICB2ZXJib3NlIC0gSU5TRVJUIHRhYmxlbmFtZSBOCiAgZnFuICAgICAt IElOU0VSVCBzY2hlbWEudGFibGVuYW1lIE4KClRoZSB2ZXJib3NlIGFuZCBmcW4gbW9kZXMgYWxz byBwb3B1bGF0ZSByZWxhdGlvbiBuYW1lcyBmb3IgVVBEQVRFLApERUxFVEUsIGFuZCBNRVJHRSBj b21tYW5kIHRhZ3MuCgpUaGUgR1VDIGlzIHJlZ2lzdGVyZWQgYXMgUEdDX0lOVEVSTkFMIHdpdGgg R1VDX1JFUE9SVCwgZW5zdXJpbmc6CgogIC0gT2xkIGNsaWVudHMgdGhhdCBkb24ndCBzZW5kIF9w cV8uY29tbWFuZF90YWdfZm9ybWF0IGFsd2F5cyBnZXQKICAgIHRoZSBsZWdhY3kgZm9ybWF0ICh6 ZXJvIGJyZWFrYWdlKQogIC0gTmV3IGNsaWVudHMgY29ubmVjdGluZyB0byBvbGQgc2VydmVycyBo YXZlIF9wcV8gc2lsZW50bHkgaWdub3JlZAogIC0gU0VULCBvcHRpb25zPS1jLCBBTFRFUiBTWVNU RU0sIGFuZCBwb3N0Z3Jlc3FsLmNvbmYgY2Fubm90IGNoYW5nZQogICAgdGhlIGZvcm1hdCAob25s eSB0aGUgX3BxXyBzdGFydHVwIHBhY2tldCBwYXRoIHdvcmtzKQogIC0gVGhlIHNlcnZlciBhdXRv LXJlcG9ydHMgdGhlIG5lZ290aWF0ZWQgZm9ybWF0IHRvIHRoZSBjbGllbnQKCkltcGxlbWVudGF0 aW9uIGRldGFpbHM6CgogIC0gVGhlIF9wcV8gaGFuZGxlciBpbiBQcm9jZXNzU3RhcnR1cFBhY2tl dCgpIHN0b3JlcyB0aGUgcmVxdWVzdGVkCiAgICBmb3JtYXQgaW4gYSBuZXcgUG9ydCBmaWVsZCAo cHFfY29tbWFuZF90YWdfZm9ybWF0KSwgc2VwYXJhdGUgZnJvbQogICAgZ3VjX29wdGlvbnMsIHRv IHByZXZlbnQgdGhlIHJlZ3VsYXIgR1VDIHBhdGggZnJvbSBzZXR0aW5nIGl0CiAgLSBUaGUgdmFs dWUgaXMgYXBwbGllZCBpbiBwcm9jZXNzX3N0YXJ0dXBfb3B0aW9ucygpIGFmdGVyIG5vcm1hbAog ICAgR1VDIGluaXRpYWxpemF0aW9uIHZpYSBTZXRDb25maWdPcHRpb24oUEdDX0lOVEVSTkFMLCBQ R0NfU19PVkVSUklERSkKICAtIFF1ZXJ5Q29tcGxldGlvbiBpcyBleHRlbmRlZCB3aXRoIHJlbG5h bWUvbnNwbmFtZSBmaWVsZHMsIHBvcHVsYXRlZAogICAgZnJvbSB0aGUgZXhlY3V0b3IncyBSZXN1 bHRSZWxJbmZvIGFmdGVyIHF1ZXJ5IGNvbXBsZXRpb24KICAtIEJ1aWxkUXVlcnlDb21wbGV0aW9u U3RyaW5nKCkgZm9ybWF0cyB0aGUgdGFnIGJhc2VkIG9uIHRoZQogICAgbmVnb3RpYXRlZCBtb2Rl CiAgLSBObyBjaGFuZ2VzIHRvIGxpYnBxIChmZS1leGVjLmMpIC0tIG9sZCBwcm90b2NvbCBpcyB1 bnRvdWNoZWQKCkRpc2N1c3Npb246IChub25lIHlldCkKLS0tCiBzcmMvYmFja2VuZC90Y29wL2Jh Y2tlbmRfc3RhcnR1cC5jICAgICAgICB8IDIyICsrKysrKysrKystLS0tCiBzcmMvYmFja2VuZC90 Y29wL2NtZHRhZy5jICAgICAgICAgICAgICAgICB8IDM1ICsrKysrKysrKysrKysrKysrKysrKy0t CiBzcmMvYmFja2VuZC90Y29wL3BxdWVyeS5jICAgICAgICAgICAgICAgICB8IDI0ICsrKysrKysr KysrKysrKysKIHNyYy9iYWNrZW5kL3V0aWxzL2luaXQvcG9zdGluaXQuYyAgICAgICAgIHwgMTEg KysrKysrKwogc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfcGFyYW1ldGVycy5kYXQgfCAxMCAr KysrKysrCiBzcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyAgICAgICB8ICA4ICsr KysrKwogc3JjL2luY2x1ZGUvbGlicHEvbGlicHEtYmUuaCAgICAgICAgICAgICAgfCAgMyArKwog c3JjL2luY2x1ZGUvdGNvcC9jbWR0YWcuaCAgICAgICAgICAgICAgICAgfCAgOSArKysrKysKIDgg ZmlsZXMgY2hhbmdlZCwgMTE1IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9iYWNrZW5kX3N0YXJ0dXAuYyBiL3NyYy9iYWNrZW5kL3Rj b3AvYmFja2VuZF9zdGFydHVwLmMKaW5kZXggYzUxNzExNTkyN2MuLmZmMWQ2MjBjZjM3IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC90Y29wL2JhY2tlbmRfc3RhcnR1cC5jCisrKyBiL3NyYy9iYWNr ZW5kL3Rjb3AvYmFja2VuZF9zdGFydHVwLmMKQEAgLTc3OCwxMiArNzc4LDI0IEBAIFByb2Nlc3NT dGFydHVwUGFja2V0KFBvcnQgKnBvcnQsIGJvb2wgc3NsX2RvbmUsIGJvb2wgZ3NzX2RvbmUpCiAJ CQllbHNlIGlmIChzdHJuY21wKG5hbWVwdHIsICJfcHFfLiIsIDUpID09IDApCiAJCQl7CiAJCQkJ LyoKLQkJCQkgKiBBbnkgb3B0aW9uIGJlZ2lubmluZyB3aXRoIF9wcV8uIGlzIHJlc2VydmVkIGZv ciB1c2UgYXMgYQotCQkJCSAqIHByb3RvY29sLWxldmVsIG9wdGlvbiwgYnV0IGF0IHByZXNlbnQg bm8gc3VjaCBvcHRpb25zIGFyZQotCQkJCSAqIGRlZmluZWQuCisJCQkJICogT3B0aW9ucyBiZWdp bm5pbmcgd2l0aCBfcHFfLiBhcmUgcHJvdG9jb2wtbGV2ZWwgb3B0aW9ucy4KKwkJCQkgKiBSZWNv Z25pemVkIG9wdGlvbnMgYXJlIG1hcHBlZCB0byB0aGVpciBjb3JyZXNwb25kaW5nIEdVQ3MuCiAJ CQkJICovCi0JCQkJdW5yZWNvZ25pemVkX3Byb3RvY29sX29wdGlvbnMgPQotCQkJCQlsYXBwZW5k KHVucmVjb2duaXplZF9wcm90b2NvbF9vcHRpb25zLCBwc3RyZHVwKG5hbWVwdHIpKTsKKwkJCQlp ZiAoc3RyY21wKG5hbWVwdHIsICJfcHFfLmNvbW1hbmRfdGFnX2Zvcm1hdCIpID09IDApCisJCQkJ eworCQkJCQkvKgorCQkJCQkgKiBQcm90b2NvbC1sZXZlbCBvcHRpb246IHN0b3JlIGZvciBkZWZl cnJlZCBhcHBsaWNhdGlvbgorCQkJCQkgKiBpbiBwcm9jZXNzX3N0YXJ0dXBfb3B0aW9ucygpIGFm dGVyIEdVQyBpbml0LiAgVGhpcworCQkJCQkgKiBpcyBOT1QgYWRkZWQgdG8gZ3VjX29wdGlvbnMg c28gdGhhdCBvbGQtc3R5bGUKKwkJCQkJICogb3B0aW9ucz0tYyBjYW5ub3Qgc2V0IGl0IChHVUMg aXMgUEdDX0lOVEVSTkFMKS4KKwkJCQkJICovCisJCQkJCXBvcnQtPnBxX2NvbW1hbmRfdGFnX2Zv cm1hdCA9IHBzdHJkdXAodmFscHRyKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdW5y ZWNvZ25pemVkX3Byb3RvY29sX29wdGlvbnMgPQorCQkJCQkJbGFwcGVuZCh1bnJlY29nbml6ZWRf cHJvdG9jb2xfb3B0aW9ucywgcHN0cmR1cChuYW1lcHRyKSk7CisJCQkJfQogCQkJfQogCQkJZWxz ZQogCQkJewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9jbWR0YWcuYyBiL3NyYy9iYWNr ZW5kL3Rjb3AvY21kdGFnLmMKaW5kZXggZDM4ZDViMzkwYjkuLjlmZTUxMzE1MGY5IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC90Y29wL2NtZHRhZy5jCisrKyBiL3NyYy9iYWNrZW5kL3Rjb3AvY21k dGFnLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5jbHVk ZSAidGNvcC9jbWR0YWcuaCIKKyNpbmNsdWRlICJ1dGlscy9ndWMuaCIKICNpbmNsdWRlICJ1dGls cy9idWlsdGlucy5oIgogCiAKQEAgLTM2LDExICszNywxNiBAQCBzdGF0aWMgY29uc3QgQ29tbWFu ZFRhZ0JlaGF2aW9yIHRhZ19iZWhhdmlvcltdID0gewogCiAjdW5kZWYgUEdfQ01EVEFHCiAKKy8q IEdVQyB2YXJpYWJsZTogY29tbWFuZCB0YWcgZm9ybWF0IHN0eWxlICovCitpbnQJCWNvbW1hbmRf dGFnX2Zvcm1hdCA9IENPTU1BTkRfVEFHX0ZPUk1BVF9MRUdBQ1k7CisKIHZvaWQKIEluaXRpYWxp emVRdWVyeUNvbXBsZXRpb24oUXVlcnlDb21wbGV0aW9uICpxYykKIHsKIAlxYy0+Y29tbWFuZFRh ZyA9IENNRFRBR19VTktOT1dOOwogCXFjLT5ucHJvY2Vzc2VkID0gMDsKKwlxYy0+cmVsbmFtZSA9 IE5VTEw7CisJcWMtPm5zcG5hbWUgPSBOVUxMOwogfQogCiBjb25zdCBjaGFyICoKQEAgLTE0Nyw4 ICsxNTMsMzMgQEAgQnVpbGRRdWVyeUNvbXBsZXRpb25TdHJpbmcoY2hhciAqYnVmZiwgY29uc3Qg UXVlcnlDb21wbGV0aW9uICpxYywKIAl7CiAJCWlmICh0YWcgPT0gQ01EVEFHX0lOU0VSVCkKIAkJ ewotCQkJKmJ1ZnArKyA9ICcgJzsKLQkJCSpidWZwKysgPSAnMCc7CisJCQlpZiAoY29tbWFuZF90 YWdfZm9ybWF0ID09IENPTU1BTkRfVEFHX0ZPUk1BVF9MRUdBQ1kpCisJCQl7CisJCQkJLyogTGVn YWN5OiBJTlNFUlQgMCBOICovCisJCQkJKmJ1ZnArKyA9ICcgJzsKKwkJCQkqYnVmcCsrID0gJzAn OworCQkJfQorCQkJZWxzZSBpZiAoKGNvbW1hbmRfdGFnX2Zvcm1hdCA9PSBDT01NQU5EX1RBR19G T1JNQVRfVkVSQk9TRSB8fAorCQkJCQkgIGNvbW1hbmRfdGFnX2Zvcm1hdCA9PSBDT01NQU5EX1RB R19GT1JNQVRfRlFOKSAmJgorCQkJCQkgcWMtPnJlbG5hbWUgIT0gTlVMTCkKKwkJCXsKKwkJCQkv KiBWZXJib3NlL0ZRTjogSU5TRVJUIFtzY2hlbWEuXXRhYmxlIE4gKi8KKwkJCQkqYnVmcCsrID0g JyAnOworCQkJCWlmIChjb21tYW5kX3RhZ19mb3JtYXQgPT0gQ09NTUFORF9UQUdfRk9STUFUX0ZR TiAmJgorCQkJCQlxYy0+bnNwbmFtZSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJU2l6ZSBuc3BsZW4g PSBzdHJsZW4ocWMtPm5zcG5hbWUpOworCQkJCQltZW1jcHkoYnVmcCwgcWMtPm5zcG5hbWUsIG5z cGxlbik7CisJCQkJCWJ1ZnAgKz0gbnNwbGVuOworCQkJCQkqYnVmcCsrID0gJy4nOworCQkJCX0K KwkJCQl7CisJCQkJCVNpemUgcmVsbGVuID0gc3RybGVuKHFjLT5yZWxuYW1lKTsKKwkJCQkJbWVt Y3B5KGJ1ZnAsIHFjLT5yZWxuYW1lLCByZWxsZW4pOworCQkJCQlidWZwICs9IHJlbGxlbjsKKwkJ CQl9CisJCQl9CisJCQkvKiBNb2Rlcm46IElOU0VSVCBOIChub3RoaW5nIGV4dHJhIGJlZm9yZSBj b3VudCkgKi8KIAkJfQogCQkqYnVmcCsrID0gJyAnOwogCQlidWZwICs9IHBnX3VsbHRvYV9uKHFj LT5ucHJvY2Vzc2VkLCBidWZwKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Rjb3AvcHF1ZXJ5 LmMgYi9zcmMvYmFja2VuZC90Y29wL3BxdWVyeS5jCmluZGV4IGQ4ZmM3NWQwYmI5Li5hMWU4MTJm OTMyNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC9wcXVlcnkuYworKysgYi9zcmMvYmFj a2VuZC90Y29wL3BxdWVyeS5jCkBAIC0yNiw2ICsyNiw5IEBACiAjaW5jbHVkZSAidGNvcC9wcXVl cnkuaCIKICNpbmNsdWRlICJ0Y29wL3V0aWxpdHkuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGls cy5oIgorI2luY2x1ZGUgImNhdGFsb2cvbmFtZXNwYWNlLmgiCisjaW5jbHVkZSAidXRpbHMvcmVs LmgiCisjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvc25hcG1n ci5oIgogCiAKQEAgLTE4MSw2ICsxODQsMjcgQEAgUHJvY2Vzc1F1ZXJ5KFBsYW5uZWRTdG10ICpw bGFuLAogCQkJdGFnID0gQ01EVEFHX1VOS05PV047CiAKIAkJU2V0UXVlcnlDb21wbGV0aW9uKHFj LCB0YWcsIHF1ZXJ5RGVzYy0+ZXN0YXRlLT5lc19wcm9jZXNzZWQpOworCisJCS8qIEZvciB2ZXJi b3NlL0ZRTiBjb21tYW5kIHRhZ3MsIGF0dGFjaCByZWxhdGlvbiBpbmZvIGZvciBETUwgKi8KKwkJ aWYgKGNvbW1hbmRfdGFnX2Zvcm1hdCA+PSBDT01NQU5EX1RBR19GT1JNQVRfVkVSQk9TRSAmJgor CQkJKHRhZyA9PSBDTURUQUdfSU5TRVJUIHx8IHRhZyA9PSBDTURUQUdfVVBEQVRFIHx8CisJCQkg dGFnID09IENNRFRBR19ERUxFVEUgfHwgdGFnID09IENNRFRBR19NRVJHRSkgJiYKKwkJCXF1ZXJ5 RGVzYy0+cGxhbm5lZHN0bXQgIT0gTlVMTCAmJgorCQkJcXVlcnlEZXNjLT5wbGFubmVkc3RtdC0+ cmVzdWx0UmVsYXRpb25zICE9IE5JTCAmJgorCQkJcXVlcnlEZXNjLT5lc3RhdGUtPmVzX3Jlc3Vs dF9yZWxhdGlvbnMgIT0gTlVMTCkKKwkJeworCQkJaW50IHJpX2luZGV4ID0gbGluaXRpYWxfaW50 KHF1ZXJ5RGVzYy0+cGxhbm5lZHN0bXQtPnJlc3VsdFJlbGF0aW9ucykgLSAxOworCQkJaWYgKHJp X2luZGV4ID49IDAgJiYKKwkJCQlyaV9pbmRleCA8IChpbnQpIHF1ZXJ5RGVzYy0+ZXN0YXRlLT5l c19yYW5nZV90YWJsZV9zaXplICYmCisJCQkJcXVlcnlEZXNjLT5lc3RhdGUtPmVzX3Jlc3VsdF9y ZWxhdGlvbnNbcmlfaW5kZXhdICE9IE5VTEwgJiYKKwkJCQlxdWVyeURlc2MtPmVzdGF0ZS0+ZXNf cmVzdWx0X3JlbGF0aW9uc1tyaV9pbmRleF0tPnJpX1JlbGF0aW9uRGVzYyAhPSBOVUxMKQorCQkJ eworCQkJCVJlc3VsdFJlbEluZm8gKnJyaSA9IHF1ZXJ5RGVzYy0+ZXN0YXRlLT5lc19yZXN1bHRf cmVsYXRpb25zW3JpX2luZGV4XTsKKwkJCQlxYy0+cmVsbmFtZSA9IFJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKHJyaS0+cmlfUmVsYXRpb25EZXNjKTsKKwkJCQlxYy0+bnNwbmFtZSA9IGdldF9uYW1l c3BhY2VfbmFtZSgKKwkJCQkJUmVsYXRpb25HZXROYW1lc3BhY2UocnJpLT5yaV9SZWxhdGlvbkRl c2MpKTsKKwkJCX0KKwkJfQogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9pbml0L3Bvc3Rpbml0LmMgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L3Bvc3Rpbml0LmMKaW5k ZXggYjU5ZTA4NjA1Y2MuLjYzNjI2NDAwNzFiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGls cy9pbml0L3Bvc3Rpbml0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5pdC5j CkBAIC0xMzA5LDYgKzEzMDksMTcgQEAgcHJvY2Vzc19zdGFydHVwX29wdGlvbnMoUG9ydCAqcG9y dCwgYm9vbCBhbV9zdXBlcnVzZXIpCiAKIAkJU2V0Q29uZmlnT3B0aW9uKG5hbWUsIHZhbHVlLCBn dWNjdHgsIFBHQ19TX0NMSUVOVCk7CiAJfQorCisJLyoKKwkgKiBBcHBseSBwcm90b2NvbC1uZWdv dGlhdGVkIG9wdGlvbnMuICBUaGVzZSB1c2UgUEdDX0lOVEVSTkFMIGNvbnRleHQKKwkgKiB3aXRo IFBHQ19TX09WRVJSSURFIHNvdXJjZSwgc28gdGhleSBieXBhc3MgdGhlIG5vcm1hbCBHVUMgYWNj ZXNzCisJICogY29udHJvbHMuICBUaGlzIGVuc3VyZXMgb25seSB0aGUgX3BxXyBwcm90b2NvbCBw YXRoIGNhbiBzZXQgdGhlbTsKKwkgKiBTRVQgYW5kIG9wdGlvbnM9LWMgYXJlIGJsb2NrZWQgYnkg UEdDX0lOVEVSTkFMLgorCSAqLworCWlmIChwb3J0LT5wcV9jb21tYW5kX3RhZ19mb3JtYXQgIT0g TlVMTCkKKwkJU2V0Q29uZmlnT3B0aW9uKCJjb21tYW5kX3RhZ19mb3JtYXQiLAorCQkJCQkJcG9y dC0+cHFfY29tbWFuZF90YWdfZm9ybWF0LAorCQkJCQkJUEdDX0lOVEVSTkFMLCBQR0NfU19PVkVS UklERSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y19w YXJhbWV0ZXJzLmRhdCBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3BhcmFtZXRlcnMuZGF0 CmluZGV4IGE1YTBlZGYyNTM0Li45ZTgzOWM4ZjQ1NCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv dXRpbHMvbWlzYy9ndWNfcGFyYW1ldGVycy5kYXQKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfcGFyYW1ldGVycy5kYXQKQEAgLTQzNCw2ICs0MzQsMTYgQEAKICAgY2hlY2tfaG9vayA9 PiAnY2hlY2tfY2x1c3Rlcl9uYW1lJywKIH0sCiAKKworeyBuYW1lID0+ICdjb21tYW5kX3RhZ19m b3JtYXQnLCB0eXBlID0+ICdlbnVtJywgY29udGV4dCA9PiAnUEdDX0lOVEVSTkFMJywgZ3JvdXAg PT4gJ0NMSUVOVF9DT05OX1NUQVRFTUVOVCcsCisgIHNob3J0X2Rlc2MgPT4gJ0NvbnRyb2xzIHRo ZSBmb3JtYXQgb2YgSU5TRVJUIGNvbW1hbmQgY29tcGxldGlvbiB0YWdzLicsCisgIGxvbmdfZGVz YyA9PiAnbGVnYWN5OiBJTlNFUlQgMCBOIChkZWZhdWx0LCBiYWNrd2FyZCBjb21wYXRpYmxlKS4g dmVyYm9zZTogSU5TRVJUIHRhYmxlbmFtZSBOLiBmcW46IElOU0VSVCBzY2hlbWEudGFibGVuYW1l IE4uIENhbiBiZSBzZXQgdmlhIF9wcV8uY29tbWFuZF90YWdfZm9ybWF0IHN0YXJ0dXAgcGFyYW1l dGVyIGZvciBwcm90b2NvbC1sZXZlbCBuZWdvdGlhdGlvbi4nLAorICBmbGFncyA9PiAnR1VDX1JF UE9SVCcsCisgIHZhcmlhYmxlID0+ICdjb21tYW5kX3RhZ19mb3JtYXQnLAorICBib290X3ZhbCA9 PiAnQ09NTUFORF9UQUdfRk9STUFUX0xFR0FDWScsCisgIG9wdGlvbnMgPT4gJ2NvbW1hbmRfdGFn X2Zvcm1hdF9vcHRpb25zJywKKyAgaW5jbHVkZXMgPT4gJ3Rjb3AvY21kdGFnLmgnLAorfSwKICMg d2UgaGF2ZSBubyBtaWNyb3NlY29uZHMgZGVzaWduYXRpb24sIHNvIGNhbid0IHN1cHBseSB1bml0 cyBoZXJlCiB7IG5hbWUgPT4gJ2NvbW1pdF9kZWxheScsIHR5cGUgPT4gJ2ludCcsIGNvbnRleHQg PT4gJ1BHQ19TVVNFVCcsIGdyb3VwID0+ICdXQUxfU0VUVElOR1MnLAogICBzaG9ydF9kZXNjID0+ ICdTZXRzIHRoZSBkZWxheSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiB0cmFuc2FjdGlvbiBjb21t aXQgYW5kIGZsdXNoaW5nIFdBTCB0byBkaXNrLicsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxl cy5jCmluZGV4IDM4YWFmODJmMTIwLi4zMGU3YjE0Y2FkZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9n dWNfdGFibGVzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogI2luY2x1 ZGUgInBvc3RncmVzLmgiCisjaW5jbHVkZSAidGNvcC9jbWR0YWcuaCIKIAogI2lmZGVmIEhBVkVf Q09QWUZJTEVfSAogI2luY2x1ZGUgPGNvcHlmaWxlLmg+CkBAIC0xNDgsNiArMTQ5LDEzIEBAIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2VudW1fZW50cnkgY2xpZW50X21lc3NhZ2VfbGV2ZWxf b3B0aW9uc1tdID0gewogCXtOVUxMLCAwLCBmYWxzZX0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgY29uZmlnX2VudW1fZW50cnkgY29tbWFuZF90YWdfZm9ybWF0X29wdGlvbnNbXSA9IHsKKwl7 ImxlZ2FjeSIsIDAsIGZhbHNlfSwKKwl7InZlcmJvc2UiLCAxLCBmYWxzZX0sCisJeyJmcW4iLCAy LCBmYWxzZX0sCisJe05VTEwsIDAsIGZhbHNlfQorfTsKKwogY29uc3Qgc3RydWN0IGNvbmZpZ19l bnVtX2VudHJ5IHNlcnZlcl9tZXNzYWdlX2xldmVsX29wdGlvbnNbXSA9IHsKIAl7ImRlYnVnNSIs IERFQlVHNSwgZmFsc2V9LAogCXsiZGVidWc0IiwgREVCVUc0LCBmYWxzZX0sCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9saWJwcS9saWJwcS1iZS5oIGIvc3JjL2luY2x1ZGUvbGlicHEvbGlicHEt YmUuaAppbmRleCA5MjFiMmRhYTRmZi4uNTY1YmM0OWZjZjMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL2xpYnBxL2xpYnBxLWJlLmgKKysrIGIvc3JjL2luY2x1ZGUvbGlicHEvbGlicHEtYmUuaApA QCAtMTUyLDYgKzE1Miw5IEBAIHR5cGVkZWYgc3RydWN0IFBvcnQKIAljaGFyCSAgICpjbWRsaW5l X29wdGlvbnM7CiAJTGlzdAkgICAqZ3VjX29wdGlvbnM7CiAKKwkvKiBQcm90b2NvbC1uZWdvdGlh dGVkIGNvbW1hbmQgdGFnIGZvcm1hdCAoZnJvbSBfcHFfLmNvbW1hbmRfdGFnX2Zvcm1hdCkgKi8K KwljaGFyCSAgICpwcV9jb21tYW5kX3RhZ19mb3JtYXQ7CisKIAkvKgogCSAqIFRoZSBzdGFydHVw IHBhY2tldCBhcHBsaWNhdGlvbiBuYW1lLCBvbmx5IHVzZWQgaGVyZSBmb3IgdGhlICJjb25uZWN0 aW9uCiAJICogYXV0aG9yaXplZCIgbG9nIG1lc3NhZ2UuIFdlIHNob3VsZG4ndCB1c2UgdGhpcyBw b3N0LXN0YXJ0dXAsIGluc3RlYWQKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Rjb3AvY21kdGFn LmggYi9zcmMvaW5jbHVkZS90Y29wL2NtZHRhZy5oCmluZGV4IGNmMmU4N2I5OGYzLi5lYWY4NjRm N2E3NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdGNvcC9jbWR0YWcuaAorKysgYi9zcmMvaW5j bHVkZS90Y29wL2NtZHRhZy5oCkBAIC0zMCw2ICszMCw4IEBAIHR5cGVkZWYgc3RydWN0IFF1ZXJ5 Q29tcGxldGlvbgogewogCUNvbW1hbmRUYWcJY29tbWFuZFRhZzsKIAl1aW50NjQJCW5wcm9jZXNz ZWQ7CisJY29uc3QgY2hhciAqcmVsbmFtZTsJCS8qIHJlbGF0aW9uIG5hbWUgZm9yIHZlcmJvc2Ug Y29tbWFuZCB0YWdzICovCisJY29uc3QgY2hhciAqbnNwbmFtZTsJCS8qIHNjaGVtYSBuYW1lIGZv ciBGUU4gY29tbWFuZCB0YWdzICovCiB9IFF1ZXJ5Q29tcGxldGlvbjsKIAogCkBAIC01Niw2ICs1 OCwxMyBAQCBleHRlcm4gYm9vbCBjb21tYW5kX3RhZ19kaXNwbGF5X3Jvd2NvdW50KENvbW1hbmRU YWcgY29tbWFuZFRhZyk7CiBleHRlcm4gYm9vbCBjb21tYW5kX3RhZ19ldmVudF90cmlnZ2VyX29r KENvbW1hbmRUYWcgY29tbWFuZFRhZyk7CiBleHRlcm4gYm9vbCBjb21tYW5kX3RhZ190YWJsZV9y ZXdyaXRlX29rKENvbW1hbmRUYWcgY29tbWFuZFRhZyk7CiBleHRlcm4gQ29tbWFuZFRhZyBHZXRD b21tYW5kVGFnRW51bShjb25zdCBjaGFyICpjb21tYW5kbmFtZSk7CisKKy8qIEdVQzogY29tbWFu ZCB0YWcgZm9ybWF0IHN0eWxlICovCisjZGVmaW5lIENPTU1BTkRfVEFHX0ZPUk1BVF9MRUdBQ1kg ICAwICAgLyogSU5TRVJUIDAgTiAoZGVmYXVsdCwgYmFja3dhcmQgY29tcGF0KSAqLworI2RlZmlu ZSBDT01NQU5EX1RBR19GT1JNQVRfVkVSQk9TRSAgMSAgIC8qIElOU0VSVCB0YWJsZW5hbWUgTiAq LworI2RlZmluZSBDT01NQU5EX1RBR19GT1JNQVRfRlFOICAgICAgMiAgIC8qIElOU0VSVCBzY2hl bWEudGFibGVuYW1lIE4gKi8KKworZXh0ZXJuIGludCBjb21tYW5kX3RhZ19mb3JtYXQ7CiBleHRl cm4gU2l6ZSBCdWlsZFF1ZXJ5Q29tcGxldGlvblN0cmluZyhjaGFyICpidWZmLCBjb25zdCBRdWVy eUNvbXBsZXRpb24gKnFjLAogCQkJCQkJCQkJICAgYm9vbCBuYW1lb25seSk7CiAKLS0gCjIuNDMu MAoK --000000000000e9c79e064cc63ab0 Content-Type: text/x-python; charset="utf-8"; name="test_pq_startup.py" Content-Disposition: attachment; filename="test_pq_startup.py" Content-Transfer-Encoding: base64 X-Attachment-Id: 78606d82288c3308_0.2 IiIiClNlbmQgYSByYXcgUG9zdGdyZVNRTCBzdGFydHVwIHBhY2tldCB3aXRoIF9wcV8uY29tbWFu ZF90YWdfZm9ybWF0LgpUaGVuIGV4ZWN1dGUgSU5TRVJUIGFuZCBjaGVjayB0aGUgQ29tbWFuZENv bXBsZXRlIG1lc3NhZ2UuCiIiIgppbXBvcnQgc29ja2V0CmltcG9ydCBzdHJ1Y3QKaW1wb3J0IHN5 cwoKZGVmIG1ha2Vfc3RhcnR1cF9wYWNrZXQodXNlciwgZGF0YWJhc2UsIGV4dHJhX3BhcmFtcz1O b25lKToKICAgICIiIkJ1aWxkIGEgdjMgc3RhcnR1cCBwYWNrZXQgd2l0aCBvcHRpb25hbCBfcHFf IHBhcmFtZXRlcnMuIiIiCiAgICBwYXJhbXMgPSBbXQogICAgcGFyYW1zLmFwcGVuZChiInVzZXJc eDAwIiArIHVzZXIuZW5jb2RlKCkgKyBiIlx4MDAiKQogICAgcGFyYW1zLmFwcGVuZChiImRhdGFi YXNlXHgwMCIgKyBkYXRhYmFzZS5lbmNvZGUoKSArIGIiXHgwMCIpCiAgICBpZiBleHRyYV9wYXJh bXM6CiAgICAgICAgZm9yIGssIHYgaW4gZXh0cmFfcGFyYW1zLml0ZW1zKCk6CiAgICAgICAgICAg IHBhcmFtcy5hcHBlbmQoay5lbmNvZGUoKSArIGIiXHgwMCIgKyB2LmVuY29kZSgpICsgYiJceDAw IikKICAgIHBhcmFtcy5hcHBlbmQoYiJceDAwIikgICMgdGVybWluYXRvcgoKICAgIGJvZHkgPSBi IiIuam9pbihwYXJhbXMpCiAgICAjIFZlcnNpb24gMy4wCiAgICB2ZXJzaW9uID0gc3RydWN0LnBh Y2soIiFJIiwgMTk2NjA4KSAgIyAzIDw8IDE2CiAgICBsZW5ndGggPSBzdHJ1Y3QucGFjaygiIUki LCA0ICsgbGVuKHZlcnNpb24pICsgbGVuKGJvZHkpKQogICAgcmV0dXJuIGxlbmd0aCArIHZlcnNp b24gKyBib2R5CgpkZWYgcmVhZF9tZXNzYWdlKHNvY2spOgogICAgIiIiUmVhZCBvbmUgUEcgcHJv dG9jb2wgbWVzc2FnZS4gUmV0dXJucyAodHlwZV9ieXRlLCBwYXlsb2FkKS4iIiIKICAgIGhkciA9 IHNvY2sucmVjdigxKQogICAgaWYgbm90IGhkcjoKICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQog ICAgbXNnX3R5cGUgPSBoZHIuZGVjb2RlKCJhc2NpaSIpCiAgICBsZW5ndGhfYnl0ZXMgPSBzb2Nr LnJlY3YoNCkKICAgIGxlbmd0aCA9IHN0cnVjdC51bnBhY2soIiFJIiwgbGVuZ3RoX2J5dGVzKVsw XQogICAgcGF5bG9hZCA9IGIiIgogICAgcmVtYWluaW5nID0gbGVuZ3RoIC0gNAogICAgd2hpbGUg cmVtYWluaW5nID4gMDoKICAgICAgICBjaHVuayA9IHNvY2sucmVjdihyZW1haW5pbmcpCiAgICAg ICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICBicmVhawogICAgICAgIHBheWxvYWQgKz0gY2h1 bmsKICAgICAgICByZW1haW5pbmcgLT0gbGVuKGNodW5rKQogICAgcmV0dXJuIG1zZ190eXBlLCBw YXlsb2FkCgpkZWYgc2VuZF9xdWVyeShzb2NrLCBzcWwpOgogICAgIiIiU2VuZCBhIHNpbXBsZSBx dWVyeS4iIiIKICAgIGJvZHkgPSBzcWwuZW5jb2RlKCkgKyBiIlx4MDAiCiAgICBtc2cgPSBiIlEi ICsgc3RydWN0LnBhY2soIiFJIiwgNCArIGxlbihib2R5KSkgKyBib2R5CiAgICBzb2NrLnNlbmRh bGwobXNnKQoKZGVmIHJ1bl90ZXN0KGZvcm1hdF92YWx1ZT1Ob25lKToKICAgIGV4dHJhID0ge30K ICAgIGlmIGZvcm1hdF92YWx1ZToKICAgICAgICBleHRyYVsiX3BxXy5jb21tYW5kX3RhZ19mb3Jt YXQiXSA9IGZvcm1hdF92YWx1ZQoKICAgIGxhYmVsID0gZm9ybWF0X3ZhbHVlIG9yICJkZWZhdWx0 IgogICAgcHJpbnQoZiJcbj09PSBUZXN0aW5nIHdpdGggX3BxXy5jb21tYW5kX3RhZ19mb3JtYXQ9 e2xhYmVsfSA9PT0iKQoKICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBz b2NrZXQuU09DS19TVFJFQU0pCiAgICBzb2NrLmNvbm5lY3QoIi90bXAvLnMuUEdTUUwuNTQzMiIp CgogICAgcGFja2V0ID0gbWFrZV9zdGFydHVwX3BhY2tldCgicG9zdGdyZXMiLCAicG9zdGdyZXMi LCBleHRyYSBpZiBleHRyYSBlbHNlIE5vbmUpCiAgICBzb2NrLnNlbmRhbGwocGFja2V0KQoKICAg ICMgUmVhZCBhdXRoICsgcGFyYW1ldGVyIHN0YXR1cyArIHJlYWR5CiAgICByZWFkeSA9IEZhbHNl CiAgICB3aGlsZSBub3QgcmVhZHk6CiAgICAgICAgbXNnX3R5cGUsIHBheWxvYWQgPSByZWFkX21l c3NhZ2Uoc29jaykKICAgICAgICBpZiBtc2dfdHlwZSBpcyBOb25lOgogICAgICAgICAgICBwcmlu dCgiQ29ubmVjdGlvbiBjbG9zZWQhIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbXNn X3R5cGUgPT0gIkUiOgogICAgICAgICAgICAjIEVycm9yCiAgICAgICAgICAgIGVyciA9IHBheWxv YWQuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpCiAgICAgICAgICAgIHByaW50KGYi ICBFUlJPUjoge2Vycn0iKQogICAgICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgICAgcmV0 dXJuCiAgICAgICAgaWYgbXNnX3R5cGUgPT0gIlIiOgogICAgICAgICAgICAjIEF1dGggcmVxdWVz dAogICAgICAgICAgICBhdXRoX3R5cGUgPSBzdHJ1Y3QudW5wYWNrKCIhSSIsIHBheWxvYWRbOjRd KVswXQogICAgICAgICAgICBpZiBhdXRoX3R5cGUgPT0gMDoKICAgICAgICAgICAgICAgIHBhc3Mg ICMgQXV0aE9LCiAgICAgICAgaWYgbXNnX3R5cGUgPT0gIlMiOgogICAgICAgICAgICAjIFBhcmFt ZXRlclN0YXR1cwogICAgICAgICAgICBwYXJ0cyA9IHBheWxvYWQucnN0cmlwKGIiXHgwMCIpLnNw bGl0KGIiXHgwMCIpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMjoKICAgICAgICAgICAg ICAgIG5hbWUsIHZhbHVlID0gcGFydHNbMF0uZGVjb2RlKCksIHBhcnRzWzFdLmRlY29kZSgpCiAg ICAgICAgICAgICAgICBpZiBuYW1lID09ICJjb21tYW5kX3RhZ19mb3JtYXQiOgogICAgICAgICAg ICAgICAgICAgIHByaW50KGYiICBHVUNfUkVQT1JUOiBjb21tYW5kX3RhZ19mb3JtYXQgPSB7dmFs dWV9IikKICAgICAgICBpZiBtc2dfdHlwZSA9PSAiWiI6CiAgICAgICAgICAgIHJlYWR5ID0gVHJ1 ZQoKICAgICMgQ3JlYXRlIHRhYmxlCiAgICBzZW5kX3F1ZXJ5KHNvY2ssICJDUkVBVEUgVEFCTEUg SUYgTk9UIEVYSVNUUyBwcm90b190ZXN0KGlkIGludCkiKQogICAgd2hpbGUgVHJ1ZToKICAgICAg ICBtc2dfdHlwZSwgcGF5bG9hZCA9IHJlYWRfbWVzc2FnZShzb2NrKQogICAgICAgIGlmIG1zZ190 eXBlID09ICJaIjoKICAgICAgICAgICAgYnJlYWsKCiAgICAjIElOU0VSVAogICAgc2VuZF9xdWVy eShzb2NrLCAiSU5TRVJUIElOVE8gcHJvdG9fdGVzdCBWQUxVRVMgKDc3NykiKQogICAgd2hpbGUg VHJ1ZToKICAgICAgICBtc2dfdHlwZSwgcGF5bG9hZCA9IHJlYWRfbWVzc2FnZShzb2NrKQogICAg ICAgIGlmIG1zZ190eXBlID09ICJDIjoKICAgICAgICAgICAgdGFnID0gcGF5bG9hZC5yc3RyaXAo YiJceDAwIikuZGVjb2RlKCkKICAgICAgICAgICAgcHJpbnQoZiIgIENvbW1hbmRDb21wbGV0ZTog e3RhZ30iKQogICAgICAgIGlmIG1zZ190eXBlID09ICJaIjoKICAgICAgICAgICAgYnJlYWsKCiAg ICAjIENsZWFudXAKICAgIHNlbmRfcXVlcnkoc29jaywgIkRFTEVURSBGUk9NIHByb3RvX3Rlc3Qg V0hFUkUgaWQgPSA3NzciKQogICAgd2hpbGUgVHJ1ZToKICAgICAgICBtc2dfdHlwZSwgcGF5bG9h ZCA9IHJlYWRfbWVzc2FnZShzb2NrKQogICAgICAgIGlmIG1zZ190eXBlID09ICJaIjoKICAgICAg ICAgICAgYnJlYWsKCiAgICAjIFRlcm1pbmF0ZQogICAgc29jay5zZW5kYWxsKGIiWFx4MDBceDAw XHgwMFx4MDQiKQogICAgc29jay5jbG9zZSgpCgojIFJ1biB0ZXN0cwpydW5fdGVzdChOb25lKSAg ICAgICAgICAjIE5vIF9wcV8gcGFyYW0g4oaSIGxlZ2FjeQpydW5fdGVzdCgidmVyYm9zZSIpICAg ICAjIF9wcV8gdmVyYm9zZSDihpIgSU5TRVJUIHRhYmxlbmFtZSBOCnJ1bl90ZXN0KCJmcW4iKSAg ICAgICAgICMgX3BxXyBmcW4g4oaSIElOU0VSVCBzY2hlbWEudGFibGVuYW1lIE4KcnVuX3Rlc3Qo ImxlZ2FjeSIpICAgICAgIyBfcHFfIGxlZ2FjeSDihpIgSU5TRVJUIDAgTgpydW5fdGVzdCgibW9k ZXJuIikgICAgICAjIF9wcV8gbW9kZXJuIOKGkiBzaG91bGQgZmFpbCAocmVtb3ZlZCkKCg== --000000000000e9c79e064cc63ab0--