From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 112182 invoked by alias); 12 Apr 2016 00:31:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 112171 invoked by uid 89); 12 Apr 2016 00:31:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_PASS,T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.2 spammy=crosscheck, cross-check, relocate, *attr X-HELO: mail-pf0-f193.google.com Received: from mail-pf0-f193.google.com (HELO mail-pf0-f193.google.com) (209.85.192.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 12 Apr 2016 00:31:24 +0000 Received: by mail-pf0-f193.google.com with SMTP id r187so188110pfr.2 for ; Mon, 11 Apr 2016 17:31:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:subject:date:message-id:cc:to:mime-version; bh=kvLbZ7QmeFZi9LMPWDd7vZqjE1emXDgEG+PKiKyoV9w=; b=CWP5EYazN231qPx37dsImxAChgcH7Bjx5+rb0AlO0z14gzYM3DR0WO6BV2PtLE2KYX /JVsrkMdCnuygSW6su0aANBtGEvCxYyZkh84u66fUOFX+r2qMflb1rXz3CiKOe/wNtmy DgG93zM+QGvE/LF+XmD4Zp/TUR+IjgB7ySz3DU70L547iyGd/ULnBCvEOJ9GhWin/NW6 2onsJIV2HBL5njaNhWUBsrBDKhToXr0oRy2IS+jNTS6aPfvKCqS1HstooiqnYIPYeSNn my4qH3prEl59QQEMRcubyFxbNt/wGfa0vqoNgv4PVYxSoT4o2GXWx+3vsvUyw98CDyeg hufQ== X-Gm-Message-State: AOPr4FVaW0HK8U2+D4y9JgqAfg1JZtzmQqdoaJgr4vAdgFv4lhpcjk0kpOg3GGr8o5/cIw== X-Received: by 10.98.18.71 with SMTP id a68mr484992pfj.41.1460421083166; Mon, 11 Apr 2016 17:31:23 -0700 (PDT) Received: from [10.0.0.5] (NE1527lan1.rev.em-net.ne.jp. [210.237.126.1]) by smtp.gmail.com with ESMTPSA id rw2sm38799263pab.30.2016.04.11.17.31.21 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 Apr 2016 17:31:22 -0700 (PDT) From: G Helffrich Content-Type: multipart/signed; boundary="Apple-Mail=_9767A2A3-D93A-4A7E-83FB-D31219C2A686"; protocol="application/pkcs7-signature"; micalg=sha1 Subject: [PATCH v2] gdb: dwarf2read: implement handling of variables in Fortran common block Date: Tue, 12 Apr 2016 00:31:00 -0000 Message-Id: <13D2DB40-8745-4CF0-BA56-C88D4741610C@gmail.com> Cc: Luis Machado To: gdb-patches@sourceware.org Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-SW-Source: 2016-04/txt/msg00234.txt.bz2 --Apple-Mail=_9767A2A3-D93A-4A7E-83FB-D31219C2A686 Content-Type: multipart/mixed; boundary="Apple-Mail=_B2CF9238-539F-46A1-BB51-64101DC90597" --Apple-Mail=_B2CF9238-539F-46A1-BB51-64101DC90597 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 Content-length: 9467 This patch allows the gdb DWARF reader to handle variables located in Fortr= an common blocks. This fixes 20 unexpected failures in the gdb.fortran tes= tsuite with host, target and build triplet x86_64-apple-darwin13.4.0 with g= fortran 4.9.2. Re-posted as requested with patch file attached. Revised from original pos= t to prevent double relocation. 2015-04-12 George Helffrich * dwarf2read.c (read_common_block): Relocate symbols in Fortran com= mon blocks properly, and avoid double relocation. (read_new_symbol_full): Don't discard zero-offset symbols in Fort= ran common blocks. (_initialize_dwarf2_read): Add debug diagnostic print for common symbols. * psymtab.c (print_partial_symbols): Recognize and print COMMON_BLOCK_DOMAIN. * symmisc.c (print_symbol): Recognize and dump LOC_COMMON_BLOCK. =97=97=97 --- dwarf2read.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ dwarf2read.c 2016-04-06 18:50:34.000000000 +0900 @@ -84,6 +84,9 @@ static unsigned int dwarf2_read_debug =3D=20 /* When non-zero, dump DIEs after they are read in. */ static unsigned int dwarf2_die_debug =3D 0; =20 +/* When non-zero, report definition of common block variables. */ +static unsigned int dwarf2_common_debug =3D 0; + /* When non-zero, cross-check physname against demangler. */ static int check_physname =3D 0; =20 @@ -13877,6 +13880,57 @@ static void read_common_block (struct die_info *die, struct dwarf2_cu *cu) { struct attribute *attr; + CORE_ADDR baseaddr; + struct program_space *psp; + struct minimal_symbol *msym =3D NULL; + struct objfile *objfile =3D cu->objfile; + struct gdbarch *gdbarch =3D get_objfile_arch (objfile); + const char *name; + + attr =3D dwarf2_attr (die, DW_AT_name, cu); + name =3D dwarf2_compute_name (NULL, die, cu, 1); + if (dwarf2_common_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Read common blk %s (%s)\n", + DW_STRING(attr), name); + } + ALL_PSPACES (psp) + ALL_PSPACE_OBJFILES (psp, objfile) + if (objfile->flags & OBJF_MAINLINE) goto found; +found: + if (objfile->flags & OBJF_MAINLINE) + ALL_OBJFILE_MSYMBOLS (objfile, msym) + { + struct obj_section *section =3D MSYMBOL_OBJ_SECTION (objfile, msym= ); + + if (0 =3D=3D strcmp(MSYMBOL_LINKAGE_NAME (msym), name)) + { + if (dwarf2_common_debug) + { + fprintf_unfiltered (gdb_stdlog, " Found %s at ", name); + fputs_filtered (paddress (gdbarch, + MSYMBOL_VALUE_ADDRESS (objfile, m= sym)), + gdb_stdlog); + } + if (section && dwarf2_common_debug) + { + if (section->the_bfd_section !=3D NULL) + fprintf_filtered (gdb_stdlog, " section %s", + bfd_section_name (objfile->obfd, + section->the_bfd_section)); + else + fprintf_filtered (gdb_stdlog, " spurious section %ld", + (long) (section - objfile->sections)); + } + if (dwarf2_common_debug) + fprintf_unfiltered (gdb_stdlog, "\n"); + + /* Found base of common, now use it to relocate symbols in it */ + baseaddr =3D MSYMBOL_VALUE_ADDRESS (objfile, msym); + break; + } + } =20 attr =3D dwarf2_attr (die, DW_AT_location, cu); if (attr) @@ -13906,6 +13960,7 @@ read_common_block (struct die_info *die, size_t n_entries =3D 0, size; struct common_block *common_block; struct symbol *sym; + int needs_reloc =3D 0; =20 for (child_die =3D die->child; child_die && child_die->tag; @@ -13929,6 +13984,9 @@ read_common_block (struct die_info *die, { struct attribute *member_loc; =20 + if (common_block->n_entries =3D=3D 0) + needs_reloc =3D SYMBOL_VALUE_ADDRESS (sym) =3D=3D 0; + common_block->contents[common_block->n_entries++] =3D sym; =20 member_loc =3D dwarf2_attr (child_die, DW_AT_data_member_loca= tion, @@ -13958,6 +14016,34 @@ read_common_block (struct die_info *die, else dwarf2_complex_location_expr_complaint (); } + + if (dwarf2_common_debug) + { + struct attribute *name =3D dwarf2_attr (child_die, DW_AT_= name, cu); + fprintf_unfiltered (gdb_stdlog, + " Define common blk var %s at ", + DW_STRING(name)); + fputs_filtered (paddress (gdbarch, + SYMBOL_VALUE_ADDRESS (sym)), + gdb_stdlog); + if (needs_reloc)=20 + { + fputs_filtered (" -> ", gdb_stdlog); + if (msym) + fputs_filtered (paddress (gdbarch, + SYMBOL_VALUE_ADDRESS (sym) + + baseaddr), + gdb_stdlog); + else + fputs_filtered ("(unknown)", gdb_stdlog); + } + fputs_filtered ("\n", gdb_stdlog); + } + + /* Relocate symbol in common block */ + if (msym && needs_reloc) + SYMBOL_VALUE_ADDRESS (sym) +=3D baseaddr; + } } =20 @@ -18165,6 +18251,8 @@ new_symbol_full (struct die_info *die, s attr =3D dwarf2_attr (die, DW_AT_location, cu); if (attr) { + unsigned int fortran_common_symbol =3D 0; + var_decode_location (attr, sym, cu); attr2 =3D dwarf2_attr (die, DW_AT_external, cu); =20 @@ -18172,16 +18260,23 @@ new_symbol_full (struct die_info *die, s scope by DW_TAG_common_block. */ if (cu->language =3D=3D language_fortran && die->parent && die->parent->tag =3D=3D DW_TAG_common_block) - attr2 =3D NULL; + { + attr2 =3D NULL; + fortran_common_symbol =3D 1; + } =20 if (SYMBOL_CLASS (sym) =3D=3D LOC_STATIC && SYMBOL_VALUE_ADDRESS (sym) =3D=3D 0 + && !fortran_common_symbol && !dwarf2_per_objfile->has_section_at_zero) { /* When a static variable is eliminated by the linker, the corresponding debug information is not stripped out, but the variable address is set to null; - do not add such variables into symbol table. */ + do not add such variables into symbol table. +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 + An exception is Fortran, for which the first symbol + in a common block will have address/offset 0. */ } else if (attr2 && (DW_UNSND (attr2) !=3D 0)) { @@ -23195,6 +23290,16 @@ The value is the maximum depth to print. NULL, &setdebuglist, &showdebuglist); =20 + add_setshow_zuinteger_cmd ("dwarf2-common", + no_class, &dwarf2_common_debug, _("\ +Set debugging of dwarf2 common block handling."), _("\ +Show debugging of dwarf2 common block handling."), _("\ +When enabled (non-zero), common block variables are printed as they are\n\ +are relocated to their position in the common section."), + NULL, + NULL, + &setdebuglist, &showdebuglist); + add_setshow_boolean_cmd ("check-physname", no_class, &check_physname, _(= "\ Set cross-checking of \"physname\" code against demangler."), _("\ Show cross-checking of \"physname\" code against demangler."), _("\ --- symmisc.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ symmisc.c 2016-03-27 18:46:17.000000000 +0900 @@ -626,6 +626,15 @@ print_symbol (void *args) fprintf_filtered (outfile, "optimized out"); break; =20 + case LOC_COMMON_BLOCK: + fprintf_filtered (outfile, "common block storage"); + + if (section) + fprintf_filtered (outfile, " section %s", + bfd_section_name (section->the_bfd_section->o= wner, + section->the_bfd_section)); + break; + default: fprintf_filtered (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol)); --- psymtab.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ psymtab.c 2016-03-27 18:13:25.000000000 +0900 @@ -915,6 +915,9 @@ print_partial_symbols (struct gdbarch *g case LABEL_DOMAIN: fputs_filtered ("label domain, ", outfile); break; + case COMMON_BLOCK_DOMAIN: + fputs_filtered ("common block domain, ", outfile); + break; default: fputs_filtered (", ", outfile); break; =97=97=97 --Apple-Mail=_B2CF9238-539F-46A1-BB51-64101DC90597 Content-Disposition: attachment; filename=gdbdiffs.txt Content-Type: text/plain; name="gdbdiffs.txt" Content-Transfer-Encoding: 7bit Content-length: 7229 --- dwarf2read.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ dwarf2read.c 2016-04-06 18:50:34.000000000 +0900 @@ -84,6 +84,9 @@ static unsigned int dwarf2_read_debug = /* When non-zero, dump DIEs after they are read in. */ static unsigned int dwarf2_die_debug = 0; +/* When non-zero, report definition of common block variables. */ +static unsigned int dwarf2_common_debug = 0; + /* When non-zero, cross-check physname against demangler. */ static int check_physname = 0; @@ -13877,6 +13880,57 @@ static void read_common_block (struct die_info *die, struct dwarf2_cu *cu) { struct attribute *attr; + CORE_ADDR baseaddr; + struct program_space *psp; + struct minimal_symbol *msym = NULL; + struct objfile *objfile = cu->objfile; + struct gdbarch *gdbarch = get_objfile_arch (objfile); + const char *name; + + attr = dwarf2_attr (die, DW_AT_name, cu); + name = dwarf2_compute_name (NULL, die, cu, 1); + if (dwarf2_common_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Read common blk %s (%s)\n", + DW_STRING(attr), name); + } + ALL_PSPACES (psp) + ALL_PSPACE_OBJFILES (psp, objfile) + if (objfile->flags & OBJF_MAINLINE) goto found; +found: + if (objfile->flags & OBJF_MAINLINE) + ALL_OBJFILE_MSYMBOLS (objfile, msym) + { + struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msym); + + if (0 == strcmp(MSYMBOL_LINKAGE_NAME (msym), name)) + { + if (dwarf2_common_debug) + { + fprintf_unfiltered (gdb_stdlog, " Found %s at ", name); + fputs_filtered (paddress (gdbarch, + MSYMBOL_VALUE_ADDRESS (objfile, msym)), + gdb_stdlog); + } + if (section && dwarf2_common_debug) + { + if (section->the_bfd_section != NULL) + fprintf_filtered (gdb_stdlog, " section %s", + bfd_section_name (objfile->obfd, + section->the_bfd_section)); + else + fprintf_filtered (gdb_stdlog, " spurious section %ld", + (long) (section - objfile->sections)); + } + if (dwarf2_common_debug) + fprintf_unfiltered (gdb_stdlog, "\n"); + + /* Found base of common, now use it to relocate symbols in it */ + baseaddr = MSYMBOL_VALUE_ADDRESS (objfile, msym); + break; + } + } attr = dwarf2_attr (die, DW_AT_location, cu); if (attr) @@ -13906,6 +13960,7 @@ read_common_block (struct die_info *die, size_t n_entries = 0, size; struct common_block *common_block; struct symbol *sym; + int needs_reloc = 0; for (child_die = die->child; child_die && child_die->tag; @@ -13929,6 +13984,9 @@ read_common_block (struct die_info *die, { struct attribute *member_loc; + if (common_block->n_entries == 0) + needs_reloc = SYMBOL_VALUE_ADDRESS (sym) == 0; + common_block->contents[common_block->n_entries++] = sym; member_loc = dwarf2_attr (child_die, DW_AT_data_member_location, @@ -13958,6 +14016,34 @@ read_common_block (struct die_info *die, else dwarf2_complex_location_expr_complaint (); } + + if (dwarf2_common_debug) + { + struct attribute *name = dwarf2_attr (child_die, DW_AT_name, cu); + fprintf_unfiltered (gdb_stdlog, + " Define common blk var %s at ", + DW_STRING(name)); + fputs_filtered (paddress (gdbarch, + SYMBOL_VALUE_ADDRESS (sym)), + gdb_stdlog); + if (needs_reloc) + { + fputs_filtered (" -> ", gdb_stdlog); + if (msym) + fputs_filtered (paddress (gdbarch, + SYMBOL_VALUE_ADDRESS (sym) + + baseaddr), + gdb_stdlog); + else + fputs_filtered ("(unknown)", gdb_stdlog); + } + fputs_filtered ("\n", gdb_stdlog); + } + + /* Relocate symbol in common block */ + if (msym && needs_reloc) + SYMBOL_VALUE_ADDRESS (sym) += baseaddr; + } } @@ -18165,6 +18251,8 @@ new_symbol_full (struct die_info *die, s attr = dwarf2_attr (die, DW_AT_location, cu); if (attr) { + unsigned int fortran_common_symbol = 0; + var_decode_location (attr, sym, cu); attr2 = dwarf2_attr (die, DW_AT_external, cu); @@ -18172,16 +18260,23 @@ new_symbol_full (struct die_info *die, s scope by DW_TAG_common_block. */ if (cu->language == language_fortran && die->parent && die->parent->tag == DW_TAG_common_block) - attr2 = NULL; + { + attr2 = NULL; + fortran_common_symbol = 1; + } if (SYMBOL_CLASS (sym) == LOC_STATIC && SYMBOL_VALUE_ADDRESS (sym) == 0 + && !fortran_common_symbol && !dwarf2_per_objfile->has_section_at_zero) { /* When a static variable is eliminated by the linker, the corresponding debug information is not stripped out, but the variable address is set to null; - do not add such variables into symbol table. */ + do not add such variables into symbol table. + + An exception is Fortran, for which the first symbol + in a common block will have address/offset 0. */ } else if (attr2 && (DW_UNSND (attr2) != 0)) { @@ -23195,6 +23290,16 @@ The value is the maximum depth to print. NULL, &setdebuglist, &showdebuglist); + add_setshow_zuinteger_cmd ("dwarf2-common", + no_class, &dwarf2_common_debug, _("\ +Set debugging of dwarf2 common block handling."), _("\ +Show debugging of dwarf2 common block handling."), _("\ +When enabled (non-zero), common block variables are printed as they are\n\ +are relocated to their position in the common section."), + NULL, + NULL, + &setdebuglist, &showdebuglist); + add_setshow_boolean_cmd ("check-physname", no_class, &check_physname, _("\ Set cross-checking of \"physname\" code against demangler."), _("\ Show cross-checking of \"physname\" code against demangler."), _("\ --- symmisc.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ symmisc.c 2016-03-27 18:46:17.000000000 +0900 @@ -626,6 +626,15 @@ print_symbol (void *args) fprintf_filtered (outfile, "optimized out"); break; + case LOC_COMMON_BLOCK: + fprintf_filtered (outfile, "common block storage"); + + if (section) + fprintf_filtered (outfile, " section %s", + bfd_section_name (section->the_bfd_section->owner, + section->the_bfd_section)); + break; + default: fprintf_filtered (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol)); --- psymtab.c.orig 2015-02-21 02:11:44.000000000 +0900 +++ psymtab.c 2016-03-27 18:13:25.000000000 +0900 @@ -915,6 +915,9 @@ print_partial_symbols (struct gdbarch *g case LABEL_DOMAIN: fputs_filtered ("label domain, ", outfile); break; + case COMMON_BLOCK_DOMAIN: + fputs_filtered ("common block domain, ", outfile); + break; default: fputs_filtered (", ", outfile); break; --Apple-Mail=_B2CF9238-539F-46A1-BB51-64101DC90597 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Content-length: 52 G Helffrich ghfbsd@gmail.com --Apple-Mail=_B2CF9238-539F-46A1-BB51-64101DC90597-- --Apple-Mail=_9767A2A3-D93A-4A7E-83FB-D31219C2A686 Content-Disposition: attachment; filename=smime.p7s Content-Type: application/pkcs7-signature; name=smime.p7s Content-Transfer-Encoding: base64 Content-length: 5499 MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEH AQAAoIIMsDCCBeowggTSoAMCAQICEAC3TPlEwHJfbnGwcz7gtxcwDQYJKoZI hvcNAQELBQAwVjELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBB RzEwMC4GA1UEAxMnU3dpc3NTaWduIFBlcnNvbmFsIFNpbHZlciBDQSAyMDE0 IC0gRzIyMB4XDTE1MDYxNzA4MzUwM1oXDTIwMDYxNzA4MzUwM1owQTEdMBsG A1UECxMURW1haWwgVmFsaWRhdGVkIE9ubHkxIDAeBgNVBAMUF0VtYWlsOiBn aGZic2RAZ21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEArCqbOzD1wrgSexsglbpShhaeYUNpWtWxO8unXBU+Zy4sjX8GbTehfG0f YbUWqD1AGzVtFXXcqP+tbb+Q5d8xXrYoX/TcwO53GgS1qY4LYCZRJNvme+mH GjngAiAOiq2tXewNuQjjlhi34n8MN4ODVG1gG7KpW1NXHNoQrQEv+0av88Ys u6iqzyvP9vbn6CLrZPKsGbujLfKKUT4Ak6JJ1sEmnbiAdglcki5NPxLceLOu sYzsajn9ufsKAHjgTVB0RyxquQqoNAjFwWBFrqKS1d5p0f3pWRbe8W6TPwmH IRD8gdHNFo2MH+4k8/cYsJBBdnkDEYpjRsrqk+b3Aug2LQIDAQABo4ICxzCC AsMwDgYDVR0PAQH/BAQDAgSwMBMGA1UdJQQMMAoGCCsGAQUFBwMEMB0GA1Ud DgQWBBT6UTfFqpyI1vK/VWUTTsKltQW7TjAfBgNVHSMEGDAWgBTwx6MykbXr yrVYdxWnTr4aXWFDJTCB/wYDVR0fBIH3MIH0MEegRaBDhkFodHRwOi8vY3Js LnN3aXNzc2lnbi5uZXQvRjBDN0EzMzI5MUI1RUJDQUI1NTg3NzE1QTc0RUJF MUE1RDYxNDMyNTCBqKCBpaCBooaBn2xkYXA6Ly9kaXJlY3Rvcnkuc3dpc3Nz aWduLm5ldC9DTj1GMEM3QTMzMjkxQjVFQkNBQjU1ODc3MTVBNzRFQkUxQTVE NjE0MzI1JTJDTz1Td2lzc1NpZ24lMkNDPUNIP2NlcnRpZmljYXRlUmV2b2Nh dGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2lu dDBhBgNVHSAEWjBYMFYGCWCFdAFZAQMBBjBJMEcGCCsGAQUFBwIBFjtodHRw Oi8vcmVwb3NpdG9yeS5zd2lzc3NpZ24uY29tL1N3aXNzU2lnbi1TaWx2ZXIt Q1AtQ1BTLnBkZjCB2QYIKwYBBQUHAQEEgcwwgckwZAYIKwYBBQUHMAKGWGh0 dHA6Ly9zd2lzc3NpZ24ubmV0L2NnaS1iaW4vYXV0aG9yaXR5L2Rvd25sb2Fk L0YwQzdBMzMyOTFCNUVCQ0FCNTU4NzcxNUE3NEVCRTFBNUQ2MTQzMjUwYQYI KwYBBQUHMAGGVWh0dHA6Ly9zaWx2ZXItcGVyc29uYWwtZzIub2NzcC5zd2lz c3NpZ24ubmV0L0YwQzdBMzMyOTFCNUVCQ0FCNTU4NzcxNUE3NEVCRTFBNUQ2 MTQzMjUwGwYDVR0RBBQwEoEQZ2hmYnNkQGdtYWlsLmNvbTANBgkqhkiG9w0B AQsFAAOCAQEAUm7ncPoddC5SOIl/fv/g3fi9IloV1ElkR1NNbS5h6H+svqsD Eyr4GZkOnbw/Ydv7J5KUGl0yWw6o9KK9K8GyxgJ/RGqH/uwcuGEGmkbhbRpk G6TgzKqyjOgbJ1MBQO+UQehGtV5b77tB+eRzGQPIcMc6YTyJ7bXoS8B64voO 4o6nqBxXKLg1ks0d+7psr20cEhoDdnitbWYUh21FOgQ+d9wMLteOeixLVX2j cbFEpTSuNzxTs803RxdGntbRXW2QvUkxPSaRVYwHjLnyYfRc/tm0RFJnqhT5 wXkrPObIom1TkQ3AtWiINoogJcgWJ1d6GWh2DP9H2c22UuhU4FQC1DCCBr4w ggSmoAMCAQICDwVE1k6tHtM21TJAXQC5NjANBgkqhkiG9w0BAQsFADBHMQsw CQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSEwHwYDVQQDExhT d2lzc1NpZ24gU2lsdmVyIENBIC0gRzIwHhcNMTQwOTE5MjAzNjQ5WhcNMjkw OTE1MjAzNjQ5WjBWMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWdu IEFHMTAwLgYDVQQDEydTd2lzc1NpZ24gUGVyc29uYWwgU2lsdmVyIENBIDIw MTQgLSBHMjIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLObE5 hf76yaG8w4OpDkothHIe/2jFp8Qd7A/XqIsTHrPRFotA3A9TbwE97OhktZfb g7yoqMCEOFheAxQr5sow7wCy6xM5GZJHKiEA5XLNwjFiDsxWKv93xGOMmMJv eNe1tszpfR8zppEFKv7RUtb07Jz+TUxqUuGFdmK7uWjmUmP8wSGRkl0Z2NyA 0RnjSRZXAg4ZRIWrKckv+sZtawqh9vf/a2E1FSaUlAJpJV1p971ea4LZkAwG +UMFIknrNtAgWmMQ4zgh1X8WK0GKRnryZ+ik0LoefyQndZiUSS1WxFQzkZ1i +dVf3lupFZiclFPBgOkJFxW0G4ApMqHQrxOnAgMBAAGjggKWMIICkjAOBgNV HQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU8Mej MpG168q1WHcVp06+Gl1hQyUwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c wpj6hlgwgf8GA1UdHwSB9zCB9DBHoEWgQ4ZBaHR0cDovL2NybC5zd2lzc3Np Z24ubmV0LzE3QTBDREMxRTQ0MUI2M0E1QjNCQ0I0NTlEQkQxQ0MyOThGQTg2 NTgwgaiggaWggaKGgZ9sZGFwOi8vZGlyZWN0b3J5LnN3aXNzc2lnbi5uZXQv Q049MTdBMENEQzFFNDQxQjYzQTVCM0JDQjQ1OURCRDFDQzI5OEZBODY1OCUy Q089U3dpc3NTaWduJTJDQz1DSD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0 P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwYQYDVR0g BFowWDBWBglghXQBWQEDAQYwSTBHBggrBgEFBQcCARY7aHR0cDovL3JlcG9z aXRvcnkuc3dpc3NzaWduLmNvbS9Td2lzc1NpZ24tU2lsdmVyLUNQLUNQUy5w ZGYwgcYGCCsGAQUFBwEBBIG5MIG2MGQGCCsGAQUFBzAChlhodHRwOi8vc3dp c3NzaWduLm5ldC9jZ2ktYmluL2F1dGhvcml0eS9kb3dubG9hZC8xN0EwQ0RD MUU0NDFCNjNBNUIzQkNCNDU5REJEMUNDMjk4RkE4NjU4ME4GCCsGAQUFBzAB hkJodHRwOi8vb2NzcC5zd2lzc3NpZ24ubmV0LzE3QTBDREMxRTQ0MUI2M0E1 QjNCQ0I0NTlEQkQxQ0MyOThGQTg2NTgwDQYJKoZIhvcNAQELBQADggIBAMN5 p1e3e61RaPVEjEGVKAF8dNY7arxt76fXTTmZHWiNygjZ0HGxGTWTb4LGHEm4 Ue5M+WwKb9il+/77MF4A0pSrxBJRuqqKq2rdGdcrSvcWsmtRz3RbKaJz3pf+ 2E8gIX1pDLBQ5Y1YjIAu5Rcc3WN6qu8F+cNpnuSMcWJcQu468s3gEu+LXOnO Uygy7JULGVSiIY36f1CnT7wZe7JrjCk/dz7KI8dpWkGdfWYxb3pxedqpZTrr f9cQ1QtfVBl8zjclJIRQ0K9ANMJfkuJ6kfMvQkcbnzxC+9lfpbxwRY7voDmQ 9aF4bNfAZ1kZ4QDeXPx46E/du6yRLnKL/OpHb0MovLu5jpS++lDdUJMbTBi2 dv/DRwpZtM1tVdhqtl/JL8GUNj6+rkA1BiDt4AJMLTRFDkOvovTYkBXl0MCb RECuPI+TUbyZaHNpe3VYmbfUBE/f8YJxER17/BMdd2VVY9dScnzdMUeGp5XY rCZxPSPmEjv0f5qWhv4r6qDzJg11xhaMMSDnEUeh56lqsKWygR7cPdCh427V 8GamHH3XkohNAAcLcedz53PkVGVp/DeN8R5vcO6nbLNSRWdZ1gVIsSHplyjZ 2fS0pqBnIza8YEcOXCh/XZOKMbqNMTYUx3pCnW8gwWwq+BYPatkAlDK7PVWx xcOhDbF5d1Qd4DOCfu7qMYIC6jCCAuYCAQEwajBWMQswCQYDVQQGEwJDSDEV MBMGA1UEChMMU3dpc3NTaWduIEFHMTAwLgYDVQQDEydTd2lzc1NpZ24gUGVy c29uYWwgU2lsdmVyIENBIDIwMTQgLSBHMjICEAC3TPlEwHJfbnGwcz7gtxcw CQYFKw4DAhoFAKCCAVUwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq hkiG9w0BCQUxDxcNMTYwNDEyMDAzMTE5WjAjBgkqhkiG9w0BCQQxFgQUNeUy hyHPDOboYPvUVMfMU5lEmcEweQYJKwYBBAGCNxAEMWwwajBWMQswCQYDVQQG EwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMTAwLgYDVQQDEydTd2lzc1Np Z24gUGVyc29uYWwgU2lsdmVyIENBIDIwMTQgLSBHMjICEAC3TPlEwHJfbnGw cz7gtxcwewYLKoZIhvcNAQkQAgsxbKBqMFYxCzAJBgNVBAYTAkNIMRUwEwYD VQQKEwxTd2lzc1NpZ24gQUcxMDAuBgNVBAMTJ1N3aXNzU2lnbiBQZXJzb25h bCBTaWx2ZXIgQ0EgMjAxNCAtIEcyMgIQALdM+UTAcl9ucbBzPuC3FzANBgkq hkiG9w0BAQEFAASCAQBw7Z+ndQUl0oy2GCwGemgEZ1k40IiAWkHw7AtsORiy A/xgm+wqoLoRGwdr1B7tGbZVS9M4XGAe+1mme/e90tIzr5D/3T/AU8cWcI9t 5YU3OgjFw11GMD+kebk9KH4IXEvtI8ZNjyUAof54sWeI0t2UJ1KEK8qz2ej8 oJRMuW+tw/nkGacT3jqqY9P8PJPdMS87nVP5940sXCfmDZiIXJNcvc/NAOaK IWXGKKtXKC2E3vbCtJbydC5BBaaxFVTuPvxFqNBo4c/4y9RIHn7VPZ8ww9j2 SvzWYFNb+Gj9tYzBJnywQJPzlfZgxyTty1DxZl8ylloxAd+TqFrK96VXzuv+ AAAAAAAA --Apple-Mail=_9767A2A3-D93A-4A7E-83FB-D31219C2A686--