From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: zhijux.fan@intel.com) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by groups.io with SMTP; Sun, 28 Jul 2019 23:02:49 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jul 2019 23:02:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,321,1559545200"; d="dat'59?scan'59,208,59";a="162076586" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga007.jf.intel.com with ESMTP; 28 Jul 2019 23:02:12 -0700 Received: from fmsmsx602.amr.corp.intel.com (10.18.126.82) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 28 Jul 2019 23:02:06 -0700 Received: from fmsmsx602.amr.corp.intel.com (10.18.126.82) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Sun, 28 Jul 2019 23:02:05 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1713.5 via Frontend Transport; Sun, 28 Jul 2019 23:02:05 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.80]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.112]) with mapi id 14.03.0439.000; Mon, 29 Jul 2019 14:02:04 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" , "Shi, Steven" Subject: [PATCH 1/2] BaseTools:Fix GenFds multi-thread build fails if enable build cache Thread-Topic: [PATCH 1/2] BaseTools:Fix GenFds multi-thread build fails if enable build cache Thread-Index: AdVF0yQBO0Hx8RCoTy6dhOEGEaMyJg== Date: Mon, 29 Jul 2019 06:02:03 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 44477 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54BDSHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54BDSHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1923 The GenFds multi-thread will build fail if enable the build cache. 1. First, produce the build cache: edk2>build -p OvmfPkg\OvmfPkgIa32X64.dsc -a IA32 -a X64 -t VS2015x86 -n 5 --genfds-multi-thread --hash --binary-destination=3DBinCache 2. Remove the build folder: edk2>rmdir Build /s /q 3. Clean build with build cache and GenFds multi-thread enabled together: edk2>build -p OvmfPkg\OvmfPkgIa32X64.dsc -a IA32 -a X64 -t VS2015x86 -n 5 --genfds-multi-thread --hash --binary-source=3DBinCache If disable GenFds multi-thread, the build cache can work well This patch is going to fix that issue. Cc: Bob Feng Cc: Liming Gao Cc: Steven Shi Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 41 +++++++++++++++++---= ---- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/S= ource/Python/AutoGen/ModuleAutoGen.py index 36bbaffa56..4bb72eb10d 100644 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -1249,6 +1249,7 @@ class ModuleAutoGen(AutoGen): retVal =3D set() OutputDir =3D self.OutputDir.replace('\\', '/').strip('/') DebugDir =3D self.DebugDir.replace('\\', '/').strip('/') + FfsOutputDir =3D self.FfsOutputDir.replace('\\', '/').rstrip('/') for Item in self.CodaTargetList: File =3D Item.Target.Path.replace('\\', '/').strip('/').replac= e(DebugDir, '').replace(OutputDir, '').strip('/') retVal.add(File) @@ -1264,6 +1265,11 @@ class ModuleAutoGen(AutoGen): if File.lower().endswith('.pdb'): retVal.add(File) =20 + for Root, Dirs, Files in os.walk(FfsOutputDir): + for File in Files: + if File.lower().endswith('.ffs'): + retVal.add(File) + return retVal =20 ## Create AsBuilt INF file the module @@ -1594,8 +1600,16 @@ class ModuleAutoGen(AutoGen): =20 self.IsAsBuiltInfCreated =3D True =20 + def CacheCopyFile(self, OriginDir, CopyDir, File): + sub_dir =3D os.path.relpath(File, CopyDir) + destination_file =3D os.path.join(OriginDir, sub_dir) + destination_dir =3D os.path.dirname(destination_file) + CreateDirectory(destination_dir) + CopyFileOnChange(File, destination_dir) + def CopyModuleToCache(self): FileDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.= Name, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceDir, s= elf.MetaFile.BaseName) + FfsDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.O= utputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs",= self.Guid + self.Name) CreateDirectory (FileDir) HashFile =3D path.join(self.BuildDir, self.Name + '.hash') if os.path.exists(HashFile): @@ -1609,13 +1623,15 @@ class ModuleAutoGen(AutoGen): for File in self.OutputFile: File =3D str(File) if not os.path.isabs(File): - File =3D os.path.join(self.OutputDir, File) + NewFile =3D os.path.join(self.OutputDir, File) + if not os.path.exists(NewFile): + NewFile =3D os.path.join(self.FfsOutputDir, File) + File =3D NewFile if os.path.exists(File): - sub_dir =3D os.path.relpath(File, self.OutputDir) - destination_file =3D os.path.join(FileDir, sub_dir) - destination_dir =3D os.path.dirname(destination_file) - CreateDirectory(destination_dir) - CopyFileOnChange(File, destination_dir) + if File.endswith('.ffs'): + self.CacheCopyFile(FfsDir, self.FfsOutputDir, File) + else: + self.CacheCopyFile(FileDir, self.OutputDir, File) =20 def AttemptModuleCacheCopy(self): # If library or Module is binary do not skip by hash @@ -1626,6 +1642,7 @@ class ModuleAutoGen(AutoGen): if '.inc' in str(f_ext): return False FileDir =3D path.join(GlobalData.gBinCacheSource, self.PlatformInf= o.Name, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceDir,= self.MetaFile.BaseName) + FfsDir =3D path.join(GlobalData.gBinCacheSource, self.PlatformInfo= .OutputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs= ", self.Guid + self.Name) HashFile =3D path.join(FileDir, self.Name + '.hash') if os.path.exists(HashFile): f =3D open(HashFile, 'r') @@ -1640,11 +1657,13 @@ class ModuleAutoGen(AutoGen): CopyFileOnChange(HashFile, self.BuildDir) else: File =3D path.join(root, f) - sub_dir =3D os.path.relpath(File, FileDir) - destination_file =3D os.path.join(self.Out= putDir, sub_dir) - destination_dir =3D os.path.dirname(destin= ation_file) - CreateDirectory(destination_dir) - CopyFileOnChange(File, destination_dir) + self.CacheCopyFile(self.OutputDir, FileDir= , File) + if GlobalData.gEnableGenfdsMultiThread and os.path.exi= sts(FfsDir): + for root, dir, files in os.walk(FfsDir): + for f in files: + File =3D path.join(root, f) + self.CacheCopyFile(self.FfsOutputDir, FfsD= ir, File) + if self.Name =3D=3D "PcdPeim" or self.Name =3D=3D "Pcd= Dxe": CreatePcdDatabaseCode(self, TemplateString(), Temp= lateString()) return True --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54BDSHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IrMjAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAADYwMUVCOUVF MUVFRTgyNENBRkFDNjJEMDNEQzFEQzJBAI4HAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBwAdAAYA AgADAAEAGgEBIIADAA4AAADjBwcAHQAGAAIAAwABABoBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAFAAAABbUEFUQ0ggMS8yXSBCYXNlVG9vbHM6Rml4IEdlbkZkcyBtdWx0 aS10aHJlYWQgYnVpbGQgZmFpbHMgaWYgZW5hYmxlIGJ1aWxkIGNhY2hlAEcbAQuAAQAhAAAANjAx RUI5RUUxRUVFODI0Q0FGQUM2MkQwM0RDMURDMkEAjgcBA5AGAJgTAAAzAAAAAgF/AAEAAABIAAAA PEZBRDBEN0UwQUUwRkE1NEQ5ODdGNkU3MjQzNUNBRkQ1MEFGQTU0QkRAU0hTTVNYMTAxLmNjci5j b3JwLmludGVsLmNvbT4ACwAfDgEAAAACAQkQAQAAAKgJAACkCQAAaBsAAExaRnXjYXg+YQAKZmJp ZAQAAGNjwHBnMTI1MgD+A0PwdGV4dAH3AqQD4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCW fQqACMg7CWIxOQ7AvwnDFnIKMhZxAoAVYioJsHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZS dgSQF7YCEHIAwHR9CFBuGjEQIAXABaAbZGSaIANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAK cRfyYmttawZzAZAAICBCTV9C4EVHSU59CvwB8QvxER+wWjpoAkBwczrALy9idWd6AxALYCQudAcw bm8FoWUuAQWwZy9zaG93X0EiUS5jZ2k/DdA90RZxM1xsC4BlCoElFJRUaBngRwnwRmQEIIhtdWwi 4C10aAlw7mEcYAPwIqAgIlADEBxh9wtwAyAGkCAJ8AGgHnAcwD8l8Se0HlARwCNgJQUxLgggRmkR 8HQsIHDRA2BkdWMo7zolBQmACGsyPie0LXAgTwB2bWZQa2dcXAEt5UlhMzJYNjQKLiZgYy2gYSBJ QZ8vAC+SLyEtoAVAVlMB0OAxNXg4Ni2gA6Ad4JklFC0tGDEFcHMtJps/MhAR0CPAM2ENwCigcnk+ LQEAH2A0ESLgAiA9Qi0LgEMpsiUMMiqAUmX/BGAaMCj5AhAn4ASQLIsbALsN4AXAQifDI7A5sHEl DPozKoBDHnADkSe0A/Am8P0pOiAAcBxgJi8nMSiUHGD/GJAYMCkBOCwtXy5vL38wj/8xnzKvM7oZ IAhwK2A1LyUU/kkocA3hKLM9PycwKvApDaspkQOgdwWwaydQZSKgfyUOBAArABiAEcAoUAQgZ5pv C4BnPuEccGl4KPE7GIBOgXMKUCn2JQVDY3I6H7BvYiqQCfBPADylBuBiJEAuZlGxQAuArRAgbCRA A3A+ULlMB3BpTuJHYU8wPCUQVCIu7mdUgFKvURNTECAaMAOgXlNN8FHgH2BW4i4jwGmTVW8UwGln GFBkLRkwKmYz8HlRQFpN8Gp1pC5GA5E8elpCeFJQdwBwWC9E8S0lBR+wM6BlRFRvBvBzL1NHcy+M UHkm8AIgL0F1GJA5SeEvTSsxHnBe1S5wAHkgfCA0MSAr/2C+XKFhwlzWYJBPUCjRGZR9SwEzEjAL gBIAACA08XPoKCspKvAxYJABAB5w+WQ0LSklDA3gASBGUSRguQVAYS9dX15vX31iZ28/aH9fbSUF HbEQMGOgNmIEYmEBIGE1Ni4u5jRukAHAZWIekBxgHpH9QiA0XDhnT2uPbJ8lBWCxz2p/cf9zDyUF QEBAkA6QKDQ5LEQwK3iTNyBdeFFjC2AEEWl7KHZlKU0/diB79glwdFYHQCC0PSASAShltnv3T3Zw GnB2cEQ5MXzybGYunX5nLglwC1ErYCgnQUCFQUAnKvAnLycpV+DedAURgICBIXuORG+AImC/fsmD BoAPgR90NHv2RgPQ/35vh4qEj4WTKsGBj3v1GuE/QrAQIBywC4B/FAhQZGH+VArAPxFUAB9ge3+H Q2LiS3zwjNIujeQuUBiAaP+Jj4WdkUeDBpIxkymHt5RUl4r/jwt8hC4nMGQoj9KPZbZ4VEIgeNQ2 NSxk0b95j3qflu978yhhj9IuCQD1TMByfUAuCfAmYDvikcD5YCBkYpXwnK+XT5hfXTC3ho6MkggA byrhfsFzKvBPj9IEII0hGRAudwdAa/+YoIeZoCeG94xWj9ONIaWD/6dvnb+ez1JQA9CgGKpPoc/9 mNgre48SEAhwA6B8hKMNOXvzIyM7ECcRECAgQe5zOWIFQCAgRmLEKQIEYVNfgXfqNTmZ4Dh48Tb/ HqCacEQwmr+bz7Kfe/N/I/RJc7RVSUVAs+QcYHzw/FRyClCjD3vxAQE7ECmytwhQYDCP0ih/Iirw TwUQ/SRgbpQjvvKUI5izrV9QAHxiXzkifPCmEU4xkTJs38NSmKPAd4Z/NHlfYtPDCP5qTtGVIL/4 woXE/8YKwsz3OSEooAeAKMYOyS+z5H7BewWQGJF5zEvI/84yvwVP/whAGaPEFc9vsD++Rb8BaXR/ dSBIA79zoC+Pw37Ex2hHswkAbqBsRBiAIsBnR9b3gwAq0n8jUAtgADAa8bwR+G8uTswR2pU5Y43k YKDwICJfIt0xfyN1ItIB/wuA2pUHEBHA2pV1hMhkfzL6TRIQYauDdOLb0tBfh4H/2B/ZL9o/20eV Odw/3U/eVQBUQUJfRlZfRABJUkVDVE9SWdUq8CKHgSLllUcnwBxg7+j14Zp7985tIJijxMl79/5I M6GP1cdo54jgKNvS6IH/n8AzkpavKFLDJhAwjlFkcJ/wlta3eFO3QHjAMTO3Evsk4JpwNbevuL+L r6jYfyn/j9L6j4+ZliGirKqdIxAFQP/DJklyZHDBK3DQrh2P1cc7/38swQWtb3v1ErEEDwUfBi// qn8BCvXFCBXBbwdPCF/xxf+HigpvAy+QAhAF/5/07/Xy/wIvDvvCj8OdfyxlthiPxg//xx3X1cif HP/KP8tPzF8hH//tn88PIM8mi9F/0o/QL6qv/1AgrF8tPxjqjWO+u+Lk3qX/Ec8S3zD3W8DhcDA/ MU8yXU8gFwmfot/UuEF0jOFw/nT5JL6n1m83tLPASTFNEPxickchpgCkoPkkToJG9Oe+UFSQDIJz a5ZQS2Du4N9GgvbbmcB403AQMnlf+X/PPx+rFZ/AItBjJ40T/xH0Zl9uQHRG77EeWpA2wf/W39fv 4/++o3WE5Z/br+gP/93P3t/f7+D/4g9NT05fT2//5i/nP1JP6V/qb+t/7I/wL/9YuTn88y/0P/VP 9l1KOz0w3RoRcEZBY3aSMXJmd/dEzjS3YZqQtyE1N/fCRQ//Rh9pf3DvKo8rkmso8etmj991zzaN dg8Tf/DucqTTPvD/KU98fxk/Gk/EQu8de+8hn/8eHxCfOrsgn4b/gh8izyPf/yTvhq+NXycfKC+M H5Gfcd//K2+P7zdflu84v79VOs47P9eWD6sVWWpFisBi/SBu8ZpmL1BNPfCJIFRos/H/vKCT4Lyg Fs5YQzAvoe+osv969JVRezGln6Cfph/7Cz0w/6lBo/Olf6mveX96j6jfre//l9+Y6TQNM0Wa23dv LgxlWAI9FMAiUGNkUGUcaW1eQKMRtO9EeGX+Indfki/uE7di5IFZkFbA98SAiPC/dVQ9gVBhWpD/ ENGoIGcoKbuPKXTPSo/R/DBUcnVL9i2REL3V8DIuMTTBYKSgqCBCMJp3iiAxvdW91X19viABw3Af AEIAAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAGUAAQAAACoAAAB6AGgAaQBqAHUA eAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AZAABAAAACgAAAFMATQBUAFAAAAAA AAIBQQABAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUA WAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAf AAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A 5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBt AAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAB8MAQAAACoAAAB6AGgA aQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AHgwBAAAACgAAAFMATQBU AFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgA aQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBv AG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AI0ABAAAAKgAAAHoAaABp AGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAiQAEAAAAKAAAAUwBNAFQA UAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABp AGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8A bQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAA AAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAuAE4AbwB0AGUAAAAAAAMA8T8JBAAACwBAOgEA AAADAP0/5AQAAAIBCzABAAAAEAAAAGAeue4e7oJMr6xi0D3B3CoDABcAAQAAAEAAOQCAv34k00XV AUAACDCUe/Ek00XVAR8AAICGAwIAAAAAAMAAAAAAAABGAQAAAB4AAABhAGMAYwBlAHAAdABsAGEA bgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0AVQBTAAAAHwA3AAEAAACgAAAAWwBQAEEAVABD AEgAIAAxAC8AMgBdACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBGAGkAeAAgAEcAZQBuAEYAZABzACAA bQB1AGwAdABpAC0AdABoAHIAZQBhAGQAIABiAHUAaQBsAGQAIABmAGEAaQBsAHMAIABpAGYAIABl AG4AYQBiAGwAZQAgAGIAdQBpAGwAZAAgAGMAYQBjAGgAZQAAAB8APQABAAAAAgAAAAAAAAADADYA AAAAAAIBcQABAAAAFgAAAAHVRdMkATtB8fEQqE8unYThBhGjMiYAAB8AcAABAAAAoAAAAFsAUABB AFQAQwBIACAAMQAvADIAXQAgAEIAYQBzAGUAVABvAG8AbABzADoARgBpAHgAIABHAGUAbgBGAGQA cwAgAG0AdQBsAHQAaQAtAHQAaAByAGUAYQBkACAAYgB1AGkAbABkACAAZgBhAGkAbABzACAAaQBm ACAAZQBuAGEAYgBsAGUAIABiAHUAaQBsAGQAIABjAGEAYwBoAGUAAAAfADUQAQAAAJAAAAA8AEYA QQBEADAARAA3AEUAMABBAEUAMABGAEEANQA0AEQAOQA4ADcARgA2AEUANwAyADQAMwA1AEMAQQBG AEQANQAwAEEARgBBADUANABCAEQAQABTAEgAUwBNAFMAWAAxADAAMQAuAGMAYwByAC4AYwBvAHIA cAAuAGkAbgB0AGUAbAAuAGMAbwBtAD4AAAADAN4/n04AAEAABzAyGu8k00XVAQIBCwABAAAAEAAA AGAeue4e7oJMr6xi0D3B3CoDACYAAAAAAAIBRwABAAAAMgAAAGM9VVM7YT1NQ0k7cD1JbnRlbDts PVNIU01TWDEwMS0xOTA3MjkwNjAyMDNaLTMwNzUAAAACARAwAQAAAEYAAAAAAAAAJne9OTvsOEmk phU9y6V7QgcA+tDX4K4PpU2Yf25yQ1yv1QAAAEQRXgAAppNoNoh2bEunStPrR5pMZAAACVSP7AAA AAAfAPo/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAADAAlZAQAAAEAAAIAIIAYAAAAA AMAAAAAAAABGAAAAAL+FAABQqQYk00XVAQsAAIAIIAYAAAAAAMAAAAAAAABGAAAAAIKFAAAAAAAA HwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AcAByAG8AZAB1AGMAdAAAAAEAAAAa AAAAZABsAHAAZQAtAHcAaQBuAGQAbwB3AHMAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgA AABkAGwAcAAtAHYAZQByAHMAaQBvAG4AAAABAAAAFgAAADEAMQAuADAALgA2ADAAMAAuADcAAAAA AB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIAZQBhAGMAdABpAG8AbgAAAAAA AQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAMADTT9PwAAHwAAgIYDAgAAAAAAwAAAAAAAAEYB AAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAAAAIAAAAAAAAAHwAAgIYD AgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQAaQBuAGcALQBpAHAAAAAA AAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAACpmQ== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54BDSHSMSX101ccrcor_--