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 1roe7O-002Zsm-LI for pgsql-hackers@arkaria.postgresql.org; Mon, 25 Mar 2024 06:47:39 +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 1roe7L-000OSw-D9 for pgsql-hackers@arkaria.postgresql.org; Mon, 25 Mar 2024 06:47:35 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1roe7K-000OSo-Nt for pgsql-hackers@lists.postgresql.org; Mon, 25 Mar 2024 06:47:35 +0000 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1roe7E-006HzT-3o for pgsql-hackers@lists.postgresql.org; Mon, 25 Mar 2024 06:47:33 +0000 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1def3340682so32511225ad.1 for ; Sun, 24 Mar 2024 23:47:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20230601.gappssmtp.com; s=20230601; t=1711349248; x=1711954048; darn=lists.postgresql.org; h=in-reply-to:references:to:from:content-language:subject:user-agent :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=rhrgipYQBR+EGrvpoX+VkA+O6GWQa2ifTFVJahHnO64=; b=lZLoamUjWUU8KVo6XdVdA8N+cusqjDUpdnqaqFDyABmEA1GVmZcusV707U5bsNM0bf uq+3R//zwYeDFKb9oLMwnzj680PFYpKRLrHctAeweUHthjdkJ58Um1T6mUZ2+u/u5xUM 1cd7gopMdogXPNK/vFMZnFlvJqbhadsZXIb+tuDdpXkT/Sv1s76S+YumVq8v1iXDj5H2 nCCvOYy/o4g4gd+UgbHhASwhbCrlqzZUk7dYl2KH3PNlLTRCjR91s5TglE9JG8fD4Gzu xSgwgy/gPCMSYjaBn8h+QCwuYhiYpUBXmKC09gNOaYDRwiYMec6y0ZUM3aWl7DZlCncC tYVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711349248; x=1711954048; h=in-reply-to:references:to:from:content-language:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=rhrgipYQBR+EGrvpoX+VkA+O6GWQa2ifTFVJahHnO64=; b=Bz3YIYRX03RKa1FKE++B68GH8AreEGACCGGmDSQFM0mdrxiIbwX67xdJnJcKu7aT+m ag04C6tHgb3ATWLKZsfdmGTKdD3ml3pExpo63SpxfH+cUaxviOOpDY9FLyi//VQrTJfz l7ZP0MfXKHSOYtSd+2PN/klP8UbQV9SyLKWQjQsb0L/hsrzuDQVe4UDID1TEAStTFRq/ xgWgp5S/isq5E/6eTJTkCpTR6L/080/bvIp5qoHVXQrtV5x5WKGP4bnxoncI6bx3GEjj l6+t6r88RimnDpPLQzdVkv4FVwhcbm+51SzNn0C/CAhMqiGlSSePvQfc6RY/vieEmMCE 6KkQ== X-Gm-Message-State: AOJu0YydjJSUMV6aWOJQ/9D7BlNZfPDHdVqh6IDlrFXCXB+RIRzwpXSE DIMNNkLg1LwRBynd9o5OnCWROikp5nJbINDYGDQP4Lz09BwIkOkxtplEJnkVpFx4hf32jbchaDc 1 X-Google-Smtp-Source: AGHT+IHVI2E7jpSMAd3yz+jC6L8MUqc7kDUUs4Y6IN6LiG12Cqb+cpB2uZHjfJrwrI3HgSFnD0OEKg== X-Received: by 2002:a17:902:db02:b0:1dd:c0bc:5933 with SMTP id m2-20020a170902db0200b001ddc0bc5933mr9284889plx.2.1711349247409; Sun, 24 Mar 2024 23:47:27 -0700 (PDT) Received: from [192.168.2.139] ([50.39.255.79]) by smtp.googlemail.com with ESMTPSA id n6-20020a170902e54600b001def0897284sm4047818plf.76.2024.03.24.23.47.26 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 24 Mar 2024 23:47:26 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------p32wt2C1Iu4z22k8BUItXAZj" Message-ID: <69f0a887-a4ed-49cf-9d63-923891006658@illuminatedcomputing.com> Date: Sun, 24 Mar 2024 23:47:26 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: altering a column's collation leaves an invalid foreign key Content-Language: en-US From: Paul Jungwirth To: PostgreSQL Hackers References: <78d824e0-b21e-480d-a252-e4b84bc2c24b@illuminatedcomputing.com> In-Reply-To: <78d824e0-b21e-480d-a252-e4b84bc2c24b@illuminatedcomputing.com> 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. --------------p32wt2C1Iu4z22k8BUItXAZj Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 3/23/24 10:04, Paul Jungwirth wrote: > Perhaps if the previous collation was nondeterministic we should force a re-check. Here is a patch implementing this. It was a bit more fuss than I expected, so maybe someone has a better way. We have had nondeterministic collations since v12, so perhaps it is something to back-patch? Yours, -- Paul ~{:-) pj@illuminatedcomputing.com --------------p32wt2C1Iu4z22k8BUItXAZj Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Re-check-foreign-key-if-referenced-collation-was-.patch" Content-Disposition: attachment; filename*0="v1-0001-Re-check-foreign-key-if-referenced-collation-was-.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBhODA3OGY4NTg1OTQwMGY0ZTRjZmZiNTdkOGVjMWIwNjllNDZiZmI4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiUGF1bCBBLiBKdW5nd2lydGgiIDxwakBpbGx1bWlu YXRlZGNvbXB1dGluZy5jb20+CkRhdGU6IFN1biwgMjQgTWFyIDIwMjQgMjM6Mzc6NDggLTA3 MDAKU3ViamVjdDogW1BBVENIIHYxXSBSZS1jaGVjayBmb3JlaWduIGtleSBpZiByZWZlcmVu Y2VkIGNvbGxhdGlvbiB3YXMKIG5vbmRldGVybWluaXN0aWMKCldpdGggZGV0ZXJtaW5pc3Rp YyBjb2xsYXRpb25zLCB3ZSBicmVhayB0aWVzIGJ5IGxvb2tpbmcgYXQgYmluYXJ5CmVxdWFs aXR5LiBCdXQgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGNhbiBhbGxvdyBub24taWRl bnRpY2FsIHZhbHVlcwp0byBiZSBjb25zaWRlcmVkIGVxdWFsLCBlLmcuICdhJyBhbmQgJ0En IHdoZW4gY2FzZS1pbnNlbnNpdGl2ZS4gU28gc29tZQpyZWZlcmVuY2VzIHRoYXQgdXNlZCB0 byBiZSB2YWxpZCBtYXkgbm90IGJlIGFueW1vcmUuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFu ZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgOTYgKysrKysrKysrKysrKysrKy0tLQog c3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oICAgICAgICAgICAgICAgIHwgIDIgKwog Li4uL3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQgICAgIHwgIDkgKysK IHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvbGxhdGUuaWN1LnV0Zjguc3FsICAgICB8ICA4ICsr CiA0IGZpbGVzIGNoYW5nZWQsIDEwMyBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCmluZGV4IDcxNzQwOTg0ZjMzLi45NDBiMTg0 NWVkYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKQEAgLTE5NCw2ICsxOTQsNyBA QCB0eXBlZGVmIHN0cnVjdCBBbHRlcmVkVGFibGVJbmZvCiAJLyogT2JqZWN0cyB0byByZWJ1 aWxkIGFmdGVyIGNvbXBsZXRpbmcgQUxURVIgVFlQRSBvcGVyYXRpb25zICovCiAJTGlzdAkg ICAqY2hhbmdlZENvbnN0cmFpbnRPaWRzOwkvKiBPSURzIG9mIGNvbnN0cmFpbnRzIHRvIHJl YnVpbGQgKi8KIAlMaXN0CSAgICpjaGFuZ2VkQ29uc3RyYWludERlZnM7CS8qIHN0cmluZyBk ZWZpbml0aW9ucyBvZiBzYW1lICovCisJTGlzdAkgICAqY2hhbmdlZENvbGxhdGlvbk9pZHM7 CS8qIGNvbGxhdGlvbiBvZiBlYWNoIGF0dG51bSAqLwogCUxpc3QJICAgKmNoYW5nZWRJbmRl eE9pZHM7CS8qIE9JRHMgb2YgaW5kZXhlcyB0byByZWJ1aWxkICovCiAJTGlzdAkgICAqY2hh bmdlZEluZGV4RGVmczsJLyogc3RyaW5nIGRlZmluaXRpb25zIG9mIHNhbWUgKi8KIAljaGFy CSAgICpyZXBsaWNhSWRlbnRpdHlJbmRleDsJLyogaW5kZXggdG8gcmVzZXQgYXMgUkVQTElD QSBJREVOVElUWSAqLwpAQCAtNTcyLDYgKzU3Myw3IEBAIHN0YXRpYyBPYmplY3RBZGRyZXNz IEFURXhlY0FsdGVyQ29sdW1uVHlwZShBbHRlcmVkVGFibGVJbmZvICp0YWIsIFJlbGF0aW9u IHJlbCwKIAkJCQkJCQkJCQkgICBBbHRlclRhYmxlQ21kICpjbWQsIExPQ0tNT0RFIGxvY2tt b2RlKTsKIHN0YXRpYyB2b2lkIFJlbWVtYmVyQWxsRGVwZW5kZW50Rm9yUmVidWlsZGluZyhB bHRlcmVkVGFibGVJbmZvICp0YWIsIEFsdGVyVGFibGVUeXBlIHN1YnR5cGUsCiAJCQkJCQkJ CQkJCSAgUmVsYXRpb24gcmVsLCBBdHRyTnVtYmVyIGF0dG51bSwgY29uc3QgY2hhciAqY29s TmFtZSk7CitzdGF0aWMgdm9pZCBSZW1lbWJlckNvbGxhdGlvbkZvclJlYnVpbGRpbmcoQXR0 ck51bWJlciBhdHRudW0sIEFsdGVyZWRUYWJsZUluZm8gKnRhYik7CiBzdGF0aWMgdm9pZCBS ZW1lbWJlckNvbnN0cmFpbnRGb3JSZWJ1aWxkaW5nKE9pZCBjb25vaWQsIEFsdGVyZWRUYWJs ZUluZm8gKnRhYik7CiBzdGF0aWMgdm9pZCBSZW1lbWJlckluZGV4Rm9yUmVidWlsZGluZyhP aWQgaW5kb2lkLCBBbHRlcmVkVGFibGVJbmZvICp0YWIpOwogc3RhdGljIHZvaWQgUmVtZW1i ZXJTdGF0aXN0aWNzRm9yUmVidWlsZGluZyhPaWQgc3R4b2lkLCBBbHRlcmVkVGFibGVJbmZv ICp0YWIpOwpAQCAtNTc5LDEyICs1ODEsMTIgQEAgc3RhdGljIHZvaWQgQVRQb3N0QWx0ZXJU eXBlQ2xlYW51cChMaXN0ICoqd3F1ZXVlLCBBbHRlcmVkVGFibGVJbmZvICp0YWIsCiAJCQkJ CQkJCSAgIExPQ0tNT0RFIGxvY2ttb2RlKTsKIHN0YXRpYyB2b2lkIEFUUG9zdEFsdGVyVHlw ZVBhcnNlKE9pZCBvbGRJZCwgT2lkIG9sZFJlbElkLCBPaWQgcmVmUmVsSWQsCiAJCQkJCQkJ CSBjaGFyICpjbWQsIExpc3QgKip3cXVldWUsIExPQ0tNT0RFIGxvY2ttb2RlLAotCQkJCQkJ CQkgYm9vbCByZXdyaXRlKTsKKwkJCQkJCQkJIGJvb2wgcmV3cml0ZSwgTGlzdCAqY29sbGF0 aW9uT2lkcyk7CiBzdGF0aWMgdm9pZCBSZWJ1aWxkQ29uc3RyYWludENvbW1lbnQoQWx0ZXJl ZFRhYmxlSW5mbyAqdGFiLCBBbHRlclRhYmxlUGFzcyBwYXNzLAogCQkJCQkJCQkJIE9pZCBv YmppZCwgUmVsYXRpb24gcmVsLCBMaXN0ICpkb21uYW1lLAogCQkJCQkJCQkJIGNvbnN0IGNo YXIgKmNvbm5hbWUpOwogc3RhdGljIHZvaWQgVHJ5UmV1c2VJbmRleChPaWQgb2xkSWQsIElu ZGV4U3RtdCAqc3RtdCk7Ci1zdGF0aWMgdm9pZCBUcnlSZXVzZUZvcmVpZ25LZXkoT2lkIG9s ZElkLCBDb25zdHJhaW50ICpjb24pOworc3RhdGljIHZvaWQgVHJ5UmV1c2VGb3JlaWduS2V5 KE9pZCBvbGRJZCwgQ29uc3RyYWludCAqY29uLCBMaXN0ICpjaGFuZ2VkQ29sbGF0aW9uT2lk cyk7CiBzdGF0aWMgT2JqZWN0QWRkcmVzcyBBVEV4ZWNBbHRlckNvbHVtbkdlbmVyaWNPcHRp b25zKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwKIAkJCQkJCQkJCQkJCQkg TGlzdCAqb3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUpOwogc3RhdGljIHZvaWQgY2hhbmdl X293bmVyX2ZpeF9jb2x1bW5fYWNscyhPaWQgcmVsYXRpb25PaWQsCkBAIC05ODI2LDYgKzk4 MjgsNyBAQCBBVEFkZEZvcmVpZ25LZXlDb25zdHJhaW50KExpc3QgKip3cXVldWUsIEFsdGVy ZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCWJvb2wJCW9sZF9jaGVja19vazsK IAlPYmplY3RBZGRyZXNzIGFkZHJlc3M7CiAJTGlzdENlbGwgICAqb2xkX3BmZXFvcF9pdGVt ID0gbGlzdF9oZWFkKGZrY29uc3RyYWludC0+b2xkX2NvbnBmZXFvcCk7CisJTGlzdENlbGwg ICAqb2xkX2NvbGxhdGlvbl9pdGVtID0gbGlzdF9oZWFkKGZrY29uc3RyYWludC0+b2xkX2Nv bGxhdGlvbnMpOwogCiAJLyoKIAkgKiBHcmFiIFNoYXJlUm93RXhjbHVzaXZlTG9jayBvbiB0 aGUgcGsgdGFibGUsIHNvIHRoYXQgc29tZW9uZSBkb2Vzbid0CkBAIC0xMDIxMiw5ICsxMDIx NSwxNSBAQCBBVEFkZEZvcmVpZ25LZXlDb25zdHJhaW50KExpc3QgKip3cXVldWUsIEFsdGVy ZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCQkJQ29lcmNpb25QYXRoVHlwZSBu ZXdfcGF0aHR5cGU7CiAJCQlPaWQJCQlvbGRfY2FzdGZ1bmM7CiAJCQlPaWQJCQluZXdfY2Fz dGZ1bmM7CisJCQlPaWQJCQlvbGRfY29sbGF0aW9uOwogCQkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0ciA9IFR1cGxlRGVzY0F0dHIodGFiLT5vbGREZXNjLAogCQkJCQkJCQkJCQkJICAgZmth dHRudW1baV0gLSAxKTsKIAorCQkJLyogR2V0IHRoZSBjb2xsYXRpb24gZm9yIHRoaXMga2V5 IHBhcnQuICovCisJCQlvbGRfY29sbGF0aW9uID0gbGZpcnN0X29pZChvbGRfY29sbGF0aW9u X2l0ZW0pOworCQkJb2xkX2NvbGxhdGlvbl9pdGVtID0gbG5leHQoZmtjb25zdHJhaW50LT5v bGRfY29sbGF0aW9ucywKKwkJCQkJCQkJCSAgIG9sZF9jb2xsYXRpb25faXRlbSk7CisKIAkJ CS8qCiAJCQkgKiBJZGVudGlmeSBjb2VyY2lvbiBwYXRod2F5cyBmcm9tIGVhY2ggb2YgdGhl IG9sZCBhbmQgbmV3IEZLLXNpZGUKIAkJCSAqIGNvbHVtbiB0eXBlcyB0byB0aGUgcmlnaHQg KGZvcmVpZ24pIG9wZXJhbmQgdHlwZSBvZiB0aGUgcGZlcW9wLgpAQCAtMTAyNTAsOSArMTAy NTksMTIgQEAgQVRBZGRGb3JlaWduS2V5Q29uc3RyYWludChMaXN0ICoqd3F1ZXVlLCBBbHRl cmVkVGFibGVJbmZvICp0YWIsIFJlbGF0aW9uIHJlbCwKIAkJCSAqIHR1cm4gY29uZm9ybSB0 byB0aGUgZG9tYWluLiAgQ29uc2VxdWVudGx5LCB3ZSBuZWVkIG5vdCB0cmVhdAogCQkJICog ZG9tYWlucyBzcGVjaWFsbHkgaGVyZS4KIAkJCSAqCi0JCQkgKiBTaW5jZSB3ZSByZXF1aXJl IHRoYXQgYWxsIGNvbGxhdGlvbnMgc2hhcmUgdGhlIHNhbWUgbm90aW9uIG9mCi0JCQkgKiBl cXVhbGl0eSAod2hpY2ggdGhleSBkbywgYmVjYXVzZSB0ZXh0ZXEgcmVkdWNlcyB0byBiaXR3 aXNlCi0JCQkgKiBlcXVhbGl0eSksIHdlIGRvbid0IGNvbXBhcmUgY29sbGF0aW9uIGhlcmUu CisJCQkgKiBBbGwgZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIHVzZSBiaXR3aXNlIGVxdWFs aXR5IHRvIHJlc29sdmUKKwkJCSAqIHRpZXMsIGJ1dCBpZiB0aGUgcHJldmlvdXMgY29sbGF0 aW9uIHdhcyBub25kZXRlcm1pbmlzdGljLAorCQkJICogd2UgbXVzdCByZS1jaGVjayB0aGUg Zm9yZWlnbiBrZXksIGJlY2F1c2Ugc29tZSByZWZlcmVuY2VzCisJCQkgKiB0aGF0IHVzZSB0 byBiZSAiZXF1YWwiIG1heSBub3QgYmUgYW55bW9yZS4gSWYgd2UgaGF2ZQorCQkJICogSW52 YWxpZE9pZCBoZXJlLCBlaXRoZXIgdGhlcmUgd2FzIG5vIGNvbGxhdGlvbiBvciB0aGUKKwkJ CSAqIGF0dHJpYnV0ZSBkaWRuJ3QgY2hhbmdlLgogCQkJICoKIAkJCSAqIFdlIG5lZWQgbm90 IGRpcmVjdGx5IGNvbnNpZGVyIHRoZSBQSyB0eXBlLiAgSXQncyBuZWNlc3NhcmlseQogCQkJ ICogYmluYXJ5IGNvZXJjaWJsZSB0byB0aGUgb3BjaW50eXBlIG9mIHRoZSB1bmlxdWUgaW5k ZXggY29sdW1uLApAQCAtMTAyNjEsNiArMTAyNzMsOCBAQCBBVEFkZEZvcmVpZ25LZXlDb25z dHJhaW50KExpc3QgKip3cXVldWUsIEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24g cmVsLAogCQkJICovCiAJCQlvbGRfY2hlY2tfb2sgPSAobmV3X3BhdGh0eXBlID09IG9sZF9w YXRodHlwZSAmJgogCQkJCQkJCW5ld19jYXN0ZnVuYyA9PSBvbGRfY2FzdGZ1bmMgJiYKKwkJ CQkJCQkob2xkX2NvbGxhdGlvbiA9PSBJbnZhbGlkT2lkIHx8CisJCQkJCQkJIGdldF9jb2xs YXRpb25faXNkZXRlcm1pbmlzdGljKG9sZF9jb2xsYXRpb24pKSAmJgogCQkJCQkJCSghSXNQ b2x5bW9ycGhpY1R5cGUocGZlcW9wX3JpZ2h0KSB8fAogCQkJCQkJCSBuZXdfZmt0eXBlID09 IG9sZF9ma3R5cGUpKTsKIAkJfQpAQCAtMTM5ODUsNiArMTM5OTksNyBAQCBSZW1lbWJlckFs bERlcGVuZGVudEZvclJlYnVpbGRpbmcoQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBBbHRlclRh YmxlVHlwZSBzdWJ0eXBlLAogCQkJCQkJcmVsS2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVE X0lOREVYKQogCQkJCQl7CiAJCQkJCQlBc3NlcnQoZm91bmRPYmplY3Qub2JqZWN0U3ViSWQg PT0gMCk7CisJCQkJCQlSZW1lbWJlckNvbGxhdGlvbkZvclJlYnVpbGRpbmcoYXR0bnVtLCB0 YWIpOwogCQkJCQkJUmVtZW1iZXJJbmRleEZvclJlYnVpbGRpbmcoZm91bmRPYmplY3Qub2Jq ZWN0SWQsIHRhYik7CiAJCQkJCX0KIAkJCQkJZWxzZSBpZiAocmVsS2luZCA9PSBSRUxLSU5E X1NFUVVFTkNFKQpAQCAtMTQwMDYsNiArMTQwMjEsNyBAQCBSZW1lbWJlckFsbERlcGVuZGVu dEZvclJlYnVpbGRpbmcoQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBBbHRlclRhYmxlVHlwZSBz dWJ0eXBlLAogCiAJCQljYXNlIE9DTEFTU19DT05TVFJBSU5UOgogCQkJCUFzc2VydChmb3Vu ZE9iamVjdC5vYmplY3RTdWJJZCA9PSAwKTsKKwkJCQlSZW1lbWJlckNvbGxhdGlvbkZvclJl YnVpbGRpbmcoYXR0bnVtLCB0YWIpOwogCQkJCVJlbWVtYmVyQ29uc3RyYWludEZvclJlYnVp bGRpbmcoZm91bmRPYmplY3Qub2JqZWN0SWQsIHRhYik7CiAJCQkJYnJlYWs7CiAKQEAgLTE0 MTg4LDYgKzE0MjA0LDQwIEBAIFJlbWVtYmVyQ2x1c3Rlck9uRm9yUmVidWlsZGluZyhPaWQg aW5kb2lkLCBBbHRlcmVkVGFibGVJbmZvICp0YWIpCiAJdGFiLT5jbHVzdGVyT25JbmRleCA9 IGdldF9yZWxfbmFtZShpbmRvaWQpOwogfQogCisvKgorICogU3Vicm91dGluZSBmb3IgQVRF eGVjQWx0ZXJDb2x1bW5UeXBlOiByZW1lbWJlciB3aGF0IHRoZSBjb2xsYXRpb25zIHdlcmUK KyAqIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgdGFibGUuIFRoaXMgaXMgYmVjYXVzZSBp ZiBvbmUgb2YgdGhlbSB1c2VkIHRvIGJlCisgKiBub25kZXRlcm1pbmlzdGljLCBmb3JlaWdu IGtleXMgdGhhdCByZWZlcmVuY2VkIHRoYXQgYXR0cmlidXRlIG11c3QgYmUKKyAqIHJlLWNo ZWNrZWQuIFdlIG1ha2UgYSBsaXN0IHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGF0dHJpYnV0 ZSBpbiB0aGUgdGFibGUsCisgKiBzbyB0aGF0IEZLcyBjYW4gZWFzaWx5IGxvb2sgdGhlbSB1 cCBieSBhdHRyaWJ1dGUgbnVtYmVyLiBCdXQgb25seSBhdHRyaWJ1dGVzCisgKiB0aGF0IGFy ZSBjaGFuZ2luZyBnZXQgYSBub24temVybyB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQKK1Jl bWVtYmVyQ29sbGF0aW9uRm9yUmVidWlsZGluZyhBdHRyTnVtYmVyIGF0dG51bSwgQWx0ZXJl ZFRhYmxlSW5mbyAqdGFiKQoreworCU9pZAkJCXR5cGlkOworCWludDMyCQl0eXBtb2Q7CisJ T2lkCQkJY29sbGlkOworCUxpc3RDZWxsICAgKmxjOworCisJLyogRmlsbCBpbiB0aGUgbGlz dCB3aXRoIEludmFsaWRPaWQgaWYgdGhpcyBpcyBvdXIgZmlyc3QgdmlzaXQgKi8KKwlpZiAo dGFiLT5jaGFuZ2VkQ29sbGF0aW9uT2lkcyA9PSBOSUwpCisJeworCQlpbnQgbGVuID0gUmVs YXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXModGFiLT5yZWwpOworCQlpbnQgaTsKKworCQlm b3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQl0YWItPmNoYW5nZWRDb2xsYXRpb25PaWRz ID0gbGFwcGVuZF9vaWQodGFiLT5jaGFuZ2VkQ29sbGF0aW9uT2lkcywKKwkJCQkJCQkJCQkJ CQlJbnZhbGlkT2lkKTsKKwl9CisKKwlnZXRfYXR0dHlwZXR5cG1vZGNvbGwoUmVsYXRpb25H ZXRSZWxpZCh0YWItPnJlbCksIGF0dG51bSwKKwkJCQkJCSAgJnR5cGlkLCAmdHlwbW9kLCAm Y29sbGlkKTsKKworCWxjID0gbGlzdF9udGhfY2VsbCh0YWItPmNoYW5nZWRDb2xsYXRpb25P aWRzLCBhdHRudW0gLSAxKTsKKwlsZmlyc3Rfb2lkKGxjKSA9IGNvbGxpZDsKK30KKwogLyoK ICAqIFN1YnJvdXRpbmUgZm9yIEFURXhlY0FsdGVyQ29sdW1uVHlwZTogcmVtZW1iZXIgdGhh dCBhIGNvbnN0cmFpbnQgbmVlZHMKICAqIHRvIGJlIHJlYnVpbHQgKHdoaWNoIHdlIG1pZ2h0 IGFscmVhZHkga25vdykuCkBAIC0xNDM5Myw3ICsxNDQ0Myw4IEBAIEFUUG9zdEFsdGVyVHlw ZUNsZWFudXAoTGlzdCAqKndxdWV1ZSwgQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBMT0NLTU9E RSBsb2NrbW9kZSkKIAogCQlBVFBvc3RBbHRlclR5cGVQYXJzZShvbGRJZCwgcmVsaWQsIGNv bmZyZWxpZCwKIAkJCQkJCQkgKGNoYXIgKikgbGZpcnN0KGRlZl9pdGVtKSwKLQkJCQkJCQkg d3F1ZXVlLCBsb2NrbW9kZSwgdGFiLT5yZXdyaXRlKTsKKwkJCQkJCQkgd3F1ZXVlLCBsb2Nr bW9kZSwgdGFiLT5yZXdyaXRlLAorCQkJCQkJCSB0YWItPmNoYW5nZWRDb2xsYXRpb25PaWRz KTsKIAl9CiAJZm9yYm90aChvaWRfaXRlbSwgdGFiLT5jaGFuZ2VkSW5kZXhPaWRzLAogCQkJ ZGVmX2l0ZW0sIHRhYi0+Y2hhbmdlZEluZGV4RGVmcykKQEAgLTE0NDA0LDcgKzE0NDU1LDgg QEAgQVRQb3N0QWx0ZXJUeXBlQ2xlYW51cChMaXN0ICoqd3F1ZXVlLCBBbHRlcmVkVGFibGVJ bmZvICp0YWIsIExPQ0tNT0RFIGxvY2ttb2RlKQogCQlyZWxpZCA9IEluZGV4R2V0UmVsYXRp b24ob2xkSWQsIGZhbHNlKTsKIAkJQVRQb3N0QWx0ZXJUeXBlUGFyc2Uob2xkSWQsIHJlbGlk LCBJbnZhbGlkT2lkLAogCQkJCQkJCSAoY2hhciAqKSBsZmlyc3QoZGVmX2l0ZW0pLAotCQkJ CQkJCSB3cXVldWUsIGxvY2ttb2RlLCB0YWItPnJld3JpdGUpOworCQkJCQkJCSB3cXVldWUs IGxvY2ttb2RlLCB0YWItPnJld3JpdGUsCisJCQkJCQkJIHRhYi0+Y2hhbmdlZENvbGxhdGlv bk9pZHMpOwogCiAJCU9iamVjdEFkZHJlc3NTZXQob2JqLCBSZWxhdGlvblJlbGF0aW9uSWQs IG9sZElkKTsKIAkJYWRkX2V4YWN0X29iamVjdF9hZGRyZXNzKCZvYmosIG9iamVjdHMpOwpA QCAtMTQ0MjAsNyArMTQ0NzIsOCBAQCBBVFBvc3RBbHRlclR5cGVDbGVhbnVwKExpc3QgKip3 cXVldWUsIEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgTE9DS01PREUgbG9ja21vZGUpCiAJCXJl bGlkID0gU3RhdGlzdGljc0dldFJlbGF0aW9uKG9sZElkLCBmYWxzZSk7CiAJCUFUUG9zdEFs dGVyVHlwZVBhcnNlKG9sZElkLCByZWxpZCwgSW52YWxpZE9pZCwKIAkJCQkJCQkgKGNoYXIg KikgbGZpcnN0KGRlZl9pdGVtKSwKLQkJCQkJCQkgd3F1ZXVlLCBsb2NrbW9kZSwgdGFiLT5y ZXdyaXRlKTsKKwkJCQkJCQkgd3F1ZXVlLCBsb2NrbW9kZSwgdGFiLT5yZXdyaXRlLAorCQkJ CQkJCSB0YWItPmNoYW5nZWRDb2xsYXRpb25PaWRzKTsKIAogCQlPYmplY3RBZGRyZXNzU2V0 KG9iaiwgU3RhdGlzdGljRXh0UmVsYXRpb25JZCwgb2xkSWQpOwogCQlhZGRfZXhhY3Rfb2Jq ZWN0X2FkZHJlc3MoJm9iaiwgb2JqZWN0cyk7CkBAIC0xNDQ4Myw3ICsxNDUzNiw4IEBAIEFU UG9zdEFsdGVyVHlwZUNsZWFudXAoTGlzdCAqKndxdWV1ZSwgQWx0ZXJlZFRhYmxlSW5mbyAq dGFiLCBMT0NLTU9ERSBsb2NrbW9kZSkKICAqLwogc3RhdGljIHZvaWQKIEFUUG9zdEFsdGVy VHlwZVBhcnNlKE9pZCBvbGRJZCwgT2lkIG9sZFJlbElkLCBPaWQgcmVmUmVsSWQsIGNoYXIg KmNtZCwKLQkJCQkJIExpc3QgKip3cXVldWUsIExPQ0tNT0RFIGxvY2ttb2RlLCBib29sIHJl d3JpdGUpCisJCQkJCSBMaXN0ICoqd3F1ZXVlLCBMT0NLTU9ERSBsb2NrbW9kZSwgYm9vbCBy ZXdyaXRlLAorCQkJCQkgTGlzdCAqY2hhbmdlZENvbGxhdGlvbk9pZHMpCiB7CiAJTGlzdAkg ICAqcmF3X3BhcnNldHJlZV9saXN0OwogCUxpc3QJICAgKnF1ZXJ5dHJlZV9saXN0OwpAQCAt MTQ2MTAsNyArMTQ2NjQsNyBAQCBBVFBvc3RBbHRlclR5cGVQYXJzZShPaWQgb2xkSWQsIE9p ZCBvbGRSZWxJZCwgT2lkIHJlZlJlbElkLCBjaGFyICpjbWQsCiAJCQkJCS8qIHJld3JpdGlu ZyBuZWl0aGVyIHNpZGUgb2YgYSBGSyAqLwogCQkJCQlpZiAoY29uLT5jb250eXBlID09IENP TlNUUl9GT1JFSUdOICYmCiAJCQkJCQkhcmV3cml0ZSAmJiB0YWItPnJld3JpdGUgPT0gMCkK LQkJCQkJCVRyeVJldXNlRm9yZWlnbktleShvbGRJZCwgY29uKTsKKwkJCQkJCVRyeVJldXNl Rm9yZWlnbktleShvbGRJZCwgY29uLCBjaGFuZ2VkQ29sbGF0aW9uT2lkcyk7CiAJCQkJCWNv bi0+cmVzZXRfZGVmYXVsdF90YmxzcGMgPSB0cnVlOwogCQkJCQljbWQtPnN1YnR5cGUgPSBB VF9SZUFkZENvbnN0cmFpbnQ7CiAJCQkJCXRhYi0+c3ViY21kc1tBVF9QQVNTX09MRF9DT05T VFJdID0KQEAgLTE0NzY4LDIwICsxNDgyMiwyMiBAQCBUcnlSZXVzZUluZGV4KE9pZCBvbGRJ ZCwgSW5kZXhTdG10ICpzdG10KQogICoKICAqIFN0YXNoIHRoZSBvbGQgUC1GIGVxdWFsaXR5 IG9wZXJhdG9yIGludG8gdGhlIENvbnN0cmFpbnQgbm9kZSwgZm9yIHBvc3NpYmxlCiAgKiB1 c2UgYnkgQVRBZGRGb3JlaWduS2V5Q29uc3RyYWludCgpIGluIGRldGVybWluaW5nIHdoZXRo ZXIgcmV2YWxpZGF0aW9uIG9mCi0gKiB0aGlzIGNvbnN0cmFpbnQgY2FuIGJlIHNraXBwZWQu CisgKiB0aGlzIGNvbnN0cmFpbnQgY2FuIGJlIHNraXBwZWQuIEFsc28gc3Rhc2ggdGhlIGNv bGxhdGlvbnMuCiAgKi8KIHN0YXRpYyB2b2lkCi1UcnlSZXVzZUZvcmVpZ25LZXkoT2lkIG9s ZElkLCBDb25zdHJhaW50ICpjb24pCitUcnlSZXVzZUZvcmVpZ25LZXkoT2lkIG9sZElkLCBD b25zdHJhaW50ICpjb24sIExpc3QgKmNoYW5nZWRDb2xsYXRpb25PaWRzKQogewogCUhlYXBU dXBsZQl0dXA7CiAJRGF0dW0JCWFkYXR1bTsKIAlBcnJheVR5cGUgICphcnI7CiAJT2lkCQkg ICAqcmF3YXJyOworCUF0dHJOdW1iZXIgKmF0dGFycjsKIAlpbnQJCQludW1rZXlzOwogCWlu dAkJCWk7CiAKIAlBc3NlcnQoY29uLT5jb250eXBlID09IENPTlNUUl9GT1JFSUdOKTsKIAlB c3NlcnQoY29uLT5vbGRfY29ucGZlcW9wID09IE5JTCk7CS8qIGFscmVhZHkgcHJlcGFyZWQg dGhpcyBub2RlICovCisJQXNzZXJ0KGNvbi0+b2xkX2NvbGxhdGlvbnMgPT0gTklMKTsJLyog YWxyZWFkeSBwcmVwYXJlZCB0aGlzIG5vZGUgKi8KIAogCXR1cCA9IFNlYXJjaFN5c0NhY2hl MShDT05TVFJPSUQsIE9iamVjdElkR2V0RGF0dW0ob2xkSWQpKTsKIAlpZiAoIUhlYXBUdXBs ZUlzVmFsaWQodHVwKSkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KQEAgLTE0ODAyLDYgKzE0 ODU4LDIyIEBAIFRyeVJldXNlRm9yZWlnbktleShPaWQgb2xkSWQsIENvbnN0cmFpbnQgKmNv bikKIAlmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKQogCQljb24tPm9sZF9jb25wZmVx b3AgPSBsYXBwZW5kX29pZChjb24tPm9sZF9jb25wZmVxb3AsIHJhd2FycltpXSk7CiAKKwlh ZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKENPTlNUUk9JRCwgdHVwLAorCQkJCQkJ CQkJQW51bV9wZ19jb25zdHJhaW50X2NvbmtleSk7CisJYXJyID0gRGF0dW1HZXRBcnJheVR5 cGVQKGFkYXR1bSk7CS8qIGVuc3VyZSBub3QgdG9hc3RlZCAqLworCW51bWtleXMgPSBBUlJf RElNUyhhcnIpWzBdOworCS8qIHRlc3QgZm9sbG93cyB0aGUgb25lIGluIHJpX0ZldGNoQ29u c3RyYWludEluZm8oKSAqLworCWlmIChBUlJfTkRJTShhcnIpICE9IDEgfHwKKwkJQVJSX0hB U05VTEwoYXJyKSB8fAorCQlBUlJfRUxFTVRZUEUoYXJyKSAhPSBJTlQyT0lEKQorCQllbG9n KEVSUk9SLCAiY29ua2V5IGlzIG5vdCBhIDEtRCBzbWFsbGludCBhcnJheSIpOworCWF0dGFy ciA9IChBdHRyTnVtYmVyICopIEFSUl9EQVRBX1BUUihhcnIpOworCisJLyogc3Rhc2ggYSBM aXN0IG9mIHRoZSBjb2xsYXRpb24gT2lkcyBpbiBvdXIgQ29uc3RyYWludCBub2RlICovCisJ Zm9yIChpID0gMDsgaSA8IG51bWtleXM7IGkrKykKKwkJY29uLT5vbGRfY29sbGF0aW9ucyA9 IGxhcHBlbmRfb2lkKGNvbi0+b2xkX2NvbGxhdGlvbnMsCisJCQkJCQkJCQkJICBsaXN0X250 aF9vaWQoY2hhbmdlZENvbGxhdGlvbk9pZHMsIGF0dGFycltpXSAtIDEpKTsKKwogCVJlbGVh c2VTeXNDYWNoZSh0dXApOwogfQogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9w YXJzZW5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgKaW5kZXggYjg5 YmFlZjk1ZDMuLjk2YzcxYzc1MTE1IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9w YXJzZW5vZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oCkBAIC0y NjkxLDYgKzI2OTEsOCBAQCB0eXBlZGVmIHN0cnVjdCBDb25zdHJhaW50CiAJY2hhcgkJZmtf ZGVsX2FjdGlvbjsJLyogT04gREVMRVRFIGFjdGlvbiAqLwogCUxpc3QJICAgKmZrX2RlbF9z ZXRfY29sczsJLyogT04gREVMRVRFIFNFVCBOVUxML0RFRkFVTFQgKGNvbDEsIGNvbDIpICov CiAJTGlzdAkgICAqb2xkX2NvbnBmZXFvcDsJLyogcGdfY29uc3RyYWludC5jb25wZmVxb3Ag b2YgbXkgZm9ybWVyIHNlbGYgKi8KKwlMaXN0CSAgICpvbGRfY29sbGF0aW9uczsJLyogY29s bGF0aW9ucyBvZiByZWZlcmVuY2VkIGNvbHVtbnMsCisJCQkJCQkJCSAgIGJlZm9yZSBjaGFu Z2UgKi8KIAlPaWQJCQlvbGRfcGt0YWJsZV9vaWQ7CS8qIHBnX2NvbnN0cmFpbnQuY29uZnJl bGlkIG9mIG15IGZvcm1lcgogCQkJCQkJCQkJICogc2VsZiAqLwogCmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0IGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51dGY4Lm91dAppbmRleCA0YjhjOGYx NDNmMy4uNDExOTc3NmYwZDggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9jb2xsYXRlLmljdS51dGY4Lm91dApAQCAtMTkzMyw2ICsxOTMzLDE1IEBAIFNFTEVDVCAq IEZST00gdGVzdDExZms7CiAtLS0KICgwIHJvd3MpCiAKKy0tIFRlc3QgYWx0ZXJpbmcgdGhl IGNvbGxhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgcGt0 YWJsZSAoeCB0ZXh0IENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSBQUklNQVJZIEtFWSk7CitD UkVBVEUgVEFCTEUgZmt0YWJsZSAoeCB0ZXh0IFJFRkVSRU5DRVMgcGt0YWJsZSk7CitJTlNF UlQgSU5UTyBwa3RhYmxlIFZBTFVFUyAoJ2EnKTsKK0lOU0VSVCBJTlRPIGZrdGFibGUgVkFM VUVTICgnQScpOworLS0gc2hvdWxkIGZhaWw6CitBTFRFUiBUQUJMRSBwa3RhYmxlIEFMVEVS IENPTFVNTiB4IFRZUEUgdGV4dCBDT0xMQVRFICJDIjsKK0VSUk9SOiAgaW5zZXJ0IG9yIHVw ZGF0ZSBvbiB0YWJsZSAiZmt0YWJsZSIgdmlvbGF0ZXMgZm9yZWlnbiBrZXkgY29uc3RyYWlu dCAiZmt0YWJsZV94X2ZrZXkiCitERVRBSUw6ICBLZXkgKHgpPShBKSBpcyBub3QgcHJlc2Vu dCBpbiB0YWJsZSAicGt0YWJsZSIuCiAtLSBwYXJ0aXRpb25pbmcKIENSRUFURSBUQUJMRSB0 ZXN0MjAgKGEgaW50LCBiIHRleHQgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlKSBQQVJUSVRJ T04gQlkgTElTVCAoYik7CiBDUkVBVEUgVEFCTEUgdGVzdDIwXzEgUEFSVElUSU9OIE9GIHRl c3QyMCBGT1IgVkFMVUVTIElOICgnYWJjJyk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Nv bGxhdGUuaWN1LnV0Zjguc3FsCmluZGV4IDgwZjI4YTk3ZDc4Li4wOGE2OTY0OTUwYiAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKQEAgLTcyMSw2 ICs3MjEsMTQgQEAgREVMRVRFIEZST00gdGVzdDExcGsgV0hFUkUgeCA9ICdhYmMnOwogU0VM RUNUICogRlJPTSB0ZXN0MTFwazsKIFNFTEVDVCAqIEZST00gdGVzdDExZms7CiAKKy0tIFRl c3QgYWx0ZXJpbmcgdGhlIGNvbGxhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4uCitD UkVBVEUgVEFCTEUgcGt0YWJsZSAoeCB0ZXh0IENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSBQ UklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgZmt0YWJsZSAoeCB0ZXh0IFJFRkVSRU5DRVMg cGt0YWJsZSk7CitJTlNFUlQgSU5UTyBwa3RhYmxlIFZBTFVFUyAoJ2EnKTsKK0lOU0VSVCBJ TlRPIGZrdGFibGUgVkFMVUVTICgnQScpOworLS0gc2hvdWxkIGZhaWw6CitBTFRFUiBUQUJM RSBwa3RhYmxlIEFMVEVSIENPTFVNTiB4IFRZUEUgdGV4dCBDT0xMQVRFICJDIjsKKwogLS0g cGFydGl0aW9uaW5nCiBDUkVBVEUgVEFCTEUgdGVzdDIwIChhIGludCwgYiB0ZXh0IENPTExB VEUgY2FzZV9pbnNlbnNpdGl2ZSkgUEFSVElUSU9OIEJZIExJU1QgKGIpOwogQ1JFQVRFIFRB QkxFIHRlc3QyMF8xIFBBUlRJVElPTiBPRiB0ZXN0MjAgRk9SIFZBTFVFUyBJTiAoJ2FiYycp OwotLSAKMi40Mi4wCgo= --------------p32wt2C1Iu4z22k8BUItXAZj--