iddZgdZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZmZddlmZmZdd lmZmZdd lmZdd lmZmZmZmZmZdd lm Z dd lm!Z!ddl"m#Z#e$Z%gdZ&Gdde'Z(dZ)dZ*dZ+GddeZ,dZ-da.da/dZ0 d*dZ1d+dZ2 d*dZ3e4a5 d,dZ6d-dZ7d Z8ej9d!ej:j;Z<ej9d"ej:j;Z=ej9d#ej:j;Z>ej9d$ej:j?Z@d%ZAd&ZBej9d'ej:ZCd(ZDeEd)kr e7dSdS).anumpy.distutils.fcompiler Contains FCompiler, an abstract base class that defines the interface for the numpy.distutils Fortran compiler abstraction model. Terminology: To be consistent, where the term 'executable' is used, it means the single file, like 'gcc', that is executed, and should be a string. In contrast, 'command' means the entire command line, like ['gcc', '-c', 'file.c'], and should be a list. But note that FCompiler.executables is actually a dictionary of commands. ) FCompiler new_fcompilershow_fcompilersdummy_fortran_fileN)Path)get_python_lib) FancyGetopt)DistutilsModuleErrorDistutilsExecError CompileError LinkErrorDistutilsPlatformError) split_quoted strtobool) CCompilergen_lib_options)log) is_string all_strings is_sequencemake_temp_fileget_shared_lib_extensionfind_executable) _shell_utils)EnvironmentConfig).for.ftn.f77.fceZdZdS)CompilerNotFoundN)__name__ __module__ __qualname__W/opt/cloudlinux/venv/lib/python3.11/site-packages/numpy/distutils/fcompiler/__init__.pyr#r#-sDr(r#cBt|rt|S|SN)rrss r)flaglistr.0s!||Ar(c\t|rt|St|Sr+)rrboolr,s r)str2boolr16s'|||| 77Nr(c>t|ot|Sr+)rr)seqs r)is_sequence_of_stringsr4;s s   0 C 0 00r(c eZdZdZeddddedfdddedfdddedfdddedf Zedd d d d dddd ZedGiddddddedfddddedfdddd edfd!d"ddedfd#d$d%d#edfd&d'ddedfd(d)ddedfd*d+d,d*edfd-d.ddedfd/d0ddedfdd1d2d3edfd4d5ddedfd6d7ddedfd8d9d:d;edfdd?edfd@dAd>d?edfdBdCdDdEedfZ dddddddddFZ ddgZ dZ dGZ dZgZddHgdgdgddIgddJgdgdBdKgddLZdZdMZdNZdNZdZdOZgZgdPZdQZeZdRZdSZdTZdUZiZ gdLZ!dZ"gZ#gZ$dVZ%dWZ&dXZ'dYZ(e(dZZ)e(d[Z*e(d\Z+e(d]Z,e(d<Z-e(d@Z.e(d^Z/e(d_Z0d`Z1daZ2dbZ3dcZ4ddZ5deZ6dfZ7dgZ8dhZ9diZ:djZ;dkZdnZ?doZ@dpZAe?xZBZCe@xZDZEeAxZFZGdqZHdrZIddsgfdtZJdduZKdvZLdwZMdxZNdyZOdzZP dd{ZQd|ZRd}ZSd~ZTdS)ra0Abstract base class to define the interface that must be implemented by real Fortran compiler classes. Methods that subclasses may redefine: update_executables(), find_executables(), get_version() get_flags(), get_flags_opt(), get_flags_arch(), get_flags_debug() get_flags_f77(), get_flags_opt_f77(), get_flags_arch_f77(), get_flags_debug_f77(), get_flags_f90(), get_flags_opt_f90(), get_flags_arch_f90(), get_flags_debug_f90(), get_flags_fix(), get_flags_linker_so() DON'T call these methods (except get_version) after constructing a compiler instance or inside any other method. All methods, except update_executables() and find_executables(), may call the get_version() method. After constructing a compiler instance, always call customize(dist=None) method that finalizes compiler construction and makes the following attributes available: compiler_f77 compiler_f90 compiler_fix linker_so archiver ranlib libraries library_dirs config_fcNnooptFnoarchdebugverbose)distutils_sectionr7r8r9r:)zexe.compiler_f77F77f77execNF)zexe.compiler_f90F90f90execNF)zexe.compiler_fixr>r?NF)zexe.version_cmdNNNF)z exe.linker_soLDSHAREDldsharedNF)zexe.linker_exeLDldNF)NARarNF)NRANLIBranlibNF) r; compiler_f77 compiler_f90 compiler_fix version_cmd linker_so linker_exearchiverrGr;f77z flags.f77F77FLAGSf77flagsTf90z flags.f90F90FLAGSf90flagsfreez flags.free FREEFLAGS freeflagsfixz flags.fixoptz flags.optFOPTopt_f77z flags.opt_f77opt_f90z flags.opt_f90archz flags.archFARCHarch_f77zflags.arch_f77arch_f90zflags.arch_f90z flags.debugFDEBUGfdebug debug_f77zflags.debug_f77 debug_f90zflags.debug_f90flagszself.get_flagsFFLAGSfflagsrLzflags.linker_soLDFLAGSldflagsrMzflags.linker_exerEzflags.arARFLAGSarflags)r!r.Frr .f90.F90.f95r'z-vz-fixedz-sharedz-cr)rKrHrIrJrLrMrNrGz-cz-o z-I) rrr r!rmrorlrnz.FORz.oz.azlib%s%sz%s%sctj|g|Ri||j|j|_|j|j|_|j|j|_|j|_|j D]}||jvr d|j|<d|_ dS)NF) r__init__distutils_varsclone_environment_hook command_vars flag_vars executablescopy_executable_keys_is_customised)selfargskwes r)rrzFCompiler.__init__s4-$---"---"1778NOO -33D4JKK--d.DEE+0022& + +A(((&* #$r(c||j}|j|j|j|j|_|j|j|_|j|j|_|j |_ |Sr+) __new__ __class____dict__updatersrtrurvrwrxry)r|objs r)__copy__zFCompiler.__copy__sll4>** DM*** /55c6KLL+11#2GHH ++C,ABB /..00 r(c*|Sr+)rr|s r)ryzFCompiler.copys}}r(c.fd}t|S)Nc0|jsJ|jSr+)r{rx)r|keys r)fgetz)FCompiler._command_property..fgets & & & &#C( (r()r)property)rrs` r)_command_propertyzFCompiler._command_propertys/ ) ) ) ) )T""""r(rKrHrIrJrNrGc2|||dSr+) set_commandr|rvalues r)set_executablezFCompiler.set_executables e$$$$$r(c f|D]\}}|||dSr+)itemsr)r|r~kvs r) set_commandszFCompiler.set_commands s@HHJJ # #DAq   Q " " " " # #r(c||jvrtd|d|jjt |rt |}|#t |dds J||f||j|<dS)Nzunknown executable 'z ' for class r)rz ValueErrorrr$rrr4rxrs r)rzFCompiler.set_commandsd+++*dn--/00 0 U   ( ''E} 6uQRRy A A}}C<}}} %r(cjsJjfdfd}dfd }j}|d}|s7|d}|rtjd|znEt d|z|d| }|stjd |z|d | |d || |d|| |d|| |d|ddS)a3Go through the self.executables dictionary, and attempt to find and assign appropriate executables. Executable names are looked for in the environment (environment variables, the distutils.cfg, and command line), the 0th-element of the command list, and the self.possible_executables list. Also, if the 0th element is "" or "", the Fortran 77 or the Fortran 90 compiler executable is used, unless overridden by an environment setting. Subclasses should call this if overridden. cR|vr|St|}|x|<|<|Sr+r)exefc_exe exe_caches r)cached_find_executablez:FCompiler.find_executables..cached_find_executable-s=i ~%$S))F17 7IcNYv.Mr(cp|0t|s#t|d|djjdSdS)Nz value z is invalid in class )r4rrr$)namerr|s r)verify_command_formz7FCompiler.find_executables..verify_command_form3sS )?)F)F  TT555$."9"9;<<<!   r(Nc j|d}|sdSt j|}|s ||g jz}n |g jz}t }g}|D]D}|dkr|}n|dkr|}|r||vr||||E|D]}  | } | r | |d<| cS |ddS)Nzzr) rxgetgetattrrvpossible_executablessetaddappendr) exe_keyrOrRcmdexe_from_environ possiblesseenunique_possiblesrrrrr|s r)set_exez+FCompiler.find_executables..set_exe8s9"&&w55C t 't'8'BB # K #J)BB -.1JJ 55D!  + +<<AA'\\AAII  ''****' " "//44"#CF!MMM"   Wd + + +4r(rIrHz %s: no Fortran 90 compiler foundz%s: f90 nor f77)rRz %s: no Fortran 77 compiler foundrJrL)rOrRrMrKrNrGNN)r{ _exe_cache compiler_typerwarnr#)r|rrctyperRrOrrs` @@r)find_executableszFCompiler.find_executabless""""O        < < < < <        @"gn%% -'.))C B;eCDDDD&'85'@AAA'.c222C E;eCDDD GN , , , , #.... #3//// 3C0000 r(cdS)aqCalled at the beginning of customisation. Subclasses should override this if they need to set up the executables dictionary. Note that self.find_executables() is run afterwards, so the self.executables dictionary values can contain or as the command, which will be replaced by the found F77 or F90 compiler. Nr'rs r)update_executableszFCompiler.update_executablesls  r(cg|jzS)z+List of flags common to all compiler types.) pic_flagsrs r) get_flagszFCompiler.get_flagswsDN""r(cT|j|d}|gS|ddS)Nr)rxr)r|rrs r)_get_command_flagszFCompiler._get_command_flags{s1""3-- ;I122wr(c,|dS)z"List of Fortran 77 specific flags.rHrrs r) get_flags_f77zFCompiler.get_flags_f77&&~666r(c,|dS)z"List of Fortran 90 specific flags.rIrrs r) get_flags_f90zFCompiler.get_flags_f90rr(cgS)z.List of Fortran 90 free format specific flags.r'rs r)get_flags_freezFCompiler.get_flags_free r(c,|dS)z/List of Fortran 90 fixed format specific flags.rJrrs r) get_flags_fixzFCompiler.get_flags_fixrr(c,|dS)z/List of linker flags to build a shared library.rLrrs r)get_flags_linker_sozFCompiler.get_flags_linker_sos&&{333r(c,|dS)z,List of linker flags to build an executable.rMrrs r)get_flags_linker_exezFCompiler.get_flags_linker_exes&&|444r(c,|dS)zList of archiver flags. rNrrs r) get_flags_arzFCompiler.get_flags_ars&&z222r(cgS)z0List of architecture independent compiler flags.r'rs r) get_flags_optzFCompiler.get_flags_optrr(cgS)z.List of architecture dependent compiler flags.r'rs r)get_flags_archzFCompiler.get_flags_archrr(cgS)z=List of compiler flags to compile with debugging information.r'rs r)get_flags_debugzFCompiler.get_flags_debugrr(c |jddS)zList of compiler libraries.N) librariesrs r) get_librarieszFCompiler.get_librariess~aaa  r(c |jddS)z%List of compiler library directories.N) library_dirsrs r)get_library_dirszFCompiler.get_library_dirss ##r(rcf|jsJtj|||}|t|S)N)force ok_status)r{r get_versionr#)r|rrversions r)rzFCompiler.get_versions>""""'EYOOO ?"$$ $r(ctjdjjzd_j|j|j|  j dd}j d|}j dd}jj jj ggg}gr+tjjjr7tjjjjj}jjr.tjjjzggg}}}fd} |s| d||s | d ||r | d|jj|z|z|z} rz| z r|zz| z rz| z j} | r jj} t2jd r_t9d} t:j| dd}t:j| dd}|g| zd|zgz} t2jdr^ddl m!}|d}t:j|d}t:j|d}|g| zd|zgz} | | zj"}|r%jj"}||zjj#}|r&jj$}|g|z%&'(dS)aCustomize Fortran compiler. This method gets Fortran compiler specific information from (i) class definition, (ii) environment, (iii) distutils config files, and (iv) command line (later overrides earlier). This method should be always called after constructing a compiler instance. But not in __init__ because Distribution instance is needed for (iii) and (iv). z customize %sTr7Fr8r9c4|t j|t d|z}dfd fd ffD]L\}}}|d|}|r=|t d|zur(|t j|MdS)N get_flags_rOrR_)extendrrw)tagrethis_getrcflagvartrOrQrRrTrXfixflagsr|s r)rz&FCompiler.customize..get_flagss LL55 6 6 6t\C%788H&+S(%;&+S(%;&+S(%;%= ? ? a #ssDD)?|a7G)H)HHHNN74>1#=#=>>>  ? ?r(rYr])rH)rI)rJaixr) standard_libconfig ld_so_aixz python.expz-bI:os400r)get_config_varLIBPL)rL)rM)rNN))rinforr$r{rsuse_distributionrvrwrrrrHrIr NativeParsersplitrOrRrUrJrXrerrLsysplatform startswithrospathjoindistutils.sysconfigrrMrNrEset_library_dirsr set_librariesr)r|distr7r8r9rWoflagsaflagsdflagsrrgrLlinker_so_flags python_libr python_expr python_configrMlinker_exe_flagsrErkrOrQrRrTrXrs` @@@@@@r) customizezFCompiler.customizes 4>#:;<<<" ,,T222 **4000 ''--- !!! #''77$((599#''77,,   *+11#66C~)H  ,+11#66C~)H+I,  5+11#66C~)H4H!#R ? ? ? ? ? ? ? ? ? ? ? * IeV $ $ $ * &&)))  ' Igv & & &%.7&@  @   3x<+>  ? ? ?  J   3y=+A&+H  I I I  @   3x<+>  ? ? ?N  C"n6O|&&u-- J+;;; GLLX{KK W\\*h MM &K)3vj7H6II |&&w// J>>>>>> .w 7 7 GLL DD W\\-FF &K)3vj7H6II    /(A  B B B_  F#~8    4D)D  E E E   '  5n'G   tG|  4 4 4 d3355666 4--//00000r(c g}t|jgdzD]J}t||r8t ||}||ddt |zfK|t|}| d|j j zD],}|dddkr d|ddz}t|-dS)z0Print out the attributes of a compiler instance.)rrr object_switchcompile_switchNz= z%s instance properties:z --z ) listrxkeyshasattrrrreprsortr generate_helprr$print)r|propsrrpretty_printerls r)dump_propertieszFCompiler.dump_properties,s (--//004444 8 8CtS!! 8D#&& c4d1gg6777 $U++--.G151H/JKK  A!uf}}1QRR5L !HHHH   r(ci}t|jtvr1t |s"d}|j} t |}|jpg} nvt|r4d}|j } | td|j j d||j pg} n3d}|j} | td|j j d||j pg} |jdd kr|j|g} n|j|zg} |jsJ|j|g} | r5t%jd |d dd d | ||jg} | r*t%jd d | z| |z| z| z| z|z| z}t.j| d|zd|} |||dS#t$r$}t7|}t9|dd}~wwxYw)zCompile 'src' to product 'obj'.z:f77z:f90Nzf90 not supported by z needed for z:fixzf90 (fixed) not supported by  zextra rz options: z%using compile options from source: %rrz: )display)rsuffixlowerFORTRAN_COMMON_FIXED_EXTENSIONShas_f90_headerrH get_f77flagsextra_f77_compile_argsis_free_formatrIr rr$extra_f90_compile_argsrJr stripr rrrrrrrbasenamespawnstrr )r|rsrcextcc_argsextra_postargspp_opts src_flagsflavorcompilerextra_compile_argso_argss_args extra_flagscommandrrmsgs r)_compilezFCompiler._compile@s 99  ! ! # #'F F F!#&& GF(H$S))I!%! >@PQRRRRt5;;==>NNOOOO ;?OP Q Q Q 3T^5L M M M  % 1&' 3 I I)C)CQQGHHHH I 6+F G G G 79P Q Q Qr(c d|zS)Nz-lr')r|libs r)library_optionzFCompiler.library_option czr(c d|zS)Nz-Lr')r|dirs r)library_dir_optionzFCompiler.library_dir_optionrCr(c|||\}}||||\}}}t||||}t|r!tj||}n|td|||rU|j ddkr|j |g}n|j |zg}t|j r ||j gz}n ||j z}||z|z}| rdg|dd<| r| |dd<| r| | | tj||tjkr|jdd}n|jdd}||z} ||dS#t($r$}t+|}t-|dd}~wwxYwt/jd|dS)Nz%'output_dir' must be a string or Nonerrz-grzskipping %s (up-to-date))_fix_object_args _fix_lib_argsrrrrr TypeError _need_linklibrary_switchr%objectsrmkpathdirnamer EXECUTABLErMrLr'r r(r rr9)r| target_descrMoutput_filename output_dirrrruntime_library_dirsexport_symbolsr9 extra_preargsr, build_temp target_langlib_optsr2ld_argslinkerr5rr6s r)linkzFCompiler.linksF #33GZHH   y,8L M M 6 >tvv    9;; r(cdS)zc Check if the given C compiler can link objects produced by this compiler. Tr')r| ccompilers r)can_ccompiler_linkzFCompiler.can_ccompiler_links tr(ct)a Convert a set of object files that are not compatible with the default linker, to a file that is compatible. Parameters ---------- objects : list List of object files to include. output_dir : str Output directory to place generated object files. extra_dll_dir : str Output directory to place extra DLL files that need to be included on Windows. Returns ------- converted_objects : list of str List of converted object files. Note that the number of output files is not necessarily the same as inputs. )NotImplementedError)r|rMrS extra_dll_dirs r)wrap_unlinkable_objectsz!FCompiler.wrap_unlinkable_objectss."###r(r+) NNNNNrNNNN)Ur$r%r&__doc__rr1rsrvr.rw language_maplanguage_orderrcompiler_aliasesversion_patternrrxsuggested_f90_compilerr r rLr9r:rsrc_extensions obj_extensionrshared_lib_extensionstatic_lib_extensionstatic_lib_formatshared_lib_format exe_extensionrrz c_compilerr"r$rrrryrrKrHrIrJrLrMrNrGrrrrrrrrrrrrrrrrrget_flags_opt_f77get_flags_opt_f90get_flags_arch_f77get_flags_arch_f90get_flags_debug_f77get_flags_debug_f90rrrr rr7r?rBrFr\rurerir'r(r)rr>sPP'&%tWh6h%8tWh6y(E: N%$%JJJBJ@28   L"!%+J HdCCJ HdCCk;$GG  D$%88  FE8T:: #D$%@@#D$%@@gvx??%dD(EBB%dD(EBB(HdCC'dHeDD'dHeDD"8XxFF ' 9hMM!"))Y$OO#$)Y$ ? ?%I* !!!!!!LU^N MOt})Y'g5M   K"NMN !IYYYNM3355!MJ""" J  $ $ $ ### $#M22K$$^44L$$^44L$$^44L!!+..I""<00J  ,,H  x ( (F%%%###&&&MMM^    ### 777777777444555333-:9).<<+0??-!!!$$$!&!s1s1s1s1j(1.1.1.f$:>599=?C -C-C-C-C^,$$$$$r(r) )win32) gnuintelvabsoftcompaqvintelevgnu95g95intelvemintelemflang)zcygwin.*)rrrrrrr)zlinux.*)armrintellaheypgnvrnagvastcompaqintelerrrpathf95nagforfujitsu)zdarwin.*) rrrribmrrrr)zsunos.*)sunrrr)zirix.*)mipsrr)zaix.*)rrr)posixrr)ntr)mac)rrrc ddlm}tdStjtjt d}iaia||D]}tjtj |\}}d|z}t|tj |}t|dr|jD]}t||}|j||jf}|t|j<|jD]H} | tvr3t'd| d|jd t| d j|t| <IdS) zcCache all the FCompiler classes found in modules in the numpy.distutils.fcompiler package. r)globNz*.pyznumpy.distutils.fcompiler. compilerszalias z defined for both z and r)rfcompiler_classrrrrO__file__fcompiler_aliasessplitextr& __import__rmodulesrrrr descriptionrmrr$) rpysfname module_namer*modulecnameklassdescaliass r)load_all_fcompiler_classesrs" ',,rwx00& 9 9COc447++BG,<,>>,=e,DQ,G,P,P*RSSS04%e,, 444r(Fcrddlm}|d}|D] }d} t|||} | || }|rl| jed}| j} | rZtjd|d| dt|| |} | || }|| }|r#| jtd | j j znE#t$rtj d |Yn$t$rtj d |YnwxYw||cS"dS) Nr)get_distributionT)always)platr0rwzTrying z compiler as suggested by z compiler for f90 support.z2%s does not support compiling f90 codes, skipping.zH_find_existing_fcompiler: compiler_type='%s' raised DistutilsModuleErrorz6_find_existing_fcompiler: compiler_type='%s' not found)numpy.distutils.corerrr rrIrorrrrr$r r9r#) compiler_typesosnamer requiref90rwrrrrr new_compilers r)_find_existing_fcompilerr#s655555  4 ( ( (D'!!  _8m)3555A KK    A 5an4 7  5HH@@@?""/>x/H, U,, & & &/@/J, U,,G$N  .99C7XXo22445577C  m,,,tuWgUCCCH$H Or(cJ|ddlm}ddlm}|}tjtjd|_ dgtjddz|_ |j dn#t$rYnwxYw||j d<||g}g}g}t st#t%}|D]&}d}t'jd t+||j } | || }nW#t2t4f$rC} t'jd |d t'jt9| Yd} ~ nd} ~ wwxYw|-|d |zdt |d f| |d |zdt |d d|zzf(t?tAt !tA|z }d|D}|"|"|"tG|} | $dtG|} | $d|r$tG|} | $dtKddS)zbPrint list of available compilers (used by the "--help-fcompiler" option to "config_fc"). Nr) Distribution)r6r6rz--help-fcompiler)r0r:zshow_fcompilers: z not found fcompiler=z (%s)c@g|]}d|zdt|dfS)rNr)r).0fcs r) z#show_fcompilers..s=,,,""_dOB,?,BC,,,r(zFortran compilers found:z5Compilers available for this platform, but not found:z)Compilers not available on this platform:z>For compiler details, run 'config_fc --verbose' setup command.)&distutils.distr'numpy.distutils.command.config_compilerr6rrr&rargv script_name script_argsremovercmdclassparse_config_filesparse_command_linerrrr set_verbosityrr:r rr r#r9rrrrrrrr print_helpr) rrr6r compilers_na compilers_niplatform_compilersr0rrrrs r)rrs| |//////EEEEEE|~~7++CHQK88'=38ABB<7    # #$6 7 7 7 7    D %. k" !!! !!!ILL %"$$$:<<&KK  " xFFFA KK    AA$&67    IIC D D D Id1gg          9   h!6-h7:!< = = = =         l83T-h7:Wq[HJ K K K KO002233c:L6M6MMNNL,,*,,,LNN ++N8999 ..N9:::O$\22!!"MNNN JKKKKKs*+B BB ?E  F!9FF!ctd\}}|d||ddS)Nr!)rz# subroutine dummy() end r)rwriteclose)fors r)rrsDT***HBHH 4555HHJJJ 9r(z-\*-\s*fortran\s*-\*-z-\*-\s*f90\s*-\*-z-\*-\s*fix\s*-\*-z[^c*!]\s*[^\s\d\t]cd}t|d5}|}d}t|st|rd}nt |rd}d}|dkry|rw|}|rE|ddkr9|dz}|ddkrt |dd s|d dd krd}n|}|dkr|wdddn #1swxYwY|S) z(Check if file is in free format Fortran.rlatin1encodingi'r! Nr^r&)openreadline _has_f_header_has_fix_header_has_f90_headerrstrip_free_f90_start)fileresultflinens r)r#r#sSF dX & & & !zz||     /$"7"7 AA T " " AFccdc;;==D Q QGTMMod2A2h&?&?MDIsNNF::<\w+)\s*\)\s*=\s*(?P.*)c~i}t|d5}d}|D]}|dz }|dkrn~t|}|s,|d}|d}t |||<dddn #1swxYwY|S) z Search the first 20 lines of fortran 77 code for line pattern `CF77FLAGS()=` Return a dictionary {:}. rrrrfcnamergN)r _f77flags_rergroupr%r)r)rerirmrrgs r)r!r!s E cH % % % 1  1 1D FAttUU""4((A hWWX&&,,..FWWX&&,,..F(00E&MM 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 LsBB22B69B6__main__)NNFNr)NNrrrFNr+)Frj__all__rrrpathlibrrrdistutils.fancy_getoptr distutils.errorsr r r r rdistutils.utilrrnumpy.distutils.ccompilerrrnumpy.distutilsrnumpy.distutils.misc_utilrrrrrnumpy.distutils.exec_commandrr environmentrtype __metaclass__r Exceptionr#r.r1r4rrrrrrrrrrrrrcompileIsearchrrrrrr#r rr!r$r'r(r)rs ! ! ! ............IIIIIIIIIIIIII22222222@@@@@@@@--------------888888((((((****** #A"@"@     y     111o $o $o $o $o $ o $o $o $f&444:48(-(,####J # # # #BG%)     CEE"# %%%%N9L9L9L9Lx 3RT::A "*12488?"*12488?"*2BD99?.::: rzZ\^\`aa * zOr(