summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openmp/CREDITS.txt3
-rw-r--r--openmp/runtime/README.txt22
-rw-r--r--openmp/runtime/doc/Reference.pdf3262
-rw-r--r--openmp/runtime/src/dllexports5
-rw-r--r--openmp/runtime/src/exports_so.txt22
-rw-r--r--openmp/runtime/src/include/40/iomp.h.var10
-rw-r--r--openmp/runtime/src/include/40/omp.h.var25
-rw-r--r--openmp/runtime/src/include/40/omp_lib.f.var27
-rw-r--r--openmp/runtime/src/include/40/omp_lib.f90.var18
-rw-r--r--openmp/runtime/src/kmp.h147
-rw-r--r--openmp/runtime/src/kmp_affinity.cpp25
-rw-r--r--openmp/runtime/src/kmp_alloc.c8
-rw-r--r--openmp/runtime/src/kmp_atomic.c64
-rw-r--r--openmp/runtime/src/kmp_atomic.h60
-rw-r--r--openmp/runtime/src/kmp_cancel.cpp282
-rw-r--r--openmp/runtime/src/kmp_csupport.c106
-rw-r--r--openmp/runtime/src/kmp_dispatch.cpp22
-rw-r--r--openmp/runtime/src/kmp_ftn_cdecl.c30
-rw-r--r--openmp/runtime/src/kmp_ftn_entry.h259
-rw-r--r--openmp/runtime/src/kmp_ftn_extra.c28
-rw-r--r--openmp/runtime/src/kmp_ftn_os.h146
-rw-r--r--openmp/runtime/src/kmp_global.c9
-rw-r--r--openmp/runtime/src/kmp_gsupport.c291
-rw-r--r--openmp/runtime/src/kmp_i18n.c20
-rw-r--r--openmp/runtime/src/kmp_i18n.h6
-rw-r--r--openmp/runtime/src/kmp_itt.h9
-rw-r--r--openmp/runtime/src/kmp_itt.inl82
-rw-r--r--openmp/runtime/src/kmp_lock.cpp20
-rw-r--r--openmp/runtime/src/kmp_lock.h72
-rw-r--r--openmp/runtime/src/kmp_os.h228
-rw-r--r--openmp/runtime/src/kmp_runtime.c707
-rw-r--r--openmp/runtime/src/kmp_settings.c20
-rw-r--r--openmp/runtime/src/kmp_str.c10
-rw-r--r--openmp/runtime/src/kmp_stub.c51
-rw-r--r--openmp/runtime/src/kmp_tasking.c114
-rw-r--r--openmp/runtime/src/kmp_version.c10
-rw-r--r--openmp/runtime/src/makefile.mk110
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify.h490
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h128
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c278
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h37
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h4
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h34
-rw-r--r--openmp/runtime/src/z_Linux_asm.s22
-rw-r--r--openmp/runtime/src/z_Linux_util.c110
-rw-r--r--openmp/runtime/src/z_Windows_NT_util.c28
-rwxr-xr-xopenmp/runtime/tools/check-tools.pl77
-rw-r--r--openmp/runtime/tools/common.inc10
-rw-r--r--openmp/runtime/tools/lib/Platform.pm10
-rw-r--r--openmp/runtime/tools/lib/Uname.pm4
-rw-r--r--openmp/runtime/tools/src/common-checks.mk28
-rw-r--r--openmp/runtime/tools/src/common-defs.mk6
-rw-r--r--openmp/runtime/tools/src/common-tools.mk32
-rw-r--r--openmp/www/README.txt22
-rw-r--r--openmp/www/Reference.pdf3262
55 files changed, 6299 insertions, 4613 deletions
diff --git a/openmp/CREDITS.txt b/openmp/CREDITS.txt
index 67b3e9e3c05..c054358b472 100644
--- a/openmp/CREDITS.txt
+++ b/openmp/CREDITS.txt
@@ -12,3 +12,6 @@ N: Intel Corporation OpenMP runtime team
W: http://openmprtl.org
D: Created the runtime.
+N: Steven Noonan
+E: steven@uplinklabs.net
+D: Patches for the ARM architecture and several inconsistency removal.
diff --git a/openmp/runtime/README.txt b/openmp/runtime/README.txt
index 3880bf036a3..6ecca7f64e8 100644
--- a/openmp/runtime/README.txt
+++ b/openmp/runtime/README.txt
@@ -74,13 +74,13 @@ Supported RTL Build Configurations
Supported Architectures: IA-32 architecture, Intel(R) 64, and
Intel(R) Many Integrated Core Architecture
- -----------------------------------------------------------
- | icc/icl | gcc |
---------------|------------------------------|--------------------------|
-| Linux* OS | Yes(1,5) | Yes(2,4) |
-| OS X* | Yes(1,3,4) | No |
-| Windows* OS | Yes(1,4) | No |
--------------------------------------------------------------------------
+ --------------------------------------------
+ | icc/icl | gcc | clang |
+--------------|---------------|--------------------------|
+| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
+| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
+| Windows* OS | Yes(1,4) | No | No |
+----------------------------------------------------------
(1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are
supported (12.1 is recommended).
@@ -89,6 +89,14 @@ Intel(R) Many Integrated Core Architecture
(4) Intel(R) Many Integrated Core Architecture not supported.
(5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0
or later are required.
+(6) clang version 3.3 is supported.
+(7) clang currently does not offer a software-implemented 128 bit extended
+ precision type. Thus, all entry points reliant on this type are removed
+ from the library and cannot be called in the user program. The following
+ functions are not available:
+ __kmpc_atomic_cmplx16_*
+ __kmpc_atomic_float16_*
+ __kmpc_atomic_*_fp
Front-end Compilers that work with this RTL
===========================================
diff --git a/openmp/runtime/doc/Reference.pdf b/openmp/runtime/doc/Reference.pdf
index 60ce4008d6d..680f98c0faa 100644
--- a/openmp/runtime/doc/Reference.pdf
+++ b/openmp/runtime/doc/Reference.pdf
@@ -778,11 +778,11 @@ endobj
<< /S /GoTo /D [521 0 R /Fit ] >>
endobj
523 0 obj <<
-/Length 252
+/Length 257
/Filter /FlateDecode
>>
stream
-xڅMKA wIGQ(voұt-e ߻SO›!XY]^,-ԯ d95h^cyմ]=C:bCؠ!B>'ĺCp2(zNF1c$K|6#J|(oVb*_6T~BoCeuȠLSdٚ+}:kLMn0? Xd--YBm~^rbgu <l:
+xڅMK1aǙI&=("{SƲw?j]ia&AVSOx"D$zV'%ւ$M_Cu1D48d%=',XvDssus@T=:DHM[fSr^n ~ܘҢA28TlȠ,rǛm^p/ :7A #Oax
endstream
endobj
521 0 obj <<
@@ -800,16 +800,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
529 0 obj <<
-/Length 1187
+/Length 1184
/Filter /FlateDecode
>>
stream
-xڕVY6~ЇRZK]d 4Hh$*:u}gxȶVh'fs|s{{z]]nR/6ve4Mۖ'_WooNQ/<ȣ+է/+AޣAɽgY{Ii]yWYPv{㯣,'w k7j 75B`h׷ ;Cu45&~iQ觔:6Pu++ߚ1%Gf+5AaJ ~R!%;7Y;YtT!^.{<aޡG۸mL1|w !_'l
- F,9&4eSJINJ%zl@
-2S$vZ
-7|IwABcif`;SKt܋<MJ+ɨi{ޅ4m[ɂV`! (G"!A@pߍA)Ԫes@YI'+e7G!dca>nFBT غ cȦא.*dtq09Mqq m68/Eͻ5쮹2nE6 Zgc̢n5|_m޸KfvnVC R66k<"ص/9;
-56vR:}8 ]I@ini4H[ n~ѓeЦRT\n~(Dv9}6;;w?ܟBE:,Ujfq .~}`[[`E PƮ%TXM;wjm+! M|/ -!+s;<fT; itKDK#2Il+{+a4ģh F(XN*^a $i|
-kqD339
+xڕVYo6~_!
+L]ĉI@ZwHFG ,4퓆399(m=ݬlVeaIim^^!M}f}-EVQEzUx5{$L{֚fI Ѝ}E~F!q7W: v?VQq :'v2cW9 #~+E;{lY`[`J5X "2Πwg=k-Um}Zf݉SNU :ɿw>ـfz$Qe9:J㽽7
+|j1uJHhͪaxm$p&V[xf}]=5Iz1|[t
+iNhN惁Jiئ++-S/aγvJn$RL,5k4P!y%Wx6|IuN \cif`;SKOt܋<2ɨi{߅4}#*ۀG"?'YgpYqýE#S(hUg y@YIǷܚ+z
+0uT7J!*Ml݅?mdrvpkH> Z~z8~I8{f6Aռeݷ_z\7p%-ijOĆ ٘[ 77+ezr̥)͚h8v닶qSFik'x?!ӧ!Mȥ&_,ua"g=-]n٧X m*UDgHݮ8#c>wVugǻcH%Fmլ0.XEï6rmksQ s
endstream
endobj
528 0 obj <<
@@ -1058,15 +1057,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
609 0 obj <<
-/Length 1208
+/Length 1206
/Filter /FlateDecode
>>
stream
-x]6+ +&LYb7ðXk0Wav=
-2ƫvommZ$64&zk(*HH
-gx;LL+cicw
-ŰK/RYK+5=76ĸF,
-ϱfc̶1 =8|j>rΕ078LjOY!#s@k1КƏ Xh4qՑVж7
+xOs8: z6lg6Ca& ^O7+@άk^=J@͵ˁ]!(=
+āBlO1s+IeETJׂsQgywۦJjaWsjSΠTA2
+WV"zagܞX$Ȣ443FǶ(0C@t1ӃԃP;D CGq5MVWhF xH4*54.mJG C-xk*'/K"+-E0}meim|ō!+ۮ`7[[<FR$F>&ָXF>QRpgfXlX3SEd OUg&ه*n\B9L@ub !V8K%CY7Q>ņ,06of$2#3M: 3Yϫp>tȎr$wd(Xt~W:z@ЦSvۄZ8[r7qAZ±i|(8fr0k0_K˂8H{xZP\m7^O2f㯱z\7AZKVPbsՖ\:55LE_ZeX|v,>Y=41'LY>ĸ,{핑hYMʼLq<F2Ŭ?k)O5~
+ ^ao~`Rlda|G(~^_z:Ź2!:f
+w{HumEK]Iݯ[U'y7+'</¤_:
endstream
endobj
608 0 obj <<
@@ -1362,15 +1361,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
652 0 obj <<
-/Length 1113
+/Length 1107
/Filter /FlateDecode
>>
stream
-x]sF+.\&M2ʹIsggS 5u} Kk1bŬ=E ~:NsH@j\{o>} ~ /^$)go3l[>0g_X>
--c ;ؓ3瘩&381LF\3""2]`H>#1e4br=ljb-V&]qf^'qrA1%>5C1h̅GMtm¥' 4w&;vIz2]jtҜ O& wyds^xI3x
-#@&X-z,
-鎠iol%ԤvrImSs6'j:Ǒ ⶹ/'GsnjjXBxWi6iM%*0?x]<JO=BƬ<1Q9devmˆs?uY}T+֛x6i ҉Cbvӵ[m"ZeAZ-zfYUg Ӎo۾"k9KMXMk}7s#wIٲ~ZA>Ow&1j Bt[vog`#VQ>:|F݇LJNEQk,3o[ϰIJMպ$Nvvc/ceNλ0'8{|L5 sw O/0MG^f87R1u*20 m&CXhTMzJ %QϛD=J
-MJTr=T*X8\BE9 H;'ޤ&}lőbgٝO.ܬn駭IC; m%U i=HG}UsJ|ާy-m54b|ᾼ.
+x[sF+.!mL39 f*!$rY"O\ÍѢ~߻bt9PP AH@j%~ax .b ۳z " Dg
+āΨ+R(9fZyAzx >8 }1WsE9uOz-U]XBez ra {rf3dg6A"ȟkF:S}#䨁S:HQF#&'XI\mqSF-6+beev(Y+S_S3hCawI]xD D&],]zIs56R\x6,l`6$8
+턴T$V|՜6}ȡϧ}Bo0mYɧp(8&qRI
endstream
endobj
651 0 obj <<
@@ -1666,15 +1663,17 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
674 0 obj <<
-/Length 927
+/Length 925
/Filter /FlateDecode
>>
stream
-xIsH}zz_|TRYflnN¨-S(}^x HThZ~+Mf"JdUiRH[EٷK "0c~׌gWG[`JW/-;D0]73WHH
-NVNt
-uGQJ ^+IpN9gM:L:ݬ\^'͐׹_ R )lhub qhN5VZU9 nƥ&vc< . <Ox Q֗K#! \&[ j`sJ̪ڕO U tY@K5丑Q%ARF6UTX/AzDY&kÖ%S*x$qW-R9%Ng}5قevAy*bN|՗1D+1aS3WM ]IV
-)kֱVЂ:z#9uC>“e5-H~0̲߾(FjJ9݇|vNzpA=aفBX$$T
-~/Ipӎ{5n7.o
+xIs68ؗędus2eN,%:y⚤TGn3S;$=<x+A
+QfbˉS@Kd(Z#8 -gEpwˏ?,»W;%J׳-;Dp43H*ApfhV+\uO;E(o4#WUGD4gBp|:ќ_mu 
+I4WJ=?`C01p$93D~,/"M oUpR1diNJxQWO#>N/Hs59JʪڗO=<U tY@+I 丑15x1NqR}U*mQl3ю=4EΉcrlɌ<cƯ|d<bW*gTB"
+5ӿ"f
+x1;.(oE\C̉o*hE5&,zՐ@H7xz.@}FM!bCDY2T 뤪t`)2$ۻ낢¶aQMOk?8MS^<4c} ݧiٙ裂~tʚw -N>0a΍;bPuwOdUM " <.fw%j-Qet;0cF% '2f\#@dr/a~$V{ # 7=4@F9=(%%TvGoqϠ;Cu. SHn
+rMf ܗI72+δar1{8śzzW}X_h䌰iJn}m^gk
+-(PS|ێ\5n-4._oW
endstream
endobj
673 0 obj <<
@@ -1885,24 +1884,24 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
687 0 obj <<
-/Length 2637
+/Length 2634
/Filter /FlateDecode
>>
stream
-xڭZܸ (ïW 6MhPx#{ΏKEnjMˎ-QEH ~z" Q$[/XE^
-q:b0/NDaoz/?K1.@ZNLѼk)NWM55;l_~4 pD(ozK00&'CT(YP{w`MDKCҋ#V"uuբB]@4~*)k4MVuG#m8԰B~sMVk(Y+z4_l6i"M,띶
-Xs0n(Ѣowu_o4UeepVn~; n
- MnĊ44*/-Xw7r'HQc,*o0.< Dl!,D8#:²YasMpaJH'2H7eGse~Ĉf&wĹY﷏YBogHDTCL-
-kY8tFZ'>!pcP:vyN|0x19( ڋY#]Se{,,C`80!㯖Ɯ7+%Yg"22#Qc_>gFN[C=|B譫XdxݎP D0L玁ޭ
-}wG!thؼsFMf^C:PeFz{:z1ur mtO{{h<^h'wX
-꾲Vu$}rPdr̉dQ9rs){1!nFI!›.:{c^m[qb5hF{7u5  jИ&eZ8R[w<x.K&ᗼI~f!h-%hhTήÊh[mVrrˡ )!ξY`^ͮ, Z܈+6p-fЦLq`k]Aa08k4.F/`zQJvt F!]8a00m{sˠ\Hn rZ '(tuD9g6
-;,:ꗰ)xiݡl'Jlk)a"D4Aq-pA+Ks&^
-ҳ*{x
- Z4I/
- e\BFs/b (y'(Aq} I"ȋ,_YT9R8bBʋKƢiv9aB8,ͤKKI J8Vβ425Х&4J*S
-2^0u!{5tMFo=˹Ql6$1"%CmM~.
- (P?OOt&G/Tr[㈩ οx
-(;yR@ʼn+ SM.
+xڭZmܸ HQdKk+KCI&[Er(c=g{.Y%E/3n6/;DQ" /~ɋ,Rű.$i{ID,{Zt俬{S}PQZGQٛV\ <2/*FZ'BTD˝U^yZܹ7\ KOHUmv ~d)w^i(V彻E0UBOD"$Kb)V*MەMݡB[h8~4%SF~0{Sж[`bi?fT&͆8M$ݴ܌_n ϚlP*b-ȢλivG6
+eh>*y]q60sLU\hb[E,
+l@oꢬoJEey*#)GiI u*
+CpaJi'" #&(5j!?T=Y lw gtpjpȞ[-|ƘD\I L4@2"\bg@ҫi MB+wʱ+
+ҍ!XA\^"P:?u3 ")R=?}aP:jiy$B} -|ԘϹUfoѬ́^>!A^7d,|i=~KO7P,T(掁m
+BgS}_WVҊ_QG.*5h9^xEpY:4l_o9'ռYr;(1Tّ^ ^@2w3ZsmyLJ{AM~rSبj~ĭD}Tݓ+W fNؑk/kTV=Y+c"8X?܌o^]|c^t5@雦[yCfiHLwGjcT=%"^f˒i%G߼9 4Y4G*upAxk'Ų"򆥩&bq̊ͷL7۲fy[n#[!LIoakSCA QQیb0(% P:ӄD\tM}kƐ0n̠ZHX7a9Hu[
+)$3-
+<%H BsPqhw=:J)!exFqb!KʀI$”/H
+8\B X$a]Ґgivh7 1_
+ Z9dt8l!
+o~(
+(<)PM-
+^|cj3[fgp661v@BNeTe9tËwnrb@wV4"6D 7*PÅq=Ğ/~6Ld SW=4Y ).+Ll1nrYanPNFd_(|Ɠ0CNzd˪2Ւ q=Po&=K]϶XjTc=ÖU_]?߶&/:-
+ã;?כi7ZC^!oH[Somi0, C܆}w6ԨXkp3DHtB;ɉ4NE¹fK=TP4K隝`@WX<dbԲ,2*TŦH1 ?aDE5hKzٸ~UzdO#jNW]FIli.EY}OV~G:?ݛg
endstream
endobj
686 0 obj <<
@@ -1938,22 +1937,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
699 0 obj <<
-/Length 2939
+/Length 2937
/Filter /FlateDecode
>>
stream
-xڝZYܶ~_<Rx$őʮ8VʃRqI KrCM*=}r< Fu9:7I}I|/c'k/VM|pu+o۬]+߽瑟޴,70L(J5- p7W٧W~v|/اQ0
-( ]9qE cV͛z}NGCMse7ꚳOe}nznUMi┛K?dUu/'m"~ߝL;NHFH]b{5yYUCäf}Sİ5YEvk}-C%؃zVh^ܺ5+Az46ؼC;ˇn\ֹiUv
-PDP,Ÿ<4j.?Ȗa mM> d/_oznPaŽ30ZIuNё#G^c "p)]UKܢ5]x!NYK/_Y[f@V1.(bO [
-SC;{`Ir=
-%
-7P Nf^j n9Lalv2GƃI
->N1ox  ORX@32
-B1`p%LܝzK
-G/Q0ƒ v}df(dK,rvtr?ĔX2, 9T`f,:[J(" +P4ڻp^a< ).Yf&hFX/Zah
-Scu+Cf4[/*tppeXgĦms=qKW+&
-.N:'c'Δ"W?v~zʍ}&ΡzEĢ;>g
-Z/* D`e!vAifi~?cdž2D`굉KI
+xڝZYs ~ׯ`hy>qV6U"{fXcVT{p5/Qts\`J4|zoŮDʉ<뺰>۞.U+oڬ]z}#^,럭 H0L5-q_/<s-od$N+?]|õ
+r?M;<YA;aC>]D"GLB;oro;D\ϕupkN?1U5)~Ȫ^&["nu;NHNZHl,"k 󲪆I aZaWpNdzuޗ`ay{qF*lcX**.qZ[Vu酶8`$Ü:!Zrp^Z~g+x*a/9@:
+
+{RZvquNс#vcs8L#o?p px˛bEJA0nb\Y'QDf [=
+g]CI*sSGC])zNo>~ie4'OQ
+;A
+a+
+|VAo1)0ziBO2]B6TY}Ӱ;>`MuhdQx}4
+O&MfnWshP2$Co9|!k-
+s*-% w$E89л,Tsi)ƾ"}9J[q9TdӐ+.7 #b`A; PqltP 1!;.4` lƼ3Uff)ln
+|,F!%zSt6
endstream
endobj
698 0 obj <<
@@ -2017,15 +2015,22 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
722 0 obj <<
-/Length 2187
+/Length 2188
/Filter /FlateDecode
>>
stream
-xZ]6`fg2X
-w`QRQd?܄V}MZwS&FJ
-VERDըt)-~./@kHG𷢌6HM!Fæ`F3r1hȀ(JzǏ|taHn4l_#(5)6%dU/ԲVwnfé1_g1=H$>'q-1Weўu_ڠM,.faس& vE.&9;H^<vn
-f]HB,jE9ɚB=KhSRR4ޗm Su.Y+tj f)C|E EO.}(,7~O<A}OmtXb;CgUӕ-uma-9;gkՋ-¯?~MUU l
-LqTk=U0f
+xZ[6~_!`ތRE),LM&.,Ӷvdɕ"J{d'HC?'/l <ǚ,y l!k>Lf?ɫG{^<ɰ=.qp8(Q:K\=>-e?.YQ1!8#\sb\ί~Bl)Pmvx{gh-oX8o̭b`Z~* ka"PGmcaEQ=o_^YD|L]8a~074t#p5u$ݓIFQG*a2YJ򬔋dK閲ek_V:v7yNvQ!iy>Ӌg6s}o
+-udqvET+*$e&j:2&RZdpKIJ-Qlm%qU`yۮ_1mbz'.[I *NH~v*6NTdU#|tQe\BЎg>gȳ#%]b{+9` ܀ IQj
+A8,H {?=o rQ"
+gۢ|44)? QKrޖ|؎U2&|ːI,**jDk$MF.TTiT
+3YVou(2qZ@J+8ڒu񈺀 [
+o^j|qPM KuN]`A1jZ),R6-e>k4^)0?uVS
+X7VwY/AlH d=(ͣ;)筑B͓I o#y0If4sqWhWê(Ԗ
+=w8ߧjłꝁuZ>Z&?(cR[Ŏ+QHblC -}I&O-Z
+F@gJt:f&1Da]Ok IPc\(P?ZSc ͖cJPJcV"3<m`PVkm!a,U/>"5cWӳsll>J(M-0:Cti3E-/84ΐInte`FrXqٚ6}&|us<jW_ooo~VU榒VcX&D5J2y*ϠU=d sMPypeڠC@
+~LL]Tśb;f%@l WQڅ*;Xw: t>Co{v$GGbcAعx8>|$(%Cm?j
+;ZraC}DC\O Ќ4(z`,
+NQg(#Τ!-sgdљSf@Lx &pnMi(7skcƇOiLo6\ރ_vL1ԗM޼'/DP9jC}0xn^">Qo+4gaAk^v>il=#7C%ZLY?
endstream
endobj
721 0 obj <<
@@ -2147,15 +2152,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
741 0 obj <<
-/Length 535
+/Length 534
/Filter /FlateDecode
>>
stream
-xڝMs0{t,J t2N'8NiῳL \"g%o\M|hp#!e4.bv0Ƿjez
-J9ڑMk1:No'm:`..w
- e{%j%iKZ<2iQҭZtnLt5;]"lO?-}ۻxGa'`h?X~ա٨qkށ `:鷁/$4&-fx- g给1ӬjNmr7bRMW-j P7NmQUk"pqQ*\vXUT,?7.M잿
-c8zhkS#iK}/mnn=/E]MpFl>RbUX2,_6ai㋏
- (鷬UhmT[bs+iQN⻠Lkvv=,j|qxſ
+xڝKo@st
+Q[SENi-'8B|w^)jKvgv?508 L&K0 `$ːE6]oWn7C[TʒLjgp2 | o)kъAFgP&7kDKگs)`- PTd魋k#mιFH0#K4p*9yDT~U5\980(3
+J~$n ɳH3Ӽq6+]_2ڸA֮*I*jt7lLX(z -f1zjJ$..8X5Wy5TܷJk?a_\l{ʯ}>OO ѿQ7`c&+\V.3)zZ~s~å_v\Y2V nJo-*
+a
+ (HLm[Qb.E~˔rryϼhǛdu'I1
endstream
endobj
740 0 obj <<
@@ -2173,11 +2178,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
745 0 obj <<
-/Length 322
+/Length 319
/Filter /FlateDecode
>>
stream
-xڕQn0+poc܀C
+xڕQn1 +|H=XQPQns,!ЎZdˡ=N60"%z yc$kȜ1``C 5EOoMcMZzbV#9IRZ&#)lQ_&1eUy|}7E=Gz/ir/C!W%y!<"O1',d2CXſ1 [܃Ғid<lF0v4LXҒ JE$3uPϏaw;T9mNa.se\u[ POԚotI 5[G9$B"}?m@G>
endstream
endobj
744 0 obj <<
@@ -2295,13 +2300,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
764 0 obj <<
-/Length 301
+/Length 299
/Filter /FlateDecode
>>
stream
-xڕQn0+6Ǫ-**܀4"A׉Tvgv0%w}t
-,uZ v`Z8N5,ebu64Vg}s^§7}Tr!#_YK-Q!w3@*YT*).`AGS 1hمACRQ`S_f<fXS X921tDK9&u3Ŋ+/G__qG.8rF3v
-Q ߾傏Saχm 2L.l N&˾'8ష"y
+xڕQn0+6NJ 7
endstream
endobj
763 0 obj <<
@@ -2362,11 +2365,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
774 0 obj <<
-/Length 302
+/Length 300
/Filter /FlateDecode
>>
stream
-xڕQn0+ǾPQ> 8P<h*}8Azixfa SrD Vk0 A"bHJ";+nlX.f*:u<r/< ]䬥K(b YT*)<.`NGS/1hم^CRQ\SW&k]U1x:l"DpGԺbɕǗ_qyGwa;GHjeKD1~V >rޏU+]~ڭ0:κ1:۞~_~
+xڕQn0+6ǖZp
+gg J+x#/T&HG1Ք-\#u!TT>7]|X'>DDb|n64\x|zs7G9bQ.XQ ߾UylNG]?fYw6<>e|+ 8dy`
endstream
endobj
773 0 obj <<
@@ -2428,24 +2432,26 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
785 0 obj <<
-/Length 2709
+/Length 2710
/Filter /FlateDecode
>>
stream
-x[mOWlʚ;媤UU*e_X 8KͯO bArayg{{vs緡
-d 0RRzAH$zq=c:l ]<ⴌ$Kuo~"{R{է_g?xPy!OWٕd5dU ɀB8..prno0@YT2̐"3JWw]rDZx D F/S[`ؑ&<)Gl=Zen.QH&75 LP{
-Y]TYF5 v*^T!u54/-cAP_ҥkJ{"
-QH[MҚme
-l(QgcJ
-8Uܗ q\VA8T/4ŁG(Y,[
-fׇ%XlѼ͗])v_ھ$GG/8(eVr?ʣ]\'~^O<
-DRMs$\P& `ϵξLi:鳩%QNmT! ?wShg ?6ǰLUiw+W=I@!E_/;}=M?OrjsrHi#?Ɨ&Ay3uOC1a,7=qjcH@!EۃSr;Vx i5Ƀ6mFWh r [/W|BnVDUmGQ~ohb.lBȜzt{XQ՘iWD,#b( 6O9/a&^N XFOOvON-5E7no yO-'C)2m&nTMB{`W
-K8ej]:6}E9uSIv= ߡR" ΅j;z
-D"I26,|
-:/`<wwS43ެS@lc'pe
-osF,κ\DU Lso*O'/&(z%8r"p UZ{,RGS8@aZ]D?Kzxn,gz.8{J1Di0pJKײWszÆN&4B}i&=s5lձcVsU{'*hZoNMO
-wT7$n<sH?rM_ =G?ðp>tohqOAPꃝzTR5O%C9~ŐT 8hU7̓U(5?FWgPE fF*H3I=/hq업}^)+]Kl8-leCToF­Fw$ LY < ,h$H$h Fp+[+OS`p%.[%Gͳz
-L{ V?v_FE\]MQ܀ȋ?ъsZ\$&F?-t^>"@t bXfϊ qpN=2vfs7?{{CRLk!rw+ ?VL?O2CvT1޲&ULv.+{rG:䮱|tS pQ
+x[mOWlʚ;媤]l*/[V%_ bArl0t<3 {{vs緡
+d 0RRzAH$zq=S:l ]<ⴌ$Kuo~"{R{է_g?xPy!+K_j K"
+p" \\6
+ $ 2ta$Sd!ED[gj划 v;NÛ@
+B;_оLc? Y>D`<1A&D!.\
+h
+^*{{ͰQ~ezMw;}fJčK2T%yvk&`Vo,mj]jhˍǺUߖzOk}ҎȵG[F
++ bcU/4ŁG(Y,[
+ ILYj>-$~yk} #ʧ}qoݻzVdmV@ aȤD;{dxK\M˾1ݗ
+f%XjѼ͗])v_ھ$GG/8(eVn5~G!N*Nm
+>CM!bBїHa1BEݲ70$Doy\AM&9\
+y6x
+HZ$Yb hWtcD<s<^U!HO PE\e6t2H,pTO6q+XԮYf6ߵS>QACzEeuJՇoz>֬ЎAPL[7fe.
+֐{ \
+,h$H$h Fp+WPJ]J7#gfP`OK%O2*>$BǾn!]8uJml"IoGHџ.A KOa0
+!uqwz3*c~I}hBR\-n:x{HTH$ʏ+3B2rD0q|<esUُ]]#|Lto:)ƿIpP
endstream
endobj
784 0 obj <<
@@ -2500,13 +2506,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
797 0 obj <<
-/Length 1151
+/Length 1149
/Filter /FlateDecode
>>
stream
-xX]&}ѮmUUwF]mn^U$qY'3'ʹܗ@.~A`~\yo04-HL)IF `U?8X$*t#㹨ڦ ރ(
-aR0J[y_=,Is”D8x_({`4  H)g7F[!= !JB|y7N>ziI~H[=7Ѳv +p\ `]bTkA'ֆZYIu`Lkto #fqwD[vS)W5~*U+e0ܱƬ^k6A-l$ ͹$<8o0E, SGɈ0 ? !p,xˑ}|D12U| OxU
- jN;_d|Q-CktOvx~
+xX[6~Wk0*ΨV楚YE@֘LfZ/9||A`~\yo04-HL)IF `U?8X$*t#㹨ڦ >ރ(
+aR0J[y_<,Is”D8x(e{`4  H)GF[!= !JB|y7N>iI~tO[=7Ѳv +p `]bTkA'ֆZIu`Lkto #fqWD4MhVoW0'U ĨZ))5fZ d?hdqk}$1S(̒0U~Hû`IbNk^G#]ߙ@tQkqA`B3 Ul㡤4XDIx'rkTf0&!l궘Ul/ գ&νv2.뾛75u>Uyz7A- n>xh}w @hy G &qF/"&`R1}~]uBmS՟E*FX_*Qe,>͋MPg;Й [׭;uSi !)GCt:+-CU\C+w3fx
+dj1ޝ x>SY oLmNfoZ7i z37sʰә7U `E_t*&/S{[=Dw8
+h nʍԅFSPed֋.ۺE2
+jxA: V_v5&
+
endstream
endobj
796 0 obj <<
@@ -2545,12 +2554,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
804 0 obj <<
-/Length 665
+/Length 663
/Filter /FlateDecode
>>
stream
xڕMs0
-CTI,_9vfidlp!}~vyѲ+ q>ΧoB }dqfO-s= ]7ܽ3S+/TҮu;_cőL C*`yx,2(dx.Fߎ8)}|nx,ԗ\&ߪY&iWW2Y<SIeɲw*&Uu :+Q9Rg?<IIS:BJ@CZy:*S[dbK*45%{[ONu%$m3$.$A>m>9u'I[?XAORt4imzl ۚ@BC G7oCCoC=D+3^O^fhfޙ }׃3 'hكb
+CT 9vdi-0pCP
+0q?Z^j{b];WΧg!jCX\IBqu<8Hώ֙)/uj\I[Ժ+őL Cʹ,0(d{F_J0ţ BbTm'm]i)yIAF7[,5Y9E K$-nGMN) )%!dzr.;UG$aBIJ\SIZ\Zd nxēM_K<IpO s'I?X7@5h҄!`[qw4k8_ m14[ lR m}3111ΓIr89kfٛA 7>o {=z=8Q rƋ=)V^H^^H^^Ny=9M0{͠ z= y=@{= y=8z25{05{Sy?yf~l6(
+=
endstream
endobj
803 0 obj <<
@@ -2568,12 +2579,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
808 0 obj <<
-/Length 640
+/Length 638
/Filter /FlateDecode
>>
stream
xڝAs0
-CTI!rkmv&ܒ N bW zۓdoy$\yb( FJ$ސQ #A'qFcWW6yvEm^5ҧA[q UK={.2ZS-$YW#}0GlG"2br+ɭcnbD(]);M?UNm)vy&2Y7]毣aF.B >wق0ޯ$ƸqNM[Z]B bQIV"P2&n (F/M5\uotf[w4-l0Y@g7Gq¨ؔuĭýq*UE1…ݾ8]\ bxDR;nIām '-&,80zz*Y (-8? 4*itӘluP-gao<i\QYOOf=>ǃ/ .mz":a:6SkӹkEEI*0:Kkwۼq.(+R@W` /./EkPtAPҐC~ϘNmT+ /Vmj?ś[Y 6gfAD>
+CTIL;mSnILA8
+ο@0d7'dyoy",ω&>I$bTIIXPIY@BDjv6urdmcrKa[a ޗ{?*+EȪ{Q?Vd;5 B+bة[.4|ujWr~oY6]"җ?Uڴ)^Ì\DV >wق0-$ƸqN#P-@bQx4/_(RG#ÝǦCfy' ,uD:(B(NtZٰAp/3DTvr[#\j8*85{
+N"t &,80zj,I܀ ʸAgABe=z
+X֛*,Me=z
+hS<ž濬1*~/96]1aTD28XJ{.
+E&F)wW+..Y|_:ۢz<ZC#Nc:ZFNe]8od39;~}}6۽= @G
+n I=
endstream
endobj
807 0 obj <<
@@ -2591,14 +2609,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
812 0 obj <<
-/Length 857
+/Length 854
/Filter /FlateDecode
>>
stream
-xڕXMo0+|umcjV[G9VQH6,_@d#9ن71,A2 fOYpv1I!b-QJEYnC*
- ǜ>nUD,zUjgmY+d߀j,AͧX2Up{OP]iBDEV'1NcncmR+(&ߋN- &dh֍[ךzpu]2Brv2S\gEΆSĒh6nǘbb6ݽm*$쪹v\KbS;~bF~r7ѩ<b$|i1)To,EQ{zo6E w2=_x$.@ӵ>DՆ-sVJx/) 'i,:}~?z1uU.˕&ͧ<p9][
-BXAIIi|Kfha,b p m[$H$D*I*I*IHHo "#z_c8?ƍ
-nP}p݃ ,TZ!ֶVn;7)nBqsvpZ^RW;.sDhӔF4=jwY̯Neշy3{R֛'C.u˃0
+xڕXo0~_GZg>N[U+*JЂIQߓmЙQp5afw4KIʨ,'~vM$1D>nS<zUjmY+|M~O@cRRc&ݵ&e<YdE$Ilؐvڲ+S+CdqCHq;ƢZTnKZCH.ۀs4vg?F9b,X ǐ'A܎#f6m*tRq.{+̌"r7ѩ2,;cL@oYEQz/vEw2=_
+0O
endstream
endobj
811 0 obj <<
@@ -2619,14 +2635,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
817 0 obj <<
-/Length 1078
+/Length 1072
/Filter /FlateDecode
>>
stream
-xڭX](}ϯё&0`\Vj;ڏ[ęXM.N쌕O|8\=B#"ni:zw
-p*e+DIʰhD"x}lmΚ*/$֤v
-MՃ#RX1ѷ-/8U" M ݏT$qĪkf?,V*kmbXk $^"y
-6 >63aaw&$GLD
+xڭXَ6}WQ wQA[ h--%Wgח6`@ޣm, FP
+@rF 2:uUy[~
+jfDt,6e-+E&.WfS&J 12]a(Ya*1-bSVao(79~{i7UUOzA&ؙEQ` 57jRC &RQ̄e<$ze#8R}M E@d*VpU2` MIaw1g3G?2lG 4.#L<<@yPo_HF___z_YzL24Pu uJouJ_ubX3WUxo׹!p_Zh[jof] !Tnu{jUA}****iӪ8* 1XEXEXwz81$٨}&ӿ1.)šs!Kߝ7ۺr- jkG{Z[}7oG{EXV*dpE1V7^54+ i1ʦcͣ^m}PpW:`
endstream
endobj
816 0 obj <<
@@ -2647,14 +2662,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
830 0 obj <<
-/Length 1374
+/Length 1376
/Filter /FlateDecode
>>
stream
-xڽ[oHFZs}˅Vi&KjB&Vf6sI}H0bc޻mĽEB0oœBx2Hoxw> G=י<YNUGe_Lee\y;Q[gdֹ~{aĢXμ3c}N'FCT,=BQD_-•
-Ġ7nE>C
-G!~\V<e>3WS膖!W_ su6I|O"/!`K%0kՔ[Dfcg?irN/e_O3;c(tvz<]L`מFT{#롎E
-r<WWV4P'qPUazb:tgazP{~n%XcL~O]UN'E^Ƌg+?<@aŴFT/=IoQ>O1z,1pww;f۠[K$]x'^cܭ-b&oxP%]%$ra^Uf4O
+xڽYoF)!Pm̛%p5@ōCD"Uj~Dd0yIӳ3]vf8xpw9=@XL>#%D c &i!$q:`<Ba0>z*Ux] WI1 '{lq@J!E`}:*Z.3#cN(7U,BQL-µ`d@+UqWVg_j*X Q[cEXTr+Jf!"c;Jf)ێʙN׀0XKmcoRzdz'rו_1i?5Ў51n?Gx?yw{1>C~ɻt<~5<*b<ÿnC11G^N+0[P}ƑYgD|NUuʵ^l$# N#IP첑W}N*w>W6gY>ۛTWB2??:[Yikܓ|8QGgoc6y6JB"\p[Wܔ`le(FxB9=A%Q'Qeb^b(*".aW{/cp V տ@0|9&UsR [x :j?Sn,58A҈"FI݅
+Uρ%:ƽgq-ӕv >K@:nOs ?W/3O[.NdL3(qILw3
+{階CF*E`JLۖ$ CGpY$/#wyv]>sҬԐS=[i|VJ$,UEt')NK]D~;
+r~?g_RV7y_`:a{WsԜLzgygzGbYlj>ƦOglVUz2<%p~OLm}c>Mm V|ýoR?AN?K9poQ a W7]{=e?1k$])}n6 lLnsǥ=U)b m{u6/m-j^05~p
endstream
endobj
829 0 obj <<
@@ -2777,13 +2792,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
841 0 obj <<
-/Length 453
+/Length 450
/Filter /FlateDecode
>>
stream
-xڕMo0 :ڇԷcѵXa-V92ɖE/;"E_ 3Ar]ōĀUrC4Qh@QR6!&mͲPܱx*@>'zk &H4!vG5|rO TlG&V&'sZ9EM(V-\/V0t6}=]+quHHVLfh~k?~7gÀRvX1!l,Qn]TK8V)ڸc:9؏Cv}= }$A0BB!AeحPyD T|1 )Cʓ^
-v)Em
-y?λ#*n\{ 8 jbK`,ϱ>MKiDzHu_p<\~
+xڕMO0>&5o#.**-"&4ulg KO3<7
endstream
endobj
840 0 obj <<
@@ -2810,17 +2823,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
848 0 obj <<
-/Length 1057
+/Length 1055
/Filter /FlateDecode
>>
stream
-xڭWMHWM&Jf'i&h cb[ 6{w"hCQUzL"b6H)+ 6J!1(Z>`$XP5w>iܔ~c:pƳO3
-ާ10A)<A/ ɱ.F~'L)ш2Q*V.qy8n+ĵM!af}\wMQ| AМ,ko:*FGZw\J7eVԜcyט9ЗK0LzY4(eu/<Iκ 
-_ވPTβB3}*eai2sj
-I+{.?e`M |EW5@z2ŗ,MfУ@1H:F#
-7a=pJBaxw=R@jU*c\O,Ƭˉ`@J])uXqDb';SL@f Xt@#E!e C4OC&⍭mRLӴ) \"pɉ'PXa.XSI9
-LQ̀d\0b='IÒC=|jcettFTH)XW4n,L8+CwgK
-EX".[B8ќ6`}fD 1l [eYQ?+#;`v"v؉T?'NiN2 o -ow6?*vwivE\y}j l1_
+xڭWMHWM&Jfgb=AX[ 6{w"hCQUzL "b>H)+ 6J!1(Z1`$XP5w>iܕ~c:pƳO3
+ާ10A)<A ɱ.F1#>OtGwYSe8T(&]pN !V6kB"qdk)9'Xz_ u+UX 8l<1&ǹ*Xoˬ9Ջ1s/`,iP.W!'AY`=^x"\td)\>#eOpg>T1ux
+n|͛ÞzXquą$&z"oԢDU50j56Z$!X*=Y1y
+!.L
+J5nEvK]on$q99l-r+43Ep$XBxL?V~nVz_e~"^N} ɻw/Em'&U-}ji_s-"Em<eU
+ 8tE\94c/W|
endstream
endobj
847 0 obj <<
@@ -2877,15 +2889,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
860 0 obj <<
-/Length 1542
+/Length 1540
/Filter /FlateDecode
>>
stream
-xڽX[6~ĊB[gL&nx2N=B},Ĺ}
-f4 o( \N.~X(WuPN`|@Q,nƶ# 939E*Vܽ}k+;.╩Laoe>{(K荫Ȱ\
-I,=&N@˩,1
-@NFJ- WU'
-&}e)~*%ad)-v T!) D`.KE2|aFR h:<N[<4gvw6զMv7E4mxYb8';a.c?^EQRG]CG,X1cС,&ih<~yۉ¼&[q e:Lʽ-V
+xڽX[6~ĊB[gMM-[e8IlmB98ZD8z3vZ(AZJG
+DHi$nї#>Pğ봂?zrLD}qΐP 42(׷F6qDZUIʣr+]I9
+ˣϣ?F؛vi/UD(҄; `CDzhpn"ޡ:B*фa1u7Ŭbݗ/ĞH~p(w/!d}LE\fsƳZ~jNٴL.W7Ȋ]) # VcB1TLa8 grfK八0q5cofb B8 y
+cr7yGYywڨugx]trYB{Ni8FAU.VWoQY$@cc FngZGad LE(}؊ ĥx<ADV7ځ
+o|g4#3ODumP0d^C}CavrA\BB V7
endstream
endobj
859 0 obj <<
@@ -2965,18 +2977,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
883 0 obj <<
-/Length 2380
+/Length 2382
/Filter /FlateDecode
>>
stream
-x[IF 0\c`Ifb9DH%y*R-lޫzq pwOhddK0RP$I >,(]CG0]O漋+1y<=ZJHSD``Č(V.>}bD}i]B!D- 9/~^ROn`T/>b_D,ӧwI|@
-1RH+zZr|7K{eD"U
-q˟}>Ni{;vRV;Z'ўmՑd}rd4)lws[w1Z!J-aSHG]=1LiCd#vGqGpz]x^ׇ%~/lcxP"@ꂄTlr;widӫ툯ձܙ:2H1 /hח%Prŧu5kR5ID4<mO<>5bu&[L4n VaƮ::iX6
- VE])"H.hD'BCs,S(/ 6%Y쬞f}?8q(M
-͓10=>ORT2 ;kӰ@1Az*^X  ʶ}i=F@ީ4C G [8}(b4'Eo-#u)BR;u>-\&R\35\89 q}år&
-{~,S ^5;}o;!F O0EA }>6d.^2ǰ,nf Àoe+jty/Q]K7ETA
-O.'QB!Mo͐ނ;0tX }|Oa^OgXN_ [N|^h'{p{c|
-Éc}7-e|ȓ%?&ϧ"j;cZ ~ 
+x[[o~ ЇJ@4;K AMSM2Trx( Ŗ93}gh=OFx))2I=/+J׿=1' xw= UzcxJ4Ov_@`-H)Sk)߰~0bF{d+ nu>}bD}i]<B!D- 9 ~YS/`T>a_Dd[bV!6 #iy9܅IS˚DJ+Ow!*}Ma.π\mKD* c$ZG\#vW9cw`-eêmtJXIGK)GFbmO:&_+D "%vtPq'o&aH z]vem5y۞m&KAh _lSq$wWǗ_gocg䦷! 4
+]_ CU!VԌI&eY.fRwr<R?LL"F:mui9@. Œ`uguҰ:lȝϛ'mF!R ]yCX5\ЈwO4E PfY2phB, 0zsٚb$G1%Ύ2[0BMț&|wij4
+(#Mt<BK>7 4HYO狿?덄s\ m 1HҺ6hҙLW&d5l;caЌ1i] |%1=ءN! kKlJ ȝ-# )YIjW
+1"Zm XV4twAo%vA)2.d)@dr9Taq0hV#zZ/s3ѰC
+-R~?tRB8tUSk9aOyg y|j\
+/~ZOgF?S\"{lxV4 }88sxÉi-ZO+`ط5%zJ%?E/,j;c ~g 
endstream
endobj
882 0 obj <<
@@ -3155,17 +3165,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
899 0 obj <<
-/Length 2518
+/Length 2514
/Filter /FlateDecode
>>
stream
-x[MCl`oR{ v3"A&;}Y4nu[[r&_G%Kؒ^Zj*V2^#wUdI^"C:21'E/3I;0t*]OTї9wd9ׇ")QF@K) zow 4b*k2Z~FxSDm칎0鄭wM1_3B+xceoEqH^ܘ6=Sqoɫl>tt:sAot߼Ty?nRzF oxO<+MP,1mUxy}\ۭ,JEwp.DFMË0Cp8R @l=wXL,a.ElHPnP&B{ +b #?=vKE$;Vi S3GDJ3fHTuw VM9͋"v#RrLN40{,ޅN'L !c0VN-Q,/3imsq{v#7ǰxt,}$Jn~Bs~/u+m9ZuZ
-16wk+r$UϼD+GK2ЛXVL? !nH*jK١j[CyZn9,HkA׋1i
-a|B<JF(sMEQSՔazcT[.CXvX8
-I,,R؞uVXaEIDi&I;8AUyrŔӬ +`%@7Hx-l
-挓!nOC`e
-;Lk/m)l_768;NFt4f*kav91NF2GN_%er
-2ɟ+KVŮk.}w0pu3ٻ3]9Zʉv Z~.!*[[i%k6Xy˛#Pp9
+x[Kϯ C$`Es3b"ezSnD+>2/# ٬j
+42R%Pi)e($xx~p$T͇-Û0$JܕX-ś,Ϳ8 dÏ @K)2{\Ui4p˯8x{?1CVX|;6%A[#%)˷Dl>^<zwyV'?4N/QYR
+w59TQ|ڂnTz D! pG1i\ęWzIzTPHo~:whg@RFTX'ڏDUˋ`HQ'
+'Hꖪ5bS#2x,8GLT ǘDT0 l)Q_(LF5BFuCCR\6n$n#Hv4pHH}P[ImАJZWar@ء5Z݇*D4,gPݡ2.5C2.1b`ݯ"S10 #D'ko'?&AU<T; y65/`AqZo^ܝ 0ٲ/C,4v0T"!PՒ<1n-$P,;8
+A9k}4}O
+qҿ1\ DNSu0O紈ޑ%iY[Y
endstream
endobj
898 0 obj <<
@@ -3219,18 +3228,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
917 0 obj <<
-/Length 2000
+/Length 1998
/Filter /FlateDecode
>>
stream
-xZKs6WHUޏSIMjSɎuIhXH/EdvDJŲGwF Q4yLhՏ˫9X!1X8,Y)ߗ?'BI"uf576iݦ+'_my+si2%$\}&+9D8|37T(:W4I Wďh5&a8n D/4]"[ܦSinNJ(1iTBkA<sˈ߿z
-/? TN(J+?V+jBbD
-`` 2I,9buIޟ>p$VS\Ym\tZTH8[k✚8Cs^% ̀%(D pBP*F>:N(/T;;6z<
-!*n Xx\q;
-8ϢK՞G~Ϫ) fQ
-+>h^&[ެ!1ZzrgӇsPEա2릾 SIhUߋKOQݶe
-O<t\3VAtp#t+|,cX bcU@xAz;zbePqew}B
-e]on=.׻и-ONY$A~o4O\I*
+xZrF+p,-ǔSI9u]*$T@@tB$L,Y{^!Hۄ&?py⥕!V)\$T-'%]ʳŇ˟!31\rSsMzUy_ N>3si¶2!gI:{&K9DX|t3WI&ꨓg`'%\b?ՌqbC#48g+%MY0jg-B%49d{/7M"cL eh0X-ݹ*cuU5aAno4
+&Wu{`i^_nW͂tڗKSI(4ī~&Zbc!
+S*pf3b s
+FPƍowAZ:@K\ Ŧ8#<; x
+-? TNR(J="~6C6'JD 5"pnhUcYN YZ3=V,td^LpY˙ Lޘ]dW
+p2=ء.; 9w=UӔ=:zœQeʆUtSΥ`x/3p5&l›jP<%uNcqIc%X7DM{R||;C]`wrGQRj} ?Nsh >rCm ZX[e{c*
++ڗhV*_g-ѻܚkk-]`oLmΣ~
+: !eѯH
+?[*xSqo|W4\I*
endstream
endobj
916 0 obj <<
@@ -3365,14 +3375,13 @@ endobj
/Filter /FlateDecode
>>
stream
-xڽXKF+t*3h|L9qٕr 1˪"FX8ίO sAbnl_rd.SRfJS$IXeٜ|oM
-݌inju9CB1ߣ­N~YLL,9)' #쫗d\2|
-Ȓ 001< ׺&Ms:>s\mO;T"pP%@!X`ٜQ#Cٜ`s
-aK $qB12"Z118S I&oK=re}2GJu,zĮHAYgV) naS}v 0: 
-<t2E9i18IR!NQ(A<
-Mel@&ABp1=v7ogOؘδ3Bq]:OG+vWrII ~*7^8,zsy]LLB4,9"^&P&}}[Z c!a䁿btPPŐ>Y|
-qY:I9R&/{g}k>t8F/c9_ٕqQv齢쪿fsXR`1DUH
-ʩ ڸg!^nm$YTt-Epe=}to`}U['U֑;ҚvoAmm4f?Gsa08a >]hA'[ȚH6giq1mYzL68q6CX}bYXƔfybv8dUIH#I$In:2?9D aCagP\a6)26<|pk_yθ"\7I<xr()!)i;GK$Ѳ'~Ya1kn'BQ_Lг0$^Gvr<ýڍm}xsb}3dd⚑+7[dNaWMdz>wNq_na4d}gTĤI(~,b)rX$ď`CDa,C`Oj#E{`@~C\\1=XԳz*Ou<p,ܘ맍E4N ]j8))N;5kK%4 k_JcN e@(7}3Zu mS^k|y6}އfҸ1LX"vvݙ#cT,G+`,hy?jOV/Ook/`]8
+xڽXK6 Wh,s$Nķ$#\2-YqN/LAGg g&.&"ˑeLaK)M$b}r$gs5*ܿ3M)ϋ7 @
+:m12!3W(<+7qgo2γ^rqʸSVg&N1d.G Kp|˜c.\ʚpG
+7mWM7lC%
+]^8b:D <@ZL/ιB~'#)*ePَ#=d*D *GpK QW*s[]ͲGjY ~ ub f)ш1շkgj
+]EPQ&aT#CbRe?լaȑc7JO5[2b@P
+y's'pS*(OT*3Ə1NʑԖ4!}yp{Z;Ns9p4zq]ˡʮ?KeW=w}9$BG6lyvYěI um(5;#b-
+4 غ`{ o5`T) ٮژ؆&)vrKclXhZqEO_sƓƇG<R۶ل캎\14mUuDa;;#{cx7R9HP!CЯ BqzI1MA5A@Xa8ZGF VU]uͮ^jXn#jhN#o&Zt fq{dsVtu`ض)dsƹ6P_6h#m3.=G6E`Li)aÌM&OX$TI8m9DD;{\Xg !l( k6,^b&EƆnk2RV_v&/u߿Tߛ4v=5%6'3 yX}h$Z:1,fm D(] 6 zqqdH܎ ]]CwV۱ϕߔxڟMr撙L6L\2q}̩"좉VO'k15ƁJTЖQ3 7E4E.%c9cz<EXOcw(I-t| ȯ3qP ƢGzV6=i|@i1~EsɰKMX#1它>i b?\f |v&|uK)y{ CpF+wbrc+cM/6ne[_xYNw>'E3'* 8X Jz6&soqo]6u
endstream
endobj
929 0 obj <<
@@ -3408,18 +3417,17 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1012 0 obj <<
-/Length 1804
+/Length 1802
/Filter /FlateDecode
>>
stream
-x[[F~HfDK$jԨmΑY>صQYn1Mϓ/ |3
-xq'`ky(1)> ?FBЃz!)Hh/" +1f jP.0=ȶkwM/[kڄmf'Un{F9D")VHND)O0 ąIH蝤tE!H
-.FpKB.ׅKB
-Ճ=RmfC?Fa<g1<&KA@z-H{ympyr?Tj𼽱]l?m-"7{ j^,˹E
-Cw~& rF̚Q0X'ԥ
-kgx6J@|DQ"|Dj?HDj0iDN)ZձWI֙JDz^Sv4=i;x5{w"~贎aHJ헃߲
-i o~v˹Pgu^4yL Za
- *KGҝt[v.A Sm8غMQE(=ՇDNngZKp7D6E&4n*Q}=,¹l'py(* *#S=ĢXd+'VkX{!TjQno!Vw{)͵E?Ֆ>kR[jNԖ펞jmvRܒ˩Ymש-Y[sXE6@mrYcJpe^+^8*S
+x[[F~HfDK՜QɑpNdصQYn1Mϓ/ |3
+#-<$qn}nLG08/O;JXϓUų8\G#bZ#M3_cLJFȕC9λѯ#ۉȭ&X9"o$s s\>ζaH ϐc' <v& ~1!\5KަW"o#Hr&#Lr{JE\n"K0c"'mza}7qbѿNֈPgBDnƧf
+`%blmef4|l_37Nx$KV [vž% M@9lF|e<-L6Fqh[\w=r)iOGNfQ@~g8|0rLw;zYULZˁDI9Iu
+Χ.vIMTckQƠ(ViUx`7M$cf?:`Gznb[?b~-qij2 kC0$OdpCGA<@@<q8S ÂY}<CxX pFC#!{YAD@SMu$WjɌ f{˘FUQDC_EKJ\OXad[N ڵB5mˆr 3Rҽ "W+I$]' ߔ` B^$Y$NR"^o$Bp%!]%!]A)w30Os |tN|p9Z*p GJjgw^rx. e5
+HC/ ܢx!KH ;t?I9#fM~(]m
+O)R
+^e ÀbQ,eRMbzcm+5,ǽn*(V7+TڢjKE~-}\'jKvGO6^hx)nI -₀9][",Vb{zo//JDYRUW?ge700_ ,F 6c{*8~ћ_J!*p"ڶ+v"Y陷Imȟ‡87vw%]Ez@rgx
endstream
endobj
1011 0 obj <<
@@ -3975,17 +3983,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1065 0 obj <<
-/Length 2535
+/Length 2534
/Filter /FlateDecode
>>
stream
-xڵZY~_PU+7I?:{$]x]Cb$J,L~}@Qhf`  >p{D1I}QkD 'y9$Z,y/4 Wir@JAT$Gͻۛ?o 1 ?h؏%"on.
-IKl| Epeo3H%z ^3BG [,4|kؚcxCotp;>߽z$,$ZŞ޷efczmX/][3eR 0= 2!]Rj7@};'Dk}fϘ]\1{k&KG$J%c$QϬA[3SDԑ`ZBuҺ1UQB:7,6k\ʹ"1i^7)A7
-r,ߕ H;sHqP.dBZ[GדcWƳ)aRxCKe_>ՙ fs?Ltq>f> a wC-b}>3:#WHnIIDr|;ztjPZrl ! O z]m}2sҍ ^+:襁R[V;s:ݶ :y@s c>]
-j<#_Op_N"*ٵɛWIޞ #񊼍g8==&е$kR:gOqD. ?#ˑS.+"s9U>mYP>w:~֦͢Wj+:oF"E(wIW2\a;CͩSЖ "?>1(@K]`yH;J:Vd3"R)c”`YBi'<f٬n`?w1Y5䰬Şb`M}O^^C0\IB( q:mu-\Zϴ ?n:ZJSRSDZ[)1oN||_C&|iͱArFS{=3 ř-:nQ`?
-̭T%%gILlbr,tQy0bd ?LTpp1ϺjY혥C-ʡjP΍c|GDk~=#ŀŗE$r&/T.@6PLxMWlF?Y>n[dwg{5#
-
-*n?ֿM0v LLj
+xڵZK6 b/TĔ7Go̮zÌu1 po
+{B )3C8X8xwbdCaKD"I,r-4{Iy^qc9C"b@Πzq@zqbʃt{dcSqhGn.7ĊͿo#*L<G(J,c& h ouwM^V܎whKʑwѵmٵ{M{[[ f4>]l@|H(:%mOd yݹPsG2
+Iɻyڵ˙2 D!!+8,YHKBҍAb@`RfJumUacNa MzO&Rd $}K+U[QU;;b0 P )i&C^tn}Q FGvT[?3:ꖡn}ye3kvb@ZJ?nr'/(ZPj 2V>|Ř.ň>n'sT";K糊p$;HyiDQY6(Z$orރ_zü~_8DRuu3>9S&wh_œke&lZ'-loxkkFgnd6OKyŻqYd׏7;fݥ+/r[e88qݏ^`~̼/y_JH/ P&E1:әqu04#ng|(70k*f)kҶtuaIi/CCl׉&r"eG8bUU8@Ùʹvk(a=H' /:%^%Y^&C
+R_
+/&zECAxqϗUښj-s\֋i_j֥Q E/}TF%"+OK?1UՆ13{'aȗ:"ǁ
+2vF`y(x/Qi*tvVC$bNrorzLTG7Ebuɕ
+.d8{#Wqk@RGݔEZI-8lG&8G:xRTO>@
+!P υ-97>O P=n1쐱W\)f[]*\ b:u
+w{gVm!~v^w bz56A DǺ`eDM#P3O^w9OwNac7$6<ěWaz]߷$ߴ<[.]V6{-c`^,]|B_vS_#1adZ0?--()ۣ~xY[ً˧5
endstream
endobj
1064 0 obj <<
@@ -4109,25 +4119,23 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1075 0 obj <<
-/Length 2438
+/Length 2433
/Filter /FlateDecode
>>
stream
-x[r6}WQ/yJ26{fR.E۬IDe۸CJ[ŒHOph8zpo7_oDEHK)C$&zzq՟qoҫoe\fEn7mj4QrWmF{%!-6 ne \9]^{URlRm/4)ӍW^غDȀa*a)RTLY%?r,C DIַ }<手Cv^l~|:kǼ̶kJ cɱ>7qVMЗ&DdRr`޷i,`cǧCr8vDC@a&X5 ~0
-,sG
-1DAokWE9m
-r4 d
--N2UwނT7R*>X8 J5BRYSD!JjP Z<(U R-땪«BRZ1yc
-V}2Å
- .TrRH }B0惄jJÄjJׄj TMTWNIRRFJ%) SAo䂺-\R*eMAKTEPvzU ዀRIt :"Vd$ɨ4tJ:jFX"$6JѣS_4Tw=V74͡;_:Kz8$kW|ݥ] v۳0Y8 L-N.02TN
-cw0)RF7nEc6ӛh/4D B'` :yk'![(K<4WCފp1?L2Rѻ\DZ].ha沋9Ey65 mrQ}p5z7vn@{\wF{qƀ@<E/I-;c*X ٚMdvxgιp ,O k9Igm!7UN˜N }WA{VC
-tN
-g$0Yh4:yp({8aLwUI"Й>g{Pz'WۧΔ9o`By'=H ,X(&՚ӀoW[!Uj-o^>gs}>x
-b
-=ͤY=ɪ>m/GpN</4*CCz/EvWצgǬW=
-~XoƖql"<.'w`F[ !i}zQBz8We`ʝ8w_d?#U6; ߦZ>u;fE]]ÚbS)0BG[謨Kp*ꊋEPAnU JEd/ag ~ 06;K%łRPWD^/3|W$,H=䔆;z: -FȠzVB+_3 ˒p/(}~4Lx*L
-=(x%ZҔ[00=N-bP
-G5@,QY?ۗǰ\}y+Kc3-) QƼY *q¥!y4OtlwZЪm$"N[2~BإO?Ίi{YlFj-`{/U2l }ܻUMxmӽmފ|}ri7&
+x[K4WT1BG
+v
+ ]jxf\!qX_O˒v8~1@qI[-}j8x
+pv7F)Yp(2IܭwKW}0' W>[7**8<Rx8 L<w` Ͼ 0bFۀ vEOI.:=hD2ֱ<xmÊ{ZU?C$ 
+&"LhIn\ӆ
+ h0K9<F9Z0@{NFu
+BMٯw]ϱWbxcO}}OC/3.{CЧ.<+\dpB9T4L!I4ڃ}o
+1DC+ʗY>m_0 FdpKj$P0#%BRԉD=@\YPFD&:9<Zs Pf nDn:۠:"e5ѓ5Lܷ35F`q&vyC7oTR"%T
+E2YLB5EӦM4g0m(uC7=QWߍPT
++ujTS5P{Ts~%T T~"*͐|P tNTp -gFU*ƱgqoHn(XSLa0g:ʊ"a9P=S5P{1WjXT T`rװ+W듞?NTĨW"*џ 䤘M!
+Da{ %QQ %Q R`2jRJL%1LSƁo脺%\b*eEAOTYP.]*Sg7@xJYP-Q&ͧ3QiJV=xJ)ՈJi1IlDŕ8uDO}PS]
+V#=#1Bm`>={ :]Y(.ɟe63^n}Lg6 4qPhcl7f"˪ހ qؗ۾N<͓me!}۾(l^2Z0융ڣুfh={Q=nz-|V*
+hu# !j){?>@2QEŹ%qmOJlwh&g'-†=uzF]]ϨÚl)0BKhͨK(D1LeӪꕌ:8\xrF}Lf6MȢJ uw'PgzB]!.ID$z Cɩ.︖W0!Z ˧ 9<pwԮ8bN. lKNyhO` Ӱ)
endstream
endobj
1074 0 obj <<
@@ -4219,17 +4227,25 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1086 0 obj <<
-/Length 2767
+/Length 2765
/Filter /FlateDecode
>>
stream
-x\KoW̑~TlE8@c0E*S=3b=_LwW]U"3OZbLSbʴDz}fKz{? @,}z_1f&l 1ǫlQ"ɾ+3H MW K {3#+FD3_0J?szu)c \l' "j0.<]DjD2)© O\"5> oÈ^oׇS+,S+1ZB&\Ա>c*׫|{9u6%u0ZRQ.b:VBmvwoPHE*Kpm62E<wA_?Wq P:Qo1r `պ9|usKF0돛mYTa N`MX.ۚ۸-9Vo Q"Ŧ-̡ a-?+eؠ$V=ljq%Nө)I1z81|hr*(`iwYu|[
-^e psN<ܸ~#g4Qh_r̗׭wf,fwQS}._3-93R ùEP ^S`qxC4&H L!nBG
-EGRALs&r
-px<Hk>(h < $
-NuJEA!H~gR&b!΃ʿCY
-ehtnj8q2~7tSk֝_/?pͮ0?W1~<WTWdPL;gr+9o $!2j2\S$\/h9fUL6GH:eQ/sG՚qs繠u``FBȇ^A=4p/Hpj'4>pR SGC`lbslq|펜^zHi3-,gIR ri;F)y>]Wce~F+iSֵ
-fT$,V\;-$]y{]`RpFF 9`k`<)ѫ"QGq (QOpu%Ua[0};Fbv g)b-a%0,L dYLeZɩu#VuGYin!a$IcX?}Hiآ {љFALAM;Rh>&k4DuQ}.)j,PQ}][kۥ9vS$! !3zù4 7C)8RRI9ek&k?xsʻ{&c?wsc7 RݜM$PiPՆnƉ9=MV37gVF_m&U'nROiFnNe7o#{p č#nqGn? ÷GO}7'T]_J"H9ޣ"\{US0ywE0g_ 8"(UE00w&P6qG+ * [UюMgkڊ`Vв+) +) {VAWs?"Ȋ3HS'W"Պ SUS@AMb=M|5WB?'OUMl(#뇣M|*jԁ3%TC*eH!|RS:B;M B2 @l{6=%/8~'ˮpbA=7
+x\Yo~ׯG0{>1pl"A[@@#0E*<U~}gzFlri 9z꯫J}BW僅HMQ*іŒeu"θ6Mlw}yV׿'R
+Z nݷW/iJexMJ5ɏlc"IGl|R=/:Bv=b3F)gdZ^ǘ%d2WMal) .5/
+55Zb0p
+!j4?,zP[LmQTWաi' ru϶2n~M,Cp`D]F1+Z;(RcX1pi-"XNs7 RjYJ'J= ¸C@b~1et.oOi{`DsNVT" aٚm#XS% k*nm-9V5o Q"Ʀ沣3a-?f /?1ݨM-si@c6tjrReuP ".Ku|K7߫4#FQ2Rz7˓%kU5C77ԺÍK72`̘&
+->|qjaW4i{wȲHOOS ùEP ^)nS<e$ @ M9(܄Z+L) 02d^hf4G ?cd'젙jcMdaÎ0 GXo9;wC=vFbZN~Tisʗ(攘o1ͅ<&~ V0G:<. q(
+(9) ([*#i\#D F/B :Z@8#{)
+ /`@5ܪT"قQx˳!s&V" :Cم :CAv>h+[ ۅan$^8,X~]J6FF,DxJvJRCe8 *gu'L4%Ë;0~;r5:]%f7doЖ8V4y2;Ҭ@-L0+ 'U ^IҶW5Fǝx#$m7-풯j-erabwӑJ3U6,@F/>|7LjR$ZuטNX 
+ WD*
+ZFF~gEȹא NG[
+rll@}"g ضG#61hr%ո "[k 9e0CU>_9Vzkzg$5XOM$
+>nS}+;w#f_)m ("ݥ!/]::w"kHD@3(1C7
+Do?9U&uY2js)9?S%Si2 JAv^bf>n<7g tz.{;MAihܤO!vrmtI7{Y$NU Mga}`lhE&Pf$1Y4Q>!F <
+sh<dhqQaBMk`uZ0i*:k}\t`6#\28꩛upD
+5VQ l>lʳnm0"VLd(ڱβʴu#x :أYo!j7IǰFgӰYo6*gz. Rk
+jT
endstream
endobj
1085 0 obj <<
@@ -4322,21 +4338,24 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1091 0 obj <<
-/Length 2311
+/Length 2310
/Filter /FlateDecode
>>
stream
-x͛[o+h x-zټu"+P[Jml;)Ŵ(n %ezf83~C18zpw7>F,{FZHI7 o!b#NS;-UzLχ*/ 3滻niej4Qz"XCCͯ7ىyqVfKpc7G
-1D`7R)]>B1M}5RBd 4Fl1SPD9fEOR -:8s_gz̫<MSTo>bQU~20V& dݧʍƁefA>b A2 ڗ7nЕH ݌pt=CA
-8L^T'1㾼ucD 3SLjF\U.5Q^cTq0APiO>u+k(VPU)CHIJkH3
-*Izm  [/*&Gʎ[B6oU1̅Dq,u EdhH#!_:
-AvCMhF>C3r酛!_<Sv?ÖMybsA] ,ZRv"bH1Bc02v~QZ?UA|hB=O{8]61Kv}%xs>gGy(ȓmD`/ "6Rsxx*@tŁkXd1C-؊<
-6%|2&&nPk Pb${éC#3>9\C=J]{)=$.a-+ )"XX~n嗛Ca봇Z_!Sq a= л@=P-2Y&â0uz FF03ӺZ3n|@e2\G"&0=DuWfm
-̆46w:<o9@x?x{#+`S㧑Dk(ui5:Be: _!
-DZ;T)hKO(hP!!ti4aTz62 }uhs
-H`?uPSj6,G' 6F=Hi@0\sJ$f 幹r}'gW2}707؊\Vɰ9
-^#IQk(ui}0[w1q5CU TyOH|hš#hPP+_A8X[i*G5FS1KYaYK훷2kC[%fW8^FbdX#:MY֞6`!ft a%ajY pIMaj"~<S=L2dc\eQ.
-ro^\a"ҧOڮK-s'Fۃ`7|i:ד*́ . 7:?ϊ옴Ll|ȞRLXs[N~z0_Qe9sVKK n+c(]d6O#ۧ*oDh xWֽc= +OZ
+x͛Ks6<JU1G[Lm*n|ˤdYIGv~H "k]s$
+nt7_0N|~4"HɒDaLHnaxO qw_moқez~ΊjWeapw 8!L<Io~'{#ftpV!_7ۉ}V"fKpc7G
+1D`7R)}>Bֿ҆r>pi45Hp>AB5t
+(gҬI
+_CgLy՛OXyw ղI|YLb`XfY; "*H!C~](G3T+Eh~b=c#)3ϸ@#qV"D zAS}AӞ|*V-PS잳HJRޒmTFV7ISleh& ntMH*ܯUqw%dsˊʼ6ZCj\HdUdz
+/!o
+
+ cʄjEi\E <PwVOlw-}vt<ٶn@&fYpA#T1װb\[
+yE>CܫMjH~NOPo*䚘XuC=5[C%
+o$p ; vk(ayw1ւސ"~͡2*ps(B/d憭j}6L10TB0BeLC!a
+O+9?P3:k((ýώu0(AA2wRЖ;cPѠBB49iZme2)@@eS GLQDF-Dpx cUlar3?ZwbO積R)P!nX7, +,e2 3Q1:iWXĨI(3V.5AdokOZʡ9<=*I>
+h[yn\IU M?@Ly>"e2Z0מO5M൙jkyu ^dYpFuG Dߺ=Aht:"X1;CF/QX)l1<m+|߲cHv=.aziS
+e$LC1"9^D5`j h-ڽ5݌n$$L- "> :LM@ЏgTcƴQlL7" k,e4UANR׋+ GSI7wIeh{qO!M7\zQe>&'1+㮥f?szY'+;B{?=Xn'*ϗז
+VIA.2vۇ*oNDh Pֽc= +"O;OQ
endstream
endobj
1090 0 obj <<
@@ -4402,30 +4421,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1103 0 obj <<
-/Length 2929
+/Length 2928
/Filter /FlateDecode
>>
stream
-x\I$JL@@PKnڢe=V")rsiQT-UzF#o(^_7F8id(ZDba,sch:?o_fy/#)QF
-[`v8Ύ:e$Fakr^ne)#VUV'l!ȹ'Fl3-8=qn`H#R>R* fJPZmo 
-25w9!*@36+WE(xsEhݮ0?'_.A4UUʶ*#9'NHQҚ+sӚۭfUWHXU]
-;_P5R'Ũ37 rik´v#BP ʪ[={827oaPn%Z
-XBFu/mYfތ HIM-~Zxz|h`?gӄvs`k)L ]~NФ16>ӪYEh\sB #@H5hoYIp"нd6˽:֦^O`#N-ps'>xo
-ds9rך !I\t v): R8{y
-˚1ɷ"۷l<_/)my(jDH! hc{om @hJ y?浐xGާ<bpv
- a N99N.%8h«y3X׃yDxf4XP㖎Skr_"$$D#{{s &u8+R5K%P}Lo=nO6#UKȀF`D#.%qWӊD)\kƻz% B^$ 5ÐD# -̻&"(α*
-S-x_wu[ˡ,%L@B j  0/!WX~|!.u݅SHdg).AAd@G {IpɂK4R c\`C
-_tLc2 +^pM/*>Jރ6W4 4! C+_gɯ?h9砐p:ざFx~9w}
-D>LՁqy:IH0/IS䁵%.DŽluJ~T:#Hb/4n/͢yS__@TQ& kS0[*isGD6Dh5C BxX$ؑt`YBvPWa;$Dk|b0U?RZ7BD¸8l 25|/`r/s'X6-T7_/?sk"pG;I(5|2+3ET&
-&M/n-!cm K@H!SIjݳM z1^(IlT_ƺ<%MZe:'ZAcsjLzZ)pYAaGϽ]%1'PpiרmM\\74KO!JTw/9,V!%>IC9hCNMC3n,= *3UR|@kW
--H
-}_cp %_c %`c %O'n1%kF7?~lu.&.fmU}`DHΘmHʀݪ7ml{߮ 6YlCGͮl:ΒoN< ĀsG-ig Y,}ҹj9אr.q5$\yf"Og6Gl.j
-d
-D4&K47h]֨f$/yZ'#he;h21 撶0ߖjnknR5rȒ}zf]$|Y
-?'0 +i;=C} :2cEȝeHH;4-O}װ~`g
-ĽKޢU'8)¤JnYOMڗi+]no5-i>?a , &,C21FxYo0^
-́-8o4 nv"v ۆv2mR('y(k.}htNS?M֝Ƴ]<H ɺeMvӲZ@@v&ώٴ=FK0,L;G\'~7d+sl[q.0`S`&/]
-<%xw
+x\KFϯr
+U$`q;уqGeE>=o5RKnb0U(2Ӈ St _͉V+*NY+Qf\e徆sxrʈU [HG(rAƉ.LEOa98Tq)~3A<Zm 
+25w>!*@36+WEa/xΏ
+<z Ѻ]!9hA!a*zO?%mi\ mUFrN\-x>5WV5]v>IUWHXU]
+;_P5R'Ũ3W ram´v#BP ʪk=ۧ`0kjG-U u,O!T6r=oF vC$$&}?-a=?n4p
+ךǹ"ˀ{ɮ( C0H ."JS
+Tb ]dVPw& !I\z
+ gwh)'Giz0j`9!|J0ldU<Ug*88a>trv
+ttWEA|=쳿1Oogpf7 eGο{W44. CdopJZwEH4AR98A!)?t-ύ>A~q |qZ";hfUf<?ä>Y$y$p8S䁵%.焫luHv~T6#GD4pyU7'zѼR_'Uqsd9̖
+fsGD6Dh5C BxX$ؑt`YBvPWa;$DK|b0U?RZ7BD¸8l 25|/`r/sX6-]U7_.?Sk"pG;I(5|2 3ET&
+&M/-!cm K@H!3IjݳU r1V(IlT_ƺ%MVe:'ZAcshLzZ)pYAaGϽ/]%1'PpiרmM\_]74KO!JTw+9,V!%>IKtf!aStۦ!zf^T}]*)\ڕBK+B\Ck|}llClokl[`cLI聭R=4M}A I 6ylU_-6X3&F,2A*M`#(^knۤ "",q:ۯ:/:1 ܑ@K)iqE9Kt.rs5l/e#p "|py$$0Xyy3õ |yf>5*FIGǼkG434VچTsIwK5GP757j>j|d.J,j9.M Н)xSF &˂7f\ @%M3Y3.Mޤ@yRt3- XsX3Ř<3e d< 3d'^&Yko?ݿnZH|3[ Fw21q>naNi֏[{-q>n=~:\ǿ,}<F؀Jvh6Ua>nX
endstream
endobj
1102 0 obj <<
@@ -4498,14 +4508,18 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1110 0 obj <<
-/Length 1356
+/Length 1354
/Filter /FlateDecode
>>
stream
-xXnF}Wy
-#-e E$y9ete.a#N랾N*olJg<e6:!`5Ҕ'r Nw F乳\&\0$Hn&Lpؒ qsCO 8kJyZ!>B҆v<b6(D^? B Ҥ?|37HvBX?hUOH綶s P @i,b5p30lΌ DŘy#z$" hQWW"%T sC3yPMQ6H'Qckmʅ 6>Z# 
- Ddʼna/hBCqvwE0ek*e4D(HIO@8\0E,c 39t3BƼ|Zq{a}6O{8=ِp9} 3|I =Q&28m|b/GzY[Es`~Z~hu=
-A$PFvۃ/\`|$%.UU\+=FwJL] 1TIPdOs
+xXnF}Wy
+̨OЗ628m}b_D}*Sf"n {
+FpA>=
+jDTTqՏ*' (ź3uP%A]=u/
+<';^@FO1;^IH&u qj3]h_F l;1Dzj?׏7 ǹEy>
+Rv&X Fh8L߭{P{a胲m?GBr&z"a`I@ ßmno8砯4L ?FUǜaWDfu_]odSi
+pjb6%@1XhBwcҶlL 50 @|ֻZr
+nѽ-!w{Jz$;rWvsY#
endstream
endobj
1109 0 obj <<
@@ -4538,23 +4552,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1134 0 obj <<
-/Length 2152
+/Length 2153
/Filter /FlateDecode
>>
stream
-x[nF}WQN/y\L&`L p$MDO٤%m`_[TjF~ݏ,qZkd(ZGqY>-${nldt/9]ϸH_#)QF!ۻsKƴrww~~5D8}+G"Dcݿ-51kFh?V0?Sa\x4ڧѽDR^~h?-XsרgUpm^)C(LjyL8vpgEtdŒ-VEp-, 9sf*xZ;fvF @,I|Cb3"%sȵZI~ XpISj\Y!xqoWE\N:N'7Xv
-˛½PP @56} |]R6@§:OϚ(SItm)9$Կ6}cX
-ՇtMv4{ihEL `IܯoX|ƮlwЙbËHjFt8ѮiK pH`c 4V+bxe _Xn=Qch5S +M)(eBZ
-FISA0Njf֭Z
-cհL=
-9+J3
-7-w@ƅՁ i}Xٴˈ߰; m"D P1HIzjql']+dIs"c@)vD[Ot6arB1_{bOىbw @ai>!p;R| b
-Ek)Ġ$h,[OzJyty' LP R99ޖ@ u_Y*Z pᲺ][Są45՛ץ|$% B)1@JJw3kRNKٍ
-@S
-:0;mۂ ZY3tU[ԷZ;;vűf,tO%j6oxdC$$u,Ŕ(.^ͦ^lBͳ
-jY&9>`ٙ0,7<U~jNOT!
-4YN 3Qö{bx7EDIx1Z `
-dܤ nQ)<Fa1gH^{]\~|||*xp<> Ӝ{Yj8 |?h q%ɒ<ntg]1OGs-WN߰$I 3W$oΩl$y l;Η?/9*zF[ }?V_f_
+x[MFϯQ2q8`f-3D$jTMMQ %5_u~i藻=ީFud'EB.>~KFO>Kt-5ReX-?w kL[K,zwwm_#Jѷr.
+I4>p)
+/Q1Ncf3Ji53OQN} J$l& Rek{U̹
+>+]r0 Y=W)SLhcnXŪ%"qrΌBSpxgv8ی3@2)6#_<\Ep!p 1 UW/vU^u]įt2<({j> YF$1VVm%_11Fdpu*c8-^@ֽ 葛يT0^':y05
+#OLp 'pwPFwXbC'~J rh})2qdD`=tUJ`;s5|6qww\ + \bh>1t苿Ƕ2D *vmcY/5,,%=쨩Q}S
+mCUP,|~ ڎc Zl\)E+v<AЉɐ8_"Gix@8FHS*T]:d+e,1lƟƊbYMcQzvRt3՜1DS*ZR2WxyVJj/PM߂0߹xqM69E'"
+T]{xJI5Mߢt#.y!=od,o%A!Ӥ~4A'XwR#֟9k9h0-ts"`+)NkR-'XM$^Yb—+[OX ZTJS2t)6J{)TiauX5,'Sd΁G plD:ӈn8m&PMOtM.PqatEu`jZ{g//&>V6-27,8g~[6A%qE RҩZ+g+9+IWlJ`Ym"PJ-Q݆fXܱaמ!.2|v"|؝x7PqXpO<=NdçBZ{c)01h+ ֭޸i3v^<ItCrti
+i)QPXh
+S]xfGm[D =KRx_NZCYj6Zksǎ`8v얅U lzdS$.ٜ%V9p%ԅ۫KMHxxS85mfV7m
+"iF^4 mXg4D;y\m||gAxzSol
+؈y$<(=@OګN;O0FޖlT ƃ e?m߃%
endstream
endobj
1133 0 obj <<
@@ -4741,22 +4753,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1149 0 obj <<
-/Length 2650
+/Length 2652
/Filter /FlateDecode
>>
stream
-x[Ks6WpsT#xq7Ԧ6lƷLjh5c_iR5ȸ*"ݍk
-(tQ =g#f)ύ=x!d#P߁9#js8u <FDP L=v!0 "\V'oC's> |= >S}4QL6tA)"۾ D'BJ ,TsH
-Q֏T|1äpz'*?f؋`jE p7ȯvH d5 Ye{IDi-F&Ex[ 7(sPl"&G#Uc3W ^ۇ#&}e^M L{Lm^wx R+q|ŗ]<Gp1H@b )G1Lǚwj46N»2ۡ3 Bx+Z"J: pܧIk4ܜ5Yp\y_R=ֵM!W
-b
-Jhj}+=MPl4_Vۙ:i 6u]ψKz性O~%E ) Miԟ>mZkhXn-t&eZ\H`_z-.Fŕr8-+%{ vK 'HwK5
-Wm[L5/2lak
-h8k3t l<#<{Zm_HS+.JG9'86ed{ݿ]R%M.Ez& `AH9pWNn]fVMތmp_r_z;;hO`풌y#K4RQ ]j!dt+&xUU%*](-ږM@\n#3sm^iyvk+ejײ!dA qyi~N^\1W1Lag9ɋSʺ̳U"CQ^-!U PzJ|5i{.,'/rR}q?%LcS {Y`;E@{ruO9$/1ZZTg
-I o%0E[FKU$XpU$̽y<<eR{U hJH'u*rC\<Gp1Vګb@ȦU])}C ],}y<[˔TkԜ^byQv]9ZTYapWH*
-`ZC}A=PPZUyʠ[Bh Q`o1HX52<>E m
-<^Ko:2f_Rԟ0d>pWO_]xhC>+ILRG `doBu;&e p].m䕞Нr+zeA 1*L3IG[_ڳMס5E= c&?5p/'>X-O ^uc=wl6uPlp̞$ݸn+!k{>8;3o"д1砻Ǽ~x4~t()P4ZX`EI nFM d\offj
--(.cQiOomh~!]m
-7w.n披Gx
+x[Kϯ`|Tcb+s(Z #ɯOA)rLU.")4
+ZƤ/%Bx uR&/R
+Q6ԌN.9c,IZ 2N#C~,CQ <Ն3 dLIJn'_픑1Af:AN<m!8%ZLL: o P d#>0<EL(F.f_+vG
+W(8v </xb̑R
+tdc|]pMڧ! {kBx("E}+=]P,MV/ZcL
+t~BJKIn`DHN%i_lIѯ`d~
+?_Rp$WWJXxEl1_KennBJ5b_qU=X@j ~qn^F=:i n9)3a0cr@%+xZwrt^rWj~fj{6'2qE7@Q_ &.T1J$OEХBvNr[7MU]2bׅʢm. M6b<7'=O̪m\FPƠvzRM4Pvڭ(ťp * vh;e<[խ 2u}a Mh(JR5@
+T2WTP*V|v[DA VolM̿O`p$J[$&
+M O ܋.ESkcbsOj`fS &9{(I2ݍ~9xVcv1M.M!s{(f=f~p;
+> _3.@ѼeR[~:*=<ڪaZ{L^1ddb/ {_9{fK"$P#9P3~8Cޕy+KùP-P߉toVb
+
endstream
endobj
1148 0 obj <<
@@ -4816,20 +4827,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1157 0 obj <<
-/Length 2484
+/Length 2478
/Filter /FlateDecode
>>
stream
-x[K6 %n.6eVw cˎ%wק(QhѲ%
-؋-TUckw^ww_ӈD##%K_2Q"IUۂ#}@^XxSʷ?&3$=Lox/qBFdw.ft^$\0n_~ÞՒ 1Qk:/>nv}Q(^GE s4'`
-~MtSl9,J8->8gH\yk+Y')2dP—CY)ؕl3x3m}^12x2 e9Can":-5 fi#º+f߽*8
-rO+aW])2ؾȢ
-<5ZȭF*Yd] F F7;x m.(6CMFBja{V__k=9OyrϠG{:@A,i:~x@q=Q2K%!qayBuQ‘=&>KW͵ua^xz"T1э᢫y]EF#=tx45 OP5ȅ@q:lS6JB,yl7uV;@mCS1zB؂%u>d8|({a4dIDՓO
-w n&+{ @qm@')zsZ
--Q}=;.;jnaG9lvT9Q+
-(BcVbDv_G1
-y1 ۛ@7!&T&Mc<e]#0q/{Zo f(V^z*\;.&fB.%üY&yӖKsde|
-%DV_Qwj]6g򔇜CB&:{^y55ݿ6YQLbN01B!MyDTIeK?dEO֗ٮ a F/1TwY񟟎jq7;X/7ΑΟuOsnZdkK. &
+x[[o6~ϯУ4,b孧[Icˮ$7=J%YlؗX ?#*ۏﰽoΈH##%_"2R"IMۊ#}@^)[z)^L?D3$3L;9iʣq{?]
+F|{WF<VKplDc; -"D!xc7b$%[f%#!T] )#0KUkR"JJ%\W':qA1DZ$+J7DƁ]vA}ՃA}ݯp(aQ^ QŐzP%S'1yvo1p&Y,©[WD  ^oLp
+ژ0 \\2aG vIB
+~tSl9J8-LQTCٳlAllp.<͵ˬYH(H—cY)ؕl x3}yZk12x2 e9Ca"jӶY=w;戰
+4^ '0ȫɮ8/*2z>@h{
+#v ם
+W%*qdiQ6]nsJ/
+Ji7*iRH|lݏӺ8iJFu{9(
+ N2&tVv&+/R7jU6'y!X$C2wap}og^i.>+&09LAPH)?m~+Uw~-kY#IqwyZ_|6igFW|%XFߐcIߟNjq7Ays{f s:嘕9?s^TP;whg"O5/PW
endstream
endobj
1156 0 obj <<
@@ -4859,23 +4869,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1183 0 obj <<
-/Length 1841
+/Length 1840
/Filter /FlateDecode
>>
stream
-xZMF+tUf<%YW\qűy]+iAVN6>=H+ !Ȯx[{z{ ގ~^iddSi)=e(ěg; 8a\v:ܯ*߬c4^'/_#b6Fr/x}{aČ|`Hpc}1.No틋` !$sd1m4!X6:&ŸQ~!n٬ls0:ބa1fbW^_rYI8Hi`;JEYDS}gs]$Lٟ`7c]aaQwVO
- xB$NX.쉦=u`wdKI8iơfk _٬^1RMQ3@v ))Y4)k8\<
-l8'aψgvjyO.tH?.FX 
-
-9Z y斸7) 2
-br
-
-''
-36Pq,T]i#5WX0ɺ\ $Ӟ\ E혣0֦(Q*JQ K6Q=B#\_
-qU?Z"zHR#A͹mL#DŽ+$'i>!ajW
-Н#kIwqQ[j'ڏZeY<L4hat'8|RU1<'6LCP=YgiHfwa.cx_<Qp*v)rD4CJKIӁIW剽yuNݩS϶@1c.o-%PU뀇qC.+d_ n%':C
-K ]rJ"chS@'F@PSl ~
- ){jKw:f}MMĠ|Yg!%|@yM)_SC<9$p'FIb!PM0]!o8}#۴1v;+dnuG?J$99R}Ə.۹OE6WVyZd7DI35V
+xZKF+tUf<oImW\qln^JZPͯOhEB
+p(w#!duHELcv=AVQU4!:$Խlna
+ A! a{'
+eVO,gtlil p³IyGn6#rMB YC_@2{ĉHg$*rlʐd<xk{pqu8vNE;D{2:<Y77O4ⵂLc{$bZ)0z8V|d atxO[۳]ւ$=HMD 0݈Wr4']L
+I-AkDHD#D!2 j+x[uͽp
+x0,r;l!b1{[tsS;𑃂kMpTOz|6hD\&ɧ"񓽛dU5<0qöCRBxlq 4;+gjizY\|!CЭE]{r9:0MfdžtTqw5P}Ѓ @ꪺ=ϝT$ٟ5e&xA jIs5S90j h;w(2 Mtx)nr,FK{qh[ efvrV`{Y_DU qlzt)3g=s-MFJ
endstream
endobj
1182 0 obj <<
@@ -5082,24 +5085,30 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1200 0 obj <<
-/Length 3610
+/Length 3608
/Filter /FlateDecode
>>
stream
-xڵr_GsIi'i$)TU $W%6ɽ
-8d! jZA b-݊@ے| *J(,wݷ)ƈ*a 0%àMS~H:PfE"atN$n8b$т[S[+@cai#-& ChSk@/VP $HJȁ ,VIrJb.Ӽ1˖4'ucl^-l3Y퉐 V L(^xC$!R/\^LiJ#vR"I
-E kpcxT/HwiXI9I$<YYhE1'B
->sZ܀@ڠ5x|"༭Ls
-^-WBkS=:࣪3{:ă=KW=`hY_LTp|&  /|p+{C pGIB-sO *iػx3K ͮg})SQ<qςō:[pf8b(p :i蟫.ϺD.vۧHMN @gua vH}?
-/F8)mڴ.eT1(;d_o-9/i*R![SaLY`QMua<_1&.f9Ok;]W wSp7ouY`z;UmR
-"Dr
-~ὣV܃nGS/^h >$G=ˢŦ]4és ^j:K_&D1EOrb. Xŧ40ѥa@={<<rLSs)3[zFT@}茜qO;tc* Ť[A)egaxloB .#h_ա:XX[PPf Y/S3]-Nl@Ky,8?]~ሪ(]>1$~L<xcqo0?x6b`w"H8MNô՜3>RRmK{Z陇;/KRp3v*^zYDl4-`d'mK1eW@,Q,~{g?YB~GmC
-,Z߻n
-5y1U~ozۻxI2 Js?ԆÁe>!u>Rf vi
-?TֱXXaƵ9{~]Jsy__ 4d壔D|/0Hw2 }r}l}ʦ1B5
-AIU\!cDI(k%1׀LWfy!=%"(
-R=[G0)NM"i3òS.E28]qE!HV(~rj&F_,x{Y
- RQ7S ΩIbR^Y^&suwӅ_!0 |ȒtWɾ5 ^K κj0t0 0uqᘔ`Y֍ cՍ̓.!(S6E4
+xڵ]sݿBRuzi3$Mdnh9EUz lÝH]. kx\7cɵ$zarN4[ܭ.%Wd˻}Un_^q, pOn.w?,D-<ap/w7a0HCe$rQ>;] JD-ؙ
+~U(v'M*Eи4sM$Izޕӝ3#sͻm'6Ȍ!-b %1d]`cB ADYwN6lYM7'7WpƆkq[kPo>Je$B--i(0aVp,̗m0>UnW NJWm]ZXlfKVJp"zZX\m@}h*bM#Ap 2 iqPf]_ٮ=h}X<XpsFrɁq>jS!
+AR
+k |[oϤ{j/p>W?'Aq(1*L2%ގ|Br)-C
+;N
+Cou(QjtV(
+E kpcxTHwiXI㯩<I̞yf(*jrEr~V0)@dy`}K T' eGB9zh҇@AQתs T Z+Agx / mmfCa
+u O뀏H:
+ =CWc`Y_LTp|&  /|p+{C pGC&!Pc]M
+%}ЄfWW3̩
+/FHD޶lZֲoXrK}ѽoNQ4YSaLY`QM'}
+eꘌ4 w6 yZ=uEYo\ 7~7ź,Um?
+ὣV܃_ngc/^ >$.kޞeщP.D!p~x蓗.[Wg)2ht#~ |Q|T>?|4ͺ2te;=^U{{/C_&)9D-E=#*SpTtFRѸ__;tc*Ť[|@WDˮ;د
+F314X|XWζ`^coAu8@I- +kU<N~
+lyw
+x4KA{"be:iG)bb |m,ۋ8rÓ;: gWl6)At khuȬ[=Ŷ
+rC|,yMC/]xtU"RfF׹$6=Ç
+7~ULqʩ6CArF*ceE
+lihՎ4IDxD Q 4{A<` vc'|p+[AO\\]1R4 !FC?&$p>&$HAdZhOʝ/ܿ_= :I ?ݏb\\F$^ ujC@2_Qex)N;ش``>1A #U6<jთnNjBu,V88qcĞߗ\^/ Y$ /F+p<_y(?y mXy!A$*zi"ԤuhT<kP&3RC#TX_o2&
+(۴a9 -
endstream
endobj
1199 0 obj <<
@@ -5156,24 +5165,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1207 0 obj <<
-/Length 1856
+/Length 1851
/Filter /FlateDecode
>>
stream
-xZnF}WQ/y)Z 4h- Ebl2JT\;{!EKY$Ť3=3Mד_&_hddDaLHj|2=|&a#Nsݬt6JO_n4/EɯW'TZ#My|<{`ČNȻ 6ɇɟ
-{k/{U}iVI̽bwέc篸&qΓ9\1e~&ˋt_=O46b(2vFtqx:H[z< ~:cx)ݦU|jQ,3yI*L?aL1.
-]gy,7juwaAKA1; đA 1@OO7٪?
-8 ,27+s\#"MjI0A<m@D`Ҝ4]ئ7oOX`QNa đ S\aI ҍ#]L9ADPd9ҳ0DTYG&a ngQ-Q6"vG8r#4 q/iBva
-,luvՁ:gy
- AFkˮj
-ͺ$Y"C|g)[lw .BG<~+FD;] 8`"aH4S0گ}}k*^_wȪL*p]^XJ+Pj ŚҴP2\Mu
-jtmz))FL%b
-hð=$ gn69_ݗ4oM-S}n3Xi@sB,t^t>l(M+<{oVk<dK;ߢBP2nӏk01~3! zeaP
-6t}: -<U)aC^&)j&T5Bj,Sj%r ˔ZI4-KuI)Vd,)E(AG6-jrMz"ii)vy"dg**҅<gL"i3=@l+'|״j**&vpi R, T
-$ CrQM qS
-Kbg {Tbl7ml
-#Ў "26(SYTa GaxHIseHͮ3
-g?w۱&<yѩ2(@%@h ĉ͞ki//` + UXhe8Nt n׻齿!- n~DqoU0YQV" {e Zaʏx 5
+xZێ6}WbK^i- Vv֖MËdɢ/+5<3ΐ]דn&_hddDaLHf2=x&a#Ns]lN.4/Eͭ8!HS,7qgoɣ$\0$N1!ꊨ'X—i(ɑ.-|:{h<S?lHwE>DL/3*"LþfOw9Qx~\j@32]XG9ع44CtQ:`ɨ~W;mg-A@LB.G1
+,m`)= 6X%R*U:q F \*.ĞEޒD,lF.:q x4!0E~yĺ@3Ł<ń #5k6DnH$sAP%Z&E4^㈧OcHRb$L\\ PBvחyʤ[ڈ$XBuЬ!Ma -5dc WJIئ.n:1`̑b$T"6 +Lc!:0qn"f]tskT:Czی(Gaxl9ci,t_t>m(m/<߬q7-|: AɸE?#Я1H944l락;9'@oG<Xz~t*m*0B:H- 
+v\L tg{(SoS12tgZ#%u)f7wE 0q4~2UZTZ!)S0B:( R\GbVejx6~em
+h`;7 l:&BCu'㞼#OzSt{u`۟fpHaLxSmwh+Ejҝ5hb]s:ix2"Y]{ⳟ;\yѩ2h@%@h ̉͞ki//` +<ښ Gi @~zvYEpCR\Ս/P  (CeE
endstream
endobj
1206 0 obj <<
@@ -5209,28 +5208,25 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1217 0 obj <<
-/Length 2974
+/Length 2971
/Filter /FlateDecode
>>
stream
-xڽ\Ys7~ׯGj
-(`9cŢa !1ɏ7?Lo{kebU'ӇDSbJX2O>at<mFӱKz_^|MGӟ!8pUnݻ7o70|&` 1 ͧ?hrP­I^ω(L8a74hM Hk`T' eLWe0J)C:u
-8hiáɄS"(o.[Uwo*4SD >Z
-N
-.%9tq0N%aLWs/׮{!G
- cTx/YŽ%mcKD_9D8Ma1zD-8)QTcz(5
-p
-Ѱn++&
-,tD ?| Iɽa``V2"pJ1˰D^#
- :/+'%YxDs}#yFHVT^&ay!SbaMΉb k4@k]L*+#ѭ -^c\9{8j%8z ʤ?TXvqK:63T)AS kE0 &IFȦGUZ? NLJ1<Ο]36D2ǒb,XxX9 "%sCق
-EgNI#oVG
-ֻi>! @/x`Q
-kU=xysw *~vY ru
-P*c2vG
-:b9Hb0l Qa. 8V/>g'R˭]vE'6WgxzY p p~b&!)U;7_ǫY&npv́鎙AK괄#S\Wƾ|` ݑY;[2j\EޝָVQ ci$e 9>QTrb fbc7.q[@wP.4!\]8ؔ)X ݔ)w*zMæE[ u)W+A`+Mb<Z: Kv
-Ǧ.XˆŸk֊`Y0&P9!߶d
-v gyW>O  Xc ^bOX.@_}@n?
-w1QEmI՟n}]Q}Vv骾':
+xڽ\Ys7~ׯGj
+(`8xaX9쯁@7d<&4۫ZbC)1J%Q,O>Maz
+Ln ̷_cvk:]qs"'Rsʭ{՟W ߤ ; C d|g?'pkWs"$
+N2p ZSҽt? bU(Fh}RP\`*_CV9L9%BvZj[~~VN3E e.@־|J&__fj!|q65lOpyl4O_M;*Qq>]f@/p#.L}G)wO7V)5xf^65]O㕅Nz+Er5h&4Q`kd髗YzNpL#Vki5Y]d r_ŷ=+%(bgl 5e6/bBlrV'
+eDm:rQ\@-TWEP+:cU7H"qCdFpeځ
+$9ts50N%aLs/׮{!G
+(cXxh.Yʒ6Oӱ%X"O/rBeVGKG`0Jp=bMHS)1wFwXxB -7-jNlYz_ԠBc4Ǡ`4lBF+) Q/O'_0HQr/=c!a\k *8WB@:
+ p+wֲhz$4o+X|$,O;pJ,9Qe
+D초,$#sKX
+tQ
+<j*@sMRU\*5?u6lAq/YGO 21։>cw4 pYBtfaZr*K92vx2FURQsw.LjQ@10*꠯,$V&cR^99žorD\dcL5uưx\VW|WNM3xXckk GΌ};#EM-wteXt;6q AHr|Z#&n\je])Tf\hc Ap)S\)WSTlk Ma
+WŎyt`l+M]ֱ%N?7D.` L{s)(wC~㱩m
+Zt"&#`8/uT\:%B  6!Bx 4pviI4 gB+6a7 MaŔ3:AU ૳m0t޼BgDC\cm.M+ly>/"sӏbrd;OsnS?\2'a|#=9uUsPO
+vrӅ3MW馼U&_ܤE(+S` OX.@_}@n?
+(2?Ԗ̡GY9/Շikj7k?_?[uH'
endstream
endobj
1216 0 obj <<
@@ -5310,13 +5306,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1227 0 obj <<
-/Length 307
+/Length 303
/Filter /FlateDecode
>>
stream
-xڕQN0+0k{H@<[C۸R*q!qggv0e7948 ߁EIn,t@i$Tw=JZ۶UnuՁ]>Xw`[
-o3@2=Ҋkfa^:S@ѱA+incon+^7>mL!c(Mڥǥ&'_=t
-(u%n^"[RV͡x؜a;Ne<V0{ p|
+xڕQN0+0#VT ^=[EjRA''Nxvf rSS`Z@q
+\P䌰"f傥Mń[ OsWtjmL%vvK:V.0GJ wIS|{
endstream
endobj
1226 0 obj <<
@@ -5334,14 +5329,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1236 0 obj <<
-/Length 1026
+/Length 1035
/Filter /FlateDecode
>>
stream
-xVێ6}W,9I)-
-4hi@%zM,$~}y-ۛn³̙  ^.K\|Z|2`)`jHJR!R"$*oh <zȡ
-h7DkK$IlS4 _zb(UϜp(Ljy0K BP[\A/qj$Fh]wQ<_Gxo u$۔=gϬ:Z MIf%~F[7MG|MՋ׫>:V3N4l@;LT:7'nE#os/sT#E7=*
-8Z7Sc_2j?a,K1'ʗx.$;SlI(z{')nS;uGa<_\K,@z4OFKZQ+cLJcҜXtyp:o8AX}ۻϚ8N/˶vDp50Z"ו֙3tCلgi<xmƦH{I/BwՂhF2]x4ԟK{wz)Fo Kw6[N(
+xڽVێ6}W,9H)-
+qE4n &V\KN /Zn/³̙ w ^K 1y9q9'FeRdu )IDJ,&|)vGs4L_&@pA<IH
+ q@oQlp'+L3nz% X7xk@^u7"HBUE,bYL$->&hbf2,:mYv{F29_)rB/Ib*~Ez)xLz\/T_Fu^e2;OFAq"fMV&}Ws
+zvݖV)$,mu֍`)sFC_"_"dC"|gJmW/*ڟ9Iq ԋa8 iBor;yO
+_Gh]Qf=^e'rx u[*۔=gϬPpNbByY9ߺgzxz?<<Dtis֡9cS?JSxsb"\*<2WM[i2kQOs*ߡ0U}Kk_fS ~#rAX*Ny8PwEOҹMHB;y~Y3O26~96d{'nH11HvFDIGճ恣!sB<V˶vp5V?ZVוƙ# ucG g9?zM90*awޟV nz}$T|0՝|Kx=W&/}޷um] ev
endstream
endobj
1235 0 obj <<
@@ -5383,9 +5379,9 @@ endobj
1233 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [122.182 409.103 156.068 419.371]
+/Rect [146.104 409.103 179.989 419.371]
/Subtype /Link
-/A << /S /GoTo /D (structident_ad1e271d732662abda25b1320f66e9935) >>
+/A << /S /GoTo /D (structident_a8c2ccc106967f36d7191d59d4d5a65dc) >>
>> endobj
1237 0 obj <<
/D [1235 0 R /XYZ 70.866 789.024 null]
@@ -5428,16 +5424,18 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1246 0 obj <<
-/Length 727
+/Length 723
/Filter /FlateDecode
>>
stream
xڵKS0:C#
-)N8$2uR}ז 1dڤ')꿻?{MtEDJq4Z MQ
-aEhƱ`
-qEz 6y9Փ:+]cE?"
-ǐ`9]!yj}kY !9"G׈3l%DP I'[bɀBKejj1'ePQ+\8C}ʮm LwI!}
-3#rh{cW <I,hL`%w)MZn eί 'q i UBI<qoɴL&Lƶʼn+h{ӹ!EȻ̅ p)~m\p4O2r*(L)?+HBWr =v8, $%t5ǢC("E@y w(:m=p妚ٱ;5oѼ#,:?xR/2ωlr{HW0Nא
+)N_y(~Pǁ$!&%=Iv hލӋT"S8-&(tʰh4GXfth~߳|^'M|^6-IUekE?#
+) 4+ AsBԠβ@Br,EDG_#edm/C5H$A3̓%?ۗ(8բcO 飬(#X)W g"flku20BP#IfFnŐ <I,hL`%s)qEZn ek/N
+$nꄒxRuCk&*2Km%5VPns{M+!γOB sj%m
+0{<, #Q”c)L*V|j;Cp/[FcQv!I܋"J`y`* g(:@Ѷ~8EjSX7nh^?`u8;9'DV6ܾ$_kVN
+
+k
+c}͘[R`{{?oH
endstream
endobj
1245 0 obj <<
@@ -5837,13 +5835,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1373 0 obj <<
-/Length 1158
+/Length 1157
/Filter /FlateDecode
>>
stream
-x͚]s8+tif6T w&ͤi;3I!l`h@ncLqe,{ 
-6nFfoܤx[},-<ES.ps0xBA7fNQBw0R5K+mf<J1-OD,PG^ꞹRv NjvJ
-C%
+x͚]s8+tif* лN3n4qgw&0 ,m__ 0Ǝ?xϣ#!@p18~ `6!?!JnʷGc"]F?[jax7|~#f[GQstCSB//XeIA*\@9,& 2~A}'v4,ȑ
+PP7<LW^]mM^x;hǃyN\C|@JT}xLtY%Q+k`1cM͔ےgI=˥ZC o(WYk<j֍t0|,Z![ ݶW?M,wo[Űjݍjv372&VV*KlCo3WNy\Zp0g~g])Nrـ'ߞ:;g4X8'ƭ S6z|ʰ$ںk} h|1yňʽo)$lq;h3GJ)Kd AӲkTNds",ALb ->QVuMβ`&'Ip8/Kjy=DO
+|}D?b
endstream
endobj
1372 0 obj <<
@@ -6338,16 +6336,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1452 0 obj <<
-/Length 998
+/Length 997
/Filter /FlateDecode
>>
stream
-xڵ[6)RCmcnXv^w#
-9IЀ`:o_l`y ؆
-/?7TO4E "GQq|_TIumogeS˨7pAhoF~l6ȫXҖ fˆ%] 욥m f:{F
-6G#J vzQsEN=؁;ah>{i@5i!:0xeQB2qSV53U%KwǚѴG~gRUP|&^ٗfn#hE,:L<|GF|zhO񸢵<gLdTCז1B[S*)<*)+֧,:'49tM 5;d:ЀkauHDYW9txdUQ.W1h#҆)Nf#ٔfMEErT YLN5.ľ-6\jXleA`!4\9)4LM4p-R5Ҭ鮼օPW)
-m^#tΌ?n,!A+WBEKzd3U HgzE)*T,rڶu589^M`9?yV˺gC,] {/b$6B!vMî A\ /vȚ"MWk|vjdag.u61S*Βt1xI40NJ-/x9g;9@ΙqVS͸ݱ _1DЂ#;sNo+X{~_P=")(
-P BqDƳ-u~0u*s{>\dŰKK-h=-v\-]?
+xڵ[8~iմVniWVO |LCK ~{
+O,R=媞 S~9!z~*my?<Kd6RMiT'9,)j2zBmb_C,6cb\ChsRh4 ʨp?p-RΓ5ҬօPW)'ʼFj bҟ Ie R^<RZ#J(HE*S-JH>%^lN:;N-e8s~Av9"uVĤjx hf)M~ĞǽAE]R맰Kb %ËvԲ%I[S%13IJiI˛S詒q%RWb ]<'jbCENw񜳝ɷq s&׳}PzM f\:oh b8!Fo߭n4=wEOBP$EJA(@Ƴ-y~0u,-Y1n}I7We0xw/Pvj~p
endstream
endobj
1451 0 obj <<
@@ -8662,12 +8656,12 @@ endobj
/Limits [(section.4.2) (section.4.7)]
>> endobj
1519 0 obj <<
-/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R]
-/Limits [(section.4.8) (structident_a91db2d18476e0a527ba20e04ca2c3e74)]
+/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1240 0 R]
+/Limits [(section.4.8) (structident_a8c2ccc106967f36d7191d59d4d5a65dc)]
>> endobj
1520 0 obj <<
-/Names [(structident_ad1e271d732662abda25b1320f66e9935) 1240 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R]
-/Limits [(structident_ad1e271d732662abda25b1320f66e9935) (subsection.4.1.1)]
+/Names [(structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R]
+/Limits [(structident_a91db2d18476e0a527ba20e04ca2c3e74) (subsection.4.1.1)]
>> endobj
1521 0 obj <<
/Names [(subsection.4.10.1) 466 0 R (subsection.4.10.2) 470 0 R (subsection.4.2.1) 86 0 R (subsection.4.2.2) 90 0 R (subsection.4.2.3) 118 0 R (subsection.4.3.1) 130 0 R]
@@ -8834,8 +8828,8 @@ endobj
>> endobj
1561 0 obj <<
/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords()
-/CreationDate (D:20130912114258-05'00')
-/ModDate (D:20130912114258-05'00')
+/CreationDate (D:20131213120956-06'00')
+/ModDate (D:20131213120956-06'00')
/Trapped /False
/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6)
>> endobj
@@ -8847,567 +8841,567 @@ xref
0000000004 00000 f
0000000000 00000 f
0000000015 00000 n
-0000056114 00000 n
-0000341492 00000 n
+0000056106 00000 n
+0000341420 00000 n
0000000060 00000 n
0000000304 00000 n
-0000056295 00000 n
-0000341420 00000 n
+0000056287 00000 n
+0000341348 00000 n
0000000351 00000 n
0000000438 00000 n
-0000056417 00000 n
-0000341334 00000 n
+0000056409 00000 n
+0000341262 00000 n
0000000486 00000 n
0000000619 00000 n
-0000059563 00000 n
-0000341248 00000 n
+0000059552 00000 n
+0000341176 00000 n
0000000667 00000 n
0000000873 00000 n
-0000059685 00000 n
-0000341162 00000 n
+0000059674 00000 n
+0000341090 00000 n
0000000921 00000 n
0000001181 00000 n
-0000059807 00000 n
-0000341039 00000 n
+0000059796 00000 n
+0000340967 00000 n
0000001229 00000 n
0000001301 00000 n
-0000063785 00000 n
-0000340941 00000 n
+0000063772 00000 n
+0000340869 00000 n
0000001354 00000 n
0000001522 00000 n
-0000063907 00000 n
-0000340867 00000 n
+0000063894 00000 n
+0000340795 00000 n
0000001580 00000 n
0000001695 00000 n
-0000064029 00000 n
-0000340793 00000 n
+0000064016 00000 n
+0000340721 00000 n
0000001753 00000 n
0000001863 00000 n
-0000064150 00000 n
-0000340707 00000 n
+0000064137 00000 n
+0000340635 00000 n
0000001911 00000 n
0000002031 00000 n
-0000069273 00000 n
-0000340597 00000 n
+0000069261 00000 n
+0000340525 00000 n
0000002079 00000 n
0000002146 00000 n
-0000069394 00000 n
-0000340536 00000 n
+0000069382 00000 n
+0000340464 00000 n
0000002199 00000 n
0000002332 00000 n
-0000073594 00000 n
-0000340411 00000 n
+0000073578 00000 n
+0000340339 00000 n
0000002378 00000 n
0000002468 00000 n
-0000073654 00000 n
-0000340350 00000 n
+0000073638 00000 n
+0000340278 00000 n
0000002516 00000 n
0000002578 00000 n
-0000075353 00000 n
-0000340224 00000 n
+0000075335 00000 n
+0000340152 00000 n
0000002624 00000 n
0000002709 00000 n
-0000075413 00000 n
-0000340163 00000 n
+0000075395 00000 n
+0000340091 00000 n
0000002757 00000 n
0000002837 00000 n
-0000078386 00000 n
-0000340034 00000 n
+0000078366 00000 n
+0000339962 00000 n
0000002883 00000 n
0000003013 00000 n
-0000078507 00000 n
-0000339923 00000 n
+0000078487 00000 n
+0000339851 00000 n
0000003061 00000 n
0000003176 00000 n
-0000078567 00000 n
-0000339862 00000 n
+0000078547 00000 n
+0000339790 00000 n
0000003229 00000 n
0000003359 00000 n
-0000092863 00000 n
-0000339736 00000 n
+0000092831 00000 n
+0000339664 00000 n
0000003407 00000 n
0000003492 00000 n
-0000092923 00000 n
-0000339662 00000 n
+0000092891 00000 n
+0000339590 00000 n
0000003545 00000 n
0000003675 00000 n
-0000092983 00000 n
-0000339536 00000 n
+0000092951 00000 n
+0000339464 00000 n
0000003728 00000 n
0000003911 00000 n
-0000093104 00000 n
-0000339462 00000 n
+0000093072 00000 n
+0000339390 00000 n
0000003969 00000 n
0000004120 00000 n
-0000093225 00000 n
-0000339373 00000 n
+0000093193 00000 n
+0000339301 00000 n
0000004178 00000 n
0000004297 00000 n
-0000093346 00000 n
-0000339282 00000 n
+0000093314 00000 n
+0000339210 00000 n
0000004356 00000 n
0000004503 00000 n
-0000093468 00000 n
-0000339190 00000 n
+0000093436 00000 n
+0000339118 00000 n
0000004562 00000 n
0000004709 00000 n
-0000093590 00000 n
-0000339098 00000 n
+0000093558 00000 n
+0000339026 00000 n
0000004768 00000 n
0000004867 00000 n
-0000093711 00000 n
-0000339020 00000 n
+0000093679 00000 n
+0000338948 00000 n
0000004926 00000 n
0000005030 00000 n
-0000094598 00000 n
-0000338904 00000 n
+0000094563 00000 n
+0000338832 00000 n
0000005084 00000 n
0000005220 00000 n
-0000094720 00000 n
-0000338839 00000 n
+0000094685 00000 n
+0000338767 00000 n
0000005279 00000 n
0000005345 00000 n
-0000096691 00000 n
-0000338709 00000 n
+0000096654 00000 n
+0000338637 00000 n
0000005394 00000 n
0000005525 00000 n
-0000096813 00000 n
-0000338630 00000 n
+0000096776 00000 n
+0000338558 00000 n
0000005579 00000 n
0000005710 00000 n
-0000096874 00000 n
-0000338512 00000 n
+0000096837 00000 n
+0000338440 00000 n
0000005764 00000 n
0000005905 00000 n
-0000096996 00000 n
-0000338447 00000 n
+0000096959 00000 n
+0000338375 00000 n
0000005964 00000 n
0000006092 00000 n
-0000099964 00000 n
-0000338316 00000 n
+0000099925 00000 n
+0000338244 00000 n
0000006141 00000 n
0000006275 00000 n
-0000100086 00000 n
-0000338237 00000 n
+0000100047 00000 n
+0000338165 00000 n
0000006329 00000 n
0000006460 00000 n
-0000100147 00000 n
-0000338119 00000 n
+0000100108 00000 n
+0000338047 00000 n
0000006514 00000 n
0000006655 00000 n
-0000100269 00000 n
-0000338040 00000 n
+0000100230 00000 n
+0000337968 00000 n
0000006714 00000 n
0000006811 00000 n
-0000100452 00000 n
-0000337961 00000 n
+0000100413 00000 n
+0000337889 00000 n
0000006870 00000 n
0000006957 00000 n
-0000106674 00000 n
-0000337830 00000 n
+0000106637 00000 n
+0000337758 00000 n
0000007006 00000 n
0000007143 00000 n
-0000106856 00000 n
-0000337751 00000 n
+0000106819 00000 n
+0000337679 00000 n
0000007197 00000 n
0000007328 00000 n
-0000106917 00000 n
-0000337619 00000 n
+0000106880 00000 n
+0000337547 00000 n
0000007382 00000 n
0000007518 00000 n
-0000107039 00000 n
-0000337554 00000 n
+0000107002 00000 n
+0000337482 00000 n
0000007577 00000 n
0000007658 00000 n
-0000107161 00000 n
-0000337436 00000 n
+0000107124 00000 n
+0000337364 00000 n
0000007712 00000 n
0000007853 00000 n
-0000107281 00000 n
-0000337357 00000 n
+0000107244 00000 n
+0000337285 00000 n
0000007912 00000 n
0000008105 00000 n
-0000107462 00000 n
-0000337264 00000 n
+0000107425 00000 n
+0000337192 00000 n
0000008164 00000 n
0000008284 00000 n
-0000110578 00000 n
-0000337171 00000 n
+0000110537 00000 n
+0000337099 00000 n
0000008343 00000 n
0000008468 00000 n
-0000110761 00000 n
-0000337078 00000 n
+0000110720 00000 n
+0000337006 00000 n
0000008527 00000 n
0000008675 00000 n
-0000110944 00000 n
-0000336985 00000 n
+0000110903 00000 n
+0000336913 00000 n
0000008734 00000 n
0000008892 00000 n
-0000111127 00000 n
-0000336906 00000 n
+0000111086 00000 n
+0000336834 00000 n
0000008951 00000 n
0000009121 00000 n
-0000115787 00000 n
-0000336775 00000 n
+0000115744 00000 n
+0000336703 00000 n
0000009170 00000 n
0000009291 00000 n
-0000115909 00000 n
-0000336696 00000 n
+0000115866 00000 n
+0000336624 00000 n
0000009345 00000 n
0000009476 00000 n
-0000115970 00000 n
-0000336578 00000 n
+0000115927 00000 n
+0000336506 00000 n
0000009530 00000 n
0000009671 00000 n
-0000116092 00000 n
-0000336499 00000 n
+0000116049 00000 n
+0000336427 00000 n
0000009730 00000 n
0000009893 00000 n
-0000116274 00000 n
-0000336406 00000 n
+0000116231 00000 n
+0000336334 00000 n
0000009952 00000 n
0000010110 00000 n
-0000116455 00000 n
-0000336313 00000 n
+0000116412 00000 n
+0000336241 00000 n
0000010169 00000 n
0000010337 00000 n
-0000118576 00000 n
-0000336220 00000 n
+0000118533 00000 n
+0000336148 00000 n
0000010396 00000 n
0000010559 00000 n
-0000118759 00000 n
-0000336141 00000 n
+0000118716 00000 n
+0000336069 00000 n
0000010618 00000 n
0000010748 00000 n
-0000137235 00000 n
-0000336010 00000 n
+0000137190 00000 n
+0000335938 00000 n
0000010797 00000 n
0000010888 00000 n
-0000140969 00000 n
-0000335931 00000 n
+0000140923 00000 n
+0000335859 00000 n
0000010942 00000 n
0000011073 00000 n
-0000141031 00000 n
-0000335799 00000 n
+0000140985 00000 n
+0000335727 00000 n
0000011127 00000 n
0000011311 00000 n
-0000141156 00000 n
-0000335734 00000 n
+0000141110 00000 n
+0000335662 00000 n
0000011370 00000 n
0000011451 00000 n
-0000142478 00000 n
-0000335615 00000 n
+0000142432 00000 n
+0000335543 00000 n
0000011505 00000 n
0000011646 00000 n
-0000142602 00000 n
-0000335536 00000 n
+0000142556 00000 n
+0000335464 00000 n
0000011705 00000 n
0000011817 00000 n
-0000146501 00000 n
-0000335443 00000 n
+0000146450 00000 n
+0000335371 00000 n
0000011876 00000 n
0000012029 00000 n
-0000146689 00000 n
-0000335350 00000 n
+0000146638 00000 n
+0000335278 00000 n
0000012088 00000 n
0000012246 00000 n
-0000146814 00000 n
-0000335257 00000 n
+0000146763 00000 n
+0000335185 00000 n
0000012305 00000 n
0000012458 00000 n
-0000146939 00000 n
-0000335164 00000 n
+0000146888 00000 n
+0000335092 00000 n
0000012517 00000 n
0000012675 00000 n
-0000147063 00000 n
-0000335071 00000 n
+0000147012 00000 n
+0000334999 00000 n
0000012734 00000 n
0000012887 00000 n
-0000147251 00000 n
-0000334978 00000 n
+0000147200 00000 n
+0000334906 00000 n
0000012946 00000 n
0000013104 00000 n
-0000151608 00000 n
-0000334885 00000 n
+0000151555 00000 n
+0000334813 00000 n
0000013163 00000 n
0000013316 00000 n
-0000151733 00000 n
-0000334792 00000 n
+0000151680 00000 n
+0000334720 00000 n
0000013375 00000 n
0000013533 00000 n
-0000151857 00000 n
-0000334699 00000 n
+0000151804 00000 n
+0000334627 00000 n
0000013593 00000 n
0000013746 00000 n
-0000152045 00000 n
-0000334606 00000 n
+0000151992 00000 n
+0000334534 00000 n
0000013806 00000 n
0000013964 00000 n
-0000152170 00000 n
-0000334513 00000 n
+0000152117 00000 n
+0000334441 00000 n
0000014024 00000 n
0000014177 00000 n
-0000152294 00000 n
-0000334420 00000 n
+0000152241 00000 n
+0000334348 00000 n
0000014237 00000 n
0000014395 00000 n
-0000155137 00000 n
-0000334327 00000 n
+0000155083 00000 n
+0000334255 00000 n
0000014455 00000 n
0000014590 00000 n
-0000155324 00000 n
-0000334234 00000 n
+0000155270 00000 n
+0000334162 00000 n
0000014650 00000 n
0000014775 00000 n
-0000155512 00000 n
-0000334141 00000 n
+0000155458 00000 n
+0000334069 00000 n
0000014835 00000 n
0000014965 00000 n
-0000155700 00000 n
-0000334048 00000 n
+0000155646 00000 n
+0000333976 00000 n
0000015025 00000 n
0000015150 00000 n
-0000155888 00000 n
-0000333955 00000 n
+0000155834 00000 n
+0000333883 00000 n
0000015210 00000 n
0000015363 00000 n
-0000156075 00000 n
-0000333862 00000 n
+0000156021 00000 n
+0000333790 00000 n
0000015423 00000 n
0000015589 00000 n
-0000160247 00000 n
-0000333769 00000 n
+0000160192 00000 n
+0000333697 00000 n
0000015649 00000 n
0000015820 00000 n
-0000160372 00000 n
-0000333676 00000 n
+0000160317 00000 n
+0000333604 00000 n
0000015880 00000 n
0000016046 00000 n
-0000160496 00000 n
-0000333583 00000 n
+0000160441 00000 n
+0000333511 00000 n
0000016106 00000 n
0000016277 00000 n
-0000160621 00000 n
-0000333490 00000 n
+0000160566 00000 n
+0000333418 00000 n
0000016337 00000 n
0000016439 00000 n
-0000162587 00000 n
-0000333397 00000 n
+0000162530 00000 n
+0000333325 00000 n
0000016499 00000 n
0000016606 00000 n
-0000162774 00000 n
-0000333318 00000 n
+0000162717 00000 n
+0000333246 00000 n
0000016666 00000 n
0000016768 00000 n
-0000169289 00000 n
-0000333187 00000 n
+0000169233 00000 n
+0000333115 00000 n
0000016817 00000 n
0000016920 00000 n
-0000169414 00000 n
-0000333108 00000 n
+0000169358 00000 n
+0000333036 00000 n
0000016974 00000 n
0000017105 00000 n
-0000169476 00000 n
-0000332990 00000 n
+0000169420 00000 n
+0000332918 00000 n
0000017159 00000 n
0000017300 00000 n
-0000169601 00000 n
-0000332911 00000 n
+0000169545 00000 n
+0000332839 00000 n
0000017359 00000 n
0000017466 00000 n
-0000169788 00000 n
-0000332818 00000 n
+0000169732 00000 n
+0000332746 00000 n
0000017525 00000 n
0000017670 00000 n
-0000169974 00000 n
-0000332725 00000 n
+0000169918 00000 n
+0000332653 00000 n
0000017729 00000 n
0000017912 00000 n
-0000173219 00000 n
-0000332632 00000 n
+0000173165 00000 n
+0000332560 00000 n
0000017971 00000 n
0000018139 00000 n
-0000173407 00000 n
-0000332539 00000 n
+0000173353 00000 n
+0000332467 00000 n
0000018198 00000 n
0000018323 00000 n
-0000173594 00000 n
-0000332446 00000 n
+0000173540 00000 n
+0000332374 00000 n
0000018382 00000 n
0000018545 00000 n
-0000173781 00000 n
-0000332353 00000 n
+0000173727 00000 n
+0000332281 00000 n
0000018604 00000 n
0000018701 00000 n
-0000173968 00000 n
-0000332260 00000 n
+0000173914 00000 n
+0000332188 00000 n
0000018760 00000 n
0000018862 00000 n
-0000177061 00000 n
-0000332181 00000 n
+0000177001 00000 n
+0000332109 00000 n
0000018921 00000 n
0000019061 00000 n
-0000183663 00000 n
-0000332050 00000 n
+0000183602 00000 n
+0000331978 00000 n
0000019110 00000 n
0000019282 00000 n
-0000183788 00000 n
-0000331971 00000 n
+0000183727 00000 n
+0000331899 00000 n
0000019336 00000 n
0000019467 00000 n
-0000183850 00000 n
-0000331839 00000 n
+0000183789 00000 n
+0000331767 00000 n
0000019521 00000 n
0000019657 00000 n
-0000183974 00000 n
-0000331760 00000 n
+0000183913 00000 n
+0000331688 00000 n
0000019716 00000 n
0000019797 00000 n
-0000184099 00000 n
-0000331667 00000 n
+0000184038 00000 n
+0000331595 00000 n
0000019856 00000 n
0000019960 00000 n
-0000184224 00000 n
-0000331574 00000 n
+0000184163 00000 n
+0000331502 00000 n
0000020019 00000 n
0000020095 00000 n
-0000184348 00000 n
-0000331481 00000 n
+0000184287 00000 n
+0000331409 00000 n
0000020154 00000 n
0000020253 00000 n
-0000184472 00000 n
-0000331388 00000 n
+0000184411 00000 n
+0000331316 00000 n
0000020312 00000 n
0000020388 00000 n
-0000189027 00000 n
-0000331309 00000 n
+0000188964 00000 n
+0000331237 00000 n
0000020447 00000 n
0000020546 00000 n
-0000189089 00000 n
-0000331191 00000 n
+0000189026 00000 n
+0000331119 00000 n
0000020600 00000 n
0000020741 00000 n
-0000189214 00000 n
-0000331112 00000 n
+0000189151 00000 n
+0000331040 00000 n
0000020800 00000 n
0000020927 00000 n
-0000189401 00000 n
-0000331019 00000 n
+0000189338 00000 n
+0000330947 00000 n
0000020986 00000 n
0000021161 00000 n
-0000191868 00000 n
-0000330926 00000 n
+0000191800 00000 n
+0000330854 00000 n
0000021220 00000 n
0000021405 00000 n
-0000192056 00000 n
-0000330847 00000 n
+0000191988 00000 n
+0000330775 00000 n
0000021464 00000 n
0000021672 00000 n
-0000196454 00000 n
-0000330730 00000 n
+0000196383 00000 n
+0000330658 00000 n
0000021722 00000 n
0000021828 00000 n
-0000196579 00000 n
-0000330651 00000 n
+0000196508 00000 n
+0000330579 00000 n
0000021883 00000 n
0000022014 00000 n
-0000196640 00000 n
-0000330533 00000 n
+0000196569 00000 n
+0000330461 00000 n
0000022069 00000 n
0000022210 00000 n
-0000196765 00000 n
-0000330454 00000 n
+0000196694 00000 n
+0000330382 00000 n
0000022270 00000 n
0000022441 00000 n
-0000196953 00000 n
-0000330375 00000 n
+0000196882 00000 n
+0000330303 00000 n
0000022501 00000 n
0000022644 00000 n
-0000200172 00000 n
-0000330243 00000 n
+0000200106 00000 n
+0000330171 00000 n
0000022691 00000 n
0000022817 00000 n
-0000200296 00000 n
-0000330139 00000 n
+0000200230 00000 n
+0000330067 00000 n
0000022866 00000 n
0000023010 00000 n
-0000200420 00000 n
-0000330060 00000 n
+0000200354 00000 n
+0000329988 00000 n
0000023064 00000 n
0000023195 00000 n
-0000200482 00000 n
-0000329942 00000 n
+0000200416 00000 n
+0000329870 00000 n
0000023249 00000 n
0000023408 00000 n
-0000200607 00000 n
-0000329863 00000 n
+0000200541 00000 n
+0000329791 00000 n
0000023467 00000 n
0000023520 00000 n
-0000200732 00000 n
-0000329770 00000 n
+0000200666 00000 n
+0000329698 00000 n
0000023579 00000 n
0000023642 00000 n
-0000201978 00000 n
-0000329677 00000 n
+0000201908 00000 n
+0000329605 00000 n
0000023701 00000 n
0000023782 00000 n
-0000202103 00000 n
-0000329584 00000 n
+0000202033 00000 n
+0000329512 00000 n
0000023841 00000 n
0000023922 00000 n
-0000202227 00000 n
-0000329505 00000 n
+0000202157 00000 n
+0000329433 00000 n
0000023981 00000 n
0000024062 00000 n
-0000329425 00000 n
+0000329353 00000 n
0000024121 00000 n
0000024174 00000 n
-0000024559 00000 n
-0000024739 00000 n
+0000024564 00000 n
+0000024744 00000 n
0000024226 00000 n
-0000024678 00000 n
-0000327646 00000 n
-0000327996 00000 n
-0000026198 00000 n
-0000026079 00000 n
-0000024811 00000 n
-0000326935 00000 n
-0000326616 00000 n
-0000027818 00000 n
-0000027968 00000 n
-0000028121 00000 n
-0000028274 00000 n
-0000028427 00000 n
-0000028580 00000 n
-0000028733 00000 n
-0000028891 00000 n
-0000029055 00000 n
-0000029218 00000 n
-0000029371 00000 n
-0000029524 00000 n
-0000029681 00000 n
-0000029831 00000 n
-0000029984 00000 n
-0000030134 00000 n
-0000030286 00000 n
-0000030436 00000 n
-0000030589 00000 n
-0000030748 00000 n
-0000030901 00000 n
-0000031060 00000 n
-0000031219 00000 n
-0000031383 00000 n
-0000031546 00000 n
-0000031710 00000 n
-0000031874 00000 n
-0000032038 00000 n
-0000032198 00000 n
+0000024683 00000 n
+0000327574 00000 n
+0000327924 00000 n
+0000026200 00000 n
+0000026081 00000 n
+0000024816 00000 n
+0000326863 00000 n
+0000326544 00000 n
+0000027820 00000 n
+0000027970 00000 n
+0000028123 00000 n
+0000028276 00000 n
+0000028429 00000 n
+0000028582 00000 n
+0000028735 00000 n
+0000028893 00000 n
+0000029057 00000 n
+0000029220 00000 n
+0000029373 00000 n
+0000029526 00000 n
+0000029683 00000 n
+0000029833 00000 n
+0000029986 00000 n
+0000030136 00000 n
+0000030288 00000 n
+0000030438 00000 n
+0000030591 00000 n
+0000030750 00000 n
+0000030903 00000 n
+0000031062 00000 n
+0000031221 00000 n
+0000031385 00000 n
+0000031548 00000 n
+0000031712 00000 n
+0000031876 00000 n
+0000032040 00000 n
+0000032200 00000 n
0000034267 00000 n
-0000032415 00000 n
-0000027455 00000 n
-0000026296 00000 n
-0000327109 00000 n
-0000032354 00000 n
+0000032417 00000 n
+0000027457 00000 n
+0000026298 00000 n
+0000327037 00000 n
+0000032356 00000 n
0000034431 00000 n
0000034583 00000 n
0000034742 00000 n
@@ -9447,967 +9441,967 @@ xref
0000040207 00000 n
0000040371 00000 n
0000040532 00000 n
-0000042437 00000 n
+0000042431 00000 n
0000040694 00000 n
0000033816 00000 n
-0000032527 00000 n
-0000042601 00000 n
-0000042764 00000 n
-0000042928 00000 n
-0000043093 00000 n
-0000043258 00000 n
-0000043423 00000 n
-0000043588 00000 n
-0000043753 00000 n
-0000043918 00000 n
-0000044082 00000 n
-0000044247 00000 n
-0000044412 00000 n
-0000044576 00000 n
-0000044740 00000 n
-0000044904 00000 n
-0000045068 00000 n
-0000045233 00000 n
-0000045398 00000 n
-0000045563 00000 n
-0000045716 00000 n
-0000045873 00000 n
-0000046032 00000 n
-0000046196 00000 n
-0000046360 00000 n
-0000046523 00000 n
-0000046687 00000 n
-0000046851 00000 n
-0000047014 00000 n
-0000047178 00000 n
-0000047342 00000 n
-0000047506 00000 n
-0000047658 00000 n
-0000047817 00000 n
-0000047975 00000 n
-0000048139 00000 n
-0000048302 00000 n
-0000048464 00000 n
-0000048628 00000 n
-0000048789 00000 n
-0000050348 00000 n
-0000048951 00000 n
-0000041986 00000 n
+0000032529 00000 n
+0000042595 00000 n
+0000042758 00000 n
+0000042922 00000 n
+0000043087 00000 n
+0000043252 00000 n
+0000043417 00000 n
+0000043582 00000 n
+0000043747 00000 n
+0000043912 00000 n
+0000044076 00000 n
+0000044241 00000 n
+0000044406 00000 n
+0000044570 00000 n
+0000044734 00000 n
+0000044898 00000 n
+0000045062 00000 n
+0000045227 00000 n
+0000045392 00000 n
+0000045557 00000 n
+0000045710 00000 n
+0000045867 00000 n
+0000046026 00000 n
+0000046190 00000 n
+0000046354 00000 n
+0000046517 00000 n
+0000046681 00000 n
+0000046845 00000 n
+0000047008 00000 n
+0000047172 00000 n
+0000047336 00000 n
+0000047500 00000 n
+0000047652 00000 n
+0000047811 00000 n
+0000047969 00000 n
+0000048133 00000 n
+0000048296 00000 n
+0000048458 00000 n
+0000048622 00000 n
+0000048783 00000 n
+0000050340 00000 n
+0000048945 00000 n
+0000041980 00000 n
0000040792 00000 n
-0000050507 00000 n
-0000050670 00000 n
-0000050834 00000 n
-0000050998 00000 n
-0000051162 00000 n
-0000051316 00000 n
-0000051476 00000 n
-0000051635 00000 n
-0000051800 00000 n
-0000051964 00000 n
-0000052114 00000 n
-0000052266 00000 n
-0000052425 00000 n
-0000052582 00000 n
-0000052746 00000 n
-0000052910 00000 n
-0000053074 00000 n
-0000053238 00000 n
-0000053402 00000 n
-0000053563 00000 n
-0000050057 00000 n
-0000049049 00000 n
-0000055889 00000 n
-0000056477 00000 n
-0000055750 00000 n
-0000053661 00000 n
-0000056053 00000 n
-0000056173 00000 n
-0000056234 00000 n
-0000326761 00000 n
-0000056355 00000 n
-0000328114 00000 n
-0000059867 00000 n
-0000059321 00000 n
-0000056603 00000 n
-0000059440 00000 n
-0000326471 00000 n
-0000059501 00000 n
-0000059623 00000 n
-0000059745 00000 n
-0000063181 00000 n
-0000063342 00000 n
-0000063499 00000 n
-0000066839 00000 n
-0000064210 00000 n
-0000063026 00000 n
-0000060006 00000 n
-0000063663 00000 n
-0000063724 00000 n
-0000063845 00000 n
-0000063967 00000 n
-0000064089 00000 n
-0000092802 00000 n
-0000096630 00000 n
-0000099903 00000 n
-0000066995 00000 n
-0000067158 00000 n
-0000067319 00000 n
-0000067481 00000 n
-0000067645 00000 n
-0000067805 00000 n
-0000068005 00000 n
-0000068206 00000 n
-0000068358 00000 n
-0000068555 00000 n
-0000068753 00000 n
-0000068952 00000 n
-0000069454 00000 n
-0000066604 00000 n
-0000064336 00000 n
-0000069151 00000 n
-0000069212 00000 n
-0000069333 00000 n
-0000106613 00000 n
-0000115726 00000 n
-0000137173 00000 n
-0000183601 00000 n
-0000169227 00000 n
-0000078446 00000 n
-0000100208 00000 n
-0000100391 00000 n
-0000200234 00000 n
-0000147001 00000 n
-0000151795 00000 n
-0000176999 00000 n
-0000173532 00000 n
-0000070376 00000 n
-0000070196 00000 n
-0000069580 00000 n
-0000070315 00000 n
-0000071058 00000 n
-0000070878 00000 n
-0000070475 00000 n
-0000070997 00000 n
-0000071992 00000 n
-0000072146 00000 n
-0000072300 00000 n
-0000072454 00000 n
-0000072608 00000 n
-0000072762 00000 n
-0000072916 00000 n
-0000073070 00000 n
-0000073224 00000 n
-0000073378 00000 n
-0000073714 00000 n
-0000071781 00000 n
-0000071143 00000 n
-0000073533 00000 n
-0000328232 00000 n
-0000074362 00000 n
-0000074182 00000 n
-0000073800 00000 n
-0000074301 00000 n
-0000074985 00000 n
-0000075138 00000 n
-0000075473 00000 n
-0000074838 00000 n
-0000074447 00000 n
-0000075292 00000 n
-0000076122 00000 n
-0000075942 00000 n
-0000075559 00000 n
-0000076061 00000 n
-0000078627 00000 n
-0000078206 00000 n
-0000076207 00000 n
-0000078325 00000 n
-0000081711 00000 n
-0000081864 00000 n
-0000082018 00000 n
-0000082537 00000 n
-0000081556 00000 n
-0000078766 00000 n
-0000082172 00000 n
-0000082233 00000 n
-0000082294 00000 n
-0000327819 00000 n
-0000082355 00000 n
-0000082416 00000 n
-0000082477 00000 n
-0000084069 00000 n
-0000084222 00000 n
-0000084558 00000 n
-0000083922 00000 n
-0000082690 00000 n
-0000084375 00000 n
-0000084436 00000 n
-0000084497 00000 n
-0000328350 00000 n
-0000085610 00000 n
-0000085430 00000 n
-0000084684 00000 n
-0000085549 00000 n
-0000086610 00000 n
-0000086430 00000 n
-0000085709 00000 n
-0000086549 00000 n
-0000087884 00000 n
-0000087647 00000 n
-0000086709 00000 n
-0000087766 00000 n
-0000087827 00000 n
-0000089410 00000 n
-0000089169 00000 n
-0000088010 00000 n
-0000089288 00000 n
-0000089349 00000 n
-0000091213 00000 n
-0000091366 00000 n
-0000091562 00000 n
-0000091759 00000 n
-0000091955 00000 n
-0000092152 00000 n
-0000092348 00000 n
-0000092544 00000 n
-0000093772 00000 n
-0000091018 00000 n
-0000089563 00000 n
-0000092741 00000 n
-0000093043 00000 n
-0000093164 00000 n
-0000093285 00000 n
-0000093407 00000 n
-0000093529 00000 n
-0000093650 00000 n
-0000094659 00000 n
-0000094781 00000 n
-0000094418 00000 n
-0000093884 00000 n
-0000094537 00000 n
-0000328468 00000 n
-0000096178 00000 n
-0000096372 00000 n
-0000097118 00000 n
-0000096031 00000 n
-0000094893 00000 n
-0000096569 00000 n
-0000096752 00000 n
-0000096935 00000 n
-0000327465 00000 n
-0000097057 00000 n
-0000099044 00000 n
-0000099246 00000 n
-0000099443 00000 n
-0000099645 00000 n
-0000100574 00000 n
-0000098881 00000 n
-0000097258 00000 n
-0000099842 00000 n
-0000100025 00000 n
-0000100330 00000 n
-0000100513 00000 n
-0000103448 00000 n
-0000103641 00000 n
-0000103834 00000 n
-0000104031 00000 n
-0000104223 00000 n
-0000104418 00000 n
-0000104610 00000 n
-0000104802 00000 n
-0000104998 00000 n
-0000105190 00000 n
-0000105387 00000 n
-0000105580 00000 n
-0000105773 00000 n
-0000105969 00000 n
-0000106162 00000 n
-0000106359 00000 n
-0000107584 00000 n
-0000103189 00000 n
-0000100728 00000 n
-0000106552 00000 n
-0000106735 00000 n
-0000106795 00000 n
-0000106978 00000 n
-0000107100 00000 n
-0000107222 00000 n
-0000107340 00000 n
-0000107401 00000 n
-0000107523 00000 n
-0000110883 00000 n
-0000110700 00000 n
-0000110517 00000 n
-0000111066 00000 n
-0000111248 00000 n
-0000110337 00000 n
-0000107738 00000 n
-0000110456 00000 n
-0000110639 00000 n
-0000110822 00000 n
-0000111005 00000 n
-0000111187 00000 n
-0000113694 00000 n
-0000113891 00000 n
-0000114088 00000 n
-0000114286 00000 n
-0000114483 00000 n
-0000114681 00000 n
-0000114877 00000 n
-0000115075 00000 n
-0000115272 00000 n
-0000115469 00000 n
-0000116577 00000 n
-0000113483 00000 n
-0000111402 00000 n
-0000115665 00000 n
-0000115848 00000 n
-0000116031 00000 n
-0000116153 00000 n
-0000116214 00000 n
-0000116334 00000 n
-0000116394 00000 n
-0000116516 00000 n
-0000118515 00000 n
-0000118698 00000 n
-0000118881 00000 n
-0000118335 00000 n
-0000116717 00000 n
-0000118454 00000 n
-0000118637 00000 n
-0000118820 00000 n
-0000328586 00000 n
-0000121651 00000 n
-0000121848 00000 n
-0000122079 00000 n
-0000122310 00000 n
-0000122542 00000 n
-0000122774 00000 n
-0000123005 00000 n
-0000123236 00000 n
-0000123468 00000 n
-0000123700 00000 n
-0000123930 00000 n
-0000124161 00000 n
-0000124392 00000 n
-0000124623 00000 n
-0000124854 00000 n
-0000125086 00000 n
-0000125318 00000 n
-0000125550 00000 n
-0000125781 00000 n
-0000126013 00000 n
-0000126245 00000 n
-0000126477 00000 n
-0000126672 00000 n
-0000126869 00000 n
-0000127067 00000 n
-0000127264 00000 n
-0000127462 00000 n
-0000127658 00000 n
-0000127856 00000 n
-0000128053 00000 n
-0000128251 00000 n
-0000128448 00000 n
-0000128646 00000 n
-0000128842 00000 n
-0000129039 00000 n
-0000129236 00000 n
-0000129434 00000 n
-0000129631 00000 n
-0000129829 00000 n
-0000130026 00000 n
-0000130224 00000 n
-0000130421 00000 n
-0000130619 00000 n
-0000130811 00000 n
-0000131006 00000 n
-0000131202 00000 n
-0000131400 00000 n
-0000131597 00000 n
-0000131795 00000 n
-0000131989 00000 n
-0000132186 00000 n
-0000132384 00000 n
-0000132581 00000 n
-0000132778 00000 n
-0000132976 00000 n
-0000133173 00000 n
-0000133370 00000 n
-0000133567 00000 n
-0000133764 00000 n
-0000133960 00000 n
-0000134158 00000 n
-0000134355 00000 n
-0000134553 00000 n
-0000134750 00000 n
-0000134948 00000 n
-0000135145 00000 n
-0000135344 00000 n
-0000135542 00000 n
-0000135741 00000 n
-0000135939 00000 n
-0000136133 00000 n
-0000136329 00000 n
-0000136528 00000 n
-0000136726 00000 n
-0000136917 00000 n
-0000137422 00000 n
-0000120907 00000 n
-0000119021 00000 n
-0000137110 00000 n
-0000137297 00000 n
-0000137359 00000 n
-0000141093 00000 n
-0000141218 00000 n
-0000141281 00000 n
-0000141344 00000 n
-0000141407 00000 n
-0000141470 00000 n
-0000141533 00000 n
-0000141596 00000 n
-0000141659 00000 n
-0000141722 00000 n
-0000141785 00000 n
-0000141848 00000 n
-0000141911 00000 n
-0000141974 00000 n
-0000142037 00000 n
-0000142100 00000 n
-0000142163 00000 n
-0000142226 00000 n
-0000142289 00000 n
-0000142352 00000 n
-0000142415 00000 n
-0000160558 00000 n
-0000155261 00000 n
-0000160746 00000 n
-0000155449 00000 n
-0000142540 00000 n
-0000152356 00000 n
-0000162711 00000 n
-0000155637 00000 n
-0000155825 00000 n
-0000147188 00000 n
-0000147313 00000 n
-0000151670 00000 n
-0000151982 00000 n
-0000152107 00000 n
-0000152232 00000 n
-0000146438 00000 n
-0000146751 00000 n
-0000146626 00000 n
-0000146876 00000 n
-0000156013 00000 n
-0000160184 00000 n
-0000160309 00000 n
-0000160433 00000 n
-0000140313 00000 n
-0000140512 00000 n
-0000140709 00000 n
-0000142725 00000 n
-0000140152 00000 n
-0000137535 00000 n
-0000140906 00000 n
-0000327286 00000 n
-0000142663 00000 n
-0000145585 00000 n
-0000145783 00000 n
-0000145981 00000 n
-0000146179 00000 n
-0000147375 00000 n
-0000145415 00000 n
-0000142895 00000 n
-0000146375 00000 n
-0000146563 00000 n
-0000147125 00000 n
-0000150558 00000 n
-0000150756 00000 n
-0000150954 00000 n
-0000151151 00000 n
-0000151349 00000 n
-0000152418 00000 n
-0000150379 00000 n
-0000147530 00000 n
-0000151545 00000 n
-0000151919 00000 n
-0000156136 00000 n
-0000154952 00000 n
-0000152559 00000 n
-0000155074 00000 n
-0000155199 00000 n
-0000155386 00000 n
-0000155574 00000 n
-0000155762 00000 n
-0000155950 00000 n
-0000159464 00000 n
-0000159662 00000 n
-0000159860 00000 n
-0000160808 00000 n
-0000159302 00000 n
-0000156291 00000 n
-0000160058 00000 n
-0000160121 00000 n
-0000160683 00000 n
-0000328709 00000 n
-0000162898 00000 n
-0000162401 00000 n
-0000160963 00000 n
-0000162524 00000 n
-0000162649 00000 n
-0000162835 00000 n
-0000165584 00000 n
-0000165785 00000 n
-0000165982 00000 n
-0000166183 00000 n
-0000166380 00000 n
-0000166579 00000 n
-0000166776 00000 n
-0000166977 00000 n
-0000167175 00000 n
-0000167374 00000 n
-0000167571 00000 n
-0000167771 00000 n
-0000167969 00000 n
-0000168170 00000 n
-0000168368 00000 n
-0000168568 00000 n
-0000168765 00000 n
-0000168966 00000 n
-0000170097 00000 n
-0000165287 00000 n
-0000163053 00000 n
-0000169164 00000 n
-0000169351 00000 n
-0000169538 00000 n
-0000169663 00000 n
-0000169725 00000 n
-0000169849 00000 n
-0000169912 00000 n
-0000170034 00000 n
-0000173718 00000 n
-0000173156 00000 n
-0000173906 00000 n
-0000173344 00000 n
-0000174029 00000 n
-0000172970 00000 n
-0000170238 00000 n
-0000173093 00000 n
-0000173281 00000 n
-0000173469 00000 n
-0000173656 00000 n
-0000173843 00000 n
-0000177186 00000 n
-0000176750 00000 n
-0000174184 00000 n
-0000176873 00000 n
-0000176936 00000 n
-0000177123 00000 n
-0000179565 00000 n
-0000179763 00000 n
-0000179961 00000 n
-0000180160 00000 n
-0000180358 00000 n
-0000180556 00000 n
-0000180755 00000 n
-0000180954 00000 n
-0000181153 00000 n
-0000181351 00000 n
-0000181550 00000 n
-0000181747 00000 n
-0000181946 00000 n
-0000182145 00000 n
-0000182344 00000 n
-0000182543 00000 n
-0000182742 00000 n
-0000182941 00000 n
-0000183140 00000 n
-0000183339 00000 n
-0000184596 00000 n
-0000179250 00000 n
-0000177327 00000 n
-0000183538 00000 n
-0000183725 00000 n
-0000183911 00000 n
-0000184036 00000 n
-0000184161 00000 n
-0000184286 00000 n
-0000184410 00000 n
-0000184534 00000 n
-0000189151 00000 n
-0000191805 00000 n
-0000189338 00000 n
-0000191993 00000 n
-0000188568 00000 n
-0000188767 00000 n
-0000189526 00000 n
-0000188415 00000 n
-0000184723 00000 n
-0000188964 00000 n
-0000189276 00000 n
+0000050499 00000 n
+0000050662 00000 n
+0000050826 00000 n
+0000050990 00000 n
+0000051154 00000 n
+0000051308 00000 n
+0000051468 00000 n
+0000051627 00000 n
+0000051792 00000 n
+0000051956 00000 n
+0000052106 00000 n
+0000052258 00000 n
+0000052417 00000 n
+0000052574 00000 n
+0000052738 00000 n
+0000052902 00000 n
+0000053066 00000 n
+0000053230 00000 n
+0000053394 00000 n
+0000053555 00000 n
+0000050049 00000 n
+0000049043 00000 n
+0000055881 00000 n
+0000056469 00000 n
+0000055742 00000 n
+0000053653 00000 n
+0000056045 00000 n
+0000056165 00000 n
+0000056226 00000 n
+0000326689 00000 n
+0000056347 00000 n
+0000328042 00000 n
+0000059856 00000 n
+0000059310 00000 n
+0000056595 00000 n
+0000059429 00000 n
+0000326399 00000 n
+0000059490 00000 n
+0000059612 00000 n
+0000059734 00000 n
+0000063168 00000 n
+0000063329 00000 n
+0000063486 00000 n
+0000066827 00000 n
+0000064197 00000 n
+0000063013 00000 n
+0000059995 00000 n
+0000063650 00000 n
+0000063711 00000 n
+0000063832 00000 n
+0000063954 00000 n
+0000064076 00000 n
+0000092770 00000 n
+0000096593 00000 n
+0000099864 00000 n
+0000066983 00000 n
+0000067146 00000 n
+0000067307 00000 n
+0000067469 00000 n
+0000067633 00000 n
+0000067793 00000 n
+0000067993 00000 n
+0000068194 00000 n
+0000068346 00000 n
+0000068543 00000 n
+0000068741 00000 n
+0000068940 00000 n
+0000069442 00000 n
+0000066592 00000 n
+0000064323 00000 n
+0000069139 00000 n
+0000069200 00000 n
+0000069321 00000 n
+0000106576 00000 n
+0000115683 00000 n
+0000137128 00000 n
+0000183540 00000 n
+0000169171 00000 n
+0000078426 00000 n
+0000100169 00000 n
+0000100352 00000 n
+0000200168 00000 n
+0000146950 00000 n
+0000151742 00000 n
+0000176939 00000 n
+0000173478 00000 n
+0000070363 00000 n
+0000070183 00000 n
+0000069568 00000 n
+0000070302 00000 n
+0000071042 00000 n
+0000070862 00000 n
+0000070462 00000 n
+0000070981 00000 n
+0000071976 00000 n
+0000072130 00000 n
+0000072284 00000 n
+0000072438 00000 n
+0000072592 00000 n
+0000072746 00000 n
+0000072900 00000 n
+0000073054 00000 n
+0000073208 00000 n
+0000073362 00000 n
+0000073698 00000 n
+0000071765 00000 n
+0000071127 00000 n
+0000073517 00000 n
+0000328160 00000 n
+0000074344 00000 n
+0000074164 00000 n
+0000073784 00000 n
+0000074283 00000 n
+0000074967 00000 n
+0000075120 00000 n
+0000075455 00000 n
+0000074820 00000 n
+0000074429 00000 n
+0000075274 00000 n
+0000076102 00000 n
+0000075922 00000 n
+0000075541 00000 n
+0000076041 00000 n
+0000078607 00000 n
+0000078186 00000 n
+0000076187 00000 n
+0000078305 00000 n
+0000081692 00000 n
+0000081845 00000 n
+0000081999 00000 n
+0000082518 00000 n
+0000081537 00000 n
+0000078746 00000 n
+0000082153 00000 n
+0000082214 00000 n
+0000082275 00000 n
+0000327747 00000 n
+0000082336 00000 n
+0000082397 00000 n
+0000082458 00000 n
+0000084048 00000 n
+0000084201 00000 n
+0000084537 00000 n
+0000083901 00000 n
+0000082671 00000 n
+0000084354 00000 n
+0000084415 00000 n
+0000084476 00000 n
+0000328278 00000 n
+0000085587 00000 n
+0000085407 00000 n
+0000084663 00000 n
+0000085526 00000 n
+0000086585 00000 n
+0000086405 00000 n
+0000085686 00000 n
+0000086524 00000 n
+0000087856 00000 n
+0000087619 00000 n
+0000086684 00000 n
+0000087738 00000 n
+0000087799 00000 n
+0000089376 00000 n
+0000089135 00000 n
+0000087982 00000 n
+0000089254 00000 n
+0000089315 00000 n
+0000091181 00000 n
+0000091334 00000 n
+0000091530 00000 n
+0000091727 00000 n
+0000091923 00000 n
+0000092120 00000 n
+0000092316 00000 n
+0000092512 00000 n
+0000093740 00000 n
+0000090986 00000 n
+0000089529 00000 n
+0000092709 00000 n
+0000093011 00000 n
+0000093132 00000 n
+0000093253 00000 n
+0000093375 00000 n
+0000093497 00000 n
+0000093618 00000 n
+0000094624 00000 n
+0000094746 00000 n
+0000094383 00000 n
+0000093852 00000 n
+0000094502 00000 n
+0000328396 00000 n
+0000096141 00000 n
+0000096335 00000 n
+0000097081 00000 n
+0000095994 00000 n
+0000094858 00000 n
+0000096532 00000 n
+0000096715 00000 n
+0000096898 00000 n
+0000327393 00000 n
+0000097020 00000 n
+0000099005 00000 n
+0000099207 00000 n
+0000099404 00000 n
+0000099606 00000 n
+0000100535 00000 n
+0000098842 00000 n
+0000097221 00000 n
+0000099803 00000 n
+0000099986 00000 n
+0000100291 00000 n
+0000100474 00000 n
+0000103411 00000 n
+0000103604 00000 n
+0000103797 00000 n
+0000103994 00000 n
+0000104186 00000 n
+0000104381 00000 n
+0000104573 00000 n
+0000104765 00000 n
+0000104961 00000 n
+0000105153 00000 n
+0000105350 00000 n
+0000105543 00000 n
+0000105736 00000 n
+0000105932 00000 n
+0000106125 00000 n
+0000106322 00000 n
+0000107547 00000 n
+0000103152 00000 n
+0000100689 00000 n
+0000106515 00000 n
+0000106698 00000 n
+0000106758 00000 n
+0000106941 00000 n
+0000107063 00000 n
+0000107185 00000 n
+0000107303 00000 n
+0000107364 00000 n
+0000107486 00000 n
+0000110842 00000 n
+0000110659 00000 n
+0000110476 00000 n
+0000111025 00000 n
+0000111207 00000 n
+0000110296 00000 n
+0000107701 00000 n
+0000110415 00000 n
+0000110598 00000 n
+0000110781 00000 n
+0000110964 00000 n
+0000111146 00000 n
+0000113651 00000 n
+0000113848 00000 n
+0000114045 00000 n
+0000114243 00000 n
+0000114440 00000 n
+0000114638 00000 n
+0000114834 00000 n
+0000115032 00000 n
+0000115229 00000 n
+0000115426 00000 n
+0000116534 00000 n
+0000113440 00000 n
+0000111361 00000 n
+0000115622 00000 n
+0000115805 00000 n
+0000115988 00000 n
+0000116110 00000 n
+0000116171 00000 n
+0000116291 00000 n
+0000116351 00000 n
+0000116473 00000 n
+0000118472 00000 n
+0000118655 00000 n
+0000118838 00000 n
+0000118292 00000 n
+0000116674 00000 n
+0000118411 00000 n
+0000118594 00000 n
+0000118777 00000 n
+0000328514 00000 n
+0000121606 00000 n
+0000121803 00000 n
+0000122034 00000 n
+0000122265 00000 n
+0000122497 00000 n
+0000122729 00000 n
+0000122960 00000 n
+0000123191 00000 n
+0000123423 00000 n
+0000123655 00000 n
+0000123885 00000 n
+0000124116 00000 n
+0000124347 00000 n
+0000124578 00000 n
+0000124809 00000 n
+0000125041 00000 n
+0000125273 00000 n
+0000125505 00000 n
+0000125736 00000 n
+0000125968 00000 n
+0000126200 00000 n
+0000126432 00000 n
+0000126627 00000 n
+0000126824 00000 n
+0000127022 00000 n
+0000127219 00000 n
+0000127417 00000 n
+0000127613 00000 n
+0000127811 00000 n
+0000128008 00000 n
+0000128206 00000 n
+0000128403 00000 n
+0000128601 00000 n
+0000128797 00000 n
+0000128994 00000 n
+0000129191 00000 n
+0000129389 00000 n
+0000129586 00000 n
+0000129784 00000 n
+0000129981 00000 n
+0000130179 00000 n
+0000130376 00000 n
+0000130574 00000 n
+0000130766 00000 n
+0000130961 00000 n
+0000131157 00000 n
+0000131355 00000 n
+0000131552 00000 n
+0000131750 00000 n
+0000131944 00000 n
+0000132141 00000 n
+0000132339 00000 n
+0000132536 00000 n
+0000132733 00000 n
+0000132931 00000 n
+0000133128 00000 n
+0000133325 00000 n
+0000133522 00000 n
+0000133719 00000 n
+0000133915 00000 n
+0000134113 00000 n
+0000134310 00000 n
+0000134508 00000 n
+0000134705 00000 n
+0000134903 00000 n
+0000135100 00000 n
+0000135299 00000 n
+0000135497 00000 n
+0000135696 00000 n
+0000135894 00000 n
+0000136088 00000 n
+0000136284 00000 n
+0000136483 00000 n
+0000136681 00000 n
+0000136872 00000 n
+0000137377 00000 n
+0000120862 00000 n
+0000118978 00000 n
+0000137065 00000 n
+0000137252 00000 n
+0000137314 00000 n
+0000141047 00000 n
+0000141172 00000 n
+0000141235 00000 n
+0000141298 00000 n
+0000141361 00000 n
+0000141424 00000 n
+0000141487 00000 n
+0000141550 00000 n
+0000141613 00000 n
+0000141676 00000 n
+0000141739 00000 n
+0000141802 00000 n
+0000141865 00000 n
+0000141928 00000 n
+0000141991 00000 n
+0000142054 00000 n
+0000142117 00000 n
+0000142180 00000 n
+0000142243 00000 n
+0000142306 00000 n
+0000142369 00000 n
+0000160503 00000 n
+0000155207 00000 n
+0000160691 00000 n
+0000155395 00000 n
+0000142494 00000 n
+0000152303 00000 n
+0000162654 00000 n
+0000155583 00000 n
+0000155771 00000 n
+0000147137 00000 n
+0000147262 00000 n
+0000151617 00000 n
+0000151929 00000 n
+0000152054 00000 n
+0000152179 00000 n
+0000146387 00000 n
+0000146700 00000 n
+0000146575 00000 n
+0000146825 00000 n
+0000155959 00000 n
+0000160129 00000 n
+0000160254 00000 n
+0000160378 00000 n
+0000140267 00000 n
+0000140466 00000 n
+0000140663 00000 n
+0000142679 00000 n
+0000140106 00000 n
+0000137490 00000 n
+0000140860 00000 n
+0000327214 00000 n
+0000142617 00000 n
+0000145534 00000 n
+0000145732 00000 n
+0000145930 00000 n
+0000146128 00000 n
+0000147324 00000 n
+0000145364 00000 n
+0000142849 00000 n
+0000146324 00000 n
+0000146512 00000 n
+0000147074 00000 n
+0000150505 00000 n
+0000150703 00000 n
+0000150901 00000 n
+0000151098 00000 n
+0000151296 00000 n
+0000152365 00000 n
+0000150326 00000 n
+0000147479 00000 n
+0000151492 00000 n
+0000151866 00000 n
+0000156082 00000 n
+0000154898 00000 n
+0000152506 00000 n
+0000155020 00000 n
+0000155145 00000 n
+0000155332 00000 n
+0000155520 00000 n
+0000155708 00000 n
+0000155896 00000 n
+0000159409 00000 n
+0000159607 00000 n
+0000159805 00000 n
+0000160753 00000 n
+0000159247 00000 n
+0000156237 00000 n
+0000160003 00000 n
+0000160066 00000 n
+0000160628 00000 n
+0000328637 00000 n
+0000162841 00000 n
+0000162344 00000 n
+0000160908 00000 n
+0000162467 00000 n
+0000162592 00000 n
+0000162778 00000 n
+0000165528 00000 n
+0000165729 00000 n
+0000165926 00000 n
+0000166127 00000 n
+0000166324 00000 n
+0000166523 00000 n
+0000166720 00000 n
+0000166921 00000 n
+0000167119 00000 n
+0000167318 00000 n
+0000167515 00000 n
+0000167715 00000 n
+0000167913 00000 n
+0000168114 00000 n
+0000168312 00000 n
+0000168512 00000 n
+0000168709 00000 n
+0000168910 00000 n
+0000170041 00000 n
+0000165231 00000 n
+0000162996 00000 n
+0000169108 00000 n
+0000169295 00000 n
+0000169482 00000 n
+0000169607 00000 n
+0000169669 00000 n
+0000169793 00000 n
+0000169856 00000 n
+0000169978 00000 n
+0000173664 00000 n
+0000173102 00000 n
+0000173852 00000 n
+0000173290 00000 n
+0000173975 00000 n
+0000172916 00000 n
+0000170182 00000 n
+0000173039 00000 n
+0000173227 00000 n
+0000173415 00000 n
+0000173602 00000 n
+0000173789 00000 n
+0000177126 00000 n
+0000176690 00000 n
+0000174130 00000 n
+0000176813 00000 n
+0000176876 00000 n
+0000177063 00000 n
+0000179504 00000 n
+0000179702 00000 n
+0000179900 00000 n
+0000180099 00000 n
+0000180297 00000 n
+0000180495 00000 n
+0000180694 00000 n
+0000180893 00000 n
+0000181092 00000 n
+0000181290 00000 n
+0000181489 00000 n
+0000181686 00000 n
+0000181885 00000 n
+0000182084 00000 n
+0000182283 00000 n
+0000182482 00000 n
+0000182681 00000 n
+0000182880 00000 n
+0000183079 00000 n
+0000183278 00000 n
+0000184535 00000 n
+0000179189 00000 n
+0000177267 00000 n
+0000183477 00000 n
+0000183664 00000 n
+0000183850 00000 n
+0000183975 00000 n
+0000184100 00000 n
+0000184225 00000 n
+0000184349 00000 n
+0000184473 00000 n
+0000189088 00000 n
+0000191737 00000 n
+0000189275 00000 n
+0000191925 00000 n
+0000188505 00000 n
+0000188704 00000 n
0000189463 00000 n
-0000328834 00000 n
-0000192181 00000 n
-0000191619 00000 n
-0000189681 00000 n
-0000191742 00000 n
-0000191930 00000 n
-0000192118 00000 n
-0000195549 00000 n
-0000195741 00000 n
-0000195939 00000 n
-0000196131 00000 n
-0000197078 00000 n
-0000195378 00000 n
-0000192322 00000 n
-0000196328 00000 n
-0000196391 00000 n
-0000196516 00000 n
-0000196702 00000 n
-0000196827 00000 n
-0000196890 00000 n
-0000197015 00000 n
-0000197794 00000 n
-0000197608 00000 n
-0000197219 00000 n
-0000197731 00000 n
-0000199168 00000 n
-0000199356 00000 n
-0000199544 00000 n
-0000199732 00000 n
-0000199920 00000 n
-0000200856 00000 n
-0000198988 00000 n
-0000197880 00000 n
-0000200109 00000 n
-0000200358 00000 n
-0000200544 00000 n
-0000200669 00000 n
-0000200794 00000 n
-0000202040 00000 n
-0000202164 00000 n
-0000202289 00000 n
-0000201792 00000 n
-0000200983 00000 n
-0000201915 00000 n
-0000203848 00000 n
-0000203999 00000 n
-0000204150 00000 n
-0000204300 00000 n
-0000204451 00000 n
-0000204601 00000 n
-0000204752 00000 n
-0000204902 00000 n
-0000205053 00000 n
-0000205204 00000 n
-0000205355 00000 n
-0000205506 00000 n
-0000205657 00000 n
-0000205808 00000 n
-0000205959 00000 n
-0000206110 00000 n
-0000206261 00000 n
-0000206411 00000 n
-0000206562 00000 n
-0000206713 00000 n
-0000206863 00000 n
-0000207014 00000 n
-0000207165 00000 n
-0000207316 00000 n
-0000207465 00000 n
-0000207615 00000 n
-0000207766 00000 n
-0000207917 00000 n
-0000208068 00000 n
-0000208219 00000 n
-0000208370 00000 n
-0000208521 00000 n
-0000208672 00000 n
-0000208823 00000 n
-0000208974 00000 n
-0000209124 00000 n
-0000209275 00000 n
-0000209425 00000 n
-0000209576 00000 n
-0000209726 00000 n
-0000209877 00000 n
-0000210028 00000 n
-0000210179 00000 n
-0000210330 00000 n
-0000210481 00000 n
-0000210632 00000 n
-0000210783 00000 n
-0000210934 00000 n
-0000211083 00000 n
-0000211295 00000 n
-0000203272 00000 n
-0000202402 00000 n
-0000211232 00000 n
-0000328959 00000 n
-0000213369 00000 n
-0000213520 00000 n
-0000213671 00000 n
-0000213820 00000 n
-0000213969 00000 n
-0000214119 00000 n
-0000214270 00000 n
-0000214421 00000 n
-0000214571 00000 n
-0000214722 00000 n
-0000214873 00000 n
-0000215024 00000 n
-0000215175 00000 n
-0000215326 00000 n
-0000215477 00000 n
-0000215625 00000 n
-0000215775 00000 n
-0000215925 00000 n
-0000216076 00000 n
-0000216227 00000 n
-0000216378 00000 n
-0000216529 00000 n
-0000216680 00000 n
-0000216831 00000 n
-0000216982 00000 n
-0000217132 00000 n
-0000217282 00000 n
-0000217433 00000 n
-0000217584 00000 n
-0000217735 00000 n
-0000217886 00000 n
-0000218037 00000 n
-0000218188 00000 n
-0000218338 00000 n
-0000218487 00000 n
-0000218637 00000 n
-0000218788 00000 n
-0000218939 00000 n
-0000219090 00000 n
-0000219241 00000 n
-0000219392 00000 n
-0000219543 00000 n
-0000219694 00000 n
-0000219845 00000 n
-0000219995 00000 n
-0000220146 00000 n
-0000220297 00000 n
-0000220448 00000 n
-0000220599 00000 n
-0000220749 00000 n
-0000220900 00000 n
-0000221050 00000 n
-0000221201 00000 n
-0000221351 00000 n
-0000221502 00000 n
-0000221653 00000 n
-0000221804 00000 n
-0000221954 00000 n
-0000222103 00000 n
-0000222253 00000 n
-0000222404 00000 n
-0000222555 00000 n
-0000222706 00000 n
-0000222857 00000 n
-0000223008 00000 n
-0000223159 00000 n
-0000223309 00000 n
-0000223458 00000 n
-0000225668 00000 n
-0000223670 00000 n
-0000212622 00000 n
-0000211382 00000 n
-0000223607 00000 n
-0000225819 00000 n
-0000225969 00000 n
-0000226119 00000 n
-0000226270 00000 n
-0000226419 00000 n
-0000226570 00000 n
-0000226721 00000 n
-0000226871 00000 n
-0000227022 00000 n
-0000227173 00000 n
-0000227323 00000 n
-0000227474 00000 n
-0000227625 00000 n
-0000227776 00000 n
-0000227927 00000 n
-0000228076 00000 n
-0000228226 00000 n
-0000228377 00000 n
-0000228528 00000 n
-0000228679 00000 n
-0000228830 00000 n
-0000228980 00000 n
-0000229131 00000 n
-0000229282 00000 n
-0000229433 00000 n
-0000229583 00000 n
-0000229734 00000 n
-0000229885 00000 n
-0000230034 00000 n
-0000230183 00000 n
-0000230334 00000 n
-0000230484 00000 n
-0000230635 00000 n
-0000230786 00000 n
-0000230937 00000 n
-0000231088 00000 n
-0000231239 00000 n
-0000231390 00000 n
-0000231541 00000 n
-0000231692 00000 n
-0000231843 00000 n
-0000231994 00000 n
-0000232145 00000 n
-0000232296 00000 n
-0000232447 00000 n
-0000232598 00000 n
-0000232747 00000 n
-0000232897 00000 n
-0000233047 00000 n
-0000233197 00000 n
-0000233347 00000 n
-0000233498 00000 n
-0000233648 00000 n
-0000233799 00000 n
-0000233949 00000 n
-0000234098 00000 n
-0000234247 00000 n
-0000234398 00000 n
-0000234548 00000 n
-0000234699 00000 n
-0000234849 00000 n
-0000235000 00000 n
-0000235150 00000 n
-0000235301 00000 n
-0000235451 00000 n
-0000235602 00000 n
-0000235753 00000 n
-0000235904 00000 n
-0000236055 00000 n
-0000236204 00000 n
-0000236354 00000 n
-0000236505 00000 n
-0000236654 00000 n
-0000236805 00000 n
-0000236955 00000 n
-0000237169 00000 n
-0000224849 00000 n
-0000223769 00000 n
-0000237106 00000 n
-0000325937 00000 n
-0000237268 00000 n
-0000237388 00000 n
-0000237860 00000 n
-0000238333 00000 n
-0000238369 00000 n
-0000238761 00000 n
-0000239421 00000 n
-0000240022 00000 n
-0000240563 00000 n
-0000241229 00000 n
-0000243038 00000 n
-0000243273 00000 n
-0000244846 00000 n
-0000245096 00000 n
-0000263088 00000 n
-0000263618 00000 n
-0000275575 00000 n
-0000276011 00000 n
-0000289174 00000 n
-0000289629 00000 n
-0000297760 00000 n
-0000298048 00000 n
-0000306311 00000 n
-0000306612 00000 n
-0000318991 00000 n
-0000319626 00000 n
-0000325634 00000 n
-0000329057 00000 n
-0000329177 00000 n
-0000329276 00000 n
-0000329349 00000 n
-0000341602 00000 n
-0000341785 00000 n
-0000342171 00000 n
-0000342677 00000 n
-0000343122 00000 n
-0000343573 00000 n
-0000344149 00000 n
-0000344658 00000 n
-0000345148 00000 n
-0000345640 00000 n
-0000346131 00000 n
-0000346691 00000 n
-0000347252 00000 n
-0000347813 00000 n
-0000348373 00000 n
-0000349104 00000 n
-0000349937 00000 n
-0000350770 00000 n
-0000351375 00000 n
-0000351647 00000 n
-0000351871 00000 n
-0000352042 00000 n
-0000352212 00000 n
-0000352385 00000 n
-0000352560 00000 n
-0000352737 00000 n
-0000352912 00000 n
-0000353080 00000 n
-0000353274 00000 n
-0000353480 00000 n
-0000353675 00000 n
-0000353871 00000 n
-0000354071 00000 n
-0000354273 00000 n
-0000354580 00000 n
-0000354939 00000 n
-0000355183 00000 n
-0000355426 00000 n
-0000355669 00000 n
-0000355912 00000 n
-0000356193 00000 n
-0000356476 00000 n
-0000356759 00000 n
-0000357042 00000 n
-0000357328 00000 n
-0000357619 00000 n
-0000357909 00000 n
-0000358196 00000 n
-0000358479 00000 n
-0000358762 00000 n
-0000359045 00000 n
-0000359328 00000 n
-0000359577 00000 n
-0000359772 00000 n
-0000359970 00000 n
-0000360171 00000 n
-0000360370 00000 n
-0000360571 00000 n
-0000360770 00000 n
-0000360962 00000 n
-0000361049 00000 n
-0000361217 00000 n
-0000361431 00000 n
-0000361606 00000 n
-0000361735 00000 n
-0000361854 00000 n
-0000361982 00000 n
-0000362121 00000 n
-0000362265 00000 n
-0000362398 00000 n
-0000362519 00000 n
-0000362646 00000 n
-0000362755 00000 n
-0000362839 00000 n
-0000362879 00000 n
-0000363079 00000 n
+0000188352 00000 n
+0000184662 00000 n
+0000188901 00000 n
+0000189213 00000 n
+0000189400 00000 n
+0000328762 00000 n
+0000192113 00000 n
+0000191551 00000 n
+0000189618 00000 n
+0000191674 00000 n
+0000191862 00000 n
+0000192050 00000 n
+0000195478 00000 n
+0000195670 00000 n
+0000195868 00000 n
+0000196060 00000 n
+0000197007 00000 n
+0000195307 00000 n
+0000192254 00000 n
+0000196257 00000 n
+0000196320 00000 n
+0000196445 00000 n
+0000196631 00000 n
+0000196756 00000 n
+0000196819 00000 n
+0000196944 00000 n
+0000197719 00000 n
+0000197533 00000 n
+0000197148 00000 n
+0000197656 00000 n
+0000199102 00000 n
+0000199290 00000 n
+0000199478 00000 n
+0000199666 00000 n
+0000199854 00000 n
+0000200790 00000 n
+0000198922 00000 n
+0000197805 00000 n
+0000200043 00000 n
+0000200292 00000 n
+0000200478 00000 n
+0000200603 00000 n
+0000200728 00000 n
+0000201970 00000 n
+0000202094 00000 n
+0000202219 00000 n
+0000201722 00000 n
+0000200917 00000 n
+0000201845 00000 n
+0000203778 00000 n
+0000203929 00000 n
+0000204080 00000 n
+0000204230 00000 n
+0000204381 00000 n
+0000204531 00000 n
+0000204682 00000 n
+0000204832 00000 n
+0000204983 00000 n
+0000205134 00000 n
+0000205285 00000 n
+0000205436 00000 n
+0000205587 00000 n
+0000205738 00000 n
+0000205889 00000 n
+0000206040 00000 n
+0000206191 00000 n
+0000206341 00000 n
+0000206492 00000 n
+0000206643 00000 n
+0000206793 00000 n
+0000206944 00000 n
+0000207095 00000 n
+0000207246 00000 n
+0000207395 00000 n
+0000207545 00000 n
+0000207696 00000 n
+0000207847 00000 n
+0000207998 00000 n
+0000208149 00000 n
+0000208300 00000 n
+0000208451 00000 n
+0000208602 00000 n
+0000208753 00000 n
+0000208904 00000 n
+0000209054 00000 n
+0000209205 00000 n
+0000209355 00000 n
+0000209506 00000 n
+0000209656 00000 n
+0000209807 00000 n
+0000209958 00000 n
+0000210109 00000 n
+0000210260 00000 n
+0000210411 00000 n
+0000210562 00000 n
+0000210713 00000 n
+0000210864 00000 n
+0000211013 00000 n
+0000211225 00000 n
+0000203202 00000 n
+0000202332 00000 n
+0000211162 00000 n
+0000328887 00000 n
+0000213298 00000 n
+0000213449 00000 n
+0000213600 00000 n
+0000213749 00000 n
+0000213898 00000 n
+0000214048 00000 n
+0000214199 00000 n
+0000214350 00000 n
+0000214500 00000 n
+0000214651 00000 n
+0000214802 00000 n
+0000214953 00000 n
+0000215104 00000 n
+0000215255 00000 n
+0000215406 00000 n
+0000215554 00000 n
+0000215704 00000 n
+0000215854 00000 n
+0000216005 00000 n
+0000216156 00000 n
+0000216307 00000 n
+0000216458 00000 n
+0000216609 00000 n
+0000216760 00000 n
+0000216911 00000 n
+0000217061 00000 n
+0000217211 00000 n
+0000217362 00000 n
+0000217513 00000 n
+0000217664 00000 n
+0000217815 00000 n
+0000217966 00000 n
+0000218117 00000 n
+0000218267 00000 n
+0000218416 00000 n
+0000218566 00000 n
+0000218717 00000 n
+0000218868 00000 n
+0000219019 00000 n
+0000219170 00000 n
+0000219321 00000 n
+0000219472 00000 n
+0000219623 00000 n
+0000219774 00000 n
+0000219924 00000 n
+0000220075 00000 n
+0000220226 00000 n
+0000220377 00000 n
+0000220528 00000 n
+0000220678 00000 n
+0000220829 00000 n
+0000220979 00000 n
+0000221130 00000 n
+0000221280 00000 n
+0000221431 00000 n
+0000221582 00000 n
+0000221733 00000 n
+0000221883 00000 n
+0000222032 00000 n
+0000222182 00000 n
+0000222333 00000 n
+0000222484 00000 n
+0000222635 00000 n
+0000222786 00000 n
+0000222937 00000 n
+0000223088 00000 n
+0000223238 00000 n
+0000223387 00000 n
+0000225596 00000 n
+0000223599 00000 n
+0000212551 00000 n
+0000211312 00000 n
+0000223536 00000 n
+0000225747 00000 n
+0000225897 00000 n
+0000226047 00000 n
+0000226198 00000 n
+0000226347 00000 n
+0000226498 00000 n
+0000226649 00000 n
+0000226799 00000 n
+0000226950 00000 n
+0000227101 00000 n
+0000227251 00000 n
+0000227402 00000 n
+0000227553 00000 n
+0000227704 00000 n
+0000227855 00000 n
+0000228004 00000 n
+0000228154 00000 n
+0000228305 00000 n
+0000228456 00000 n
+0000228607 00000 n
+0000228758 00000 n
+0000228908 00000 n
+0000229059 00000 n
+0000229210 00000 n
+0000229361 00000 n
+0000229511 00000 n
+0000229662 00000 n
+0000229813 00000 n
+0000229962 00000 n
+0000230111 00000 n
+0000230262 00000 n
+0000230412 00000 n
+0000230563 00000 n
+0000230714 00000 n
+0000230865 00000 n
+0000231016 00000 n
+0000231167 00000 n
+0000231318 00000 n
+0000231469 00000 n
+0000231620 00000 n
+0000231771 00000 n
+0000231922 00000 n
+0000232073 00000 n
+0000232224 00000 n
+0000232375 00000 n
+0000232526 00000 n
+0000232675 00000 n
+0000232825 00000 n
+0000232975 00000 n
+0000233125 00000 n
+0000233275 00000 n
+0000233426 00000 n
+0000233576 00000 n
+0000233727 00000 n
+0000233877 00000 n
+0000234026 00000 n
+0000234175 00000 n
+0000234326 00000 n
+0000234476 00000 n
+0000234627 00000 n
+0000234777 00000 n
+0000234928 00000 n
+0000235078 00000 n
+0000235229 00000 n
+0000235379 00000 n
+0000235530 00000 n
+0000235681 00000 n
+0000235832 00000 n
+0000235983 00000 n
+0000236132 00000 n
+0000236282 00000 n
+0000236433 00000 n
+0000236582 00000 n
+0000236733 00000 n
+0000236883 00000 n
+0000237097 00000 n
+0000224777 00000 n
+0000223698 00000 n
+0000237034 00000 n
+0000325865 00000 n
+0000237196 00000 n
+0000237316 00000 n
+0000237788 00000 n
+0000238261 00000 n
+0000238297 00000 n
+0000238689 00000 n
+0000239349 00000 n
+0000239950 00000 n
+0000240491 00000 n
+0000241157 00000 n
+0000242966 00000 n
+0000243201 00000 n
+0000244774 00000 n
+0000245024 00000 n
+0000263016 00000 n
+0000263546 00000 n
+0000275503 00000 n
+0000275939 00000 n
+0000289102 00000 n
+0000289557 00000 n
+0000297688 00000 n
+0000297976 00000 n
+0000306239 00000 n
+0000306540 00000 n
+0000318919 00000 n
+0000319554 00000 n
+0000325562 00000 n
+0000328985 00000 n
+0000329105 00000 n
+0000329204 00000 n
+0000329277 00000 n
+0000341530 00000 n
+0000341713 00000 n
+0000342099 00000 n
+0000342605 00000 n
+0000343050 00000 n
+0000343501 00000 n
+0000344077 00000 n
+0000344586 00000 n
+0000345076 00000 n
+0000345568 00000 n
+0000346059 00000 n
+0000346619 00000 n
+0000347180 00000 n
+0000347741 00000 n
+0000348301 00000 n
+0000349032 00000 n
+0000349865 00000 n
+0000350698 00000 n
+0000351303 00000 n
+0000351575 00000 n
+0000351799 00000 n
+0000351970 00000 n
+0000352140 00000 n
+0000352313 00000 n
+0000352488 00000 n
+0000352665 00000 n
+0000352840 00000 n
+0000353008 00000 n
+0000353202 00000 n
+0000353408 00000 n
+0000353603 00000 n
+0000353799 00000 n
+0000353999 00000 n
+0000354201 00000 n
+0000354508 00000 n
+0000354867 00000 n
+0000355111 00000 n
+0000355354 00000 n
+0000355597 00000 n
+0000355840 00000 n
+0000356121 00000 n
+0000356404 00000 n
+0000356687 00000 n
+0000356970 00000 n
+0000357256 00000 n
+0000357547 00000 n
+0000357837 00000 n
+0000358124 00000 n
+0000358407 00000 n
+0000358690 00000 n
+0000358973 00000 n
+0000359256 00000 n
+0000359505 00000 n
+0000359700 00000 n
+0000359898 00000 n
+0000360099 00000 n
+0000360298 00000 n
+0000360499 00000 n
+0000360698 00000 n
+0000360890 00000 n
+0000360977 00000 n
+0000361145 00000 n
+0000361359 00000 n
+0000361534 00000 n
+0000361663 00000 n
+0000361782 00000 n
+0000361910 00000 n
+0000362049 00000 n
+0000362193 00000 n
+0000362326 00000 n
+0000362447 00000 n
+0000362574 00000 n
+0000362683 00000 n
+0000362767 00000 n
+0000362807 00000 n
+0000363007 00000 n
trailer
<< /Size 1562
/Root 1560 0 R
/Info 1561 0 R
-/ID [<0CF6A151112D8671651F0CC4C7122EBE> <0CF6A151112D8671651F0CC4C7122EBE>] >>
+/ID [<66BFFE03FB2447F25C17B2469142EE98> <66BFFE03FB2447F25C17B2469142EE98>] >>
startxref
-363411
+363339
%%EOF
diff --git a/openmp/runtime/src/dllexports b/openmp/runtime/src/dllexports
index cfcbdeb92f5..779f1d43cd2 100644
--- a/openmp/runtime/src/dllexports
+++ b/openmp/runtime/src/dllexports
@@ -357,6 +357,9 @@ kmpc_set_defaults 224
__kmpc_fork_teams 241
__kmpc_omp_task_with_deps 242
__kmpc_omp_wait_deps 243
+ __kmpc_cancel 244
+ __kmpc_cancellationpoint 245
+ __kmpc_cancel_barrier 246
%endif # OMP_40
%endif
@@ -455,6 +458,8 @@ kmp_set_warnings_off 780
#omp_curr_proc_bind 864
omp_get_num_teams 865
omp_get_team_num 866
+ omp_get_cancellation 867
+ kmp_get_cancellation_status 868
%endif # OMP_40
%ifndef stub
diff --git a/openmp/runtime/src/exports_so.txt b/openmp/runtime/src/exports_so.txt
index 4ddf575d1ac..9ace78fd549 100644
--- a/openmp/runtime/src/exports_so.txt
+++ b/openmp/runtime/src/exports_so.txt
@@ -80,4 +80,26 @@ VERSION {
}; # VERSION
+# sets up GCC OMP_ version dependency chain
+OMP_1.0 {
+};
+OMP_2.0 {
+} OMP_1.0;
+OMP_3.0 {
+} OMP_2.0;
+OMP_3.1 {
+} OMP_3.0;
+OMP_4.0 {
+} OMP_3.1;
+
+# sets up GCC GOMP_ version dependency chain
+GOMP_1.0 {
+};
+GOMP_2.0 {
+} GOMP_1.0;
+GOMP_3.0 {
+} GOMP_2.0;
+GOMP_4.0 {
+} GOMP_3.0;
+
# end of file #
diff --git a/openmp/runtime/src/include/40/iomp.h.var b/openmp/runtime/src/include/40/iomp.h.var
index 88b74f35b79..8aeb38c3bc2 100644
--- a/openmp/runtime/src/include/40/iomp.h.var
+++ b/openmp/runtime/src/include/40/iomp.h.var
@@ -82,6 +82,16 @@
extern void __KAI_KMPC_CONVENTION kmp_set_warnings_on(void);
extern void __KAI_KMPC_CONVENTION kmp_set_warnings_off(void);
+ /* schedule kind constants */
+ typedef enum kmp_cancel_kind_t {
+ kmp_cancel_parallel = 1,
+ kmp_cancel_loop = 2,
+ kmp_cancel_sections = 3,
+ kmp_cancel_taskgroup = 4
+ } kmp_cancel_kind_t;
+
+ extern int __KAI_KMPC_CONVENTION kmp_get_cancellation_status(kmp_cancel_kind_t);
+
# undef __KAI_KMPC_CONVENTION
/* Warning:
diff --git a/openmp/runtime/src/include/40/omp.h.var b/openmp/runtime/src/include/40/omp.h.var
index 38400d418b1..c6dd4cd4ee1 100644
--- a/openmp/runtime/src/include/40/omp.h.var
+++ b/openmp/runtime/src/include/40/omp.h.var
@@ -27,30 +27,6 @@
extern "C" {
# endif
-# define omp_set_num_threads ompc_set_num_threads
-# define omp_set_dynamic ompc_set_dynamic
-# define omp_set_nested ompc_set_nested
-# define omp_set_max_active_levels ompc_set_max_active_levels
-# define omp_set_schedule ompc_set_schedule
-# define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
-# define omp_get_team_size ompc_get_team_size
-
-
-# define kmp_set_stacksize kmpc_set_stacksize
-# define kmp_set_stacksize_s kmpc_set_stacksize_s
-# define kmp_set_blocktime kmpc_set_blocktime
-# define kmp_set_library kmpc_set_library
-# define kmp_set_defaults kmpc_set_defaults
-# define kmp_set_affinity_mask_proc kmpc_set_affinity_mask_proc
-# define kmp_unset_affinity_mask_proc kmpc_unset_affinity_mask_proc
-# define kmp_get_affinity_mask_proc kmpc_get_affinity_mask_proc
-
-# define kmp_malloc kmpc_malloc
-# define kmp_calloc kmpc_calloc
-# define kmp_realloc kmpc_realloc
-# define kmp_free kmpc_free
-
-
# if defined(_WIN32)
# define __KAI_KMPC_CONVENTION __cdecl
# else
@@ -120,6 +96,7 @@
extern int __KAI_KMPC_CONVENTION omp_get_num_devices (void);
extern int __KAI_KMPC_CONVENTION omp_get_num_teams (void);
extern int __KAI_KMPC_CONVENTION omp_get_team_num (void);
+ extern int __KAI_KMPC_CONVENTION omp_get_cancellation (void);
# include <stdlib.h>
/* kmp API functions */
diff --git a/openmp/runtime/src/include/40/omp_lib.f.var b/openmp/runtime/src/include/40/omp_lib.f.var
index 0adadb10260..fb9b2f28da4 100644
--- a/openmp/runtime/src/include/40/omp_lib.f.var
+++ b/openmp/runtime/src/include/40/omp_lib.f.var
@@ -32,6 +32,7 @@
integer, parameter :: kmp_pointer_kind = int_ptr_kind()
integer, parameter :: kmp_size_t_kind = int_ptr_kind()
integer, parameter :: kmp_affinity_mask_kind = int_ptr_kind()
+ integer, parameter :: kmp_cancel_kind = omp_integer_kind
end module omp_lib_kinds
@@ -56,6 +57,11 @@
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4
+
interface
! ***
@@ -199,6 +205,11 @@
integer (kind=omp_integer_kind) omp_get_team_num
end function omp_get_team_num
+ function omp_get_cancellation()
+ use omp_lib_kinds
+ integer (kind=omp_integer_kind) omp_get_cancellation
+ end function omp_get_cancellation
+
subroutine omp_init_lock(lockvar)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_lock
@@ -417,6 +428,11 @@
subroutine kmp_set_warnings_off()
end subroutine kmp_set_warnings_off
+ function kmp_get_cancellation_status(cancelkind)
+ use omp_lib_kinds
+ integer (kind=kmp_cancel_kind) cancelkind
+ logical (kind=omp_logical_kind) kmp_get_cancellation_status
+ end function kmp_get_cancellation_status
end interface
!dec$ if defined(_WIN32)
@@ -459,6 +475,7 @@
!dec$ attributes alias:'OMP_GET_NUM_DEVICES' :: omp_get_num_devices
!dec$ attributes alias:'OMP_GET_NUM_TEAMS' :: omp_get_num_teams
!dec$ attributes alias:'OMP_GET_TEAM_NUM' :: omp_get_team_num
+!dec$ attributes alias:'OMP_GET_CANCELLATION' :: omp_get_cancellation
!dec$ attributes alias:'omp_init_lock' :: omp_init_lock
!dec$ attributes alias:'omp_destroy_lock' :: omp_destroy_lock
@@ -498,6 +515,8 @@
!dec$ attributes alias:'KMP_SET_WARNINGS_ON'::kmp_set_warnings_on
!dec$ attributes alias:'KMP_SET_WARNINGS_OFF'::kmp_set_warnings_off
+!dec$ attributes alias:'KMP_GET_CANCELLATION_STATUS' :: kmp_get_cancellation_status
+
!dec$ else
!***
@@ -531,6 +550,7 @@
!dec$ attributes alias:'_OMP_GET_NUM_DEVICES' :: omp_get_num_devices
!dec$ attributes alias:'_OMP_GET_NUM_TEAMS' :: omp_get_num_teams
!dec$ attributes alias:'_OMP_GET_TEAM_NUM' :: omp_get_team_num
+!dec$ attributes alias:'_OMP_GET_CANCELLATION' :: omp_get_cancellation
!dec$ attributes alias:'_omp_init_lock' :: omp_init_lock
!dec$ attributes alias:'_omp_destroy_lock' :: omp_destroy_lock
@@ -570,6 +590,8 @@
!dec$ attributes alias:'_KMP_SET_WARNINGS_ON'::kmp_set_warnings_on
!dec$ attributes alias:'_KMP_SET_WARNINGS_OFF'::kmp_set_warnings_off
+!dec$ attributes alias:'_KMP_GET_CANCELLATION_STATUS' :: kmp_get_cancellation_status
+
!dec$ endif
!dec$ endif
@@ -606,6 +628,7 @@
!dec$ attributes alias:'omp_get_num_devices_'::omp_get_num_devices
!dec$ attributes alias:'omp_get_num_teams_'::omp_get_num_teams
!dec$ attributes alias:'omp_get_team_num_'::omp_get_team_num
+!dec$ attributes alias:'omp_get_cancellation_'::omp_get_cancellation
!dec$ attributes alias:'omp_init_lock_'::omp_init_lock
!dec$ attributes alias:'omp_destroy_lock_'::omp_destroy_lock
@@ -644,6 +667,7 @@
!dec$ attributes alias:'kmp_set_warnings_on_'::kmp_set_warnings_on
!dec$ attributes alias:'kmp_set_warnings_off_'::kmp_set_warnings_off
+!dec$ attributes alias:'kmp_get_cancellation_status_'::kmp_get_cancellation_status
!dec$ endif
@@ -678,6 +702,7 @@
!dec$ attributes alias:'_omp_get_wtick_'::omp_get_wtick
!dec$ attributes alias:'_omp_get_num_teams_'::omp_get_num_teams
!dec$ attributes alias:'_omp_get_team_num_'::omp_get_team_num
+!dec$ attributes alias:'_omp_get_cancellation_'::omp_get_cancellation
!dec$ attributes alias:'_omp_init_lock_'::omp_init_lock
!dec$ attributes alias:'_omp_destroy_lock_'::omp_destroy_lock
@@ -717,6 +742,8 @@
!dec$ attributes alias:'_kmp_set_warnings_on_'::kmp_set_warnings_on
!dec$ attributes alias:'_kmp_set_warnings_off_'::kmp_set_warnings_off
+!dec$ attributes alias:'_kmp_get_cancellation_status_'::kmp_get_cancellation_status
+
!dec$ endif
end module omp_lib
diff --git a/openmp/runtime/src/include/40/omp_lib.f90.var b/openmp/runtime/src/include/40/omp_lib.f90.var
index 5cac259b49e..f78535212ca 100644
--- a/openmp/runtime/src/include/40/omp_lib.f90.var
+++ b/openmp/runtime/src/include/40/omp_lib.f90.var
@@ -28,6 +28,7 @@
integer, parameter :: kmp_pointer_kind = c_intptr_t
integer, parameter :: kmp_size_t_kind = c_size_t
integer, parameter :: kmp_affinity_mask_kind = c_intptr_t
+ integer, parameter :: kmp_cancel_kind = omp_integer_kind
end module omp_lib_kinds
@@ -47,12 +48,18 @@
integer(kind=omp_sched_kind), parameter :: omp_sched_guided = 3
integer(kind=omp_sched_kind), parameter :: omp_sched_auto = 4
+
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_false = 0
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_true = 1
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_master = 2
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3
+ integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4
+
interface
! ***
@@ -198,6 +205,11 @@
integer (kind=omp_integer_kind) omp_get_team_num
end function omp_get_team_num
+ function omp_get_cancellation() bind(c)
+ use omp_lib_kinds
+ integer (kind=omp_integer_kind) omp_get_cancellation
+ end function omp_get_cancellation
+
subroutine omp_init_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_lock
@@ -417,6 +429,12 @@
subroutine kmp_set_warnings_off() bind(c)
end subroutine kmp_set_warnings_off
+ function kmp_get_cancellation_status(cancelkind) bind(c)
+ use omp_lib_kinds
+ integer (kind=kmp_cancel_kind), value :: cancelkind
+ logical (kind=omp_logical_kind) kmp_get_cancellation_status
+ end function kmp_get_cancellation_status
+
end interface
end module omp_lib
diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h
index 7117571e76d..37c7f41bdc4 100644
--- a/openmp/runtime/src/kmp.h
+++ b/openmp/runtime/src/kmp.h
@@ -1,8 +1,8 @@
/*! \file */
/*
* kmp.h -- KPTS runtime header file.
- * $Revision: 42642 $
- * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $
+ * $Revision: 42816 $
+ * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
*/
@@ -26,10 +26,6 @@
*/
//#define FIX_SGI_CLOCK
-#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER )
-typedef __float128 _Quad;
-#endif
-
/* Defines for OpenMP 3.0 tasking and auto scheduling */
#if OMP_30_ENABLED
@@ -81,9 +77,12 @@ typedef __float128 _Quad;
#include <errno.h>
+#include "kmp_os.h"
+
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
#include <xmmintrin.h>
+#endif
-#include "kmp_os.h"
#include "kmp_version.h"
#include "kmp_debug.h"
#include "kmp_lock.h"
@@ -188,7 +187,7 @@ typedef struct ident {
/* contextual information. */
#endif /* USE_ITT_BUILD */
kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */
- char *psource; /**< String describing the source location.
+ char const *psource; /**< String describing the source location.
The string is composed of semi-colon separated fields which describe the source file,
the function and a pair of line numbers that delimit the construct.
*/
@@ -231,6 +230,13 @@ extern "C" {
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
+#define KMP_MAX( x, y ) ( (x) > (y) ? (x) : (y) )
+#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) )
+
+/* ------------------------------------------------------------------------ */
+/* ------------------------------------------------------------------------ */
+
+
/* Enumeration types */
enum kmp_state_timer {
@@ -752,6 +758,16 @@ extern int __kmp_affinity_num_places;
#endif /* OMP_40_ENABLED */
+#if OMP_40_ENABLED
+typedef enum kmp_cancel_kind_t {
+ cancel_noreq = 0,
+ cancel_parallel = 1,
+ cancel_loop = 2,
+ cancel_sections = 3,
+ cancel_taskgroup = 4
+} kmp_cancel_kind_t;
+#endif // OMP_40_ENABLED
+
#if KMP_MIC
extern unsigned int __kmp_place_num_cores;
extern unsigned int __kmp_place_num_threads_per_core;
@@ -777,7 +793,7 @@ extern unsigned int __kmp_place_core_offset;
#define __kmp_entry_gtid() __kmp_get_global_thread_id_reg()
#define __kmp_tid_from_gtid(gtid) ( KMP_DEBUG_ASSERT( (gtid) >= 0 ), \
- /*(__kmp_threads[ (gtid) ]->th.th_team_serialized) ? 0 : /* TODO remove this check, it is redundant */ \
+ /*(__kmp_threads[ (gtid) ]->th.th_team_serialized) ? 0 : */ /* TODO remove this check, it is redundant */ \
__kmp_threads[ (gtid) ]->th.th_info.ds.ds_tid )
#define __kmp_get_tid() ( __kmp_tid_from_gtid( __kmp_get_gtid() ) )
@@ -1078,14 +1094,6 @@ extern kmp_key_t __kmp_tv_key;
#endif /* BUILD_TV */
/* ------------------------------------------------------------------------ */
-// Some forward declarations.
-
-typedef union kmp_team kmp_team_t;
-typedef struct kmp_taskdata kmp_taskdata_t;
-typedef union kmp_task_team kmp_task_team_t;
-typedef union kmp_team kmp_team_p;
-typedef union kmp_info kmp_info_p;
-typedef union kmp_root kmp_root_p;
#if USE_ITT_BUILD
// We cannot include "kmp_itt.h" due to circular dependency. Declare the only required type here.
@@ -1883,8 +1891,12 @@ typedef struct kmp_task { /* GEH: Shouldn't this be aligned so
void * shareds; /**< pointer to block of pointers to shared vars */
kmp_routine_entry_t routine; /**< pointer to routine to call for executing task */
kmp_int32 part_id; /**< part id for the task */
+#if OMP_40_ENABLED
+ kmp_routine_entry_t destructors; /* pointer to function to invoke deconstructors of firstprivate C++ objects */
+#endif // OMP_40_ENABLED
/* private vars */
} kmp_task_t;
+
/*!
@}
*/
@@ -1892,6 +1904,7 @@ typedef struct kmp_task { /* GEH: Shouldn't this be aligned so
#if OMP_40_ENABLED
typedef struct kmp_taskgroup {
kmp_uint32 count; // number of allocated and not yet complete tasks
+ kmp_int32 cancel_request; // request for cancellation of this taskgroup
struct kmp_taskgroup *parent; // parent taskgroup
} kmp_taskgroup_t;
@@ -1974,7 +1987,12 @@ typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 b
unsigned tiedness : 1; /* task is either tied (1) or untied (0) */
unsigned final : 1; /* task is final(1) so execute immediately */
unsigned merged_if0 : 1; /* no __kmpc_task_{begin/complete}_if0 calls in if0 code path */
- unsigned reserved13 : 13; /* reserved for compiler use */
+#if OMP_40_ENABLED
+ unsigned destructors_thunk : 1; /* set if the compiler creates a thunk to invoke destructors from the runtime */
+ unsigned reserved : 12; /* reserved for compiler use */
+#else // OMP_40_ENABLED
+ unsigned reserved : 13; /* reserved for compiler use */
+#endif // OMP_40_ENABLED
/* Library flags */ /* Total library flags must be 16 bits */
unsigned tasktype : 1; /* task is either explicit(1) or implicit (0) */
@@ -2014,7 +2032,11 @@ struct kmp_taskdata { /* aligned during dynamic
kmp_dephash_t * td_dephash; // Dependencies for children tasks are tracked from here
kmp_depnode_t * td_depnode; // Pointer to graph node if this task has dependencies
#endif
+#if KMP_HAVE_QUAD
_Quad td_dummy; // Align structure 16-byte size since allocated just before kmp_task_t
+#else
+ kmp_uint32 td_dummy[2];
+#endif
}; // struct kmp_taskdata
// Make sure padding above worked
@@ -2121,6 +2143,8 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
int th_team_bt_intervals;
int th_team_bt_set;
+ kmp_internal_control_t th_fixed_icvs; /* Initial ICVs for the thread */
+
#if KMP_OS_WINDOWS || KMP_OS_LINUX
kmp_affin_mask_t *th_affin_mask; /* thread's current affinity mask */
@@ -2142,6 +2166,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
# endif
#endif
#if USE_ITT_BUILD
+ kmp_uint64 th_bar_arrive_time; /* arrival to barrier timestamp */
kmp_uint64 th_frame_time; /* frame timestamp */
kmp_uint64 th_frame_time_serialized; /* frame timestamp in serialized parallel */
#endif /* USE_ITT_BUILD */
@@ -2328,15 +2353,6 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
kmp_uint32 t_mxcsr;
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
-#if KMP_BARRIER_ICV_PULL
- //
- // Note: Putting ICV's before the fp control info causes a very slight
- // ~1% improvement for EPCC parallel on fxe256lin01 / 256 threads, but
- // causes a 17% regression on fxe64lin01 / 64 threads.
- //
- kmp_internal_control_t t_initial_icvs;
-#endif // KMP_BARRIER_ICV_PULL
-
#if (KMP_PERF_V106 == KMP_ON)
void *t_inline_argv[ KMP_INLINE_ARGV_ENTRIES ];
#endif
@@ -2398,6 +2414,9 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
kmp_internal_control_t *t_control_stack_top; /* internal control stack for additional nested teams.
for SERIALIZED teams nested 2 or more levels deep */
+#if OMP_40_ENABLED
+ kmp_int32 t_cancel_request; /* typed flag to store request state of cancellation */
+#endif
int t_master_active;/* save on fork, restore on join */
kmp_taskq_t t_taskq; /* this team's task queue */
@@ -2479,8 +2498,6 @@ extern int __kmp_duplicate_library_ok;
#if USE_ITT_BUILD
extern int __kmp_forkjoin_frames;
extern int __kmp_forkjoin_frames_mode;
-extern FILE * __kmp_itt_csv_file;
-extern kmp_str_buf_t __kmp_itt_frame_buffer;
#endif
extern PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method;
extern int __kmp_determ_red;
@@ -2526,9 +2543,6 @@ extern int __kmp_storage_map_verbose; /* True means storage map includes pl
extern int __kmp_storage_map_verbose_specified;
extern kmp_cpuinfo_t __kmp_cpuinfo;
-extern kmp_uint64 __kmp_cpu_frequency;
- // CPU frequency, in Hz. Set by __kmp_runtime_initialize(). 0 means "is not set yet",
- // ~ 0 signals an errror.
extern volatile int __kmp_init_serial;
extern volatile int __kmp_init_gtid;
@@ -2678,13 +2692,13 @@ extern double __kmp_load_balance_interval; /* Interval for the load balan
# endif /* USE_LOAD_BALANCE */
// OpenMP 3.1 - Nested num threads array
-struct kmp_nested_nthreads_t {
+typedef struct kmp_nested_nthreads_t {
int * nth;
int size;
int used;
-};
+} kmp_nested_nthreads_t;
-extern struct kmp_nested_nthreads_t __kmp_nested_nth;
+extern kmp_nested_nthreads_t __kmp_nested_nth;
#if KMP_USE_ADAPTIVE_LOCKS
@@ -2707,6 +2721,7 @@ extern char * __kmp_speculative_statsfile;
#if OMP_40_ENABLED
extern int __kmp_display_env; /* TRUE or FALSE */
extern int __kmp_display_env_verbose; /* TRUE if OMP_DISPLAY_ENV=VERBOSE */
+extern int __kmp_omp_cancellation; /* TRUE or FALSE */
#endif
/* ------------------------------------------------------------------------- */
@@ -2796,7 +2811,7 @@ extern void __kmp_warn( char const * format, ... );
extern void __kmp_set_num_threads( int new_nth, int gtid );
// Returns current thread (pointer to kmp_info_t). Current thread *must* be registered.
-inline kmp_info_t * __kmp_entry_thread()
+static inline kmp_info_t * __kmp_entry_thread()
{
int gtid = __kmp_entry_gtid();
@@ -2976,11 +2991,11 @@ extern void __kmp_balanced_affinity( int tid, int team_size );
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
extern int __kmp_futex_determine_capable( void );
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
extern void __kmp_gtid_set_specific( int gtid );
extern int __kmp_gtid_get_specific( void );
@@ -3067,7 +3082,7 @@ extern void __kmp_end_split_barrier ( enum barrier_type bt, int gtid );
extern int __kmp_fork_call( ident_t *loc, int gtid, int exec_master,
kmp_int32 argc, microtask_t microtask, launch_t invoker,
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_ARM || KMP_ARCH_X86_64) && KMP_OS_LINUX
va_list *ap
#else
va_list ap
@@ -3120,7 +3135,7 @@ extern int __kmp_execute_tasks( kmp_info_t *thread, kmp_int32 gtid, volatile km
#if USE_ITT_BUILD
void * itt_sync_obj,
#endif /* USE_ITT_BUILD */
- int c = 0 );
+ int c );
extern void __kmp_reap_task_teams( void );
extern void __kmp_unref_task_team( kmp_task_team_t *task_team, kmp_info_t *thread );
extern void __kmp_wait_to_unref_task_teams( void );
@@ -3138,6 +3153,9 @@ extern void __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gti
extern int __kmp_is_address_mapped( void *addr );
extern kmp_uint64 __kmp_hardware_timestamp(void);
+#if KMP_OS_UNIX
+extern int __kmp_read_from_file( char const *path, char const *format, ... );
+#endif
/* ------------------------------------------------------------------------ */
//
@@ -3148,7 +3166,7 @@ extern kmp_uint64 __kmp_hardware_timestamp(void);
extern void __kmp_query_cpuid( kmp_cpuinfo_t *p );
-static inline void __kmp_load_mxcsr ( kmp_uint32 *p ) { _mm_setcsr( *p ); }
+#define __kmp_load_mxcsr(p) _mm_setcsr(*(p))
static inline void __kmp_store_mxcsr( kmp_uint32 *p ) { *p = _mm_getcsr(); }
extern void __kmp_load_x87_fpu_control_word( kmp_int16 *p );
@@ -3258,8 +3276,8 @@ void __kmpc_omp_task_complete( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *tas
#endif // OMP_30_ENABLED
#if OMP_40_ENABLED
-KMP_EXPORT void __kmpc_taskgroup( ident* loc, int gtid );
-KMP_EXPORT void __kmpc_end_taskgroup( ident* loc, int gtid );
+KMP_EXPORT void __kmpc_taskgroup( ident_t * loc, int gtid );
+KMP_EXPORT void __kmpc_end_taskgroup( ident_t * loc, int gtid );
KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task,
kmp_int32 ndeps, kmp_depend_info_t *dep_list,
@@ -3270,6 +3288,13 @@ extern void __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task );
#endif
+#if OMP_40_ENABLED
+KMP_EXPORT kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind);
+KMP_EXPORT kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind);
+KMP_EXPORT kmp_int32 __kmpc_cancel_barrier(ident_t* loc_ref, kmp_int32 gtid);
+KMP_EXPORT int __kmp_get_cancellation_status(int cancel_kind);
+#endif
+
/*
* Lock interface routines (fast versions with gtid passed in)
*/
@@ -3355,6 +3380,42 @@ kmp_threadprivate_insert_private_data( int gtid, void *pc_addr, void *data_addr,
struct private_common *
kmp_threadprivate_insert( int gtid, void *pc_addr, void *data_addr, size_t pc_size );
+//
+// ompc_, kmpc_ entries moved from omp.h.
+//
+#if KMP_OS_WINDOWS
+# define KMPC_CONVENTION __cdecl
+#else
+# define KMPC_CONVENTION
+#endif
+
+#if OMP_30_ENABLED
+
+#ifndef __OMP_H
+typedef enum omp_sched_t {
+ omp_sched_static = 1,
+ omp_sched_dynamic = 2,
+ omp_sched_guided = 3,
+ omp_sched_auto = 4
+} omp_sched_t;
+typedef void * kmp_affinity_mask_t;
+#endif
+
+KMP_EXPORT void KMPC_CONVENTION ompc_set_max_active_levels(int);
+KMP_EXPORT void KMPC_CONVENTION ompc_set_schedule(omp_sched_t, int);
+KMP_EXPORT int KMPC_CONVENTION ompc_get_ancestor_thread_num(int);
+KMP_EXPORT int KMPC_CONVENTION ompc_get_team_size(int);
+KMP_EXPORT int KMPC_CONVENTION kmpc_set_affinity_mask_proc(int, kmp_affinity_mask_t *);
+KMP_EXPORT int KMPC_CONVENTION kmpc_unset_affinity_mask_proc(int, kmp_affinity_mask_t *);
+KMP_EXPORT int KMPC_CONVENTION kmpc_get_affinity_mask_proc(int, kmp_affinity_mask_t *);
+
+#endif // OMP_30_ENABLED
+
+KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize(int);
+KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize_s(size_t);
+KMP_EXPORT void KMPC_CONVENTION kmpc_set_library(int);
+KMP_EXPORT void KMPC_CONVENTION kmpc_set_defaults(char const *);
+
#ifdef __cplusplus
}
#endif
diff --git a/openmp/runtime/src/kmp_affinity.cpp b/openmp/runtime/src/kmp_affinity.cpp
index 0840fa3fd8d..644251da4b5 100644
--- a/openmp/runtime/src/kmp_affinity.cpp
+++ b/openmp/runtime/src/kmp_affinity.cpp
@@ -1,7 +1,7 @@
/*
* kmp_affinity.cpp -- affinity management
- * $Revision: 42613 $
- * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -1885,7 +1885,19 @@ __kmp_affinity_create_cpuinfo_map(AddrUnsPair **address2os, int *line,
if ((p == NULL) || (sscanf(p + 1, "%u\n", &val) != 1)) goto no_val;
if (threadInfo[num_avail][osIdIndex] != UINT_MAX) goto dup_field;
threadInfo[num_avail][osIdIndex] = val;
+#if KMP_OS_LINUX && USE_SYSFS_INFO
+ char path[256];
+ snprintf(path, sizeof(path),
+ "/sys/devices/system/cpu/cpu%u/topology/physical_package_id",
+ threadInfo[num_avail][osIdIndex]);
+ __kmp_read_from_file(path, "%u", &threadInfo[num_avail][pkgIdIndex]);
+
+ snprintf(path, sizeof(path),
+ "/sys/devices/system/cpu/cpu%u/topology/core_id",
+ threadInfo[num_avail][osIdIndex]);
+ __kmp_read_from_file(path, "%u", &threadInfo[num_avail][coreIdIndex]);
continue;
+#else
}
char s2[] = "physical id";
if (strncmp(buf, s2, sizeof(s2) - 1) == 0) {
@@ -1906,6 +1918,7 @@ __kmp_affinity_create_cpuinfo_map(AddrUnsPair **address2os, int *line,
if (threadInfo[num_avail][coreIdIndex] != UINT_MAX) goto dup_field;
threadInfo[num_avail][coreIdIndex] = val;
continue;
+#endif // KMP_OS_LINUX && USE_SYSFS_INFO
}
char s4[] = "thread id";
if (strncmp(buf, s4, sizeof(s4) - 1) == 0) {
@@ -3058,8 +3071,6 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
int setSize = 0;
for (;;) {
- int start, count, stride;
-
__kmp_process_place(&scan, osId2Mask, maxOsId, tempMask, &setSize);
//
@@ -3090,7 +3101,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
"bad explicit places list");
next = scan;
SKIP_DIGITS(next);
- count = __kmp_str_to_int(scan, *next);
+ int count = __kmp_str_to_int(scan, *next);
KMP_ASSERT(count >= 0);
scan = next;
@@ -3112,7 +3123,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
// Use a temp var in case macro is changed to evaluate
// args multiple times.
//
- if (KMP_CPU_ISSET(j - stride, tempMask)) {
+ if (KMP_CPU_ISSET(j - 1, tempMask)) {
KMP_CPU_SET(j, tempMask);
setSize++;
}
@@ -3159,7 +3170,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
"bad explicit places list");
next = scan;
SKIP_DIGITS(next);
- stride = __kmp_str_to_int(scan, *next);
+ int stride = __kmp_str_to_int(scan, *next);
KMP_DEBUG_ASSERT(stride >= 0);
scan = next;
stride *= sign;
diff --git a/openmp/runtime/src/kmp_alloc.c b/openmp/runtime/src/kmp_alloc.c
index 30ab4bd3724..885754fd006 100644
--- a/openmp/runtime/src/kmp_alloc.c
+++ b/openmp/runtime/src/kmp_alloc.c
@@ -1,7 +1,7 @@
/*
* kmp_alloc.c -- private/shared dyanmic memory allocation and management
- * $Revision: 42613 $
- * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -31,7 +31,7 @@ typedef void (*bget_release_t)(void *);
/* NOTE: bufsize must be a signed datatype */
#if KMP_OS_WINDOWS
-# if KMP_ARCH_X86
+# if KMP_ARCH_X86 || KMP_ARCH_ARM
typedef kmp_int32 bufsize;
# else
typedef kmp_int64 bufsize;
@@ -74,7 +74,7 @@ static int bpoolv( kmp_info_t *th, void *pool);
malloc() does not
ensure 16 byte alignmnent */
-#if KMP_ARCH_X86
+#if KMP_ARCH_X86 || !KMP_HAVE_QUAD
#define SizeQuant 8
#define AlignType double
diff --git a/openmp/runtime/src/kmp_atomic.c b/openmp/runtime/src/kmp_atomic.c
index 547aad550a1..3e9c82f874f 100644
--- a/openmp/runtime/src/kmp_atomic.c
+++ b/openmp/runtime/src/kmp_atomic.c
@@ -1,7 +1,7 @@
/*
* kmp_atomic.c -- ATOMIC implementation routines
- * $Revision: 42582 $
- * $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -574,7 +574,7 @@ kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user coded ato
*/
#define KMP_ATOMIC_VOLATILE volatile
-#if ( KMP_ARCH_X86 )
+#if ( KMP_ARCH_X86 ) && KMP_HAVE_QUAD
static inline void operator +=( Quad_a4_t & lhs, Quad_a4_t & rhs ) { lhs.q += rhs.q; };
static inline void operator -=( Quad_a4_t & lhs, Quad_a4_t & rhs ) { lhs.q -= rhs.q; };
@@ -608,7 +608,7 @@ kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user coded ato
/* ------------------------------------------------------------------------ */
// All routines declarations looks like
-// void __kmpc_atomic_RTYPE_OP( ident_t*, int*, TYPE *lhs, TYPE rhs );
+// void __kmpc_atomic_RTYPE_OP( ident_t*, int, TYPE *lhs, TYPE rhs );
// ------------------------------------------------------------------------
#define KMP_CHECK_GTID \
@@ -721,6 +721,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh
} \
}
+#if USE_CMPXCHG_FIX
// 2007-06-25:
// workaround for C78287 (complex(kind=4) data type)
// lin_32, lin_32e, win_32 and win_32e are affected (I verified the asm)
@@ -751,6 +752,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh
} \
}
// end of the first part of the workaround for C78287
+#endif // USE_CMPXCHG_FIX
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -775,6 +777,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
OP_CMPXCHG(TYPE,BITS,OP) \
}
+#if USE_CMPXCHG_FIX
// -------------------------------------------------------------------------
// workaround for C78287 (complex(kind=4) data type)
#define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
@@ -783,6 +786,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void)
OP_CMPXCHG_WORKAROUND(TYPE,BITS,OP) \
}
// end of the second part of the workaround for C78287
+#endif
#else
// -------------------------------------------------------------------------
@@ -820,6 +824,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \
} \
}
+#if USE_CMPXCHG_FIX
// -------------------------------------------------------------------------
// workaround for C78287 (complex(kind=4) data type)
#define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
@@ -833,6 +838,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void)
} \
}
// end of the second part of the workaround for C78287
+#endif // USE_CMPXCHG_FIX
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
// Routines for ATOMIC 4-byte operands addition and subtraction
@@ -1068,12 +1074,14 @@ MIN_MAX_COMPXCHG( float4, max, kmp_real32, 32, <, 4r, 3, KMP_ARCH_X86 ) // __km
MIN_MAX_COMPXCHG( float4, min, kmp_real32, 32, >, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_min
MIN_MAX_COMPXCHG( float8, max, kmp_real64, 64, <, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_max
MIN_MAX_COMPXCHG( float8, min, kmp_real64, 64, >, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_min
+#if KMP_HAVE_QUAD
MIN_MAX_CRITICAL( float16, max, QUAD_LEGACY, <, 16r, 1 ) // __kmpc_atomic_float16_max
MIN_MAX_CRITICAL( float16, min, QUAD_LEGACY, >, 16r, 1 ) // __kmpc_atomic_float16_min
#if ( KMP_ARCH_X86 )
MIN_MAX_CRITICAL( float16, max_a16, Quad_a16_t, <, 16r, 1 ) // __kmpc_atomic_float16_max_a16
MIN_MAX_CRITICAL( float16, min_a16, Quad_a16_t, >, 16r, 1 ) // __kmpc_atomic_float16_min_a16
#endif
+#endif
// ------------------------------------------------------------------------
// Need separate macros for .EQV. because of the need of complement (~)
// OP ignored for critical sections, ^=~ used instead
@@ -1135,6 +1143,7 @@ ATOMIC_CRITICAL( float10, add, long double, +, 10r, 1 ) // __km
ATOMIC_CRITICAL( float10, sub, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub
ATOMIC_CRITICAL( float10, mul, long double, *, 10r, 1 ) // __kmpc_atomic_float10_mul
ATOMIC_CRITICAL( float10, div, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div
+#if KMP_HAVE_QUAD
// routines for _Quad type
ATOMIC_CRITICAL( float16, add, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_add
ATOMIC_CRITICAL( float16, sub, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub
@@ -1146,14 +1155,22 @@ ATOMIC_CRITICAL( float16, div, QUAD_LEGACY, /, 16r, 1 ) // __km
ATOMIC_CRITICAL( float16, mul_a16, Quad_a16_t, *, 16r, 1 ) // __kmpc_atomic_float16_mul_a16
ATOMIC_CRITICAL( float16, div_a16, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16
#endif
+#endif
// routines for complex types
+#if USE_CMPXCHG_FIX
// workaround for C78287 (complex(kind=4) data type)
ATOMIC_CMPXCHG_WORKAROUND( cmplx4, add, kmp_cmplx32, 64, +, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_add
ATOMIC_CMPXCHG_WORKAROUND( cmplx4, sub, kmp_cmplx32, 64, -, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_sub
ATOMIC_CMPXCHG_WORKAROUND( cmplx4, mul, kmp_cmplx32, 64, *, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_mul
ATOMIC_CMPXCHG_WORKAROUND( cmplx4, div, kmp_cmplx32, 64, /, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_div
// end of the workaround for C78287
+#else
+ATOMIC_CRITICAL( cmplx4, add, kmp_cmplx32, +, 8c, 1 ) // __kmpc_atomic_cmplx4_add
+ATOMIC_CRITICAL( cmplx4, sub, kmp_cmplx32, -, 8c, 1 ) // __kmpc_atomic_cmplx4_sub
+ATOMIC_CRITICAL( cmplx4, mul, kmp_cmplx32, *, 8c, 1 ) // __kmpc_atomic_cmplx4_mul
+ATOMIC_CRITICAL( cmplx4, div, kmp_cmplx32, /, 8c, 1 ) // __kmpc_atomic_cmplx4_div
+#endif // USE_CMPXCHG_FIX
ATOMIC_CRITICAL( cmplx8, add, kmp_cmplx64, +, 16c, 1 ) // __kmpc_atomic_cmplx8_add
ATOMIC_CRITICAL( cmplx8, sub, kmp_cmplx64, -, 16c, 1 ) // __kmpc_atomic_cmplx8_sub
@@ -1163,6 +1180,7 @@ ATOMIC_CRITICAL( cmplx10, add, kmp_cmplx80, +, 20c, 1 ) // __km
ATOMIC_CRITICAL( cmplx10, sub, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub
ATOMIC_CRITICAL( cmplx10, mul, kmp_cmplx80, *, 20c, 1 ) // __kmpc_atomic_cmplx10_mul
ATOMIC_CRITICAL( cmplx10, div, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL( cmplx16, add, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_add
ATOMIC_CRITICAL( cmplx16, sub, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub
ATOMIC_CRITICAL( cmplx16, mul, CPLX128_LEG, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul
@@ -1173,6 +1191,7 @@ ATOMIC_CRITICAL( cmplx16, div, CPLX128_LEG, /, 32c, 1 ) // __km
ATOMIC_CRITICAL( cmplx16, mul_a16, kmp_cmplx128_a16_t, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_a16
ATOMIC_CRITICAL( cmplx16, div_a16, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16
#endif
+#endif
#if OMP_40_ENABLED
@@ -1312,6 +1331,7 @@ ATOMIC_BEGIN_REV(TYPE_ID,OP_ID,TYPE,void) \
// routines for long double type
ATOMIC_CRITICAL_REV( float10, sub, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_rev
ATOMIC_CRITICAL_REV( float10, div, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_rev
+#if KMP_HAVE_QUAD
// routines for _Quad type
ATOMIC_CRITICAL_REV( float16, sub, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_rev
ATOMIC_CRITICAL_REV( float16, div, QUAD_LEGACY, /, 16r, 1 ) // __kmpc_atomic_float16_div_rev
@@ -1319,6 +1339,7 @@ ATOMIC_CRITICAL_REV( float16, div, QUAD_LEGACY, /, 16r, 1 ) //
ATOMIC_CRITICAL_REV( float16, sub_a16, Quad_a16_t, -, 16r, 1 ) // __kmpc_atomic_float16_sub_a16_rev
ATOMIC_CRITICAL_REV( float16, div_a16, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_rev
#endif
+#endif
// routines for complex types
ATOMIC_CRITICAL_REV( cmplx4, sub, kmp_cmplx32, -, 8c, 1 ) // __kmpc_atomic_cmplx4_sub_rev
@@ -1327,12 +1348,14 @@ ATOMIC_CRITICAL_REV( cmplx8, sub, kmp_cmplx64, -, 16c, 1 ) //
ATOMIC_CRITICAL_REV( cmplx8, div, kmp_cmplx64, /, 16c, 1 ) // __kmpc_atomic_cmplx8_div_rev
ATOMIC_CRITICAL_REV( cmplx10, sub, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_rev
ATOMIC_CRITICAL_REV( cmplx10, div, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_rev
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_REV( cmplx16, sub, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_rev
ATOMIC_CRITICAL_REV( cmplx16, div, CPLX128_LEG, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_rev
#if ( KMP_ARCH_X86 )
ATOMIC_CRITICAL_REV( cmplx16, sub_a16, kmp_cmplx128_a16_t, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_a16_rev
ATOMIC_CRITICAL_REV( cmplx16, div_a16, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_rev
#endif
+#endif
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -1405,7 +1428,7 @@ ATOMIC_CMPXCHG_MIX( float4, kmp_real32, mul, 32, *, float8, kmp_real64, 4r, 3, K
ATOMIC_CMPXCHG_MIX( float4, kmp_real32, div, 32, /, float8, kmp_real64, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_div_float8
// RHS=float16 (deprecated, to be removed when we are sure the compiler does not use them)
-
+#if KMP_HAVE_QUAD
ATOMIC_CMPXCHG_MIX( fixed1, char, add, 8, +, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_add_fp
ATOMIC_CMPXCHG_MIX( fixed1, char, sub, 8, -, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_sub_fp
ATOMIC_CMPXCHG_MIX( fixed1, char, mul, 8, *, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_mul_fp
@@ -1444,10 +1467,12 @@ ATOMIC_CRITICAL_FP( float10, long double, add, +, fp, _Quad, 10r, 1 )
ATOMIC_CRITICAL_FP( float10, long double, sub, -, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_sub_fp
ATOMIC_CRITICAL_FP( float10, long double, mul, *, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_mul_fp
ATOMIC_CRITICAL_FP( float10, long double, div, /, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_div_fp
+#endif
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
// ------------------------------------------------------------------------
// X86 or X86_64: no alignment problems ====================================
+#if USE_CMPXCHG_FIX
// workaround for C78287 (complex(kind=4) data type)
#define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \
ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE) \
@@ -1456,6 +1481,13 @@ ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE)
}
// end of the second part of the workaround for C78287
#else
+#define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \
+ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE) \
+ OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
+ OP_CMPXCHG(TYPE,BITS,OP) \
+}
+#endif // USE_CMPXCHG_FIX
+#else
// ------------------------------------------------------------------------
// Code for other architectures that don't handle unaligned accesses.
#define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \
@@ -1624,7 +1656,9 @@ ATOMIC_CMPXCHG_READ( fixed1, rd, kmp_int8, 8, +, KMP_ARCH_X86 ) // __kmpc_
ATOMIC_CMPXCHG_READ( fixed2, rd, kmp_int16, 16, +, KMP_ARCH_X86 ) // __kmpc_atomic_fixed2_rd
ATOMIC_CRITICAL_READ( float10, rd, long double, +, 10r, 1 ) // __kmpc_atomic_float10_rd
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_READ( float16, rd, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_rd
+#endif // KMP_HAVE_QUAD
// Fix for CQ220361 on Windows* OS
#if ( KMP_OS_WINDOWS )
@@ -1634,11 +1668,13 @@ ATOMIC_CRITICAL_READ( float16, rd, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_
#endif
ATOMIC_CRITICAL_READ( cmplx8, rd, kmp_cmplx64, +, 16c, 1 ) // __kmpc_atomic_cmplx8_rd
ATOMIC_CRITICAL_READ( cmplx10, rd, kmp_cmplx80, +, 20c, 1 ) // __kmpc_atomic_cmplx10_rd
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_READ( cmplx16, rd, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_rd
#if ( KMP_ARCH_X86 )
ATOMIC_CRITICAL_READ( float16, a16_rd, Quad_a16_t, +, 16r, 1 ) // __kmpc_atomic_float16_a16_rd
ATOMIC_CRITICAL_READ( cmplx16, a16_rd, kmp_cmplx128_a16_t, +, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_rd
#endif
+#endif
// ------------------------------------------------------------------------
@@ -1720,15 +1756,19 @@ ATOMIC_XCHG_FLOAT_WR( float4, wr, kmp_real32, 32, =, KMP_ARCH_X86 ) // _
#endif
ATOMIC_CRITICAL_WR( float10, wr, long double, =, 10r, 1 ) // __kmpc_atomic_float10_wr
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_WR( float16, wr, QUAD_LEGACY, =, 16r, 1 ) // __kmpc_atomic_float16_wr
+#endif
ATOMIC_CRITICAL_WR( cmplx4, wr, kmp_cmplx32, =, 8c, 1 ) // __kmpc_atomic_cmplx4_wr
ATOMIC_CRITICAL_WR( cmplx8, wr, kmp_cmplx64, =, 16c, 1 ) // __kmpc_atomic_cmplx8_wr
ATOMIC_CRITICAL_WR( cmplx10, wr, kmp_cmplx80, =, 20c, 1 ) // __kmpc_atomic_cmplx10_wr
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_WR( cmplx16, wr, CPLX128_LEG, =, 32c, 1 ) // __kmpc_atomic_cmplx16_wr
#if ( KMP_ARCH_X86 )
ATOMIC_CRITICAL_WR( float16, a16_wr, Quad_a16_t, =, 16r, 1 ) // __kmpc_atomic_float16_a16_wr
ATOMIC_CRITICAL_WR( cmplx16, a16_wr, kmp_cmplx128_a16_t, =, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_wr
#endif
+#endif
// ------------------------------------------------------------------------
@@ -2058,12 +2098,14 @@ MIN_MAX_COMPXCHG_CPT( float4, max_cpt, kmp_real32, 32, <, KMP_ARCH_X86 ) // __k
MIN_MAX_COMPXCHG_CPT( float4, min_cpt, kmp_real32, 32, >, KMP_ARCH_X86 ) // __kmpc_atomic_float4_min_cpt
MIN_MAX_COMPXCHG_CPT( float8, max_cpt, kmp_real64, 64, <, KMP_ARCH_X86 ) // __kmpc_atomic_float8_max_cpt
MIN_MAX_COMPXCHG_CPT( float8, min_cpt, kmp_real64, 64, >, KMP_ARCH_X86 ) // __kmpc_atomic_float8_min_cpt
+#if KMP_HAVE_QUAD
MIN_MAX_CRITICAL_CPT( float16, max_cpt, QUAD_LEGACY, <, 16r, 1 ) // __kmpc_atomic_float16_max_cpt
MIN_MAX_CRITICAL_CPT( float16, min_cpt, QUAD_LEGACY, >, 16r, 1 ) // __kmpc_atomic_float16_min_cpt
#if ( KMP_ARCH_X86 )
MIN_MAX_CRITICAL_CPT( float16, max_a16_cpt, Quad_a16_t, <, 16r, 1 ) // __kmpc_atomic_float16_max_a16_cpt
MIN_MAX_CRITICAL_CPT( float16, min_a16_cpt, Quad_a16_t, >, 16r, 1 ) // __kmpc_atomic_float16_mix_a16_cpt
#endif
+#endif
// ------------------------------------------------------------------------
#ifdef KMP_GOMP_COMPAT
@@ -2156,6 +2198,7 @@ ATOMIC_CRITICAL_CPT( float10, add_cpt, long double, +, 10r, 1 )
ATOMIC_CRITICAL_CPT( float10, sub_cpt, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_cpt
ATOMIC_CRITICAL_CPT( float10, mul_cpt, long double, *, 10r, 1 ) // __kmpc_atomic_float10_mul_cpt
ATOMIC_CRITICAL_CPT( float10, div_cpt, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_cpt
+#if KMP_HAVE_QUAD
// routines for _Quad type
ATOMIC_CRITICAL_CPT( float16, add_cpt, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_add_cpt
ATOMIC_CRITICAL_CPT( float16, sub_cpt, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_cpt
@@ -2167,6 +2210,7 @@ ATOMIC_CRITICAL_CPT( float16, div_cpt, QUAD_LEGACY, /, 16r, 1 )
ATOMIC_CRITICAL_CPT( float16, mul_a16_cpt, Quad_a16_t, *, 16r, 1 ) // __kmpc_atomic_float16_mul_a16_cpt
ATOMIC_CRITICAL_CPT( float16, div_a16_cpt, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_cpt
#endif
+#endif
// routines for complex types
@@ -2184,6 +2228,7 @@ ATOMIC_CRITICAL_CPT( cmplx10, add_cpt, kmp_cmplx80, +, 20c, 1 ) //
ATOMIC_CRITICAL_CPT( cmplx10, sub_cpt, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_cpt
ATOMIC_CRITICAL_CPT( cmplx10, mul_cpt, kmp_cmplx80, *, 20c, 1 ) // __kmpc_atomic_cmplx10_mul_cpt
ATOMIC_CRITICAL_CPT( cmplx10, div_cpt, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_cpt
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_CPT( cmplx16, add_cpt, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_add_cpt
ATOMIC_CRITICAL_CPT( cmplx16, sub_cpt, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_cpt
ATOMIC_CRITICAL_CPT( cmplx16, mul_cpt, CPLX128_LEG, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_cpt
@@ -2194,6 +2239,7 @@ ATOMIC_CRITICAL_CPT( cmplx16, div_cpt, CPLX128_LEG, /, 32c, 1 ) //
ATOMIC_CRITICAL_CPT( cmplx16, mul_a16_cpt, kmp_cmplx128_a16_t, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_a16_cpt
ATOMIC_CRITICAL_CPT( cmplx16, div_a16_cpt, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_cpt
#endif
+#endif
#if OMP_40_ENABLED
@@ -2321,6 +2367,7 @@ ATOMIC_BEGIN_CPT(TYPE_ID,OP_ID,TYPE,TYPE) \
// routines for long double type
ATOMIC_CRITICAL_CPT_REV( float10, sub_cpt_rev, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_cpt_rev
ATOMIC_CRITICAL_CPT_REV( float10, div_cpt_rev, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_cpt_rev
+#if KMP_HAVE_QUAD
// routines for _Quad type
ATOMIC_CRITICAL_CPT_REV( float16, sub_cpt_rev, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_cpt_rev
ATOMIC_CRITICAL_CPT_REV( float16, div_cpt_rev, QUAD_LEGACY, /, 16r, 1 ) // __kmpc_atomic_float16_div_cpt_rev
@@ -2328,6 +2375,7 @@ ATOMIC_CRITICAL_CPT_REV( float16, div_cpt_rev, QUAD_LEGACY, /, 16r, 1 )
ATOMIC_CRITICAL_CPT_REV( float16, sub_a16_cpt_rev, Quad_a16_t, -, 16r, 1 ) // __kmpc_atomic_float16_sub_a16_cpt_rev
ATOMIC_CRITICAL_CPT_REV( float16, div_a16_cpt_rev, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_cpt_rev
#endif
+#endif
// routines for complex types
@@ -2378,12 +2426,14 @@ ATOMIC_CRITICAL_CPT_REV( cmplx8, sub_cpt_rev, kmp_cmplx64, -, 16c, 1 )
ATOMIC_CRITICAL_CPT_REV( cmplx8, div_cpt_rev, kmp_cmplx64, /, 16c, 1 ) // __kmpc_atomic_cmplx8_div_cpt_rev
ATOMIC_CRITICAL_CPT_REV( cmplx10, sub_cpt_rev, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_cpt_rev
ATOMIC_CRITICAL_CPT_REV( cmplx10, div_cpt_rev, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_cpt_rev
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_CPT_REV( cmplx16, sub_cpt_rev, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_cpt_rev
ATOMIC_CRITICAL_CPT_REV( cmplx16, div_cpt_rev, CPLX128_LEG, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_cpt_rev
#if ( KMP_ARCH_X86 )
ATOMIC_CRITICAL_CPT_REV( cmplx16, sub_a16_cpt_rev, kmp_cmplx128_a16_t, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_a16_cpt_rev
ATOMIC_CRITICAL_CPT_REV( cmplx16, div_a16_cpt_rev, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_cpt_rev
#endif
+#endif
// OpenMP 4.0 Capture-write (swap): {v = x; x = expr;}
@@ -2527,7 +2577,9 @@ ATOMIC_BEGIN_SWP_WRK(TYPE_ID,TYPE) \
ATOMIC_CRITICAL_SWP( float10, long double, 10r, 1 ) // __kmpc_atomic_float10_swp
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_SWP( float16, QUAD_LEGACY, 16r, 1 ) // __kmpc_atomic_float16_swp
+#endif
// cmplx4 routine to return void
ATOMIC_CRITICAL_SWP_WRK( cmplx4, kmp_cmplx32, 8c, 1 ) // __kmpc_atomic_cmplx4_swp
@@ -2536,11 +2588,13 @@ ATOMIC_CRITICAL_SWP_WRK( cmplx4, kmp_cmplx32, 8c, 1 ) // __kmpc_ato
ATOMIC_CRITICAL_SWP( cmplx8, kmp_cmplx64, 16c, 1 ) // __kmpc_atomic_cmplx8_swp
ATOMIC_CRITICAL_SWP( cmplx10, kmp_cmplx80, 20c, 1 ) // __kmpc_atomic_cmplx10_swp
+#if KMP_HAVE_QUAD
ATOMIC_CRITICAL_SWP( cmplx16, CPLX128_LEG, 32c, 1 ) // __kmpc_atomic_cmplx16_swp
#if ( KMP_ARCH_X86 )
ATOMIC_CRITICAL_SWP( float16_a16, Quad_a16_t, 16r, 1 ) // __kmpc_atomic_float16_a16_swp
ATOMIC_CRITICAL_SWP( cmplx16_a16, kmp_cmplx128_a16_t, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_swp
#endif
+#endif
// End of OpenMP 4.0 Capture
diff --git a/openmp/runtime/src/kmp_atomic.h b/openmp/runtime/src/kmp_atomic.h
index 2243ba700aa..361dce9aa79 100644
--- a/openmp/runtime/src/kmp_atomic.h
+++ b/openmp/runtime/src/kmp_atomic.h
@@ -1,7 +1,7 @@
/*
* kmp_atomic.h - ATOMIC header file
- * $Revision: 42195 $
- * $Date: 2013-03-27 16:10:35 -0500 (Wed, 27 Mar 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -30,10 +30,6 @@
// to use typedef'ed types on win.
// Condition for WIN64 was modified in anticipation of 10.1 build compiler.
-#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER )
-typedef __float128 _Quad;
-#endif
-
#if defined( __cplusplus ) && ( KMP_OS_WINDOWS )
// create shortcuts for c99 complex types
@@ -173,6 +169,7 @@ typedef __float128 _Quad;
typedef KMP_DO_ALIGN( 16 ) struct __kmp_cmplx80_t kmp_cmplx80;
// complex16
+ #if KMP_HAVE_QUAD
struct __kmp_cmplx128_t : std::complex< _Quad > {
__kmp_cmplx128_t() : std::complex< _Quad > () {}
@@ -192,6 +189,7 @@ typedef __float128 _Quad;
};
typedef struct __kmp_cmplx128_t kmp_cmplx128;
+ #endif /* KMP_HAVE_QUAD */
#ifdef _DEBUG_TEMPORARILY_UNSET_
#undef _DEBUG_TEMPORARILY_UNSET_
@@ -204,19 +202,22 @@ typedef __float128 _Quad;
typedef float _Complex kmp_cmplx32;
typedef double _Complex kmp_cmplx64;
typedef long double _Complex kmp_cmplx80;
+ #if KMP_HAVE_QUAD
typedef _Quad _Complex kmp_cmplx128;
+ #endif
#endif
// Compiler 12.0 changed alignment of 16 and 32-byte arguments (like _Quad
// and kmp_cmplx128) on IA-32 architecture. The following aligned structures
// are implemented to support the old alignment in 10.1, 11.0, 11.1 and
// introduce the new alignment in 12.0. See CQ88405.
-#if ( KMP_ARCH_X86 )
+#if KMP_ARCH_X86 && KMP_HAVE_QUAD
// 4-byte aligned structures for backward compatibility.
#pragma pack( push, 4 )
+
struct KMP_DO_ALIGN( 4 ) Quad_a4_t {
_Quad q;
@@ -364,31 +365,31 @@ extern int __kmp_atomic_mode;
typedef kmp_queuing_lock_t kmp_atomic_lock_t;
-inline void
+static inline void
__kmp_acquire_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid )
{
__kmp_acquire_queuing_lock( lck, gtid );
}
-inline int
+static inline int
__kmp_test_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid )
{
return __kmp_test_queuing_lock( lck, gtid );
}
-inline void
+static inline void
__kmp_release_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid )
{
__kmp_release_queuing_lock( lck, gtid );
}
-inline void
+static inline void
__kmp_init_atomic_lock( kmp_atomic_lock_t *lck )
{
__kmp_init_queuing_lock( lck );
}
-inline void
+static inline void
__kmp_destroy_atomic_lock( kmp_atomic_lock_t *lck )
{
__kmp_destroy_queuing_lock( lck );
@@ -498,6 +499,7 @@ void __kmpc_atomic_float4_max( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp
void __kmpc_atomic_float4_min( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs );
void __kmpc_atomic_float8_max( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs );
void __kmpc_atomic_float8_min( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_float16_max( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
void __kmpc_atomic_float16_min( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
#if ( KMP_ARCH_X86 )
@@ -505,6 +507,7 @@ void __kmpc_atomic_float16_min( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QU
void __kmpc_atomic_float16_max_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
void __kmpc_atomic_float16_min_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
#endif
+#endif
// .NEQV. (same as xor)
void __kmpc_atomic_fixed1_neqv( ident_t *id_ref, int gtid, char * lhs, char rhs );
void __kmpc_atomic_fixed2_neqv( ident_t *id_ref, int gtid, short * lhs, short rhs );
@@ -521,6 +524,7 @@ void __kmpc_atomic_float10_sub( ident_t *id_ref, int gtid, long double * lhs, lo
void __kmpc_atomic_float10_mul( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
void __kmpc_atomic_float10_div( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
// _Quad type
+#if KMP_HAVE_QUAD
void __kmpc_atomic_float16_add( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
void __kmpc_atomic_float16_sub( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
void __kmpc_atomic_float16_mul( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
@@ -532,6 +536,7 @@ void __kmpc_atomic_float16_div( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QU
void __kmpc_atomic_float16_mul_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
void __kmpc_atomic_float16_div_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
#endif
+#endif
// routines for complex types
void __kmpc_atomic_cmplx4_add( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
void __kmpc_atomic_cmplx4_sub( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
@@ -545,6 +550,7 @@ void __kmpc_atomic_cmplx10_add( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, km
void __kmpc_atomic_cmplx10_sub( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
void __kmpc_atomic_cmplx10_mul( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
void __kmpc_atomic_cmplx10_div( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_cmplx16_add( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
void __kmpc_atomic_cmplx16_sub( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
void __kmpc_atomic_cmplx16_mul( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
@@ -556,6 +562,7 @@ void __kmpc_atomic_cmplx16_div( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CP
void __kmpc_atomic_cmplx16_mul_a16( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
void __kmpc_atomic_cmplx16_div_a16( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
#endif
+#endif
#if OMP_40_ENABLED
@@ -593,14 +600,17 @@ void __kmpc_atomic_float8_sub_rev( ident_t *id_ref, int gtid, double * lhs, dou
void __kmpc_atomic_float8_div_rev( ident_t *id_ref, int gtid, double * lhs, double rhs );
void __kmpc_atomic_float10_sub_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
void __kmpc_atomic_float10_div_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_float16_sub_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
void __kmpc_atomic_float16_div_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
+#endif
void __kmpc_atomic_cmplx4_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
void __kmpc_atomic_cmplx4_div_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
void __kmpc_atomic_cmplx8_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs );
void __kmpc_atomic_cmplx8_div_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs );
void __kmpc_atomic_cmplx10_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
void __kmpc_atomic_cmplx10_div_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_cmplx16_sub_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
void __kmpc_atomic_cmplx16_div_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
#if ( KMP_ARCH_X86 )
@@ -610,6 +620,7 @@ void __kmpc_atomic_cmplx16_div_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs
void __kmpc_atomic_cmplx16_sub_a16_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
void __kmpc_atomic_cmplx16_div_a16_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
#endif
+#endif // KMP_HAVE_QUAD
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -632,6 +643,7 @@ void __kmpc_atomic_float4_mul_float8( ident_t *id_ref, int gtid, kmp_real32 * lh
void __kmpc_atomic_float4_div_float8( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real64 rhs );
// RHS=float16 (deprecated, to be removed when we are sure the compiler does not use them)
+#if KMP_HAVE_QUAD
void __kmpc_atomic_fixed1_add_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs );
void __kmpc_atomic_fixed1_sub_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs );
void __kmpc_atomic_fixed1_mul_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs );
@@ -670,6 +682,7 @@ void __kmpc_atomic_float10_add_fp( ident_t *id_ref, int gtid, long double * lhs,
void __kmpc_atomic_float10_sub_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs );
void __kmpc_atomic_float10_mul_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs );
void __kmpc_atomic_float10_div_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs );
+#endif // KMP_HAVE_QUAD
// RHS=cmplx8
void __kmpc_atomic_cmplx4_add_cmplx8( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx64 rhs );
@@ -701,7 +714,9 @@ kmp_int64 __kmpc_atomic_fixed8_rd( ident_t *id_ref, int gtid, kmp_int64 *
kmp_real32 __kmpc_atomic_float4_rd( ident_t *id_ref, int gtid, kmp_real32 * loc );
kmp_real64 __kmpc_atomic_float8_rd( ident_t *id_ref, int gtid, kmp_real64 * loc );
long double __kmpc_atomic_float10_rd( ident_t *id_ref, int gtid, long double * loc );
+#if KMP_HAVE_QUAD
QUAD_LEGACY __kmpc_atomic_float16_rd( ident_t *id_ref, int gtid, QUAD_LEGACY * loc );
+#endif
// Fix for CQ220361: cmplx4 READ will return void on Windows* OS; read value will be
// returned through an additional parameter
#if ( KMP_OS_WINDOWS )
@@ -711,12 +726,14 @@ QUAD_LEGACY __kmpc_atomic_float16_rd( ident_t *id_ref, int gtid, QUAD_LEGACY *
#endif
kmp_cmplx64 __kmpc_atomic_cmplx8_rd( ident_t *id_ref, int gtid, kmp_cmplx64 * loc );
kmp_cmplx80 __kmpc_atomic_cmplx10_rd( ident_t *id_ref, int gtid, kmp_cmplx80 * loc );
+#if KMP_HAVE_QUAD
CPLX128_LEG __kmpc_atomic_cmplx16_rd( ident_t *id_ref, int gtid, CPLX128_LEG * loc );
#if ( KMP_ARCH_X86 )
// Routines with 16-byte arguments aligned to 16-byte boundary
Quad_a16_t __kmpc_atomic_float16_a16_rd( ident_t * id_ref, int gtid, Quad_a16_t * loc );
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_rd( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * loc );
#endif
+#endif
//
@@ -730,17 +747,20 @@ void __kmpc_atomic_fixed8_wr( ident_t *id_ref, int gtid, kmp_int64 * lhs, kmp
void __kmpc_atomic_float4_wr( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs );
void __kmpc_atomic_float8_wr( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs );
void __kmpc_atomic_float10_wr( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_float16_wr( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
+#endif
void __kmpc_atomic_cmplx4_wr( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
void __kmpc_atomic_cmplx8_wr( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs );
void __kmpc_atomic_cmplx10_wr( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
+#if KMP_HAVE_QUAD
void __kmpc_atomic_cmplx16_wr( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
#if ( KMP_ARCH_X86 )
// Routines with 16-byte arguments aligned to 16-byte boundary
void __kmpc_atomic_float16_a16_wr( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
void __kmpc_atomic_cmplx16_a16_wr( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
#endif
-
+#endif
//
// Below routines for atomic CAPTURE are listed
@@ -830,8 +850,10 @@ kmp_real32 __kmpc_atomic_float4_max_cpt( ident_t *id_ref, int gtid, kmp_real32
kmp_real32 __kmpc_atomic_float4_min_cpt( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs, int flag);
kmp_real64 __kmpc_atomic_float8_max_cpt( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs, int flag);
kmp_real64 __kmpc_atomic_float8_min_cpt( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs, int flag);
+#if KMP_HAVE_QUAD
QUAD_LEGACY __kmpc_atomic_float16_max_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
QUAD_LEGACY __kmpc_atomic_float16_min_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
+#endif
// .NEQV. (same as xor)
char __kmpc_atomic_fixed1_neqv_cpt( ident_t *id_ref, int gtid, char * lhs, char rhs, int flag);
short __kmpc_atomic_fixed2_neqv_cpt( ident_t *id_ref, int gtid, short * lhs, short rhs, int flag);
@@ -847,11 +869,13 @@ long double __kmpc_atomic_float10_add_cpt( ident_t *id_ref, int gtid, long doubl
long double __kmpc_atomic_float10_sub_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag);
long double __kmpc_atomic_float10_mul_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag);
long double __kmpc_atomic_float10_div_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag);
+#if KMP_HAVE_QUAD
// _Quad type
QUAD_LEGACY __kmpc_atomic_float16_add_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
QUAD_LEGACY __kmpc_atomic_float16_sub_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
QUAD_LEGACY __kmpc_atomic_float16_mul_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
QUAD_LEGACY __kmpc_atomic_float16_div_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag);
+#endif
// routines for complex types
// Workaround for cmplx4 routines - return void; captured value is returned via the argument
void __kmpc_atomic_cmplx4_add_cpt( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag);
@@ -867,6 +891,7 @@ kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt( ident_t *id_ref, int gtid, kmp_cmplx8
kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag);
kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag);
kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag);
+#if KMP_HAVE_QUAD
CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag);
CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag);
CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag);
@@ -884,6 +909,7 @@ CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt( ident_t *id_ref, int gtid, CPLX128_LE
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_mul_a16_cpt( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag);
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag);
#endif
+#endif
void __kmpc_atomic_start(void);
void __kmpc_atomic_end(void);
@@ -922,8 +948,10 @@ double __kmpc_atomic_float8_sub_cpt_rev( ident_t *id_ref, int gtid, double *
double __kmpc_atomic_float8_div_cpt_rev( ident_t *id_ref, int gtid, double * lhs, double rhs, int flag );
long double __kmpc_atomic_float10_sub_cpt_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag );
long double __kmpc_atomic_float10_div_cpt_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag );
+#if KMP_HAVE_QUAD
QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag );
QUAD_LEGACY __kmpc_atomic_float16_div_cpt_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag );
+#endif
// Workaround for cmplx4 routines - return void; captured value is returned via the argument
void __kmpc_atomic_cmplx4_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag );
void __kmpc_atomic_cmplx4_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag );
@@ -931,6 +959,7 @@ kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_c
kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs, int flag );
kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag );
kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag );
+#if KMP_HAVE_QUAD
CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag );
CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag );
#if ( KMP_ARCH_X86 )
@@ -939,6 +968,7 @@ CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev( ident_t *id_ref, int gtid, CPLX
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_sub_a16_cpt_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag );
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag );
#endif
+#endif
// OpenMP 4.0 Capture-write (swap): {v = x; x = expr;}
char __kmpc_atomic_fixed1_swp( ident_t *id_ref, int gtid, char * lhs, char rhs );
@@ -948,18 +978,22 @@ kmp_int64 __kmpc_atomic_fixed8_swp( ident_t *id_ref, int gtid, kmp_int64 * l
float __kmpc_atomic_float4_swp( ident_t *id_ref, int gtid, float * lhs, float rhs );
double __kmpc_atomic_float8_swp( ident_t *id_ref, int gtid, double * lhs, double rhs );
long double __kmpc_atomic_float10_swp( ident_t *id_ref, int gtid, long double * lhs, long double rhs );
+#if KMP_HAVE_QUAD
QUAD_LEGACY __kmpc_atomic_float16_swp( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs );
+#endif
// !!! TODO: check if we need a workaround here
void __kmpc_atomic_cmplx4_swp( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out );
//kmp_cmplx32 __kmpc_atomic_cmplx4_swp( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
kmp_cmplx64 __kmpc_atomic_cmplx8_swp( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs );
kmp_cmplx80 __kmpc_atomic_cmplx10_swp( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs );
+#if KMP_HAVE_QUAD
CPLX128_LEG __kmpc_atomic_cmplx16_swp( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs );
#if ( KMP_ARCH_X86 )
Quad_a16_t __kmpc_atomic_float16_a16_swp( ident_t *id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs );
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_swp( ident_t *id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs );
#endif
+#endif
// End of OpenMP 4.0 capture
diff --git a/openmp/runtime/src/kmp_cancel.cpp b/openmp/runtime/src/kmp_cancel.cpp
new file mode 100644
index 00000000000..e5a76d26951
--- /dev/null
+++ b/openmp/runtime/src/kmp_cancel.cpp
@@ -0,0 +1,282 @@
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#include "kmp.h"
+#include "kmp_i18n.h"
+#include "kmp_io.h"
+#include "kmp_str.h"
+
+#if OMP_40_ENABLED
+
+/*!
+@ingroup CANCELLATION
+@param loc_ref location of the original task directive
+@param gtid Global thread ID of encountering thread
+@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup)
+
+@return returns true if the cancellation request has been activated and the execution thread
+needs to proceed to the end of the canceled region.
+
+Request cancellation of the binding OpenMP region.
+*/
+kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
+ kmp_info_t *this_thr = __kmp_threads [ gtid ];
+
+ KC_TRACE( 10, ("__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) );
+
+ KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
+ KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
+ cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup);
+ KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
+
+ if (__kmp_omp_cancellation) {
+ switch (cncl_kind) {
+ case cancel_parallel:
+ case cancel_loop:
+ case cancel_sections:
+ // cancellation requests for parallel and worksharing constructs
+ // are handled through the team structure
+ {
+ kmp_team_t *this_team = this_thr->th.th_team;
+ KMP_DEBUG_ASSERT(this_team);
+ kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(this_team->t.t_cancel_request), cancel_noreq, cncl_kind);
+ if (old == cancel_noreq || old == cncl_kind) {
+ //printf("__kmpc_cancel: this_team->t.t_cancel_request=%d @ %p\n",
+ // this_team->t.t_cancel_request, &(this_team->t.t_cancel_request));
+ // we do not have a cancellation request in this team or we do have one
+ // that matches the current request -> cancel
+ return 1 /* true */;
+ }
+ break;
+ }
+ case cancel_taskgroup:
+ // cancellation requests for parallel and worksharing constructs
+ // are handled through the taskgroup structure
+ {
+ kmp_taskdata_t* task;
+ kmp_taskgroup_t* taskgroup;
+
+ task = this_thr->th.th_current_task;
+ KMP_DEBUG_ASSERT( task );
+
+ taskgroup = task->td_taskgroup;
+ if (taskgroup) {
+ kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(taskgroup->cancel_request), cancel_noreq, cncl_kind);
+ if (old == cancel_noreq || old == cncl_kind) {
+ // we do not have a cancellation request in this taskgroup or we do have one
+ // that matches the current request -> cancel
+ return 1 /* true */;
+ }
+ }
+ else {
+ // TODO: what needs to happen here?
+ // the specification disallows cancellation w/o taskgroups
+ // so we might do anything here, let's abort for now
+ KMP_ASSERT( 0 /* false */);
+ }
+ }
+ break;
+ default:
+ KMP_ASSERT (0 /* false */);
+ }
+ }
+
+ // ICV OMP_CANCELLATION=false, so we ignored this cancel request
+ KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
+ return 0 /* false */;
+}
+
+/*!
+@ingroup CANCELLATION
+@param loc_ref location of the original task directive
+@param gtid Global thread ID of encountering thread
+@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup)
+
+@return returns true if a matching cancellation request has been flagged in the RTL and the
+encountering thread has to cancel..
+
+Cancellation point for the encountering thread.
+*/
+kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
+ kmp_info_t *this_thr = __kmp_threads [ gtid ];
+
+ KC_TRACE( 10, ("__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) );
+
+ KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
+ KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
+ cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup);
+ KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
+
+ if (__kmp_omp_cancellation) {
+ switch (cncl_kind) {
+ case cancel_parallel:
+ case cancel_loop:
+ case cancel_sections:
+ // cancellation requests for parallel and worksharing constructs
+ // are handled through the team structure
+ {
+ kmp_team_t *this_team = this_thr->th.th_team;
+ KMP_DEBUG_ASSERT(this_team);
+ if (this_team->t.t_cancel_request) {
+ if (cncl_kind == this_team->t.t_cancel_request) {
+ // the request in the team structure matches the type of
+ // cancellation point so we can cancel
+ return 1 /* true */;
+ }
+ KMP_ASSERT( 0 /* false */);
+ }
+ else {
+ // we do not have a cancellation request pending, so we just
+ // ignore this cancellation point
+ return 0;
+ }
+ break;
+ }
+ case cancel_taskgroup:
+ // cancellation requests for parallel and worksharing constructs
+ // are handled through the taskgroup structure
+ {
+ kmp_taskdata_t* task;
+ kmp_taskgroup_t* taskgroup;
+
+ task = this_thr->th.th_current_task;
+ KMP_DEBUG_ASSERT( task );
+
+ taskgroup = task->td_taskgroup;
+ if (taskgroup) {
+ // return the current status of cancellation for the
+ // taskgroup
+ return !!taskgroup->cancel_request;
+ }
+ else {
+ // if a cancellation point is encountered by a task
+ // that does not belong to a taskgroup, it is OK
+ // to ignore it
+ return 0 /* false */;
+ }
+ }
+ default:
+ KMP_ASSERT (0 /* false */);
+ }
+ }
+
+ // ICV OMP_CANCELLATION=false, so we ignore the cancellation point
+ KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
+ return 0 /* false */;
+}
+
+/*!
+@ingroup CANCELLATION
+@param loc_ref location of the original task directive
+@param gtid Global thread ID of encountering thread
+
+@return returns true if a matching cancellation request has been flagged in the RTL and the
+encountering thread has to cancel..
+
+Barrier with cancellation point to send threads from the barrier to the
+end of the parallel region. Needs a special code pattern as documented
+in the design document for the cancellation feature.
+*/
+kmp_int32
+__kmpc_cancel_barrier(ident_t *loc, kmp_int32 gtid) {
+ int ret = 0 /* false */;
+ kmp_info_t *this_thr = __kmp_threads [ gtid ];
+ kmp_team_t *this_team = this_thr->th.th_team;
+
+ KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
+
+ // call into the standard barrier
+ __kmpc_barrier(loc, gtid);
+
+ // if cancellation is active, check cancellation flag
+ if (__kmp_omp_cancellation) {
+ // depending on which construct to cancel, check the flag and
+ // reset the flag
+ switch (this_team->t.t_cancel_request) {
+ case cancel_parallel:
+ ret = 1;
+ // ensure that threads have checked the flag, when
+ // leaving the above barrier
+ __kmpc_barrier(loc, gtid);
+ this_team->t.t_cancel_request = cancel_noreq;
+ // the next barrier is the fork/join barrier, which
+ // synchronizes the threads leaving here
+ break;
+ case cancel_loop:
+ case cancel_sections:
+ ret = 1;
+ // ensure that threads have checked the flag, when
+ // leaving the above barrier
+ __kmpc_barrier(loc, gtid);
+ this_team->t.t_cancel_request = cancel_noreq;
+ // synchronize the threads again to make sure we
+ // do not have any run-away threads that cause a race
+ // on the cancellation flag
+ __kmpc_barrier(loc, gtid);
+ break;
+ case cancel_taskgroup:
+ // this case should not occur
+ KMP_ASSERT (0 /* false */ );
+ break;
+ case cancel_noreq:
+ // do nothing
+ break;
+ default:
+ KMP_ASSERT ( 0 /* false */);
+ }
+ }
+
+ return ret;
+}
+
+/*!
+@ingroup CANCELLATION
+@param loc_ref location of the original task directive
+@param gtid Global thread ID of encountering thread
+
+@return returns true if a matching cancellation request has been flagged in the RTL and the
+encountering thread has to cancel..
+
+Query function to query the current status of cancellation requests.
+Can be used to implement the following pattern:
+
+if (kmp_get_cancellation_status(kmp_cancel_parallel)) {
+ perform_cleanup();
+ #pragma omp cancellation point parallel
+}
+*/
+int __kmp_get_cancellation_status(int cancel_kind) {
+ if (__kmp_omp_cancellation) {
+ kmp_info_t *this_thr = __kmp_entry_thread();
+
+ switch (cancel_kind) {
+ case cancel_parallel:
+ case cancel_loop:
+ case cancel_sections:
+ {
+ kmp_team_t *this_team = this_thr->th.th_team;
+ return this_team->t.t_cancel_request == cancel_kind;
+ }
+ case cancel_taskgroup:
+ {
+ kmp_taskdata_t* task;
+ kmp_taskgroup_t* taskgroup;
+ task = this_thr->th.th_current_task;
+ taskgroup = task->td_taskgroup;
+ return taskgroup && taskgroup->cancel_request;
+ }
+ }
+ }
+
+ return 0 /* false */;
+}
+
+#endif
diff --git a/openmp/runtime/src/kmp_csupport.c b/openmp/runtime/src/kmp_csupport.c
index 8ca4612c473..17cc5347fa2 100644
--- a/openmp/runtime/src/kmp_csupport.c
+++ b/openmp/runtime/src/kmp_csupport.c
@@ -1,7 +1,7 @@
/*
* kmp_csupport.c -- kfront linkage support for OpenMP.
- * $Revision: 42642 $
- * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $
+ * $Revision: 42826 $
+ * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $
*/
@@ -287,7 +287,7 @@ __kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
VOLATILE_CAST(microtask_t) microtask,
VOLATILE_CAST(launch_t) __kmp_invoke_task_func,
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
&ap
#else
ap
@@ -351,7 +351,7 @@ __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
argc,
VOLATILE_CAST(microtask_t) __kmp_teams_master,
VOLATILE_CAST(launch_t) __kmp_invoke_teams_master,
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
&ap
#else
ap
@@ -622,28 +622,20 @@ __kmpc_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
if ( __kmp_env_consistency_check )
__kmp_push_parallel( global_tid, NULL );
-#if USE_ITT_BUILD
+// t_level is not available in 2.5 build, so check for OMP_30_ENABLED
+#if USE_ITT_BUILD && OMP_30_ENABLED
// Mark the start of the "parallel" region for VTune. Only use one of frame notification scheme at the moment.
if ( ( __itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
{
__kmp_itt_region_forking( global_tid, 1 );
}
- // Collect information only if the file was opened succesfully.
- if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file )
+ if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr )
{
+#if USE_ITT_NOTIFY
if( this_thr->th.th_team->t.t_level == 1 ) {
- kmp_uint64 fr_begin;
-#if defined( __GNUC__ )
-# if !defined( __INTEL_COMPILER )
- fr_begin = __kmp_hardware_timestamp();
-# else
- fr_begin = __rdtsc();
-# endif
-#else
- fr_begin = __rdtsc();
-#endif
- this_thr->th.th_frame_time_serialized = fr_begin;
+ this_thr->th.th_frame_time_serialized = __itt_get_timestamp();
}
+#endif
}
#endif /* USE_ITT_BUILD */
@@ -774,39 +766,17 @@ __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
}
-#if USE_ITT_BUILD
+// t_level is not available in 2.5 build, so check for OMP_30_ENABLED
+#if USE_ITT_BUILD && OMP_30_ENABLED
// Mark the end of the "parallel" region for VTune. Only use one of frame notification scheme at the moment.
if ( ( __itt_frame_end_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
{
+ this_thr->th.th_ident = loc;
__kmp_itt_region_joined( global_tid, 1 );
}
- // Collect information only if the file was opened succesfully.
- if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file )
- {
+ if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr ) {
if( this_thr->th.th_team->t.t_level == 0 ) {
- ident_t * loc = this_thr->th.th_ident;
- if (loc) {
- // Use compiler-generated location to mark the frame:
- // "<func>$omp$frame@[file:]<line>[:<col>]"
- kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
-
- kmp_uint64 fr_end;
-#if defined( __GNUC__ )
-# if !defined( __INTEL_COMPILER )
- fr_end = __kmp_hardware_timestamp();
-# else
- fr_end = __rdtsc();
-# endif
-#else
- fr_end = __rdtsc();
-#endif
- K_DIAG( 3, ( "__kmpc_end_serialized_parallel: T#%d frame_begin = %llu, frame_end = %llu\n",
- global_tid, this_thr->th.th_frame_time, fr_end ) );
-
- __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n",
- str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time_serialized, fr_end );
- __kmp_str_loc_free( &str_loc );
- }
+ __kmp_itt_frame_submit( global_tid, this_thr->th.th_frame_time_serialized, __itt_timestamp_none, 0, loc );
}
}
#endif /* USE_ITT_BUILD */
@@ -858,13 +828,15 @@ __kmpc_flush(ident_t *loc, ...)
if ( ! __kmp_cpuinfo.sse2 ) {
// CPU cannot execute SSE2 instructions.
} else {
- #if defined( __GNUC__ ) && !defined( __INTEL_COMPILER )
- __sync_synchronize();
- #else
+ #if KMP_COMPILER_ICC
_mm_mfence();
- #endif // __GNUC__
+ #else
+ __sync_synchronize();
+ #endif // KMP_COMPILER_ICC
}; // if
#endif // KMP_MIC
+ #elif KMP_ARCH_ARM
+ // Nothing yet
#else
#error Unknown or unsupported architecture
#endif
@@ -1110,7 +1082,7 @@ __kmpc_critical( ident_t * loc, kmp_int32 global_tid, kmp_critical_name * crit )
&& ( sizeof( lck->tas.lk.poll ) <= OMP_CRITICAL_SIZE ) ) {
lck = (kmp_user_lock_p)crit;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_CRITICAL_SIZE ) ) {
lck = (kmp_user_lock_p)crit;
@@ -1163,7 +1135,7 @@ __kmpc_end_critical(ident_t *loc, kmp_int32 global_tid, kmp_critical_name *crit)
&& ( sizeof( lck->tas.lk.poll ) <= OMP_CRITICAL_SIZE ) ) {
lck = (kmp_user_lock_p)crit;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_CRITICAL_SIZE ) ) {
lck = (kmp_user_lock_p)crit;
@@ -1598,14 +1570,14 @@ __kmpc_init_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
#endif
else {
- lck = __kmp_user_lock_allocate( user_lock, gtid );
+ lck = __kmp_user_lock_allocate( user_lock, gtid, 0 );
}
INIT_LOCK( lck );
__kmp_set_user_lock_location( lck, loc );
@@ -1634,7 +1606,7 @@ __kmpc_init_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
@@ -1642,7 +1614,7 @@ __kmpc_init_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
}
#endif
else {
- lck = __kmp_user_lock_allocate( user_lock, gtid );
+ lck = __kmp_user_lock_allocate( user_lock, gtid, 0 );
}
INIT_NESTED_LOCK( lck );
@@ -1662,7 +1634,7 @@ __kmpc_destroy_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
@@ -1681,7 +1653,7 @@ __kmpc_destroy_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
;
@@ -1702,7 +1674,7 @@ __kmpc_destroy_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
@@ -1723,7 +1695,7 @@ __kmpc_destroy_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
@@ -1743,7 +1715,7 @@ __kmpc_set_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
@@ -1773,7 +1745,7 @@ __kmpc_set_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
@@ -1805,7 +1777,7 @@ __kmpc_unset_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
if ( ( __kmp_user_lock_kind == lk_tas )
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// "fast" path implemented to fix customer performance issue
#if USE_ITT_BUILD
__kmp_itt_lock_releasing( (kmp_user_lock_p)user_lock );
@@ -1817,7 +1789,7 @@ __kmpc_unset_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
lck = (kmp_user_lock_p)user_lock;
#endif
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
@@ -1844,7 +1816,7 @@ __kmpc_unset_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
if ( ( __kmp_user_lock_kind == lk_tas ) && ( sizeof( lck->tas.lk.poll )
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// "fast" path implemented to fix customer performance issue
kmp_tas_lock_t *tl = (kmp_tas_lock_t*)user_lock;
#if USE_ITT_BUILD
@@ -1859,7 +1831,7 @@ __kmpc_unset_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
lck = (kmp_user_lock_p)user_lock;
#endif
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
@@ -1888,7 +1860,7 @@ __kmpc_test_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
&& ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
@@ -1926,7 +1898,7 @@ __kmpc_test_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
+ sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) {
lck = (kmp_user_lock_p)user_lock;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( ( __kmp_user_lock_kind == lk_futex )
&& ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked )
<= OMP_NEST_LOCK_T_SIZE ) ) {
diff --git a/openmp/runtime/src/kmp_dispatch.cpp b/openmp/runtime/src/kmp_dispatch.cpp
index 1128b871d58..cb5bdac532a 100644
--- a/openmp/runtime/src/kmp_dispatch.cpp
+++ b/openmp/runtime/src/kmp_dispatch.cpp
@@ -1,7 +1,7 @@
/*
* kmp_dispatch.cpp: dynamic scheduling - iteration initialization and dispatch.
- * $Revision: 42624 $
- * $Date: 2013-08-27 10:53:11 -0500 (Tue, 27 Aug 2013) $
+ * $Revision: 42674 $
+ * $Date: 2013-09-18 11:12:49 -0500 (Wed, 18 Sep 2013) $
*/
@@ -916,7 +916,8 @@ __kmp_dispatch_init(
*/
// save original FPCW and set precision to 64-bit, as
// Windows* OS on IA-32 architecture defaults to 53-bit
- unsigned int oldFpcw = _control87(0,0x30000);
+ unsigned int oldFpcw = _control87(0,0);
+ _control87(_PC_64,_MCW_PC); // 0,0x30000
#endif
/* value used for comparison in solver for cross-over point */
long double target = ((long double)chunk * 2 + 1) * nproc / tc;
@@ -995,7 +996,7 @@ __kmp_dispatch_init(
pr->u.p.count = tc - __kmp_dispatch_guided_remaining(tc, GUIDED_ANALYTICAL_WORKAROUND, cross) - cross * chunk;
#if KMP_OS_WINDOWS && KMP_ARCH_X86
// restore FPCW
- _control87(oldFpcw,0x30000);
+ _control87(oldFpcw,_MCW_PC);
#endif
} // if
} else {
@@ -1836,7 +1837,7 @@ __kmp_dispatch_next(
/* for storing original FPCW value for Windows* OS on
IA-32 architecture 8-byte version */
unsigned int oldFpcw;
- int fpcwSet = 0;
+ unsigned int fpcwSet = 0;
#endif
KD_TRACE(100, ("__kmp_dispatch_next: T#%d kmp_sch_guided_chunked analytical case\n",
gtid ) );
@@ -1870,7 +1871,8 @@ __kmp_dispatch_next(
FPCW and set precision to 64-bit, as Windows* OS
on IA-32 architecture defaults to 53-bit */
if ( !fpcwSet ) {
- oldFpcw = _control87(0,0x30000);
+ oldFpcw = _control87(0,0);
+ _control87(_PC_64,_MCW_PC);
fpcwSet = 0x30000;
}
#endif
@@ -1893,9 +1895,11 @@ __kmp_dispatch_next(
} // if
} // while (1)
#if KMP_OS_WINDOWS && KMP_ARCH_X86
- /* restore FPCW if necessary */
- if ( oldFpcw & fpcwSet != 0 )
- _control87(oldFpcw,0x30000);
+ /* restore FPCW if necessary
+ AC: check fpcwSet flag first because oldFpcw can be uninitialized here
+ */
+ if ( fpcwSet && ( oldFpcw & fpcwSet ) )
+ _control87(oldFpcw,_MCW_PC);
#endif
if ( status != 0 ) {
start = pr->u.p.lb;
diff --git a/openmp/runtime/src/kmp_ftn_cdecl.c b/openmp/runtime/src/kmp_ftn_cdecl.c
index 7079ee9b539..135a7cb7eb3 100644
--- a/openmp/runtime/src/kmp_ftn_cdecl.c
+++ b/openmp/runtime/src/kmp_ftn_cdecl.c
@@ -1,7 +1,7 @@
/*
* kmp_ftn_cdecl.c -- Fortran __cdecl linkage support for OpenMP.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42757 $
+ * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $
*/
@@ -17,21 +17,21 @@
#include "kmp.h"
+#if KMP_OS_WINDOWS
+# if defined KMP_WIN_CDECL || !defined GUIDEDLL_EXPORTS
+# define KMP_FTN_ENTRIES KMP_FTN_UPPER
+# endif
+#elif KMP_OS_UNIX
+# define KMP_FTN_ENTRIES KMP_FTN_PLAIN
+#endif
+
// Note: This string is not printed when KMP_VERSION=1.
char const __kmp_version_ftncdecl[] = KMP_VERSION_PREFIX "Fortran __cdecl OMP support: "
-#ifdef USE_FTN_CDECL
+#ifdef KMP_FTN_ENTRIES
"yes";
+# define FTN_STDCALL /* no stdcall */
+# include "kmp_ftn_os.h"
+# include "kmp_ftn_entry.h"
#else
"no";
-#endif
-
-#ifdef USE_FTN_CDECL
-
-#define FTN_STDCALL /* no stdcall */
-#define KMP_FTN_ENTRIES USE_FTN_CDECL
-
-#include "kmp_ftn_os.h"
-#include "kmp_ftn_entry.h"
-
-#endif /* USE_FTN_CDECL */
-
+#endif /* KMP_FTN_ENTRIES */
diff --git a/openmp/runtime/src/kmp_ftn_entry.h b/openmp/runtime/src/kmp_ftn_entry.h
index f2c6440e988..dbbca19ac35 100644
--- a/openmp/runtime/src/kmp_ftn_entry.h
+++ b/openmp/runtime/src/kmp_ftn_entry.h
@@ -1,7 +1,7 @@
/*
* kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP.
- * $Revision: 42507 $
- * $Date: 2013-07-11 07:55:25 -0500 (Thu, 11 Jul 2013) $
+ * $Revision: 42798 $
+ * $Date: 2013-10-30 16:39:54 -0500 (Wed, 30 Oct 2013) $
*/
@@ -356,7 +356,7 @@ FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
/* sets the requested number of threads for the next parallel region */
void FTN_STDCALL
-FTN_SET_NUM_THREADS( int KMP_DEREF arg )
+xexpand(FTN_SET_NUM_THREADS)( int KMP_DEREF arg )
{
#ifdef KMP_STUB
// Nothing.
@@ -368,7 +368,7 @@ FTN_SET_NUM_THREADS( int KMP_DEREF arg )
/* returns the number of threads in current team */
int FTN_STDCALL
-FTN_GET_NUM_THREADS( void )
+xexpand(FTN_GET_NUM_THREADS)( void )
{
#ifdef KMP_STUB
return 1;
@@ -379,7 +379,7 @@ FTN_GET_NUM_THREADS( void )
}
int FTN_STDCALL
-FTN_GET_MAX_THREADS( void )
+xexpand(FTN_GET_MAX_THREADS)( void )
{
#ifdef KMP_STUB
return 1;
@@ -401,7 +401,7 @@ FTN_GET_MAX_THREADS( void )
}
int FTN_STDCALL
-FTN_GET_THREAD_NUM( void )
+xexpand(FTN_GET_THREAD_NUM)( void )
{
#ifdef KMP_STUB
return 0;
@@ -458,7 +458,7 @@ FTN_GET_NUM_KNOWN_THREADS( void )
}
int FTN_STDCALL
-FTN_GET_NUM_PROCS( void )
+xexpand(FTN_GET_NUM_PROCS)( void )
{
#ifdef KMP_STUB
return 1;
@@ -472,7 +472,7 @@ FTN_GET_NUM_PROCS( void )
}
void FTN_STDCALL
-FTN_SET_NESTED( int KMP_DEREF flag )
+xexpand(FTN_SET_NESTED)( int KMP_DEREF flag )
{
#ifdef KMP_STUB
__kmps_set_nested( KMP_DEREF flag );
@@ -487,7 +487,7 @@ FTN_SET_NESTED( int KMP_DEREF flag )
int FTN_STDCALL
-FTN_GET_NESTED( void )
+xexpand(FTN_GET_NESTED)( void )
{
#ifdef KMP_STUB
return __kmps_get_nested();
@@ -499,7 +499,7 @@ FTN_GET_NESTED( void )
}
void FTN_STDCALL
-FTN_SET_DYNAMIC( int KMP_DEREF flag )
+xexpand(FTN_SET_DYNAMIC)( int KMP_DEREF flag )
{
#ifdef KMP_STUB
__kmps_set_dynamic( KMP_DEREF flag ? TRUE : FALSE );
@@ -515,7 +515,7 @@ FTN_SET_DYNAMIC( int KMP_DEREF flag )
int FTN_STDCALL
-FTN_GET_DYNAMIC( void )
+xexpand(FTN_GET_DYNAMIC)( void )
{
#ifdef KMP_STUB
return __kmps_get_dynamic();
@@ -527,7 +527,7 @@ FTN_GET_DYNAMIC( void )
}
int FTN_STDCALL
-FTN_IN_PARALLEL( void )
+xexpand(FTN_IN_PARALLEL)( void )
{
#ifdef KMP_STUB
return 0;
@@ -550,7 +550,7 @@ FTN_IN_PARALLEL( void )
#if OMP_30_ENABLED
void FTN_STDCALL
-FTN_SET_SCHEDULE( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
+xexpand(FTN_SET_SCHEDULE)( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
{
#ifdef KMP_STUB
__kmps_set_schedule( KMP_DEREF kind, KMP_DEREF modifier );
@@ -562,7 +562,7 @@ FTN_SET_SCHEDULE( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
}
void FTN_STDCALL
-FTN_GET_SCHEDULE( kmp_sched_t * kind, int * modifier )
+xexpand(FTN_GET_SCHEDULE)( kmp_sched_t * kind, int * modifier )
{
#ifdef KMP_STUB
__kmps_get_schedule( kind, modifier );
@@ -574,7 +574,7 @@ FTN_GET_SCHEDULE( kmp_sched_t * kind, int * modifier )
}
void FTN_STDCALL
-FTN_SET_MAX_ACTIVE_LEVELS( int KMP_DEREF arg )
+xexpand(FTN_SET_MAX_ACTIVE_LEVELS)( int KMP_DEREF arg )
{
#ifdef KMP_STUB
// Nothing.
@@ -586,7 +586,7 @@ FTN_SET_MAX_ACTIVE_LEVELS( int KMP_DEREF arg )
}
int FTN_STDCALL
-FTN_GET_MAX_ACTIVE_LEVELS( void )
+xexpand(FTN_GET_MAX_ACTIVE_LEVELS)( void )
{
#ifdef KMP_STUB
return 0;
@@ -598,7 +598,7 @@ FTN_GET_MAX_ACTIVE_LEVELS( void )
}
int FTN_STDCALL
-FTN_GET_ACTIVE_LEVEL( void )
+xexpand(FTN_GET_ACTIVE_LEVEL)( void )
{
#ifdef KMP_STUB
return 0; // returns 0 if it is called from the sequential part of the program
@@ -610,7 +610,7 @@ FTN_GET_ACTIVE_LEVEL( void )
}
int FTN_STDCALL
-FTN_GET_LEVEL( void )
+xexpand(FTN_GET_LEVEL)( void )
{
#ifdef KMP_STUB
return 0; // returns 0 if it is called from the sequential part of the program
@@ -622,7 +622,7 @@ FTN_GET_LEVEL( void )
}
int FTN_STDCALL
-FTN_GET_ANCESTOR_THREAD_NUM( int KMP_DEREF level )
+xexpand(FTN_GET_ANCESTOR_THREAD_NUM)( int KMP_DEREF level )
{
#ifdef KMP_STUB
return ( KMP_DEREF level ) ? ( -1 ) : ( 0 );
@@ -632,7 +632,7 @@ FTN_GET_ANCESTOR_THREAD_NUM( int KMP_DEREF level )
}
int FTN_STDCALL
-FTN_GET_TEAM_SIZE( int KMP_DEREF level )
+xexpand(FTN_GET_TEAM_SIZE)( int KMP_DEREF level )
{
#ifdef KMP_STUB
return ( KMP_DEREF level ) ? ( -1 ) : ( 1 );
@@ -642,7 +642,7 @@ FTN_GET_TEAM_SIZE( int KMP_DEREF level )
}
int FTN_STDCALL
-FTN_GET_THREAD_LIMIT( void )
+xexpand(FTN_GET_THREAD_LIMIT)( void )
{
#ifdef KMP_STUB
return 1; // TO DO: clarify whether it returns 1 or 0?
@@ -656,7 +656,7 @@ FTN_GET_THREAD_LIMIT( void )
}
int FTN_STDCALL
-FTN_IN_FINAL( void )
+xexpand(FTN_IN_FINAL)( void )
{
#ifdef KMP_STUB
return 0; // TO DO: clarify whether it returns 1 or 0?
@@ -674,7 +674,7 @@ FTN_IN_FINAL( void )
kmp_proc_bind_t FTN_STDCALL
-FTN_GET_PROC_BIND( void )
+xexpand(FTN_GET_PROC_BIND)( void )
{
#ifdef KMP_STUB
return __kmps_get_proc_bind();
@@ -684,7 +684,7 @@ FTN_GET_PROC_BIND( void )
}
int FTN_STDCALL
-FTN_GET_NUM_TEAMS( void )
+xexpand(FTN_GET_NUM_TEAMS)( void )
{
#ifdef KMP_STUB
return 1;
@@ -723,7 +723,7 @@ FTN_GET_NUM_TEAMS( void )
}
int FTN_STDCALL
-FTN_GET_TEAM_NUM( void )
+xexpand(FTN_GET_TEAM_NUM)( void )
{
#ifdef KMP_STUB
return 0;
@@ -793,7 +793,7 @@ typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
/* initialize the lock */
void FTN_STDCALL
-FTN_INIT_LOCK( void **user_lock )
+xexpand(FTN_INIT_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
*((kmp_stub_lock_t *)user_lock) = UNLOCKED;
@@ -804,7 +804,7 @@ FTN_INIT_LOCK( void **user_lock )
/* initialize the lock */
void FTN_STDCALL
-FTN_INIT_NEST_LOCK( void **user_lock )
+xexpand(FTN_INIT_NEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
*((kmp_stub_lock_t *)user_lock) = UNLOCKED;
@@ -814,7 +814,7 @@ FTN_INIT_NEST_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_DESTROY_LOCK( void **user_lock )
+xexpand(FTN_DESTROY_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
*((kmp_stub_lock_t *)user_lock) = UNINIT;
@@ -824,7 +824,7 @@ FTN_DESTROY_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_DESTROY_NEST_LOCK( void **user_lock )
+xexpand(FTN_DESTROY_NEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
*((kmp_stub_lock_t *)user_lock) = UNINIT;
@@ -834,7 +834,7 @@ FTN_DESTROY_NEST_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_SET_LOCK( void **user_lock )
+xexpand(FTN_SET_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -850,7 +850,7 @@ FTN_SET_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_SET_NEST_LOCK( void **user_lock )
+xexpand(FTN_SET_NEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -863,7 +863,7 @@ FTN_SET_NEST_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_UNSET_LOCK( void **user_lock )
+xexpand(FTN_UNSET_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -879,7 +879,7 @@ FTN_UNSET_LOCK( void **user_lock )
}
void FTN_STDCALL
-FTN_UNSET_NEST_LOCK( void **user_lock )
+xexpand(FTN_UNSET_NEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -895,7 +895,7 @@ FTN_UNSET_NEST_LOCK( void **user_lock )
}
int FTN_STDCALL
-FTN_TEST_LOCK( void **user_lock )
+xexpand(FTN_TEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -912,7 +912,7 @@ FTN_TEST_LOCK( void **user_lock )
}
int FTN_STDCALL
-FTN_TEST_NEST_LOCK( void **user_lock )
+xexpand(FTN_TEST_NEST_LOCK)( void **user_lock )
{
#ifdef KMP_STUB
if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
@@ -925,7 +925,7 @@ FTN_TEST_NEST_LOCK( void **user_lock )
}
double FTN_STDCALL
-FTN_GET_WTIME( void )
+xexpand(FTN_GET_WTIME)( void )
{
#ifdef KMP_STUB
return __kmps_get_wtime();
@@ -944,7 +944,7 @@ FTN_GET_WTIME( void )
}
double FTN_STDCALL
-FTN_GET_WTICK( void )
+xexpand(FTN_GET_WTICK)( void )
{
#ifdef KMP_STUB
return __kmps_get_wtick();
@@ -1022,6 +1022,191 @@ FTN_SET_DEFAULTS( char const * str
/* ------------------------------------------------------------------------ */
+#if OMP_40_ENABLED
+/* returns the status of cancellation */
+int FTN_STDCALL
+xexpand(FTN_GET_CANCELLATION)(void) {
+#ifdef KMP_STUB
+ return 0 /* false */;
+#else
+ // initialize the library if needed
+ if ( ! __kmp_init_serial ) {
+ __kmp_serial_initialize();
+ }
+ return __kmp_omp_cancellation;
+#endif
+}
+
+int FTN_STDCALL
+FTN_GET_CANCELLATION_STATUS(int cancel_kind) {
+#ifdef KMP_STUB
+ return 0 /* false */;
+#else
+ return __kmp_get_cancellation_status(cancel_kind);
+#endif
+}
+
+#endif // OMP_40_ENABLED
+
+// GCC compatibility (versioned symbols)
+#if KMP_OS_LINUX
+
+/*
+ These following sections create function aliases (dummy symbols) for the omp_* routines.
+ These aliases will then be versioned according to how libgomp ``versions'' its
+ symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the
+ default version which libiomp5 uses: VERSION (defined in exports_so.txt)
+ If you want to see the versioned symbols for libgomp.so.1 then just type:
+
+ objdump -T /path/to/libgomp.so.1 | grep omp_
+
+ Example:
+ Step 1) Create __kmp_api_omp_set_num_threads_10_alias
+ which is alias of __kmp_api_omp_set_num_threads
+ Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version: omp_set_num_threads@OMP_1.0
+ Step 2B) Set __kmp_api_omp_set_num_threads to default version : omp_set_num_threads@@VERSION
+*/
+
+// OMP_1.0 aliases
+xaliasify(FTN_SET_NUM_THREADS, 10);
+xaliasify(FTN_GET_NUM_THREADS, 10);
+xaliasify(FTN_GET_MAX_THREADS, 10);
+xaliasify(FTN_GET_THREAD_NUM, 10);
+xaliasify(FTN_GET_NUM_PROCS, 10);
+xaliasify(FTN_IN_PARALLEL, 10);
+xaliasify(FTN_SET_DYNAMIC, 10);
+xaliasify(FTN_GET_DYNAMIC, 10);
+xaliasify(FTN_SET_NESTED, 10);
+xaliasify(FTN_GET_NESTED, 10);
+xaliasify(FTN_INIT_LOCK, 10);
+xaliasify(FTN_INIT_NEST_LOCK, 10);
+xaliasify(FTN_DESTROY_LOCK, 10);
+xaliasify(FTN_DESTROY_NEST_LOCK, 10);
+xaliasify(FTN_SET_LOCK, 10);
+xaliasify(FTN_SET_NEST_LOCK, 10);
+xaliasify(FTN_UNSET_LOCK, 10);
+xaliasify(FTN_UNSET_NEST_LOCK, 10);
+xaliasify(FTN_TEST_LOCK, 10);
+xaliasify(FTN_TEST_NEST_LOCK, 10);
+
+// OMP_2.0 aliases
+xaliasify(FTN_GET_WTICK, 20);
+xaliasify(FTN_GET_WTIME, 20);
+
+#if OMP_30_ENABLED
+// OMP_3.0 aliases
+xaliasify(FTN_SET_SCHEDULE, 30);
+xaliasify(FTN_GET_SCHEDULE, 30);
+xaliasify(FTN_GET_THREAD_LIMIT, 30);
+xaliasify(FTN_SET_MAX_ACTIVE_LEVELS, 30);
+xaliasify(FTN_GET_MAX_ACTIVE_LEVELS, 30);
+xaliasify(FTN_GET_LEVEL, 30);
+xaliasify(FTN_GET_ANCESTOR_THREAD_NUM, 30);
+xaliasify(FTN_GET_TEAM_SIZE, 30);
+xaliasify(FTN_GET_ACTIVE_LEVEL, 30);
+xaliasify(FTN_INIT_LOCK, 30);
+xaliasify(FTN_INIT_NEST_LOCK, 30);
+xaliasify(FTN_DESTROY_LOCK, 30);
+xaliasify(FTN_DESTROY_NEST_LOCK, 30);
+xaliasify(FTN_SET_LOCK, 30);
+xaliasify(FTN_SET_NEST_LOCK, 30);
+xaliasify(FTN_UNSET_LOCK, 30);
+xaliasify(FTN_UNSET_NEST_LOCK, 30);
+xaliasify(FTN_TEST_LOCK, 30);
+xaliasify(FTN_TEST_NEST_LOCK, 30);
+
+// OMP_3.1 aliases
+xaliasify(FTN_IN_FINAL, 31);
+#endif /* OMP_30_ENABLED */
+
+#if OMP_40_ENABLED
+// OMP_4.0 aliases
+xaliasify(FTN_GET_PROC_BIND, 40);
+xaliasify(FTN_GET_NUM_TEAMS, 40);
+xaliasify(FTN_GET_TEAM_NUM, 40);
+xaliasify(FTN_GET_CANCELLATION, 40);
+#endif /* OMP_40_ENABLED */
+
+#if OMP_41_ENABLED
+// OMP_4.1 aliases
+#endif
+
+#if OMP_50_ENABLED
+// OMP_5.0 aliases
+#endif
+
+// OMP_1.0 versioned symbols
+xversionify(FTN_SET_NUM_THREADS, 10, "OMP_1.0");
+xversionify(FTN_GET_NUM_THREADS, 10, "OMP_1.0");
+xversionify(FTN_GET_MAX_THREADS, 10, "OMP_1.0");
+xversionify(FTN_GET_THREAD_NUM, 10, "OMP_1.0");
+xversionify(FTN_GET_NUM_PROCS, 10, "OMP_1.0");
+xversionify(FTN_IN_PARALLEL, 10, "OMP_1.0");
+xversionify(FTN_SET_DYNAMIC, 10, "OMP_1.0");
+xversionify(FTN_GET_DYNAMIC, 10, "OMP_1.0");
+xversionify(FTN_SET_NESTED, 10, "OMP_1.0");
+xversionify(FTN_GET_NESTED, 10, "OMP_1.0");
+xversionify(FTN_INIT_LOCK, 10, "OMP_1.0");
+xversionify(FTN_INIT_NEST_LOCK, 10, "OMP_1.0");
+xversionify(FTN_DESTROY_LOCK, 10, "OMP_1.0");
+xversionify(FTN_DESTROY_NEST_LOCK, 10, "OMP_1.0");
+xversionify(FTN_SET_LOCK, 10, "OMP_1.0");
+xversionify(FTN_SET_NEST_LOCK, 10, "OMP_1.0");
+xversionify(FTN_UNSET_LOCK, 10, "OMP_1.0");
+xversionify(FTN_UNSET_NEST_LOCK, 10, "OMP_1.0");
+xversionify(FTN_TEST_LOCK, 10, "OMP_1.0");
+xversionify(FTN_TEST_NEST_LOCK, 10, "OMP_1.0");
+
+// OMP_2.0 versioned symbols
+xversionify(FTN_GET_WTICK, 20, "OMP_2.0");
+xversionify(FTN_GET_WTIME, 20, "OMP_2.0");
+
+#if OMP_30_ENABLED
+// OMP_3.0 versioned symbols
+xversionify(FTN_SET_SCHEDULE, 30, "OMP_3.0");
+xversionify(FTN_GET_SCHEDULE, 30, "OMP_3.0");
+xversionify(FTN_GET_THREAD_LIMIT, 30, "OMP_3.0");
+xversionify(FTN_SET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
+xversionify(FTN_GET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
+xversionify(FTN_GET_ANCESTOR_THREAD_NUM, 30, "OMP_3.0");
+xversionify(FTN_GET_LEVEL, 30, "OMP_3.0");
+xversionify(FTN_GET_TEAM_SIZE, 30, "OMP_3.0");
+xversionify(FTN_GET_ACTIVE_LEVEL, 30, "OMP_3.0");
+
+// the lock routines have a 1.0 and 3.0 version
+xversionify(FTN_INIT_LOCK, 30, "OMP_3.0");
+xversionify(FTN_INIT_NEST_LOCK, 30, "OMP_3.0");
+xversionify(FTN_DESTROY_LOCK, 30, "OMP_3.0");
+xversionify(FTN_DESTROY_NEST_LOCK, 30, "OMP_3.0");
+xversionify(FTN_SET_LOCK, 30, "OMP_3.0");
+xversionify(FTN_SET_NEST_LOCK, 30, "OMP_3.0");
+xversionify(FTN_UNSET_LOCK, 30, "OMP_3.0");
+xversionify(FTN_UNSET_NEST_LOCK, 30, "OMP_3.0");
+xversionify(FTN_TEST_LOCK, 30, "OMP_3.0");
+xversionify(FTN_TEST_NEST_LOCK, 30, "OMP_3.0");
+
+// OMP_3.1 versioned symbol
+xversionify(FTN_IN_FINAL, 31, "OMP_3.1");
+#endif /* OMP_30_ENABLED */
+
+#if OMP_40_ENABLED
+// OMP_4.0 versioned symbols
+xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0");
+xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0");
+xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0");
+xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0");
+#endif /* OMP_40_ENABLED */
+
+#if OMP_41_ENABLED
+// OMP_4.1 versioned symbols
+#endif
+
+#if OMP_50_ENABLED
+// OMP_5.0 versioned symbols
+#endif
+
+#endif /* KMP_OS_LINUX */
+
#ifdef __cplusplus
} //extern "C"
#endif // __cplusplus
diff --git a/openmp/runtime/src/kmp_ftn_extra.c b/openmp/runtime/src/kmp_ftn_extra.c
index 6e1bb7eac03..6777e01ba98 100644
--- a/openmp/runtime/src/kmp_ftn_extra.c
+++ b/openmp/runtime/src/kmp_ftn_extra.c
@@ -1,7 +1,7 @@
/*
* kmp_ftn_extra.c -- Fortran 'extra' linkage support for OpenMP.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42757 $
+ * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $
*/
@@ -17,21 +17,19 @@
#include "kmp.h"
+#if KMP_OS_WINDOWS
+# define KMP_FTN_ENTRIES KMP_FTN_PLAIN
+#elif KMP_OS_UNIX
+# define KMP_FTN_ENTRIES KMP_FTN_APPEND
+#endif
+
// Note: This string is not printed when KMP_VERSION=1.
char const __kmp_version_ftnextra[] = KMP_VERSION_PREFIX "Fortran \"extra\" OMP support: "
-#ifdef USE_FTN_EXTRA
+#ifdef KMP_FTN_ENTRIES
"yes";
+# define FTN_STDCALL /* nothing to do */
+# include "kmp_ftn_os.h"
+# include "kmp_ftn_entry.h"
#else
"no";
-#endif
-
-#ifdef USE_FTN_EXTRA
-
-#define FTN_STDCALL /* nothing to do */
-#define KMP_FTN_ENTRIES USE_FTN_EXTRA
-
-#include "kmp_ftn_os.h"
-#include "kmp_ftn_entry.h"
-
-#endif /* USE_FTN_EXTRA */
-
+#endif /* KMP_FTN_ENTRIES */
diff --git a/openmp/runtime/src/kmp_ftn_os.h b/openmp/runtime/src/kmp_ftn_os.h
index c52ca1e0a79..f241751c7e9 100644
--- a/openmp/runtime/src/kmp_ftn_os.h
+++ b/openmp/runtime/src/kmp_ftn_os.h
@@ -1,7 +1,7 @@
/*
* kmp_ftn_os.h -- KPTS Fortran defines header file.
- * $Revision: 42478 $
- * $Date: 2013-07-02 15:15:08 -0500 (Tue, 02 Jul 2013) $
+ * $Revision: 42745 $
+ * $Date: 2013-10-14 17:02:04 -0500 (Mon, 14 Oct 2013) $
*/
@@ -105,6 +105,11 @@
#endif
#endif
+#if OMP_40_ENABLED
+ #define FTN_GET_CANCELLATION omp_get_cancellation
+ #define FTN_GET_CANCELLATION_STATUS kmp_get_cancellation_status
+#endif
+
#endif /* KMP_FTN_PLAIN */
/* ------------------------------------------------------------------------ */
@@ -192,6 +197,11 @@
#endif
+#if OMP_40_ENABLED
+ #define FTN_GET_CANCELLATION omp_get_cancellation_
+ #define FTN_GET_CANCELLATION_STATUS kmp_get_cancellation_status_
+#endif
+
#endif /* KMP_FTN_APPEND */
/* ------------------------------------------------------------------------ */
@@ -279,6 +289,11 @@
#endif
+#if OMP_40_ENABLED
+ #define FTN_GET_CANCELLATION OMP_GET_CANCELLATION
+ #define FTN_GET_CANCELLATION_STATUS KMP_GET_CANCELLATION_STATUS
+#endif
+
#endif /* KMP_FTN_UPPER */
/* ------------------------------------------------------------------------ */
@@ -366,7 +381,134 @@
#endif
+#if OMP_40_ENABLED
+ #define FTN_GET_CANCELLATION OMP_GET_CANCELLATION_
+ #define FTN_GET_CANCELLATION_STATUS KMP_GET_CANCELLATION_STATUS_
+#endif
+
#endif /* KMP_FTN_UAPPEND */
+/* ------------------------------------------------------------------ */
+/* -------------------------- GOMP API NAMES ------------------------ */
+// All GOMP_1.0 symbols
+#define KMP_API_NAME_GOMP_ATOMIC_END GOMP_atomic_end
+#define KMP_API_NAME_GOMP_ATOMIC_START GOMP_atomic_start
+#define KMP_API_NAME_GOMP_BARRIER GOMP_barrier
+#define KMP_API_NAME_GOMP_CRITICAL_END GOMP_critical_end
+#define KMP_API_NAME_GOMP_CRITICAL_NAME_END GOMP_critical_name_end
+#define KMP_API_NAME_GOMP_CRITICAL_NAME_START GOMP_critical_name_start
+#define KMP_API_NAME_GOMP_CRITICAL_START GOMP_critical_start
+#define KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT GOMP_loop_dynamic_next
+#define KMP_API_NAME_GOMP_LOOP_DYNAMIC_START GOMP_loop_dynamic_start
+#define KMP_API_NAME_GOMP_LOOP_END GOMP_loop_end
+#define KMP_API_NAME_GOMP_LOOP_END_NOWAIT GOMP_loop_end_nowait
+#define KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT GOMP_loop_guided_next
+#define KMP_API_NAME_GOMP_LOOP_GUIDED_START GOMP_loop_guided_start
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT GOMP_loop_ordered_dynamic_next
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START GOMP_loop_ordered_dynamic_start
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT GOMP_loop_ordered_guided_next
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START GOMP_loop_ordered_guided_start
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT GOMP_loop_ordered_runtime_next
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START GOMP_loop_ordered_runtime_start
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT GOMP_loop_ordered_static_next
+#define KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START GOMP_loop_ordered_static_start
+#define KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT GOMP_loop_runtime_next
+#define KMP_API_NAME_GOMP_LOOP_RUNTIME_START GOMP_loop_runtime_start
+#define KMP_API_NAME_GOMP_LOOP_STATIC_NEXT GOMP_loop_static_next
+#define KMP_API_NAME_GOMP_LOOP_STATIC_START GOMP_loop_static_start
+#define KMP_API_NAME_GOMP_ORDERED_END GOMP_ordered_end
+#define KMP_API_NAME_GOMP_ORDERED_START GOMP_ordered_start
+#define KMP_API_NAME_GOMP_PARALLEL_END GOMP_parallel_end
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START GOMP_parallel_loop_dynamic_start
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START GOMP_parallel_loop_guided_start
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START GOMP_parallel_loop_runtime_start
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START GOMP_parallel_loop_static_start
+#define KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START GOMP_parallel_sections_start
+#define KMP_API_NAME_GOMP_PARALLEL_START GOMP_parallel_start
+#define KMP_API_NAME_GOMP_SECTIONS_END GOMP_sections_end
+#define KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT GOMP_sections_end_nowait
+#define KMP_API_NAME_GOMP_SECTIONS_NEXT GOMP_sections_next
+#define KMP_API_NAME_GOMP_SECTIONS_START GOMP_sections_start
+#define KMP_API_NAME_GOMP_SINGLE_COPY_END GOMP_single_copy_end
+#define KMP_API_NAME_GOMP_SINGLE_COPY_START GOMP_single_copy_start
+#define KMP_API_NAME_GOMP_SINGLE_START GOMP_single_start
+
+// All GOMP_2.0 symbols
+#define KMP_API_NAME_GOMP_TASK GOMP_task
+#define KMP_API_NAME_GOMP_TASKWAIT GOMP_taskwait
+#define KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT GOMP_loop_ull_dynamic_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START GOMP_loop_ull_dynamic_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT GOMP_loop_ull_guided_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START GOMP_loop_ull_guided_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT GOMP_loop_ull_ordered_dynamic_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START GOMP_loop_ull_ordered_dynamic_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT GOMP_loop_ull_ordered_guided_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START GOMP_loop_ull_ordered_guided_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT GOMP_loop_ull_ordered_runtime_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START GOMP_loop_ull_ordered_runtime_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT GOMP_loop_ull_ordered_static_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START GOMP_loop_ull_ordered_static_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT GOMP_loop_ull_runtime_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START GOMP_loop_ull_runtime_start
+#define KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT GOMP_loop_ull_static_next
+#define KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START GOMP_loop_ull_static_start
+
+// All GOMP_3.0 symbols
+#define KMP_API_NAME_GOMP_TASKYIELD GOMP_taskyield
+
+// All GOMP_4.0 symbols
+// TODO: As of 2013-10-14, none of the GOMP_4.0 functions are implemented in libiomp5
+#define KMP_API_NAME_GOMP_BARRIER_CANCEL GOMP_barrier_cancel
+#define KMP_API_NAME_GOMP_CANCEL GOMP_cancel
+#define KMP_API_NAME_GOMP_CANCELLATION_POINT GOMP_cancellation_point
+#define KMP_API_NAME_GOMP_LOOP_END_CANCEL GOMP_loop_end_cancel
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC GOMP_parallel_loop_dynamic
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED GOMP_parallel_loop_guided
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME GOMP_parallel_loop_runtime
+#define KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC GOMP_parallel_loop_static
+#define KMP_API_NAME_GOMP_PARALLEL_SECTIONS GOMP_parallel_sections
+#define KMP_API_NAME_GOMP_PARALLEL GOMP_parallel
+#define KMP_API_NAME_GOMP_SECTIONS_END_CANCEL GOMP_sections_end_cancel
+#define KMP_API_NAME_GOMP_TASKGROUP_START GOMP_taskgroup_start
+#define KMP_API_NAME_GOMP_TASKGROUP_END GOMP_taskgroup_end
+/* Target functions should be taken care of by liboffload */
+//#define KMP_API_NAME_GOMP_TARGET GOMP_target
+//#define KMP_API_NAME_GOMP_TARGET_DATA GOMP_target_data
+//#define KMP_API_NAME_GOMP_TARGET_END_DATA GOMP_target_end_data
+//#define KMP_API_NAME_GOMP_TARGET_UPDATE GOMP_target_update
+#define KMP_API_NAME_GOMP_TEAMS GOMP_teams
+
+#if KMP_OS_LINUX
+ #define xstr(x) str(x)
+ #define str(x) #x
+
+ // If Linux, xexpand prepends __kmp_api_ to the real API name
+ #define xexpand(api_name) expand(api_name)
+ #define expand(api_name) __kmp_api_##api_name
+
+ #define xaliasify(api_name,ver) aliasify(api_name,ver)
+ #define aliasify(api_name,ver) __typeof__(__kmp_api_##api_name) __kmp_api_##api_name##_##ver##_alias __attribute__((alias(xstr(__kmp_api_##api_name))))
+
+ #define xversionify(api_name, version_num, version_str) versionify(api_name, version_num, version_str, "VERSION")
+ #define versionify(api_name, version_num, version_str, default_ver) \
+ __asm__(".symver " xstr(__kmp_api_##api_name##_##version_num##_alias) "," xstr(api_name) "@" version_str "\n\t"); \
+ __asm__(".symver " xstr(__kmp_api_##api_name) "," xstr(api_name) "@@" default_ver "\n\t")
+
+#else /* KMP_OS_LINUX */
+ #define xstr(x) /* Nothing */
+ #define str(x) /* Nothing */
+
+ // if Windows or Mac, xexpand does no name transformation
+ #define xexpand(api_name) expand(api_name)
+ #define expand(api_name) api_name
+
+ #define xaliasify(api_name,ver) /* Nothing */
+ #define aliasify(api_name,ver) /* Nothing */
+
+ #define xversionify(api_name, version_num, version_str) /* Nothing */
+ #define versionify(api_name, version_num, version_str, default_ver) /* Nothing */
+
+#endif /* KMP_OS_LINUX */
+
#endif /* KMP_FTN_OS_H */
diff --git a/openmp/runtime/src/kmp_global.c b/openmp/runtime/src/kmp_global.c
index db817648c86..b27b17164c3 100644
--- a/openmp/runtime/src/kmp_global.c
+++ b/openmp/runtime/src/kmp_global.c
@@ -1,7 +1,7 @@
/*
* kmp_global.c -- KPTS global variables for runtime support library
- * $Revision: 42642 $
- * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $
+ * $Revision: 42816 $
+ * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
*/
@@ -24,7 +24,6 @@ char __kmp_setversion_string[] = VERSION_STRING;
kmp_key_t __kmp_gtid_threadprivate_key;
kmp_cpuinfo_t __kmp_cpuinfo = { 0 }; // Not initialized
-kmp_uint64 __kmp_cpu_frequency = 0;
/* ----------------------------------------------------- */
@@ -181,6 +180,7 @@ char * __kmp_speculative_statsfile = "-";
#if OMP_40_ENABLED
int __kmp_display_env = FALSE;
int __kmp_display_env_verbose = FALSE;
+int __kmp_omp_cancellation = FALSE;
#endif
/* map OMP 3.0 schedule types with our internal schedule types */
@@ -266,9 +266,6 @@ int __kmp_duplicate_library_ok = 0;
#if USE_ITT_BUILD
int __kmp_forkjoin_frames = 1;
int __kmp_forkjoin_frames_mode = 0;
-FILE * __kmp_itt_csv_file;
-kmp_str_buf_t __kmp_itt_frame_buffer;
-
#endif
PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method = reduction_method_not_defined;
int __kmp_determ_red = FALSE;
diff --git a/openmp/runtime/src/kmp_gsupport.c b/openmp/runtime/src/kmp_gsupport.c
index 33e8fba5d66..9d8e5530cd3 100644
--- a/openmp/runtime/src/kmp_gsupport.c
+++ b/openmp/runtime/src/kmp_gsupport.c
@@ -1,7 +1,7 @@
/*
* kmp_gsupport.c
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -28,9 +28,10 @@
#define MKLOC(loc,routine) \
static ident_t (loc) = {0, KMP_IDENT_KMPC, 0, 0, ";unknown;unknown;0;0;;" };
+#include "kmp_ftn_os.h"
void
-GOMP_barrier(void)
+xexpand(KMP_API_NAME_GOMP_BARRIER)(void)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_barrier");
@@ -58,7 +59,7 @@ extern kmp_critical_name *__kmp_unnamed_critical_addr;
void
-GOMP_critical_start(void)
+xexpand(KMP_API_NAME_GOMP_CRITICAL_START)(void)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_critical_start");
@@ -68,7 +69,7 @@ GOMP_critical_start(void)
void
-GOMP_critical_end(void)
+xexpand(KMP_API_NAME_GOMP_CRITICAL_END)(void)
{
int gtid = __kmp_get_gtid();
MKLOC(loc, "GOMP_critical_end");
@@ -78,7 +79,7 @@ GOMP_critical_end(void)
void
-GOMP_critical_name_start(void **pptr)
+xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_START)(void **pptr)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_critical_name_start");
@@ -88,7 +89,7 @@ GOMP_critical_name_start(void **pptr)
void
-GOMP_critical_name_end(void **pptr)
+xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_END)(void **pptr)
{
int gtid = __kmp_get_gtid();
MKLOC(loc, "GOMP_critical_name_end");
@@ -104,7 +105,7 @@ GOMP_critical_name_end(void **pptr)
//
void
-GOMP_atomic_start(void)
+xexpand(KMP_API_NAME_GOMP_ATOMIC_START)(void)
{
int gtid = __kmp_entry_gtid();
KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid));
@@ -113,7 +114,7 @@ GOMP_atomic_start(void)
void
-GOMP_atomic_end(void)
+xexpand(KMP_API_NAME_GOMP_ATOMIC_END)(void)
{
int gtid = __kmp_get_gtid();
KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid));
@@ -122,7 +123,7 @@ GOMP_atomic_end(void)
int
-GOMP_single_start(void)
+xexpand(KMP_API_NAME_GOMP_SINGLE_START)(void)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_single_start");
@@ -141,7 +142,7 @@ GOMP_single_start(void)
void *
-GOMP_single_copy_start(void)
+xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_START)(void)
{
void *retval;
int gtid = __kmp_entry_gtid();
@@ -176,7 +177,7 @@ GOMP_single_copy_start(void)
void
-GOMP_single_copy_end(void *data)
+xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_END)(void *data)
{
int gtid = __kmp_get_gtid();
MKLOC(loc, "GOMP_single_copy_end");
@@ -196,7 +197,7 @@ GOMP_single_copy_end(void *data)
void
-GOMP_ordered_start(void)
+xexpand(KMP_API_NAME_GOMP_ORDERED_START)(void)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_ordered_start");
@@ -206,7 +207,7 @@ GOMP_ordered_start(void)
void
-GOMP_ordered_end(void)
+xexpand(KMP_API_NAME_GOMP_ORDERED_END)(void)
{
int gtid = __kmp_get_gtid();
MKLOC(loc, "GOMP_ordered_end");
@@ -223,7 +224,7 @@ GOMP_ordered_end(void)
// (IA-32 architecture) or 64-bit signed (Intel(R) 64).
//
-#if KMP_ARCH_X86
+#if KMP_ARCH_X86 || KMP_ARCH_ARM
# define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4
# define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4
# define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4
@@ -287,7 +288,7 @@ __kmp_GOMP_fork_call(ident_t *loc, int gtid, microtask_t wrapper, int argc,...)
va_start(ap, argc);
rc = __kmp_fork_call(loc, gtid, FALSE, argc, wrapper, __kmp_invoke_task_func,
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
&ap
#else
ap
@@ -305,7 +306,7 @@ __kmp_GOMP_fork_call(ident_t *loc, int gtid, microtask_t wrapper, int argc,...)
void
-GOMP_parallel_start(void (*task)(void *), void *data, unsigned num_threads)
+xexpand(KMP_API_NAME_GOMP_PARALLEL_START)(void (*task)(void *), void *data, unsigned num_threads)
{
int gtid = __kmp_entry_gtid();
MKLOC(loc, "GOMP_parallel_start");
@@ -325,7 +326,7 @@ GOMP_parallel_start(void (*task)(void *), void *data, unsigned num_threads)
void
-GOMP_parallel_end(void)
+xexpand(KMP_API_NAME_GOMP_PARALLEL_END)(void)
{
int gtid = __kmp_get_gtid();
MKLOC(loc, "GOMP_parallel_end");
@@ -457,31 +458,31 @@ GOMP_parallel_end(void)
}
-LOOP_START(GOMP_loop_static_start, kmp_sch_static)
-LOOP_NEXT(GOMP_loop_static_next, {})
-LOOP_START(GOMP_loop_dynamic_start, kmp_sch_dynamic_chunked)
-LOOP_NEXT(GOMP_loop_dynamic_next, {})
-LOOP_START(GOMP_loop_guided_start, kmp_sch_guided_chunked)
-LOOP_NEXT(GOMP_loop_guided_next, {})
-LOOP_RUNTIME_START(GOMP_loop_runtime_start, kmp_sch_runtime)
-LOOP_NEXT(GOMP_loop_runtime_next, {})
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_START), kmp_sch_static)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT), {})
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START), kmp_sch_dynamic_chunked)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT), {})
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_START), kmp_sch_guided_chunked)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT), {})
+LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_START), kmp_sch_runtime)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT), {})
-LOOP_START(GOMP_loop_ordered_static_start, kmp_ord_static)
-LOOP_NEXT(GOMP_loop_ordered_static_next, \
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START), kmp_ord_static)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
-LOOP_START(GOMP_loop_ordered_dynamic_start, kmp_ord_dynamic_chunked)
-LOOP_NEXT(GOMP_loop_ordered_dynamic_next, \
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START), kmp_ord_dynamic_chunked)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
-LOOP_START(GOMP_loop_ordered_guided_start, kmp_ord_guided_chunked)
-LOOP_NEXT(GOMP_loop_ordered_guided_next, \
+LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START), kmp_ord_guided_chunked)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
-LOOP_RUNTIME_START(GOMP_loop_ordered_runtime_start, kmp_ord_runtime)
-LOOP_NEXT(GOMP_loop_ordered_runtime_next, \
+LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START), kmp_ord_runtime)
+LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
void
-GOMP_loop_end(void)
+xexpand(KMP_API_NAME_GOMP_LOOP_END)(void)
{
int gtid = __kmp_get_gtid();
KA_TRACE(20, ("GOMP_loop_end: T#%d\n", gtid))
@@ -493,7 +494,7 @@ GOMP_loop_end(void)
void
-GOMP_loop_end_nowait(void)
+xexpand(KMP_API_NAME_GOMP_LOOP_END_NOWAIT)(void)
{
KA_TRACE(20, ("GOMP_loop_end_nowait: T#%d\n", __kmp_get_gtid()))
}
@@ -598,26 +599,26 @@ GOMP_loop_end_nowait(void)
}
-LOOP_START_ULL(GOMP_loop_ull_static_start, kmp_sch_static)
-LOOP_NEXT_ULL(GOMP_loop_ull_static_next, {})
-LOOP_START_ULL(GOMP_loop_ull_dynamic_start, kmp_sch_dynamic_chunked)
-LOOP_NEXT_ULL(GOMP_loop_ull_dynamic_next, {})
-LOOP_START_ULL(GOMP_loop_ull_guided_start, kmp_sch_guided_chunked)
-LOOP_NEXT_ULL(GOMP_loop_ull_guided_next, {})
-LOOP_RUNTIME_START_ULL(GOMP_loop_ull_runtime_start, kmp_sch_runtime)
-LOOP_NEXT_ULL(GOMP_loop_ull_runtime_next, {})
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START), kmp_sch_static)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT), {})
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START), kmp_sch_dynamic_chunked)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT), {})
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START), kmp_sch_guided_chunked)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT), {})
+LOOP_RUNTIME_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START), kmp_sch_runtime)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT), {})
-LOOP_START_ULL(GOMP_loop_ull_ordered_static_start, kmp_ord_static)
-LOOP_NEXT_ULL(GOMP_loop_ull_ordered_static_next, \
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START), kmp_ord_static)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
-LOOP_START_ULL(GOMP_loop_ull_ordered_dynamic_start, kmp_ord_dynamic_chunked)
-LOOP_NEXT_ULL(GOMP_loop_ull_ordered_dynamic_next, \
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START), kmp_ord_dynamic_chunked)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
-LOOP_START_ULL(GOMP_loop_ull_ordered_guided_start, kmp_ord_guided_chunked)
-LOOP_NEXT_ULL(GOMP_loop_ull_ordered_guided_next, \
+LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START), kmp_ord_guided_chunked)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
-LOOP_RUNTIME_START_ULL(GOMP_loop_ull_ordered_runtime_start, kmp_ord_runtime)
-LOOP_NEXT_ULL(GOMP_loop_ull_ordered_runtime_next, \
+LOOP_RUNTIME_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START), kmp_ord_runtime)
+LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT), \
{ KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
@@ -659,10 +660,10 @@ LOOP_NEXT_ULL(GOMP_loop_ull_ordered_runtime_next, \
}
-PARALLEL_LOOP_START(GOMP_parallel_loop_static_start, kmp_sch_static)
-PARALLEL_LOOP_START(GOMP_parallel_loop_dynamic_start, kmp_sch_dynamic_chunked)
-PARALLEL_LOOP_START(GOMP_parallel_loop_guided_start, kmp_sch_guided_chunked)
-PARALLEL_LOOP_START(GOMP_parallel_loop_runtime_start, kmp_sch_runtime)
+PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START), kmp_sch_static)
+PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START), kmp_sch_dynamic_chunked)
+PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START), kmp_sch_guided_chunked)
+PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START), kmp_sch_runtime)
#if OMP_30_ENABLED
@@ -674,7 +675,7 @@ PARALLEL_LOOP_START(GOMP_parallel_loop_runtime_start, kmp_sch_runtime)
//
void
-GOMP_task(void (*func)(void *), void *data, void (*copy_func)(void *, void *),
+xexpand(KMP_API_NAME_GOMP_TASK)(void (*func)(void *), void *data, void (*copy_func)(void *, void *),
long arg_size, long arg_align, int if_cond, unsigned gomp_flags)
{
MKLOC(loc, "GOMP_task");
@@ -728,7 +729,7 @@ GOMP_task(void (*func)(void *), void *data, void (*copy_func)(void *, void *),
void
-GOMP_taskwait(void)
+xexpand(KMP_API_NAME_GOMP_TASKWAIT)(void)
{
MKLOC(loc, "GOMP_taskwait");
int gtid = __kmp_entry_gtid();
@@ -759,7 +760,7 @@ GOMP_taskwait(void)
//
unsigned
-GOMP_sections_start(unsigned count)
+xexpand(KMP_API_NAME_GOMP_SECTIONS_START)(unsigned count)
{
int status;
kmp_int lb, ub, stride;
@@ -786,7 +787,7 @@ GOMP_sections_start(unsigned count)
unsigned
-GOMP_sections_next(void)
+xexpand(KMP_API_NAME_GOMP_SECTIONS_NEXT)(void)
{
int status;
kmp_int lb, ub, stride;
@@ -811,7 +812,7 @@ GOMP_sections_next(void)
void
-GOMP_parallel_sections_start(void (*task) (void *), void *data,
+xexpand(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START)(void (*task) (void *), void *data,
unsigned num_threads, unsigned count)
{
int gtid = __kmp_entry_gtid();
@@ -839,7 +840,7 @@ GOMP_parallel_sections_start(void (*task) (void *), void *data,
void
-GOMP_sections_end(void)
+xexpand(KMP_API_NAME_GOMP_SECTIONS_END)(void)
{
int gtid = __kmp_get_gtid();
KA_TRACE(20, ("GOMP_sections_end: T#%d\n", gtid))
@@ -851,11 +852,175 @@ GOMP_sections_end(void)
void
-GOMP_sections_end_nowait(void)
+xexpand(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT)(void)
{
KA_TRACE(20, ("GOMP_sections_end_nowait: T#%d\n", __kmp_get_gtid()))
}
+// libgomp has an empty function for GOMP_taskyield as of 2013-10-10
+void
+xexpand(KMP_API_NAME_GOMP_TASKYIELD)(void)
+{
+
+}
+
+/*
+ The following sections of code create aliases for the GOMP_* functions,
+ then create versioned symbols using the assembler directive .symver.
+ This is only pertinent for ELF .so library
+ xaliasify and xversionify are defined in kmp_ftn_os.h
+*/
+
+#if KMP_OS_LINUX
+
+// GOMP_1.0 aliases
+xaliasify(KMP_API_NAME_GOMP_ATOMIC_END, 10);
+xaliasify(KMP_API_NAME_GOMP_ATOMIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_BARRIER, 10);
+xaliasify(KMP_API_NAME_GOMP_CRITICAL_END, 10);
+xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10);
+xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10);
+xaliasify(KMP_API_NAME_GOMP_CRITICAL_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_END, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_ORDERED_END, 10);
+xaliasify(KMP_API_NAME_GOMP_ORDERED_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_END, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_START, 10);
+xaliasify(KMP_API_NAME_GOMP_SECTIONS_END, 10);
+xaliasify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10);
+xaliasify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10);
+xaliasify(KMP_API_NAME_GOMP_SECTIONS_START, 10);
+xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10);
+xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10);
+xaliasify(KMP_API_NAME_GOMP_SINGLE_START, 10);
+
+// GOMP_2.0 aliases
+#if OMP_30_ENABLED
+xaliasify(KMP_API_NAME_GOMP_TASK, 20);
+xaliasify(KMP_API_NAME_GOMP_TASKWAIT, 20);
+#endif
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20);
+xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20);
+
+// GOMP_3.0 aliases
+xaliasify(KMP_API_NAME_GOMP_TASKYIELD, 30);
+
+// GOMP_4.0 aliases
+/* TODO: add GOMP_4.0 aliases when corresponding
+ GOMP_* functions are implemented
+*/
+
+// GOMP_1.0 versioned symbols
+xversionify(KMP_API_NAME_GOMP_ATOMIC_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_ATOMIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_BARRIER, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_CRITICAL_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_CRITICAL_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_ORDERED_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_ORDERED_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SECTIONS_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SECTIONS_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10, "GOMP_1.0");
+xversionify(KMP_API_NAME_GOMP_SINGLE_START, 10, "GOMP_1.0");
+
+// GOMP_2.0 versioned symbols
+#if OMP_30_ENABLED
+xversionify(KMP_API_NAME_GOMP_TASK, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_TASKWAIT, 20, "GOMP_2.0");
+#endif
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20, "GOMP_2.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20, "GOMP_2.0");
+
+// GOMP_3.0 versioned symbols
+xversionify(KMP_API_NAME_GOMP_TASKYIELD, 30, "GOMP_3.0");
+
+// GOMP_4.0 versioned symbols
+/* TODO: add GOMP_4.0 versioned symbols when corresponding
+ GOMP_* functions are implemented
+*/
+
+#endif /* KMP_OS_LINUX */
+
#ifdef __cplusplus
} //extern "C"
#endif // __cplusplus
diff --git a/openmp/runtime/src/kmp_i18n.c b/openmp/runtime/src/kmp_i18n.c
index e23e9f1af5d..5cca6e816d3 100644
--- a/openmp/runtime/src/kmp_i18n.c
+++ b/openmp/runtime/src/kmp_i18n.c
@@ -1,7 +1,7 @@
/*
* kmp_i18n.c
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -668,7 +668,7 @@ __kmp_i18n_catgets(
void
__kmp_i18n_dump_catalog(
- kmp_str_buf_t & buffer
+ kmp_str_buf_t * buffer
) {
struct kmp_i18n_id_range_t {
@@ -676,7 +676,7 @@ __kmp_i18n_dump_catalog(
kmp_i18n_id_t last;
}; // struct kmp_i18n_id_range_t
- static kmp_i18n_id_range_t ranges[] = {
+ static struct kmp_i18n_id_range_t ranges[] = {
{ kmp_i18n_prp_first, kmp_i18n_prp_last },
{ kmp_i18n_str_first, kmp_i18n_str_last },
{ kmp_i18n_fmt_first, kmp_i18n_fmt_last },
@@ -684,18 +684,20 @@ __kmp_i18n_dump_catalog(
{ kmp_i18n_hnt_first, kmp_i18n_hnt_last }
}; // ranges
- int num_of_ranges = sizeof( ranges ) / sizeof( kmp_i18n_id_range_t );
+ int num_of_ranges = sizeof( ranges ) / sizeof( struct kmp_i18n_id_range_t );
int range;
kmp_i18n_id_t id;
for ( range = 0; range < num_of_ranges; ++ range ) {
- __kmp_str_buf_print( & buffer, "*** Set #%d ***\n", range + 1 );
- for ( id = kmp_i18n_id_t( ranges[ range ].first + 1 ); id < ranges[ range ].last; id = kmp_i18n_id_t( id + 1 ) ) {
- __kmp_str_buf_print( & buffer, "%d: <<%s>>\n", id, __kmp_i18n_catgets( id ) );
+ __kmp_str_buf_print( buffer, "*** Set #%d ***\n", range + 1 );
+ for ( id = (kmp_i18n_id_t)( ranges[ range ].first + 1 );
+ id < ranges[ range ].last;
+ id = (kmp_i18n_id_t)( id + 1 ) ) {
+ __kmp_str_buf_print( buffer, "%d: <<%s>>\n", id, __kmp_i18n_catgets( id ) );
}; // for id
}; // for range
- __kmp_printf( "%s", buffer.str );
+ __kmp_printf( "%s", buffer->str );
} // __kmp_i18n_dump_catalog
diff --git a/openmp/runtime/src/kmp_i18n.h b/openmp/runtime/src/kmp_i18n.h
index 9392e62b3d8..fea8de42648 100644
--- a/openmp/runtime/src/kmp_i18n.h
+++ b/openmp/runtime/src/kmp_i18n.h
@@ -1,7 +1,7 @@
/*
* kmp_i18n.h
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -183,7 +183,7 @@ void __kmp_msg( kmp_msg_severity_t severity, kmp_msg_t message, ... );
}
#ifdef KMP_DEBUG
- void __kmp_i18n_dump_catalog( kmp_str_buf_t & buffer );
+ void __kmp_i18n_dump_catalog( kmp_str_buf_t * buffer );
#endif // KMP_DEBUG
#ifdef __cplusplus
diff --git a/openmp/runtime/src/kmp_itt.h b/openmp/runtime/src/kmp_itt.h
index ced8fc8f871..0ee79b6fe5d 100644
--- a/openmp/runtime/src/kmp_itt.h
+++ b/openmp/runtime/src/kmp_itt.h
@@ -1,8 +1,8 @@
#if USE_ITT_BUILD
/*
* kmp_itt.h -- ITT Notify interface.
- * $Revision: 42616 $
- * $Date: 2013-08-26 11:47:32 -0500 (Mon, 26 Aug 2013) $
+ * $Revision: 42829 $
+ * $Date: 2013-11-21 05:44:01 -0600 (Thu, 21 Nov 2013) $
*/
@@ -59,6 +59,9 @@ __kmp_inline void __kmp_itt_region_forking( int gtid, int serialized = 0 ); //
__kmp_inline void __kmp_itt_region_joined( int gtid, int serialized = 0 ); // Master only, after joining threads.
// (*) Note: A thread may execute tasks after this point, though.
+// --- Frame reporting ---
+__kmp_inline void __kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t *loc );
+
// --- Barrier reporting ---
__kmp_inline void * __kmp_itt_barrier_object( int gtid, int bt, int set_name = 0, int delta = 0 );
__kmp_inline void __kmp_itt_barrier_starting( int gtid, void * object );
@@ -265,6 +268,6 @@ __kmp_inline void __kmp_itt_stack_callee_leave(__itt_caller);
# define KMP_ITT_IGNORE(stmt ) do { stmt } while (0)
-# define USE_ITT_BUILD_ARG(x)
+# define USE_ITT_BUILD_ARG(x)
#endif /* USE_ITT_BUILD */
diff --git a/openmp/runtime/src/kmp_itt.inl b/openmp/runtime/src/kmp_itt.inl
index bedcca1001e..6976e7f637b 100644
--- a/openmp/runtime/src/kmp_itt.inl
+++ b/openmp/runtime/src/kmp_itt.inl
@@ -1,8 +1,8 @@
#if USE_ITT_BUILD
/*
* kmp_itt.inl -- Inline functions of ITT Notify.
- * $Revision: 42616 $
- * $Date: 2013-08-26 11:47:32 -0500 (Mon, 26 Aug 2013) $
+ * $Revision: 42866 $
+ * $Date: 2013-12-10 15:15:58 -0600 (Tue, 10 Dec 2013) $
*/
@@ -49,6 +49,20 @@
# define LINKAGE static inline
#endif
+// ZCA interface used by Intel(R) Inspector. Intel(R) Parallel Amplifier uses this
+// API to support user-defined synchronization primitives, but does not use ZCA;
+// it would be safe to turn this off until wider support becomes available.
+#if USE_ITT_ZCA
+#ifdef __INTEL_COMPILER
+# if __INTEL_COMPILER >= 1200
+# undef __itt_sync_acquired
+# undef __itt_sync_releasing
+# define __itt_sync_acquired(addr) __notify_zc_intrinsic((char *)"sync_acquired", addr)
+# define __itt_sync_releasing(addr) __notify_intrinsic((char *)"sync_releasing", addr)
+# endif
+#endif
+#endif
+
/*
------------------------------------------------------------------------------------------------
Parallel region reporting.
@@ -79,10 +93,6 @@ __kmp_itt_region_forking( int gtid, int serialized ) {
#if USE_ITT_NOTIFY
kmp_team_t * team = __kmp_team_from_gtid( gtid );
#if OMP_30_ENABLED
- KMP_ITT_DEBUG_LOCK();
- KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%d, serialized:%d, empty:%d\n", gtid,
- __kmp_threads[gtid]->th.th_ident->reserved_2 - 1, serialized,
- (team->t.t_active_level + serialized > 1) );
if (team->t.t_active_level + serialized > 1)
#endif
{
@@ -116,13 +126,19 @@ __kmp_itt_region_forking( int gtid, int serialized ) {
str_loc.line, str_loc.col);
__kmp_str_loc_free( &str_loc );
+ __itt_suppress_push(__itt_suppress_memory_errors);
__kmp_itt_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+
__kmp_str_free( &buff );
__itt_frame_begin_v3(__kmp_itt_domains[ frm ], NULL);
}
} else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS
__itt_frame_begin_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL);
}
+ KMP_ITT_DEBUG_LOCK();
+ KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%d, serialized:%d, loc:%p\n",
+ gtid, loc->reserved_2 - 1, serialized, loc );
}
#endif
} // __kmp_itt_region_forking
@@ -130,6 +146,51 @@ __kmp_itt_region_forking( int gtid, int serialized ) {
// -------------------------------------------------------------------------------------------------
LINKAGE void
+__kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t * loc ) {
+#if USE_ITT_NOTIFY
+ if (loc) {
+ if (loc->reserved_2 == 0) {
+ if (__kmp_frame_domain_count < KMP_MAX_FRAME_DOMAINS) {
+ int frm = KMP_TEST_THEN_INC32( & __kmp_frame_domain_count ); // get "old" value
+ if (frm >= KMP_MAX_FRAME_DOMAINS) {
+ KMP_TEST_THEN_DEC32( & __kmp_frame_domain_count ); // revert the count
+ return; // loc->reserved_2 is still 0
+ }
+ // Should it be synchronized? See the comment in __kmp_itt_region_forking
+ loc->reserved_2 = frm + 1; // save "new" value
+
+ // Transform compiler-generated region location into the format
+ // that the tools more or less standardized on:
+ // "<func>$omp$frame@[file:]<line>[:<col>]"
+ const char * buff = NULL;
+ kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
+ if( imbalance ) {
+ buff = __kmp_str_format("%s$omp$barrier-imbalance@%s:%d",
+ str_loc.func, str_loc.file, str_loc.col);
+ } else {
+ buff = __kmp_str_format("%s$omp$barrier@%s:%d",
+ str_loc.func, str_loc.file, str_loc.col);
+ }
+ __kmp_str_loc_free( &str_loc );
+
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+
+ __kmp_str_free( &buff );
+ __itt_frame_submit_v3(__kmp_itt_domains[ frm ], NULL, begin, end );
+ }
+ } else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS
+ __itt_frame_submit_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL, begin, end );
+ }
+ }
+
+#endif
+} // __kmp_itt_frame_submit
+
+// -------------------------------------------------------------------------------------------------
+
+LINKAGE void
__kmp_itt_region_starting( int gtid ) {
#if USE_ITT_NOTIFY
#endif
@@ -150,10 +211,6 @@ __kmp_itt_region_joined( int gtid, int serialized ) {
#if USE_ITT_NOTIFY
kmp_team_t * team = __kmp_team_from_gtid( gtid );
#if OMP_30_ENABLED
- KMP_ITT_DEBUG_LOCK();
- KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%d, serialized:%d, empty:%d\n", gtid,
- __kmp_threads[gtid]->th.th_ident->reserved_2 - 1, serialized,
- (team->t.t_active_level + serialized > 1) );
if (team->t.t_active_level + serialized > 1)
#endif
{
@@ -162,7 +219,10 @@ __kmp_itt_region_joined( int gtid, int serialized ) {
}
ident_t * loc = __kmp_thread_from_gtid( gtid )->th.th_ident;
if (loc && loc->reserved_2 && loc->reserved_2 <= KMP_MAX_FRAME_DOMAINS) {
+ KMP_ITT_DEBUG_LOCK();
__itt_frame_end_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL);
+ KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%d, serialized:%d, loc:%p\n",
+ gtid, loc->reserved_2 - 1, serialized, loc );
}
#endif
} // __kmp_itt_region_joined
@@ -577,7 +637,7 @@ __kmp_itt_critical_destroyed( kmp_user_lock_p lock ) {
void
__kmp_itt_single_start( int gtid ) {
#if USE_ITT_NOTIFY
- if ( __itt_mark_create_ptr ) {
+ if ( __itt_mark_create_ptr || KMP_ITT_DEBUG ) {
kmp_info_t * thr = __kmp_thread_from_gtid( (gtid) );
ident_t * loc = thr->th.th_ident;
char const * src = ( loc == NULL ? NULL : loc->psource );
diff --git a/openmp/runtime/src/kmp_lock.cpp b/openmp/runtime/src/kmp_lock.cpp
index d0420194688..766cf830fec 100644
--- a/openmp/runtime/src/kmp_lock.cpp
+++ b/openmp/runtime/src/kmp_lock.cpp
@@ -1,7 +1,7 @@
/*
* kmp_lock.cpp -- lock-related functions
- * $Revision: 42613 $
- * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -23,7 +23,7 @@
#include "kmp_lock.h"
#include "kmp_io.h"
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
# include <unistd.h>
# include <sys/syscall.h>
// We should really include <futex.h>, but that causes compatibility problems on different
@@ -398,7 +398,7 @@ __kmp_destroy_nested_tas_lock_with_checks( kmp_tas_lock_t *lck )
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
/* ------------------------------------------------------------------------ */
/* futex locks */
@@ -755,7 +755,7 @@ __kmp_destroy_nested_futex_lock_with_checks( kmp_futex_lock_t *lck )
__kmp_destroy_nested_futex_lock( lck );
}
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
/* ------------------------------------------------------------------------ */
@@ -2199,10 +2199,10 @@ __kmp_is_unlocked_queuing_lock( kmp_queuing_lock_t *lck )
// We need a fence here, since we must ensure that no memory operations
// from later in this thread float above that read.
-#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER )
- __sync_synchronize();
-#else
+#if KMP_COMPILER_ICC
_mm_mfence();
+#else
+ __sync_synchronize();
#endif
return res;
@@ -3167,7 +3167,7 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
}
break;
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
case lk_futex: {
__kmp_base_user_lock_size = sizeof( kmp_base_futex_lock_t );
@@ -3238,7 +3238,7 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
}
break;
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
case lk_ticket: {
__kmp_base_user_lock_size = sizeof( kmp_base_ticket_lock_t );
diff --git a/openmp/runtime/src/kmp_lock.h b/openmp/runtime/src/kmp_lock.h
index bb80b5a57a3..5191cea1264 100644
--- a/openmp/runtime/src/kmp_lock.h
+++ b/openmp/runtime/src/kmp_lock.h
@@ -1,7 +1,7 @@
/*
* kmp_lock.h -- lock header file
- * $Revision: 42590 $
- * $Date: 2013-08-13 20:55:19 -0500 (Tue, 13 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -174,7 +174,7 @@ extern void __kmp_init_nested_tas_lock( kmp_tas_lock_t *lck );
extern void __kmp_destroy_nested_tas_lock( kmp_tas_lock_t *lck );
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// ----------------------------------------------------------------------------
// futex locks. futex locks are only available on Linux* OS.
@@ -224,7 +224,7 @@ extern void __kmp_release_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gt
extern void __kmp_init_nested_futex_lock( kmp_futex_lock_t *lck );
extern void __kmp_destroy_nested_futex_lock( kmp_futex_lock_t *lck );
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// ----------------------------------------------------------------------------
@@ -479,31 +479,31 @@ typedef kmp_ticket_lock_t kmp_bootstrap_lock_t;
#define KMP_BOOTSTRAP_LOCK_INITIALIZER( lock ) KMP_TICKET_LOCK_INITIALIZER( (lock) )
-inline void
+static inline void
__kmp_acquire_bootstrap_lock( kmp_bootstrap_lock_t *lck )
{
__kmp_acquire_ticket_lock( lck, KMP_GTID_DNE );
}
-inline int
+static inline int
__kmp_test_bootstrap_lock( kmp_bootstrap_lock_t *lck )
{
return __kmp_test_ticket_lock( lck, KMP_GTID_DNE );
}
-inline void
+static inline void
__kmp_release_bootstrap_lock( kmp_bootstrap_lock_t *lck )
{
__kmp_release_ticket_lock( lck, KMP_GTID_DNE );
}
-inline void
+static inline void
__kmp_init_bootstrap_lock( kmp_bootstrap_lock_t *lck )
{
__kmp_init_ticket_lock( lck );
}
-inline void
+static inline void
__kmp_destroy_bootstrap_lock( kmp_bootstrap_lock_t *lck )
{
__kmp_destroy_ticket_lock( lck );
@@ -524,31 +524,31 @@ __kmp_destroy_bootstrap_lock( kmp_bootstrap_lock_t *lck )
typedef kmp_ticket_lock_t kmp_lock_t;
-inline void
+static inline void
__kmp_acquire_lock( kmp_lock_t *lck, kmp_int32 gtid )
{
__kmp_acquire_ticket_lock( lck, gtid );
}
-inline int
+static inline int
__kmp_test_lock( kmp_lock_t *lck, kmp_int32 gtid )
{
return __kmp_test_ticket_lock( lck, gtid );
}
-inline void
+static inline void
__kmp_release_lock( kmp_lock_t *lck, kmp_int32 gtid )
{
__kmp_release_ticket_lock( lck, gtid );
}
-inline void
+static inline void
__kmp_init_lock( kmp_lock_t *lck )
{
__kmp_init_ticket_lock( lck );
}
-inline void
+static inline void
__kmp_destroy_lock( kmp_lock_t *lck )
{
__kmp_destroy_ticket_lock( lck );
@@ -570,7 +570,7 @@ __kmp_destroy_lock( kmp_lock_t *lck )
enum kmp_lock_kind {
lk_default = 0,
lk_tas,
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
lk_futex,
#endif
lk_ticket,
@@ -587,7 +587,7 @@ extern kmp_lock_kind_t __kmp_user_lock_kind;
union kmp_user_lock {
kmp_tas_lock_t tas;
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
kmp_futex_lock_t futex;
#endif
kmp_ticket_lock_t ticket;
@@ -606,7 +606,7 @@ extern size_t __kmp_user_lock_size;
extern kmp_int32 ( *__kmp_get_user_lock_owner_ )( kmp_user_lock_p lck );
-inline kmp_int32
+static inline kmp_int32
__kmp_get_user_lock_owner( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_get_user_lock_owner_ != NULL );
@@ -615,7 +615,7 @@ __kmp_get_user_lock_owner( kmp_user_lock_p lck )
extern void ( *__kmp_acquire_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
#define __kmp_acquire_user_lock_with_checks(lck,gtid) \
if (__kmp_user_lock_kind == lk_tas) { \
@@ -655,7 +655,7 @@ extern void ( *__kmp_acquire_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_
}
#else
-inline void
+static inline void
__kmp_acquire_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_acquire_user_lock_with_checks_ != NULL );
@@ -665,11 +665,11 @@ __kmp_acquire_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
extern int ( *__kmp_test_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
#include "kmp_i18n.h" /* AC: KMP_FATAL definition */
extern int __kmp_env_consistency_check; /* AC: copy from kmp.h here */
-inline int
+static inline int
__kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
if ( __kmp_user_lock_kind == lk_tas ) {
@@ -688,7 +688,7 @@ __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
}
}
#else
-inline int
+static inline int
__kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_test_user_lock_with_checks_ != NULL );
@@ -698,7 +698,7 @@ __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
extern void ( *__kmp_release_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
-inline void
+static inline void
__kmp_release_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_release_user_lock_with_checks_ != NULL );
@@ -707,7 +707,7 @@ __kmp_release_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
extern void ( *__kmp_init_user_lock_with_checks_ )( kmp_user_lock_p lck );
-inline void
+static inline void
__kmp_init_user_lock_with_checks( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_init_user_lock_with_checks_ != NULL );
@@ -720,7 +720,7 @@ __kmp_init_user_lock_with_checks( kmp_user_lock_p lck )
//
extern void ( *__kmp_destroy_user_lock_ )( kmp_user_lock_p lck );
-inline void
+static inline void
__kmp_destroy_user_lock( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_destroy_user_lock_ != NULL );
@@ -729,7 +729,7 @@ __kmp_destroy_user_lock( kmp_user_lock_p lck )
extern void ( *__kmp_destroy_user_lock_with_checks_ )( kmp_user_lock_p lck );
-inline void
+static inline void
__kmp_destroy_user_lock_with_checks( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_destroy_user_lock_with_checks_ != NULL );
@@ -780,7 +780,7 @@ extern void ( *__kmp_acquire_nested_user_lock_with_checks_ )( kmp_user_lock_p lc
}
#else
-inline void
+static inline void
__kmp_acquire_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_acquire_nested_user_lock_with_checks_ != NULL );
@@ -791,7 +791,7 @@ __kmp_acquire_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid
extern int ( *__kmp_test_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
-inline int
+static inline int
__kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
if ( __kmp_user_lock_kind == lk_tas ) {
@@ -820,7 +820,7 @@ __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
}
}
#else
-inline int
+static inline int
__kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_test_nested_user_lock_with_checks_ != NULL );
@@ -830,7 +830,7 @@ __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
extern void ( *__kmp_release_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
-inline void
+static inline void
__kmp_release_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_release_nested_user_lock_with_checks_ != NULL );
@@ -839,7 +839,7 @@ __kmp_release_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid
extern void ( *__kmp_init_nested_user_lock_with_checks_ )( kmp_user_lock_p lck );
-inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck )
+static inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_init_nested_user_lock_with_checks_ != NULL );
( *__kmp_init_nested_user_lock_with_checks_ )( lck );
@@ -847,7 +847,7 @@ inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck )
extern void ( *__kmp_destroy_nested_user_lock_with_checks_ )( kmp_user_lock_p lck );
-inline void
+static inline void
__kmp_destroy_nested_user_lock_with_checks( kmp_user_lock_p lck )
{
KMP_DEBUG_ASSERT( __kmp_destroy_nested_user_lock_with_checks_ != NULL );
@@ -875,7 +875,7 @@ extern int ( *__kmp_is_user_lock_initialized_ )( kmp_user_lock_p lck );
extern const ident_t * ( *__kmp_get_user_lock_location_ )( kmp_user_lock_p lck );
-inline const ident_t *
+static inline const ident_t *
__kmp_get_user_lock_location( kmp_user_lock_p lck )
{
if ( __kmp_get_user_lock_location_ != NULL ) {
@@ -888,7 +888,7 @@ __kmp_get_user_lock_location( kmp_user_lock_p lck )
extern void ( *__kmp_set_user_lock_location_ )( kmp_user_lock_p lck, const ident_t *loc );
-inline void
+static inline void
__kmp_set_user_lock_location( kmp_user_lock_p lck, const ident_t *loc )
{
if ( __kmp_set_user_lock_location_ != NULL ) {
@@ -900,7 +900,7 @@ extern kmp_lock_flags_t ( *__kmp_get_user_lock_flags_ )( kmp_user_lock_p lck );
extern void ( *__kmp_set_user_lock_flags_ )( kmp_user_lock_p lck, kmp_lock_flags_t flags );
-inline void
+static inline void
__kmp_set_user_lock_flags( kmp_user_lock_p lck, kmp_lock_flags_t flags )
{
if ( __kmp_set_user_lock_flags_ != NULL ) {
@@ -962,7 +962,7 @@ typedef struct kmp_block_of_locks kmp_block_of_locks_t;
extern kmp_block_of_locks_t *__kmp_lock_blocks;
extern int __kmp_num_locks_in_block;
-extern kmp_user_lock_p __kmp_user_lock_allocate( void **user_lock, kmp_int32 gtid, kmp_lock_flags_t flags = 0 );
+extern kmp_user_lock_p __kmp_user_lock_allocate( void **user_lock, kmp_int32 gtid, kmp_lock_flags_t flags );
extern void __kmp_user_lock_free( void **user_lock, kmp_int32 gtid, kmp_user_lock_p lck );
extern kmp_user_lock_p __kmp_lookup_user_lock( void **user_lock, char const *func );
extern void __kmp_cleanup_user_locks();
diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h
index 9a5d94800f4..f1676052340 100644
--- a/openmp/runtime/src/kmp_os.h
+++ b/openmp/runtime/src/kmp_os.h
@@ -1,7 +1,7 @@
/*
* kmp_os.h -- KPTS runtime header file.
- * $Revision: 42588 $
- * $Date: 2013-08-13 01:26:00 -0500 (Tue, 13 Aug 2013) $
+ * $Revision: 42820 $
+ * $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $
*/
@@ -42,6 +42,24 @@
# define KMP_MEM_CONS_MODEL KMP_MEM_CONS_VOLATILE
#endif
+/* ------------------------- Compiler recognition ---------------------- */
+#define KMP_COMPILER_ICC 0
+#define KMP_COMPILER_GCC 0
+#define KMP_COMPILER_CLANG 0
+
+#if defined( __INTEL_COMPILER )
+# undef KMP_COMPILER_ICC
+# define KMP_COMPILER_ICC 1
+#elif defined( __clang__ )
+# undef KMP_COMPILER_CLANG
+# define KMP_COMPILER_CLANG 1
+#elif defined( __GNUC__ )
+# undef KMP_COMPILER_GCC
+# define KMP_COMPILER_GCC 1
+#else
+# error Unknown compiler
+#endif
+
/* ---------------------- Operating system recognition ------------------- */
#define KMP_OS_LINUX 0
@@ -90,28 +108,77 @@
# if defined __x86_64
# undef KMP_ARCH_X86_64
# define KMP_ARCH_X86_64 1
-# else
+# elif defined __i386
# undef KMP_ARCH_X86
# define KMP_ARCH_X86 1
# endif
#endif
-#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64)
+#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \
+ defined(__ARM_ARCH_7A__)
+# define KMP_ARCH_ARMV7 1
+#endif
+
+#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \
+ defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
+ defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \
+ defined(__ARM_ARCH_6ZK__)
+# define KMP_ARCH_ARMV6 1
+#endif
+
+#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \
+ defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
+ defined(__ARM_ARCH_5TEJ__)
+# define KMP_ARCH_ARMV5 1
+#endif
+
+#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \
+ defined(__ARM_ARCH_4T__)
+# define KMP_ARCH_ARMV4 1
+#endif
+
+#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \
+ defined(__ARM_ARCH_3M__)
+# define KMP_ARCH_ARMV3 1
+#endif
+
+#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__)
+# define KMP_ARCH_ARMV2 1
+#endif
+
+#if defined(KMP_ARCH_ARMV2)
+# define KMP_ARCH_ARM 1
+#endif
+
+#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM)
# error Unknown or unsupported architecture
#endif
-#if KMP_OS_WINDOWS
-# if defined KMP_WIN_CDECL || !defined GUIDEDLL_EXPORTS
-# define USE_FTN_CDECL KMP_FTN_UPPER
+/* Check for quad-precision extension. */
+#define KMP_HAVE_QUAD 0
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+# if KMP_COMPILER_ICC
+ /* _Quad is already defined for icc */
+# undef KMP_HAVE_QUAD
+# define KMP_HAVE_QUAD 1
+# elif KMP_COMPILER_CLANG
+ /* Clang doesn't support a software-implemented
+ 128-bit extended precision type yet */
+ typedef long double _Quad;
+# elif KMP_COMPILER_GCC
+ typedef __float128 _Quad;
+# undef KMP_HAVE_QUAD
+# define KMP_HAVE_QUAD 1
# endif
-
-# define KMP_FTN KMP_FTN_PLAIN
-# define USE_FTN_EXTRA KMP_FTN_PLAIN
-# if KMP_ARCH_X86
-# if defined KMP_WIN_STDCALL || !defined GUIDEDLL_EXPORTS
-# define USE_FTN_STDCALL KMP_FTN_UPPER
-# endif
+#else
+# if __LDBL_MAX_EXP__ >= 16384 && KMP_COMPILER_GCC
+ typedef long double _Quad;
+# undef KMP_HAVE_QUAD
+# define KMP_HAVE_QUAD 1
# endif
+#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
+
+#if KMP_OS_WINDOWS
typedef char kmp_int8;
typedef unsigned char kmp_uint8;
typedef short kmp_int16;
@@ -143,9 +210,6 @@
#endif /* KMP_OS_WINDOWS */
#if KMP_OS_UNIX
-# define KMP_FTN KMP_FTN_PLAIN
-# define USE_FTN_CDECL KMP_FTN_PLAIN
-# define USE_FTN_EXTRA KMP_FTN_APPEND
typedef char kmp_int8;
typedef unsigned char kmp_uint8;
typedef short kmp_int16;
@@ -160,7 +224,7 @@
# define KMP_UINT64_SPEC "llu"
#endif /* KMP_OS_UNIX */
-#if KMP_ARCH_X86
+#if KMP_ARCH_X86 || KMP_ARCH_ARM
# define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
#elif KMP_ARCH_X86_64
# define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
@@ -199,7 +263,7 @@ typedef double kmp_real64;
# define KMP_INT_SPEC KMP_INT32_SPEC
# define KMP_UINT_SPEC KMP_UINT32_SPEC
# define KMP_INT_MAX ((kmp_int32)0x7FFFFFFF)
-# define KMP_INT_MIN ((kmp_int64)0x80000000)
+# define KMP_INT_MIN ((kmp_int32)0x80000000)
#endif /* KMP_I8 */
#ifdef __cplusplus
@@ -248,14 +312,6 @@ typedef double kmp_real64;
//-------------------------------------------------------------------------
#endif // __cplusplus
-#if KMP_OS_WINDOWS
-# define KMP_STDCALL __stdcall
-#endif
-
-#ifndef KMP_STDCALL
-# define KMP_STDCALL /* nothing */
-#endif
-
#define KMP_EXPORT extern /* export declaration in guide libraries */
#if __GNUC__ == 4
@@ -336,7 +392,113 @@ enum kmp_mem_fence_type {
// Synchronization primitives
//
-#if KMP_ASM_INTRINS
+#if KMP_ASM_INTRINS && KMP_OS_WINDOWS
+
+#include <Windows.h>
+
+#pragma intrinsic(InterlockedExchangeAdd)
+#pragma intrinsic(InterlockedCompareExchange)
+#pragma intrinsic(InterlockedExchange)
+#pragma intrinsic(InterlockedExchange64)
+
+//
+// Using InterlockedIncrement / InterlockedDecrement causes a library loading
+// ordering problem, so we use InterlockedExchangeAdd instead.
+//
+# define KMP_TEST_THEN_INC32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 )
+# define KMP_TEST_THEN_INC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 )
+# define KMP_TEST_THEN_ADD4_32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 )
+# define KMP_TEST_THEN_ADD4_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 )
+# define KMP_TEST_THEN_DEC32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 )
+# define KMP_TEST_THEN_DEC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 )
+# define KMP_TEST_THEN_ADD32(p, v) InterlockedExchangeAdd( (volatile long *)(p), (v) )
+
+# define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) InterlockedCompareExchange( (volatile long *)(p),(long)(sv),(long)(cv) )
+
+# define KMP_XCHG_FIXED32(p, v) InterlockedExchange( (volatile long *)(p), (long)(v) )
+# define KMP_XCHG_FIXED64(p, v) InterlockedExchange64( (volatile kmp_int64 *)(p), (kmp_int64)(v) )
+
+inline kmp_real32 KMP_XCHG_REAL32( volatile kmp_real32 *p, kmp_real32 v)
+{
+ kmp_int32 tmp = InterlockedExchange( (volatile long *)p, *(long *)&v);
+ return *(kmp_real32*)&tmp;
+}
+
+//
+// Routines that we still need to implement in assembly.
+//
+extern kmp_int32 __kmp_test_then_add32( volatile kmp_int32 *p, kmp_int32 v );
+extern kmp_int32 __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 v );
+extern kmp_int32 __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 v );
+extern kmp_int64 __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 v );
+extern kmp_int64 __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 v );
+extern kmp_int64 __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 v );
+
+extern kmp_int8 __kmp_compare_and_store8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
+extern kmp_int16 __kmp_compare_and_store16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
+extern kmp_int32 __kmp_compare_and_store32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
+extern kmp_int32 __kmp_compare_and_store64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
+extern kmp_int8 __kmp_compare_and_store_ret8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
+extern kmp_int16 __kmp_compare_and_store_ret16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
+extern kmp_int32 __kmp_compare_and_store_ret32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
+extern kmp_int64 __kmp_compare_and_store_ret64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
+
+extern kmp_int8 __kmp_xchg_fixed8( volatile kmp_int8 *p, kmp_int8 v );
+extern kmp_int16 __kmp_xchg_fixed16( volatile kmp_int16 *p, kmp_int16 v );
+extern kmp_int32 __kmp_xchg_fixed32( volatile kmp_int32 *p, kmp_int32 v );
+extern kmp_int64 __kmp_xchg_fixed64( volatile kmp_int64 *p, kmp_int64 v );
+extern kmp_real32 __kmp_xchg_real32( volatile kmp_real32 *p, kmp_real32 v );
+extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v );
+
+//# define KMP_TEST_THEN_INC32(p) __kmp_test_then_add32( (p), 1 )
+//# define KMP_TEST_THEN_INC_ACQ32(p) __kmp_test_then_add32( (p), 1 )
+# define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL )
+# define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL )
+//# define KMP_TEST_THEN_ADD4_32(p) __kmp_test_then_add32( (p), 4 )
+//# define KMP_TEST_THEN_ADD4_ACQ32(p) __kmp_test_then_add32( (p), 4 )
+# define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL )
+# define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL )
+//# define KMP_TEST_THEN_DEC32(p) __kmp_test_then_add32( (p), -1 )
+//# define KMP_TEST_THEN_DEC_ACQ32(p) __kmp_test_then_add32( (p), -1 )
+# define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL )
+# define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL )
+//# define KMP_TEST_THEN_ADD32(p, v) __kmp_test_then_add32( (p), (v) )
+# define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) )
+
+# define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) )
+# define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) )
+# define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) )
+# define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) )
+
+# define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
+
+# if KMP_ARCH_X86
+# define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) )
+# else /* 64 bit pointers */
+# define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) )
+# endif /* KMP_ARCH_X86 */
+
+# define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) )
+//# define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __kmp_compare_and_store_ret32( (p), (cv), (sv) )
+# define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) )
+
+# define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) );
+# define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) );
+//# define KMP_XCHG_FIXED32(p, v) __kmp_xchg_fixed32( (p), (v) );
+//# define KMP_XCHG_FIXED64(p, v) __kmp_xchg_fixed64( (p), (v) );
+//# define KMP_XCHG_REAL32(p, v) __kmp_xchg_real32( (p), (v) );
+# define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
+
+
+#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
/* cast p to correct type so that proper intrinsic will be used */
# define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
@@ -385,7 +547,7 @@ inline kmp_real32 KMP_XCHG_REAL32( volatile kmp_real32 *p, kmp_real32 v)
return *(kmp_real32*)&tmp;
}
-static kmp_real64 KMP_XCHG_REAL64( volatile kmp_real64 *p, kmp_real64 v)
+inline kmp_real64 KMP_XCHG_REAL64( volatile kmp_real64 *p, kmp_real64 v)
{
kmp_int64 tmp = __sync_lock_test_and_set( (kmp_int64*)p, *(kmp_int64*)&v);
return *(kmp_real64*)&tmp;
@@ -607,6 +769,14 @@ typedef void (*microtask_t)( int *gtid, int *npr, ... );
#endif
+// Switches for OSS builds
+#ifndef USE_SYSFS_INFO
+# define USE_SYSFS_INFO 0
+#endif
+#ifndef USE_CMPXCHG_FIX
+# define USE_CMPXCHG_FIX 1
+#endif
+
// Warning levels
enum kmp_warnings_level {
kmp_warnings_off = 0, /* No warnings */
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c
index 7d66b9bc304..37c372bd89e 100644
--- a/openmp/runtime/src/kmp_runtime.c
+++ b/openmp/runtime/src/kmp_runtime.c
@@ -1,7 +1,7 @@
/*
* kmp_runtime.c -- KPTS runtime support library
- * $Revision: 42642 $
- * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $
+ * $Revision: 42839 $
+ * $Date: 2013-11-24 13:01:00 -0600 (Sun, 24 Nov 2013) $
*/
@@ -88,6 +88,8 @@ char const __kmp_version_perf_v106[] = KMP_VERSION_PREFIX "perf v106: "
#endif /* KMP_DEBUG */
+#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) )
+
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
@@ -472,8 +474,7 @@ __kmp_wait_sleep( kmp_info_t *this_thr,
__kmp_unref_task_team( task_team, this_thr );
} else if ( KMP_TASKING_ENABLED( task_team, this_thr->th.th_task_state ) ) {
__kmp_execute_tasks( this_thr, th_gtid, spin, check, final_spin, &flag
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
+ USE_ITT_BUILD_ARG( itt_sync_obj ), 0);
}
}; // if
}; // if
@@ -994,7 +995,7 @@ DllMain( HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved ) {
}
# endif /* KMP_OS_WINDOWS */
-#endif /* GUIDEDLL_EXPORTS
+#endif /* GUIDEDLL_EXPORTS */
/* ------------------------------------------------------------------------ */
@@ -1190,10 +1191,8 @@ __kmp_linear_barrier_gather( enum barrier_type bt,
register kmp_balign_team_t *team_bar = & team -> t.t_bar[ bt ];
register int nproc = this_thr -> th.th_team_nproc;
register int i;
- register kmp_uint new_state;
-
/* Don't have to worry about sleep bit here or atomic since team setting */
- new_state = team_bar -> b_arrived + KMP_BARRIER_STATE_BUMP;
+ register kmp_uint new_state = team_bar -> b_arrived + KMP_BARRIER_STATE_BUMP;
/* Collect all the worker team member threads. */
for (i = 1; i < nproc; i++) {
@@ -1341,7 +1340,7 @@ __kmp_tree_barrier_gather( enum barrier_type bt,
/* Need to update the team arrived pointer if we are the master thread */
if ( nproc > 1 )
- /* New value was already computed in above loop */
+ /* New value was already computed above */
team -> t.t_bar[ bt ].b_arrived = new_state;
else
team -> t.t_bar[ bt ].b_arrived += KMP_BARRIER_STATE_BUMP;
@@ -1380,6 +1379,12 @@ __kmp_hyper_barrier_gather( enum barrier_type bt,
KMP_DEBUG_ASSERT( this_thr == other_threads[this_thr->th.th_info.ds.ds_tid] );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - save arrive time to the thread
+ if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) {
+ this_thr->th.th_bar_arrive_time = __itt_get_timestamp();
+ }
+#endif
/*
* We now perform a hypercube-embedded tree gather to wait until all
* of the threads have arrived, and reduce any required data
@@ -1417,6 +1422,9 @@ __kmp_hyper_barrier_gather( enum barrier_type bt,
/* parent threads wait for children to arrive */
+ if (new_state == KMP_BARRIER_UNUSED_STATE)
+ new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP;
+
for ( child = 1, child_tid = tid + (1 << level);
child < branch_factor && child_tid < num_threads;
child++, child_tid += (1 << level) )
@@ -1429,10 +1437,6 @@ __kmp_hyper_barrier_gather( enum barrier_type bt,
if ( child+1 < branch_factor && next_child_tid < num_threads )
KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ] -> th.th_bar[ bt ].bb.b_arrived );
#endif /* KMP_CACHE_MANAGE */
- /* Only read this arrived flag once per thread that needs it */
- if (new_state == KMP_BARRIER_UNUSED_STATE)
- new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP;
-
KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) "
"arrived(%p) == %u\n",
gtid, team->t.t_id, tid,
@@ -1444,6 +1448,12 @@ __kmp_hyper_barrier_gather( enum barrier_type bt,
USE_ITT_BUILD_ARG (itt_sync_obj)
);
+#if USE_ITT_BUILD
+ // Barrier imbalance - write min of the thread time and a child time to the thread.
+ if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) {
+ this_thr->th.th_bar_arrive_time = KMP_MIN( this_thr->th.th_bar_arrive_time, child_thr->th.th_bar_arrive_time );
+ }
+#endif
if (reduce) {
KA_TRACE( 100, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n",
@@ -1729,7 +1739,6 @@ __kmp_tree_barrier_release( enum barrier_type bt,
/* The reverse versions seem to beat the forward versions overall */
#define KMP_REVERSE_HYPER_BAR
-#ifdef KMP_REVERSE_HYPER_BAR
static void
__kmp_hyper_barrier_release( enum barrier_type bt,
kmp_info_t *this_thr,
@@ -1751,15 +1760,13 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
register kmp_uint32 offset;
register kmp_uint32 level;
- /*
- * We now perform a hypercube-embedded tree release for all
- * of the threads that have been gathered, but in the exact
- * reverse order from the corresponding gather (for load balance.
- */
+ /* Perform a hypercube-embedded tree release for all of the threads
+ that have been gathered. If KMP_REVERSE_HYPER_BAR is defined (default)
+ the threads are released in the reverse order of the corresponding gather,
+ otherwise threads are released in the same order. */
if ( ! KMP_MASTER_TID( tid )) {
/* worker threads */
-
KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n",
gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) );
@@ -1807,7 +1814,7 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
- gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
+ gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
KMP_MB(); /* Flush all pending memory write invalidates. */
@@ -1822,6 +1829,7 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
num_threads = this_thr -> th.th_team_nproc;
other_threads = team -> t.t_threads;
+#ifdef KMP_REVERSE_HYPER_BAR
/* count up to correct level for parent */
for ( level = 0, offset = 1;
offset < num_threads && (((tid >> level) & (branch_factor-1)) == 0);
@@ -1831,7 +1839,14 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
for ( level -= branch_bits, offset >>= branch_bits;
offset != 0;
level -= branch_bits, offset >>= branch_bits )
+#else
+ /* Go down the tree, level by level */
+ for ( level = 0, offset = 1;
+ offset < num_threads;
+ level += branch_bits, offset <<= branch_bits )
+#endif // KMP_REVERSE_HYPER_BAR
{
+#ifdef KMP_REVERSE_HYPER_BAR
/* Now go in reverse order through the children, highest to lowest.
Initial setting of child is conservative here. */
child = num_threads >> ((level==0)?level:level-1);
@@ -1839,8 +1854,18 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
child_tid = tid + (child << level);
child >= 1;
child--, child_tid -= (1 << level) )
- {
+#else
+ if (((tid >> level) & (branch_factor - 1)) != 0)
+ /* No need to go any lower than this, since this is the level
+ parent would be notified */
+ break;
+ /* iterate through children on this level of the tree */
+ for ( child = 1, child_tid = tid + (1 << level);
+ child < branch_factor && child_tid < num_threads;
+ child++, child_tid += (1 << level) )
+#endif // KMP_REVERSE_HYPER_BAR
+ {
if ( child_tid >= num_threads ) continue; /* child doesn't exist so keep going */
else {
register kmp_info_t *child_thr = other_threads[ child_tid ];
@@ -1848,7 +1873,11 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
#if KMP_CACHE_MANAGE
register kmp_uint32 next_child_tid = child_tid - (1 << level);
/* prefetch next thread's go count */
+#ifdef KMP_REVERSE_HYPER_BAR
if ( child-1 >= 1 && next_child_tid < num_threads )
+#else
+ if ( child+1 < branch_factor && next_child_tid < num_threads )
+#endif // KMP_REVERSE_HYPER_BAR
KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ]->th.th_bar[ bt ].bb.b_go );
#endif /* KMP_CACHE_MANAGE */
@@ -1880,154 +1909,6 @@ __kmp_hyper_barrier_release( enum barrier_type bt,
gtid, team->t.t_id, tid, bt ) );
}
-#else /* !KMP_REVERSE_HYPER_BAR */
-
-static void
-__kmp_hyper_barrier_release( enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid, int propagate_icvs )
-{
- /* handle fork barrier workers who aren't part of a team yet */
- register kmp_team_t *team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_info_t **other_threads;
- register kmp_uint32 num_threads;
- register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[ bt ];
- register kmp_uint32 branch_factor = 1 << branch_bits;
- register kmp_uint32 child;
- register kmp_uint32 child_tid;
- register kmp_uint32 offset;
- register kmp_uint32 level;
-
- /*
- * We now perform a hypercube-embedded tree release for all
- * of the threads that have been gathered, but in the same order
- * as the gather.
- */
-
- if ( ! KMP_MASTER_TID( tid )) {
- /* worker threads */
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n",
- gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) );
-
- /* wait for parent thread to release us */
- __kmp_wait_sleep( this_thr, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP, TRUE, NULL );
-
-#if USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 0, -1 );
- // cancel wait on previous parallel region...
- __kmp_itt_task_starting( itt_sync_obj );
-
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- if ( itt_sync_obj != NULL )
- __kmp_itt_task_finished( itt_sync_obj ); // call prepare as early as possible for "new" barrier
-
- } else
-#endif /* USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY */
- //
- // early exit for reaping threads releasing forkjoin barrier
- //
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- //
- // The worker thread may now assume that the team is valid.
- //
-#if USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY
- // libguide only code (cannot use *itt_task* routines)
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- __kmp_itt_barrier_starting( gtid, itt_sync_obj ); // no need to call releasing, but we have paired calls...
- }
-#endif /* USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY */
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
- tid = __kmp_tid_from_gtid( gtid );
-
- TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
- gtid, ( team != NULL ) ? team->t.t_id : -1, tid,
- &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
-
- KMP_MB(); /* Flush all pending memory write invalidates. */
-
- } else { /* KMP_MASTER_TID(tid) */
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
- }
-
- /* Now set up team parameters since workers have been released */
- if ( team == NULL ) {
- /* handle fork barrier workers who are now part of a team */
- tid = __kmp_tid_from_gtid( gtid );
- team = __kmp_threads[ gtid ]-> th.th_team;
- }
- num_threads = this_thr -> th.th_team_nproc;
- other_threads = team -> t.t_threads;
-
- /* Go down the tree, level by level */
- for ( level = 0, offset = 1;
- offset < num_threads;
- level += branch_bits, offset <<= branch_bits )
- {
- if (((tid >> level) & (branch_factor - 1)) != 0)
- /* No need to go any lower than this, since this is the level
- parent would be notified */
- break;
-
- /* iterate through children on this level of the tree */
- for ( child = 1, child_tid = tid + (1 << level);
- child < branch_factor && child_tid < num_threads;
- child++, child_tid += (1 << level) )
- {
- register kmp_info_t *child_thr = other_threads[ child_tid ];
- register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb;
-#if KMP_CACHE_MANAGE
- {
- register kmp_uint32 next_child_tid = child_tid + (1 << level);
- /* prefetch next thread's go count */
- if ( child+1 < branch_factor && next_child_tid < num_threads )
- KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ]->th.th_bar[ bt ].bb.b_go );
- }
-#endif /* KMP_CACHE_MANAGE */
-
-#if KMP_BARRIER_ICV_PUSH
- if ( propagate_icvs ) {
- KMP_DEBUG_ASSERT( team != NULL );
- __kmp_init_implicit_task( team->t.t_ident,
- team->t.t_threads[child_tid], team, child_tid, FALSE );
- load_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs);
- store_icvs(&team->t.t_implicit_task_taskdata[child_tid].td_icvs, &team->t.t_implicit_task_taskdata[0].td_icvs);
- sync_icvs();
- }
-#endif // KMP_BARRIER_ICV_PUSH
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) releasing "
- "T#%d(%d:%u) go(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id,
- child_tid, &child_bar -> b_go, child_bar -> b_go,
- child_bar -> b_go + KMP_BARRIER_STATE_BUMP ) );
-
- /* release child from barrier */
- __kmp_release( child_thr, &child_bar -> b_go, kmp_acquire_fence );
- }
- }
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-#endif /* KMP_REVERSE_HYPER_BAR */
-
-
/*
* Internal function to do a barrier.
* If is_split is true, do a split barrier, otherwise, do a plain barrier
@@ -2043,6 +1924,8 @@ __kmp_barrier( enum barrier_type bt, int gtid, int is_split,
register kmp_team_t *team = this_thr -> th.th_team;
register int status = 0;
+ ident_t * tmp_loc = __kmp_threads[ gtid ]->th.th_ident;
+
KA_TRACE( 15, ( "__kmp_barrier: T#%d(%d:%d) has arrived\n",
gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid) ) );
@@ -2126,34 +2009,23 @@ __kmp_barrier( enum barrier_type bt, int gtid, int is_split,
#endif /* OMP_30_ENABLED */
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
// Barrier - report frame end
-#if USE_ITT_BUILD
- // Collect information only if the file was opened succesfully.
- if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file )
- {
- ident_t * loc = this_thr->th.th_ident;
- if (loc) {
- // Use compiler-generated location to mark the frame:
- // "<func>$omp$frame@[file:]<line>[:<col>]"
- kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
-
- kmp_uint64 fr_end;
-#if defined( __GNUC__ )
-# if !defined( __INTEL_COMPILER )
- fr_end = __kmp_hardware_timestamp();
-# else
- fr_end = __rdtsc();
-# endif
-#else
- fr_end = __rdtsc();
-#endif
- K_DIAG( 3, ( "__kmp_barrier: T#%d(%d:%d) frame_begin = %llu, frame_end = %llu\n",
- gtid, ( team != NULL ) ? team->t.t_id : -1, tid, this_thr->th.th_frame_time, fr_end ) );
-
- __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n",
- str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time, fr_end );
- __kmp_str_loc_free( &str_loc );
- this_thr->th.th_frame_time = fr_end;
+ if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) {
+ kmp_uint64 tmp = __itt_get_timestamp();
+ switch( __kmp_forkjoin_frames_mode ) {
+ case 1:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc );
+ this_thr->th.th_frame_time = tmp;
+ break;
+ case 2:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc );
+ break;
+ case 3:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc );
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc );
+ this_thr->th.th_frame_time = tmp;
+ break;
}
}
#endif /* USE_ITT_BUILD */
@@ -2465,7 +2337,7 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team,
KMP_MB();
/* first, let's setup the master thread */
- master_th -> th.th_info .ds.ds_tid = 0;
+ master_th -> th.th_info.ds.ds_tid = 0;
master_th -> th.th_team = team;
master_th -> th.th_team_nproc = team -> t.t_nproc;
master_th -> th.th_team_master = master_th;
@@ -2514,6 +2386,17 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team,
static void
__kmp_alloc_argv_entries( int argc, kmp_team_t *team, int realloc ); // forward declaration
+static void
+__kmp_setup_icv_copy( kmp_team_t *team, int new_nproc,
+#if OMP_30_ENABLED
+ kmp_internal_control_t * new_icvs,
+ ident_t * loc
+#else
+ int new_set_nproc, int new_set_dynamic, int new_set_nested,
+ int new_set_blocktime, int new_bt_intervals, int new_bt_set
+#endif // OMP_30_ENABLED
+ ); // forward declaration
+
/* most of the work for a fork */
/* return true if we really went parallel, false if serialized */
int
@@ -2527,7 +2410,7 @@ __kmp_fork_call(
microtask_t microtask,
launch_t invoker,
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
va_list * ap
#else
va_list ap
@@ -2576,7 +2459,6 @@ __kmp_fork_call(
#endif
-
master_th->th.th_ident = loc;
#if OMP_40_ENABLED
@@ -2590,7 +2472,7 @@ __kmp_fork_call(
argv = (void**)parent_team->t.t_argv;
for( i=argc-1; i >= 0; --i )
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
#else
*argv++ = va_arg( ap, void * );
@@ -2686,11 +2568,11 @@ __kmp_fork_call(
/* create a serialized parallel region? */
if ( nthreads == 1 ) {
/* josh todo: hypothetical question: what do we do for OS X*? */
-#if KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 )
+#if KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM )
void * args[ argc ];
#else
void * * args = (void**) alloca( argc * sizeof( void * ) );
-#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 ) */
+#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM ) */
__kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
KA_TRACE( 20, ("__kmp_fork_call: T#%d serializing parallel region\n", gtid ));
@@ -2721,7 +2603,7 @@ __kmp_fork_call(
if ( ap ) {
for( i=argc-1; i >= 0; --i )
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
- #if KMP_ARCH_X86_64 && KMP_OS_LINUX
+ #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
#else
*argv++ = va_arg( ap, void * );
@@ -2741,7 +2623,7 @@ __kmp_fork_call(
argv = args;
for( i=argc-1; i >= 0; --i )
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
- #if KMP_ARCH_X86_64 && KMP_OS_LINUX
+ #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
#else
*argv++ = va_arg( ap, void * );
@@ -2957,7 +2839,7 @@ __kmp_fork_call(
#endif /* OMP_40_ENABLED */
for( i=argc-1; i >= 0; --i )
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
#else
*argv++ = va_arg( ap, void * );
@@ -2977,6 +2859,18 @@ __kmp_fork_call(
root -> r.r_active = TRUE;
__kmp_fork_team_threads( root, team, master_th, gtid );
+ __kmp_setup_icv_copy(team, nthreads
+#if OMP_30_ENABLED
+ , &master_th->th.th_current_task->td_icvs, loc
+#else
+ , parent_team->t.t_set_nproc[master_tid],
+ parent_team->t.t_set_dynamic[master_tid],
+ parent_team->t.t_set_nested[master_tid],
+ parent_team->t.t_set_blocktime[master_tid],
+ parent_team->t.t_set_bt_intervals[master_tid],
+ parent_team->t.t_set_bt_set[master_tid]
+#endif /* OMP_30_ENABLED */
+ );
__kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
@@ -2992,23 +2886,12 @@ __kmp_fork_call(
__kmp_itt_region_forking( gtid );
#endif /* USE_ITT_BUILD */
+#if USE_ITT_BUILD && USE_ITT_NOTIFY && OMP_30_ENABLED
// Internal fork - report frame begin
-#if USE_ITT_BUILD
- // Collect information only if the file was opened succesfully.
- if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file )
+ if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr )
{
- kmp_uint64 fr_begin;
-#if defined( __GNUC__ )
-# if !defined( __INTEL_COMPILER )
- fr_begin = __kmp_hardware_timestamp();
-# else
- fr_begin = __rdtsc();
-# endif
-#else
- fr_begin = __rdtsc();
-#endif
if( ! ( team->t.t_active_level > 1 ) ) {
- master_th->th.th_frame_time = fr_begin;
+ master_th->th.th_frame_time = __itt_get_timestamp();
}
}
#endif /* USE_ITT_BUILD */
@@ -3134,7 +3017,10 @@ __kmp_join_call(ident_t *loc, int gtid
// Either not in teams or exiting teams region
// (teams is a frame and no other frames inside the teams)
# endif /* OMP_40_ENABLED */
+ {
+ master_th->th.th_ident = loc;
__kmp_itt_region_joined( gtid );
+ }
#endif /* USE_ITT_BUILD */
#if OMP_40_ENABLED
@@ -4644,6 +4530,7 @@ __kmp_register_root( int initial_thread )
root -> r.r_root_team -> t.t_threads[0] = root_thread;
root -> r.r_hot_team -> t.t_threads[0] = root_thread;
root_thread -> th.th_serial_team -> t.t_threads[0] = root_thread;
+ root_thread -> th.th_serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
root -> r.r_uber_thread = root_thread;
/* initialize the thread, get it ready to go */
@@ -5007,6 +4894,19 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
TCW_4( __kmp_init_monitor, 1 );
__kmp_create_monitor( & __kmp_monitor );
KF_TRACE( 10, ( "after __kmp_create_monitor\n" ) );
+ #if KMP_OS_WINDOWS
+ // AC: wait until monitor has started. This is a fix for CQ232808.
+ // The reason is that if the library is loaded/unloaded in a loop with small (parallel)
+ // work in between, then there is high probability that monitor thread started after
+ // the library shutdown. At shutdown it is too late to cope with the problem, because
+ // when the master is in DllMain (process detach) the monitor has no chances to start
+ // (it is blocked), and master has no means to inform the monitor that the library has gone,
+ // because all the memory which the monitor can access is going to be released/reset.
+ while ( TCR_4(__kmp_init_monitor) < 2 ) {
+ KMP_YIELD( TRUE );
+ }
+ KF_TRACE( 10, ( "after monitor thread has started\n" ) );
+ #endif
}
__kmp_release_bootstrap_lock( & __kmp_monitor_lock );
}
@@ -5049,6 +4949,7 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
0 );
}
KMP_ASSERT ( serial_team );
+ serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
serial_team -> t.t_threads[0] = new_thr;
KF_TRACE( 10, ( "__kmp_allocate_thread: after th_serial/serial_team : new_thr=%p\n",
new_thr ) );
@@ -5144,76 +5045,94 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
* IF YOU TOUCH THIS ROUTINE, RUN EPCC C SYNCBENCH ON A BIG-IRON MACHINE!!!
*/
static void
-__kmp_reinitialize_team(
- kmp_team_t * team,
- int new_nproc,
- #if OMP_30_ENABLED
- kmp_internal_control_t * new_icvs,
- ident_t * loc
- #else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
- #endif // OMP_30_ENABLED
-) {
- int f;
- #if OMP_30_ENABLED
- KMP_DEBUG_ASSERT( team && new_nproc && new_icvs );
- KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc );
- team->t.t_ident = loc;
- #else
- KMP_DEBUG_ASSERT( team && new_nproc && new_set_nproc );
- #endif // OMP_30_ENABLED
+__kmp_reinitialize_team( kmp_team_t *team,
+#if OMP_30_ENABLED
+ kmp_internal_control_t *new_icvs, ident_t *loc
+#else
+ int new_set_nproc, int new_set_dynamic, int new_set_nested,
+ int new_set_blocktime, int new_bt_intervals, int new_bt_set
+#endif
+ ) {
+ KF_TRACE( 10, ( "__kmp_reinitialize_team: enter this_thread=%p team=%p\n",
+ team->t.t_threads[0], team ) );
+#if OMP_30_ENABLED
+ KMP_DEBUG_ASSERT( team && new_icvs);
+ KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc );
+ team->t.t_ident = loc;
+#else
+ KMP_DEBUG_ASSERT( team && new_set_nproc );
+#endif // OMP_30_ENABLED
team->t.t_id = KMP_GEN_TEAM_ID();
-#if KMP_BARRIER_ICV_PULL
- //
- // Copy the ICV's to the team structure, where all of the worker threads
- // can access them and make their own copies after the barrier.
- //
+ // Copy ICVs to the master thread's implicit taskdata
+#if OMP_30_ENABLED
load_icvs(new_icvs);
- store_icvs(&team->t.t_initial_icvs, new_icvs);
-
- //
- // Set up the master thread's copy of the ICV's. __kmp_fork_call()
- // assumes they are already set in the master thread.
- // FIXME - change that code to use the team->t.t_initial_icvs copy
- // and eliminate this copy.
- //
__kmp_init_implicit_task( loc, team->t.t_threads[0], team, 0, FALSE );
store_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs);
sync_icvs();
- KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n",
- 0, team->t.t_threads[0], team ) );
+# else
+ team -> t.t_set_nproc[0] = new_set_nproc;
+ team -> t.t_set_dynamic[0] = new_set_dynamic;
+ team -> t.t_set_nested[0] = new_set_nested;
+ team -> t.t_set_blocktime[0] = new_set_blocktime;
+ team -> t.t_set_bt_intervals[0] = new_bt_intervals;
+ team -> t.t_set_bt_set[0] = new_bt_set;
+# endif // OMP_30_ENABLED
-#elif KMP_BARRIER_ICV_PUSH
- //
- // Set the ICV's in the master thread only.
- // They will be propagated by the fork barrier.
- //
- __kmp_init_implicit_task( loc, team->t.t_threads[0], team, 0, FALSE );
+ KF_TRACE( 10, ( "__kmp_reinitialize_team: exit this_thread=%p team=%p\n",
+ team->t.t_threads[0], team ) );
+}
+
+static void
+__kmp_setup_icv_copy(kmp_team_t * team, int new_nproc,
+#if OMP_30_ENABLED
+ kmp_internal_control_t * new_icvs,
+ ident_t * loc
+#else
+ int new_set_nproc, int new_set_dynamic, int new_set_nested,
+ int new_set_blocktime, int new_bt_intervals, int new_bt_set
+#endif // OMP_30_ENABLED
+ )
+{
+ int f;
+
+#if OMP_30_ENABLED
+ KMP_DEBUG_ASSERT( team && new_nproc && new_icvs );
+ KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc );
+#else
+ KMP_DEBUG_ASSERT( team && new_nproc && new_set_nproc );
+#endif // OMP_30_ENABLED
+
+ // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team.
+ // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called.
+#if KMP_BARRIER_ICV_PULL
+ // Copy the ICVs to master's thread structure into th_fixed_icvs (which remains untouched), where all of the
+ // worker threads can access them and make their own copies after the barrier.
load_icvs(new_icvs);
- store_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs);
+ KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point
+ store_icvs(&team->t.t_threads[0]->th.th_fixed_icvs, new_icvs);
sync_icvs();
+ KF_TRACE(10, ("__kmp_setup_icv_copy: PULL: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team));
- KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n",
- 0, team->t.t_threads[0], team ) );
+#elif KMP_BARRIER_ICV_PUSH
+ // The ICVs will be propagated in the fork barrier, so nothing needs to be done here.
+ KF_TRACE(10, ("__kmp_setup_icv_copy: PUSH: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team));
#else
- //
- // Copy the icvs to each of the threads. This takes O(nthreads) time.
- //
-#if OMP_30_ENABLED
+ // Copy the ICVs to each of the non-master threads. This takes O(nthreads) time.
+# if OMP_30_ENABLED
load_icvs(new_icvs);
-#endif
- for( f=0 ; f<new_nproc ; f++) {
+# endif // OMP_30_ENABLED
+ KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point
+ for(f=1 ; f<new_nproc ; f++) { // skip the master thread
# if OMP_30_ENABLED
// TODO: GEH - pass in better source location info since usually NULL here
- KF_TRACE( 10, ( "__kmp_reinitialize_team1: T#%d this_thread=%p team=%p\n",
+ KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
f, team->t.t_threads[f], team ) );
__kmp_init_implicit_task( loc, team->t.t_threads[f], team, f, FALSE );
store_icvs(&team->t.t_implicit_task_taskdata[f].td_icvs, new_icvs);
- KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n",
+ KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
f, team->t.t_threads[f], team ) );
# else
team -> t.t_set_nproc[f] = new_set_nproc;
@@ -5226,9 +5145,8 @@ __kmp_reinitialize_team(
}
# if OMP_30_ENABLED
sync_icvs();
-# endif
-#endif // KMP_BARRIER_ICV_PUSH || KMP_BARRIER_ICV_PULL
-
+# endif // OMP_30_ENABLED
+#endif // KMP_BARRIER_ICV_PULL
}
/* initialize the team data structure
@@ -5246,6 +5164,8 @@ __kmp_initialize_team(
int new_set_blocktime, int new_bt_intervals, int new_bt_set
#endif // OMP_30_ENABLED
) {
+ KF_TRACE( 10, ( "__kmp_initialize_team: enter: team=%p\n", team ) );
+
/* verify */
KMP_DEBUG_ASSERT( team );
KMP_DEBUG_ASSERT( new_nproc <= team->t.t_max_nproc );
@@ -5290,18 +5210,18 @@ __kmp_initialize_team(
team -> t.t_control_stack_top = NULL;
- __kmp_reinitialize_team(
- team, new_nproc,
- #if OMP_30_ENABLED
- new_icvs,
- loc
- #else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
- #endif // OMP_30_ENABLED
- );
+ __kmp_reinitialize_team( team,
+#if OMP_30_ENABLED
+ new_icvs, loc
+#else
+ new_set_nproc, new_set_dynamic, new_set_nested,
+ new_set_blocktime, new_bt_intervals, new_bt_set
+#endif // OMP_30_ENABLED
+ );
+
KMP_MB();
+ KF_TRACE( 10, ( "__kmp_initialize_team: exit: team=%p\n", team ) );
}
#if KMP_OS_LINUX
@@ -5700,15 +5620,15 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
// TODO???: team -> t.t_max_active_levels = new_max_active_levels;
team -> t.t_sched = new_icvs->sched;
#endif
- __kmp_reinitialize_team( team, new_nproc,
+ __kmp_reinitialize_team( team,
#if OMP_30_ENABLED
- new_icvs,
- root->r.r_uber_thread->th.th_ident
+ new_icvs, root->r.r_uber_thread->th.th_ident
#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ new_set_nproc, new_set_dynamic, new_set_nested,
+ new_set_blocktime, new_bt_intervals, new_bt_set
+#endif // OMP_30_ENABLED
+ );
+
#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
@@ -5768,15 +5688,14 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
if(team -> t.t_max_nproc < new_nproc) {
/* reallocate larger arrays */
__kmp_reallocate_team_arrays(team, new_nproc);
- __kmp_reinitialize_team( team, new_nproc,
+ __kmp_reinitialize_team( team,
#if OMP_30_ENABLED
- new_icvs,
- NULL // TODO: !!!
+ new_icvs, NULL
#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ new_set_nproc, new_set_dynamic, new_set_nested,
+ new_set_blocktime, new_bt_intervals, new_bt_set
+#endif // OMP_30_ENABLED
+ );
}
#if KMP_OS_LINUX
@@ -5859,8 +5778,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
# endif
#endif
- }
- else {
+ }
+ else {
KA_TRACE( 20, ("__kmp_allocate_team: reusing hot team\n" ));
#if KMP_MIC
// This case can mean that omp_set_num_threads() was called and the hot team size
@@ -5877,15 +5796,14 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
team -> t.t_sched = new_icvs->sched;
#endif
- __kmp_reinitialize_team( team, new_nproc,
+ __kmp_reinitialize_team( team,
#if OMP_30_ENABLED
- new_icvs,
- root->r.r_uber_thread->th.th_ident
+ new_icvs, root->r.r_uber_thread->th.th_ident
#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ new_set_nproc, new_set_dynamic, new_set_nested,
+ new_set_blocktime, new_bt_intervals, new_bt_set
+#endif // OMP_30_ENABLED
+ );
#if OMP_30_ENABLED
KF_TRACE( 10, ("__kmp_allocate_team2: T#%d, this_thread=%p team=%p\n",
@@ -6000,6 +5918,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
* up seems to really hurt performance a lot on the P4, so, let's not use
* this... */
__kmp_allocate_team_arrays( team, max_nproc );
+
+ KA_TRACE( 20, ( "__kmp_allocate_team: making a new team\n" ) );
__kmp_initialize_team( team, new_nproc,
#if OMP_30_ENABLED
new_icvs,
@@ -6293,7 +6213,6 @@ __kmp_join_barrier( int gtid )
KA_TRACE( 10, ("__kmp_join_barrier: T#%d(%d:%d) arrived at join barrier\n",
gtid, team_id, tid ));
-
#if OMP_30_ENABLED
if ( __kmp_tasking_mode == tskm_extra_barrier ) {
__kmp_tasking_barrier( team, this_thr, gtid );
@@ -6329,25 +6248,6 @@ __kmp_join_barrier( int gtid )
#endif // OMP_30_ENABLED
}
- #if KMP_OS_WINDOWS
- // AC: wait here until monitor has started. This is a fix for CQ232808.
- // The reason is that if the library is loaded/unloaded in a loop with small (parallel)
- // work in between, then there is high probability that monitor thread started after
- // the library shutdown. At shutdown it is too late to cope with the problem, because
- // when the master is in DllMain (process detach) the monitor has no chances to start
- // (it is blocked), and master has no means to inform the monitor that the library has gone,
- // because all the memory which the monitor can access is going to be released/reset.
- //
- // The moment before barrier_gather sounds appropriate, because master needs to
- // wait for all workers anyway, and we want this to happen as late as possible,
- // but before the shutdown which may happen after the barrier.
- if( KMP_MASTER_TID( tid ) && TCR_4(__kmp_init_monitor) < 2 ) {
- __kmp_wait_sleep( this_thr, (volatile kmp_uint32*)&__kmp_init_monitor, 2, 0
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }
- #endif
-
#if USE_ITT_BUILD
if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
__kmp_itt_barrier_starting( gtid, itt_sync_obj );
@@ -6390,34 +6290,22 @@ __kmp_join_barrier( int gtid )
USE_ITT_BUILD_ARG( itt_sync_obj )
);
}
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
// Join barrier - report frame end
-#if USE_ITT_BUILD
- // Collect information only if the file was opened successfully.
- if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file )
- {
- ident_t * loc = this_thr->th.th_ident;
- if (loc) {
- // Use compiler-generated location to mark the frame:
- // "<func>$omp$frame@[file:]<line>[:<col>]"
- kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
-
- kmp_uint64 fr_end;
-#if defined( __GNUC__ )
-# if !defined( __INTEL_COMPILER )
- fr_end = __kmp_hardware_timestamp();
-# else
- fr_end = __rdtsc();
-# endif
-#else
- fr_end = __rdtsc();
-#endif
- K_DIAG( 3, ( "__kmp_join_barrier: T#%d(%d:%d) frame_begin = %llu, frame_end = %llu\n",
- gtid, ( team != NULL ) ? team->t.t_id : -1, tid, this_thr->th.th_frame_time, fr_end ) );
-
- __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n",
- str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time, fr_end );
-
- __kmp_str_loc_free( &str_loc );
+ if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) {
+ kmp_uint64 tmp = __itt_get_timestamp();
+ ident_t * loc = team->t.t_ident;
+ switch( __kmp_forkjoin_frames_mode ) {
+ case 1:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc );
+ break;
+ case 2:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc );
+ break;
+ case 3:
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc );
+ __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc );
+ break;
}
}
#endif /* USE_ITT_BUILD */
@@ -6571,20 +6459,16 @@ __kmp_fork_barrier( int gtid, int tid )
#if OMP_30_ENABLED
# if KMP_BARRIER_ICV_PULL
- //
- // FIXME - after __kmp_fork_call() is modified to not look at the
- // master thread's implicit task ICV's, remove the ! KMP_MASTER_TID
- // restriction from this if condition.
- //
- if (! KMP_MASTER_TID( tid ) ) {
- //
- // Copy the initial ICV's from the team struct to the implicit task
- // for this tid.
- //
- __kmp_init_implicit_task( team->t.t_ident, team->t.t_threads[tid],
- team, tid, FALSE );
- load_icvs(&team->t.t_initial_icvs);
- store_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &team->t.t_initial_icvs);
+ // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team.
+ // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called.
+ // We cannot modify __kmp_fork_call() to look at the fixed ICVs in the master's thread struct, because it is
+ // not always the case that the threads arrays have been allocated when __kmp_fork_call() is executed.
+ if (! KMP_MASTER_TID( tid ) ) { // master thread already has ICVs
+ // Copy the initial ICVs from the master's thread struct to the implicit task for this tid.
+ KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d(%d) is PULLing ICVs\n", gtid, tid ));
+ load_icvs(&team->t.t_threads[0]->th.th_fixed_icvs);
+ __kmp_init_implicit_task( team->t.t_ident, team->t.t_threads[tid], team, tid, FALSE );
+ store_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &team->t.t_threads[0]->th.th_fixed_icvs);
sync_icvs();
}
# endif // KMP_BARRIER_ICV_PULL
@@ -6716,13 +6600,13 @@ __kmp_launch_thread( kmp_info_t *this_thr )
void
__kmp_internal_end_dest( void *specific_gtid )
{
- #ifdef __INTEL_COMPILER
+ #if KMP_COMPILER_ICC
#pragma warning( push )
#pragma warning( disable: 810 ) // conversion from "void *" to "int" may lose significant bits
#endif
// Make sure no significant bits are lost
int gtid = (kmp_intptr_t)specific_gtid - 1;
- #ifdef __INTEL_COMPILER
+ #if KMP_COMPILER_ICC
#pragma warning( pop )
#endif
@@ -7503,7 +7387,6 @@ __kmp_do_serial_initialize( void )
__kmp_dflt_team_nth_ub = __kmp_sys_max_nth;
}
__kmp_max_nth = __kmp_sys_max_nth;
- __kmp_threads_capacity = __kmp_initial_threads_capacity( __kmp_dflt_team_nth_ub );
// Three vars below moved here from __kmp_env_initialize() "KMP_BLOCKTIME" part
__kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
@@ -7572,18 +7455,17 @@ __kmp_do_serial_initialize( void )
if ( __kmp_str_match_true( val ) ) {
kmp_str_buf_t buffer;
__kmp_str_buf_init( & buffer );
- __kmp_i18n_dump_catalog( buffer );
+ __kmp_i18n_dump_catalog( & buffer );
__kmp_printf( "%s", buffer.str );
__kmp_str_buf_free( & buffer );
}; // if
__kmp_env_free( & val );
#endif
+ __kmp_threads_capacity = __kmp_initial_threads_capacity( __kmp_dflt_team_nth_ub );
// Moved here from __kmp_env_initialize() "KMP_ALL_THREADPRIVATE" part
__kmp_tp_capacity = __kmp_default_tp_capacity(__kmp_dflt_team_nth_ub, __kmp_max_nth, __kmp_allThreadsSpecified);
- // omalyshe: This initialisation beats env var setting.
- //__kmp_load_balance_interval = 1.0;
// If the library is shut down properly, both pools must be NULL. Just in case, set them
// to NULL -- some memory may leak, but subsequent code will work even if pools are not freed.
@@ -7876,38 +7758,6 @@ __kmp_parallel_initialize( void )
__kmp_print_version_2();
}
-#if USE_ITT_BUILD
- // Create CSV file to report frames
- if( __kmp_forkjoin_frames_mode == 1 )
- {
- // Open CSV file to write itt frame information
- const char * csv_file;
-/* Internal AXE variables
- char * host_name = __kmp_env_get("INTEL_MRTE_HOST_NAME");
- char * out_dir = __kmp_env_get("INTEL_MRTE_DATA_DIR");*/
- char * host_name = __kmp_env_get("AMPLXE_HOSTNAME");
- char * out_dir = __kmp_env_get("AMPLXE_DATA_DIR");
-
- if( out_dir && host_name ) {
- csv_file = __kmp_str_format( "%s/omp-frames-hostname-%s.csv", out_dir, host_name );
- __kmp_itt_csv_file = fopen( csv_file, "w" );
- __kmp_str_free( &csv_file );
- } else {
-#ifdef KMP_DEBUG
- // Create CSV file in the current dir
- csv_file = __kmp_str_format( "./omp-frames-hostname-xxx.csv" );
- __kmp_itt_csv_file = fopen( csv_file, "w" );
- __kmp_str_free( &csv_file );
-#endif
- }
- if( __kmp_itt_csv_file ) {
- __kmp_str_buf_init( & __kmp_itt_frame_buffer );
- __kmp_str_buf_print( & __kmp_itt_frame_buffer, "name,start_tsc.TSC,end_tsc,pid,tid\n" );
- }
- }
-
-#endif /* USE_ITT_BUILD */
-
/* we have finished parallel initialization */
TCW_SYNC_4(__kmp_init_parallel, TRUE);
@@ -8347,16 +8197,6 @@ __kmp_cleanup( void )
__kmp_i18n_catclose();
-#if USE_ITT_BUILD
- // Close CSV file for frames
- if( __kmp_forkjoin_frames_mode && __kmp_itt_csv_file ) {
- fprintf( __kmp_itt_csv_file, __kmp_itt_frame_buffer.str );
-
- __kmp_str_buf_free( & __kmp_itt_frame_buffer );
- fclose( __kmp_itt_csv_file );
- }
-#endif /* USE_ITT_BUILD */
-
KA_TRACE( 10, ("__kmp_cleanup: exit\n" ) );
}
@@ -8576,14 +8416,6 @@ __kmp_aux_set_defaults(
* internal fast reduction routines
*/
-// implementation rev. 0.4
-// AT: determine CPU, and always use 'critical method' if non-Intel
-// AT: test loc != NULL
-// AT: what to return if lck == NULL
-// AT: tune the cut-off point for atomic reduce method
-// AT: tune what to return depending on the CPU and platform configuration
-// AT: tune what to return depending on team size
-// AT: move this function out to kmp_csupport.c
PACKED_REDUCTION_METHOD_T
__kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
kmp_int32 num_vars, size_t reduce_size, void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data),
@@ -8641,22 +8473,10 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
#error "Unknown or unsupported OS"
#endif // KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN
- #elif KMP_ARCH_X86
+ #elif KMP_ARCH_X86 || KMP_ARCH_ARM
#if KMP_OS_LINUX || KMP_OS_WINDOWS
- // similar to win_32
- // 4x1x2 fxqlin04, the 'linear,linear' barrier
-
- // similar to lin_32
- // 4x1x2 fxqwin04, the 'linear,linear' barrier
-
- // actual measurement shows that the critical section method is better if team_size <= 8;
- // what happenes when team_size > 8 ? ( no machine to test )
-
- // TO DO: need to run a 32-bit code on Intel(R) 64
- // TO DO: test the 'hyper,hyper,1,1' barrier
-
// basic tuning
if( atomic_available ) {
@@ -8667,7 +8487,6 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
#elif KMP_OS_DARWIN
-
if( atomic_available && ( num_vars <= 3 ) ) {
retval = atomic_reduce_block;
} else if( tree_available ) {
@@ -8686,18 +8505,6 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
}
- //AT: TO DO: critical block method not implemented by PAROPT
- //if( retval == __kmp_critical_reduce_block ) {
- // if( lck == NULL ) { // critical block method not implemented by PAROPT
- // }
- //}
-
- // tune what to return depending on the CPU and platform configuration
- // (sometimes tree method is slower than critical)
-
- // probably tune what to return depending on team size
-
-
// KMP_FORCE_REDUCTION
if( __kmp_force_reduction_method != reduction_method_not_defined ) {
diff --git a/openmp/runtime/src/kmp_settings.c b/openmp/runtime/src/kmp_settings.c
index b190cce1486..3a0f6ce80b9 100644
--- a/openmp/runtime/src/kmp_settings.c
+++ b/openmp/runtime/src/kmp_settings.c
@@ -1,7 +1,7 @@
/*
* kmp_settings.c -- Initialize environment variables
- * $Revision: 42642 $
- * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $
+ * $Revision: 42816 $
+ * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
*/
@@ -26,9 +26,6 @@
#include "kmp_io.h"
-#define KMP_MAX( x, y ) ( (x) > (y) ? (x) : (y) )
-#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) )
-
static int __kmp_env_isDefined( char const * name );
static int __kmp_env_toPrint( char const * name, int flag );
@@ -3915,7 +3912,7 @@ __kmp_stg_parse_lock_kind( char const * name, char const * value, void * data )
|| __kmp_str_match( "testandset", 2, value ) ) {
__kmp_user_lock_kind = lk_tas;
}
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
else if ( __kmp_str_match( "futex", 1, value ) ) {
if ( __kmp_futex_determine_capable() ) {
__kmp_user_lock_kind = lk_futex;
@@ -4322,6 +4319,16 @@ __kmp_stg_print_omp_display_env( kmp_str_buf_t * buffer, char const * name, void
}
} // __kmp_stg_print_omp_display_env
+static void
+__kmp_stg_parse_omp_cancellation( char const * name, char const * value, void * data ) {
+ __kmp_stg_parse_bool( name, value, & __kmp_omp_cancellation );
+} // __kmp_stg_parse_omp_cancellation
+
+static void
+__kmp_stg_print_omp_cancellation( kmp_str_buf_t * buffer, char const * name, void * data ) {
+ __kmp_stg_print_bool( buffer, name, __kmp_omp_cancellation );
+} // __kmp_stg_print_omp_cancellation
+
#endif
// -------------------------------------------------------------------------------------------------
@@ -4476,6 +4483,7 @@ static kmp_setting_t __kmp_stg_table[] = {
# if OMP_40_ENABLED
{ "OMP_DISPLAY_ENV", __kmp_stg_parse_omp_display_env, __kmp_stg_print_omp_display_env, NULL, 0, 0 },
+ { "OMP_CANCELLATION", __kmp_stg_parse_omp_cancellation, __kmp_stg_print_omp_cancellation, NULL, 0, 0 },
#endif
{ "", NULL, NULL, NULL, 0, 0 }
}; // settings
diff --git a/openmp/runtime/src/kmp_str.c b/openmp/runtime/src/kmp_str.c
index d9b98ab9e30..c1f9e9b6406 100644
--- a/openmp/runtime/src/kmp_str.c
+++ b/openmp/runtime/src/kmp_str.c
@@ -1,7 +1,7 @@
/*
* kmp_str.c -- String manipulation routines.
- * $Revision: 42613 $
- * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
+ * $Revision: 42810 $
+ * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
*/
@@ -329,9 +329,9 @@ void
__kmp_str_fname_free(
kmp_str_fname_t * fname
) {
- __kmp_str_free( const_cast< char const ** >( & fname->path ) );
- __kmp_str_free( const_cast< char const ** >( & fname->dir ) );
- __kmp_str_free( const_cast< char const ** >( & fname->base ) );
+ __kmp_str_free( (char const **)( & fname->path ) );
+ __kmp_str_free( (char const **)( & fname->dir ) );
+ __kmp_str_free( (char const **)( & fname->base ) );
} // kmp_str_fname_free
diff --git a/openmp/runtime/src/kmp_stub.c b/openmp/runtime/src/kmp_stub.c
index e72b196ef72..c1914f4f570 100644
--- a/openmp/runtime/src/kmp_stub.c
+++ b/openmp/runtime/src/kmp_stub.c
@@ -1,7 +1,7 @@
/*
* kmp_stub.c -- stub versions of user-callable OpenMP RT functions.
- * $Revision: 42150 $
- * $Date: 2013-03-15 15:40:38 -0500 (Fri, 15 Mar 2013) $
+ * $Revision: 42826 $
+ * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $
*/
@@ -29,11 +29,32 @@
#include <sys/time.h>
#endif
+#include "omp.h" // Function renamings.
#include "kmp.h" // KMP_DEFAULT_STKSIZE
#include "kmp_version.h"
-#include "omp.h" // Function renamings.
+// Moved from omp.h
+#if OMP_30_ENABLED
+#define omp_set_max_active_levels ompc_set_max_active_levels
+#define omp_set_schedule ompc_set_schedule
+#define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
+#define omp_get_team_size ompc_get_team_size
+
+#endif // OMP_30_ENABLED
+
+#define omp_set_num_threads ompc_set_num_threads
+#define omp_set_dynamic ompc_set_dynamic
+#define omp_set_nested ompc_set_nested
+#define kmp_set_stacksize kmpc_set_stacksize
+#define kmp_set_stacksize_s kmpc_set_stacksize_s
+#define kmp_set_blocktime kmpc_set_blocktime
+#define kmp_set_library kmpc_set_library
+#define kmp_set_defaults kmpc_set_defaults
+#define kmp_malloc kmpc_malloc
+#define kmp_calloc kmpc_calloc
+#define kmp_realloc kmpc_realloc
+#define kmp_free kmpc_free
static double frequency = 0.0;
@@ -243,29 +264,5 @@ double __kmps_get_wtick( void ) {
return wtick;
}; // __kmps_get_wtick
-
-/*
- These functions are exported from libraries, but not declared in omp,h and omp_lib.f:
-
- // omalyshe: eight entries below removed from the library (2011-11-22)
- kmpc_get_banner
- kmpc_get_poolmode
- kmpc_get_poolsize
- kmpc_get_poolstat
- kmpc_poolprint
- kmpc_print_banner
- kmpc_set_poolmode
- kmpc_set_poolsize
-
- kmpc_set_affinity
- kmp_threadprivate_insert
- kmp_threadprivate_insert_private_data
- VT_getthid
- vtgthid
-
- The list is collected on lin_32.
-
-*/
-
// end of file //
diff --git a/openmp/runtime/src/kmp_tasking.c b/openmp/runtime/src/kmp_tasking.c
index ea5cdc034af..8cac009b266 100644
--- a/openmp/runtime/src/kmp_tasking.c
+++ b/openmp/runtime/src/kmp_tasking.c
@@ -1,7 +1,7 @@
/*
* kmp_tasking.c -- OpenMP 3.0 tasking support.
- * $Revision: 42522 $
- * $Date: 2013-07-16 05:28:49 -0500 (Tue, 16 Jul 2013) $
+ * $Revision: 42852 $
+ * $Date: 2013-12-04 10:50:49 -0600 (Wed, 04 Dec 2013) $
*/
@@ -620,13 +620,28 @@ __kmp_task_finish( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t *resumed_tas
#if OMP_40_ENABLED
if ( taskdata->td_taskgroup )
KMP_TEST_THEN_DEC32( (kmp_int32 *)(& taskdata->td_taskgroup->count) );
- __kmp_release_deps(gtid,taskdata);
+ __kmp_release_deps(gtid,taskdata);
#endif
}
KA_TRACE(20, ("__kmp_task_finish: T#%d finished task %p, %d incomplete children\n",
gtid, taskdata, children) );
+#if OMP_40_ENABLED
+ /* If the tasks' destructor thunk flag has been set, we need to invoke the
+ destructor thunk that has been generated by the compiler.
+ The code is placed here, since at this point other tasks might have been released
+ hence overlapping the destructor invokations with some other work in the
+ released tasks. The OpenMP spec is not specific on when the destructors are
+ invoked, so we should be free to choose.
+ */
+ if (taskdata->td_flags.destructors_thunk) {
+ kmp_routine_entry_t destr_thunk = task->destructors;
+ KMP_ASSERT(destr_thunk);
+ destr_thunk(gtid, task);
+ }
+#endif // OMP_40_ENABLED
+
// bookkeeping for resuming task:
// GEH - note tasking_ser => task_serial
KMP_DEBUG_ASSERT( (taskdata->td_flags.tasking_ser || taskdata->td_flags.task_serial) ==
@@ -739,10 +754,10 @@ __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *te
task->td_flags.complete = 0;
task->td_flags.freed = 0;
-#if OMP_40_ENABLED
+#if OMP_40_ENABLED
task->td_dephash = NULL;
task->td_depnode = NULL;
-#endif
+#endif
if (set_curr_task) { // only do this initialization the first time a thread is created
task->td_incomplete_child_tasks = 0;
@@ -850,7 +865,7 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags,
taskdata->td_task_id = KMP_GEN_TASK_ID();
taskdata->td_team = team;
- taskdata->td_alloc_thread = thread;
+ taskdata->td_alloc_thread = thread;
taskdata->td_parent = parent_task;
taskdata->td_level = parent_task->td_level + 1; // increment nesting level
taskdata->td_ident = loc_ref;
@@ -863,6 +878,9 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags,
taskdata->td_flags.tiedness = flags->tiedness;
taskdata->td_flags.final = flags->final;
taskdata->td_flags.merged_if0 = flags->merged_if0;
+#if OMP_40_ENABLED
+ taskdata->td_flags.destructors_thunk = flags->destructors_thunk;
+#endif // OMP_40_ENABLED
taskdata->td_flags.tasktype = TASK_EXPLICIT;
// GEH - TODO: fix this to copy parent task's value of tasking_ser flag
@@ -890,7 +908,7 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags,
taskdata->td_taskgroup = parent_task->td_taskgroup; // task inherits the taskgroup from the parent task
taskdata->td_dephash = NULL;
taskdata->td_depnode = NULL;
-#endif
+#endif
// Only need to keep track of child task counts if team parallel and tasking not serialized
if ( !( taskdata -> td_flags.team_serial || taskdata -> td_flags.tasking_ser ) ) {
KMP_TEST_THEN_INC32( (kmp_int32 *)(& parent_task->td_incomplete_child_tasks) );
@@ -946,24 +964,46 @@ static void
__kmp_invoke_task( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t * current_task )
{
kmp_taskdata_t * taskdata = KMP_TASK_TO_TASKDATA(task);
+#if OMP_40_ENABLED
+ int discard = 0 /* false */;
+#endif
KA_TRACE(30, ("__kmp_invoke_task(enter): T#%d invoking task %p, current_task=%p\n",
gtid, taskdata, current_task) );
__kmp_task_start( gtid, task, current_task );
+#if OMP_40_ENABLED
+ // TODO: cancel tasks if the parallel region has also been cancelled
+ // TODO: check if this sequence can be hoisted above __kmp_task_start
+ // if cancellation has been enabled for this run ...
+ if (__kmp_omp_cancellation) {
+ kmp_info_t *this_thr = __kmp_threads [ gtid ];
+ kmp_team_t * this_team = this_thr->th.th_team;
+ kmp_taskgroup_t * taskgroup = taskdata->td_taskgroup;
+ if ((taskgroup && taskgroup->cancel_request) || (this_team->t.t_cancel_request == cancel_parallel)) {
+ // this task belongs to a task group and we need to cancel it
+ discard = 1 /* true */;
+ }
+ }
+
//
// Invoke the task routine and pass in relevant data.
// Thunks generated by gcc take a different argument list.
//
+ if (!discard) {
+#endif // OMP_40_ENABLED
#ifdef KMP_GOMP_COMPAT
- if (taskdata->td_flags.native) {
- ((void (*)(void *))(*(task->routine)))(task->shareds);
- }
- else
+ if (taskdata->td_flags.native) {
+ ((void (*)(void *))(*(task->routine)))(task->shareds);
+ }
+ else
#endif /* KMP_GOMP_COMPAT */
- {
- (*(task->routine))(gtid, task);
+ {
+ (*(task->routine))(gtid, task);
+ }
+#if OMP_40_ENABLED
}
+#endif // OMP_40_ENABLED
__kmp_task_finish( gtid, task, current_task );
@@ -1079,10 +1119,8 @@ __kmpc_omp_taskwait( ident_t *loc_ref, kmp_int32 gtid )
// GEH: if team serialized, avoid reading the volatile variable below.
while ( TCR_4(taskdata -> td_incomplete_child_tasks) != 0 ) {
__kmp_execute_tasks( thread, gtid, &(taskdata->td_incomplete_child_tasks),
- 0, FALSE, &thread_finished,
-#if USE_ITT_BUILD
- itt_sync_obj,
-#endif /* USE_ITT_BUILD */
+ 0, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj),
__kmp_task_stealing_constraint );
}
}
@@ -1134,10 +1172,8 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part )
__kmp_itt_taskwait_starting( gtid, itt_sync_obj );
#endif /* USE_ITT_BUILD */
if ( ! taskdata->td_flags.team_serial ) {
- __kmp_execute_tasks( thread, gtid, NULL, 0, FALSE, &thread_finished,
-#if USE_ITT_BUILD
- itt_sync_obj,
-#endif /* USE_ITT_BUILD */
+ __kmp_execute_tasks( thread, gtid, NULL, 0, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj),
__kmp_task_stealing_constraint );
}
@@ -1162,7 +1198,7 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part )
// __kmpc_taskgroup: Start a new taskgroup
void
-__kmpc_taskgroup( ident* loc, int gtid )
+__kmpc_taskgroup( ident_t* loc, int gtid )
{
kmp_info_t * thread = __kmp_threads[ gtid ];
kmp_taskdata_t * taskdata = thread->th.th_current_task;
@@ -1170,6 +1206,7 @@ __kmpc_taskgroup( ident* loc, int gtid )
(kmp_taskgroup_t *)__kmp_thread_malloc( thread, sizeof( kmp_taskgroup_t ) );
KA_TRACE(10, ("__kmpc_taskgroup: T#%d loc=%p group=%p\n", gtid, loc, tg_new) );
tg_new->count = 0;
+ tg_new->cancel_request = cancel_noreq;
tg_new->parent = taskdata->td_taskgroup;
taskdata->td_taskgroup = tg_new;
}
@@ -1180,7 +1217,7 @@ __kmpc_taskgroup( ident* loc, int gtid )
// and its descendants are complete
void
-__kmpc_end_taskgroup( ident* loc, int gtid )
+__kmpc_end_taskgroup( ident_t* loc, int gtid )
{
kmp_info_t * thread = __kmp_threads[ gtid ];
kmp_taskdata_t * taskdata = thread->th.th_current_task;
@@ -1201,10 +1238,8 @@ __kmpc_end_taskgroup( ident* loc, int gtid )
if ( ! taskdata->td_flags.team_serial ) {
while ( TCR_4(taskgroup->count) != 0 ) {
__kmp_execute_tasks( thread, gtid, &(taskgroup->count),
- 0, FALSE, &thread_finished,
-#if USE_ITT_BUILD
- itt_sync_obj,
-#endif /* USE_ITT_BUILD */
+ 0, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj),
__kmp_task_stealing_constraint );
}
}
@@ -1420,15 +1455,13 @@ __kmp_steal_task( kmp_info_t *victim, kmp_int32 gtid, kmp_task_team_t *task_team
// checker is the value to check to terminate the spin.
int
-__kmp_execute_tasks( kmp_info_t *thread,
- kmp_int32 gtid,
+__kmp_execute_tasks( kmp_info_t *thread,
+ kmp_int32 gtid,
volatile kmp_uint *spinner,
kmp_uint checker,
- int final_spin,
- int *thread_finished,
-#if USE_ITT_BUILD
- void * itt_sync_obj,
-#endif /* USE_ITT_BUILD */
+ int final_spin,
+ int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj),
kmp_int32 is_constrained )
{
kmp_task_team_t * task_team;
@@ -2297,11 +2330,9 @@ __kmp_task_team_sync( kmp_info_t *this_thr, kmp_team_t *team )
// in team > 1 !
void
-__kmp_task_team_wait( kmp_info_t *this_thr,
+__kmp_task_team_wait( kmp_info_t *this_thr,
kmp_team_t *team
-#if USE_ITT_BUILD
- , void * itt_sync_obj
-#endif /* USE_ITT_BUILD */
+ USE_ITT_BUILD_ARG(void * itt_sync_obj)
)
{
kmp_task_team_t *task_team = team->t.t_task_team;
@@ -2320,9 +2351,7 @@ __kmp_task_team_wait( kmp_info_t *this_thr,
// termination condition.
//
__kmp_wait_sleep( this_thr, &task_team->tt.tt_unfinished_threads, 0, TRUE
-#if USE_ITT_BUILD
- , itt_sync_obj
-#endif /* USE_ITT_BUILD */
+ USE_ITT_BUILD_ARG(itt_sync_obj)
);
//
@@ -2361,7 +2390,8 @@ __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gtid )
#if USE_ITT_BUILD
KMP_FSYNC_SPIN_INIT( spin, (kmp_uint32*) NULL );
#endif /* USE_ITT_BUILD */
- while (! __kmp_execute_tasks( thread, gtid, spin, 0, TRUE, &flag, NULL ) ) {
+ while (! __kmp_execute_tasks( thread, gtid, spin, 0, TRUE, &flag
+ USE_ITT_BUILD_ARG(NULL), 0 ) ) {
#if USE_ITT_BUILD
// TODO: What about itt_sync_obj??
KMP_FSYNC_SPIN_PREPARE( spin );
diff --git a/openmp/runtime/src/kmp_version.c b/openmp/runtime/src/kmp_version.c
index 0beb824803a..5d0de7716c0 100644
--- a/openmp/runtime/src/kmp_version.c
+++ b/openmp/runtime/src/kmp_version.c
@@ -1,7 +1,7 @@
/*
* kmp_version.c
- * $Revision: 42594 $
- * $Date: 2013-08-16 04:14:33 -0500 (Fri, 16 Aug 2013) $
+ * $Revision: 42806 $
+ * $Date: 2013-11-05 16:16:45 -0600 (Tue, 05 Nov 2013) $
*/
@@ -27,7 +27,7 @@
#define stringer( x ) _stringer( x )
// Detect compiler.
-#ifdef __INTEL_COMPILER
+#if KMP_COMPILER_ICC
#if __INTEL_COMPILER == 1010
#define KMP_COMPILER "Intel C++ Compiler 10.1"
#elif __INTEL_COMPILER == 1100
@@ -49,7 +49,9 @@
#elif __INTEL_COMPILER == 9999
#define KMP_COMPILER "Intel C++ Compiler mainline"
#endif
-#elif defined( __GNUC__ )
+#elif KMP_COMPILER_CLANG
+ #define KMP_COMPILER "Clang " stringer( __clang_major__ ) "." stringer( __clang_minor__ )
+#elif KMP_COMPILER_GCC
#define KMP_COMPILER "GCC " stringer( __GNUC__ ) "." stringer( __GNUC_MINOR__ )
#endif
#ifndef KMP_COMPILER
diff --git a/openmp/runtime/src/makefile.mk b/openmp/runtime/src/makefile.mk
index d7c826685e7..8185e78736b 100644
--- a/openmp/runtime/src/makefile.mk
+++ b/openmp/runtime/src/makefile.mk
@@ -1,6 +1,6 @@
# makefile.mk #
-# $Revision: 42661 $
-# $Date: 2013-09-12 11:37:13 -0500 (Thu, 12 Sep 2013) $
+# $Revision: 42820 $
+# $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $
#
#//===----------------------------------------------------------------------===//
@@ -37,7 +37,7 @@ inc_dir = $(LIBOMP_WORK)src/include/$(OMP_VERSION)/
# --------------------------------------------------------------------------------------------------
# Build compiler
-BUILD_COMPILER := $(call check_variable,BUILD_COMPILER,icc gcc icl icl.exe)
+BUILD_COMPILER := $(call check_variable,BUILD_COMPILER,icc gcc clang icl icl.exe)
# Distribution type: com (commercial) or oss (open-source)
DISTRIBUTION := $(call check_variable,DISTRIBUTION,com oss)
@@ -161,6 +161,18 @@ ifeq "$(c)" "gcc"
endif
endif
+ifeq "$(c)" "clang"
+ c-flags += -Wno-unused-value -Wno-switch
+ cxx-flags += -Wno-unused-value -Wno-switch
+ ifeq "$(arch)" "32"
+ c-flags += -m32 -msse
+ cxx-flags += -m32 -msse
+ fort-flags += -m32 -msse
+ ld-flags += -m32 -msse
+ as-flags += -m32 -msse
+ endif
+endif
+
ifeq "$(LINK_TYPE)" "dyna"
# debug-info
ifeq "$(os)" "win"
@@ -186,7 +198,7 @@ ifeq "$(os)" "win"
endif
# Enable saving compiler options and version in object files and libraries.
-ifneq "$(c)" "gcc"
+ifeq "$(filter gcc clang,$(c))" ""
ifeq "$(os)" "win"
# Newer MS linker issues warnings if -Qsox is used:
# "warning LNK4224: /COMMENT is no longer supported; ignored"
@@ -231,24 +243,17 @@ endif
# Disable use of EBP as general purpose register.
ifeq "$(os)" "win"
ifeq "$(arch)" "32"
- # ??? In original makefile, this option was specified only in debug builds.
- # Compare with Linux* OS/OS X* -fno-omit-frame-pointer, which defined always.
c-flags += -Oy-
cxx-flags += -Oy-
endif
-else
- ifneq "$(arch)" "64"
- c-flags += -fno-omit-frame-pointer
- cxx-flags += -fno-omit-frame-pointer
- endif
endif
ifeq "$(os)" "lin"
c-flags += -Wsign-compare
cxx-flags += -Wsign-compare
ld-flags += -Wsign-compare
- ifneq "$(c)" "gcc"
- c-flags += -Werror
+ ifeq "$(filter gcc clang,$(c))" ""
+ c-flags += -Werror
cxx-flags += -Werror
ld-flags += -Werror
endif
@@ -306,7 +311,7 @@ ifeq "$(CPLUSPLUS)" "on"
ifeq "$(os)" "win"
c-flags += -TP
else
- ifeq "$(c)" "gcc"
+ ifneq "$(filter gcc clang,$(c))" ""
c-flags += -x c++ -std=c++0x
else
c-flags += -Kc++
@@ -352,12 +357,18 @@ ifeq "$(os)" "lin"
ld-flags-dll += -static-libgcc
ld-flags-extra += -Wl,-ldl
endif
+ ifeq "$(c)" "clang"
+ ld-flags-extra += -Wl,-ldl
+ endif
ifeq "$(arch)" "32"
- ifneq "$(c)" "gcc"
+ ifeq "$(filter gcc clang,$(c))" ""
# to workaround CQ215229 link libirc_pic manually
ld-flags-extra += -lirc_pic
endif
endif
+ ifeq "$(filter 32 32e 64,$(arch))" ""
+ ld-flags-extra += $(shell pkg-config --libs libffi)
+ endif
else
ifeq "$(arch)" "32e"
# ???
@@ -452,13 +463,13 @@ cpp-flags += -D KMP_VERSION_MAJOR=$(VERSION)
cpp-flags += -D CACHE_LINE=64
cpp-flags += -D KMP_ADJUST_BLOCKTIME=1
cpp-flags += -D BUILD_PARALLEL_ORDERED
+cpp-flags += -D KMP_ASM_INTRINS
ifneq "$(os)" "lrb"
cpp-flags += -D USE_LOAD_BALANCE
endif
ifneq "$(os)" "win"
cpp-flags += -D USE_CBLKDATA
# ??? Windows* OS: USE_CBLKDATA defined in kmp.h.
- cpp-flags += -D KMP_ASM_INTRINS
endif
ifeq "$(os)" "win"
cpp-flags += -D KMP_WIN_CDECL
@@ -477,22 +488,42 @@ else # 5
endif
endif
+ifneq "$(filter 32 32e,$(arch))" ""
cpp-flags += -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0
+endif
-# define compatibility with OMP 3.0
+# define compatibility with different OpenMP versions
+have_omp_50=0
+have_omp_41=0
+have_omp_40=0
+have_omp_30=0
+ifeq "$(OMP_VERSION)" "50"
+ have_omp_50=1
+ have_omp_41=1
+ have_omp_40=1
+ have_omp_30=1
+endif
+ifeq "$(OMP_VERSION)" "41"
+ have_omp_50=0
+ have_omp_41=1
+ have_omp_40=1
+ have_omp_30=1
+endif
ifeq "$(OMP_VERSION)" "40"
- cpp-flags += -D OMP_40_ENABLED=1
- cpp-flags += -D OMP_30_ENABLED=1
-else
- ifeq "$(OMP_VERSION)" "30"
- cpp-flags += -D OMP_40_ENABLED=0
- cpp-flags += -D OMP_30_ENABLED=1
- else
- cpp-flags += -D OMP_40_ENABLED=0
- cpp-flags += -D OMP_30_ENABLED=0
- # TODO: Check OMP_30_ENABLED == 0 is processed correctly.
- endif
+ have_omp_50=0
+ have_omp_41=0
+ have_omp_40=1
+ have_omp_30=1
+endif
+ifeq "$(OMP_VERSION)" "30"
+ have_omp_50=0
+ have_omp_41=0
+ have_omp_40=0
+ have_omp_30=1
endif
+cpp-flags += -D OMP_50_ENABLED=$(have_omp_50) -D OMP_41_ENABLED=$(have_omp_41)
+cpp-flags += -D OMP_40_ENABLED=$(have_omp_40) -D OMP_30_ENABLED=$(have_omp_30)
+
# Using ittnotify is enabled by default.
USE_ITT_NOTIFY = 1
@@ -541,8 +572,13 @@ endif
# only one, target architecture). So we cannot autodetect target architecture
# within the file, and have to pass target architecture from command line.
ifneq "$(os)" "win"
- z_Linux_asm$(obj) : \
- cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
+ ifeq "$(arch)" "arm"
+ z_Linux_asm$(obj) : \
+ cpp-flags += -D KMP_ARCH_ARM
+ else
+ z_Linux_asm$(obj) : \
+ cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
+ endif
endif
# Defining KMP_BUILD_DATE for all files leads to warning "incompatible redefinition", because the
@@ -606,7 +642,6 @@ ld-flags += $(LDFLAGS)
lib_c_items := \
kmp_ftn_cdecl \
kmp_ftn_extra \
- kmp_ftn_stdcall \
kmp_version \
$(empty)
lib_cpp_items :=
@@ -653,6 +688,7 @@ else # norm or prof
ifeq "$(OMP_VERSION)" "40"
lib_cpp_items += kmp_taskdeps
+ lib_cpp_items += kmp_cancel
endif
# OS-specific files.
@@ -1214,7 +1250,9 @@ ifneq "$(os)" "lrb"
tt-c-flags += -pthread
endif
tt-c-flags += -o $(tt-exe-file)
- tt-c-flags += $(if $(filter 64,$(arch)),,$(if $(filter 32,$(arch)),-m32,-m64))
+ ifneq "$(filter 32 32e 64,$(arch))" ""
+ tt-c-flags += $(if $(filter 64,$(arch)),,$(if $(filter 32,$(arch)),-m32,-m64))
+ endif
tt-libs += $(lib_file)
ifeq "$(os)-$(COVERAGE)-$(LINK_TYPE)" "lin-on-stat"
# Static coverage build on Linux* OS fails due to unresolved symbols dlopen, dlsym, dlclose.
@@ -1343,8 +1381,16 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
ifeq "$(arch)" "64"
td_exp += libc.so.6.1
endif
+ ifeq "$(arch)" "arm"
+ td_exp += libc.so.6
+ td_exp += ld-linux-armhf.so.3
+ endif
td_exp += libdl.so.2
td_exp += libgcc_s.so.1
+ ifeq "$(filter 32 32e 64,$(arch))" ""
+ td_exp += libffi.so.6
+ td_exp += libffi.so.5
+ endif
ifneq "$(LIB_TYPE)" "stub"
td_exp += libpthread.so.0
endif
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
index 9cc398c0b0e..9df6e2f3980 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
@@ -109,12 +109,18 @@ The same ID may not be reused for different instances, unless a previous
# define ITT_PLATFORM_POSIX 2
#endif /* ITT_PLATFORM_POSIX */
+#ifndef ITT_PLATFORM_MAC
+# define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
#ifndef ITT_PLATFORM
# if ITT_OS==ITT_OS_WIN
# define ITT_PLATFORM ITT_PLATFORM_WIN
+# elif ITT_OS==ITT_OS_MAC
+# define ITT_PLATFORM ITT_PLATFORM_MAC
# else
# define ITT_PLATFORM ITT_PLATFORM_POSIX
-# endif /* _WIN32 */
+# endif
#endif /* ITT_PLATFORM */
#if defined(_UNICODE) && !defined(UNICODE)
@@ -135,11 +141,11 @@ The same ID may not be reused for different instances, unless a previous
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define CDECL /* not actual on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define CDECL /* actual only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* CDECL */
@@ -147,11 +153,11 @@ The same ID may not be reused for different instances, unless a previous
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define STDCALL /* not supported on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define STDCALL __attribute__ ((stdcall))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define STDCALL /* supported only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* STDCALL */
@@ -164,8 +170,8 @@ The same ID may not be reused for different instances, unless a previous
#if ITT_PLATFORM==ITT_PLATFORM_WIN
/* use __forceinline (VC++ specific) */
-#define INLINE __forceinline
-#define INLINE_ATTRIBUTE /* nothing */
+#define ITT_INLINE __forceinline
+#define ITT_INLINE_ATTRIBUTE /* nothing */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/*
* Generally, functions are not inlined unless optimization is specified.
@@ -173,11 +179,11 @@ The same ID may not be reused for different instances, unless a previous
* if no optimization level was specified.
*/
#ifdef __STRICT_ANSI__
-#define INLINE static
+#define ITT_INLINE static
#else /* __STRICT_ANSI__ */
-#define INLINE static inline
+#define ITT_INLINE static inline
#endif /* __STRICT_ANSI__ */
-#define INLINE_ATTRIBUTE __attribute__ ((always_inline))
+#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/** @endcond */
@@ -398,6 +404,128 @@ ITT_STUBV(ITTAPI, void, thread_ignore, (void))
/** @} threads group */
/**
+ * @defgroup suppress Error suppression
+ * @ingroup public
+ * General behavior: application continues to run, but errors are suppressed
+ *
+ * @{
+ */
+
+/*****************************************************************//**
+ * @name group of functions used for error suppression in correctness tools
+ *********************************************************************/
+/** @{ */
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask
+ */
+#define __itt_suppress_all_errors 0x7fffffff
+
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask (suppresses errors from threading analysis)
+ */
+#define __itt_suppress_threading_errors 0x000000ff
+
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask (suppresses errors from memory analysis)
+ */
+#define __itt_suppress_memory_errors 0x0000ff00
+
+/**
+ * @brief Start suppressing errors identified in mask on this thread
+ */
+void ITTAPI __itt_suppress_push(unsigned int mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask))
+#define __itt_suppress_push ITTNOTIFY_VOID(suppress_push)
+#define __itt_suppress_push_ptr ITTNOTIFY_NAME(suppress_push)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_push(mask)
+#define __itt_suppress_push_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_push_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Undo the effects of the matching call to __itt_suppress_push
+ */
+void ITTAPI __itt_suppress_pop(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_pop, (void))
+#define __itt_suppress_pop ITTNOTIFY_VOID(suppress_pop)
+#define __itt_suppress_pop_ptr ITTNOTIFY_NAME(suppress_pop)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_pop()
+#define __itt_suppress_pop_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_pop_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @enum __itt_model_disable
+ * @brief Enumerator for the disable methods
+ */
+typedef enum __itt_suppress_mode {
+ __itt_unsuppress_range,
+ __itt_suppress_range
+} __itt_suppress_mode_t;
+
+/**
+ * @brief Mark a range of memory for error suppression or unsuppression for error types included in mask
+ */
+void ITTAPI __itt_suppress_mark_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))
+#define __itt_suppress_mark_range ITTNOTIFY_VOID(suppress_mark_range)
+#define __itt_suppress_mark_range_ptr ITTNOTIFY_NAME(suppress_mark_range)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_mark_range(mask)
+#define __itt_suppress_mark_range_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_mark_range_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Undo the effect of a matching call to __itt_suppress_mark_range. If not matching
+ * call is found, nothing is changed.
+ */
+void ITTAPI __itt_suppress_clear_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_clear_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))
+#define __itt_suppress_clear_range ITTNOTIFY_VOID(suppress_clear_range)
+#define __itt_suppress_clear_range_ptr ITTNOTIFY_NAME(suppress_clear_range)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_clear_range(mask)
+#define __itt_suppress_clear_range_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_clear_range_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+/** @} suppress group */
+
+/**
* @defgroup sync Synchronization
* @ingroup public
* Indicate user-written synchronization code
@@ -820,8 +948,10 @@ void ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_inst
#if ITT_PLATFORM==ITT_PLATFORM_WIN
void ITTAPI __itt_model_site_beginW(const wchar_t *name);
#endif
+void ITTAPI __itt_model_site_beginA(const char *name);
void ITTAPI __itt_model_site_beginAL(const char *name, size_t siteNameLen);
void ITTAPI __itt_model_site_end (__itt_model_site *site, __itt_model_site_instance *instance);
+void ITTAPI __itt_model_site_end_2(void);
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
@@ -830,18 +960,24 @@ ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_
#if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name))
#endif
+ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name))
ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t siteNameLen))
ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance))
+ITT_STUBV(ITTAPI, void, model_site_end_2, (void))
#define __itt_model_site_begin ITTNOTIFY_VOID(model_site_begin)
#define __itt_model_site_begin_ptr ITTNOTIFY_NAME(model_site_begin)
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#define __itt_model_site_beginW ITTNOTIFY_VOID(model_site_beginW)
#define __itt_model_site_beginW_ptr ITTNOTIFY_NAME(model_site_beginW)
#endif
+#define __itt_model_site_beginA ITTNOTIFY_VOID(model_site_beginA)
+#define __itt_model_site_beginA_ptr ITTNOTIFY_NAME(model_site_beginA)
#define __itt_model_site_beginAL ITTNOTIFY_VOID(model_site_beginAL)
#define __itt_model_site_beginAL_ptr ITTNOTIFY_NAME(model_site_beginAL)
#define __itt_model_site_end ITTNOTIFY_VOID(model_site_end)
#define __itt_model_site_end_ptr ITTNOTIFY_NAME(model_site_end)
+#define __itt_model_site_end_2 ITTNOTIFY_VOID(model_site_end_2)
+#define __itt_model_site_end_2_ptr ITTNOTIFY_NAME(model_site_end_2)
#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_model_site_begin(site, instance, name)
#define __itt_model_site_begin_ptr 0
@@ -849,18 +985,24 @@ ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_
#define __itt_model_site_beginW(name)
#define __itt_model_site_beginW_ptr 0
#endif
+#define __itt_model_site_beginA(name)
+#define __itt_model_site_beginA_ptr 0
#define __itt_model_site_beginAL(name, siteNameLen)
#define __itt_model_site_beginAL_ptr 0
#define __itt_model_site_end(site, instance)
#define __itt_model_site_end_ptr 0
+#define __itt_model_site_end_2()
+#define __itt_model_site_end_2_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
#else /* INTEL_NO_MACRO_BODY */
#define __itt_model_site_begin_ptr 0
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#define __itt_model_site_beginW_ptr 0
#endif
+#define __itt_model_site_beginA_ptr 0
#define __itt_model_site_beginAL_ptr 0
#define __itt_model_site_end_ptr 0
+#define __itt_model_site_end_2_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
@@ -878,9 +1020,14 @@ ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_
void ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name);
#if ITT_PLATFORM==ITT_PLATFORM_WIN
void ITTAPI __itt_model_task_beginW(const wchar_t *name);
+void ITTAPI __itt_model_iteration_taskW(const wchar_t *name);
#endif
+void ITTAPI __itt_model_task_beginA(const char *name);
void ITTAPI __itt_model_task_beginAL(const char *name, size_t taskNameLen);
+void ITTAPI __itt_model_iteration_taskA(const char *name);
+void ITTAPI __itt_model_iteration_taskAL(const char *name, size_t taskNameLen);
void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_instance *instance);
+void ITTAPI __itt_model_task_end_2(void);
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
@@ -888,19 +1035,34 @@ void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_inst
ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name))
#if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name))
+ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name))
#endif
+ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name))
ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t taskNameLen))
+ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name))
+ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t taskNameLen))
ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance))
+ITT_STUBV(ITTAPI, void, model_task_end_2, (void))
#define __itt_model_task_begin ITTNOTIFY_VOID(model_task_begin)
#define __itt_model_task_begin_ptr ITTNOTIFY_NAME(model_task_begin)
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#define __itt_model_task_beginW ITTNOTIFY_VOID(model_task_beginW)
#define __itt_model_task_beginW_ptr ITTNOTIFY_NAME(model_task_beginW)
+#define __itt_model_iteration_taskW ITTNOTIFY_VOID(model_iteration_taskW)
+#define __itt_model_iteration_taskW_ptr ITTNOTIFY_NAME(model_iteration_taskW)
#endif
+#define __itt_model_task_beginA ITTNOTIFY_VOID(model_task_beginA)
+#define __itt_model_task_beginA_ptr ITTNOTIFY_NAME(model_task_beginA)
#define __itt_model_task_beginAL ITTNOTIFY_VOID(model_task_beginAL)
#define __itt_model_task_beginAL_ptr ITTNOTIFY_NAME(model_task_beginAL)
+#define __itt_model_iteration_taskA ITTNOTIFY_VOID(model_iteration_taskA)
+#define __itt_model_iteration_taskA_ptr ITTNOTIFY_NAME(model_iteration_taskA)
+#define __itt_model_iteration_taskAL ITTNOTIFY_VOID(model_iteration_taskAL)
+#define __itt_model_iteration_taskAL_ptr ITTNOTIFY_NAME(model_iteration_taskAL)
#define __itt_model_task_end ITTNOTIFY_VOID(model_task_end)
#define __itt_model_task_end_ptr ITTNOTIFY_NAME(model_task_end)
+#define __itt_model_task_end_2 ITTNOTIFY_VOID(model_task_end_2)
+#define __itt_model_task_end_2_ptr ITTNOTIFY_NAME(model_task_end_2)
#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_model_task_begin(task, instance, name)
#define __itt_model_task_begin_ptr 0
@@ -908,18 +1070,30 @@ ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_
#define __itt_model_task_beginW(name)
#define __itt_model_task_beginW_ptr 0
#endif
+#define __itt_model_task_beginA(name)
+#define __itt_model_task_beginA_ptr 0
#define __itt_model_task_beginAL(name, siteNameLen)
#define __itt_model_task_beginAL_ptr 0
+#define __itt_model_iteration_taskA(name)
+#define __itt_model_iteration_taskA_ptr 0
+#define __itt_model_iteration_taskAL(name, siteNameLen)
+#define __itt_model_iteration_taskAL_ptr 0
#define __itt_model_task_end(task, instance)
#define __itt_model_task_end_ptr 0
+#define __itt_model_task_end_2()
+#define __itt_model_task_end_2_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
#else /* INTEL_NO_MACRO_BODY */
#define __itt_model_task_begin_ptr 0
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#define __itt_model_task_beginW_ptr 0
#endif
+#define __itt_model_task_beginA_ptr 0
#define __itt_model_task_beginAL_ptr 0
+#define __itt_model_iteration_taskA_ptr 0
+#define __itt_model_iteration_taskAL_ptr 0
#define __itt_model_task_end_ptr 0
+#define __itt_model_task_end_2_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
@@ -936,26 +1110,40 @@ ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_
* but may not have identical semantics.)
*/
void ITTAPI __itt_model_lock_acquire(void *lock);
+void ITTAPI __itt_model_lock_acquire_2(void *lock);
void ITTAPI __itt_model_lock_release(void *lock);
+void ITTAPI __itt_model_lock_release_2(void *lock);
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
#ifndef INTEL_NO_ITTNOTIFY_API
ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock))
+ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock))
ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock))
+ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock))
#define __itt_model_lock_acquire ITTNOTIFY_VOID(model_lock_acquire)
#define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire)
+#define __itt_model_lock_acquire_2 ITTNOTIFY_VOID(model_lock_acquire_2)
+#define __itt_model_lock_acquire_2_ptr ITTNOTIFY_NAME(model_lock_acquire_2)
#define __itt_model_lock_release ITTNOTIFY_VOID(model_lock_release)
#define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release)
+#define __itt_model_lock_release_2 ITTNOTIFY_VOID(model_lock_release_2)
+#define __itt_model_lock_release_2_ptr ITTNOTIFY_NAME(model_lock_release_2)
#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_model_lock_acquire(lock)
#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_acquire_2(lock)
+#define __itt_model_lock_acquire_2_ptr 0
#define __itt_model_lock_release(lock)
#define __itt_model_lock_release_ptr 0
+#define __itt_model_lock_release_2(lock)
+#define __itt_model_lock_release_2_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
#else /* INTEL_NO_MACRO_BODY */
#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_acquire_2_ptr 0
#define __itt_model_lock_release_ptr 0
+#define __itt_model_lock_release_2_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
@@ -1104,25 +1292,32 @@ ITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr))
*/
void ITTAPI __itt_model_disable_push(__itt_model_disable x);
void ITTAPI __itt_model_disable_pop(void);
+void ITTAPI __itt_model_aggregate_task(size_t x);
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
#ifndef INTEL_NO_ITTNOTIFY_API
ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x))
ITT_STUBV(ITTAPI, void, model_disable_pop, (void))
+ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t x))
#define __itt_model_disable_push ITTNOTIFY_VOID(model_disable_push)
#define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push)
#define __itt_model_disable_pop ITTNOTIFY_VOID(model_disable_pop)
#define __itt_model_disable_pop_ptr ITTNOTIFY_NAME(model_disable_pop)
+#define __itt_model_aggregate_task ITTNOTIFY_VOID(model_aggregate_task)
+#define __itt_model_aggregate_task_ptr ITTNOTIFY_NAME(model_aggregate_task)
#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_model_disable_push(x)
#define __itt_model_disable_push_ptr 0
#define __itt_model_disable_pop()
#define __itt_model_disable_pop_ptr 0
+#define __itt_model_aggregate_task(x)
+#define __itt_model_aggregate_task_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
#else /* INTEL_NO_MACRO_BODY */
#define __itt_model_disable_push_ptr 0
#define __itt_model_disable_pop_ptr 0
+#define __itt_model_aggregate_task_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
/** @} model group */
@@ -1348,9 +1543,97 @@ ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void))
#define __itt_heap_internal_access_end_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
-/** @} heap group */
+
+/** @brief record memory growth begin */
+void ITTAPI __itt_heap_record_memory_growth_begin(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void))
+#define __itt_heap_record_memory_growth_begin ITTNOTIFY_VOID(heap_record_memory_growth_begin)
+#define __itt_heap_record_memory_growth_begin_ptr ITTNOTIFY_NAME(heap_record_memory_growth_begin)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record_memory_growth_begin()
+#define __itt_heap_record_memory_growth_begin_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_memory_growth_begin_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief record memory growth end */
+void ITTAPI __itt_heap_record_memory_growth_end(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void))
+#define __itt_heap_record_memory_growth_end ITTNOTIFY_VOID(heap_record_memory_growth_end)
+#define __itt_heap_record_memory_growth_end_ptr ITTNOTIFY_NAME(heap_record_memory_growth_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record_memory_growth_end()
+#define __itt_heap_record_memory_growth_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_memory_growth_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
+/**
+ * @brief Specify the type of heap detection/reporting to modify.
+ */
+/**
+ * @hideinitializer
+ * @brief Report on memory leaks.
+ */
+#define __itt_heap_leaks 0x00000001
+
+/**
+ * @hideinitializer
+ * @brief Report on memory growth.
+ */
+#define __itt_heap_growth 0x00000002
+
+
+/** @brief heap reset detection */
+void ITTAPI __itt_heap_reset_detection(unsigned int reset_mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask))
+#define __itt_heap_reset_detection ITTNOTIFY_VOID(heap_reset_detection)
+#define __itt_heap_reset_detection_ptr ITTNOTIFY_NAME(heap_reset_detection)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reset_detection()
+#define __itt_heap_reset_detection_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reset_detection_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief report */
+void ITTAPI __itt_heap_record(unsigned int record_mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask))
+#define __itt_heap_record ITTNOTIFY_VOID(heap_record)
+#define __itt_heap_record_ptr ITTNOTIFY_NAME(heap_record)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record()
+#define __itt_heap_record_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} heap group */
+/** @endcond */
/* ========================================================================== */
/**
@@ -1475,8 +1758,8 @@ static const __itt_id __itt_null = { 0, 0, 0 };
* @param[in] extra The extra data to unique identify object; low QWORD of the ID value.
*/
-INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) INLINE_ATTRIBUTE;
-INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra)
+ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra)
{
__itt_id id = __itt_null;
id.d1 = (unsigned long long)((uintptr_t)addr);
@@ -1633,6 +1916,40 @@ ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create, (const char *na
/** @endcond */
/** @} handles group */
+/** @cond exclude_from_documentation */
+typedef unsigned long long __itt_timestamp;
+/** @endcond */
+
+static const __itt_timestamp __itt_timestamp_none = (__itt_timestamp)-1LL;
+
+/** @cond exclude_from_gpa_documentation */
+
+/**
+ * @ingroup timestamps
+ * @brief Return timestamp corresponding to current moment.
+ * This returns the timestamp in format that is most relevant for the current
+ * host or platform. Do not rely that it's RDTSC value. It is possible
+ * to compare __itt_timestamp values with "<" operator.
+ */
+__itt_timestamp ITTAPI __itt_get_timestamp(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void))
+#define __itt_get_timestamp ITTNOTIFY_DATA(get_timestamp)
+#define __itt_get_timestamp_ptr ITTNOTIFY_NAME(get_timestamp)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_get_timestamp()
+#define __itt_get_timestamp_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_get_timestamp_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} timestamps */
+/** @endcond */
+
/** @cond exclude_from_gpa_documentation */
/**
@@ -1717,24 +2034,46 @@ void ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id);
*/
void ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id);
+/**
+ * @ingroup frames
+ * @brief Submits a frame instance.
+ * Successive calls to __itt_frame_begin or __itt_frame_submit with the
+ * same ID are ignored until a call to __itt_frame_end or __itt_frame_submit
+ * with the same ID.
+ * Passing special __itt_timestamp_none value as "end" argument means
+ * take the current timestamp as the end timestamp.
+ * @param[in] domain The domain for this frame instance
+ * @param[in] id The instance ID for this frame instance or NULL
+ * @param[in] begin Timestamp of the beggining of the frame
+ * @param[in] end Timestamp of the end of the frame
+ */
+void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id,
+ __itt_timestamp begin, __itt_timestamp end);
+
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
#ifndef INTEL_NO_ITTNOTIFY_API
ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id))
ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id))
+ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end))
#define __itt_frame_begin_v3(d,x) ITTNOTIFY_VOID_D1(frame_begin_v3,d,x)
#define __itt_frame_begin_v3_ptr ITTNOTIFY_NAME(frame_begin_v3)
#define __itt_frame_end_v3(d,x) ITTNOTIFY_VOID_D1(frame_end_v3,d,x)
#define __itt_frame_end_v3_ptr ITTNOTIFY_NAME(frame_end_v3)
+#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e)
+#define __itt_frame_submit_v3_ptr ITTNOTIFY_NAME(frame_submit_v3)
#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_frame_begin_v3(domain,id)
#define __itt_frame_begin_v3_ptr 0
#define __itt_frame_end_v3(domain,id)
#define __itt_frame_end_v3_ptr 0
+#define __itt_frame_submit_v3(domain,id,begin,end)
+#define __itt_frame_submit_v3_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
#else /* INTEL_NO_MACRO_BODY */
#define __itt_frame_begin_v3_ptr 0
#define __itt_frame_end_v3_ptr 0
+#define __itt_frame_submit_v3_ptr 0
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
/** @} frames group */
@@ -2730,8 +3069,125 @@ ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))
#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
/** @} events group */
+
+
+/**
+ * @defgroup arrays Arrays Visualizer
+ * @ingroup public
+ * Visualize arrays
+ * @{
+ */
+
+/**
+ * @enum __itt_av_data_type
+ * @brief Defines types of arrays data (for C/C++ intrinsic types)
+ */
+typedef enum
+{
+ __itt_e_first = 0,
+ __itt_e_char = 0, /* 1-byte integer */
+ __itt_e_uchar, /* 1-byte unsigned integer */
+ __itt_e_int16, /* 2-byte integer */
+ __itt_e_uint16, /* 2-byte unsigned integer */
+ __itt_e_int32, /* 4-byte integer */
+ __itt_e_uint32, /* 4-byte unsigned integer */
+ __itt_e_int64, /* 8-byte integer */
+ __itt_e_uint64, /* 8-byte unsigned integer */
+ __itt_e_float, /* 4-byte floating */
+ __itt_e_double, /* 8-byte floating */
+ __itt_e_last = __itt_e_double
+} __itt_av_data_type;
+
+/**
+ * @brief Save an array data to a file.
+ * Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only).
+ * @param[in] data - pointer to the array data
+ * @param[in] rank - the rank of the array
+ * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions.
+ * The size of dimensions must be equal to the rank
+ * @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types)
+ * @param[in] filePath - the file path; the output format is defined by the file extension
+ * @param[in] columnOrder - defines how the array is stored in the linear memory.
+ * It should be 1 for column-major order (e.g. in FORTRAN) or 0 - for row-major order (e.g. in C).
+ */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_av_saveA(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);
+int ITTAPI __itt_av_saveW(void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder);
+#if defined(UNICODE) || defined(_UNICODE)
+# define __itt_av_save __itt_av_saveW
+# define __itt_av_save_ptr __itt_av_saveW_ptr
+#else /* UNICODE */
+# define __itt_av_save __itt_av_saveA
+# define __itt_av_save_ptr __itt_av_saveA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_av_save(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))
+ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA ITTNOTIFY_DATA(av_saveA)
+#define __itt_av_saveA_ptr ITTNOTIFY_NAME(av_saveA)
+#define __itt_av_saveW ITTNOTIFY_DATA(av_saveW)
+#define __itt_av_saveW_ptr ITTNOTIFY_NAME(av_saveW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save ITTNOTIFY_DATA(av_save)
+#define __itt_av_save_ptr ITTNOTIFY_NAME(av_save)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA(name)
+#define __itt_av_saveA_ptr 0
+#define __itt_av_saveW(name)
+#define __itt_av_saveW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save(name)
+#define __itt_av_save_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA_ptr 0
+#define __itt_av_saveW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
+void ITTAPI __itt_enable_attach(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, enable_attach, (void))
+#define __itt_enable_attach ITTNOTIFY_VOID(enable_attach)
+#define __itt_enable_attach_ptr ITTNOTIFY_NAME(enable_attach)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_enable_attach()
+#define __itt_enable_attach_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_enable_attach_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_gpa_documentation */
+
+/** @} arrays group */
+
+/** @endcond */
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
index bccaa383ef0..40c8614d222 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
@@ -42,12 +42,18 @@
# define ITT_PLATFORM_POSIX 2
#endif /* ITT_PLATFORM_POSIX */
+#ifndef ITT_PLATFORM_MAC
+# define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
#ifndef ITT_PLATFORM
# if ITT_OS==ITT_OS_WIN
# define ITT_PLATFORM ITT_PLATFORM_WIN
+# elif ITT_OS==ITT_OS_MAC
+# define ITT_PLATFORM ITT_PLATFORM_MAC
# else
# define ITT_PLATFORM ITT_PLATFORM_POSIX
-# endif /* _WIN32 */
+# endif
#endif /* ITT_PLATFORM */
#if defined(_UNICODE) && !defined(UNICODE)
@@ -68,11 +74,11 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define CDECL /* not actual on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define CDECL /* actual only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* CDECL */
@@ -80,11 +86,11 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define STDCALL /* not supported on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define STDCALL __attribute__ ((stdcall))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define STDCALL /* supported only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* STDCALL */
@@ -97,8 +103,8 @@
#if ITT_PLATFORM==ITT_PLATFORM_WIN
/* use __forceinline (VC++ specific) */
-#define INLINE __forceinline
-#define INLINE_ATTRIBUTE /* nothing */
+#define ITT_INLINE __forceinline
+#define ITT_INLINE_ATTRIBUTE /* nothing */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/*
* Generally, functions are not inlined unless optimization is specified.
@@ -106,11 +112,11 @@
* if no optimization level was specified.
*/
#ifdef __STRICT_ANSI__
-#define INLINE static
+#define ITT_INLINE static
#else /* __STRICT_ANSI__ */
-#define INLINE static inline
+#define ITT_INLINE static inline
#endif /* __STRICT_ANSI__ */
-#define INLINE_ATTRIBUTE __attribute__ ((always_inline))
+#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/** @endcond */
@@ -122,17 +128,19 @@
# define ITT_ARCH_IA32E 2
#endif /* ITT_ARCH_IA32E */
-#ifndef ITT_ARCH_IA64
-# define ITT_ARCH_IA64 3
-#endif /* ITT_ARCH_IA64 */
+#ifndef ITT_ARCH_ARM
+# define ITT_ARCH_ARM 4
+#endif /* ITT_ARCH_ARM */
#ifndef ITT_ARCH
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
+# if defined _M_IX86 || defined __i386__
+# define ITT_ARCH ITT_ARCH_IA32
+# elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__
# define ITT_ARCH ITT_ARCH_IA32E
-# elif defined _M_IA64 || defined __ia64
+# elif defined _M_IA64 || defined __ia64__
# define ITT_ARCH ITT_ARCH_IA64
-# else
-# define ITT_ARCH ITT_ARCH_IA32
+# elif defined _M_ARM || __arm__
+# define ITT_ARCH ITT_ARCH_ARM
# endif
#endif
@@ -145,7 +153,10 @@
#define ITT_TO_STR_AUX(x) #x
#define ITT_TO_STR(x) ITT_TO_STR_AUX(x)
-#define __ITT_BUILD_ASSERT(expr, suffix) do { static char __itt_build_check_##suffix[(expr) ? 1 : -1]; __itt_build_check_##suffix[0] = 0; } while(0)
+#define __ITT_BUILD_ASSERT(expr, suffix) do { \
+ static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \
+ __itt_build_check_##suffix[0] = 0; \
+} while(0)
#define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix)
#define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__)
@@ -158,7 +169,8 @@
#define API_VERSION_NUM 0.0.0
#endif /* API_VERSION_NUM */
-#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) " (" ITT_TO_STR(API_VERSION_BUILD) ")"
+#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \
+ " (" ITT_TO_STR(API_VERSION_BUILD) ")"
/* OS communication functions */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -176,12 +188,16 @@ typedef CRITICAL_SECTION mutex_t;
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
#endif /* _GNU_SOURCE */
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */
+#endif /*__USE_UNIX98*/
#include <pthread.h>
typedef void* lib_t;
typedef pthread_t TIDT;
typedef pthread_mutex_t mutex_t;
#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
-#define _strong_alias(name, aliasname) extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+#define _strong_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name)));
#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
@@ -200,29 +216,35 @@ typedef pthread_mutex_t mutex_t;
#define __itt_thread_id() GetCurrentThreadId()
#define __itt_thread_yield() SwitchToThread()
#ifndef ITT_SIMPLE_INIT
-INLINE int __itt_interlocked_increment(volatile long* ptr)
+ITT_INLINE long
+__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
{
return InterlockedIncrement(ptr);
}
#endif /* ITT_SIMPLE_INIT */
#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
#define __itt_get_proc(lib, name) dlsym(lib, name)
-#define __itt_mutex_init(mutex) \
- { \
- pthread_mutexattr_t mutex_attr; \
- int error_code = pthread_mutexattr_init(&mutex_attr); \
- if (error_code) \
- __itt_report_error(__itt_error_system, "pthread_mutexattr_init", error_code); \
- error_code = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); \
- if (error_code) \
- __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", error_code); \
- error_code = pthread_mutex_init(mutex, &mutex_attr); \
- if (error_code) \
- __itt_report_error(__itt_error_system, "pthread_mutex_init", error_code); \
- error_code = pthread_mutexattr_destroy(&mutex_attr); \
- if (error_code) \
- __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", error_code); \
- }
+#define __itt_mutex_init(mutex) {\
+ pthread_mutexattr_t mutex_attr; \
+ int error_code = pthread_mutexattr_init(&mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_init", \
+ error_code); \
+ error_code = pthread_mutexattr_settype(&mutex_attr, \
+ PTHREAD_MUTEX_RECURSIVE); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \
+ error_code); \
+ error_code = pthread_mutex_init(mutex, &mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutex_init", \
+ error_code); \
+ error_code = pthread_mutexattr_destroy(&mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \
+ error_code); \
+}
#define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex)
#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
#define __itt_load_lib(name) dlopen(name, RTLD_LAZY)
@@ -238,23 +260,29 @@ INLINE int __itt_interlocked_increment(volatile long* ptr)
#ifdef __INTEL_COMPILER
#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
#else /* __INTEL_COMPILER */
-/* TODO: Add Support for not Intel compilers for IA64 */
+/* TODO: Add Support for not Intel compilers for IA-64 architecture */
#endif /* __INTEL_COMPILER */
-#else /* ITT_ARCH!=ITT_ARCH_IA64 */
-INLINE int __TBB_machine_fetchadd4(volatile void* ptr, long addend)
+#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */
+ITT_INLINE long
+__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)
{
- int result;
- __asm__ __volatile__("lock\nxaddl %0,%1"
- : "=r"(result),"=m"(*(long*)ptr)
- : "0"(addend), "m"(*(long*)ptr)
+ long result;
+ __asm__ __volatile__("lock\nxadd %0,%1"
+ : "=r"(result),"=m"(*(int*)ptr)
+ : "0"(addend), "m"(*(int*)ptr)
: "memory");
return result;
}
+#elif ITT_ARCH==ITT_ARCH_ARM
+#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
#endif /* ITT_ARCH==ITT_ARCH_IA64 */
#ifndef ITT_SIMPLE_INIT
-INLINE int __itt_interlocked_increment(volatile long* ptr)
+ITT_INLINE long
+__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
{
- return __TBB_machine_fetchadd4(ptr, 1) + 1;
+ return __TBB_machine_fetchadd4(ptr, 1) + 1L;
}
#endif /* ITT_SIMPLE_INIT */
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
index 5257d0d0299..4b5f464feb8 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
@@ -29,7 +29,7 @@
#include "disable_warnings.h"
-static const char api_version[] = API_VERSION "\0\n@(#) 201495 2011-12-01 14:14:56Z\n";
+static const char api_version[] = API_VERSION "\0\n@(#) $Revision: 42754 $\n";
#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
@@ -43,6 +43,12 @@ static const char* ittnotify_lib_name = "libittnotify.dylib";
#error Unsupported or unknown OS.
#endif
+#ifdef __ANDROID__
+/* default location of userapi collector on Android */
+#define ANDROID_ITTNOTIFY_DEFAULT_PATH "/data/data/com.intel.vtune/intel/libittnotify.so"
+#endif
+
+
#ifndef LIB_VAR_NAME
#if ITT_ARCH==ITT_ARCH_IA32
#define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
@@ -146,7 +152,7 @@ typedef struct ___itt_group_alias
static __itt_group_alias group_alias[] = {
{ "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_mark) },
- { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_fsync | __itt_group_mark) },
+ { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) },
{ NULL, (__itt_group_none) },
{ api_version, (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */
};
@@ -162,7 +168,7 @@ static __itt_api_info api_list[] = {
/* Define functions with static implementation */
#undef ITT_STUB
#undef ITT_STUBV
-#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},
+#define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},
#define ITT_STUBV ITT_STUB
#define __ITT_INTERNAL_INIT
#include "ittnotify_static.h"
@@ -170,7 +176,7 @@ static __itt_api_info api_list[] = {
/* Define functions without static implementation */
#undef ITT_STUB
#undef ITT_STUBV
-#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},
+#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},
#define ITT_STUBV ITT_STUB
#include "ittnotify_static.h"
{NULL, NULL, NULL, NULL, __itt_group_none}
@@ -225,7 +231,7 @@ static __itt_string_handle null_string_handle = {
static const char dll_path[PATH_MAX] = { 0 };
/* static part descriptor which handles. all notification api attributes. */
-static __itt_global __itt_ittapi_global = {
+__itt_global _N_(_ittapi_global) = {
ITT_MAGIC, /* identification info */
ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD, /* version info */
0, /* api_initialized */
@@ -261,9 +267,9 @@ static void __itt_report_error(__itt_error_code code, ...)
{
va_list args;
va_start(args, code);
- if (__itt_ittapi_global.error_handler != NULL)
+ if (_N_(_ittapi_global).error_handler != NULL)
{
- __itt_error_handler_t* handler = (__itt_error_handler_t*)__itt_ittapi_global.error_handler;
+ __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
handler(code, args);
}
#ifdef ITT_NOTIFY_EXT_REPORT
@@ -281,7 +287,7 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(
{
__itt_domain *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init)))
@@ -289,16 +295,16 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(
}
if (name == NULL)
- return __itt_ittapi_global.domain_list;
+ return _N_(_ittapi_global).domain_list;
- ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global);
- for (h_tail = NULL, h = __itt_ittapi_global.domain_list; h != NULL; h_tail = h, h = h->next)
+ ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+ for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
if (h->nameW != NULL && !wcscmp(h->nameW, name))
break;
if (h == NULL) {
- NEW_DOMAIN_W(&__itt_ittapi_global,h,h_tail,name);
+ NEW_DOMAIN_W(&_N_(_ittapi_global),h,h_tail,name);
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
return h;
}
@@ -309,7 +315,7 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(c
{
__itt_domain *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -322,16 +328,16 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(c
}
if (name == NULL)
- return __itt_ittapi_global.domain_list;
+ return _N_(_ittapi_global).domain_list;
- ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global);
- for (h_tail = NULL, h = __itt_ittapi_global.domain_list; h != NULL; h_tail = h, h = h->next)
+ ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+ for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name))
break;
if (h == NULL) {
- NEW_DOMAIN_A(&__itt_ittapi_global,h,h_tail,name);
+ NEW_DOMAIN_A(&_N_(_ittapi_global),h,h_tail,name);
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
return h;
}
@@ -340,7 +346,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre
{
__itt_string_handle *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init)))
@@ -348,16 +354,16 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre
}
if (name == NULL)
- return __itt_ittapi_global.string_list;
+ return _N_(_ittapi_global).string_list;
- ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global);
- for (h_tail = NULL, h = __itt_ittapi_global.string_list; h != NULL; h_tail = h, h = h->next)
+ ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+ for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
if (h->strW != NULL && !wcscmp(h->strW, name))
break;
if (h == NULL) {
- NEW_STRING_HANDLE_W(&__itt_ittapi_global,h,h_tail,name);
+ NEW_STRING_HANDLE_W(&_N_(_ittapi_global),h,h_tail,name);
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
return h;
}
@@ -368,7 +374,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre
{
__itt_string_handle *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -381,16 +387,16 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre
}
if (name == NULL)
- return __itt_ittapi_global.string_list;
+ return _N_(_ittapi_global).string_list;
- ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global);
- for (h_tail = NULL, h = __itt_ittapi_global.string_list; h != NULL; h_tail = h, h = h->next)
+ ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+ for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
if (h->strA != NULL && !__itt_fstrcmp(h->strA, name))
break;
if (h == NULL) {
- NEW_STRING_HANDLE_A(&__itt_ittapi_global,h,h_tail,name);
+ NEW_STRING_HANDLE_A(&_N_(_ittapi_global),h,h_tail,name);
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
return h;
}
@@ -398,7 +404,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre
static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void)
{
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init)))
@@ -407,12 +413,12 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void)
return;
}
}
- __itt_ittapi_global.state = __itt_collection_paused;
+ _N_(_ittapi_global).state = __itt_collection_paused;
}
static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void)
{
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init)))
@@ -421,7 +427,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void)
return;
}
}
- __itt_ittapi_global.state = __itt_collection_normal;
+ _N_(_ittapi_global).state = __itt_collection_normal;
}
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -430,7 +436,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const w
TIDT tid = __itt_thread_id();
__itt_thread_info *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init)))
@@ -440,18 +446,18 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const w
}
}
- __itt_mutex_lock(&__itt_ittapi_global.mutex);
- for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next)
+ __itt_mutex_lock(&_N_(_ittapi_global).mutex);
+ for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)
if (h->tid == tid)
break;
if (h == NULL) {
- NEW_THREAD_INFO_W(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_normal, name);
+ NEW_THREAD_INFO_W(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name);
}
else
{
h->nameW = name ? _wcsdup(name) : NULL;
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
}
static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen)
@@ -469,7 +475,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const ch
TIDT tid = __itt_thread_id();
__itt_thread_info *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -487,18 +493,18 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const ch
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
}
- __itt_mutex_lock(&__itt_ittapi_global.mutex);
- for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next)
+ __itt_mutex_lock(&_N_(_ittapi_global).mutex);
+ for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)
if (h->tid == tid)
break;
if (h == NULL) {
- NEW_THREAD_INFO_A(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_normal, name);
+ NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name);
}
else
{
h->nameA = name ? __itt_fstrdup(name) : NULL;
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
}
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -522,7 +528,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void)
TIDT tid = __itt_thread_id();
__itt_thread_info *h_tail, *h;
- if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0)
+ if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)
{
__itt_init_ittlib_name(NULL, __itt_group_all);
if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init)))
@@ -532,19 +538,19 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void)
}
}
- __itt_mutex_lock(&__itt_ittapi_global.mutex);
- for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next)
+ __itt_mutex_lock(&_N_(_ittapi_global).mutex);
+ for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)
if (h->tid == tid)
break;
if (h == NULL) {
static const char* name = "unknown";
- NEW_THREAD_INFO_A(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_ignored, name);
+ NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_ignored, name);
}
else
{
h->state = __itt_thread_ignored;
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
}
static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void)
@@ -552,6 +558,17 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void)
ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))();
}
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void)
+{
+#ifdef __ANDROID__
+ /*
+ * if LIB_VAR_NAME env variable were set before then stay previous value
+ * else set default path
+ */
+ setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0);
+#endif
+}
+
/* -------------------------------------------------------------------------- */
static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len)
@@ -666,80 +683,10 @@ static const char* __itt_get_env_var(const char* name)
return NULL;
}
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-
-#include <Winreg.h>
-
-typedef LONG (APIENTRY* RegCloseKeyProcType)(HKEY);
-typedef LONG (APIENTRY* RegOpenKeyExAProcType)(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY);
-typedef LONG (APIENTRY* RegGetValueAProcType)(HKEY, LPCTSTR, LPCTSTR, DWORD, LPDWORD, PVOID, LPDWORD);
-
-/* This function return value of registry key that placed into static buffer.
- * This was done to aviod dynamic memory allocation.
- */
-static const char* __itt_get_lib_name_registry(void)
-{
-#define MAX_REG_VALUE_SIZE 4086
- static char reg_buff[MAX_REG_VALUE_SIZE];
- DWORD size;
- LONG res;
- HKEY hKey;
- RegCloseKeyProcType pRegCloseKey;
- RegOpenKeyExAProcType pRegOpenKeyExA;
- RegGetValueAProcType pRegGetValueA;
- HMODULE h_advapi32 = LoadLibraryA("advapi32.dll");
- DWORD autodetect = 0;
-
- if (h_advapi32 == NULL)
- {
- return NULL;
- }
-
- pRegCloseKey = (RegCloseKeyProcType)GetProcAddress(h_advapi32, "RegCloseKey");
- pRegOpenKeyExA = (RegOpenKeyExAProcType)GetProcAddress(h_advapi32, "RegOpenKeyExA");
- pRegGetValueA = (RegGetValueAProcType)GetProcAddress(h_advapi32, "RegGetValueA");
-
- if (pRegCloseKey == NULL ||
- pRegOpenKeyExA == NULL ||
- pRegGetValueA == NULL)
- {
- FreeLibrary(h_advapi32);
- return NULL;
- }
-
- res = pRegOpenKeyExA(HKEY_CURRENT_USER, (LPCTSTR)"Software\\Intel Corporation\\ITT Environment\\Collector", 0, KEY_READ, &hKey);
- if (res != ERROR_SUCCESS || hKey == 0)
- {
- FreeLibrary(h_advapi32);
- return NULL;
- }
-
- size = sizeof(DWORD);
- res = pRegGetValueA(hKey, (LPCTSTR)"AutoDetect", NULL, RRF_RT_REG_DWORD, NULL, (BYTE*)&autodetect, &size);
- if (res != ERROR_SUCCESS || size == 0 || autodetect == 0)
- {
- pRegCloseKey(hKey);
- FreeLibrary(h_advapi32);
- return NULL;
- }
-
- size = MAX_REG_VALUE_SIZE-1;
- res = pRegGetValueA(hKey, (LPCTSTR)ITT_TO_STR(LIB_VAR_NAME), NULL, REG_SZ, NULL, (BYTE*)&reg_buff, &size);
- pRegCloseKey(hKey);
- FreeLibrary(h_advapi32);
-
- return (res == ERROR_SUCCESS && size > 0) ? reg_buff : NULL;
-}
-
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
static const char* __itt_get_lib_name(void)
{
const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
- if (lib_name == NULL)
- lib_name = __itt_get_lib_name_registry();
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
return lib_name;
}
@@ -761,9 +708,8 @@ static __itt_group_id __itt_get_groups(void)
const char* chunk;
while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL)
{
- __itt_fstrcpyn(gr, chunk, sizeof(gr));
-
- gr[min((unsigned int)len, sizeof(gr) - 1)] = 0;
+ __itt_fstrcpyn(gr, chunk, sizeof(gr) - 1);
+ gr[min(len, (int)(sizeof(gr) - 1))] = 0;
for (i = 0; group_list[i].name != NULL; i++)
{
@@ -810,8 +756,8 @@ static void __itt_reinit_all_pointers(void)
{
register int i;
// Fill all pointers with initial stubs
- for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++)
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].init_func;
+ for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func;
}
*/
@@ -819,8 +765,8 @@ static void __itt_nullify_all_pointers(void)
{
register int i;
/* Nulify all pointers except domain_create and string_handle_create */
- for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++)
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func;
+ for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
}
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -834,30 +780,30 @@ ITT_EXTERN_C void _N_(fini_ittlib)(void)
__itt_api_fini_t* __itt_api_fini_ptr;
static volatile TIDT current_thread = 0;
- if (__itt_ittapi_global.api_initialized)
+ if (_N_(_ittapi_global).api_initialized)
{
- __itt_mutex_lock(&__itt_ittapi_global.mutex);
- if (__itt_ittapi_global.api_initialized)
+ __itt_mutex_lock(&_N_(_ittapi_global).mutex);
+ if (_N_(_ittapi_global).api_initialized)
{
if (current_thread == 0)
{
current_thread = __itt_thread_id();
- __itt_api_fini_ptr = (__itt_api_fini_t*)__itt_get_proc(__itt_ittapi_global.lib, "__itt_api_fini");
+ __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_fini");
if (__itt_api_fini_ptr)
- __itt_api_fini_ptr(&__itt_ittapi_global);
+ __itt_api_fini_ptr(&_N_(_ittapi_global));
__itt_nullify_all_pointers();
/* TODO: !!! not safe !!! don't support unload so far.
- * if (__itt_ittapi_global.lib != NULL)
- * __itt_unload_lib(__itt_ittapi_global.lib);
- * __itt_ittapi_global.lib = NULL;
+ * if (_N_(_ittapi_global).lib != NULL)
+ * __itt_unload_lib(_N_(_ittapi_global).lib);
+ * _N_(_ittapi_global).lib = NULL;
*/
- __itt_ittapi_global.api_initialized = 0;
+ _N_(_ittapi_global).api_initialized = 0;
current_thread = 0;
}
}
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
}
}
@@ -870,51 +816,52 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou
#endif /* ITT_COMPLETE_GROUP */
static volatile TIDT current_thread = 0;
- if (!__itt_ittapi_global.api_initialized)
+ if (!_N_(_ittapi_global).api_initialized)
{
#ifndef ITT_SIMPLE_INIT
- ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global);
+ ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
#endif /* ITT_SIMPLE_INIT */
- if (!__itt_ittapi_global.api_initialized)
+ if (!_N_(_ittapi_global).api_initialized)
{
if (current_thread == 0)
{
current_thread = __itt_thread_id();
- __itt_ittapi_global.thread_list->tid = current_thread;
+ _N_(_ittapi_global).thread_list->tid = current_thread;
if (lib_name == NULL)
lib_name = __itt_get_lib_name();
groups = __itt_get_groups();
if (groups != __itt_group_none || lib_name != NULL)
{
- __itt_ittapi_global.lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name);
- if (__itt_ittapi_global.lib != NULL)
+ _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name);
+
+ if (_N_(_ittapi_global).lib != NULL)
{
__itt_api_init_t* __itt_api_init_ptr;
- int lib_version = __itt_lib_version(__itt_ittapi_global.lib);
+ int lib_version = __itt_lib_version(_N_(_ittapi_global).lib);
switch (lib_version) {
case 0:
groups = __itt_group_legacy;
case 1:
/* Fill all pointers from dynamic library */
- for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++)
+ for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
{
- if (__itt_ittapi_global.api_list_ptr[i].group & groups & init_groups)
+ if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups)
{
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = (void*)__itt_get_proc(__itt_ittapi_global.lib, __itt_ittapi_global.api_list_ptr[i].name);
- if (*__itt_ittapi_global.api_list_ptr[i].func_ptr == NULL)
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = (void*)__itt_get_proc(_N_(_ittapi_global).lib, _N_(_ittapi_global).api_list_ptr[i].name);
+ if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL)
{
/* Restore pointers for function with static implementation */
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func;
- __itt_report_error(__itt_error_no_symbol, lib_name, __itt_ittapi_global.api_list_ptr[i].name);
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
+ __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name);
#ifdef ITT_COMPLETE_GROUP
- zero_group = (__itt_group_id)(zero_group | __itt_ittapi_global.api_list_ptr[i].group);
+ zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group);
#endif /* ITT_COMPLETE_GROUP */
}
}
else
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func;
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
}
if (groups == __itt_group_legacy)
@@ -934,15 +881,15 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou
}
#ifdef ITT_COMPLETE_GROUP
- for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++)
- if (__itt_ittapi_global.api_list_ptr[i].group & zero_group)
- *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func;
+ for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+ if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group)
+ *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
#endif /* ITT_COMPLETE_GROUP */
break;
case 2:
- __itt_api_init_ptr = (__itt_api_init_t*)__itt_get_proc(__itt_ittapi_global.lib, "__itt_api_init");
+ __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_init");
if (__itt_api_init_ptr)
- __itt_api_init_ptr(&__itt_ittapi_global, init_groups);
+ __itt_api_init_ptr(&_N_(_ittapi_global), init_groups);
break;
}
}
@@ -963,7 +910,7 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou
{
__itt_nullify_all_pointers();
}
- __itt_ittapi_global.api_initialized = 1;
+ _N_(_ittapi_global).api_initialized = 1;
current_thread = 0;
/* !!! Just to avoid unused code elimination !!! */
if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0;
@@ -971,25 +918,26 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou
}
#ifndef ITT_SIMPLE_INIT
- __itt_mutex_unlock(&__itt_ittapi_global.mutex);
+ __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
#endif /* ITT_SIMPLE_INIT */
}
/* Evaluating if any function ptr is non empty and it's in init_groups */
- for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++)
- if (*__itt_ittapi_global.api_list_ptr[i].func_ptr != __itt_ittapi_global.api_list_ptr[i].null_func &&
- __itt_ittapi_global.api_list_ptr[i].group & init_groups)
+ for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+ if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func &&
+ _N_(_ittapi_global).api_list_ptr[i].group & init_groups)
return 1;
return 0;
}
ITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler)
{
- __itt_error_handler_t* prev = (__itt_error_handler_t*)__itt_ittapi_global.error_handler;
- __itt_ittapi_global.error_handler = (void*)handler;
+ __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
+ _N_(_ittapi_global).error_handler = (void*)(size_t)handler;
return prev;
}
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#pragma warning(pop)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
index 1e9eb43f6e0..fe1fe3c14f7 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
@@ -60,6 +60,8 @@ ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen), (IT
ITT_STUBV(LIBITTAPI, void, thr_ignore, (void), (ITT_NO_PARAMS), thr_ignore, __itt_group_thread | __itt_group_legacy, "no args")
#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, enable_attach, (void), (ITT_NO_PARAMS), enable_attach, __itt_group_all, "no args")
+
#else /* __ITT_INTERNAL_INIT */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
@@ -78,6 +80,11 @@ ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr), (ITT_FORMAT addr), sync_c
ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_sync, "%p")
ITT_STUBV(ITTAPI, void, sync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync, "%p")
+ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask), (ITT_FORMAT mask), suppress_push, __itt_group_suppress, "%p")
+ITT_STUBV(ITTAPI, void, suppress_pop, (void), (ITT_NO_PARAMS), suppress_pop, __itt_group_suppress, "no args")
+ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_mark_range, __itt_group_suppress, "%d, %p, %p, %d")
+ITT_STUBV(ITTAPI, void, suppress_clear_range,(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_clear_range,__itt_group_suppress, "%d, %p, %p, %d")
+
ITT_STUBV(ITTAPI, void, fsync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_fsync, "%p")
ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_fsync, "%p")
ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_fsync, "%p")
@@ -95,16 +102,26 @@ ITT_STUBV(ITTAPI, void, model_induction_uses, (void* addr, size_t size), (I
ITT_STUBV(ITTAPI, void, model_reduction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses, __itt_group_model, "%p, %d")
ITT_STUBV(ITTAPI, void, model_observe_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses, __itt_group_model, "%p, %d")
ITT_STUBV(ITTAPI, void, model_clear_uses, (void* addr), (ITT_FORMAT addr), model_clear_uses, __itt_group_model, "%p")
-ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p")
-ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args")
#ifndef __ITT_INTERNAL_BODY
#if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name), (ITT_FORMAT name), model_site_beginW, __itt_group_model, "\"%s\"")
ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name), (ITT_FORMAT name), model_task_beginW, __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name), (ITT_FORMAT name), model_iteration_taskW, __itt_group_model, "\"%s\"")
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name), (ITT_FORMAT name), model_site_beginA, __itt_group_model, "\"%s\"")
ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name), (ITT_FORMAT name), model_task_beginA, __itt_group_model, "\"%s\"")
ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name), (ITT_FORMAT name), model_iteration_taskA, __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_site_end_2, (void), (ITT_NO_PARAMS), model_site_end_2, __itt_group_model, "no args")
+ITT_STUBV(ITTAPI, void, model_task_end_2, (void), (ITT_NO_PARAMS), model_task_end_2, __itt_group_model, "no args")
+ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock), (ITT_FORMAT lock), model_lock_acquire_2, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock), (ITT_FORMAT lock), model_lock_release_2, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t count), (ITT_FORMAT count), model_aggregate_task, __itt_group_model, "%d")
+ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args")
#endif /* __ITT_INTERNAL_BODY */
#ifndef __ITT_INTERNAL_BODY
@@ -123,16 +140,23 @@ ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* ad
ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end, __itt_group_heap, "%p, %p, %p, %lu, %d")
ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, "no args")
ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void), (ITT_NO_PARAMS), heap_internal_access_end, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void), (ITT_NO_PARAMS), heap_record_memory_growth_begin, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void), (ITT_NO_PARAMS), heap_record_memory_growth_end, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask), (ITT_FORMAT reset_mask), heap_reset_detection, __itt_group_heap, "%u")
+ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask), (ITT_FORMAT record_mask), heap_record, __itt_group_heap, "%u")
ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_create, __itt_group_structure, "%p, %lu")
ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_destroy, __itt_group_structure, "%p, %lu")
+ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void), (ITT_NO_PARAMS), get_timestamp, __itt_group_structure, "no args")
+
ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), region_begin, __itt_group_structure, "%p, %lu, %lu, %p")
ITT_STUBV(ITTAPI, void, region_end, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), region_end, __itt_group_structure, "%p, %lu")
#ifndef __ITT_INTERNAL_BODY
ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_begin_v3, __itt_group_structure, "%p, %p")
ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_end_v3, __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, "%p, %p, %lu, %lu")
#endif /* __ITT_INTERNAL_BODY */
ITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_group, __itt_group_structure, "%p, %lu, %lu, %p")
@@ -280,4 +304,13 @@ ITT_STUBV(ITTAPI, void, set_track, (__itt_track *track),
ITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, "no args")
#endif /* __ITT_INTERNAL_BODY */
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveA, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d")
+ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveW, __itt_group_arrays, "%p, %d, %p, %d, \"%S\", %d")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_save, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+
#endif /* __ITT_INTERNAL_INIT */
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h
index 27991730fdb..3695a67089b 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h
@@ -29,6 +29,8 @@ typedef enum ___itt_group_id
__itt_group_heap = 1<<11,
__itt_group_splitter_max = 1<<12,
__itt_group_structure = 1<<12,
+ __itt_group_suppress = 1<<13,
+ __itt_group_arrays = 1<<14,
__itt_group_all = -1
} __itt_group_id;
@@ -57,6 +59,8 @@ typedef struct ___itt_group_list
{ __itt_group_stitch, "stitch" }, \
{ __itt_group_heap, "heap" }, \
{ __itt_group_structure, "structure" }, \
+ { __itt_group_suppress, "suppress" }, \
+ { __itt_group_arrays, "arrays" }, \
{ __itt_group_none, NULL } \
}
diff --git a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
index b10676f78d7..99192945010 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
@@ -47,12 +47,18 @@
# define ITT_PLATFORM_POSIX 2
#endif /* ITT_PLATFORM_POSIX */
+#ifndef ITT_PLATFORM_MAC
+# define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
#ifndef ITT_PLATFORM
# if ITT_OS==ITT_OS_WIN
# define ITT_PLATFORM ITT_PLATFORM_WIN
+# elif ITT_OS==ITT_OS_MAC
+# define ITT_PLATFORM ITT_PLATFORM_MAC
# else
# define ITT_PLATFORM ITT_PLATFORM_POSIX
-# endif /* _WIN32 */
+# endif
#endif /* ITT_PLATFORM */
#if defined(_UNICODE) && !defined(UNICODE)
@@ -73,11 +79,11 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define CDECL /* not actual on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define CDECL /* actual only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* CDECL */
@@ -85,11 +91,11 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
-# define STDCALL /* not supported on x86_64 platform */
-# else /* _M_X64 || _M_AMD64 || __x86_64__ */
+# if defined _M_IX86 || defined __i386__
# define STDCALL __attribute__ ((stdcall))
-# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
+# else /* _M_IX86 || __i386__ */
+# define STDCALL /* supported only on x86 platform */
+# endif /* _M_IX86 || __i386__ */
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* STDCALL */
@@ -102,8 +108,8 @@
#if ITT_PLATFORM==ITT_PLATFORM_WIN
/* use __forceinline (VC++ specific) */
-#define INLINE __forceinline
-#define INLINE_ATTRIBUTE /* nothing */
+#define ITT_INLINE __forceinline
+#define ITT_INLINE_ATTRIBUTE /* nothing */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/*
* Generally, functions are not inlined unless optimization is specified.
@@ -111,11 +117,11 @@
* if no optimization level was specified.
*/
#ifdef __STRICT_ANSI__
-#define INLINE static
+#define ITT_INLINE static
#else /* __STRICT_ANSI__ */
-#define INLINE static inline
+#define ITT_INLINE static inline
#endif /* __STRICT_ANSI__ */
-#define INLINE_ATTRIBUTE __attribute__ ((always_inline))
+#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
/** @endcond */
diff --git a/openmp/runtime/src/z_Linux_asm.s b/openmp/runtime/src/z_Linux_asm.s
index 1bfdc0bf8cd..1f1ba1b3884 100644
--- a/openmp/runtime/src/z_Linux_asm.s
+++ b/openmp/runtime/src/z_Linux_asm.s
@@ -1,7 +1,7 @@
// z_Linux_asm.s: - microtasking routines specifically
// written for Intel platforms running Linux* OS
-// $Revision: 42582 $
-// $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $
+// $Revision: 42810 $
+// $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
//
////===----------------------------------------------------------------------===//
@@ -77,7 +77,7 @@ KMP_PREFIX_UNDERSCORE($0):
KMP_PREFIX_UNDERSCORE(\proc):
.endm
# endif // defined __APPLE__ && defined __MACH__
-#endif // __i386 || defined __x86_64
+#endif // KMP_ARCH_X86 || KMP_ARCH_x86_64
// -----------------------------------------------------------------------
@@ -1573,3 +1573,19 @@ L_kmp_1_exit:
// -----------------------------------------------------------------------
#endif /* KMP_ARCH_X86_64 */
+
+#if KMP_ARCH_ARM
+ .data
+ .comm .gomp_critical_user_,32,8
+ .data
+ .align 4
+ .global __kmp_unnamed_critical_addr
+__kmp_unnamed_critical_addr:
+ .4byte .gomp_critical_user_
+ .size __kmp_unnamed_critical_addr,4
+#endif /* KMP_ARCH_ARM */
+
+
+#if defined(__linux__)
+.section .note.GNU-stack,"",@progbits
+#endif
diff --git a/openmp/runtime/src/z_Linux_util.c b/openmp/runtime/src/z_Linux_util.c
index 4675302a693..27e394f8797 100644
--- a/openmp/runtime/src/z_Linux_util.c
+++ b/openmp/runtime/src/z_Linux_util.c
@@ -1,7 +1,7 @@
/*
* z_Linux_util.c -- platform specific routines.
- * $Revision: 42582 $
- * $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $
+ * $Revision: 42847 $
+ * $Date: 2013-11-26 09:10:01 -0600 (Tue, 26 Nov 2013) $
*/
@@ -32,7 +32,7 @@
#if KMP_OS_LINUX
# include <sys/sysinfo.h>
-# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// We should really include <futex.h>, but that causes compatibility problems on different
// Linux* OS distributions that either require that you include (or break when you try to include)
// <pci/types.h>.
@@ -55,6 +55,12 @@
#include <ctype.h>
#include <fcntl.h>
+// For non-x86 architecture
+#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+# include <stdbool.h>
+# include <ffi.h>
+#endif
+
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
@@ -112,7 +118,7 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond )
* stone forever.
*/
-# if KMP_ARCH_X86
+# if KMP_ARCH_X86 || KMP_ARCH_ARM
# ifndef __NR_sched_setaffinity
# define __NR_sched_setaffinity 241
# elif __NR_sched_setaffinity != 241
@@ -434,7 +440,7 @@ __kmp_change_thread_affinity_mask( int gtid, kmp_affin_mask_t *new_mask,
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
int
__kmp_futex_determine_capable()
@@ -451,7 +457,7 @@ __kmp_futex_determine_capable()
return retval;
}
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
@@ -2004,43 +2010,21 @@ __kmp_get_xproc( void ) {
} // __kmp_get_xproc
-/*
- Parse /proc/cpuinfo file for processor frequency, return frequency in Hz, or ~ 0 in case of
- error.
-*/
-static
-kmp_uint64
-__kmp_get_frequency_from_proc(
-) {
+int
+__kmp_read_from_file( char const *path, char const *format, ... )
+{
+ int result;
+ va_list args;
- kmp_uint64 result = ~ 0;
- FILE * file = NULL;
- double freq = HUGE_VAL;
- int rc;
+ va_start(args, format);
+ FILE *f = fopen(path, "rb");
+ if ( f == NULL )
+ return 0;
+ result = vfscanf(f, format, args);
+ fclose(f);
- //
- // FIXME - use KMP_CPUINFO_FILE here if it is set!!!
- //
- file = fopen( "/proc/cpuinfo", "r" );
- if ( file == NULL ) {
- return result;
- }; // if
- for ( ; ; ) {
- rc = fscanf( file, "cpu MHz : %lf\n", & freq ); // Try to scan frequency.
- if ( rc == 1 ) { // Success.
- break;
- }; // if
- fscanf( file, "%*[^\n]\n" ); // Failure -- skip line.
- }; // for
- fclose( file );
- if ( freq == HUGE_VAL || freq <= 0 ) {
- return result;
- }; // if
- result = (kmp_uint64)( freq * 1.0E+6 );
- KA_TRACE( 5, ( "cpu frequency from /proc/cpuinfo: %" KMP_UINT64_SPEC "\n", result ) );
return result;
-} // func __kmp_get_frequency_from_proc
-
+}
void
__kmp_runtime_initialize( void )
@@ -2059,15 +2043,6 @@ __kmp_runtime_initialize( void )
}; // if
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
- if ( __kmp_cpu_frequency == 0 ) {
- // First try nominal frequency.
- __kmp_cpu_frequency = __kmp_cpuinfo.frequency;
- if ( __kmp_cpu_frequency == 0 || __kmp_cpu_frequency == ~ 0 ) {
- // Next Try to get CPU frequency from /proc/cpuinfo.
- __kmp_cpu_frequency = __kmp_get_frequency_from_proc();
- }; // if
- }; // if
-
__kmp_xproc = __kmp_get_xproc();
if ( sysconf( _SC_THREADS ) ) {
@@ -2536,5 +2511,42 @@ __kmp_get_load_balance( int max )
#endif // USE_LOAD_BALANCE
+
+#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+
+int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
+ void *p_argv[] )
+{
+ int argc_full = argc + 2;
+ int i;
+ ffi_cif cif;
+ ffi_type *types[argc_full];
+ void *args[argc_full];
+ void *idp[2];
+
+ /* We're only passing pointers to the target. */
+ for (i = 0; i < argc_full; i++)
+ types[i] = &ffi_type_pointer;
+
+ /* Ugly double-indirection, but that's how it goes... */
+ idp[0] = &gtid;
+ idp[1] = &tid;
+ args[0] = &idp[0];
+ args[1] = &idp[1];
+
+ for (i = 0; i < argc; i++)
+ args[2 + i] = &p_argv[i];
+
+ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, argc_full,
+ &ffi_type_void, types) != FFI_OK)
+ abort();
+
+ ffi_call(&cif, (void (*)(void))pkfn, NULL, args);
+
+ return 1;
+}
+
+#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+
// end of file //
diff --git a/openmp/runtime/src/z_Windows_NT_util.c b/openmp/runtime/src/z_Windows_NT_util.c
index bd22c25be05..ba59110e8b8 100644
--- a/openmp/runtime/src/z_Windows_NT_util.c
+++ b/openmp/runtime/src/z_Windows_NT_util.c
@@ -1,7 +1,7 @@
/*
* z_Windows_NT_util.c -- platform specific routines.
- * $Revision: 42518 $
- * $Date: 2013-07-15 11:12:26 -0500 (Mon, 15 Jul 2013) $
+ * $Revision: 42816 $
+ * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
*/
@@ -391,14 +391,14 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
/* TODO: shouldn't this use release semantics to ensure that __kmp_suspend_initialize_thread
gets called first?
*/
- old_spin = __kmp_test_then_or32( (volatile kmp_int32 *) spinner,
+ old_spin = KMP_TEST_THEN_OR32( (volatile kmp_int32 *) spinner,
KMP_BARRIER_SLEEP_STATE );
KF_TRACE( 5, ( "__kmp_suspend: T#%d set sleep bit for spin(%p)==%d\n",
th_gtid, spinner, *spinner ) );
if ( old_spin == checker ) {
- __kmp_test_then_and32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) );
+ KMP_TEST_THEN_AND32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) );
KF_TRACE( 5, ( "__kmp_suspend: T#%d false alarm, reset sleep bit for spin(%p)\n",
th_gtid, spinner) );
@@ -501,7 +501,7 @@ __kmp_resume( int target_gtid, volatile kmp_uint *spin )
}
TCW_PTR(th->th.th_sleep_loc, NULL);
- old_spin = __kmp_test_then_and32( (kmp_int32 volatile *) spin, ~( KMP_BARRIER_SLEEP_STATE ) );
+ old_spin = KMP_TEST_THEN_AND32( (kmp_int32 volatile *) spin, ~( KMP_BARRIER_SLEEP_STATE ) );
if ( ( old_spin & KMP_BARRIER_SLEEP_STATE ) == 0 ) {
KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p): "
@@ -874,24 +874,6 @@ __kmp_runtime_initialize( void )
}; // if
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
- if ( __kmp_cpu_frequency == 0 ) {
- // __kmp_hardware_timestamp() calls to QueryPerformanceCounter(). If
- // __kmp_hardware_timestamp() rewritten to use RDTSC instruction (or its 64 analog),
- // probably we should try to get frequency from __kmp_cpuinfo.frequency first (see
- // z_Linux_util.c).
- LARGE_INTEGER freq;
- BOOL rc;
- rc = QueryPerformanceFrequency( & freq );
- if ( rc ) {
- KMP_DEBUG_ASSERT( sizeof( __kmp_cpu_frequency ) >= sizeof( freq.QuadPart ) );
- KMP_DEBUG_ASSERT( freq.QuadPart >= 0 );
- __kmp_cpu_frequency = freq.QuadPart;
- KA_TRACE( 5, ( "cpu frequency: %" KMP_UINT64_SPEC "\n", __kmp_cpu_frequency ) );
- } else {
- __kmp_cpu_frequency = ~ 0;
- }; // if
- }; // if
-
/* Set up minimum number of threads to switch to TLS gtid */
#if KMP_OS_WINDOWS && ! defined GUIDEDLL_EXPORTS
// Windows* OS, static library.
diff --git a/openmp/runtime/tools/check-tools.pl b/openmp/runtime/tools/check-tools.pl
index 8140e110aea..1878ca53b17 100755
--- a/openmp/runtime/tools/check-tools.pl
+++ b/openmp/runtime/tools/check-tools.pl
@@ -268,6 +268,9 @@ sub get_gnu_compiler_version($) {
} elsif ( $stdout =~ m{^.*? \(SUSE Linux\) (\d+\.\d+\.\d+)\s+\[.*? (\d+)\]}m ) {
# gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291]
( $ver, $bld ) = ( $1, $2 );
+ } elsif ( $stdout =~ m{^.*? \(SUSE Linux\) (\d+\.\d+\.\d+)\s+\d+\s+\[.*? (\d+)\]}m ) {
+ # gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012]
+ ( $ver, $bld ) = ( $1, $2 );
} elsif ( $stdout =~ m{^.*? \((Debian|Ubuntu).*?\) (\d+\.\d+\.\d+)}m ) {
# gcc (Debian 4.7.2-22) 4.7.2
# Debian support from Sylvestre Ledru
@@ -286,6 +289,35 @@ sub get_gnu_compiler_version($) {
}; # sub get_gnu_compiler_version
+sub get_clang_compiler_version($) {
+ my ( $tool ) = @_;
+ my ( @ret ) = ( $tool );
+ my ( $rc, $stdout, $stderr, $version );
+ $rc = run( [ $tool, "--version" ], $stdout, $stderr );
+ if ( $rc >= 0 ) {
+ my ( $ver, $bld );
+ if ( $target_os eq "mac" ) {
+ # Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
+ $stdout =~ m{^.*? (\d+\.\d+) \(.*-(\d+\.\d+\.\d+)\)}m;
+ ( $ver, $bld ) = ( $1, $2 );
+ } else {
+ if ( 0 ) {
+ } elsif ( $stdout =~ m{^.*? (\d+\.\d+) \((.*)\)}m ) {
+ # clang version 3.3 (tags/RELEASE_33/final)
+ ( $ver, $bld ) = ( $1, $2 );
+ }
+ }; # if
+ if ( defined( $ver ) ) {
+ $version = $ver . ( defined( $bld ) ? " ($bld)" : "" );
+ } else {
+ warning( "Cannot parse Clang compiler version:", $stdout, "(eof)" );
+ }; # if
+ }; # if
+ push( @ret, $version );
+ return @ret;
+}; # sub get_gnu_compiler_version
+
+
sub get_ms_compiler_version() {
my ( $rc, $stdout, $stderr, $version );
my $tool = "cl";
@@ -349,18 +381,30 @@ sub get_ms_linker_version() {
my $make;
my $intel = 1; # Check Intel compilers.
-my $gnu_fortran = 0; # Check GNU Fortran.
+my $fortran = 0; # Check for corresponding Fortran compiler, ifort for intel
+ # gfortran for gnu
+ # gfortran for clang
+my $clang = 0; # Check Clang Compilers.
my $intel_compilers = {
"lin" => { c => "icc", cpp => "icpc", f => "ifort" },
"lrb" => { c => "icc", cpp => "icpc", f => "ifort" },
"mac" => { c => "icc", cpp => "icpc", f => "ifort" },
"win" => { c => "icl", cpp => undef, f => "ifort" },
};
+my $gnu_compilers = {
+ "lin" => { c => "gcc", cpp => "g++", f => "gfortran" },
+ "mac" => { c => "gcc", cpp => "g++", f => "gfortran" },
+};
+my $clang_compilers = {
+ "lin" => { c => "clang", cpp => "clang++" },
+ "mac" => { c => "clang", cpp => "clang++" },
+};
get_options(
Platform::target_options(),
"intel!" => \$intel,
- "gnu-fortran!" => \$gnu_fortran,
+ "fortran" => \$fortran,
+ "clang" => \$clang,
"make" => \$make,
"pedantic" => \$pedantic,
);
@@ -375,21 +419,32 @@ if ( $intel ) {
# If Intel C++ compiler has a name different from C compiler, check it as well.
push( @versions, [ "Intel C++ Compiler", get_intel_compiler_version( $ic->{ cpp } ) ] );
}; # if
- if ( defined( $ic->{ f } ) ) {
- push( @versions, [ "Intel Fortran Compiler", get_intel_compiler_version( $ic->{ f } ) ] );
- }; # if
+ # fortran check must be explicitly specified on command line with --fortran
+ if ( $fortran ) {
+ if ( defined( $ic->{ f } ) ) {
+ push( @versions, [ "Intel Fortran Compiler", get_intel_compiler_version( $ic->{ f } ) ] );
+ }; # if
+ };
}; # if
if ( $target_os eq "lin" or $target_os eq "mac" ) {
- push( @versions, [ "GNU C Compiler", get_gnu_compiler_version( "gcc" ) ] );
- push( @versions, [ "GNU C++ Compiler", get_gnu_compiler_version( "g++" ) ] );
- if ( $gnu_fortran ) {
- push( @versions, [ "GNU Fortran Compiler", get_gnu_compiler_version( "gfortran" ) ] );
- }; # if
-}; # if
+ # check for gnu tools by default because touch-test.c is compiled with them.
+ push( @versions, [ "GNU C Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ c } ) ] );
+ push( @versions, [ "GNU C++ Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ cpp } ) ] );
+ if ( $clang ) {
+ push( @versions, [ "Clang C Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ c } ) ] );
+ push( @versions, [ "Clang C++ Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ cpp } ) ] );
+ };
+ # if intel fortran has been checked then gnu fortran is unnecessary
+ # also, if user specifies clang as build compiler, then gfortran is assumed fortran compiler
+ if ( $fortran and not $intel ) {
+ push( @versions, [ "GNU Fortran Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ f } ) ] );
+ };
+};
if ( $target_os eq "win" ) {
push( @versions, [ "MS C/C++ Compiler", get_ms_compiler_version() ] );
push( @versions, [ "MS Linker", get_ms_linker_version() ] );
}; # if
+
my $count = 0;
foreach my $item ( @versions ) {
my ( $title, $tool, $version ) = @$item;
diff --git a/openmp/runtime/tools/common.inc b/openmp/runtime/tools/common.inc
index 4154b29d89a..8eceb98e9b0 100644
--- a/openmp/runtime/tools/common.inc
+++ b/openmp/runtime/tools/common.inc
@@ -56,10 +56,14 @@ endif
# Setting defaults
mode?=release
-ifeq "$(omp_os)" "windows"
- compiler?=icl
+ifeq "$(filter 32 32e 64,$(arch))" ""
+ compiler?=gcc
else
- compiler?=icc
+ ifeq "$(omp_os)" "windows"
+ compiler?=icl
+ else
+ compiler?=icc
+ endif
endif
ifneq "$(mic)" "no"
diff --git a/openmp/runtime/tools/lib/Platform.pm b/openmp/runtime/tools/lib/Platform.pm
index 584eeb7491f..d723174a29e 100644
--- a/openmp/runtime/tools/lib/Platform.pm
+++ b/openmp/runtime/tools/lib/Platform.pm
@@ -48,6 +48,8 @@ sub canon_arch($) {
$arch = "32";
} elsif ( $arch =~ m{\A\s*(?:48|(?:ia)?32e|Intel\s*64|Intel\(R\)\s*64|x86[_-]64|x64|AMD64)\s*\z}i ) {
$arch = "32e";
+ } elsif ( $arch =~ m{\Aarm(?:v7\D*)?\z} ) {
+ $arch = "arm";
} else {
$arch = undef;
}; # if
@@ -59,6 +61,7 @@ sub canon_arch($) {
my %legal = (
"32" => "IA-32 architecture",
"32e" => "Intel(R) 64",
+ "arm" => "ARM",
);
sub legal_arch($) {
@@ -76,6 +79,7 @@ sub canon_arch($) {
"32" => "ia32",
"32e" => "intel64",
"64" => "ia64",
+ "arm" => "arm",
);
sub arch_opt($) {
@@ -153,6 +157,8 @@ sub target_options() {
$_host_arch = "64";
} elsif ( $hardware_platform eq "x86_64" ) {
$_host_arch = "32e";
+ } elsif ( $hardware_platform eq "arm" ) {
+ $_host_arch = "arm";
} else {
die "Unsupported host hardware platform: \"$hardware_platform\"; stopped";
}; # if
@@ -178,7 +184,7 @@ if ( defined( $ENV{ LIBOMP_ARCH } ) ) {
# Use arch specified in LIBOMP_ARCH.
$_target_arch = canon_arch( $ENV{ LIBOMP_ARCH } );
if ( not defined( $_target_arch ) ) {
- die "Uknown architecture specified in LIBOMP_ARCH environment variable: \"$ENV{ LIBOMP_ARCH }\"";
+ die "Unknown architecture specified in LIBOMP_ARCH environment variable: \"$ENV{ LIBOMP_ARCH }\"";
}; # if
} else {
# Otherwise use host architecture.
@@ -191,7 +197,7 @@ if ( defined( $ENV{ LIBOMP_OS } ) ) {
# Use OS specified in LIBOMP_OS.
$_target_os = canon_os( $ENV{ LIBOMP_OS } );
if ( not defined( $_target_os ) ) {
- die "Uknown OS specified in LIBOMP_OS environment variable: \"$ENV{ LIBOMP_OS }\"";
+ die "Unknown OS specified in LIBOMP_OS environment variable: \"$ENV{ LIBOMP_OS }\"";
}; # if
} else {
# Otherwise use host OS.
diff --git a/openmp/runtime/tools/lib/Uname.pm b/openmp/runtime/tools/lib/Uname.pm
index f978f8b8a83..9556884cfbd 100644
--- a/openmp/runtime/tools/lib/Uname.pm
+++ b/openmp/runtime/tools/lib/Uname.pm
@@ -145,6 +145,8 @@ if ( 0 ) {
$values{ hardware_platform } = "i386";
} elsif ( $values{ machine } =~ m{\Ax86_64\z} ) {
$values{ hardware_platform } = "x86_64";
+ } elsif ( $values{ machine } =~ m{\Aarmv7\D*\z} ) {
+ $values{ hardware_platform } = "arm";
} else {
die "Unsupported machine (\"$values{ machine }\") returned by POSIX::uname(); stopped";
}; # if
@@ -276,7 +278,7 @@ if ( 0 ) {
or runtime_error( "$release: Cannot find the first line:", $bulk, "(eof)" );
my $first_line = $1;
$values{ operating_system_description } = $first_line;
- $first_line =~ m{\A(.*?)\s+release\s+(.*?)\s+\((.*?)(?:\s+Update\s+(.*?))?\)\s*$}
+ $first_line =~ m{\A(.*?)\s+release\s+(.*?)(?:\s+\((.*?)(?:\s+Update\s+(.*?))?\))?\s*$}
or runtime_error( "$release:1: Cannot parse line:", $first_line );
$values{ operating_system_name } = $1;
$values{ operating_system_release } = $2 . ( defined( $4 ) ? ".$4" : "" );
diff --git a/openmp/runtime/tools/src/common-checks.mk b/openmp/runtime/tools/src/common-checks.mk
index 08c246f0954..0959fc63ebc 100644
--- a/openmp/runtime/tools/src/common-checks.mk
+++ b/openmp/runtime/tools/src/common-checks.mk
@@ -19,17 +19,27 @@
# Check tools versions.
#
ifeq "$(clean)" "" # Do not check tools if clean goal specified.
- ifeq "$(c)" "gcc"
- curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --no-intel --gnu-fortran --make))
- ifneq "$(findstring N/A,$(curr_tools))" ""
- curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --make))
- fort = ifort
- else
- fort = gfortran
- endif
+
+ check_tools_flags = --make
+
+ # determine if fortran check is required from goals
+ # MAKECMDGOALS is like argv for gnu make
+ ifneq "$(filter mod all,$(MAKECMDGOALS))" ""
+ check_tools_flags += --fortran
else
- curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --make))
+ ifeq "$(MAKECMDGOALS)" "" # will default to all if no goals specified on command line
+ check_tools_flags += --fortran
+ endif
endif
+ ifneq "$(filter gcc clang,$(c))" "" # if build compiler is gcc or clang
+ check_tools_flags += --no-intel
+ endif
+ ifeq "$(c)" "clang"
+ check_tools_flags += --clang
+ endif
+
+ curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) $(check_tools_flags)))
+
ifeq "$(curr_tools)" ""
$(error check-tools.pl failed)
endif
diff --git a/openmp/runtime/tools/src/common-defs.mk b/openmp/runtime/tools/src/common-defs.mk
index 1c164bcea4a..ebd1922c7a5 100644
--- a/openmp/runtime/tools/src/common-defs.mk
+++ b/openmp/runtime/tools/src/common-defs.mk
@@ -45,7 +45,7 @@ endif
# Description:
# The function return printable name of specified architecture, IA-32 architecture or Intel(R) 64.
#
-legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(error Bad architecture specified: $(1))))))
+legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(error Bad architecture specified: $(1))))))
# Synopsis:
# var_name = $(call check_variable,var,list)
@@ -128,9 +128,9 @@ endif
# --------------------------------------------------------------------------------------------------
os := $(call check_variable,os,lin lrb mac win)
-arch := $(call check_variable,arch,32 32e 64)
+arch := $(call check_variable,arch,32 32e 64 arm)
platform := $(os)_$(arch)
-platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lrb_32e mac_32 mac_32e win_32 win_32e win_64)
+platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64)
# oa-opts means "os and arch options". They are passed to almost all perl scripts.
oa-opts := --os=$(os) --arch=$(arch)
diff --git a/openmp/runtime/tools/src/common-tools.mk b/openmp/runtime/tools/src/common-tools.mk
index 65bc92e87e9..a9c9fbcee65 100644
--- a/openmp/runtime/tools/src/common-tools.mk
+++ b/openmp/runtime/tools/src/common-tools.mk
@@ -33,6 +33,10 @@
# on Windows* OS generates such a dependency: "kmp_runtime.obj: .\kmp_i18n.inc", and make complains
# "No rule to build .\kmp_i18n.inc". Using "./" solves the problem.
cpp-flags += -I ./
+# For non-x86 architecture
+ifeq "$(filter 32 32e 64,$(arch))" ""
+ cpp-flags += $(shell pkg-config --cflags libffi)
+endif
# Add all VPATH directories to path for searching include files.
cpp-flags += $(foreach i,$(VPATH),-I $(i))
@@ -60,6 +64,9 @@ ifneq "$(filter lin lrb mac,$(os))" ""
ifeq "$(c)" "gcc"
cxx = g++
endif
+ ifeq "$(c)" "clang"
+ cxx = clang++
+ endif
# Output file flag.
c-out = -o$(space)
cxx-out = -o$(space)
@@ -70,7 +77,9 @@ ifneq "$(filter lin lrb mac,$(os))" ""
c-flags-m += -M -MG
cxx-flags-m += -M -MG
# Enable C99 language.
- c-flags += -std=c99
+ ifneq "$(CPLUSPLUS)" "on"
+ c-flags += -std=gnu99
+ endif
# Generate position-independent code (a must for shared objects).
ifeq "$(LINK_TYPE)" "dyna"
c-flags += -fPIC
@@ -118,12 +127,24 @@ ifneq "$(filter lin lrb mac,$(os))" ""
ifeq "$(c)" "gcc"
as = gcc
endif
+ ifeq "$(c)" "clang"
+ as = clang
+ endif
as-out = -o$(space)
as-flags += $(cpp-flags)
# Compile only, no link.
as-flags += -c
as-flags += -x assembler-with-cpp
# --- Fortran ---
+ ifeq "$(c)" "icc"
+ fort = ifort
+ endif
+ ifeq "$(c)" "gcc"
+ fort = gfortran
+ endif
+ ifeq "$(c)" "clang"
+ fort = gfortran
+ endif
ifeq "$(fort)" ""
fort = ifort
endif
@@ -148,6 +169,11 @@ ifeq "$(os)" "lin"
cxx-flags += -mia32
endif
endif
+ ifeq "$(c)" "gcc"
+ ifeq "$(arch)" "arm"
+ c-flags += -marm
+ endif
+ endif
# --- Librarian ---
ar = ar
ar-out = $(empty)
@@ -298,7 +324,9 @@ ifeq "$(os)" "win"
c-flags-m += -QM -QMM -QMG
cxx-flags-m += -QM -QMM -QMG
# Enable C99 language.
- c-flags += -Qstd=c99
+ ifneq "$(CPLUSPLUS)" "on"
+ c-flags += -Qstd=gnu99
+ endif
# Enable C++ exception handling.
# ??? Why we disable it on Linux* OS?
cxx-flags += -EHsc
diff --git a/openmp/www/README.txt b/openmp/www/README.txt
index 3880bf036a3..6ecca7f64e8 100644
--- a/openmp/www/README.txt
+++ b/openmp/www/README.txt
@@ -74,13 +74,13 @@ Supported RTL Build Configurations
Supported Architectures: IA-32 architecture, Intel(R) 64, and
Intel(R) Many Integrated Core Architecture
- -----------------------------------------------------------
- | icc/icl | gcc |
---------------|------------------------------|--------------------------|
-| Linux* OS | Yes(1,5) | Yes(2,4) |
-| OS X* | Yes(1,3,4) | No |
-| Windows* OS | Yes(1,4) | No |
--------------------------------------------------------------------------
+ --------------------------------------------
+ | icc/icl | gcc | clang |
+--------------|---------------|--------------------------|
+| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
+| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
+| Windows* OS | Yes(1,4) | No | No |
+----------------------------------------------------------
(1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are
supported (12.1 is recommended).
@@ -89,6 +89,14 @@ Intel(R) Many Integrated Core Architecture
(4) Intel(R) Many Integrated Core Architecture not supported.
(5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0
or later are required.
+(6) clang version 3.3 is supported.
+(7) clang currently does not offer a software-implemented 128 bit extended
+ precision type. Thus, all entry points reliant on this type are removed
+ from the library and cannot be called in the user program. The following
+ functions are not available:
+ __kmpc_atomic_cmplx16_*
+ __kmpc_atomic_float16_*
+ __kmpc_atomic_*_fp
Front-end Compilers that work with this RTL
===========================================
diff --git a/openmp/www/Reference.pdf b/openmp/www/Reference.pdf
index 60ce4008d6d..680f98c0faa 100644
--- a/openmp/www/Reference.pdf
+++ b/openmp/www/Reference.pdf
@@ -778,11 +778,11 @@ endobj
<< /S /GoTo /D [521 0 R /Fit ] >>
endobj
523 0 obj <<
-/Length 252
+/Length 257
/Filter /FlateDecode
>>
stream
-xڅMKA wIGQ(voұt-e ߻SO›!XY]^,-ԯ d95h^cyմ]=C:bCؠ!B>'ĺCp2(zNF1c$K|6#J|(oVb*_6T~BoCeuȠLSdٚ+}:kLMn0? Xd--YBm~^rbgu <l:
+xڅMK1aǙI&=("{SƲw?j]ia&AVSOx"D$zV'%ւ$M_Cu1D48d%=',XvDssus@T=:DHM[fSr^n ~ܘҢA28TlȠ,rǛm^p/ :7A #Oax
endstream
endobj
521 0 obj <<
@@ -800,16 +800,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
529 0 obj <<
-/Length 1187
+/Length 1184
/Filter /FlateDecode
>>
stream
-xڕVY6~ЇRZK]d 4Hh$*:u}gxȶVh'fs|s{{z]]nR/6ve4Mۖ'_WooNQ/<ȣ+է/+AޣAɽgY{Ii]yWYPv{㯣,'w k7j 75B`h׷ ;Cu45&~iQ觔:6Pu++ߚ1%Gf+5AaJ ~R!%;7Y;YtT!^.{<aޡG۸mL1|w !_'l
- F,9&4eSJINJ%zl@
-2S$vZ
-7|IwABcif`;SKt܋<MJ+ɨi{ޅ4m[ɂV`! (G"!A@pߍA)Ԫes@YI'+e7G!dca>nFBT غ cȦא.*dtq09Mqq m68/Eͻ5쮹2nE6 Zgc̢n5|_m޸KfvnVC R66k<"ص/9;
-56vR:}8 ]I@ini4H[ n~ѓeЦRT\n~(Dv9}6;;w?ܟBE:,Ujfq .~}`[[`E PƮ%TXM;wjm+! M|/ -!+s;<fT; itKDK#2Il+{+a4ģh F(XN*^a $i|
-kqD339
+xڕVYo6~_!
+L]ĉI@ZwHFG ,4퓆399(m=ݬlVeaIim^^!M}f}-EVQEzUx5{$L{֚fI Ѝ}E~F!q7W: v?VQq :'v2cW9 #~+E;{lY`[`J5X "2Πwg=k-Um}Zf݉SNU :ɿw>ـfz$Qe9:J㽽7
+|j1uJHhͪaxm$p&V[xf}]=5Iz1|[t
+iNhN惁Jiئ++-S/aγvJn$RL,5k4P!y%Wx6|IuN \cif`;SKOt܋<2ɨi{߅4}#*ۀG"?'YgpYqýE#S(hUg y@YIǷܚ+z
+0uT7J!*Ml݅?mdrvpkH> Z~z8~I8{f6Aռeݷ_z\7p%-ijOĆ ٘[ 77+ezr̥)͚h8v닶qSFik'x?!ӧ!Mȥ&_,ua"g=-]n٧X m*UDgHݮ8#c>wVugǻcH%Fmլ0.XEï6rmksQ s
endstream
endobj
528 0 obj <<
@@ -1058,15 +1057,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
609 0 obj <<
-/Length 1208
+/Length 1206
/Filter /FlateDecode
>>
stream
-x]6+ +&LYb7ðXk0Wav=
-2ƫvommZ$64&zk(*HH
-gx;LL+cicw
-ŰK/RYK+5=76ĸF,
-ϱfc̶1 =8|j>rΕ078LjOY!#s@k1КƏ Xh4qՑVж7
+xOs8: z6lg6Ca& ^O7+@άk^=J@͵ˁ]!(=
+āBlO1s+IeETJׂsQgywۦJjaWsjSΠTA2
+WV"zagܞX$Ȣ443FǶ(0C@t1ӃԃP;D CGq5MVWhF xH4*54.mJG C-xk*'/K"+-E0}meim|ō!+ۮ`7[[<FR$F>&ָXF>QRpgfXlX3SEd OUg&ه*n\B9L@ub !V8K%CY7Q>ņ,06of$2#3M: 3Yϫp>tȎr$wd(Xt~W:z@ЦSvۄZ8[r7qAZ±i|(8fr0k0_K˂8H{xZP\m7^O2f㯱z\7AZKVPbsՖ\:55LE_ZeX|v,>Y=41'LY>ĸ,{핑hYMʼLq<F2Ŭ?k)O5~
+ ^ao~`Rlda|G(~^_z:Ź2!:f
+w{HumEK]Iݯ[U'y7+'</¤_:
endstream
endobj
608 0 obj <<
@@ -1362,15 +1361,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
652 0 obj <<
-/Length 1113
+/Length 1107
/Filter /FlateDecode
>>
stream
-x]sF+.\&M2ʹIsggS 5u} Kk1bŬ=E ~:NsH@j\{o>} ~ /^$)go3l[>0g_X>
--c ;ؓ3瘩&381LF\3""2]`H>#1e4br=ljb-V&]qf^'qrA1%>5C1h̅GMtm¥' 4w&;vIz2]jtҜ O& wyds^xI3x
-#@&X-z,
-鎠iol%ԤvrImSs6'j:Ǒ ⶹ/'GsnjjXBxWi6iM%*0?x]<JO=BƬ<1Q9devmˆs?uY}T+֛x6i ҉Cbvӵ[m"ZeAZ-zfYUg Ӎo۾"k9KMXMk}7s#wIٲ~ZA>Ow&1j Bt[vog`#VQ>:|F݇LJNEQk,3o[ϰIJMպ$Nvvc/ceNλ0'8{|L5 sw O/0MG^f87R1u*20 m&CXhTMzJ %QϛD=J
-MJTr=T*X8\BE9 H;'ޤ&}lőbgٝO.ܬn駭IC; m%U i=HG}UsJ|ާy-m54b|ᾼ.
+x[sF+.!mL39 f*!$rY"O\ÍѢ~߻bt9PP AH@j%~ax .b ۳z " Dg
+āΨ+R(9fZyAzx >8 }1WsE9uOz-U]XBez ra {rf3dg6A"ȟkF:S}#䨁S:HQF#&'XI\mqSF-6+beev(Y+S_S3hCawI]xD D&],]zIs56R\x6,l`6$8
+턴T$V|՜6}ȡϧ}Bo0mYɧp(8&qRI
endstream
endobj
651 0 obj <<
@@ -1666,15 +1663,17 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
674 0 obj <<
-/Length 927
+/Length 925
/Filter /FlateDecode
>>
stream
-xIsH}zz_|TRYflnN¨-S(}^x HThZ~+Mf"JdUiRH[EٷK "0c~׌gWG[`JW/-;D0]73WHH
-NVNt
-uGQJ ^+IpN9gM:L:ݬ\^'͐׹_ R )lhub qhN5VZU9 nƥ&vc< . <Ox Q֗K#! \&[ j`sJ̪ڕO U tY@K5丑Q%ARF6UTX/AzDY&kÖ%S*x$qW-R9%Ng}5قevAy*bN|՗1D+1aS3WM ]IV
-)kֱVЂ:z#9uC>“e5-H~0̲߾(FjJ9݇|vNzpA=aفBX$$T
-~/Ipӎ{5n7.o
+xIs68ؗędus2eN,%:y⚤TGn3S;$=<x+A
+QfbˉS@Kd(Z#8 -gEpwˏ?,»W;%J׳-;Dp43H*ApfhV+\uO;E(o4#WUGD4gBp|:ќ_mu 
+I4WJ=?`C01p$93D~,/"M oUpR1diNJxQWO#>N/Hs59JʪڗO=<U tY@+I 丑15x1NqR}U*mQl3ю=4EΉcrlɌ<cƯ|d<bW*gTB"
+5ӿ"f
+x1;.(oE\C̉o*hE5&,zՐ@H7xz.@}FM!bCDY2T 뤪t`)2$ۻ낢¶aQMOk?8MS^<4c} ݧiٙ裂~tʚw -N>0a΍;bPuwOdUM " <.fw%j-Qet;0cF% '2f\#@dr/a~$V{ # 7=4@F9=(%%TvGoqϠ;Cu. SHn
+rMf ܗI72+δar1{8śzzW}X_h䌰iJn}m^gk
+-(PS|ێ\5n-4._oW
endstream
endobj
673 0 obj <<
@@ -1885,24 +1884,24 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
687 0 obj <<
-/Length 2637
+/Length 2634
/Filter /FlateDecode
>>
stream
-xڭZܸ (ïW 6MhPx#{ΏKEnjMˎ-QEH ~z" Q$[/XE^
-q:b0/NDaoz/?K1.@ZNLѼk)NWM55;l_~4 pD(ozK00&'CT(YP{w`MDKCҋ#V"uuբB]@4~*)k4MVuG#m8԰B~sMVk(Y+z4_l6i"M,띶
-Xs0n(Ѣowu_o4UeepVn~; n
- MnĊ44*/-Xw7r'HQc,*o0.< Dl!,D8#:²YasMpaJH'2H7eGse~Ĉf&wĹY﷏YBogHDTCL-
-kY8tFZ'>!pcP:vyN|0x19( ڋY#]Se{,,C`80!㯖Ɯ7+%Yg"22#Qc_>gFN[C=|B譫XdxݎP D0L玁ޭ
-}wG!thؼsFMf^C:PeFz{:z1ur mtO{{h<^h'wX
-꾲Vu$}rPdr̉dQ9rs){1!nFI!›.:{c^m[qb5hF{7u5  jИ&eZ8R[w<x.K&ᗼI~f!h-%hhTήÊh[mVrrˡ )!ξY`^ͮ, Z܈+6p-fЦLq`k]Aa08k4.F/`zQJvt F!]8a00m{sˠ\Hn rZ '(tuD9g6
-;,:ꗰ)xiݡl'Jlk)a"D4Aq-pA+Ks&^
-ҳ*{x
- Z4I/
- e\BFs/b (y'(Aq} I"ȋ,_YT9R8bBʋKƢiv9aB8,ͤKKI J8Vβ425Х&4J*S
-2^0u!{5tMFo=˹Ql6$1"%CmM~.
- (P?OOt&G/Tr[㈩ οx
-(;yR@ʼn+ SM.
+xڭZmܸ HQdKk+KCI&[Er(c=g{.Y%E/3n6/;DQ" /~ɋ,Rű.$i{ID,{Zt俬{S}PQZGQٛV\ <2/*FZ'BTD˝U^yZܹ7\ KOHUmv ~d)w^i(V彻E0UBOD"$Kb)V*MەMݡB[h8~4%SF~0{Sж[`bi?fT&͆8M$ݴ܌_n ϚlP*b-ȢλivG6
+eh>*y]q60sLU\hb[E,
+l@oꢬoJEey*#)GiI u*
+CpaJi'" #&(5j!?T=Y lw gtpjpȞ[-|ƘD\I L4@2"\bg@ҫi MB+wʱ+
+ҍ!XA\^"P:?u3 ")R=?}aP:jiy$B} -|ԘϹUfoѬ́^>!A^7d,|i=~KO7P,T(掁m
+BgS}_WVҊ_QG.*5h9^xEpY:4l_o9'ռYr;(1Tّ^ ^@2w3ZsmyLJ{AM~rSبj~ĭD}Tݓ+W fNؑk/kTV=Y+c"8X?܌o^]|c^t5@雦[yCfiHLwGjcT=%"^f˒i%G߼9 4Y4G*upAxk'Ų"򆥩&bq̊ͷL7۲fy[n#[!LIoakSCA QQیb0(% P:ӄD\tM}kƐ0n̠ZHX7a9Hu[
+)$3-
+<%H BsPqhw=:J)!exFqb!KʀI$”/H
+8\B X$a]Ґgivh7 1_
+ Z9dt8l!
+o~(
+(<)PM-
+^|cj3[fgp661v@BNeTe9tËwnrb@wV4"6D 7*PÅq=Ğ/~6Ld SW=4Y ).+Ll1nrYanPNFd_(|Ɠ0CNzd˪2Ւ q=Po&=K]϶XjTc=ÖU_]?߶&/:-
+ã;?כi7ZC^!oH[Somi0, C܆}w6ԨXkp3DHtB;ɉ4NE¹fK=TP4K隝`@WX<dbԲ,2*TŦH1 ?aDE5hKzٸ~UzdO#jNW]FIli.EY}OV~G:?ݛg
endstream
endobj
686 0 obj <<
@@ -1938,22 +1937,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
699 0 obj <<
-/Length 2939
+/Length 2937
/Filter /FlateDecode
>>
stream
-xڝZYܶ~_<Rx$őʮ8VʃRqI KrCM*=}r< Fu9:7I}I|/c'k/VM|pu+o۬]+߽瑟޴,70L(J5- p7W٧W~v|/اQ0
-( ]9qE cV͛z}NGCMse7ꚳOe}nznUMi┛K?dUu/'m"~ߝL;NHFH]b{5yYUCäf}Sİ5YEvk}-C%؃zVh^ܺ5+Az46ؼC;ˇn\ֹiUv
-PDP,Ÿ<4j.?Ȗa mM> d/_oznPaŽ30ZIuNё#G^c "p)]UKܢ5]x!NYK/_Y[f@V1.(bO [
-SC;{`Ir=
-%
-7P Nf^j n9Lalv2GƃI
->N1ox  ORX@32
-B1`p%LܝzK
-G/Q0ƒ v}df(dK,rvtr?ĔX2, 9T`f,:[J(" +P4ڻp^a< ).Yf&hFX/Zah
-Scu+Cf4[/*tppeXgĦms=qKW+&
-.N:'c'Δ"W?v~zʍ}&ΡzEĢ;>g
-Z/* D`e!vAifi~?cdž2D`굉KI
+xڝZYs ~ׯ`hy>qV6U"{fXcVT{p5/Qts\`J4|zoŮDʉ<뺰>۞.U+oڬ]z}#^,럭 H0L5-q_/<s-od$N+?]|õ
+r?M;<YA;aC>]D"GLB;oro;D\ϕupkN?1U5)~Ȫ^&["nu;NHNZHl,"k 󲪆I aZaWpNdzuޗ`ay{qF*lcX**.qZ[Vu酶8`$Ü:!Zrp^Z~g+x*a/9@:
+
+{RZvquNс#vcs8L#o?p px˛bEJA0nb\Y'QDf [=
+g]CI*sSGC])zNo>~ie4'OQ
+;A
+a+
+|VAo1)0ziBO2]B6TY}Ӱ;>`MuhdQx}4
+O&MfnWshP2$Co9|!k-
+s*-% w$E89л,Tsi)ƾ"}9J[q9TdӐ+.7 #b`A; PqltP 1!;.4` lƼ3Uff)ln
+|,F!%zSt6
endstream
endobj
698 0 obj <<
@@ -2017,15 +2015,22 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
722 0 obj <<
-/Length 2187
+/Length 2188
/Filter /FlateDecode
>>
stream
-xZ]6`fg2X
-w`QRQd?܄V}MZwS&FJ
-VERDըt)-~./@kHG𷢌6HM!Fæ`F3r1hȀ(JzǏ|taHn4l_#(5)6%dU/ԲVwnfé1_g1=H$>'q-1Weўu_ڠM,.faس& vE.&9;H^<vn
-f]HB,jE9ɚB=KhSRR4ޗm Su.Y+tj f)C|E EO.}(,7~O<A}OmtXb;CgUӕ-uma-9;gkՋ-¯?~MUU l
-LqTk=U0f
+xZ[6~_!`ތRE),LM&.,Ӷvdɕ"J{d'HC?'/l <ǚ,y l!k>Lf?ɫG{^<ɰ=.qp8(Q:K\=>-e?.YQ1!8#\sb\ί~Bl)Pmvx{gh-oX8o̭b`Z~* ka"PGmcaEQ=o_^YD|L]8a~074t#p5u$ݓIFQG*a2YJ򬔋dK閲ek_V:v7yNvQ!iy>Ӌg6s}o
+-udqvET+*$e&j:2&RZdpKIJ-Qlm%qU`yۮ_1mbz'.[I *NH~v*6NTdU#|tQe\BЎg>gȳ#%]b{+9` ܀ IQj
+A8,H {?=o rQ"
+gۢ|44)? QKrޖ|؎U2&|ːI,**jDk$MF.TTiT
+3YVou(2qZ@J+8ڒu񈺀 [
+o^j|qPM KuN]`A1jZ),R6-e>k4^)0?uVS
+X7VwY/AlH d=(ͣ;)筑B͓I o#y0If4sqWhWê(Ԗ
+=w8ߧjłꝁuZ>Z&?(cR[Ŏ+QHblC -}I&O-Z
+F@gJt:f&1Da]Ok IPc\(P?ZSc ͖cJPJcV"3<m`PVkm!a,U/>"5cWӳsll>J(M-0:Cti3E-/84ΐInte`FrXqٚ6}&|us<jW_ooo~VU榒VcX&D5J2y*ϠU=d sMPypeڠC@
+~LL]Tśb;f%@l WQڅ*;Xw: t>Co{v$GGbcAعx8>|$(%Cm?j
+;ZraC}DC\O Ќ4(z`,
+NQg(#Τ!-sgdљSf@Lx &pnMi(7skcƇOiLo6\ރ_vL1ԗM޼'/DP9jC}0xn^">Qo+4gaAk^v>il=#7C%ZLY?
endstream
endobj
721 0 obj <<
@@ -2147,15 +2152,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
741 0 obj <<
-/Length 535
+/Length 534
/Filter /FlateDecode
>>
stream
-xڝMs0{t,J t2N'8NiῳL \"g%o\M|hp#!e4.bv0Ƿjez
-J9ڑMk1:No'm:`..w
- e{%j%iKZ<2iQҭZtnLt5;]"lO?-}ۻxGa'`h?X~ա٨qkށ `:鷁/$4&-fx- g给1ӬjNmr7bRMW-j P7NmQUk"pqQ*\vXUT,?7.M잿
-c8zhkS#iK}/mnn=/E]MpFl>RbUX2,_6ai㋏
- (鷬UhmT[bs+iQN⻠Lkvv=,j|qxſ
+xڝKo@st
+Q[SENi-'8B|w^)jKvgv?508 L&K0 `$ːE6]oWn7C[TʒLjgp2 | o)kъAFgP&7kDKگs)`- PTd魋k#mιFH0#K4p*9yDT~U5\980(3
+J~$n ɳH3Ӽq6+]_2ڸA֮*I*jt7lLX(z -f1zjJ$..8X5Wy5TܷJk?a_\l{ʯ}>OO ѿQ7`c&+\V.3)zZ~s~å_v\Y2V nJo-*
+a
+ (HLm[Qb.E~˔rryϼhǛdu'I1
endstream
endobj
740 0 obj <<
@@ -2173,11 +2178,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
745 0 obj <<
-/Length 322
+/Length 319
/Filter /FlateDecode
>>
stream
-xڕQn0+poc܀C
+xڕQn1 +|H=XQPQns,!ЎZdˡ=N60"%z yc$kȜ1``C 5EOoMcMZzbV#9IRZ&#)lQ_&1eUy|}7E=Gz/ir/C!W%y!<"O1',d2CXſ1 [܃Ғid<lF0v4LXҒ JE$3uPϏaw;T9mNa.se\u[ POԚotI 5[G9$B"}?m@G>
endstream
endobj
744 0 obj <<
@@ -2295,13 +2300,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
764 0 obj <<
-/Length 301
+/Length 299
/Filter /FlateDecode
>>
stream
-xڕQn0+6Ǫ-**܀4"A׉Tvgv0%w}t
-,uZ v`Z8N5,ebu64Vg}s^§7}Tr!#_YK-Q!w3@*YT*).`AGS 1hمACRQ`S_f<fXS X921tDK9&u3Ŋ+/G__qG.8rF3v
-Q ߾傏Saχm 2L.l N&˾'8ష"y
+xڕQn0+6NJ 7
endstream
endobj
763 0 obj <<
@@ -2362,11 +2365,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
774 0 obj <<
-/Length 302
+/Length 300
/Filter /FlateDecode
>>
stream
-xڕQn0+ǾPQ> 8P<h*}8Azixfa SrD Vk0 A"bHJ";+nlX.f*:u<r/< ]䬥K(b YT*)<.`NGS/1hم^CRQ\SW&k]U1x:l"DpGԺbɕǗ_qyGwa;GHjeKD1~V >rޏU+]~ڭ0:κ1:۞~_~
+xڕQn0+6ǖZp
+gg J+x#/T&HG1Ք-\#u!TT>7]|X'>DDb|n64\x|zs7G9bQ.XQ ߾UylNG]?fYw6<>e|+ 8dy`
endstream
endobj
773 0 obj <<
@@ -2428,24 +2432,26 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
785 0 obj <<
-/Length 2709
+/Length 2710
/Filter /FlateDecode
>>
stream
-x[mOWlʚ;媤UU*e_X 8KͯO bArayg{{vs緡
-d 0RRzAH$zq=c:l ]<ⴌ$Kuo~"{R{է_g?xPy!OWٕd5dU ɀB8..prno0@YT2̐"3JWw]rDZx D F/S[`ؑ&<)Gl=Zen.QH&75 LP{
-Y]TYF5 v*^T!u54/-cAP_ҥkJ{"
-QH[MҚme
-l(QgcJ
-8Uܗ q\VA8T/4ŁG(Y,[
-fׇ%XlѼ͗])v_ھ$GG/8(eVr?ʣ]\'~^O<
-DRMs$\P& `ϵξLi:鳩%QNmT! ?wShg ?6ǰLUiw+W=I@!E_/;}=M?OrjsrHi#?Ɨ&Ay3uOC1a,7=qjcH@!EۃSr;Vx i5Ƀ6mFWh r [/W|BnVDUmGQ~ohb.lBȜzt{XQ՘iWD,#b( 6O9/a&^N XFOOvON-5E7no yO-'C)2m&nTMB{`W
-K8ej]:6}E9uSIv= ߡR" ΅j;z
-D"I26,|
-:/`<wwS43ެS@lc'pe
-osF,κ\DU Lso*O'/&(z%8r"p UZ{,RGS8@aZ]D?Kzxn,gz.8{J1Di0pJKײWszÆN&4B}i&=s5lձcVsU{'*hZoNMO
-wT7$n<sH?rM_ =G?ðp>tohqOAPꃝzTR5O%C9~ŐT 8hU7̓U(5?FWgPE fF*H3I=/hq업}^)+]Kl8-leCToF­Fw$ LY < ,h$H$h Fp+[+OS`p%.[%Gͳz
-L{ V?v_FE\]MQ܀ȋ?ъsZ\$&F?-t^>"@t bXfϊ qpN=2vfs7?{{CRLk!rw+ ?VL?O2CvT1޲&ULv.+{rG:䮱|tS pQ
+x[mOWlʚ;媤]l*/[V%_ bArl0t<3 {{vs緡
+d 0RRzAH$zq=S:l ]<ⴌ$Kuo~"{R{է_g?xPy!+K_j K"
+p" \\6
+ $ 2ta$Sd!ED[gj划 v;NÛ@
+B;_оLc? Y>D`<1A&D!.\
+h
+^*{{ͰQ~ezMw;}fJčK2T%yvk&`Vo,mj]jhˍǺUߖzOk}ҎȵG[F
++ bcU/4ŁG(Y,[
+ ILYj>-$~yk} #ʧ}qoݻzVdmV@ aȤD;{dxK\M˾1ݗ
+f%XjѼ͗])v_ھ$GG/8(eVn5~G!N*Nm
+>CM!bBїHa1BEݲ70$Doy\AM&9\
+y6x
+HZ$Yb hWtcD<s<^U!HO PE\e6t2H,pTO6q+XԮYf6ߵS>QACzEeuJՇoz>֬ЎAPL[7fe.
+֐{ \
+,h$H$h Fp+WPJ]J7#gfP`OK%O2*>$BǾn!]8uJml"IoGHџ.A KOa0
+!uqwz3*c~I}hBR\-n:x{HTH$ʏ+3B2rD0q|<esUُ]]#|Lto:)ƿIpP
endstream
endobj
784 0 obj <<
@@ -2500,13 +2506,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
797 0 obj <<
-/Length 1151
+/Length 1149
/Filter /FlateDecode
>>
stream
-xX]&}ѮmUUwF]mn^U$qY'3'ʹܗ@.~A`~\yo04-HL)IF `U?8X$*t#㹨ڦ ރ(
-aR0J[y_=,Is”D8x_({`4  H)g7F[!= !JB|y7N>ziI~H[=7Ѳv +p\ `]bTkA'ֆZYIu`Lkto #fqwD[vS)W5~*U+e0ܱƬ^k6A-l$ ͹$<8o0E, SGɈ0 ? !p,xˑ}|D12U| OxU
- jN;_d|Q-CktOvx~
+xX[6~Wk0*ΨV楚YE@֘LfZ/9||A`~\yo04-HL)IF `U?8X$*t#㹨ڦ >ރ(
+aR0J[y_<,Is”D8x(e{`4  H)GF[!= !JB|y7N>iI~tO[=7Ѳv +p `]bTkA'ֆZIu`Lkto #fqWD4MhVoW0'U ĨZ))5fZ d?hdqk}$1S(̒0U~Hû`IbNk^G#]ߙ@tQkqA`B3 Ul㡤4XDIx'rkTf0&!l궘Ul/ գ&νv2.뾛75u>Uyz7A- n>xh}w @hy G &qF/"&`R1}~]uBmS՟E*FX_*Qe,>͋MPg;Й [׭;uSi !)GCt:+-CU\C+w3fx
+dj1ޝ x>SY oLmNfoZ7i z37sʰә7U `E_t*&/S{[=Dw8
+h nʍԅFSPed֋.ۺE2
+jxA: V_v5&
+
endstream
endobj
796 0 obj <<
@@ -2545,12 +2554,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
804 0 obj <<
-/Length 665
+/Length 663
/Filter /FlateDecode
>>
stream
xڕMs0
-CTI,_9vfidlp!}~vyѲ+ q>ΧoB }dqfO-s= ]7ܽ3S+/TҮu;_cőL C*`yx,2(dx.Fߎ8)}|nx,ԗ\&ߪY&iWW2Y<SIeɲw*&Uu :+Q9Rg?<IIS:BJ@CZy:*S[dbK*45%{[ONu%$m3$.$A>m>9u'I[?XAORt4imzl ۚ@BC G7oCCoC=D+3^O^fhfޙ }׃3 'hكb
+CT 9vdi-0pCP
+0q?Z^j{b];WΧg!jCX\IBqu<8Hώ֙)/uj\I[Ժ+őL Cʹ,0(d{F_J0ţ BbTm'm]i)yIAF7[,5Y9E K$-nGMN) )%!dzr.;UG$aBIJ\SIZ\Zd nxēM_K<IpO s'I?X7@5h҄!`[qw4k8_ m14[ lR m}3111ΓIr89kfٛA 7>o {=z=8Q rƋ=)V^H^^H^^Ny=9M0{͠ z= y=@{= y=8z25{05{Sy?yf~l6(
+=
endstream
endobj
803 0 obj <<
@@ -2568,12 +2579,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
808 0 obj <<
-/Length 640
+/Length 638
/Filter /FlateDecode
>>
stream
xڝAs0
-CTI!rkmv&ܒ N bW zۓdoy$\yb( FJ$ސQ #A'qFcWW6yvEm^5ҧA[q UK={.2ZS-$YW#}0GlG"2br+ɭcnbD(]);M?UNm)vy&2Y7]毣aF.B >wق0ޯ$ƸqNM[Z]B bQIV"P2&n (F/M5\uotf[w4-l0Y@g7Gq¨ؔuĭýq*UE1…ݾ8]\ bxDR;nIām '-&,80zz*Y (-8? 4*itӘluP-gao<i\QYOOf=>ǃ/ .mz":a:6SkӹkEEI*0:Kkwۼq.(+R@W` /./EkPtAPҐC~ϘNmT+ /Vmj?ś[Y 6gfAD>
+CTIL;mSnILA8
+ο@0d7'dyoy",ω&>I$bTIIXPIY@BDjv6urdmcrKa[a ޗ{?*+EȪ{Q?Vd;5 B+bة[.4|ujWr~oY6]"җ?Uڴ)^Ì\DV >wق0-$ƸqN#P-@bQx4/_(RG#ÝǦCfy' ,uD:(B(NtZٰAp/3DTvr[#\j8*85{
+N"t &,80zj,I܀ ʸAgABe=z
+X֛*,Me=z
+hS<ž濬1*~/96]1aTD28XJ{.
+E&F)wW+..Y|_:ۢz<ZC#Nc:ZFNe]8od39;~}}6۽= @G
+n I=
endstream
endobj
807 0 obj <<
@@ -2591,14 +2609,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
812 0 obj <<
-/Length 857
+/Length 854
/Filter /FlateDecode
>>
stream
-xڕXMo0+|umcjV[G9VQH6,_@d#9ن71,A2 fOYpv1I!b-QJEYnC*
- ǜ>nUD,zUjgmY+d߀j,AͧX2Up{OP]iBDEV'1NcncmR+(&ߋN- &dh֍[ךzpu]2Brv2S\gEΆSĒh6nǘbb6ݽm*$쪹v\KbS;~bF~r7ѩ<b$|i1)To,EQ{zo6E w2=_x$.@ӵ>DՆ-sVJx/) 'i,:}~?z1uU.˕&ͧ<p9][
-BXAIIi|Kfha,b p m[$H$D*I*I*IHHo "#z_c8?ƍ
-nP}p݃ ,TZ!ֶVn;7)nBqsvpZ^RW;.sDhӔF4=jwY̯Neշy3{R֛'C.u˃0
+xڕXo0~_GZg>N[U+*JЂIQߓmЙQp5afw4KIʨ,'~vM$1D>nS<zUjmY+|M~O@cRRc&ݵ&e<YdE$Ilؐvڲ+S+CdqCHq;ƢZTnKZCH.ۀs4vg?F9b,X ǐ'A܎#f6m*tRq.{+̌"r7ѩ2,;cL@oYEQz/vEw2=_
+0O
endstream
endobj
811 0 obj <<
@@ -2619,14 +2635,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
817 0 obj <<
-/Length 1078
+/Length 1072
/Filter /FlateDecode
>>
stream
-xڭX](}ϯё&0`\Vj;ڏ[ęXM.N쌕O|8\=B#"ni:zw
-p*e+DIʰhD"x}lmΚ*/$֤v
-MՃ#RX1ѷ-/8U" M ݏT$qĪkf?,V*kmbXk $^"y
-6 >63aaw&$GLD
+xڭXَ6}WQ wQA[ h--%Wgח6`@ޣm, FP
+@rF 2:uUy[~
+jfDt,6e-+E&.WfS&J 12]a(Ya*1-bSVao(79~{i7UUOzA&ؙEQ` 57jRC &RQ̄e<$ze#8R}M E@d*VpU2` MIaw1g3G?2lG 4.#L<<@yPo_HF___z_YzL24Pu uJouJ_ubX3WUxo׹!p_Zh[jof] !Tnu{jUA}****iӪ8* 1XEXEXwz81$٨}&ӿ1.)šs!Kߝ7ۺr- jkG{Z[}7oG{EXV*dpE1V7^54+ i1ʦcͣ^m}PpW:`
endstream
endobj
816 0 obj <<
@@ -2647,14 +2662,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
830 0 obj <<
-/Length 1374
+/Length 1376
/Filter /FlateDecode
>>
stream
-xڽ[oHFZs}˅Vi&KjB&Vf6sI}H0bc޻mĽEB0oœBx2Hoxw> G=י<YNUGe_Lee\y;Q[gdֹ~{aĢXμ3c}N'FCT,=BQD_-•
-Ġ7nE>C
-G!~\V<e>3WS膖!W_ su6I|O"/!`K%0kՔ[Dfcg?irN/e_O3;c(tvz<]L`מFT{#롎E
-r<WWV4P'qPUazb:tgazP{~n%XcL~O]UN'E^Ƌg+?<@aŴFT/=IoQ>O1z,1pww;f۠[K$]x'^cܭ-b&oxP%]%$ra^Uf4O
+xڽYoF)!Pm̛%p5@ōCD"Uj~Dd0yIӳ3]vf8xpw9=@XL>#%D c &i!$q:`<Ba0>z*Ux] WI1 '{lq@J!E`}:*Z.3#cN(7U,BQL-µ`d@+UqWVg_j*X Q[cEXTr+Jf!"c;Jf)ێʙN׀0XKmcoRzdz'rו_1i?5Ў51n?Gx?yw{1>C~ɻt<~5<*b<ÿnC11G^N+0[P}ƑYgD|NUuʵ^l$# N#IP첑W}N*w>W6gY>ۛTWB2??:[Yikܓ|8QGgoc6y6JB"\p[Wܔ`le(FxB9=A%Q'Qeb^b(*".aW{/cp V տ@0|9&UsR [x :j?Sn,58A҈"FI݅
+Uρ%:ƽgq-ӕv >K@:nOs ?W/3O[.NdL3(qILw3
+{階CF*E`JLۖ$ CGpY$/#wyv]>sҬԐS=[i|VJ$,UEt')NK]D~;
+r~?g_RV7y_`:a{WsԜLzgygzGbYlj>ƦOglVUz2<%p~OLm}c>Mm V|ýoR?AN?K9poQ a W7]{=e?1k$])}n6 lLnsǥ=U)b m{u6/m-j^05~p
endstream
endobj
829 0 obj <<
@@ -2777,13 +2792,11 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
841 0 obj <<
-/Length 453
+/Length 450
/Filter /FlateDecode
>>
stream
-xڕMo0 :ڇԷcѵXa-V92ɖE/;"E_ 3Ar]ōĀUrC4Qh@QR6!&mͲPܱx*@>'zk &H4!vG5|rO TlG&V&'sZ9EM(V-\/V0t6}=]+quHHVLfh~k?~7gÀRvX1!l,Qn]TK8V)ڸc:9؏Cv}= }$A0BB!AeحPyD T|1 )Cʓ^
-v)Em
-y?λ#*n\{ 8 jbK`,ϱ>MKiDzHu_p<\~
+xڕMO0>&5o#.**-"&4ulg KO3<7
endstream
endobj
840 0 obj <<
@@ -2810,17 +2823,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
848 0 obj <<
-/Length 1057
+/Length 1055
/Filter /FlateDecode
>>
stream
-xڭWMHWM&Jf'i&h cb[ 6{w"hCQUzL"b6H)+ 6J!1(Z>`$XP5w>iܔ~c:pƳO3
-ާ10A)<A/ ɱ.F~'L)ш2Q*V.qy8n+ĵM!af}\wMQ| AМ,ko:*FGZw\J7eVԜcyט9ЗK0LzY4(eu/<Iκ 
-_ވPTβB3}*eai2sj
-I+{.?e`M |EW5@z2ŗ,MfУ@1H:F#
-7a=pJBaxw=R@jU*c\O,Ƭˉ`@J])uXqDb';SL@f Xt@#E!e C4OC&⍭mRLӴ) \"pɉ'PXa.XSI9
-LQ̀d\0b='IÒC=|jcettFTH)XW4n,L8+CwgK
-EX".[B8ќ6`}fD 1l [eYQ?+#;`v"v؉T?'NiN2 o -ow6?*vwivE\y}j l1_
+xڭWMHWM&Jfgb=AX[ 6{w"hCQUzL "b>H)+ 6J!1(Z1`$XP5w>iܕ~c:pƳO3
+ާ10A)<A ɱ.F1#>OtGwYSe8T(&]pN !V6kB"qdk)9'Xz_ u+UX 8l<1&ǹ*Xoˬ9Ջ1s/`,iP.W!'AY`=^x"\td)\>#eOpg>T1ux
+n|͛ÞzXquą$&z"oԢDU50j56Z$!X*=Y1y
+!.L
+J5nEvK]on$q99l-r+43Ep$XBxL?V~nVz_e~"^N} ɻw/Em'&U-}ji_s-"Em<eU
+ 8tE\94c/W|
endstream
endobj
847 0 obj <<
@@ -2877,15 +2889,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
860 0 obj <<
-/Length 1542
+/Length 1540
/Filter /FlateDecode
>>
stream
-xڽX[6~ĊB[gL&nx2N=B},Ĺ}
-f4 o( \N.~X(WuPN`|@Q,nƶ# 939E*Vܽ}k+;.╩Laoe>{(K荫Ȱ\
-I,=&N@˩,1
-@NFJ- WU'
-&}e)~*%ad)-v T!) D`.KE2|aFR h:<N[<4gvw6զMv7E4mxYb8';a.c?^EQRG]CG,X1cС,&ih<~yۉ¼&[q e:Lʽ-V
+xڽX[6~ĊB[gMM-[e8IlmB98ZD8z3vZ(AZJG
+DHi$nї#>Pğ봂?zrLD}qΐP 42(׷F6qDZUIʣr+]I9
+ˣϣ?F؛vi/UD(҄; `CDzhpn"ޡ:B*фa1u7Ŭbݗ/ĞH~p(w/!d}LE\fsƳZ~jNٴL.W7Ȋ]) # VcB1TLa8 grfK八0q5cofb B8 y
+cr7yGYywڨugx]trYB{Ni8FAU.VWoQY$@cc FngZGad LE(}؊ ĥx<ADV7ځ
+o|g4#3ODumP0d^C}CavrA\BB V7
endstream
endobj
859 0 obj <<
@@ -2965,18 +2977,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
883 0 obj <<
-/Length 2380
+/Length 2382
/Filter /FlateDecode
>>
stream
-x[IF 0\c`Ifb9DH%y*R-lޫzq pwOhddK0RP$I >,(]CG0]O漋+1y<=ZJHSD``Č(V.>}bD}i]B!D- 9/~^ROn`T/>b_D,ӧwI|@
-1RH+zZr|7K{eD"U
-q˟}>Ni{;vRV;Z'ўmՑd}rd4)lws[w1Z!J-aSHG]=1LiCd#vGqGpz]x^ׇ%~/lcxP"@ꂄTlr;widӫ툯ձܙ:2H1 /hח%Prŧu5kR5ID4<mO<>5bu&[L4n VaƮ::iX6
- VE])"H.hD'BCs,S(/ 6%Y쬞f}?8q(M
-͓10=>ORT2 ;kӰ@1Az*^X  ʶ}i=F@ީ4C G [8}(b4'Eo-#u)BR;u>-\&R\35\89 q}år&
-{~,S ^5;}o;!F O0EA }>6d.^2ǰ,nf Àoe+jty/Q]K7ETA
-O.'QB!Mo͐ނ;0tX }|Oa^OgXN_ [N|^h'{p{c|
-Éc}7-e|ȓ%?&ϧ"j;cZ ~ 
+x[[o~ ЇJ@4;K AMSM2Trx( Ŗ93}gh=OFx))2I=/+J׿=1' xw= UzcxJ4Ov_@`-H)Sk)߰~0bF{d+ nu>}bD}i]<B!D- 9 ~YS/`T>a_Dd[bV!6 #iy9܅IS˚DJ+Ow!*}Ma.π\mKD* c$ZG\#vW9cw`-eêmtJXIGK)GFbmO:&_+D "%vtPq'o&aH z]vem5y۞m&KAh _lSq$wWǗ_gocg䦷! 4
+]_ CU!VԌI&eY.fRwr<R?LL"F:mui9@. Œ`uguҰ:lȝϛ'mF!R ]yCX5\ЈwO4E PfY2phB, 0zsٚb$G1%Ύ2[0BMț&|wij4
+(#Mt<BK>7 4HYO狿?덄s\ m 1HҺ6hҙLW&d5l;caЌ1i] |%1=ءN! kKlJ ȝ-# )YIjW
+1"Zm XV4twAo%vA)2.d)@dr9Taq0hV#zZ/s3ѰC
+-R~?tRB8tUSk9aOyg y|j\
+/~ZOgF?S\"{lxV4 }88sxÉi-ZO+`ط5%zJ%?E/,j;c ~g 
endstream
endobj
882 0 obj <<
@@ -3155,17 +3165,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
899 0 obj <<
-/Length 2518
+/Length 2514
/Filter /FlateDecode
>>
stream
-x[MCl`oR{ v3"A&;}Y4nu[[r&_G%Kؒ^Zj*V2^#wUdI^"C:21'E/3I;0t*]OTї9wd9ׇ")QF@K) zow 4b*k2Z~FxSDm칎0鄭wM1_3B+xceoEqH^ܘ6=Sqoɫl>tt:sAot߼Ty?nRzF oxO<+MP,1mUxy}\ۭ,JEwp.DFMË0Cp8R @l=wXL,a.ElHPnP&B{ +b #?=vKE$;Vi S3GDJ3fHTuw VM9͋"v#RrLN40{,ޅN'L !c0VN-Q,/3imsq{v#7ǰxt,}$Jn~Bs~/u+m9ZuZ
-16wk+r$UϼD+GK2ЛXVL? !nH*jK١j[CyZn9,HkA׋1i
-a|B<JF(sMEQSՔazcT[.CXvX8
-I,,R؞uVXaEIDi&I;8AUyrŔӬ +`%@7Hx-l
-挓!nOC`e
-;Lk/m)l_768;NFt4f*kav91NF2GN_%er
-2ɟ+KVŮk.}w0pu3ٻ3]9Zʉv Z~.!*[[i%k6Xy˛#Pp9
+x[Kϯ C$`Es3b"ezSnD+>2/# ٬j
+42R%Pi)e($xx~p$T͇-Û0$JܕX-ś,Ϳ8 dÏ @K)2{\Ui4p˯8x{?1CVX|;6%A[#%)˷Dl>^<zwyV'?4N/QYR
+w59TQ|ڂnTz D! pG1i\ęWzIzTPHo~:whg@RFTX'ڏDUˋ`HQ'
+'Hꖪ5bS#2x,8GLT ǘDT0 l)Q_(LF5BFuCCR\6n$n#Hv4pHH}P[ImАJZWar@ء5Z݇*D4,gPݡ2.5C2.1b`ݯ"S10 #D'ko'?&AU<T; y65/`AqZo^ܝ 0ٲ/C,4v0T"!PՒ<1n-$P,;8
+A9k}4}O
+qҿ1\ DNSu0O紈ޑ%iY[Y
endstream
endobj
898 0 obj <<
@@ -3219,18 +3228,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
917 0 obj <<
-/Length 2000
+/Length 1998
/Filter /FlateDecode
>>
stream
-xZKs6WHUޏSIMjSɎuIhXH/EdvDJŲGwF Q4yLhՏ˫9X!1X8,Y)ߗ?'BI"uf576iݦ+'_my+si2%$\}&+9D8|37T(:W4I Wďh5&a8n D/4]"[ܦSinNJ(1iTBkA<sˈ߿z
-/? TN(J+?V+jBbD
-`` 2I,9buIޟ>p$VS\Ym\tZTH8[k✚8Cs^% ̀%(D pBP*F>:N(/T;;6z<
-!*n Xx\q;
-8ϢK՞G~Ϫ) fQ
-+>h^&[ެ!1ZzrgӇsPEա2릾 SIhUߋKOQݶe
-O<t\3VAtp#t+|,cX bcU@xAz;zbePqew}B
-e]on=.׻и-ONY$A~o4O\I*
+xZrF+p,-ǔSI9u]*$T@@tB$L,Y{^!Hۄ&?py⥕!V)\$T-'%]ʳŇ˟!31\rSsMzUy_ N>3si¶2!gI:{&K9DX|t3WI&ꨓg`'%\b?ՌqbC#48g+%MY0jg-B%49d{/7M"cL eh0X-ݹ*cuU5aAno4
+&Wu{`i^_nW͂tڗKSI(4ī~&Zbc!
+S*pf3b s
+FPƍowAZ:@K\ Ŧ8#<; x
+-? TNR(J="~6C6'JD 5"pnhUcYN YZ3=V,td^LpY˙ Lޘ]dW
+p2=ء.; 9w=UӔ=:zœQeʆUtSΥ`x/3p5&l›jP<%uNcqIc%X7DM{R||;C]`wrGQRj} ?Nsh >rCm ZX[e{c*
++ڗhV*_g-ѻܚkk-]`oLmΣ~
+: !eѯH
+?[*xSqo|W4\I*
endstream
endobj
916 0 obj <<
@@ -3365,14 +3375,13 @@ endobj
/Filter /FlateDecode
>>
stream
-xڽXKF+t*3h|L9qٕr 1˪"FX8ίO sAbnl_rd.SRfJS$IXeٜ|oM
-݌inju9CB1ߣ­N~YLL,9)' #쫗d\2|
-Ȓ 001< ׺&Ms:>s\mO;T"pP%@!X`ٜQ#Cٜ`s
-aK $qB12"Z118S I&oK=re}2GJu,zĮHAYgV) naS}v 0: 
-<t2E9i18IR!NQ(A<
-Mel@&ABp1=v7ogOؘδ3Bq]:OG+vWrII ~*7^8,zsy]LLB4,9"^&P&}}[Z c!a䁿btPPŐ>Y|
-qY:I9R&/{g}k>t8F/c9_ٕqQv齢쪿fsXR`1DUH
-ʩ ڸg!^nm$YTt-Epe=}to`}U['U֑;ҚvoAmm4f?Gsa08a >]hA'[ȚH6giq1mYzL68q6CX}bYXƔfybv8dUIH#I$In:2?9D aCagP\a6)26<|pk_yθ"\7I<xr()!)i;GK$Ѳ'~Ya1kn'BQ_Lг0$^Gvr<ýڍm}xsb}3dd⚑+7[dNaWMdz>wNq_na4d}gTĤI(~,b)rX$ď`CDa,C`Oj#E{`@~C\\1=XԳz*Ou<p,ܘ맍E4N ]j8))N;5kK%4 k_JcN e@(7}3Zu mS^k|y6}އfҸ1LX"vvݙ#cT,G+`,hy?jOV/Ook/`]8
+xڽXK6 Wh,s$Nķ$#\2-YqN/LAGg g&.&"ˑeLaK)M$b}r$gs5*ܿ3M)ϋ7 @
+:m12!3W(<+7qgo2γ^rqʸSVg&N1d.G Kp|˜c.\ʚpG
+7mWM7lC%
+]^8b:D <@ZL/ιB~'#)*ePَ#=d*D *GpK QW*s[]ͲGjY ~ ub f)ш1շkgj
+]EPQ&aT#CbRe?լaȑc7JO5[2b@P
+y's'pS*(OT*3Ə1NʑԖ4!}yp{Z;Ns9p4zq]ˡʮ?KeW=w}9$BG6lyvYěI um(5;#b-
+4 غ`{ o5`T) ٮژ؆&)vrKclXhZqEO_sƓƇG<R۶ل캎\14mUuDa;;#{cx7R9HP!CЯ BqzI1MA5A@Xa8ZGF VU]uͮ^jXn#jhN#o&Zt fq{dsVtu`ض)dsƹ6P_6h#m3.=G6E`Li)aÌM&OX$TI8m9DD;{\Xg !l( k6,^b&EƆnk2RV_v&/u߿Tߛ4v=5%6'3 yX}h$Z:1,fm D(] 6 zqqdH܎ ]]CwV۱ϕߔxڟMr撙L6L\2q}̩"좉VO'k15ƁJTЖQ3 7E4E.%c9cz<EXOcw(I-t| ȯ3qP ƢGzV6=i|@i1~EsɰKMX#1它>i b?\f |v&|uK)y{ CpF+wbrc+cM/6ne[_xYNw>'E3'* 8X Jz6&soqo]6u
endstream
endobj
929 0 obj <<
@@ -3408,18 +3417,17 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1012 0 obj <<
-/Length 1804
+/Length 1802
/Filter /FlateDecode
>>
stream
-x[[F~HfDK$jԨmΑY>صQYn1Mϓ/ |3
-xq'`ky(1)> ?FBЃz!)Hh/" +1f jP.0=ȶkwM/[kڄmf'Un{F9D")VHND)O0 ąIH蝤tE!H
-.FpKB.ׅKB
-Ճ=RmfC?Fa<g1<&KA@z-H{ympyr?Tj𼽱]l?m-"7{ j^,˹E
-Cw~& rF̚Q0X'ԥ
-kgx6J@|DQ"|Dj?HDj0iDN)ZձWI֙JDz^Sv4=i;x5{w"~贎aHJ헃߲
-i o~v˹Pgu^4yL Za
- *KGҝt[v.A Sm8غMQE(=ՇDNngZKp7D6E&4n*Q}=,¹l'py(* *#S=ĢXd+'VkX{!TjQno!Vw{)͵E?Ֆ>kR[jNԖ펞jmvRܒ˩Ymש-Y[sXE6@mrYcJpe^+^8*S
+x[[F~HfDK՜QɑpNdصQYn1Mϓ/ |3
+#-<$qn}nLG08/O;JXϓUų8\G#bZ#M3_cLJFȕC9λѯ#ۉȭ&X9"o$s s\>ζaH ϐc' <v& ~1!\5KަW"o#Hr&#Lr{JE\n"K0c"'mza}7qbѿNֈPgBDnƧf
+`%blmef4|l_37Nx$KV [vž% M@9lF|e<-L6Fqh[\w=r)iOGNfQ@~g8|0rLw;zYULZˁDI9Iu
+Χ.vIMTckQƠ(ViUx`7M$cf?:`Gznb[?b~-qij2 kC0$OdpCGA<@@<q8S ÂY}<CxX pFC#!{YAD@SMu$WjɌ f{˘FUQDC_EKJ\OXad[N ڵB5mˆr 3Rҽ "W+I$]' ߔ` B^$Y$NR"^o$Bp%!]%!]A)w30Os |tN|p9Z*p GJjgw^rx. e5
+HC/ ܢx!KH ;t?I9#fM~(]m
+O)R
+^e ÀbQ,eRMbzcm+5,ǽn*(V7+TڢjKE~-}\'jKvGO6^hx)nI -₀9][",Vb{zo//JDYRUW?ge700_ ,F 6c{*8~ћ_J!*p"ڶ+v"Y陷Imȟ‡87vw%]Ez@rgx
endstream
endobj
1011 0 obj <<
@@ -3975,17 +3983,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1065 0 obj <<
-/Length 2535
+/Length 2534
/Filter /FlateDecode
>>
stream
-xڵZY~_PU+7I?:{$]x]Cb$J,L~}@Qhf`  >p{D1I}QkD 'y9$Z,y/4 Wir@JAT$Gͻۛ?o 1 ?h؏%"on.
-IKl| Epeo3H%z ^3BG [,4|kؚcxCotp;>߽z$,$ZŞ޷efczmX/][3eR 0= 2!]Rj7@};'Dk}fϘ]\1{k&KG$J%c$QϬA[3SDԑ`ZBuҺ1UQB:7,6k\ʹ"1i^7)A7
-r,ߕ H;sHqP.dBZ[GדcWƳ)aRxCKe_>ՙ fs?Ltq>f> a wC-b}>3:#WHnIIDr|;ztjPZrl ! O z]m}2sҍ ^+:襁R[V;s:ݶ :y@s c>]
-j<#_Op_N"*ٵɛWIޞ #񊼍g8==&е$kR:gOqD. ?#ˑS.+"s9U>mYP>w:~֦͢Wj+:oF"E(wIW2\a;CͩSЖ "?>1(@K]`yH;J:Vd3"R)c”`YBi'<f٬n`?w1Y5䰬Şb`M}O^^C0\IB( q:mu-\Zϴ ?n:ZJSRSDZ[)1oN||_C&|iͱArFS{=3 ř-:nQ`?
-̭T%%gILlbr,tQy0bd ?LTpp1ϺjY혥C-ʡjP΍c|GDk~=#ŀŗE$r&/T.@6PLxMWlF?Y>n[dwg{5#
-
-*n?ֿM0v LLj
+xڵZK6 b/TĔ7Go̮zÌu1 po
+{B )3C8X8xwbdCaKD"I,r-4{Iy^qc9C"b@Πzq@zqbʃt{dcSqhGn.7ĊͿo#*L<G(J,c& h ouwM^V܎whKʑwѵmٵ{M{[[ f4>]l@|H(:%mOd yݹPsG2
+Iɻyڵ˙2 D!!+8,YHKBҍAb@`RfJumUacNa MzO&Rd $}K+U[QU;;b0 P )i&C^tn}Q FGvT[?3:ꖡn}ye3kvb@ZJ?nr'/(ZPj 2V>|Ř.ň>n'sT";K糊p$;HyiDQY6(Z$orރ_zü~_8DRuu3>9S&wh_œke&lZ'-loxkkFgnd6OKyŻqYd׏7;fݥ+/r[e88qݏ^`~̼/y_JH/ P&E1:әqu04#ng|(70k*f)kҶtuaIi/CCl׉&r"eG8bUU8@Ùʹvk(a=H' /:%^%Y^&C
+R_
+/&zECAxqϗUښj-s\֋i_j֥Q E/}TF%"+OK?1UՆ13{'aȗ:"ǁ
+2vF`y(x/Qi*tvVC$bNrorzLTG7Ebuɕ
+.d8{#Wqk@RGݔEZI-8lG&8G:xRTO>@
+!P υ-97>O P=n1쐱W\)f[]*\ b:u
+w{gVm!~v^w bz56A DǺ`eDM#P3O^w9OwNac7$6<ěWaz]߷$ߴ<[.]V6{-c`^,]|B_vS_#1adZ0?--()ۣ~xY[ً˧5
endstream
endobj
1064 0 obj <<
@@ -4109,25 +4119,23 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1075 0 obj <<
-/Length 2438
+/Length 2433
/Filter /FlateDecode
>>
stream
-x[r6}WQ/yJ26{fR.E۬IDe۸CJ[ŒHOph8zpo7_oDEHK)C$&zzq՟qoҫoe\fEn7mj4QrWmF{%!-6 ne \9]^{URlRm/4)ӍW^غDȀa*a)RTLY%?r,C DIַ }<手Cv^l~|:kǼ̶kJ cɱ>7qVMЗ&DdRr`޷i,`cǧCr8vDC@a&X5 ~0
-,sG
-1DAokWE9m
-r4 d
--N2UwނT7R*>X8 J5BRYSD!JjP Z<(U R-땪«BRZ1yc
-V}2Å
- .TrRH }B0惄jJÄjJׄj TMTWNIRRFJ%) SAo䂺-\R*eMAKTEPvzU ዀRIt :"Vd$ɨ4tJ:jFX"$6JѣS_4Tw=V74͡;_:Kz8$kW|ݥ] v۳0Y8 L-N.02TN
-cw0)RF7nEc6ӛh/4D B'` :yk'![(K<4WCފp1?L2Rѻ\DZ].ha沋9Ey65 mrQ}p5z7vn@{\wF{qƀ@<E/I-;c*X ٚMdvxgιp ,O k9Igm!7UN˜N }WA{VC
-tN
-g$0Yh4:yp({8aLwUI"Й>g{Pz'WۧΔ9o`By'=H ,X(&՚ӀoW[!Uj-o^>gs}>x
-b
-=ͤY=ɪ>m/GpN</4*CCz/EvWצgǬW=
-~XoƖql"<.'w`F[ !i}zQBz8We`ʝ8w_d?#U6; ߦZ>u;fE]]ÚbS)0BG[謨Kp*ꊋEPAnU JEd/ag ~ 06;K%łRPWD^/3|W$,H=䔆;z: -FȠzVB+_3 ˒p/(}~4Lx*L
-=(x%ZҔ[00=N-bP
-G5@,QY?ۗǰ\}y+Kc3-) QƼY *q¥!y4OtlwZЪm$"N[2~BإO?Ίi{YlFj-`{/U2l }ܻUMxmӽmފ|}ri7&
+x[K4WT1BG
+v
+ ]jxf\!qX_O˒v8~1@qI[-}j8x
+pv7F)Yp(2IܭwKW}0' W>[7**8<Rx8 L<w` Ͼ 0bFۀ vEOI.:=hD2ֱ<xmÊ{ZU?C$ 
+&"LhIn\ӆ
+ h0K9<F9Z0@{NFu
+BMٯw]ϱWbxcO}}OC/3.{CЧ.<+\dpB9T4L!I4ڃ}o
+1DC+ʗY>m_0 FdpKj$P0#%BRԉD=@\YPFD&:9<Zs Pf nDn:۠:"e5ѓ5Lܷ35F`q&vyC7oTR"%T
+E2YLB5EӦM4g0m(uC7=QWߍPT
++ujTS5P{Ts~%T T~"*͐|P tNTp -gFU*ƱgqoHn(XSLa0g:ʊ"a9P=S5P{1WjXT T`rװ+W듞?NTĨW"*џ 䤘M!
+Da{ %QQ %Q R`2jRJL%1LSƁo脺%\b*eEAOTYP.]*Sg7@xJYP-Q&ͧ3QiJV=xJ)ՈJi1IlDŕ8uDO}PS]
+V#=#1Bm`>={ :]Y(.ɟe63^n}Lg6 4qPhcl7f"˪ހ qؗ۾N<͓me!}۾(l^2Z0융ڣুfh={Q=nz-|V*
+hu# !j){?>@2QEŹ%qmOJlwh&g'-†=uzF]]ϨÚl)0BKhͨK(D1LeӪꕌ:8\xrF}Lf6MȢJ uw'PgzB]!.ID$z Cɩ.︖W0!Z ˧ 9<pwԮ8bN. lKNyhO` Ӱ)
endstream
endobj
1074 0 obj <<
@@ -4219,17 +4227,25 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1086 0 obj <<
-/Length 2767
+/Length 2765
/Filter /FlateDecode
>>
stream
-x\KoW̑~TlE8@c0E*S=3b=_LwW]U"3OZbLSbʴDz}fKz{? @,}z_1f&l 1ǫlQ"ɾ+3H MW K {3#+FD3_0J?szu)c \l' "j0.<]DjD2)© O\"5> oÈ^oׇS+,S+1ZB&\Ա>c*׫|{9u6%u0ZRQ.b:VBmvwoPHE*Kpm62E<wA_?Wq P:Qo1r `պ9|usKF0돛mYTa N`MX.ۚ۸-9Vo Q"Ŧ-̡ a-?+eؠ$V=ljq%Nө)I1z81|hr*(`iwYu|[
-^e psN<ܸ~#g4Qh_r̗׭wf,fwQS}._3-93R ùEP ^S`qxC4&H L!nBG
-EGRALs&r
-px<Hk>(h < $
-NuJEA!H~gR&b!΃ʿCY
-ehtnj8q2~7tSk֝_/?pͮ0?W1~<WTWdPL;gr+9o $!2j2\S$\/h9fUL6GH:eQ/sG՚qs繠u``FBȇ^A=4p/Hpj'4>pR SGC`lbslq|펜^zHi3-,gIR ri;F)y>]Wce~F+iSֵ
-fT$,V\;-$]y{]`RpFF 9`k`<)ѫ"QGq (QOpu%Ua[0};Fbv g)b-a%0,L dYLeZɩu#VuGYin!a$IcX?}Hiآ {љFALAM;Rh>&k4DuQ}.)j,PQ}][kۥ9vS$! !3zù4 7C)8RRI9ek&k?xsʻ{&c?wsc7 RݜM$PiPՆnƉ9=MV37gVF_m&U'nROiFnNe7o#{p č#nqGn? ÷GO}7'T]_J"H9ޣ"\{US0ywE0g_ 8"(UE00w&P6qG+ * [UюMgkڊ`Vв+) +) {VAWs?"Ȋ3HS'W"Պ SUS@AMb=M|5WB?'OUMl(#뇣M|*jԁ3%TC*eH!|RS:B;M B2 @l{6=%/8~'ˮpbA=7
+x\Yo~ׯG0{>1pl"A[@@#0E*<U~}gzFlri 9z꯫J}BW僅HMQ*іŒeu"θ6Mlw}yV׿'R
+Z nݷW/iJexMJ5ɏlc"IGl|R=/:Bv=b3F)gdZ^ǘ%d2WMal) .5/
+55Zb0p
+!j4?,zP[LmQTWաi' ru϶2n~M,Cp`D]F1+Z;(RcX1pi-"XNs7 RjYJ'J= ¸C@b~1et.oOi{`DsNVT" aٚm#XS% k*nm-9V5o Q"Ʀ沣3a-?f /?1ݨM-si@c6tjrReuP ".Ku|K7߫4#FQ2Rz7˓%kU5C77ԺÍK72`̘&
+->|qjaW4i{wȲHOOS ùEP ^)nS<e$ @ M9(܄Z+L) 02d^hf4G ?cd'젙jcMdaÎ0 GXo9;wC=vFbZN~Tisʗ(攘o1ͅ<&~ V0G:<. q(
+(9) ([*#i\#D F/B :Z@8#{)
+ /`@5ܪT"قQx˳!s&V" :Cم :CAv>h+[ ۅan$^8,X~]J6FF,DxJvJRCe8 *gu'L4%Ë;0~;r5:]%f7doЖ8V4y2;Ҭ@-L0+ 'U ^IҶW5Fǝx#$m7-풯j-erabwӑJ3U6,@F/>|7LjR$ZuטNX 
+ WD*
+ZFF~gEȹא NG[
+rll@}"g ضG#61hr%ո "[k 9e0CU>_9Vzkzg$5XOM$
+>nS}+;w#f_)m ("ݥ!/]::w"kHD@3(1C7
+Do?9U&uY2js)9?S%Si2 JAv^bf>n<7g tz.{;MAihܤO!vrmtI7{Y$NU Mga}`lhE&Pf$1Y4Q>!F <
+sh<dhqQaBMk`uZ0i*:k}\t`6#\28꩛upD
+5VQ l>lʳnm0"VLd(ڱβʴu#x :أYo!j7IǰFgӰYo6*gz. Rk
+jT
endstream
endobj
1085 0 obj <<
@@ -4322,21 +4338,24 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1091 0 obj <<
-/Length 2311
+/Length 2310
/Filter /FlateDecode
>>
stream
-x͛[o+h x-zټu"+P[Jml;)Ŵ(n %ezf83~C18zpw7>F,{FZHI7 o!b#NS;-UzLχ*/ 3滻niej4Qz"XCCͯ7ىyqVfKpc7G
-1D`7R)]>B1M}5RBd 4Fl1SPD9fEOR -:8s_gz̫<MSTo>bQU~20V& dݧʍƁefA>b A2 ڗ7nЕH ݌pt=CA
-8L^T'1㾼ucD 3SLjF\U.5Q^cTq0APiO>u+k(VPU)CHIJkH3
-*Izm  [/*&Gʎ[B6oU1̅Dq,u EdhH#!_:
-AvCMhF>C3r酛!_<Sv?ÖMybsA] ,ZRv"bH1Bc02v~QZ?UA|hB=O{8]61Kv}%xs>gGy(ȓmD`/ "6Rsxx*@tŁkXd1C-؊<
-6%|2&&nPk Pb${éC#3>9\C=J]{)=$.a-+ )"XX~n嗛Ca봇Z_!Sq a= л@=P-2Y&â0uz FF03ӺZ3n|@e2\G"&0=DuWfm
-̆46w:<o9@x?x{#+`S㧑Dk(ui5:Be: _!
-DZ;T)hKO(hP!!ti4aTz62 }uhs
-H`?uPSj6,G' 6F=Hi@0\sJ$f 幹r}'gW2}707؊\Vɰ9
-^#IQk(ui}0[w1q5CU TyOH|hš#hPP+_A8X[i*G5FS1KYaYK훷2kC[%fW8^FbdX#:MY֞6`!ft a%ajY pIMaj"~<S=L2dc\eQ.
-ro^\a"ҧOڮK-s'Fۃ`7|i:ד*́ . 7:?ϊ옴Ll|ȞRLXs[N~z0_Qe9sVKK n+c(]d6O#ۧ*oDh xWֽc= +OZ
+x͛Ks6<JU1G[Lm*n|ˤdYIGv~H "k]s$
+nt7_0N|~4"HɒDaLHnaxO qw_moқez~ΊjWeapw 8!L<Io~'{#ftpV!_7ۉ}V"fKpc7G
+1D`7R)}>Bֿ҆r>pi45Hp>AB5t
+(gҬI
+_CgLy՛OXyw ղI|YLb`XfY; "*H!C~](G3T+Eh~b=c#)3ϸ@#qV"D zAS}AӞ|*V-PS잳HJRޒmTFV7ISleh& ntMH*ܯUqw%dsˊʼ6ZCj\HdUdz
+/!o
+
+ cʄjEi\E <PwVOlw-}vt<ٶn@&fYpA#T1װb\[
+yE>CܫMjH~NOPo*䚘XuC=5[C%
+o$p ; vk(ayw1ւސ"~͡2*ps(B/d憭j}6L10TB0BeLC!a
+O+9?P3:k((ýώu0(AA2wRЖ;cPѠBB49iZme2)@@eS GLQDF-Dpx cUlar3?ZwbO積R)P!nX7, +,e2 3Q1:iWXĨI(3V.5AdokOZʡ9<=*I>
+h[yn\IU M?@Ly>"e2Z0מO5M൙jkyu ^dYpFuG Dߺ=Aht:"X1;CF/QX)l1<m+|߲cHv=.aziS
+e$LC1"9^D5`j h-ڽ5݌n$$L- "> :LM@ЏgTcƴQlL7" k,e4UANR׋+ GSI7wIeh{qO!M7\zQe>&'1+㮥f?szY'+;B{?=Xn'*ϗז
+VIA.2vۇ*oNDh Pֽc= +"O;OQ
endstream
endobj
1090 0 obj <<
@@ -4402,30 +4421,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1103 0 obj <<
-/Length 2929
+/Length 2928
/Filter /FlateDecode
>>
stream
-x\I$JL@@PKnڢe=V")rsiQT-UzF#o(^_7F8id(ZDba,sch:?o_fy/#)QF
-[`v8Ύ:e$Fakr^ne)#VUV'l!ȹ'Fl3-8=qn`H#R>R* fJPZmo 
-25w9!*@36+WE(xsEhݮ0?'_.A4UUʶ*#9'NHQҚ+sӚۭfUWHXU]
-;_P5R'Ũ37 rik´v#BP ʪ[={827oaPn%Z
-XBFu/mYfތ HIM-~Zxz|h`?gӄvs`k)L ]~NФ16>ӪYEh\sB #@H5hoYIp"нd6˽:֦^O`#N-ps'>xo
-ds9rך !I\t v): R8{y
-˚1ɷ"۷l<_/)my(jDH! hc{om @hJ y?浐xGާ<bpv
- a N99N.%8h«y3X׃yDxf4XP㖎Skr_"$$D#{{s &u8+R5K%P}Lo=nO6#UKȀF`D#.%qWӊD)\kƻz% B^$ 5ÐD# -̻&"(α*
-S-x_wu[ˡ,%L@B j  0/!WX~|!.u݅SHdg).AAd@G {IpɂK4R c\`C
-_tLc2 +^pM/*>Jރ6W4 4! C+_gɯ?h9砐p:ざFx~9w}
-D>LՁqy:IH0/IS䁵%.DŽluJ~T:#Hb/4n/͢yS__@TQ& kS0[*isGD6Dh5C BxX$ؑt`YBvPWa;$Dk|b0U?RZ7BD¸8l 25|/`r/s'X6-T7_/?sk"pG;I(5|2+3ET&
-&M/n-!cm K@H!SIjݳM z1^(IlT_ƺ<%MZe:'ZAcsjLzZ)pYAaGϽ]%1'PpiרmM\\74KO!JTw/9,V!%>IC9hCNMC3n,= *3UR|@kW
--H
-}_cp %_c %`c %O'n1%kF7?~lu.&.fmU}`DHΘmHʀݪ7ml{߮ 6YlCGͮl:ΒoN< ĀsG-ig Y,}ҹj9אr.q5$\yf"Og6Gl.j
-d
-D4&K47h]֨f$/yZ'#he;h21 撶0ߖjnknR5rȒ}zf]$|Y
-?'0 +i;=C} :2cEȝeHH;4-O}װ~`g
-ĽKޢU'8)¤JnYOMڗi+]no5-i>?a , &,C21FxYo0^
-́-8o4 nv"v ۆv2mR('y(k.}htNS?M֝Ƴ]<H ɺeMvӲZ@@v&ώٴ=FK0,L;G\'~7d+sl[q.0`S`&/]
-<%xw
+x\KFϯr
+U$`q;уqGeE>=o5RKnb0U(2Ӈ St _͉V+*NY+Qf\e徆sxrʈU [HG(rAƉ.LEOa98Tq)~3A<Zm 
+25w>!*@36+WEa/xΏ
+<z Ѻ]!9hA!a*zO?%mi\ mUFrN\-x>5WV5]v>IUWHXU]
+;_P5R'Ũ3W ram´v#BP ʪk=ۧ`0kjG-U u,O!T6r=oF vC$$&}?-a=?n4p
+ךǹ"ˀ{ɮ( C0H ."JS
+Tb ]dVPw& !I\z
+ gwh)'Giz0j`9!|J0ldU<Ug*88a>trv
+ttWEA|=쳿1Oogpf7 eGο{W44. CdopJZwEH4AR98A!)?t-ύ>A~q |qZ";hfUf<?ä>Y$y$p8S䁵%.焫luHv~T6#GD4pyU7'zѼR_'Uqsd9̖
+fsGD6Dh5C BxX$ؑt`YBvPWa;$DK|b0U?RZ7BD¸8l 25|/`r/sX6-]U7_.?Sk"pG;I(5|2 3ET&
+&M/-!cm K@H!3IjݳU r1V(IlT_ƺ%MVe:'ZAcshLzZ)pYAaGϽ/]%1'PpiרmM\_]74KO!JTw+9,V!%>IKtf!aStۦ!zf^T}]*)\ڕBK+B\Ck|}llClokl[`cLI聭R=4M}A I 6ylU_-6X3&F,2A*M`#(^knۤ "",q:ۯ:/:1 ܑ@K)iqE9Kt.rs5l/e#p "|py$$0Xyy3õ |yf>5*FIGǼkG434VچTsIwK5GP757j>j|d.J,j9.M Н)xSF &˂7f\ @%M3Y3.Mޤ@yRt3- XsX3Ř<3e d< 3d'^&Yko?ݿnZH|3[ Fw21q>naNi֏[{-q>n=~:\ǿ,}<F؀Jvh6Ua>nX
endstream
endobj
1102 0 obj <<
@@ -4498,14 +4508,18 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1110 0 obj <<
-/Length 1356
+/Length 1354
/Filter /FlateDecode
>>
stream
-xXnF}Wy
-#-e E$y9ete.a#N랾N*olJg<e6:!`5Ҕ'r Nw F乳\&\0$Hn&Lpؒ qsCO 8kJyZ!>B҆v<b6(D^? B Ҥ?|37HvBX?hUOH綶s P @i,b5p30lΌ DŘy#z$" hQWW"%T sC3yPMQ6H'Qckmʅ 6>Z# 
- Ddʼna/hBCqvwE0ek*e4D(HIO@8\0E,c 39t3BƼ|Zq{a}6O{8=ِp9} 3|I =Q&28m|b/GzY[Es`~Z~hu=
-A$PFvۃ/\`|$%.UU\+=FwJL] 1TIPdOs
+xXnF}Wy
+̨OЗ628m}b_D}*Sf"n {
+FpA>=
+jDTTqՏ*' (ź3uP%A]=u/
+<';^@FO1;^IH&u qj3]h_F l;1Dzj?׏7 ǹEy>
+Rv&X Fh8L߭{P{a胲m?GBr&z"a`I@ ßmno8砯4L ?FUǜaWDfu_]odSi
+pjb6%@1XhBwcҶlL 50 @|ֻZr
+nѽ-!w{Jz$;rWvsY#
endstream
endobj
1109 0 obj <<
@@ -4538,23 +4552,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1134 0 obj <<
-/Length 2152
+/Length 2153
/Filter /FlateDecode
>>
stream
-x[nF}WQN/y\L&`L p$MDO٤%m`_[TjF~ݏ,qZkd(ZGqY>-${nldt/9]ϸH_#)QF!ۻsKƴrww~~5D8}+G"Dcݿ-51kFh?V0?Sa\x4ڧѽDR^~h?-XsרgUpm^)C(LjyL8vpgEtdŒ-VEp-, 9sf*xZ;fvF @,I|Cb3"%sȵZI~ XpISj\Y!xqoWE\N:N'7Xv
-˛½PP @56} |]R6@§:OϚ(SItm)9$Կ6}cX
-ՇtMv4{ihEL `IܯoX|ƮlwЙbËHjFt8ѮiK pH`c 4V+bxe _Xn=Qch5S +M)(eBZ
-FISA0Njf֭Z
-cհL=
-9+J3
-7-w@ƅՁ i}Xٴˈ߰; m"D P1HIzjql']+dIs"c@)vD[Ot6arB1_{bOىbw @ai>!p;R| b
-Ek)Ġ$h,[OzJyty' LP R99ޖ@ u_Y*Z pᲺ][Są45՛ץ|$% B)1@JJw3kRNKٍ
-@S
-:0;mۂ ZY3tU[ԷZ;;vűf,tO%j6oxdC$$u,Ŕ(.^ͦ^lBͳ
-jY&9>`ٙ0,7<U~jNOT!
-4YN 3Qö{bx7EDIx1Z `
-dܤ nQ)<Fa1gH^{]\~|||*xp<> Ӝ{Yj8 |?h q%ɒ<ntg]1OGs-WN߰$I 3W$oΩl$y l;Η?/9*zF[ }?V_f_
+x[MFϯQ2q8`f-3D$jTMMQ %5_u~i藻=ީFud'EB.>~KFO>Kt-5ReX-?w kL[K,zwwm_#Jѷr.
+I4>p)
+/Q1Ncf3Ji53OQN} J$l& Rek{U̹
+>+]r0 Y=W)SLhcnXŪ%"qrΌBSpxgv8ی3@2)6#_<\Ep!p 1 UW/vU^u]įt2<({j> YF$1VVm%_11Fdpu*c8-^@ֽ 葛يT0^':y05
+#OLp 'pwPFwXbC'~J rh})2qdD`=tUJ`;s5|6qww\ + \bh>1t苿Ƕ2D *vmcY/5,,%=쨩Q}S
+mCUP,|~ ڎc Zl\)E+v<AЉɐ8_"Gix@8FHS*T]:d+e,1lƟƊbYMcQzvRt3՜1DS*ZR2WxyVJj/PM߂0߹xqM69E'"
+T]{xJI5Mߢt#.y!=od,o%A!Ӥ~4A'XwR#֟9k9h0-ts"`+)NkR-'XM$^Yb—+[OX ZTJS2t)6J{)TiauX5,'Sd΁G plD:ӈn8m&PMOtM.PqatEu`jZ{g//&>V6-27,8g~[6A%qE RҩZ+g+9+IWlJ`Ym"PJ-Q݆fXܱaמ!.2|v"|؝x7PqXpO<=NdçBZ{c)01h+ ֭޸i3v^<ItCrti
+i)QPXh
+S]xfGm[D =KRx_NZCYj6Zksǎ`8v얅U lzdS$.ٜ%V9p%ԅ۫KMHxxS85mfV7m
+"iF^4 mXg4D;y\m||gAxzSol
+؈y$<(=@OګN;O0FޖlT ƃ e?m߃%
endstream
endobj
1133 0 obj <<
@@ -4741,22 +4753,21 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1149 0 obj <<
-/Length 2650
+/Length 2652
/Filter /FlateDecode
>>
stream
-x[Ks6WpsT#xq7Ԧ6lƷLjh5c_iR5ȸ*"ݍk
-(tQ =g#f)ύ=x!d#P߁9#js8u <FDP L=v!0 "\V'oC's> |= >S}4QL6tA)"۾ D'BJ ,TsH
-Q֏T|1äpz'*?f؋`jE p7ȯvH d5 Ye{IDi-F&Ex[ 7(sPl"&G#Uc3W ^ۇ#&}e^M L{Lm^wx R+q|ŗ]<Gp1H@b )G1Lǚwj46N»2ۡ3 Bx+Z"J: pܧIk4ܜ5Yp\y_R=ֵM!W
-b
-Jhj}+=MPl4_Vۙ:i 6u]ψKz性O~%E ) Miԟ>mZkhXn-t&eZ\H`_z-.Fŕr8-+%{ vK 'HwK5
-Wm[L5/2lak
-h8k3t l<#<{Zm_HS+.JG9'86ed{ݿ]R%M.Ez& `AH9pWNn]fVMތmp_r_z;;hO`풌y#K4RQ ]j!dt+&xUU%*](-ږM@\n#3sm^iyvk+ejײ!dA qyi~N^\1W1Lag9ɋSʺ̳U"CQ^-!U PzJ|5i{.,'/rR}q?%LcS {Y`;E@{ruO9$/1ZZTg
-I o%0E[FKU$XpU$̽y<<eR{U hJH'u*rC\<Gp1Vګb@ȦU])}C ],}y<[˔TkԜ^byQv]9ZTYapWH*
-`ZC}A=PPZUyʠ[Bh Q`o1HX52<>E m
-<^Ko:2f_Rԟ0d>pWO_]xhC>+ILRG `doBu;&e p].m䕞Нr+zeA 1*L3IG[_ڳMס5E= c&?5p/'>X-O ^uc=wl6uPlp̞$ݸn+!k{>8;3o"д1砻Ǽ~x4~t()P4ZX`EI nFM d\offj
--(.cQiOomh~!]m
-7w.n披Gx
+x[Kϯ`|Tcb+s(Z #ɯOA)rLU.")4
+ZƤ/%Bx uR&/R
+Q6ԌN.9c,IZ 2N#C~,CQ <Ն3 dLIJn'_픑1Af:AN<m!8%ZLL: o P d#>0<EL(F.f_+vG
+W(8v </xb̑R
+tdc|]pMڧ! {kBx("E}+=]P,MV/ZcL
+t~BJKIn`DHN%i_lIѯ`d~
+?_Rp$WWJXxEl1_KennBJ5b_qU=X@j ~qn^F=:i n9)3a0cr@%+xZwrt^rWj~fj{6'2qE7@Q_ &.T1J$OEХBvNr[7MU]2bׅʢm. M6b<7'=O̪m\FPƠvzRM4Pvڭ(ťp * vh;e<[խ 2u}a Mh(JR5@
+T2WTP*V|v[DA VolM̿O`p$J[$&
+M O ܋.ESkcbsOj`fS &9{(I2ݍ~9xVcv1M.M!s{(f=f~p;
+> _3.@ѼeR[~:*=<ڪaZ{L^1ddb/ {_9{fK"$P#9P3~8Cޕy+KùP-P߉toVb
+
endstream
endobj
1148 0 obj <<
@@ -4816,20 +4827,19 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1157 0 obj <<
-/Length 2484
+/Length 2478
/Filter /FlateDecode
>>
stream
-x[K6 %n.6eVw cˎ%wק(QhѲ%
-؋-TUckw^ww_ӈD##%K_2Q"IUۂ#}@^XxSʷ?&3$=Lox/qBFdw.ft^$\0n_~ÞՒ 1Qk:/>nv}Q(^GE s4'`
-~MtSl9,J8->8gH\yk+Y')2dP—CY)ؕl3x3m}^12x2 e9Can":-5 fi#º+f߽*8
-rO+aW])2ؾȢ
-<5ZȭF*Yd] F F7;x m.(6CMFBja{V__k=9OyrϠG{:@A,i:~x@q=Q2K%!qayBuQ‘=&>KW͵ua^xz"T1э᢫y]EF#=tx45 OP5ȅ@q:lS6JB,yl7uV;@mCS1zB؂%u>d8|({a4dIDՓO
-w n&+{ @qm@')zsZ
--Q}=;.;jnaG9lvT9Q+
-(BcVbDv_G1
-y1 ۛ@7!&T&Mc<e]#0q/{Zo f(V^z*\;.&fB.%üY&yӖKsde|
-%DV_Qwj]6g򔇜CB&:{^y55ݿ6YQLbN01B!MyDTIeK?dEO֗ٮ a F/1TwY񟟎jq7;X/7ΑΟuOsnZdkK. &
+x[[o6~ϯУ4,b孧[Icˮ$7=J%YlؗX ?#*ۏﰽoΈH##%_"2R"IMۊ#}@^)[z)^L?D3$3L;9iʣq{?]
+F|{WF<VKplDc; -"D!xc7b$%[f%#!T] )#0KUkR"JJ%\W':qA1DZ$+J7DƁ]vA}ՃA}ݯp(aQ^ QŐzP%S'1yvo1p&Y,©[WD  ^oLp
+ژ0 \\2aG vIB
+~tSl9J8-LQTCٳlAllp.<͵ˬYH(H—cY)ؕl x3}yZk12x2 e9Ca"jӶY=w;戰
+4^ '0ȫɮ8/*2z>@h{
+#v ם
+W%*qdiQ6]nsJ/
+Ji7*iRH|lݏӺ8iJFu{9(
+ N2&tVv&+/R7jU6'y!X$C2wap}og^i.>+&09LAPH)?m~+Uw~-kY#IqwyZ_|6igFW|%XFߐcIߟNjq7Ays{f s:嘕9?s^TP;whg"O5/PW
endstream
endobj
1156 0 obj <<
@@ -4859,23 +4869,16 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1183 0 obj <<
-/Length 1841
+/Length 1840
/Filter /FlateDecode
>>
stream
-xZMF+tUf<%YW\qűy]+iAVN6>=H+ !Ȯx[{z{ ގ~^iddSi)=e(ěg; 8a\v:ܯ*߬c4^'/_#b6Fr/x}{aČ|`Hpc}1.No틋` !$sd1m4!X6:&ŸQ~!n٬ls0:ބa1fbW^_rYI8Hi`;JEYDS}gs]$Lٟ`7c]aaQwVO
- xB$NX.쉦=u`wdKI8iơfk _٬^1RMQ3@v ))Y4)k8\<
-l8'aψgvjyO.tH?.FX 
-
-9Z y斸7) 2
-br
-
-''
-36Pq,T]i#5WX0ɺ\ $Ӟ\ E혣0֦(Q*JQ K6Q=B#\_
-qU?Z"zHR#A͹mL#DŽ+$'i>!ajW
-Н#kIwqQ[j'ڏZeY<L4hat'8|RU1<'6LCP=YgiHfwa.cx_<Qp*v)rD4CJKIӁIW剽yuNݩS϶@1c.o-%PU뀇qC.+d_ n%':C
-K ]rJ"chS@'F@PSl ~
- ){jKw:f}MMĠ|Yg!%|@yM)_SC<9$p'FIb!PM0]!o8}#۴1v;+dnuG?J$99R}Ə.۹OE6WVyZd7DI35V
+xZKF+tUf<oImW\qln^JZPͯOhEB
+p(w#!duHELcv=AVQU4!:$Խlna
+ A! a{'
+eVO,gtlil p³IyGn6#rMB YC_@2{ĉHg$*rlʐd<xk{pqu8vNE;D{2:<Y77O4ⵂLc{$bZ)0z8V|d atxO[۳]ւ$=HMD 0݈Wr4']L
+I-AkDHD#D!2 j+x[uͽp
+x0,r;l!b1{[tsS;𑃂kMpTOz|6hD\&ɧ"񓽛dU5<0qöCRBxlq 4;+gjizY\|!CЭE]{r9:0MfdžtTqw5P}Ѓ @ꪺ=ϝT$ٟ5e&xA jIs5S90j h;w(2 Mtx)nr,FK{qh[ efvrV`{Y_DU qlzt)3g=s-MFJ
endstream
endobj
1182 0 obj <<
@@ -5082,24 +5085,30 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1200 0 obj <<
-/Length 3610
+/Length 3608
/Filter /FlateDecode
>>
stream
-xڵr_GsIi'i$)TU $W%6ɽ
-8d! jZA b-݊@ے| *J(,wݷ)ƈ*a 0%àMS~H:PfE"atN$n8b$т[S[+@cai#-& ChSk@/VP $HJȁ ,VIrJb.Ӽ1˖4'ucl^-l3Y퉐 V L(^xC$!R/\^LiJ#vR"I
-E kpcxT/HwiXI9I$<YYhE1'B
->sZ܀@ڠ5x|"༭Ls
-^-WBkS=:࣪3{:ă=KW=`hY_LTp|&  /|p+{C pGIB-sO *iػx3K ͮg})SQ<qςō:[pf8b(p :i蟫.ϺD.vۧHMN @gua vH}?
-/F8)mڴ.eT1(;d_o-9/i*R![SaLY`QMua<_1&.f9Ok;]W wSp7ouY`z;UmR
-"Dr
-~ὣV܃nGS/^h >$G=ˢŦ]4és ^j:K_&D1EOrb. Xŧ40ѥa@={<<rLSs)3[zFT@}茜qO;tc* Ť[A)egaxloB .#h_ա:XX[PPf Y/S3]-Nl@Ky,8?]~ሪ(]>1$~L<xcqo0?x6b`w"H8MNô՜3>RRmK{Z陇;/KRp3v*^zYDl4-`d'mK1eW@,Q,~{g?YB~GmC
-,Z߻n
-5y1U~ozۻxI2 Js?ԆÁe>!u>Rf vi
-?TֱXXaƵ9{~]Jsy__ 4d壔D|/0Hw2 }r}l}ʦ1B5
-AIU\!cDI(k%1׀LWfy!=%"(
-R=[G0)NM"i3òS.E28]qE!HV(~rj&F_,x{Y
- RQ7S ΩIbR^Y^&suwӅ_!0 |ȒtWɾ5 ^K κj0t0 0uqᘔ`Y֍ cՍ̓.!(S6E4
+xڵ]sݿBRuzi3$Mdnh9EUz lÝH]. kx\7cɵ$zarN4[ܭ.%Wd˻}Un_^q, pOn.w?,D-<ap/w7a0HCe$rQ>;] JD-ؙ
+~U(v'M*Eи4sM$Izޕӝ3#sͻm'6Ȍ!-b %1d]`cB ADYwN6lYM7'7WpƆkq[kPo>Je$B--i(0aVp,̗m0>UnW NJWm]ZXlfKVJp"zZX\m@}h*bM#Ap 2 iqPf]_ٮ=h}X<XpsFrɁq>jS!
+AR
+k |[oϤ{j/p>W?'Aq(1*L2%ގ|Br)-C
+;N
+Cou(QjtV(
+E kpcxTHwiXI㯩<I̞yf(*jrEr~V0)@dy`}K T' eGB9zh҇@AQתs T Z+Agx / mmfCa
+u O뀏H:
+ =CWc`Y_LTp|&  /|p+{C pGC&!Pc]M
+%}ЄfWW3̩
+/FHD޶lZֲoXrK}ѽoNQ4YSaLY`QM'}
+eꘌ4 w6 yZ=uEYo\ 7~7ź,Um?
+ὣV܃_ngc/^ >$.kޞeщP.D!p~x蓗.[Wg)2ht#~ |Q|T>?|4ͺ2te;=^U{{/C_&)9D-E=#*SpTtFRѸ__;tc*Ť[|@WDˮ;د
+F314X|XWζ`^coAu8@I- +kU<N~
+lyw
+x4KA{"be:iG)bb |m,ۋ8rÓ;: gWl6)At khuȬ[=Ŷ
+rC|,yMC/]xtU"RfF׹$6=Ç
+7~ULqʩ6CArF*ceE
+lihՎ4IDxD Q 4{A<` vc'|p+[AO\\]1R4 !FC?&$p>&$HAdZhOʝ/ܿ_= :I ?ݏb\\F$^ ujC@2_Qex)N;ش``>1A #U6<jთnNjBu,V88qcĞߗ\^/ Y$ /F+p<_y(?y mXy!A$*zi"ԤuhT<kP&3RC#TX_o2&
+(۴a9 -
endstream
endobj
1199 0 obj <<
@@ -5156,24 +5165,14 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1207 0 obj <<
-/Length 1856
+/Length 1851
/Filter /FlateDecode
>>
stream
-xZnF}WQ/y)Z 4h- Ebl2JT\;{!EKY$Ť3=3Mד_&_hddDaLHj|2=|&a#Nsݬt6JO_n4/EɯW'TZ#My|<{`ČNȻ 6ɇɟ
-{k/{U}iVI̽bwέc篸&qΓ9\1e~&ˋt_=O46b(2vFtqx:H[z< ~:cx)ݦU|jQ,3yI*L?aL1.
-]gy,7juwaAKA1; đA 1@OO7٪?
-8 ,27+s\#"MjI0A<m@D`Ҝ4]ئ7oOX`QNa đ S\aI ҍ#]L9ADPd9ҳ0DTYG&a ngQ-Q6"vG8r#4 q/iBva
-,luvՁ:gy
- AFkˮj
-ͺ$Y"C|g)[lw .BG<~+FD;] 8`"aH4S0گ}}k*^_wȪL*p]^XJ+Pj ŚҴP2\Mu
-jtmz))FL%b
-hð=$ gn69_ݗ4oM-S}n3Xi@sB,t^t>l(M+<{oVk<dK;ߢBP2nӏk01~3! zeaP
-6t}: -<U)aC^&)j&T5Bj,Sj%r ˔ZI4-KuI)Vd,)E(AG6-jrMz"ii)vy"dg**҅<gL"i3=@l+'|״j**&vpi R, T
-$ CrQM qS
-Kbg {Tbl7ml
-#Ў "26(SYTa GaxHIseHͮ3
-g?w۱&<yѩ2(@%@h ĉ͞ki//` + UXhe8Nt n׻齿!- n~DqoU0YQV" {e Zaʏx 5
+xZێ6}WbK^i- Vv֖MËdɢ/+5<3ΐ]דn&_hddDaLHf2=x&a#Ns]lN.4/Eͭ8!HS,7qgoɣ$\0$N1!ꊨ'X—i(ɑ.-|:{h<S?lHwE>DL/3*"LþfOw9Qx~\j@32]XG9ع44CtQ:`ɨ~W;mg-A@LB.G1
+,m`)= 6X%R*U:q F \*.ĞEޒD,lF.:q x4!0E~yĺ@3Ł<ń #5k6DnH$sAP%Z&E4^㈧OcHRb$L\\ PBvחyʤ[ڈ$XBuЬ!Ma -5dc WJIئ.n:1`̑b$T"6 +Lc!:0qn"f]tskT:Czی(Gaxl9ci,t_t>m(m/<߬q7-|: AɸE?#Я1H944l락;9'@oG<Xz~t*m*0B:H- 
+v\L tg{(SoS12tgZ#%u)f7wE 0q4~2UZTZ!)S0B:( R\GbVejx6~em
+h`;7 l:&BCu'㞼#OzSt{u`۟fpHaLxSmwh+Ejҝ5hb]s:ix2"Y]{ⳟ;\yѩ2h@%@h ̉͞ki//` +<ښ Gi @~zvYEpCR\Ս/P  (CeE
endstream
endobj
1206 0 obj <<
@@ -5209,28 +5208,25 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1217 0 obj <<
-/Length 2974
+/Length 2971
/Filter /FlateDecode
>>
stream
-xڽ\Ys7~ׯGj
-(`9cŢa !1ɏ7?Lo{kebU'ӇDSbJX2O>at<mFӱKz_^|MGӟ!8pUnݻ7o70|&` 1 ͧ?hrP­I^ω(L8a74hM Hk`T' eLWe0J)C:u
-8hiáɄS"(o.[Uwo*4SD >Z
-N
-.%9tq0N%aLWs/׮{!G
- cTx/YŽ%mcKD_9D8Ma1zD-8)QTcz(5
-p
-Ѱn++&
-,tD ?| Iɽa``V2"pJ1˰D^#
- :/+'%YxDs}#yFHVT^&ay!SbaMΉb k4@k]L*+#ѭ -^c\9{8j%8z ʤ?TXvqK:63T)AS kE0 &IFȦGUZ? NLJ1<Ο]36D2ǒb,XxX9 "%sCق
-EgNI#oVG
-ֻi>! @/x`Q
-kU=xysw *~vY ru
-P*c2vG
-:b9Hb0l Qa. 8V/>g'R˭]vE'6WgxzY p p~b&!)U;7_ǫY&npv́鎙AK괄#S\Wƾ|` ݑY;[2j\EޝָVQ ci$e 9>QTrb fbc7.q[@wP.4!\]8ؔ)X ݔ)w*zMæE[ u)W+A`+Mb<Z: Kv
-Ǧ.XˆŸk֊`Y0&P9!߶d
-v gyW>O  Xc ^bOX.@_}@n?
-w1QEmI՟n}]Q}Vv骾':
+xڽ\Ys7~ׯGj
+(`8xaX9쯁@7d<&4۫ZbC)1J%Q,O>Maz
+Ln ̷_cvk:]qs"'Rsʭ{՟W ߤ ; C d|g?'pkWs"$
+N2p ZSҽt? bU(Fh}RP\`*_CV9L9%BvZj[~~VN3E e.@־|J&__fj!|q65lOpyl4O_M;*Qq>]f@/p#.L}G)wO7V)5xf^65]O㕅Nz+Er5h&4Q`kd髗YzNpL#Vki5Y]d r_ŷ=+%(bgl 5e6/bBlrV'
+eDm:rQ\@-TWEP+:cU7H"qCdFpeځ
+$9ts50N%aLs/׮{!G
+(cXxh.Yʒ6Oӱ%X"O/rBeVGKG`0Jp=bMHS)1wFwXxB -7-jNlYz_ԠBc4Ǡ`4lBF+) Q/O'_0HQr/=c!a\k *8WB@:
+ p+wֲhz$4o+X|$,O;pJ,9Qe
+D초,$#sKX
+tQ
+<j*@sMRU\*5?u6lAq/YGO 21։>cw4 pYBtfaZr*K92vx2FURQsw.LjQ@10*꠯,$V&cR^99žorD\dcL5uưx\VW|WNM3xXckk GΌ};#EM-wteXt;6q AHr|Z#&n\je])Tf\hc Ap)S\)WSTlk Ma
+WŎyt`l+M]ֱ%N?7D.` L{s)(wC~㱩m
+Zt"&#`8/uT\:%B  6!Bx 4pviI4 gB+6a7 MaŔ3:AU ૳m0t޼BgDC\cm.M+ly>/"sӏbrd;OsnS?\2'a|#=9uUsPO
+vrӅ3MW馼U&_ܤE(+S` OX.@_}@n?
+(2?Ԗ̡GY9/Շikj7k?_?[uH'
endstream
endobj
1216 0 obj <<
@@ -5310,13 +5306,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1227 0 obj <<
-/Length 307
+/Length 303
/Filter /FlateDecode
>>
stream
-xڕQN0+0k{H@<[C۸R*q!qggv0e7948 ߁EIn,t@i$Tw=JZ۶UnuՁ]>Xw`[
-o3@2=Ҋkfa^:S@ѱA+incon+^7>mL!c(Mڥǥ&'_=t
-(u%n^"[RV͡x؜a;Ne<V0{ p|
+xڕQN0+0#VT ^=[EjRA''Nxvf rSS`Z@q
+\P䌰"f傥Mń[ OsWtjmL%vvK:V.0GJ wIS|{
endstream
endobj
1226 0 obj <<
@@ -5334,14 +5329,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1236 0 obj <<
-/Length 1026
+/Length 1035
/Filter /FlateDecode
>>
stream
-xVێ6}W,9I)-
-4hi@%zM,$~}y-ۛn³̙  ^.K\|Z|2`)`jHJR!R"$*oh <zȡ
-h7DkK$IlS4 _zb(UϜp(Ljy0K BP[\A/qj$Fh]wQ<_Gxo u$۔=gϬ:Z MIf%~F[7MG|MՋ׫>:V3N4l@;LT:7'nE#os/sT#E7=*
-8Z7Sc_2j?a,K1'ʗx.$;SlI(z{')nS;uGa<_\K,@z4OFKZQ+cLJcҜXtyp:o8AX}ۻϚ8N/˶vDp50Z"ו֙3tCلgi<xmƦH{I/BwՂhF2]x4ԟK{wz)Fo Kw6[N(
+xڽVێ6}W,9H)-
+qE4n &V\KN /Zn/³̙ w ^K 1y9q9'FeRdu )IDJ,&|)vGs4L_&@pA<IH
+ q@oQlp'+L3nz% X7xk@^u7"HBUE,bYL$->&hbf2,:mYv{F29_)rB/Ib*~Ez)xLz\/T_Fu^e2;OFAq"fMV&}Ws
+zvݖV)$,mu֍`)sFC_"_"dC"|gJmW/*ڟ9Iq ԋa8 iBor;yO
+_Gh]Qf=^e'rx u[*۔=gϬPpNbByY9ߺgzxz?<<Dtis֡9cS?JSxsb"\*<2WM[i2kQOs*ߡ0U}Kk_fS ~#rAX*Ny8PwEOҹMHB;y~Y3O26~96d{'nH11HvFDIGճ恣!sB<V˶vp5V?ZVוƙ# ucG g9?zM90*awޟV nz}$T|0՝|Kx=W&/}޷um] ev
endstream
endobj
1235 0 obj <<
@@ -5383,9 +5379,9 @@ endobj
1233 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [122.182 409.103 156.068 419.371]
+/Rect [146.104 409.103 179.989 419.371]
/Subtype /Link
-/A << /S /GoTo /D (structident_ad1e271d732662abda25b1320f66e9935) >>
+/A << /S /GoTo /D (structident_a8c2ccc106967f36d7191d59d4d5a65dc) >>
>> endobj
1237 0 obj <<
/D [1235 0 R /XYZ 70.866 789.024 null]
@@ -5428,16 +5424,18 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1246 0 obj <<
-/Length 727
+/Length 723
/Filter /FlateDecode
>>
stream
xڵKS0:C#
-)N8$2uR}ז 1dڤ')꿻?{MtEDJq4Z MQ
-aEhƱ`
-qEz 6y9Փ:+]cE?"
-ǐ`9]!yj}kY !9"G׈3l%DP I'[bɀBKejj1'ePQ+\8C}ʮm LwI!}
-3#rh{cW <I,hL`%w)MZn eί 'q i UBI<qoɴL&Lƶʼn+h{ӹ!EȻ̅ p)~m\p4O2r*(L)?+HBWr =v8, $%t5ǢC("E@y w(:m=p妚ٱ;5oѼ#,:?xR/2ωlr{HW0Nא
+)N_y(~Pǁ$!&%=Iv hލӋT"S8-&(tʰh4GXfth~߳|^'M|^6-IUekE?#
+) 4+ AsBԠβ@Br,EDG_#edm/C5H$A3̓%?ۗ(8բcO 飬(#X)W g"flku20BP#IfFnŐ <I,hL`%s)qEZn ek/N
+$nꄒxRuCk&*2Km%5VPns{M+!γOB sj%m
+0{<, #Q”c)L*V|j;Cp/[FcQv!I܋"J`y`* g(:@Ѷ~8EjSX7nh^?`u8;9'DV6ܾ$_kVN
+
+k
+c}͘[R`{{?oH
endstream
endobj
1245 0 obj <<
@@ -5837,13 +5835,13 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1373 0 obj <<
-/Length 1158
+/Length 1157
/Filter /FlateDecode
>>
stream
-x͚]s8+tif6T w&ͤi;3I!l`h@ncLqe,{ 
-6nFfoܤx[},-<ES.ps0xBA7fNQBw0R5K+mf<J1-OD,PG^ꞹRv NjvJ
-C%
+x͚]s8+tif* лN3n4qgw&0 ,m__ 0Ǝ?xϣ#!@p18~ `6!?!JnʷGc"]F?[jax7|~#f[GQstCSB//XeIA*\@9,& 2~A}'v4,ȑ
+PP7<LW^]mM^x;hǃyN\C|@JT}xLtY%Q+k`1cM͔ےgI=˥ZC o(WYk<j֍t0|,Z![ ݶW?M,wo[Űjݍjv372&VV*KlCo3WNy\Zp0g~g])Nrـ'ߞ:;g4X8'ƭ S6z|ʰ$ںk} h|1yňʽo)$lq;h3GJ)Kd AӲkTNds",ALb ->QVuMβ`&'Ip8/Kjy=DO
+|}D?b
endstream
endobj
1372 0 obj <<
@@ -6338,16 +6336,12 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
1452 0 obj <<
-/Length 998
+/Length 997
/Filter /FlateDecode
>>
stream
-xڵ[6)RCmcnXv^w#
-9IЀ`:o_l`y ؆
-/?7TO4E "GQq|_TIumogeS˨7pAhoF~l6ȫXҖ fˆ%] 욥m f:{F
-6G#J vzQsEN=؁;ah>{i@5i!:0xeQB2qSV53U%KwǚѴG~gRUP|&^ٗfn#hE,:L<|GF|zhO񸢵<gLdTCז1B[S*)<*)+֧,:'49tM 5;d:ЀkauHDYW9txdUQ.W1h#҆)Nf#ٔfMEErT YLN5.ľ-6\jXleA`!4\9)4LM4p-R5Ҭ鮼օPW)
-m^#tΌ?n,!A+WBEKzd3U HgzE)*T,rڶu589^M`9?yV˺gC,] {/b$6B!vMî A\ /vȚ"MWk|vjdag.u61S*Βt1xI40NJ-/x9g;9@ΙqVS͸ݱ _1DЂ#;sNo+X{~_P=")(
-P BqDƳ-u~0u*s{>\dŰKK-h=-v\-]?
+xڵ[8~iմVniWVO |LCK ~{
+O,R=媞 S~9!z~*my?<Kd6RMiT'9,)j2zBmb_C,6cb\ChsRh4 ʨp?p-RΓ5ҬօPW)'ʼFj bҟ Ie R^<RZ#J(HE*S-JH>%^lN:;N-e8s~Av9"uVĤjx hf)M~ĞǽAE]R맰Kb %ËvԲ%I[S%13IJiI˛S詒q%RWb ]<'jbCENw񜳝ɷq s&׳}PzM f\:oh b8!Fo߭n4=wEOBP$EJA(@Ƴ-y~0u,-Y1n}I7We0xw/Pvj~p
endstream
endobj
1451 0 obj <<
@@ -8662,12 +8656,12 @@ endobj
/Limits [(section.4.2) (section.4.7)]
>> endobj
1519 0 obj <<
-/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R]
-/Limits [(section.4.8) (structident_a91db2d18476e0a527ba20e04ca2c3e74)]
+/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1240 0 R]
+/Limits [(section.4.8) (structident_a8c2ccc106967f36d7191d59d4d5a65dc)]
>> endobj
1520 0 obj <<
-/Names [(structident_ad1e271d732662abda25b1320f66e9935) 1240 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R]
-/Limits [(structident_ad1e271d732662abda25b1320f66e9935) (subsection.4.1.1)]
+/Names [(structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R]
+/Limits [(structident_a91db2d18476e0a527ba20e04ca2c3e74) (subsection.4.1.1)]
>> endobj
1521 0 obj <<
/Names [(subsection.4.10.1) 466 0 R (subsection.4.10.2) 470 0 R (subsection.4.2.1) 86 0 R (subsection.4.2.2) 90 0 R (subsection.4.2.3) 118 0 R (subsection.4.3.1) 130 0 R]
@@ -8834,8 +8828,8 @@ endobj
>> endobj
1561 0 obj <<
/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords()
-/CreationDate (D:20130912114258-05'00')
-/ModDate (D:20130912114258-05'00')
+/CreationDate (D:20131213120956-06'00')
+/ModDate (D:20131213120956-06'00')
/Trapped /False
/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6)
>> endobj
@@ -8847,567 +8841,567 @@ xref
0000000004 00000 f
0000000000 00000 f
0000000015 00000 n
-0000056114 00000 n
-0000341492 00000 n
+0000056106 00000 n
+0000341420 00000 n
0000000060 00000 n
0000000304 00000 n
-0000056295 00000 n
-0000341420 00000 n
+0000056287 00000 n
+0000341348 00000 n
0000000351 00000 n
0000000438 00000 n
-0000056417 00000 n
-0000341334 00000 n
+0000056409 00000 n
+0000341262 00000 n
0000000486 00000 n
0000000619 00000 n
-0000059563 00000 n
-0000341248 00000 n
+0000059552 00000 n
+0000341176 00000 n
0000000667 00000 n
0000000873 00000 n
-0000059685 00000 n
-0000341162 00000 n
+0000059674 00000 n
+0000341090 00000 n
0000000921 00000 n
0000001181 00000 n
-0000059807 00000 n
-0000341039 00000 n
+0000059796 00000 n
+0000340967 00000 n
0000001229 00000 n
0000001301 00000 n
-0000063785 00000 n
-0000340941 00000 n
+0000063772 00000 n
+0000340869 00000 n
0000001354 00000 n
0000001522 00000 n
-0000063907 00000 n
-0000340867 00000 n
+0000063894 00000 n
+0000340795 00000 n
0000001580 00000 n
0000001695 00000 n
-0000064029 00000 n
-0000340793 00000 n
+0000064016 00000 n
+0000340721 00000 n
0000001753 00000 n
0000001863 00000 n
-0000064150 00000 n
-0000340707 00000 n
+0000064137 00000 n
+0000340635 00000 n
0000001911 00000 n
0000002031 00000 n
-0000069273 00000 n
-0000340597 00000 n
+0000069261 00000 n
+0000340525 00000 n
0000002079 00000 n
0000002146 00000 n
-0000069394 00000 n
-0000340536 00000 n
+0000069382 00000 n
+0000340464 00000 n
0000002199 00000 n
0000002332 00000 n
-0000073594 00000 n
-0000340411 00000 n
+0000073578 00000 n
+0000340339 00000 n
0000002378 00000 n
0000002468 00000 n
-0000073654 00000 n
-0000340350 00000 n
+0000073638 00000 n
+0000340278 00000 n
0000002516 00000 n
0000002578 00000 n
-0000075353 00000 n
-0000340224 00000 n
+0000075335 00000 n
+0000340152 00000 n
0000002624 00000 n
0000002709 00000 n
-0000075413 00000 n
-0000340163 00000 n
+0000075395 00000 n
+0000340091 00000 n
0000002757 00000 n
0000002837 00000 n
-0000078386 00000 n
-0000340034 00000 n
+0000078366 00000 n
+0000339962 00000 n
0000002883 00000 n
0000003013 00000 n
-0000078507 00000 n
-0000339923 00000 n
+0000078487 00000 n
+0000339851 00000 n
0000003061 00000 n
0000003176 00000 n
-0000078567 00000 n
-0000339862 00000 n
+0000078547 00000 n
+0000339790 00000 n
0000003229 00000 n
0000003359 00000 n
-0000092863 00000 n
-0000339736 00000 n
+0000092831 00000 n
+0000339664 00000 n
0000003407 00000 n
0000003492 00000 n
-0000092923 00000 n
-0000339662 00000 n
+0000092891 00000 n
+0000339590 00000 n
0000003545 00000 n
0000003675 00000 n
-0000092983 00000 n
-0000339536 00000 n
+0000092951 00000 n
+0000339464 00000 n
0000003728 00000 n
0000003911 00000 n
-0000093104 00000 n
-0000339462 00000 n
+0000093072 00000 n
+0000339390 00000 n
0000003969 00000 n
0000004120 00000 n
-0000093225 00000 n
-0000339373 00000 n
+0000093193 00000 n
+0000339301 00000 n
0000004178 00000 n
0000004297 00000 n
-0000093346 00000 n
-0000339282 00000 n
+0000093314 00000 n
+0000339210 00000 n
0000004356 00000 n
0000004503 00000 n
-0000093468 00000 n
-0000339190 00000 n
+0000093436 00000 n
+0000339118 00000 n
0000004562 00000 n
0000004709 00000 n
-0000093590 00000 n
-0000339098 00000 n
+0000093558 00000 n
+0000339026 00000 n
0000004768 00000 n
0000004867 00000 n
-0000093711 00000 n
-0000339020 00000 n
+0000093679 00000 n
+0000338948 00000 n
0000004926 00000 n
0000005030 00000 n
-0000094598 00000 n
-0000338904 00000 n
+0000094563 00000 n
+0000338832 00000 n
0000005084 00000 n
0000005220 00000 n
-0000094720 00000 n
-0000338839 00000 n
+0000094685 00000 n
+0000338767 00000 n
0000005279 00000 n
0000005345 00000 n
-0000096691 00000 n
-0000338709 00000 n
+0000096654 00000 n
+0000338637 00000 n
0000005394 00000 n
0000005525 00000 n
-0000096813 00000 n
-0000338630 00000 n
+0000096776 00000 n
+0000338558 00000 n
0000005579 00000 n
0000005710 00000 n
-0000096874 00000 n
-0000338512 00000 n
+0000096837 00000 n
+0000338440 00000 n
0000005764 00000 n
0000005905 00000 n
-0000096996 00000 n
-0000338447 00000 n
+0000096959 00000 n
+0000338375 00000 n
0000005964 00000 n
0000006092 00000 n
-0000099964 00000 n
-0000338316 00000 n
+0000099925 00000 n
+0000338244 00000 n
0000006141 00000 n
0000006275 00000 n
-0000100086 00000 n
-0000338237 00000 n
+0000100047 00000 n
+0000338165 00000 n
0000006329 00000 n
0000006460 00000 n
-0000100147 00000 n
-0000338119 00000 n
+0000100108 00000 n
+0000338047 00000 n
0000006514 00000 n
0000006655 00000 n
-0000100269 00000 n
-0000338040 00000 n
+0000100230 00000 n
+0000337968 00000 n
0000006714 00000 n
0000006811 00000 n
-0000100452 00000 n
-0000337961 00000 n
+0000100413 00000 n
+0000337889 00000 n
0000006870 00000 n
0000006957 00000 n
-0000106674 00000 n
-0000337830 00000 n
+0000106637 00000 n
+0000337758 00000 n
0000007006 00000 n
0000007143 00000 n
-0000106856 00000 n
-0000337751 00000 n
+0000106819 00000 n
+0000337679 00000 n
0000007197 00000 n
0000007328 00000 n
-0000106917 00000 n
-0000337619 00000 n
+0000106880 00000 n
+0000337547 00000 n
0000007382 00000 n
0000007518 00000 n
-0000107039 00000 n
-0000337554 00000 n
+0000107002 00000 n
+0000337482 00000 n
0000007577 00000 n
0000007658 00000 n
-0000107161 00000 n
-0000337436 00000 n
+0000107124 00000 n
+0000337364 00000 n
0000007712 00000 n
0000007853 00000 n
-0000107281 00000 n
-0000337357 00000 n
+0000107244 00000 n
+0000337285 00000 n
0000007912 00000 n
0000008105 00000 n
-0000107462 00000 n
-0000337264 00000 n
+0000107425 00000 n
+0000337192 00000 n
0000008164 00000 n
0000008284 00000 n
-0000110578 00000 n
-0000337171 00000 n
+0000110537 00000 n
+0000337099 00000 n
0000008343 00000 n
0000008468 00000 n
-0000110761 00000 n
-0000337078 00000 n
+0000110720 00000 n
+0000337006 00000 n
0000008527 00000 n
0000008675 00000 n
-0000110944 00000 n
-0000336985 00000 n
+0000110903 00000 n
+0000336913 00000 n
0000008734 00000 n
0000008892 00000 n
-0000111127 00000 n
-0000336906 00000 n
+0000111086 00000 n
+0000336834 00000 n
0000008951 00000 n
0000009121 00000 n
-0000115787 00000 n
-0000336775 00000 n
+0000115744 00000 n
+0000336703 00000 n
0000009170 00000 n
0000009291 00000 n
-0000115909 00000 n
-0000336696 00000 n
+0000115866 00000 n
+0000336624 00000 n
0000009345 00000 n
0000009476 00000 n
-0000115970 00000 n
-0000336578 00000 n
+0000115927 00000 n
+0000336506 00000 n
0000009530 00000 n
0000009671 00000 n
-0000116092 00000 n
-0000336499 00000 n
+0000116049 00000 n
+0000336427 00000 n
0000009730 00000 n
0000009893 00000 n
-0000116274 00000 n
-0000336406 00000 n
+0000116231 00000 n
+0000336334 00000 n
0000009952 00000 n
0000010110 00000 n
-0000116455 00000 n
-0000336313 00000 n
+0000116412 00000 n
+0000336241 00000 n
0000010169 00000 n
0000010337 00000 n
-0000118576 00000 n
-0000336220 00000 n
+0000118533 00000 n
+0000336148 00000 n
0000010396 00000 n
0000010559 00000 n
-0000118759 00000 n
-0000336141 00000 n
+0000118716 00000 n
+0000336069 00000 n
0000010618 00000 n
0000010748 00000 n
-0000137235 00000 n
-0000336010 00000 n
+0000137190 00000 n
+0000335938 00000 n
0000010797 00000 n
0000010888 00000 n
-0000140969 00000 n
-0000335931 00000 n
+0000140923 00000 n
+0000335859 00000 n
0000010942 00000 n
0000011073 00000 n
-0000141031 00000 n
-0000335799 00000 n
+0000140985 00000 n
+0000335727 00000 n
0000011127 00000 n
0000011311 00000 n
-0000141156 00000 n
-0000335734 00000 n
+0000141110 00000 n
+0000335662 00000 n
0000011370 00000 n
0000011451 00000 n
-0000142478 00000 n
-0000335615 00000 n
+0000142432 00000 n
+0000335543 00000 n
0000011505 00000 n
0000011646 00000 n
-0000142602 00000 n
-0000335536 00000 n
+0000142556 00000 n
+0000335464 00000 n
0000011705 00000 n
0000011817 00000 n
-0000146501 00000 n
-0000335443 00000 n
+0000146450 00000 n
+0000335371 00000 n
0000011876 00000 n
0000012029 00000 n
-0000146689 00000 n
-0000335350 00000 n
+0000146638 00000 n
+0000335278 00000 n
0000012088 00000 n
0000012246 00000 n
-0000146814 00000 n
-0000335257 00000 n
+0000146763 00000 n
+0000335185 00000 n
0000012305 00000 n
0000012458 00000 n
-0000146939 00000 n
-0000335164 00000 n
+0000146888 00000 n
+0000335092 00000 n
0000012517 00000 n
0000012675 00000 n
-0000147063 00000 n
-0000335071 00000 n
+0000147012 00000 n
+0000334999 00000 n
0000012734 00000 n
0000012887 00000 n
-0000147251 00000 n
-0000334978 00000 n
+0000147200 00000 n
+0000334906 00000 n
0000012946 00000 n
0000013104 00000 n
-0000151608 00000 n
-0000334885 00000 n
+0000151555 00000 n
+0000334813 00000 n
0000013163 00000 n
0000013316 00000 n
-0000151733 00000 n
-0000334792 00000 n
+0000151680 00000 n
+0000334720 00000 n
0000013375 00000 n
0000013533 00000 n
-0000151857 00000 n
-0000334699 00000 n
+0000151804 00000 n
+0000334627 00000 n
0000013593 00000 n
0000013746 00000 n
-0000152045 00000 n
-0000334606 00000 n
+0000151992 00000 n
+0000334534 00000 n
0000013806 00000 n
0000013964 00000 n
-0000152170 00000 n
-0000334513 00000 n
+0000152117 00000 n
+0000334441 00000 n
0000014024 00000 n
0000014177 00000 n
-0000152294 00000 n
-0000334420 00000 n
+0000152241 00000 n
+0000334348 00000 n
0000014237 00000 n
0000014395 00000 n
-0000155137 00000 n
-0000334327 00000 n
+0000155083 00000 n
+0000334255 00000 n
0000014455 00000 n
0000014590 00000 n
-0000155324 00000 n
-0000334234 00000 n
+0000155270 00000 n
+0000334162 00000 n
0000014650 00000 n
0000014775 00000 n
-0000155512 00000 n
-0000334141 00000 n
+0000155458 00000 n
+0000334069 00000 n
0000014835 00000 n
0000014965 00000 n
-0000155700 00000 n
-0000334048 00000 n
+0000155646 00000 n
+0000333976 00000 n
0000015025 00000 n
0000015150 00000 n
-0000155888 00000 n
-0000333955 00000 n
+0000155834 00000 n
+0000333883 00000 n
0000015210 00000 n
0000015363 00000 n
-0000156075 00000 n
-0000333862 00000 n
+0000156021 00000 n
+0000333790 00000 n
0000015423 00000 n
0000015589 00000 n
-0000160247 00000 n
-0000333769 00000 n
+0000160192 00000 n
+0000333697 00000 n
0000015649 00000 n
0000015820 00000 n
-0000160372 00000 n
-0000333676 00000 n
+0000160317 00000 n
+0000333604 00000 n
0000015880 00000 n
0000016046 00000 n
-0000160496 00000 n
-0000333583 00000 n
+0000160441 00000 n
+0000333511 00000 n
0000016106 00000 n
0000016277 00000 n
-0000160621 00000 n
-0000333490 00000 n
+0000160566 00000 n
+0000333418 00000 n
0000016337 00000 n
0000016439 00000 n
-0000162587 00000 n
-0000333397 00000 n
+0000162530 00000 n
+0000333325 00000 n
0000016499 00000 n
0000016606 00000 n
-0000162774 00000 n
-0000333318 00000 n
+0000162717 00000 n
+0000333246 00000 n
0000016666 00000 n
0000016768 00000 n
-0000169289 00000 n
-0000333187 00000 n
+0000169233 00000 n
+0000333115 00000 n
0000016817 00000 n
0000016920 00000 n
-0000169414 00000 n
-0000333108 00000 n
+0000169358 00000 n
+0000333036 00000 n
0000016974 00000 n
0000017105 00000 n
-0000169476 00000 n
-0000332990 00000 n
+0000169420 00000 n
+0000332918 00000 n
0000017159 00000 n
0000017300 00000 n
-0000169601 00000 n
-0000332911 00000 n
+0000169545 00000 n
+0000332839 00000 n
0000017359 00000 n
0000017466 00000 n
-0000169788 00000 n
-0000332818 00000 n
+0000169732 00000 n
+0000332746 00000 n
0000017525 00000 n
0000017670 00000 n
-0000169974 00000 n
-0000332725 00000 n
+0000169918 00000 n
+0000332653 00000 n
0000017729 00000 n
0000017912 00000 n
-0000173219 00000 n
-0000332632 00000 n
+0000173165 00000 n
+0000332560 00000 n
0000017971 00000 n
0000018139 00000 n
-0000173407 00000 n
-0000332539 00000 n
+0000173353 00000 n
+0000332467 00000 n
0000018198 00000 n
0000018323 00000 n
-0000173594 00000 n
-0000332446 00000 n
+0000173540 00000 n
+0000332374 00000 n
0000018382 00000 n
0000018545 00000 n
-0000173781 00000 n
-0000332353 00000 n
+0000173727 00000 n
+0000332281 00000 n
0000018604 00000 n
0000018701 00000 n
-0000173968 00000 n
-0000332260 00000 n
+0000173914 00000 n
+0000332188 00000 n
0000018760 00000 n
0000018862 00000 n
-0000177061 00000 n
-0000332181 00000 n
+0000177001 00000 n
+0000332109 00000 n
0000018921 00000 n
0000019061 00000 n
-0000183663 00000 n
-0000332050 00000 n
+0000183602 00000 n
+0000331978 00000 n
0000019110 00000 n
0000019282 00000 n
-0000183788 00000 n
-0000331971 00000 n
+0000183727 00000 n
+0000331899 00000 n
0000019336 00000 n
0000019467 00000 n
-0000183850 00000 n
-0000331839 00000 n
+0000183789 00000 n
+0000331767 00000 n
0000019521 00000 n
0000019657 00000 n
-0000183974 00000 n
-0000331760 00000 n
+0000183913 00000 n
+0000331688 00000 n
0000019716 00000 n
0000019797 00000 n
-0000184099 00000 n
-0000331667 00000 n
+0000184038 00000 n
+0000331595 00000 n
0000019856 00000 n
0000019960 00000 n
-0000184224 00000 n
-0000331574 00000 n
+0000184163 00000 n
+0000331502 00000 n
0000020019 00000 n
0000020095 00000 n
-0000184348 00000 n
-0000331481 00000 n
+0000184287 00000 n
+0000331409 00000 n
0000020154 00000 n
0000020253 00000 n
-0000184472 00000 n
-0000331388 00000 n
+0000184411 00000 n
+0000331316 00000 n
0000020312 00000 n
0000020388 00000 n
-0000189027 00000 n
-0000331309 00000 n
+0000188964 00000 n
+0000331237 00000 n
0000020447 00000 n
0000020546 00000 n
-0000189089 00000 n
-0000331191 00000 n
+0000189026 00000 n
+0000331119 00000 n
0000020600 00000 n
0000020741 00000 n
-0000189214 00000 n
-0000331112 00000 n
+0000189151 00000 n
+0000331040 00000 n
0000020800 00000 n
0000020927 00000 n
-0000189401 00000 n
-0000331019 00000 n
+0000189338 00000 n
+0000330947 00000 n
0000020986 00000 n
0000021161 00000 n
-0000191868 00000 n
-0000330926 00000 n
+0000191800 00000 n
+0000330854 00000 n
0000021220 00000 n
0000021405 00000 n
-0000192056 00000 n
-0000330847 00000 n
+0000191988 00000 n
+0000330775 00000 n
0000021464 00000 n
0000021672 00000 n
-0000196454 00000 n
-0000330730 00000 n
+0000196383 00000 n
+0000330658 00000 n
0000021722 00000 n
0000021828 00000 n
-0000196579 00000 n
-0000330651 00000 n
+0000196508 00000 n
+0000330579 00000 n
0000021883 00000 n
0000022014 00000 n
-0000196640 00000 n
-0000330533 00000 n
+0000196569 00000 n
+0000330461 00000 n
0000022069 00000 n
0000022210 00000 n
-0000196765 00000 n
-0000330454 00000 n
+0000196694 00000 n
+0000330382 00000 n
0000022270 00000 n
0000022441 00000 n
-0000196953 00000 n
-0000330375 00000 n
+0000196882 00000 n
+0000330303 00000 n
0000022501 00000 n
0000022644 00000 n
-0000200172 00000 n
-0000330243 00000 n
+0000200106 00000 n
+0000330171 00000 n
0000022691 00000 n
0000022817 00000 n
-0000200296 00000 n
-0000330139 00000 n
+0000200230 00000 n
+0000330067 00000 n
0000022866 00000 n
0000023010 00000 n
-0000200420 00000 n
-0000330060 00000 n
+0000200354 00000 n
+0000329988 00000 n
0000023064 00000 n
0000023195 00000 n
-0000200482 00000 n
-0000329942 00000 n
+0000200416 00000 n
+0000329870 00000 n
0000023249 00000 n
0000023408 00000 n
-0000200607 00000 n
-0000329863 00000 n
+0000200541 00000 n
+0000329791 00000 n
0000023467 00000 n
0000023520 00000 n
-0000200732 00000 n
-0000329770 00000 n
+0000200666 00000 n
+0000329698 00000 n
0000023579 00000 n
0000023642 00000 n
-0000201978 00000 n
-0000329677 00000 n
+0000201908 00000 n
+0000329605 00000 n
0000023701 00000 n
0000023782 00000 n
-0000202103 00000 n
-0000329584 00000 n
+0000202033 00000 n
+0000329512 00000 n
0000023841 00000 n
0000023922 00000 n
-0000202227 00000 n
-0000329505 00000 n
+0000202157 00000 n
+0000329433 00000 n
0000023981 00000 n
0000024062 00000 n
-0000329425 00000 n
+0000329353 00000 n
0000024121 00000 n
0000024174 00000 n
-0000024559 00000 n
-0000024739 00000 n
+0000024564 00000 n
+0000024744 00000 n
0000024226 00000 n
-0000024678 00000 n
-0000327646 00000 n
-0000327996 00000 n
-0000026198 00000 n
-0000026079 00000 n
-0000024811 00000 n
-0000326935 00000 n
-0000326616 00000 n
-0000027818 00000 n
-0000027968 00000 n
-0000028121 00000 n
-0000028274 00000 n
-0000028427 00000 n
-0000028580 00000 n
-0000028733 00000 n
-0000028891 00000 n
-0000029055 00000 n
-0000029218 00000 n
-0000029371 00000 n
-0000029524 00000 n
-0000029681 00000 n
-0000029831 00000 n
-0000029984 00000 n
-0000030134 00000 n
-0000030286 00000 n
-0000030436 00000 n
-0000030589 00000 n
-0000030748 00000 n
-0000030901 00000 n
-0000031060 00000 n
-0000031219 00000 n
-0000031383 00000 n
-0000031546 00000 n
-0000031710 00000 n
-0000031874 00000 n
-0000032038 00000 n
-0000032198 00000 n
+0000024683 00000 n
+0000327574 00000 n
+0000327924 00000 n
+0000026200 00000 n
+0000026081 00000 n
+0000024816 00000 n
+0000326863 00000 n
+0000326544 00000 n
+0000027820 00000 n
+0000027970 00000 n
+0000028123 00000 n
+0000028276 00000 n
+0000028429 00000 n
+0000028582 00000 n
+0000028735 00000 n
+0000028893 00000 n
+0000029057 00000 n
+0000029220 00000 n
+0000029373 00000 n
+0000029526 00000 n
+0000029683 00000 n
+0000029833 00000 n
+0000029986 00000 n
+0000030136 00000 n
+0000030288 00000 n
+0000030438 00000 n
+0000030591 00000 n
+0000030750 00000 n
+0000030903 00000 n
+0000031062 00000 n
+0000031221 00000 n
+0000031385 00000 n
+0000031548 00000 n
+0000031712 00000 n
+0000031876 00000 n
+0000032040 00000 n
+0000032200 00000 n
0000034267 00000 n
-0000032415 00000 n
-0000027455 00000 n
-0000026296 00000 n
-0000327109 00000 n
-0000032354 00000 n
+0000032417 00000 n
+0000027457 00000 n
+0000026298 00000 n
+0000327037 00000 n
+0000032356 00000 n
0000034431 00000 n
0000034583 00000 n
0000034742 00000 n
@@ -9447,967 +9441,967 @@ xref
0000040207 00000 n
0000040371 00000 n
0000040532 00000 n
-0000042437 00000 n
+0000042431 00000 n
0000040694 00000 n
0000033816 00000 n
-0000032527 00000 n
-0000042601 00000 n
-0000042764 00000 n
-0000042928 00000 n
-0000043093 00000 n
-0000043258 00000 n
-0000043423 00000 n
-0000043588 00000 n
-0000043753 00000 n
-0000043918 00000 n
-0000044082 00000 n
-0000044247 00000 n
-0000044412 00000 n
-0000044576 00000 n
-0000044740 00000 n
-0000044904 00000 n
-0000045068 00000 n
-0000045233 00000 n
-0000045398 00000 n
-0000045563 00000 n
-0000045716 00000 n
-0000045873 00000 n
-0000046032 00000 n
-0000046196 00000 n
-0000046360 00000 n
-0000046523 00000 n
-0000046687 00000 n
-0000046851 00000 n
-0000047014 00000 n
-0000047178 00000 n
-0000047342 00000 n
-0000047506 00000 n
-0000047658 00000 n
-0000047817 00000 n
-0000047975 00000 n
-0000048139 00000 n
-0000048302 00000 n
-0000048464 00000 n
-0000048628 00000 n
-0000048789 00000 n
-0000050348 00000 n
-0000048951 00000 n
-0000041986 00000 n
+0000032529 00000 n
+0000042595 00000 n
+0000042758 00000 n
+0000042922 00000 n
+0000043087 00000 n
+0000043252 00000 n
+0000043417 00000 n
+0000043582 00000 n
+0000043747 00000 n
+0000043912 00000 n
+0000044076 00000 n
+0000044241 00000 n
+0000044406 00000 n
+0000044570 00000 n
+0000044734 00000 n
+0000044898 00000 n
+0000045062 00000 n
+0000045227 00000 n
+0000045392 00000 n
+0000045557 00000 n
+0000045710 00000 n
+0000045867 00000 n
+0000046026 00000 n
+0000046190 00000 n
+0000046354 00000 n
+0000046517 00000 n
+0000046681 00000 n
+0000046845 00000 n
+0000047008 00000 n
+0000047172 00000 n
+0000047336 00000 n
+0000047500 00000 n
+0000047652 00000 n
+0000047811 00000 n
+0000047969 00000 n
+0000048133 00000 n
+0000048296 00000 n
+0000048458 00000 n
+0000048622 00000 n
+0000048783 00000 n
+0000050340 00000 n
+0000048945 00000 n
+0000041980 00000 n
0000040792 00000 n
-0000050507 00000 n
-0000050670 00000 n
-0000050834 00000 n
-0000050998 00000 n
-0000051162 00000 n
-0000051316 00000 n
-0000051476 00000 n
-0000051635 00000 n
-0000051800 00000 n
-0000051964 00000 n
-0000052114 00000 n
-0000052266 00000 n
-0000052425 00000 n
-0000052582 00000 n
-0000052746 00000 n
-0000052910 00000 n
-0000053074 00000 n
-0000053238 00000 n
-0000053402 00000 n
-0000053563 00000 n
-0000050057 00000 n
-0000049049 00000 n
-0000055889 00000 n
-0000056477 00000 n
-0000055750 00000 n
-0000053661 00000 n
-0000056053 00000 n
-0000056173 00000 n
-0000056234 00000 n
-0000326761 00000 n
-0000056355 00000 n
-0000328114 00000 n
-0000059867 00000 n
-0000059321 00000 n
-0000056603 00000 n
-0000059440 00000 n
-0000326471 00000 n
-0000059501 00000 n
-0000059623 00000 n
-0000059745 00000 n
-0000063181 00000 n
-0000063342 00000 n
-0000063499 00000 n
-0000066839 00000 n
-0000064210 00000 n
-0000063026 00000 n
-0000060006 00000 n
-0000063663 00000 n
-0000063724 00000 n
-0000063845 00000 n
-0000063967 00000 n
-0000064089 00000 n
-0000092802 00000 n
-0000096630 00000 n
-0000099903 00000 n
-0000066995 00000 n
-0000067158 00000 n
-0000067319 00000 n
-0000067481 00000 n
-0000067645 00000 n
-0000067805 00000 n
-0000068005 00000 n
-0000068206 00000 n
-0000068358 00000 n
-0000068555 00000 n
-0000068753 00000 n
-0000068952 00000 n
-0000069454 00000 n
-0000066604 00000 n
-0000064336 00000 n
-0000069151 00000 n
-0000069212 00000 n
-0000069333 00000 n
-0000106613 00000 n
-0000115726 00000 n
-0000137173 00000 n
-0000183601 00000 n
-0000169227 00000 n
-0000078446 00000 n
-0000100208 00000 n
-0000100391 00000 n
-0000200234 00000 n
-0000147001 00000 n
-0000151795 00000 n
-0000176999 00000 n
-0000173532 00000 n
-0000070376 00000 n
-0000070196 00000 n
-0000069580 00000 n
-0000070315 00000 n
-0000071058 00000 n
-0000070878 00000 n
-0000070475 00000 n
-0000070997 00000 n
-0000071992 00000 n
-0000072146 00000 n
-0000072300 00000 n
-0000072454 00000 n
-0000072608 00000 n
-0000072762 00000 n
-0000072916 00000 n
-0000073070 00000 n
-0000073224 00000 n
-0000073378 00000 n
-0000073714 00000 n
-0000071781 00000 n
-0000071143 00000 n
-0000073533 00000 n
-0000328232 00000 n
-0000074362 00000 n
-0000074182 00000 n
-0000073800 00000 n
-0000074301 00000 n
-0000074985 00000 n
-0000075138 00000 n
-0000075473 00000 n
-0000074838 00000 n
-0000074447 00000 n
-0000075292 00000 n
-0000076122 00000 n
-0000075942 00000 n
-0000075559 00000 n
-0000076061 00000 n
-0000078627 00000 n
-0000078206 00000 n
-0000076207 00000 n
-0000078325 00000 n
-0000081711 00000 n
-0000081864 00000 n
-0000082018 00000 n
-0000082537 00000 n
-0000081556 00000 n
-0000078766 00000 n
-0000082172 00000 n
-0000082233 00000 n
-0000082294 00000 n
-0000327819 00000 n
-0000082355 00000 n
-0000082416 00000 n
-0000082477 00000 n
-0000084069 00000 n
-0000084222 00000 n
-0000084558 00000 n
-0000083922 00000 n
-0000082690 00000 n
-0000084375 00000 n
-0000084436 00000 n
-0000084497 00000 n
-0000328350 00000 n
-0000085610 00000 n
-0000085430 00000 n
-0000084684 00000 n
-0000085549 00000 n
-0000086610 00000 n
-0000086430 00000 n
-0000085709 00000 n
-0000086549 00000 n
-0000087884 00000 n
-0000087647 00000 n
-0000086709 00000 n
-0000087766 00000 n
-0000087827 00000 n
-0000089410 00000 n
-0000089169 00000 n
-0000088010 00000 n
-0000089288 00000 n
-0000089349 00000 n
-0000091213 00000 n
-0000091366 00000 n
-0000091562 00000 n
-0000091759 00000 n
-0000091955 00000 n
-0000092152 00000 n
-0000092348 00000 n
-0000092544 00000 n
-0000093772 00000 n
-0000091018 00000 n
-0000089563 00000 n
-0000092741 00000 n
-0000093043 00000 n
-0000093164 00000 n
-0000093285 00000 n
-0000093407 00000 n
-0000093529 00000 n
-0000093650 00000 n
-0000094659 00000 n
-0000094781 00000 n
-0000094418 00000 n
-0000093884 00000 n
-0000094537 00000 n
-0000328468 00000 n
-0000096178 00000 n
-0000096372 00000 n
-0000097118 00000 n
-0000096031 00000 n
-0000094893 00000 n
-0000096569 00000 n
-0000096752 00000 n
-0000096935 00000 n
-0000327465 00000 n
-0000097057 00000 n
-0000099044 00000 n
-0000099246 00000 n
-0000099443 00000 n
-0000099645 00000 n
-0000100574 00000 n
-0000098881 00000 n
-0000097258 00000 n
-0000099842 00000 n
-0000100025 00000 n
-0000100330 00000 n
-0000100513 00000 n
-0000103448 00000 n
-0000103641 00000 n
-0000103834 00000 n
-0000104031 00000 n
-0000104223 00000 n
-0000104418 00000 n
-0000104610 00000 n
-0000104802 00000 n
-0000104998 00000 n
-0000105190 00000 n
-0000105387 00000 n
-0000105580 00000 n
-0000105773 00000 n
-0000105969 00000 n
-0000106162 00000 n
-0000106359 00000 n
-0000107584 00000 n
-0000103189 00000 n
-0000100728 00000 n
-0000106552 00000 n
-0000106735 00000 n
-0000106795 00000 n
-0000106978 00000 n
-0000107100 00000 n
-0000107222 00000 n
-0000107340 00000 n
-0000107401 00000 n
-0000107523 00000 n
-0000110883 00000 n
-0000110700 00000 n
-0000110517 00000 n
-0000111066 00000 n
-0000111248 00000 n
-0000110337 00000 n
-0000107738 00000 n
-0000110456 00000 n
-0000110639 00000 n
-0000110822 00000 n
-0000111005 00000 n
-0000111187 00000 n
-0000113694 00000 n
-0000113891 00000 n
-0000114088 00000 n
-0000114286 00000 n
-0000114483 00000 n
-0000114681 00000 n
-0000114877 00000 n
-0000115075 00000 n
-0000115272 00000 n
-0000115469 00000 n
-0000116577 00000 n
-0000113483 00000 n
-0000111402 00000 n
-0000115665 00000 n
-0000115848 00000 n
-0000116031 00000 n
-0000116153 00000 n
-0000116214 00000 n
-0000116334 00000 n
-0000116394 00000 n
-0000116516 00000 n
-0000118515 00000 n
-0000118698 00000 n
-0000118881 00000 n
-0000118335 00000 n
-0000116717 00000 n
-0000118454 00000 n
-0000118637 00000 n
-0000118820 00000 n
-0000328586 00000 n
-0000121651 00000 n
-0000121848 00000 n
-0000122079 00000 n
-0000122310 00000 n
-0000122542 00000 n
-0000122774 00000 n
-0000123005 00000 n
-0000123236 00000 n
-0000123468 00000 n
-0000123700 00000 n
-0000123930 00000 n
-0000124161 00000 n
-0000124392 00000 n
-0000124623 00000 n
-0000124854 00000 n
-0000125086 00000 n
-0000125318 00000 n
-0000125550 00000 n
-0000125781 00000 n
-0000126013 00000 n
-0000126245 00000 n
-0000126477 00000 n
-0000126672 00000 n
-0000126869 00000 n
-0000127067 00000 n
-0000127264 00000 n
-0000127462 00000 n
-0000127658 00000 n
-0000127856 00000 n
-0000128053 00000 n
-0000128251 00000 n
-0000128448 00000 n
-0000128646 00000 n
-0000128842 00000 n
-0000129039 00000 n
-0000129236 00000 n
-0000129434 00000 n
-0000129631 00000 n
-0000129829 00000 n
-0000130026 00000 n
-0000130224 00000 n
-0000130421 00000 n
-0000130619 00000 n
-0000130811 00000 n
-0000131006 00000 n
-0000131202 00000 n
-0000131400 00000 n
-0000131597 00000 n
-0000131795 00000 n
-0000131989 00000 n
-0000132186 00000 n
-0000132384 00000 n
-0000132581 00000 n
-0000132778 00000 n
-0000132976 00000 n
-0000133173 00000 n
-0000133370 00000 n
-0000133567 00000 n
-0000133764 00000 n
-0000133960 00000 n
-0000134158 00000 n
-0000134355 00000 n
-0000134553 00000 n
-0000134750 00000 n
-0000134948 00000 n
-0000135145 00000 n
-0000135344 00000 n
-0000135542 00000 n
-0000135741 00000 n
-0000135939 00000 n
-0000136133 00000 n
-0000136329 00000 n
-0000136528 00000 n
-0000136726 00000 n
-0000136917 00000 n
-0000137422 00000 n
-0000120907 00000 n
-0000119021 00000 n
-0000137110 00000 n
-0000137297 00000 n
-0000137359 00000 n
-0000141093 00000 n
-0000141218 00000 n
-0000141281 00000 n
-0000141344 00000 n
-0000141407 00000 n
-0000141470 00000 n
-0000141533 00000 n
-0000141596 00000 n
-0000141659 00000 n
-0000141722 00000 n
-0000141785 00000 n
-0000141848 00000 n
-0000141911 00000 n
-0000141974 00000 n
-0000142037 00000 n
-0000142100 00000 n
-0000142163 00000 n
-0000142226 00000 n
-0000142289 00000 n
-0000142352 00000 n
-0000142415 00000 n
-0000160558 00000 n
-0000155261 00000 n
-0000160746 00000 n
-0000155449 00000 n
-0000142540 00000 n
-0000152356 00000 n
-0000162711 00000 n
-0000155637 00000 n
-0000155825 00000 n
-0000147188 00000 n
-0000147313 00000 n
-0000151670 00000 n
-0000151982 00000 n
-0000152107 00000 n
-0000152232 00000 n
-0000146438 00000 n
-0000146751 00000 n
-0000146626 00000 n
-0000146876 00000 n
-0000156013 00000 n
-0000160184 00000 n
-0000160309 00000 n
-0000160433 00000 n
-0000140313 00000 n
-0000140512 00000 n
-0000140709 00000 n
-0000142725 00000 n
-0000140152 00000 n
-0000137535 00000 n
-0000140906 00000 n
-0000327286 00000 n
-0000142663 00000 n
-0000145585 00000 n
-0000145783 00000 n
-0000145981 00000 n
-0000146179 00000 n
-0000147375 00000 n
-0000145415 00000 n
-0000142895 00000 n
-0000146375 00000 n
-0000146563 00000 n
-0000147125 00000 n
-0000150558 00000 n
-0000150756 00000 n
-0000150954 00000 n
-0000151151 00000 n
-0000151349 00000 n
-0000152418 00000 n
-0000150379 00000 n
-0000147530 00000 n
-0000151545 00000 n
-0000151919 00000 n
-0000156136 00000 n
-0000154952 00000 n
-0000152559 00000 n
-0000155074 00000 n
-0000155199 00000 n
-0000155386 00000 n
-0000155574 00000 n
-0000155762 00000 n
-0000155950 00000 n
-0000159464 00000 n
-0000159662 00000 n
-0000159860 00000 n
-0000160808 00000 n
-0000159302 00000 n
-0000156291 00000 n
-0000160058 00000 n
-0000160121 00000 n
-0000160683 00000 n
-0000328709 00000 n
-0000162898 00000 n
-0000162401 00000 n
-0000160963 00000 n
-0000162524 00000 n
-0000162649 00000 n
-0000162835 00000 n
-0000165584 00000 n
-0000165785 00000 n
-0000165982 00000 n
-0000166183 00000 n
-0000166380 00000 n
-0000166579 00000 n
-0000166776 00000 n
-0000166977 00000 n
-0000167175 00000 n
-0000167374 00000 n
-0000167571 00000 n
-0000167771 00000 n
-0000167969 00000 n
-0000168170 00000 n
-0000168368 00000 n
-0000168568 00000 n
-0000168765 00000 n
-0000168966 00000 n
-0000170097 00000 n
-0000165287 00000 n
-0000163053 00000 n
-0000169164 00000 n
-0000169351 00000 n
-0000169538 00000 n
-0000169663 00000 n
-0000169725 00000 n
-0000169849 00000 n
-0000169912 00000 n
-0000170034 00000 n
-0000173718 00000 n
-0000173156 00000 n
-0000173906 00000 n
-0000173344 00000 n
-0000174029 00000 n
-0000172970 00000 n
-0000170238 00000 n
-0000173093 00000 n
-0000173281 00000 n
-0000173469 00000 n
-0000173656 00000 n
-0000173843 00000 n
-0000177186 00000 n
-0000176750 00000 n
-0000174184 00000 n
-0000176873 00000 n
-0000176936 00000 n
-0000177123 00000 n
-0000179565 00000 n
-0000179763 00000 n
-0000179961 00000 n
-0000180160 00000 n
-0000180358 00000 n
-0000180556 00000 n
-0000180755 00000 n
-0000180954 00000 n
-0000181153 00000 n
-0000181351 00000 n
-0000181550 00000 n
-0000181747 00000 n
-0000181946 00000 n
-0000182145 00000 n
-0000182344 00000 n
-0000182543 00000 n
-0000182742 00000 n
-0000182941 00000 n
-0000183140 00000 n
-0000183339 00000 n
-0000184596 00000 n
-0000179250 00000 n
-0000177327 00000 n
-0000183538 00000 n
-0000183725 00000 n
-0000183911 00000 n
-0000184036 00000 n
-0000184161 00000 n
-0000184286 00000 n
-0000184410 00000 n
-0000184534 00000 n
-0000189151 00000 n
-0000191805 00000 n
-0000189338 00000 n
-0000191993 00000 n
-0000188568 00000 n
-0000188767 00000 n
-0000189526 00000 n
-0000188415 00000 n
-0000184723 00000 n
-0000188964 00000 n
-0000189276 00000 n
+0000050499 00000 n
+0000050662 00000 n
+0000050826 00000 n
+0000050990 00000 n
+0000051154 00000 n
+0000051308 00000 n
+0000051468 00000 n
+0000051627 00000 n
+0000051792 00000 n
+0000051956 00000 n
+0000052106 00000 n
+0000052258 00000 n
+0000052417 00000 n
+0000052574 00000 n
+0000052738 00000 n
+0000052902 00000 n
+0000053066 00000 n
+0000053230 00000 n
+0000053394 00000 n
+0000053555 00000 n
+0000050049 00000 n
+0000049043 00000 n
+0000055881 00000 n
+0000056469 00000 n
+0000055742 00000 n
+0000053653 00000 n
+0000056045 00000 n
+0000056165 00000 n
+0000056226 00000 n
+0000326689 00000 n
+0000056347 00000 n
+0000328042 00000 n
+0000059856 00000 n
+0000059310 00000 n
+0000056595 00000 n
+0000059429 00000 n
+0000326399 00000 n
+0000059490 00000 n
+0000059612 00000 n
+0000059734 00000 n
+0000063168 00000 n
+0000063329 00000 n
+0000063486 00000 n
+0000066827 00000 n
+0000064197 00000 n
+0000063013 00000 n
+0000059995 00000 n
+0000063650 00000 n
+0000063711 00000 n
+0000063832 00000 n
+0000063954 00000 n
+0000064076 00000 n
+0000092770 00000 n
+0000096593 00000 n
+0000099864 00000 n
+0000066983 00000 n
+0000067146 00000 n
+0000067307 00000 n
+0000067469 00000 n
+0000067633 00000 n
+0000067793 00000 n
+0000067993 00000 n
+0000068194 00000 n
+0000068346 00000 n
+0000068543 00000 n
+0000068741 00000 n
+0000068940 00000 n
+0000069442 00000 n
+0000066592 00000 n
+0000064323 00000 n
+0000069139 00000 n
+0000069200 00000 n
+0000069321 00000 n
+0000106576 00000 n
+0000115683 00000 n
+0000137128 00000 n
+0000183540 00000 n
+0000169171 00000 n
+0000078426 00000 n
+0000100169 00000 n
+0000100352 00000 n
+0000200168 00000 n
+0000146950 00000 n
+0000151742 00000 n
+0000176939 00000 n
+0000173478 00000 n
+0000070363 00000 n
+0000070183 00000 n
+0000069568 00000 n
+0000070302 00000 n
+0000071042 00000 n
+0000070862 00000 n
+0000070462 00000 n
+0000070981 00000 n
+0000071976 00000 n
+0000072130 00000 n
+0000072284 00000 n
+0000072438 00000 n
+0000072592 00000 n
+0000072746 00000 n
+0000072900 00000 n
+0000073054 00000 n
+0000073208 00000 n
+0000073362 00000 n
+0000073698 00000 n
+0000071765 00000 n
+0000071127 00000 n
+0000073517 00000 n
+0000328160 00000 n
+0000074344 00000 n
+0000074164 00000 n
+0000073784 00000 n
+0000074283 00000 n
+0000074967 00000 n
+0000075120 00000 n
+0000075455 00000 n
+0000074820 00000 n
+0000074429 00000 n
+0000075274 00000 n
+0000076102 00000 n
+0000075922 00000 n
+0000075541 00000 n
+0000076041 00000 n
+0000078607 00000 n
+0000078186 00000 n
+0000076187 00000 n
+0000078305 00000 n
+0000081692 00000 n
+0000081845 00000 n
+0000081999 00000 n
+0000082518 00000 n
+0000081537 00000 n
+0000078746 00000 n
+0000082153 00000 n
+0000082214 00000 n
+0000082275 00000 n
+0000327747 00000 n
+0000082336 00000 n
+0000082397 00000 n
+0000082458 00000 n
+0000084048 00000 n
+0000084201 00000 n
+0000084537 00000 n
+0000083901 00000 n
+0000082671 00000 n
+0000084354 00000 n
+0000084415 00000 n
+0000084476 00000 n
+0000328278 00000 n
+0000085587 00000 n
+0000085407 00000 n
+0000084663 00000 n
+0000085526 00000 n
+0000086585 00000 n
+0000086405 00000 n
+0000085686 00000 n
+0000086524 00000 n
+0000087856 00000 n
+0000087619 00000 n
+0000086684 00000 n
+0000087738 00000 n
+0000087799 00000 n
+0000089376 00000 n
+0000089135 00000 n
+0000087982 00000 n
+0000089254 00000 n
+0000089315 00000 n
+0000091181 00000 n
+0000091334 00000 n
+0000091530 00000 n
+0000091727 00000 n
+0000091923 00000 n
+0000092120 00000 n
+0000092316 00000 n
+0000092512 00000 n
+0000093740 00000 n
+0000090986 00000 n
+0000089529 00000 n
+0000092709 00000 n
+0000093011 00000 n
+0000093132 00000 n
+0000093253 00000 n
+0000093375 00000 n
+0000093497 00000 n
+0000093618 00000 n
+0000094624 00000 n
+0000094746 00000 n
+0000094383 00000 n
+0000093852 00000 n
+0000094502 00000 n
+0000328396 00000 n
+0000096141 00000 n
+0000096335 00000 n
+0000097081 00000 n
+0000095994 00000 n
+0000094858 00000 n
+0000096532 00000 n
+0000096715 00000 n
+0000096898 00000 n
+0000327393 00000 n
+0000097020 00000 n
+0000099005 00000 n
+0000099207 00000 n
+0000099404 00000 n
+0000099606 00000 n
+0000100535 00000 n
+0000098842 00000 n
+0000097221 00000 n
+0000099803 00000 n
+0000099986 00000 n
+0000100291 00000 n
+0000100474 00000 n
+0000103411 00000 n
+0000103604 00000 n
+0000103797 00000 n
+0000103994 00000 n
+0000104186 00000 n
+0000104381 00000 n
+0000104573 00000 n
+0000104765 00000 n
+0000104961 00000 n
+0000105153 00000 n
+0000105350 00000 n
+0000105543 00000 n
+0000105736 00000 n
+0000105932 00000 n
+0000106125 00000 n
+0000106322 00000 n
+0000107547 00000 n
+0000103152 00000 n
+0000100689 00000 n
+0000106515 00000 n
+0000106698 00000 n
+0000106758 00000 n
+0000106941 00000 n
+0000107063 00000 n
+0000107185 00000 n
+0000107303 00000 n
+0000107364 00000 n
+0000107486 00000 n
+0000110842 00000 n
+0000110659 00000 n
+0000110476 00000 n
+0000111025 00000 n
+0000111207 00000 n
+0000110296 00000 n
+0000107701 00000 n
+0000110415 00000 n
+0000110598 00000 n
+0000110781 00000 n
+0000110964 00000 n
+0000111146 00000 n
+0000113651 00000 n
+0000113848 00000 n
+0000114045 00000 n
+0000114243 00000 n
+0000114440 00000 n
+0000114638 00000 n
+0000114834 00000 n
+0000115032 00000 n
+0000115229 00000 n
+0000115426 00000 n
+0000116534 00000 n
+0000113440 00000 n
+0000111361 00000 n
+0000115622 00000 n
+0000115805 00000 n
+0000115988 00000 n
+0000116110 00000 n
+0000116171 00000 n
+0000116291 00000 n
+0000116351 00000 n
+0000116473 00000 n
+0000118472 00000 n
+0000118655 00000 n
+0000118838 00000 n
+0000118292 00000 n
+0000116674 00000 n
+0000118411 00000 n
+0000118594 00000 n
+0000118777 00000 n
+0000328514 00000 n
+0000121606 00000 n
+0000121803 00000 n
+0000122034 00000 n
+0000122265 00000 n
+0000122497 00000 n
+0000122729 00000 n
+0000122960 00000 n
+0000123191 00000 n
+0000123423 00000 n
+0000123655 00000 n
+0000123885 00000 n
+0000124116 00000 n
+0000124347 00000 n
+0000124578 00000 n
+0000124809 00000 n
+0000125041 00000 n
+0000125273 00000 n
+0000125505 00000 n
+0000125736 00000 n
+0000125968 00000 n
+0000126200 00000 n
+0000126432 00000 n
+0000126627 00000 n
+0000126824 00000 n
+0000127022 00000 n
+0000127219 00000 n
+0000127417 00000 n
+0000127613 00000 n
+0000127811 00000 n
+0000128008 00000 n
+0000128206 00000 n
+0000128403 00000 n
+0000128601 00000 n
+0000128797 00000 n
+0000128994 00000 n
+0000129191 00000 n
+0000129389 00000 n
+0000129586 00000 n
+0000129784 00000 n
+0000129981 00000 n
+0000130179 00000 n
+0000130376 00000 n
+0000130574 00000 n
+0000130766 00000 n
+0000130961 00000 n
+0000131157 00000 n
+0000131355 00000 n
+0000131552 00000 n
+0000131750 00000 n
+0000131944 00000 n
+0000132141 00000 n
+0000132339 00000 n
+0000132536 00000 n
+0000132733 00000 n
+0000132931 00000 n
+0000133128 00000 n
+0000133325 00000 n
+0000133522 00000 n
+0000133719 00000 n
+0000133915 00000 n
+0000134113 00000 n
+0000134310 00000 n
+0000134508 00000 n
+0000134705 00000 n
+0000134903 00000 n
+0000135100 00000 n
+0000135299 00000 n
+0000135497 00000 n
+0000135696 00000 n
+0000135894 00000 n
+0000136088 00000 n
+0000136284 00000 n
+0000136483 00000 n
+0000136681 00000 n
+0000136872 00000 n
+0000137377 00000 n
+0000120862 00000 n
+0000118978 00000 n
+0000137065 00000 n
+0000137252 00000 n
+0000137314 00000 n
+0000141047 00000 n
+0000141172 00000 n
+0000141235 00000 n
+0000141298 00000 n
+0000141361 00000 n
+0000141424 00000 n
+0000141487 00000 n
+0000141550 00000 n
+0000141613 00000 n
+0000141676 00000 n
+0000141739 00000 n
+0000141802 00000 n
+0000141865 00000 n
+0000141928 00000 n
+0000141991 00000 n
+0000142054 00000 n
+0000142117 00000 n
+0000142180 00000 n
+0000142243 00000 n
+0000142306 00000 n
+0000142369 00000 n
+0000160503 00000 n
+0000155207 00000 n
+0000160691 00000 n
+0000155395 00000 n
+0000142494 00000 n
+0000152303 00000 n
+0000162654 00000 n
+0000155583 00000 n
+0000155771 00000 n
+0000147137 00000 n
+0000147262 00000 n
+0000151617 00000 n
+0000151929 00000 n
+0000152054 00000 n
+0000152179 00000 n
+0000146387 00000 n
+0000146700 00000 n
+0000146575 00000 n
+0000146825 00000 n
+0000155959 00000 n
+0000160129 00000 n
+0000160254 00000 n
+0000160378 00000 n
+0000140267 00000 n
+0000140466 00000 n
+0000140663 00000 n
+0000142679 00000 n
+0000140106 00000 n
+0000137490 00000 n
+0000140860 00000 n
+0000327214 00000 n
+0000142617 00000 n
+0000145534 00000 n
+0000145732 00000 n
+0000145930 00000 n
+0000146128 00000 n
+0000147324 00000 n
+0000145364 00000 n
+0000142849 00000 n
+0000146324 00000 n
+0000146512 00000 n
+0000147074 00000 n
+0000150505 00000 n
+0000150703 00000 n
+0000150901 00000 n
+0000151098 00000 n
+0000151296 00000 n
+0000152365 00000 n
+0000150326 00000 n
+0000147479 00000 n
+0000151492 00000 n
+0000151866 00000 n
+0000156082 00000 n
+0000154898 00000 n
+0000152506 00000 n
+0000155020 00000 n
+0000155145 00000 n
+0000155332 00000 n
+0000155520 00000 n
+0000155708 00000 n
+0000155896 00000 n
+0000159409 00000 n
+0000159607 00000 n
+0000159805 00000 n
+0000160753 00000 n
+0000159247 00000 n
+0000156237 00000 n
+0000160003 00000 n
+0000160066 00000 n
+0000160628 00000 n
+0000328637 00000 n
+0000162841 00000 n
+0000162344 00000 n
+0000160908 00000 n
+0000162467 00000 n
+0000162592 00000 n
+0000162778 00000 n
+0000165528 00000 n
+0000165729 00000 n
+0000165926 00000 n
+0000166127 00000 n
+0000166324 00000 n
+0000166523 00000 n
+0000166720 00000 n
+0000166921 00000 n
+0000167119 00000 n
+0000167318 00000 n
+0000167515 00000 n
+0000167715 00000 n
+0000167913 00000 n
+0000168114 00000 n
+0000168312 00000 n
+0000168512 00000 n
+0000168709 00000 n
+0000168910 00000 n
+0000170041 00000 n
+0000165231 00000 n
+0000162996 00000 n
+0000169108 00000 n
+0000169295 00000 n
+0000169482 00000 n
+0000169607 00000 n
+0000169669 00000 n
+0000169793 00000 n
+0000169856 00000 n
+0000169978 00000 n
+0000173664 00000 n
+0000173102 00000 n
+0000173852 00000 n
+0000173290 00000 n
+0000173975 00000 n
+0000172916 00000 n
+0000170182 00000 n
+0000173039 00000 n
+0000173227 00000 n
+0000173415 00000 n
+0000173602 00000 n
+0000173789 00000 n
+0000177126 00000 n
+0000176690 00000 n
+0000174130 00000 n
+0000176813 00000 n
+0000176876 00000 n
+0000177063 00000 n
+0000179504 00000 n
+0000179702 00000 n
+0000179900 00000 n
+0000180099 00000 n
+0000180297 00000 n
+0000180495 00000 n
+0000180694 00000 n
+0000180893 00000 n
+0000181092 00000 n
+0000181290 00000 n
+0000181489 00000 n
+0000181686 00000 n
+0000181885 00000 n
+0000182084 00000 n
+0000182283 00000 n
+0000182482 00000 n
+0000182681 00000 n
+0000182880 00000 n
+0000183079 00000 n
+0000183278 00000 n
+0000184535 00000 n
+0000179189 00000 n
+0000177267 00000 n
+0000183477 00000 n
+0000183664 00000 n
+0000183850 00000 n
+0000183975 00000 n
+0000184100 00000 n
+0000184225 00000 n
+0000184349 00000 n
+0000184473 00000 n
+0000189088 00000 n
+0000191737 00000 n
+0000189275 00000 n
+0000191925 00000 n
+0000188505 00000 n
+0000188704 00000 n
0000189463 00000 n
-0000328834 00000 n
-0000192181 00000 n
-0000191619 00000 n
-0000189681 00000 n
-0000191742 00000 n
-0000191930 00000 n
-0000192118 00000 n
-0000195549 00000 n
-0000195741 00000 n
-0000195939 00000 n
-0000196131 00000 n
-0000197078 00000 n
-0000195378 00000 n
-0000192322 00000 n
-0000196328 00000 n
-0000196391 00000 n
-0000196516 00000 n
-0000196702 00000 n
-0000196827 00000 n
-0000196890 00000 n
-0000197015 00000 n
-0000197794 00000 n
-0000197608 00000 n
-0000197219 00000 n
-0000197731 00000 n
-0000199168 00000 n
-0000199356 00000 n
-0000199544 00000 n
-0000199732 00000 n
-0000199920 00000 n
-0000200856 00000 n
-0000198988 00000 n
-0000197880 00000 n
-0000200109 00000 n
-0000200358 00000 n
-0000200544 00000 n
-0000200669 00000 n
-0000200794 00000 n
-0000202040 00000 n
-0000202164 00000 n
-0000202289 00000 n
-0000201792 00000 n
-0000200983 00000 n
-0000201915 00000 n
-0000203848 00000 n
-0000203999 00000 n
-0000204150 00000 n
-0000204300 00000 n
-0000204451 00000 n
-0000204601 00000 n
-0000204752 00000 n
-0000204902 00000 n
-0000205053 00000 n
-0000205204 00000 n
-0000205355 00000 n
-0000205506 00000 n
-0000205657 00000 n
-0000205808 00000 n
-0000205959 00000 n
-0000206110 00000 n
-0000206261 00000 n
-0000206411 00000 n
-0000206562 00000 n
-0000206713 00000 n
-0000206863 00000 n
-0000207014 00000 n
-0000207165 00000 n
-0000207316 00000 n
-0000207465 00000 n
-0000207615 00000 n
-0000207766 00000 n
-0000207917 00000 n
-0000208068 00000 n
-0000208219 00000 n
-0000208370 00000 n
-0000208521 00000 n
-0000208672 00000 n
-0000208823 00000 n
-0000208974 00000 n
-0000209124 00000 n
-0000209275 00000 n
-0000209425 00000 n
-0000209576 00000 n
-0000209726 00000 n
-0000209877 00000 n
-0000210028 00000 n
-0000210179 00000 n
-0000210330 00000 n
-0000210481 00000 n
-0000210632 00000 n
-0000210783 00000 n
-0000210934 00000 n
-0000211083 00000 n
-0000211295 00000 n
-0000203272 00000 n
-0000202402 00000 n
-0000211232 00000 n
-0000328959 00000 n
-0000213369 00000 n
-0000213520 00000 n
-0000213671 00000 n
-0000213820 00000 n
-0000213969 00000 n
-0000214119 00000 n
-0000214270 00000 n
-0000214421 00000 n
-0000214571 00000 n
-0000214722 00000 n
-0000214873 00000 n
-0000215024 00000 n
-0000215175 00000 n
-0000215326 00000 n
-0000215477 00000 n
-0000215625 00000 n
-0000215775 00000 n
-0000215925 00000 n
-0000216076 00000 n
-0000216227 00000 n
-0000216378 00000 n
-0000216529 00000 n
-0000216680 00000 n
-0000216831 00000 n
-0000216982 00000 n
-0000217132 00000 n
-0000217282 00000 n
-0000217433 00000 n
-0000217584 00000 n
-0000217735 00000 n
-0000217886 00000 n
-0000218037 00000 n
-0000218188 00000 n
-0000218338 00000 n
-0000218487 00000 n
-0000218637 00000 n
-0000218788 00000 n
-0000218939 00000 n
-0000219090 00000 n
-0000219241 00000 n
-0000219392 00000 n
-0000219543 00000 n
-0000219694 00000 n
-0000219845 00000 n
-0000219995 00000 n
-0000220146 00000 n
-0000220297 00000 n
-0000220448 00000 n
-0000220599 00000 n
-0000220749 00000 n
-0000220900 00000 n
-0000221050 00000 n
-0000221201 00000 n
-0000221351 00000 n
-0000221502 00000 n
-0000221653 00000 n
-0000221804 00000 n
-0000221954 00000 n
-0000222103 00000 n
-0000222253 00000 n
-0000222404 00000 n
-0000222555 00000 n
-0000222706 00000 n
-0000222857 00000 n
-0000223008 00000 n
-0000223159 00000 n
-0000223309 00000 n
-0000223458 00000 n
-0000225668 00000 n
-0000223670 00000 n
-0000212622 00000 n
-0000211382 00000 n
-0000223607 00000 n
-0000225819 00000 n
-0000225969 00000 n
-0000226119 00000 n
-0000226270 00000 n
-0000226419 00000 n
-0000226570 00000 n
-0000226721 00000 n
-0000226871 00000 n
-0000227022 00000 n
-0000227173 00000 n
-0000227323 00000 n
-0000227474 00000 n
-0000227625 00000 n
-0000227776 00000 n
-0000227927 00000 n
-0000228076 00000 n
-0000228226 00000 n
-0000228377 00000 n
-0000228528 00000 n
-0000228679 00000 n
-0000228830 00000 n
-0000228980 00000 n
-0000229131 00000 n
-0000229282 00000 n
-0000229433 00000 n
-0000229583 00000 n
-0000229734 00000 n
-0000229885 00000 n
-0000230034 00000 n
-0000230183 00000 n
-0000230334 00000 n
-0000230484 00000 n
-0000230635 00000 n
-0000230786 00000 n
-0000230937 00000 n
-0000231088 00000 n
-0000231239 00000 n
-0000231390 00000 n
-0000231541 00000 n
-0000231692 00000 n
-0000231843 00000 n
-0000231994 00000 n
-0000232145 00000 n
-0000232296 00000 n
-0000232447 00000 n
-0000232598 00000 n
-0000232747 00000 n
-0000232897 00000 n
-0000233047 00000 n
-0000233197 00000 n
-0000233347 00000 n
-0000233498 00000 n
-0000233648 00000 n
-0000233799 00000 n
-0000233949 00000 n
-0000234098 00000 n
-0000234247 00000 n
-0000234398 00000 n
-0000234548 00000 n
-0000234699 00000 n
-0000234849 00000 n
-0000235000 00000 n
-0000235150 00000 n
-0000235301 00000 n
-0000235451 00000 n
-0000235602 00000 n
-0000235753 00000 n
-0000235904 00000 n
-0000236055 00000 n
-0000236204 00000 n
-0000236354 00000 n
-0000236505 00000 n
-0000236654 00000 n
-0000236805 00000 n
-0000236955 00000 n
-0000237169 00000 n
-0000224849 00000 n
-0000223769 00000 n
-0000237106 00000 n
-0000325937 00000 n
-0000237268 00000 n
-0000237388 00000 n
-0000237860 00000 n
-0000238333 00000 n
-0000238369 00000 n
-0000238761 00000 n
-0000239421 00000 n
-0000240022 00000 n
-0000240563 00000 n
-0000241229 00000 n
-0000243038 00000 n
-0000243273 00000 n
-0000244846 00000 n
-0000245096 00000 n
-0000263088 00000 n
-0000263618 00000 n
-0000275575 00000 n
-0000276011 00000 n
-0000289174 00000 n
-0000289629 00000 n
-0000297760 00000 n
-0000298048 00000 n
-0000306311 00000 n
-0000306612 00000 n
-0000318991 00000 n
-0000319626 00000 n
-0000325634 00000 n
-0000329057 00000 n
-0000329177 00000 n
-0000329276 00000 n
-0000329349 00000 n
-0000341602 00000 n
-0000341785 00000 n
-0000342171 00000 n
-0000342677 00000 n
-0000343122 00000 n
-0000343573 00000 n
-0000344149 00000 n
-0000344658 00000 n
-0000345148 00000 n
-0000345640 00000 n
-0000346131 00000 n
-0000346691 00000 n
-0000347252 00000 n
-0000347813 00000 n
-0000348373 00000 n
-0000349104 00000 n
-0000349937 00000 n
-0000350770 00000 n
-0000351375 00000 n
-0000351647 00000 n
-0000351871 00000 n
-0000352042 00000 n
-0000352212 00000 n
-0000352385 00000 n
-0000352560 00000 n
-0000352737 00000 n
-0000352912 00000 n
-0000353080 00000 n
-0000353274 00000 n
-0000353480 00000 n
-0000353675 00000 n
-0000353871 00000 n
-0000354071 00000 n
-0000354273 00000 n
-0000354580 00000 n
-0000354939 00000 n
-0000355183 00000 n
-0000355426 00000 n
-0000355669 00000 n
-0000355912 00000 n
-0000356193 00000 n
-0000356476 00000 n
-0000356759 00000 n
-0000357042 00000 n
-0000357328 00000 n
-0000357619 00000 n
-0000357909 00000 n
-0000358196 00000 n
-0000358479 00000 n
-0000358762 00000 n
-0000359045 00000 n
-0000359328 00000 n
-0000359577 00000 n
-0000359772 00000 n
-0000359970 00000 n
-0000360171 00000 n
-0000360370 00000 n
-0000360571 00000 n
-0000360770 00000 n
-0000360962 00000 n
-0000361049 00000 n
-0000361217 00000 n
-0000361431 00000 n
-0000361606 00000 n
-0000361735 00000 n
-0000361854 00000 n
-0000361982 00000 n
-0000362121 00000 n
-0000362265 00000 n
-0000362398 00000 n
-0000362519 00000 n
-0000362646 00000 n
-0000362755 00000 n
-0000362839 00000 n
-0000362879 00000 n
-0000363079 00000 n
+0000188352 00000 n
+0000184662 00000 n
+0000188901 00000 n
+0000189213 00000 n
+0000189400 00000 n
+0000328762 00000 n
+0000192113 00000 n
+0000191551 00000 n
+0000189618 00000 n
+0000191674 00000 n
+0000191862 00000 n
+0000192050 00000 n
+0000195478 00000 n
+0000195670 00000 n
+0000195868 00000 n
+0000196060 00000 n
+0000197007 00000 n
+0000195307 00000 n
+0000192254 00000 n
+0000196257 00000 n
+0000196320 00000 n
+0000196445 00000 n
+0000196631 00000 n
+0000196756 00000 n
+0000196819 00000 n
+0000196944 00000 n
+0000197719 00000 n
+0000197533 00000 n
+0000197148 00000 n
+0000197656 00000 n
+0000199102 00000 n
+0000199290 00000 n
+0000199478 00000 n
+0000199666 00000 n
+0000199854 00000 n
+0000200790 00000 n
+0000198922 00000 n
+0000197805 00000 n
+0000200043 00000 n
+0000200292 00000 n
+0000200478 00000 n
+0000200603 00000 n
+0000200728 00000 n
+0000201970 00000 n
+0000202094 00000 n
+0000202219 00000 n
+0000201722 00000 n
+0000200917 00000 n
+0000201845 00000 n
+0000203778 00000 n
+0000203929 00000 n
+0000204080 00000 n
+0000204230 00000 n
+0000204381 00000 n
+0000204531 00000 n
+0000204682 00000 n
+0000204832 00000 n
+0000204983 00000 n
+0000205134 00000 n
+0000205285 00000 n
+0000205436 00000 n
+0000205587 00000 n
+0000205738 00000 n
+0000205889 00000 n
+0000206040 00000 n
+0000206191 00000 n
+0000206341 00000 n
+0000206492 00000 n
+0000206643 00000 n
+0000206793 00000 n
+0000206944 00000 n
+0000207095 00000 n
+0000207246 00000 n
+0000207395 00000 n
+0000207545 00000 n
+0000207696 00000 n
+0000207847 00000 n
+0000207998 00000 n
+0000208149 00000 n
+0000208300 00000 n
+0000208451 00000 n
+0000208602 00000 n
+0000208753 00000 n
+0000208904 00000 n
+0000209054 00000 n
+0000209205 00000 n
+0000209355 00000 n
+0000209506 00000 n
+0000209656 00000 n
+0000209807 00000 n
+0000209958 00000 n
+0000210109 00000 n
+0000210260 00000 n
+0000210411 00000 n
+0000210562 00000 n
+0000210713 00000 n
+0000210864 00000 n
+0000211013 00000 n
+0000211225 00000 n
+0000203202 00000 n
+0000202332 00000 n
+0000211162 00000 n
+0000328887 00000 n
+0000213298 00000 n
+0000213449 00000 n
+0000213600 00000 n
+0000213749 00000 n
+0000213898 00000 n
+0000214048 00000 n
+0000214199 00000 n
+0000214350 00000 n
+0000214500 00000 n
+0000214651 00000 n
+0000214802 00000 n
+0000214953 00000 n
+0000215104 00000 n
+0000215255 00000 n
+0000215406 00000 n
+0000215554 00000 n
+0000215704 00000 n
+0000215854 00000 n
+0000216005 00000 n
+0000216156 00000 n
+0000216307 00000 n
+0000216458 00000 n
+0000216609 00000 n
+0000216760 00000 n
+0000216911 00000 n
+0000217061 00000 n
+0000217211 00000 n
+0000217362 00000 n
+0000217513 00000 n
+0000217664 00000 n
+0000217815 00000 n
+0000217966 00000 n
+0000218117 00000 n
+0000218267 00000 n
+0000218416 00000 n
+0000218566 00000 n
+0000218717 00000 n
+0000218868 00000 n
+0000219019 00000 n
+0000219170 00000 n
+0000219321 00000 n
+0000219472 00000 n
+0000219623 00000 n
+0000219774 00000 n
+0000219924 00000 n
+0000220075 00000 n
+0000220226 00000 n
+0000220377 00000 n
+0000220528 00000 n
+0000220678 00000 n
+0000220829 00000 n
+0000220979 00000 n
+0000221130 00000 n
+0000221280 00000 n
+0000221431 00000 n
+0000221582 00000 n
+0000221733 00000 n
+0000221883 00000 n
+0000222032 00000 n
+0000222182 00000 n
+0000222333 00000 n
+0000222484 00000 n
+0000222635 00000 n
+0000222786 00000 n
+0000222937 00000 n
+0000223088 00000 n
+0000223238 00000 n
+0000223387 00000 n
+0000225596 00000 n
+0000223599 00000 n
+0000212551 00000 n
+0000211312 00000 n
+0000223536 00000 n
+0000225747 00000 n
+0000225897 00000 n
+0000226047 00000 n
+0000226198 00000 n
+0000226347 00000 n
+0000226498 00000 n
+0000226649 00000 n
+0000226799 00000 n
+0000226950 00000 n
+0000227101 00000 n
+0000227251 00000 n
+0000227402 00000 n
+0000227553 00000 n
+0000227704 00000 n
+0000227855 00000 n
+0000228004 00000 n
+0000228154 00000 n
+0000228305 00000 n
+0000228456 00000 n
+0000228607 00000 n
+0000228758 00000 n
+0000228908 00000 n
+0000229059 00000 n
+0000229210 00000 n
+0000229361 00000 n
+0000229511 00000 n
+0000229662 00000 n
+0000229813 00000 n
+0000229962 00000 n
+0000230111 00000 n
+0000230262 00000 n
+0000230412 00000 n
+0000230563 00000 n
+0000230714 00000 n
+0000230865 00000 n
+0000231016 00000 n
+0000231167 00000 n
+0000231318 00000 n
+0000231469 00000 n
+0000231620 00000 n
+0000231771 00000 n
+0000231922 00000 n
+0000232073 00000 n
+0000232224 00000 n
+0000232375 00000 n
+0000232526 00000 n
+0000232675 00000 n
+0000232825 00000 n
+0000232975 00000 n
+0000233125 00000 n
+0000233275 00000 n
+0000233426 00000 n
+0000233576 00000 n
+0000233727 00000 n
+0000233877 00000 n
+0000234026 00000 n
+0000234175 00000 n
+0000234326 00000 n
+0000234476 00000 n
+0000234627 00000 n
+0000234777 00000 n
+0000234928 00000 n
+0000235078 00000 n
+0000235229 00000 n
+0000235379 00000 n
+0000235530 00000 n
+0000235681 00000 n
+0000235832 00000 n
+0000235983 00000 n
+0000236132 00000 n
+0000236282 00000 n
+0000236433 00000 n
+0000236582 00000 n
+0000236733 00000 n
+0000236883 00000 n
+0000237097 00000 n
+0000224777 00000 n
+0000223698 00000 n
+0000237034 00000 n
+0000325865 00000 n
+0000237196 00000 n
+0000237316 00000 n
+0000237788 00000 n
+0000238261 00000 n
+0000238297 00000 n
+0000238689 00000 n
+0000239349 00000 n
+0000239950 00000 n
+0000240491 00000 n
+0000241157 00000 n
+0000242966 00000 n
+0000243201 00000 n
+0000244774 00000 n
+0000245024 00000 n
+0000263016 00000 n
+0000263546 00000 n
+0000275503 00000 n
+0000275939 00000 n
+0000289102 00000 n
+0000289557 00000 n
+0000297688 00000 n
+0000297976 00000 n
+0000306239 00000 n
+0000306540 00000 n
+0000318919 00000 n
+0000319554 00000 n
+0000325562 00000 n
+0000328985 00000 n
+0000329105 00000 n
+0000329204 00000 n
+0000329277 00000 n
+0000341530 00000 n
+0000341713 00000 n
+0000342099 00000 n
+0000342605 00000 n
+0000343050 00000 n
+0000343501 00000 n
+0000344077 00000 n
+0000344586 00000 n
+0000345076 00000 n
+0000345568 00000 n
+0000346059 00000 n
+0000346619 00000 n
+0000347180 00000 n
+0000347741 00000 n
+0000348301 00000 n
+0000349032 00000 n
+0000349865 00000 n
+0000350698 00000 n
+0000351303 00000 n
+0000351575 00000 n
+0000351799 00000 n
+0000351970 00000 n
+0000352140 00000 n
+0000352313 00000 n
+0000352488 00000 n
+0000352665 00000 n
+0000352840 00000 n
+0000353008 00000 n
+0000353202 00000 n
+0000353408 00000 n
+0000353603 00000 n
+0000353799 00000 n
+0000353999 00000 n
+0000354201 00000 n
+0000354508 00000 n
+0000354867 00000 n
+0000355111 00000 n
+0000355354 00000 n
+0000355597 00000 n
+0000355840 00000 n
+0000356121 00000 n
+0000356404 00000 n
+0000356687 00000 n
+0000356970 00000 n
+0000357256 00000 n
+0000357547 00000 n
+0000357837 00000 n
+0000358124 00000 n
+0000358407 00000 n
+0000358690 00000 n
+0000358973 00000 n
+0000359256 00000 n
+0000359505 00000 n
+0000359700 00000 n
+0000359898 00000 n
+0000360099 00000 n
+0000360298 00000 n
+0000360499 00000 n
+0000360698 00000 n
+0000360890 00000 n
+0000360977 00000 n
+0000361145 00000 n
+0000361359 00000 n
+0000361534 00000 n
+0000361663 00000 n
+0000361782 00000 n
+0000361910 00000 n
+0000362049 00000 n
+0000362193 00000 n
+0000362326 00000 n
+0000362447 00000 n
+0000362574 00000 n
+0000362683 00000 n
+0000362767 00000 n
+0000362807 00000 n
+0000363007 00000 n
trailer
<< /Size 1562
/Root 1560 0 R
/Info 1561 0 R
-/ID [<0CF6A151112D8671651F0CC4C7122EBE> <0CF6A151112D8671651F0CC4C7122EBE>] >>
+/ID [<66BFFE03FB2447F25C17B2469142EE98> <66BFFE03FB2447F25C17B2469142EE98>] >>
startxref
-363411
+363339
%%EOF
OpenPOWER on IntegriCloud