From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30845 invoked by alias); 22 Jul 2011 14:01:27 -0000 Received: (qmail 30832 invoked by uid 22791); 22 Jul 2011 14:01:23 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_GM,TW_PM X-Spam-Check-By: sourceware.org Received: from mail-qy0-f182.google.com (HELO mail-qy0-f182.google.com) (209.85.216.182) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 22 Jul 2011 14:00:59 +0000 Received: by qyk38 with SMTP id 38so1389915qyk.20 for ; Fri, 22 Jul 2011 07:00:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.86.72 with SMTP id r8mr1256026qcl.84.1311343258320; Fri, 22 Jul 2011 07:00:58 -0700 (PDT) Received: by 10.229.98.193 with HTTP; Fri, 22 Jul 2011 07:00:58 -0700 (PDT) In-Reply-To: References: <20110722123042.GB2687@tyan-ft48-01.lab.bos.redhat.com> Date: Fri, 22 Jul 2011 14:17:00 -0000 Message-ID: Subject: Re: PING: PATCH: PR target/46770: Use .init_array/.fini_array sections From: "H.J. Lu" To: Jakub Jelinek Cc: GCC Patches Content-Type: multipart/mixed; boundary=001636427277173ead04a8a8e537 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-07/txt/msg01961.txt.bz2 --001636427277173ead04a8a8e537 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 5210 On Fri, Jul 22, 2011 at 6:03 AM, H.J. Lu wrote: > On Fri, Jul 22, 2011 at 5:30 AM, Jakub Jelinek wrote: >> On Fri, Jul 22, 2011 at 04:59:28AM -0700, H.J. Lu wrote: >>> @@ -2660,6 +2664,7 @@ esac >>> =A0case ${target} in >>> =A0i[34567]86-*-linux* | x86_64-*-linux*) >>> =A0 =A0 =A0 tmake_file=3D"${tmake_file} i386/t-pmm_malloc i386/t-i386" >>> + =A0 =A0 use_initfini_array=3Dyes >>> =A0 =A0 =A0 ;; >>> =A0i[34567]86-*-* | x86_64-*-*) >>> =A0 =A0 =A0 tmake_file=3D"${tmake_file} i386/t-gmm_malloc i386/t-i386" >> >> What is i?86/x86_64 specific on it? =A0Don't most other glibc targets >> want to use it too, perhaps with some arch specific tweaks? > > I do have a patch for all ELF targets: > > http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01416.html > > It touches many targets. . =A0But I only have one feedback from one > target maintainer. =A0I don't know how long it will take to review it. > > >>> --- /dev/null >>> +++ b/gcc/config/initfini-array.c >> >> This is ugly. =A0varasm.c already has lots of ELF specific code, simply >> put them there as well and only let configury set some macro which will >> allow targets to choose which of the implementations in the generic code >> they want to use (or if they want their own which e.g. calls the generic >> routine and does something additional to it etc.). =A0The sections proba= bly >> can be created only the first time you actually need them. > > I will do that. > >>> --- a/gcc/crtstuff.c >>> +++ b/gcc/crtstuff.c >>> @@ -189,6 +190,9 @@ typedef void (*func_ptr) (void); >>> =A0 =A0 refer to only the __CTOR_END__ symbol in crtend.o and the __DTO= R_LIST__ >>> =A0 =A0 symbol in crtbegin.o, where they are defined. =A0*/ >>> >>> +/* No need for .ctors/.dtors section if linker can place them in >>> + =A0 .init_array/.fini_array section. =A0*/ >>> +#ifndef NO_CTORS_DTORS_SECTIONS >>> =A0/* The -1 is a flag to __do_global_[cd]tors indicating that this tab= le >>> =A0 =A0 does not start with a count of elements. =A0*/ >>> =A0#ifdef CTOR_LIST_BEGIN >>> @@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1] >>> =A0 =A0__attribute__((section(".dtors"), aligned(sizeof(func_ptr)))) >>> =A0 =A0=3D { (func_ptr) (-1) }; >>> =A0#endif /* __DTOR_LIST__ alternatives */ >>> +#endif /* NO_CTORS_DTORS_SECTIONS */ >>> >>> =A0#ifdef USE_EH_FRAME_REGISTRY >>> =A0/* Stick a label at the beginning of the frame unwind info so we can= register >>> @@ -489,6 +494,9 @@ __do_global_ctors_1(void) >>> >>> =A0#elif defined(CRT_END) /* ! CRT_BEGIN */ >>> >>> +/* No need for .ctors/.dtors section if linker can place them in >>> + =A0 .init_array/.fini_array section. =A0*/ >>> +#ifndef NO_CTORS_DTORS_SECTIONS >>> =A0/* Put a word containing zero at the end of each of our two lists of= function >>> =A0 =A0 addresses. =A0Note that the words defined here go into the .cto= rs and .dtors >>> =A0 =A0 sections of the crtend.o file, and since that file is always li= nked in >>> @@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1] >>> =A0 =A0__attribute__((used, section(".dtors"), aligned(sizeof(func_ptr)= ))) >>> =A0 =A0=3D { (func_ptr) 0 }; >>> =A0#endif >>> +#endif /* NO_CTORS_DTORS_SECTIONS */ >>> >>> =A0#ifdef EH_FRAME_SECTION_NAME >>> =A0/* Terminate the frame unwind info section with a 4byte 0 as a senti= nel; >> >> I don't see how you can do this. =A0It would IMO break any time you link= code >> built by different gcc versions where some code emitted by the older gcc >> used .ctors or .dtors. > > crtstuff.c is used to generate crt*.o, which is the part of GCC. =A0You o= nly use > it with the GCC you are using. =A0Since your GCC doesn't put anything in > .ctors/.dtors section, you don't need them. =A0As for .o files generated = by > old GCCs, that is the linker test, use_initfini_array, is for. =A0The new= er linker > can put input .ctors/.dtors sections in output .init_array/,fini_array se= ctions. > > Here is the updated patch. Any comments? Thanks. --=20 H.J. --- 2011-07-22 H.J. Lu PR target/46770 * config.gcc (use_initfini_array): New variable. Use .init_arary/.fini_array if they are supported. * crtstuff.c: Don't generate .ctors nor .dtors sections if USE_INITFINI_ARRAY is defined. * output.h (default_initfini_array_init_sections): New. * varasm.c (elf_init_array_section): Likewise. (elf_fini_array_section): Likewise. (get_elf_initfini_array_priority_section): Likewise. (default_elf_init_array_asm_out_constructor): Likewise. (default_elf_fini_array_asm_out_destructor): Likewise. (default_initfini_array_init_sections): Likewise. * config/initfini-array.h: New. * config/t-initfini-array: Likewise. * config/arm/arm.c (arm_asm_init_sections): Call default_initfini_array_init_sections. * config/avr/avr.c (avr_asm_init_sections): Likewise. * config/ia64/ia64.c (ia64_asm_init_sections): Likewise. * config/mep/mep.c (mep_asm_init_sections): Likewise. * config/microblaze/microblaze.c (microblaze_elf_asm_init_sections): Likewise. * config/rs6000/rs6000.c (rs6000_elf_asm_init_sections): Likewise. * config/stormy16/stormy16.c (xstormy16_asm_init_sections): Likewise. * config/v850/v850.c (v850_asm_init_sections): Likewise. --001636427277173ead04a8a8e537 Content-Type: text/plain; charset=US-ASCII; name="gcc-pr46770-7.patch" Content-Disposition: attachment; filename="gcc-pr46770-7.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gqf7uwrf0 Content-length: 18024 MjAxMS0wNy0yMiAgSC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwuY29tPgoK CVBSIHRhcmdldC80Njc3MAoJKiBjb25maWcuZ2NjICh1c2VfaW5pdGZpbmlf YXJyYXkpOiBOZXcgdmFyaWFibGUuCglVc2UgLmluaXRfYXJhcnkvLmZpbmlf YXJyYXkgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgoKCSogY3J0c3R1ZmYuYzog RG9uJ3QgZ2VuZXJhdGUgLmN0b3JzIG5vciAuZHRvcnMgc2VjdGlvbnMgaWYK CVVTRV9JTklURklOSV9BUlJBWSBpcyBkZWZpbmVkLgoKCSogb3V0cHV0Lmgg KGRlZmF1bHRfaW5pdGZpbmlfYXJyYXlfaW5pdF9zZWN0aW9ucyk6IE5ldy4K CSogdmFyYXNtLmMgKGVsZl9pbml0X2FycmF5X3NlY3Rpb24pOiBMaWtld2lz ZS4KCShlbGZfZmluaV9hcnJheV9zZWN0aW9uKTogTGlrZXdpc2UuCgkoZ2V0 X2VsZl9pbml0ZmluaV9hcnJheV9wcmlvcml0eV9zZWN0aW9uKTogTGlrZXdp c2UuCgkoZGVmYXVsdF9lbGZfaW5pdF9hcnJheV9hc21fb3V0X2NvbnN0cnVj dG9yKTogTGlrZXdpc2UuCgkoZGVmYXVsdF9lbGZfZmluaV9hcnJheV9hc21f b3V0X2Rlc3RydWN0b3IpOiBMaWtld2lzZS4KCShkZWZhdWx0X2luaXRmaW5p X2FycmF5X2luaXRfc2VjdGlvbnMpOiBMaWtld2lzZS4KCgkqIGNvbmZpZy9p bml0ZmluaS1hcnJheS5oOiBOZXcuCgkqIGNvbmZpZy90LWluaXRmaW5pLWFy cmF5OiBMaWtld2lzZS4KCgkqIGNvbmZpZy9hcm0vYXJtLmMgKGFybV9hc21f aW5pdF9zZWN0aW9ucyk6IENhbGwKCWRlZmF1bHRfaW5pdGZpbmlfYXJyYXlf aW5pdF9zZWN0aW9ucy4KCSogY29uZmlnL2F2ci9hdnIuYyAoYXZyX2FzbV9p bml0X3NlY3Rpb25zKTogTGlrZXdpc2UuCgkqIGNvbmZpZy9pYTY0L2lhNjQu YyAoaWE2NF9hc21faW5pdF9zZWN0aW9ucyk6IExpa2V3aXNlLgoJKiBjb25m aWcvbWVwL21lcC5jIChtZXBfYXNtX2luaXRfc2VjdGlvbnMpOiBMaWtld2lz ZS4KCSogY29uZmlnL21pY3JvYmxhemUvbWljcm9ibGF6ZS5jIChtaWNyb2Js YXplX2VsZl9hc21faW5pdF9zZWN0aW9ucyk6CglMaWtld2lzZS4KCSogY29u ZmlnL3JzNjAwMC9yczYwMDAuYyAocnM2MDAwX2VsZl9hc21faW5pdF9zZWN0 aW9ucyk6IExpa2V3aXNlLgoJKiBjb25maWcvc3Rvcm15MTYvc3Rvcm15MTYu YyAoeHN0b3JteTE2X2FzbV9pbml0X3NlY3Rpb25zKToKCUxpa2V3aXNlLgoJ KiBjb25maWcvdjg1MC92ODUwLmMgKHY4NTBfYXNtX2luaXRfc2VjdGlvbnMp OiBMaWtld2lzZS4KCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnLmdjYyBiL2dj Yy9jb25maWcuZ2NjCmluZGV4IDRhMTZmZjguLjBlYWM0M2EgMTAwNjQ0Ci0t LSBhL2djYy9jb25maWcuZ2NjCisrKyBiL2djYy9jb25maWcuZ2NjCkBAIC0x ODYsNiArMTg2LDkgQEAKICMgIGNvbmZpZ3VyZV9kZWZhdWx0X29wdGlvbnMK ICMJCQlTZXQgdG8gYW4gaW5pdGlhbGl6ZXIgZm9yIGNvbmZpZ3VyZV9kZWZh dWx0X29wdGlvbnMKICMJCQlpbiBjb25maWdhcmdzLmgsIGJhc2VkIG9uIC0t d2l0aC1jcHUgZXQgY2V0ZXJhLgorIworIyAgdXNlX2luaXRmaW5pX2FycmF5 CUlmIHNldCB0byB5ZXMsIC5pbml0X2FycmF5Ly5maW5pX2FycmF5IHNlY3Rp b25zCisjCQkJd2lsbCBiZSB1c2VkIGlmIHRoZXkgd29yay4KIAogIyBUaGUg Zm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgdXNlZCBpbiBlYWNoIGNhc2UtY29u c3RydWN0IHRvIGJ1aWxkIHVwIHRoZQogIyBvdXRnb2luZyB2YXJpYWJsZXM6 CkBAIC0yMzgsNiArMjQxLDcgQEAgZGVmYXVsdF9nbnVfaW5kaXJlY3RfZnVu Y3Rpb249bm8KIHRhcmdldF9ndGZpbGVzPQogbmVlZF82NGJpdF9od2ludD0K IG5lZWRfNjRiaXRfaXNhPQordXNlX2luaXRmaW5pX2FycmF5PXllcwogCiAj IERvbid0IGNhcnJ5IHRoZXNlIG92ZXIgYnVpbGQtPmhvc3QtPnRhcmdldC4g IFBsZWFzZS4KIHhtX2ZpbGU9CkBAIC0zMDUzLDYgKzMwNTcsMTQgQEAgaWYg dGVzdCB4JHdpdGhfc2NoZWR1bGUgPSB4OyB0aGVuCiAJZXNhYwogZmkKIAor IyBTdXBwb3J0IC0tZW5hYmxlLWluaXRmaW5pLWFycmF5LiAgVXNlIGluaXRm aW5pLWFycmF5Lmggb25seSBpZgorIyB1c2VfaW5pdGZpbmlfYXJyYXkgaXMg YWxzbyBzZXQgdG8geWVzLiAgU29tZSBwbGF0Zm9ybXMgZG9uJ3QgbmVlZCBp dAorIyBldmVuIGlmIGVuYWJsZV9pbml0ZmluaV9hcnJheSBpcyB5ZXMuCitp ZiB0ZXN0IHgkZW5hYmxlX2luaXRmaW5pX2FycmF5JHVzZV9pbml0ZmluaV9h cnJheSA9IHh5ZXN5ZXM7IHRoZW4KKyAgdG1fZmlsZT0iJHt0bV9maWxlfSBp bml0ZmluaS1hcnJheS5oIgorICB0bWFrZV9maWxlPSIke3RtYWtlX2ZpbGV9 IHQtaW5pdGZpbmktYXJyYXkiCitmaQorCiAjIFZhbGlkYXRlIGFuZCBtYXJr IGFzIHZhbGlkIGFueSAtLXdpdGggb3B0aW9ucyBzdXBwb3J0ZWQKICMgYnkg dGhpcyB0YXJnZXQuICBJbiBvcmRlciB0byB1c2UgYSBwYXJ0aWN1bGFyIC0t d2l0aCBvcHRpb24KICMgeW91IG11c3QgbGlzdCBpdCBpbiBzdXBwb3J0ZWRf ZGVmYXVsdHM7IHZhbGlkYXRpbmcgdGhlIHZhbHVlCmRpZmYgLS1naXQgYS9n Y2MvY29uZmlnL2FybS9hcm0uYyBiL2djYy9jb25maWcvYXJtL2FybS5jCmlu ZGV4IDZlMmI3OTkuLjAyYjcxM2UgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcv YXJtL2FybS5jCisrKyBiL2djYy9jb25maWcvYXJtL2FybS5jCkBAIC0yMzAy Myw2ICsyMzAyMyw3IEBAIGFybV9hc21faW5pdF9zZWN0aW9ucyAodm9pZCkK IHsKICAgZXhjZXB0aW9uX3NlY3Rpb24gPSBnZXRfdW5uYW1lZF9zZWN0aW9u ICgwLCBvdXRwdXRfc2VjdGlvbl9hc21fb3AsCiAJCQkJCSAgICJcdC5oYW5k bGVyZGF0YSIpOworICBkZWZhdWx0X2luaXRmaW5pX2FycmF5X2luaXRfc2Vj dGlvbnMgKCk7CiB9CiAjZW5kaWYgLyogQVJNX1VOV0lORF9JTkZPICovCiAK ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXZyL2F2ci5jIGIvZ2NjL2NvbmZp Zy9hdnIvYXZyLmMKaW5kZXggNDk1MWY1Ni4uYmI3MmJiYSAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9hdnIvYXZyLmMKKysrIGIvZ2NjL2NvbmZpZy9hdnIv YXZyLmMKQEAgLTUwOTksNiArNTA5OSw4IEBAIGF2cl9hc21faW5pdF9zZWN0 aW9ucyAodm9pZCkKICAgcmVhZG9ubHlfZGF0YV9zZWN0aW9uLT51bm5hbWVk LmNhbGxiYWNrID0gYXZyX291dHB1dF9kYXRhX3NlY3Rpb25fYXNtX29wOwog ICBkYXRhX3NlY3Rpb24tPnVubmFtZWQuY2FsbGJhY2sgPSBhdnJfb3V0cHV0 X2RhdGFfc2VjdGlvbl9hc21fb3A7CiAgIGJzc19zZWN0aW9uLT51bm5hbWVk LmNhbGxiYWNrID0gYXZyX291dHB1dF9ic3Nfc2VjdGlvbl9hc21fb3A7CisK KyAgZGVmYXVsdF9pbml0ZmluaV9hcnJheV9pbml0X3NlY3Rpb25zICgpOwog fQogCiAKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaWE2NC9pYTY0LmMgYi9n Y2MvY29uZmlnL2lhNjQvaWE2NC5jCmluZGV4IGZhM2I5M2YuLjViOGVhMDEg MTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaWE2NC9pYTY0LmMKKysrIGIvZ2Nj L2NvbmZpZy9pYTY0L2lhNjQuYwpAQCAtOTk4OSw2ICs5OTg5LDcgQEAgaWE2 NF9hc21faW5pdF9zZWN0aW9ucyAodm9pZCkKIHsKICAgZXhjZXB0aW9uX3Nl Y3Rpb24gPSBnZXRfdW5uYW1lZF9zZWN0aW9uICgwLCBvdXRwdXRfc2VjdGlv bl9hc21fb3AsCiAJCQkJCSAgICJcdC5oYW5kbGVyZGF0YSIpOworICBkZWZh dWx0X2luaXRmaW5pX2FycmF5X2luaXRfc2VjdGlvbnMgKCk7CiB9CiAKIC8q IEltcGxlbWVudCBUQVJHRVRfREVCVUdfVU5XSU5EX0lORk8uICAqLwpkaWZm IC0tZ2l0IGEvZ2NjL2NvbmZpZy9pbml0ZmluaS1hcnJheS5oIGIvZ2NjL2Nv bmZpZy9pbml0ZmluaS1hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjkxNGNmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv Y29uZmlnL2luaXRmaW5pLWFycmF5LmgKQEAgLTAsMCArMSw0NCBAQAorLyog RGVmaW5pdGlvbnMgZm9yIEVMRiBzeXN0ZW1zIHdpdGggLmluaXRfYXJyYXkv LmZpbmlfYXJyYXkgc2VjdGlvbgorICAgc3VwcG9ydC4KKyAgIENvcHlyaWdo dCAoQykgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBv ciAoYXQgeW91cgorICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKwor ICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgICBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC SUxJVFkKKyAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAg IGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBu b3Qgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAq LworCisjZGVmaW5lIFVTRV9JTklURklOSV9BUlJBWQorCisjdW5kZWYgSU5J VF9TRUNUSU9OX0FTTV9PUAorI3VuZGVmIEZJTklfU0VDVElPTl9BU01fT1AK KworLyogRklYTUU6IElOSVRfQVJSQVlfU0VDVElPTl9BU01fT1AgYW5kIEZJ TklfQVJSQVlfU0VDVElPTl9BU01fT1AKKwkgIGFyZW4ndCB1c2VkIGluIGFu eSBhc3NlbWJseSBjb2Rlcy4gIEJ1dCB3ZSBoYXZlIHRvIGRlZmluZQorCSAg dGhlbSB0byBzb21ldGhpbmcuICAqLworI2RlZmluZSBJTklUX0FSUkFZX1NF Q1RJT05fQVNNX09QIFNvbWV0aGluZworI2RlZmluZSBGSU5JX0FSUkFZX1NF Q1RJT05fQVNNX09QIFNvbWV0aGluZworCisjaWZuZGVmIFRBUkdFVF9BU01f SU5JVF9TRUNUSU9OUworI2RlZmluZSBUQVJHRVRfQVNNX0lOSVRfU0VDVElP TlMgZGVmYXVsdF9lbGZfaW5pdGZpbmlfYXJyYXlfaW5pdF9zZWN0aW9ucwor I2VuZGlmCitleHRlcm4gdm9pZCBkZWZhdWx0X2VsZl9pbml0ZmluaV9hcnJh eV9pbml0X3NlY3Rpb25zICh2b2lkKTsKKworLyogVXNlIC5pbml0X2FycmF5 Ly5maW5pX2FycmF5IHNlY3Rpb24gZm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVz dHJ1Y3RvcnMuICovCisjdW5kZWYgVEFSR0VUX0FTTV9DT05TVFJVQ1RPUgor I2RlZmluZSBUQVJHRVRfQVNNX0NPTlNUUlVDVE9SIGRlZmF1bHRfZWxmX2lu aXRfYXJyYXlfYXNtX291dF9jb25zdHJ1Y3RvcgorI3VuZGVmIFRBUkdFVF9B U01fREVTVFJVQ1RPUgorI2RlZmluZSBUQVJHRVRfQVNNX0RFU1RSVUNUT1Ig ZGVmYXVsdF9lbGZfZmluaV9hcnJheV9hc21fb3V0X2Rlc3RydWN0b3IKK2V4 dGVybiB2b2lkIGRlZmF1bHRfZWxmX2luaXRfYXJyYXlfYXNtX291dF9jb25z dHJ1Y3RvciAocnR4LCBpbnQpOworZXh0ZXJuIHZvaWQgZGVmYXVsdF9lbGZf ZmluaV9hcnJheV9hc21fb3V0X2Rlc3RydWN0b3IgKHJ0eCwgaW50KTsKZGlm ZiAtLWdpdCBhL2djYy9jb25maWcvbWVwL21lcC5jIGIvZ2NjL2NvbmZpZy9t ZXAvbWVwLmMKaW5kZXggYzE4ZTdiNy4uNWE0ZDVhNiAxMDA2NDQKLS0tIGEv Z2NjL2NvbmZpZy9tZXAvbWVwLmMKKysrIGIvZ2NjL2NvbmZpZy9tZXAvbWVw LmMKQEAgLTczMzYsNiArNzMzNiw3IEBAIG1lcF9hc21faW5pdF9zZWN0aW9u cyAodm9pZCkKICAgICA9IGdldF91bm5hbWVkX3NlY3Rpb24gKFNFQ1RJT05f Q09ERSwgb3V0cHV0X3NlY3Rpb25fYXNtX29wLAogCQkJICAgIlx0LnNlY3Rp b24gLmZ0ZXh0LFwiYXhcIlxuXHQuY29yZSIpOwogCisgIGRlZmF1bHRfaW5p dGZpbmlfYXJyYXlfaW5pdF9zZWN0aW9ucyAoKTsKIH0KIAwKIC8qIEluaXRp YWxpemUgdGhlIEdDQyB0YXJnZXQgc3RydWN0dXJlLiAgKi8KZGlmZiAtLWdp dCBhL2djYy9jb25maWcvbWljcm9ibGF6ZS9taWNyb2JsYXplLmMgYi9nY2Mv Y29uZmlnL21pY3JvYmxhemUvbWljcm9ibGF6ZS5jCmluZGV4IDI4OGI4NmYu LmUzMTI5NmQgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvbWljcm9ibGF6ZS9t aWNyb2JsYXplLmMKKysrIGIvZ2NjL2NvbmZpZy9taWNyb2JsYXplL21pY3Jv YmxhemUuYwpAQCAtMjc1Myw2ICsyNzUzLDcgQEAgbWljcm9ibGF6ZV9lbGZf YXNtX2luaXRfc2VjdGlvbnMgKHZvaWQpCiAgIHNkYXRhMl9zZWN0aW9uCiAg ICAgPSBnZXRfdW5uYW1lZF9zZWN0aW9uIChTRUNUSU9OX1dSSVRFLCBvdXRw dXRfc2VjdGlvbl9hc21fb3AsCiAJCQkgICBTREFUQTJfU0VDVElPTl9BU01f T1ApOworICBkZWZhdWx0X2luaXRmaW5pX2FycmF5X2luaXRfc2VjdGlvbnMg KCk7CiB9CiAKIC8qICBHZW5lcmF0ZSBhc3NlbWJsZXIgY29kZSBmb3IgY29u c3RhbnQgcGFydHMgb2YgYSB0cmFtcG9saW5lLiAgKi8KZGlmZiAtLWdpdCBh L2djYy9jb25maWcvcnM2MDAwL3JzNjAwMC5jIGIvZ2NjL2NvbmZpZy9yczYw MDAvcnM2MDAwLmMKaW5kZXggMjBiM2NiOC4uZDgxZmY5NCAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9yczYwMDAvcnM2MDAwLmMKKysrIGIvZ2NjL2NvbmZp Zy9yczYwMDAvcnM2MDAwLmMKQEAgLTI0NzY2LDYgKzI0NzY2LDggQEAgcnM2 MDAwX2VsZl9hc21faW5pdF9zZWN0aW9ucyAodm9pZCkKICAgc2RhdGEyX3Nl Y3Rpb24KICAgICA9IGdldF91bm5hbWVkX3NlY3Rpb24gKFNFQ1RJT05fV1JJ VEUsIG91dHB1dF9zZWN0aW9uX2FzbV9vcCwKIAkJCSAgIFNEQVRBMl9TRUNU SU9OX0FTTV9PUCk7CisKKyAgZGVmYXVsdF9pbml0ZmluaV9hcnJheV9pbml0 X3NlY3Rpb25zICgpOwogfQogCiAvKiBJbXBsZW1lbnQgVEFSR0VUX1NFTEVD VF9SVFhfU0VDVElPTi4gICovCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3N0 b3JteTE2L3N0b3JteTE2LmMgYi9nY2MvY29uZmlnL3N0b3JteTE2L3N0b3Jt eTE2LmMKaW5kZXggOTEwZGMyZS4uODM1YmEyYiAxMDA2NDQKLS0tIGEvZ2Nj L2NvbmZpZy9zdG9ybXkxNi9zdG9ybXkxNi5jCisrKyBiL2djYy9jb25maWcv c3Rvcm15MTYvc3Rvcm15MTYuYwpAQCAtMTU3Myw2ICsxNTczLDcgQEAgeHN0 b3JteTE2X2FzbV9pbml0X3NlY3Rpb25zICh2b2lkKQogICAgID0gZ2V0X3Vu bmFtZWRfc2VjdGlvbiAoU0VDVElPTl9XUklURSB8IFNFQ1RJT05fQlNTLAog CQkJICAgb3V0cHV0X3NlY3Rpb25fYXNtX29wLAogCQkJICAgIlx0LnNlY3Rp b24gXCIuYnNzX2JlbG93MTAwXCIsXCJhd1wiLEBub2JpdHMiKTsKKyAgZGVm YXVsdF9pbml0ZmluaV9hcnJheV9pbml0X3NlY3Rpb25zICgpOwogfQogCiAv KiBNYXJrIHN5bWJvbHMgd2l0aCB0aGUgImJlbG93MTAwIiBhdHRyaWJ1dGUg c28gdGhhdCB3ZSBjYW4gdXNlIHRoZQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZp Zy90LWluaXRmaW5pLWFycmF5IGIvZ2NjL2NvbmZpZy90LWluaXRmaW5pLWFy cmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjRl ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL3QtaW5pdGZpbmkt YXJyYXkKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEK KyMgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMg VGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorIworIyBHQ0MgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91 ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBHQ0MgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQor IyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdD Qzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorIyA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2luaXRmaW5pLWFycmF5 Lm86ICQoc3JjZGlyKS9jb25maWcvaW5pdGZpbmktYXJyYXkuYyBndC1pbml0 ZmluaS1hcnJheS5oIFwKKwkkKENPTkZJR19IKSAkKFNZU1RFTV9IKSBjb3Jl dHlwZXMuaCAkKFRBUkdFVF9IKSBvdXRwdXQuaCBcCisJJChUUkVFX0gpICQo R0dDX0gpCisJJChDT01QSUxFUikgLWMgJChBTExfQ09NUElMRVJGTEFHUykg JChBTExfQ1BQRkxBR1MpICQoSU5DTFVERVMpICQ8CmRpZmYgLS1naXQgYS9n Y2MvY29uZmlnL3Y4NTAvdjg1MC5jIGIvZ2NjL2NvbmZpZy92ODUwL3Y4NTAu YwppbmRleCA1MDc0ZWJlLi42NjY2NTQ0IDEwMDY0NAotLS0gYS9nY2MvY29u ZmlnL3Y4NTAvdjg1MC5jCisrKyBiL2djYy9jb25maWcvdjg1MC92ODUwLmMK QEAgLTI5MDAsNiArMjkwMCw4IEBAIHY4NTBfYXNtX2luaXRfc2VjdGlvbnMg KHZvaWQpCiAgICAgPSBnZXRfdW5uYW1lZF9zZWN0aW9uIChTRUNUSU9OX1dS SVRFIHwgU0VDVElPTl9CU1MsCiAJCQkgICBvdXRwdXRfc2VjdGlvbl9hc21f b3AsCiAJCQkgICAiXHQuc2VjdGlvbiAuemJzcyxcImF3XCIiKTsKKworICBk ZWZhdWx0X2luaXRmaW5pX2FycmF5X2luaXRfc2VjdGlvbnMgKCk7CiB9CiAK IHN0YXRpYyBzZWN0aW9uICoKZGlmZiAtLWdpdCBhL2djYy9jcnRzdHVmZi5j IGIvZ2NjL2NydHN0dWZmLmMKaW5kZXggYjY1ZjQ5MC4uMDEwZDQ3MiAxMDA2 NDQKLS0tIGEvZ2NjL2NydHN0dWZmLmMKKysrIGIvZ2NjL2NydHN0dWZmLmMK QEAgLTEsNyArMSw4IEBACiAvKiBTcGVjaWFsaXplZCBiaXRzIG9mIGNvZGUg bmVlZGVkIHRvIHN1cHBvcnQgY29uc3RydWN0aW9uIGFuZAogICAgZGVzdHJ1 Y3Rpb24gb2YgZmlsZS1zY29wZSBvYmplY3RzIGluIEMrKyBjb2RlLgogICAg Q29weXJpZ2h0IChDKSAxOTkxLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAx OTk4LCAxOTk5LCAyMDAwLCAyMDAxCi0gICAyMDAyLCAyMDAzLCAyMDA0LCAy MDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgSW5jLgorICAgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAw NiwgMjAwNywgMjAwOSwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBSb24gR3VpbG1l dHRlIChyZmdAbW9ua2V5cy5jb20pLgogCiBUaGlzIGZpbGUgaXMgcGFydCBv ZiBHQ0MuCkBAIC0xODksNiArMTkwLDkgQEAgdHlwZWRlZiB2b2lkICgqZnVu Y19wdHIpICh2b2lkKTsKICAgIHJlZmVyIHRvIG9ubHkgdGhlIF9fQ1RPUl9F TkRfXyBzeW1ib2wgaW4gY3J0ZW5kLm8gYW5kIHRoZSBfX0RUT1JfTElTVF9f CiAgICBzeW1ib2wgaW4gY3J0YmVnaW4ubywgd2hlcmUgdGhleSBhcmUgZGVm aW5lZC4gICovCiAKKy8qIE5vIG5lZWQgZm9yIC5jdG9ycy8uZHRvcnMgc2Vj dGlvbiBpZiBsaW5rZXIgY2FuIHBsYWNlIHRoZW0gaW4KKyAgIC5pbml0X2Fy cmF5Ly5maW5pX2FycmF5IHNlY3Rpb24uICAqLworI2lmbmRlZiBVU0VfSU5J VEZJTklfQVJSQVkKIC8qIFRoZSAtMSBpcyBhIGZsYWcgdG8gX19kb19nbG9i YWxfW2NkXXRvcnMgaW5kaWNhdGluZyB0aGF0IHRoaXMgdGFibGUKICAgIGRv ZXMgbm90IHN0YXJ0IHdpdGggYSBjb3VudCBvZiBlbGVtZW50cy4gICovCiAj aWZkZWYgQ1RPUl9MSVNUX0JFR0lOCkBAIC0yMTksNiArMjIzLDcgQEAgU1RB VElDIGZ1bmNfcHRyIF9fRFRPUl9MSVNUX19bMV0KICAgX19hdHRyaWJ1dGVf Xygoc2VjdGlvbigiLmR0b3JzIiksIGFsaWduZWQoc2l6ZW9mKGZ1bmNfcHRy KSkpKQogICA9IHsgKGZ1bmNfcHRyKSAoLTEpIH07CiAjZW5kaWYgLyogX19E VE9SX0xJU1RfXyBhbHRlcm5hdGl2ZXMgKi8KKyNlbmRpZiAvKiBVU0VfSU5J VEZJTklfQVJSQVkgKi8KIAogI2lmZGVmIFVTRV9FSF9GUkFNRV9SRUdJU1RS WQogLyogU3RpY2sgYSBsYWJlbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBm cmFtZSB1bndpbmQgaW5mbyBzbyB3ZSBjYW4gcmVnaXN0ZXIKQEAgLTQ4OSw2 ICs0OTQsOSBAQCBfX2RvX2dsb2JhbF9jdG9yc18xKHZvaWQpCiAKICNlbGlm IGRlZmluZWQoQ1JUX0VORCkgLyogISBDUlRfQkVHSU4gKi8KIAorLyogTm8g bmVlZCBmb3IgLmN0b3JzLy5kdG9ycyBzZWN0aW9uIGlmIGxpbmtlciBjYW4g cGxhY2UgdGhlbSBpbgorICAgLmluaXRfYXJyYXkvLmZpbmlfYXJyYXkgc2Vj dGlvbi4gICovCisjaWZuZGVmIFVTRV9JTklURklOSV9BUlJBWQogLyogUHV0 IGEgd29yZCBjb250YWluaW5nIHplcm8gYXQgdGhlIGVuZCBvZiBlYWNoIG9m IG91ciB0d28gbGlzdHMgb2YgZnVuY3Rpb24KICAgIGFkZHJlc3Nlcy4gIE5v dGUgdGhhdCB0aGUgd29yZHMgZGVmaW5lZCBoZXJlIGdvIGludG8gdGhlIC5j dG9ycyBhbmQgLmR0b3JzCiAgICBzZWN0aW9ucyBvZiB0aGUgY3J0ZW5kLm8g ZmlsZSwgYW5kIHNpbmNlIHRoYXQgZmlsZSBpcyBhbHdheXMgbGlua2VkIGlu CkBAIC01MzQsNiArNTQyLDcgQEAgU1RBVElDIGZ1bmNfcHRyIF9fRFRPUl9F TkRfX1sxXQogICBfX2F0dHJpYnV0ZV9fKCh1c2VkLCBzZWN0aW9uKCIuZHRv cnMiKSwgYWxpZ25lZChzaXplb2YoZnVuY19wdHIpKSkpCiAgID0geyAoZnVu Y19wdHIpIDAgfTsKICNlbmRpZgorI2VuZGlmIC8qIFVTRV9JTklURklOSV9B UlJBWSAqLwogCiAjaWZkZWYgRUhfRlJBTUVfU0VDVElPTl9OQU1FCiAvKiBU ZXJtaW5hdGUgdGhlIGZyYW1lIHVud2luZCBpbmZvIHNlY3Rpb24gd2l0aCBh IDRieXRlIDAgYXMgYSBzZW50aW5lbDsKZGlmZiAtLWdpdCBhL2djYy9vdXRw dXQuaCBiL2djYy9vdXRwdXQuaAppbmRleCBjNjY4ZDM1Li45MmE3MDc1IDEw MDY0NAotLS0gYS9nY2Mvb3V0cHV0LmgKKysrIGIvZ2NjL291dHB1dC5oCkBA IC02NTYsNiArNjU2LDggQEAgZXh0ZXJuIHZvaWQgZGVmYXVsdF9lbGZfYXNt X291dHB1dF9leHRlcm5hbCAoRklMRSAqZmlsZSwgdHJlZSwKIAkJCQkJICAg ICBjb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBtYXliZV9hc3NlbWJsZV92 aXNpYmlsaXR5ICh0cmVlKTsKIAorZXh0ZXJuIHZvaWQgZGVmYXVsdF9pbml0 ZmluaV9hcnJheV9pbml0X3NlY3Rpb25zICh2b2lkKTsKKwogZXh0ZXJuIGlu dCBkZWZhdWx0X2FkZHJlc3NfY29zdCAocnR4LCBib29sKTsKIAogLyogT3V0 cHV0IHN0YWNrIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KZGlmZiAtLWdpdCBh L2djYy92YXJhc20uYyBiL2djYy92YXJhc20uYwppbmRleCA4OGFlYTliLi5m OTY4NjNiIDEwMDY0NAotLS0gYS9nY2MvdmFyYXNtLmMKKysrIGIvZ2NjL3Zh cmFzbS5jCkBAIC03MzUwLDQgKzczNTAsNjIgQEAgbWFrZV9kZWJ1Z19leHBy X2Zyb21fcnRsIChjb25zdF9ydHggZXhwKQogICByZXR1cm4gZHZhbDsKIH0K IAorc3RhdGljIEdUWSgoKSkgc2VjdGlvbiAqZWxmX2luaXRfYXJyYXlfc2Vj dGlvbjsKK3N0YXRpYyBHVFkoKCkpIHNlY3Rpb24gKmVsZl9maW5pX2FycmF5 X3NlY3Rpb247CisKK3ZvaWQKK2RlZmF1bHRfZWxmX2luaXRmaW5pX2FycmF5 X2luaXRfc2VjdGlvbnMgKHZvaWQpCit7CisgIGVsZl9pbml0X2FycmF5X3Nl Y3Rpb24gPSBnZXRfdW5uYW1lZF9zZWN0aW9uICgwLCBvdXRwdXRfc2VjdGlv bl9hc21fb3AsCisJCQkJCQkiXHQuc2VjdGlvblx0LmluaXRfYXJyYXkiKTsK KyAgZWxmX2ZpbmlfYXJyYXlfc2VjdGlvbiA9IGdldF91bm5hbWVkX3NlY3Rp b24gKDAsIG91dHB1dF9zZWN0aW9uX2FzbV9vcCwKKwkJCQkJCSJcdC5zZWN0 aW9uXHQuZmluaV9hcnJheSIpOworfQorCitzdGF0aWMgc2VjdGlvbiAqCitn ZXRfZWxmX2luaXRmaW5pX2FycmF5X3ByaW9yaXR5X3NlY3Rpb24gKGludCBw cmlvcml0eSwKKwkJCQkJIGJvb2wgY29uc3RydWN0b3JfcCkKK3sKKyAgc2Vj dGlvbiAqc2VjOworICBpZiAocHJpb3JpdHkgIT0gREVGQVVMVF9JTklUX1BS SU9SSVRZKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzE4XTsKKyAgICAgIHNw cmludGYgKGJ1ZiwgIiVzLiUuNXUiLCAKKwkgICAgICAgY29uc3RydWN0b3Jf cCA/ICIuaW5pdF9hcnJheSIgOiAiLmZpbmlfYXJyYXkiLAorCSAgICAgICBw cmlvcml0eSk7CisgICAgICBzZWMgPSBnZXRfc2VjdGlvbiAoYnVmLCBTRUNU SU9OX1dSSVRFLCBOVUxMX1RSRUUpOworICAgIH0KKyAgZWxzZQorICAgIHNl YyA9IGNvbnN0cnVjdG9yX3AgPyBlbGZfaW5pdF9hcnJheV9zZWN0aW9uIDog ZWxmX2ZpbmlfYXJyYXlfc2VjdGlvbjsKKyAgcmV0dXJuIHNlYzsKK30KKwor LyogVXNlIC5pbml0X2FycmF5IHNlY3Rpb24gZm9yIGNvbnN0cnVjdG9ycy4g Ki8KKwordm9pZAorZGVmYXVsdF9lbGZfaW5pdF9hcnJheV9hc21fb3V0X2Nv bnN0cnVjdG9yIChydHggc3ltYm9sLCBpbnQgcHJpb3JpdHkpCit7CisgIHNl Y3Rpb24gKnNlYyA9IGdldF9lbGZfaW5pdGZpbmlfYXJyYXlfcHJpb3JpdHlf c2VjdGlvbiAocHJpb3JpdHksCisJCQkJCQkJICB0cnVlKTsKKyAgYXNzZW1i bGVfYWRkcl90b19zZWN0aW9uIChzeW1ib2wsIHNlYyk7Cit9CisKKy8qIFVz ZSAuZmluaV9hcnJheSBzZWN0aW9uIGZvciBkZXN0cnVjdG9ycy4gKi8KKwor dm9pZAorZGVmYXVsdF9lbGZfZmluaV9hcnJheV9hc21fb3V0X2Rlc3RydWN0 b3IgKHJ0eCBzeW1ib2wsIGludCBwcmlvcml0eSkKK3sKKyAgc2VjdGlvbiAq c2VjID0gZ2V0X2VsZl9pbml0ZmluaV9hcnJheV9wcmlvcml0eV9zZWN0aW9u IChwcmlvcml0eSwKKwkJCQkJCQkgIGZhbHNlKTsKKyAgYXNzZW1ibGVfYWRk cl90b19zZWN0aW9uIChzeW1ib2wsIHNlYyk7Cit9CisKK3ZvaWQKK2RlZmF1 bHRfaW5pdGZpbmlfYXJyYXlfaW5pdF9zZWN0aW9ucyAodm9pZCkKK3sKKyNp ZmRlZiBVU0VfSU5JVEZJTklfQVJSQVkKKyAgZGVmYXVsdF9lbGZfaW5pdGZp bmlfYXJyYXlfaW5pdF9zZWN0aW9ucyAoKTsKKyNlbmRpZgorfQorCiAjaW5j bHVkZSAiZ3QtdmFyYXNtLmgiCg== --001636427277173ead04a8a8e537--