Initialisation du projet pst-solides3d.git (SVN revision 142)
[pst-solides3d.git] / tests / .svn / text-base / test_04.ps.svn-base
1 %!PS-Adobe-2.0
2 %%Creator: dvips(k) 5.96dev Copyright 2007 Radical Eye Software
3 %%Title: test_04.dvi
4 %%CreationDate: Sun Jul 13 14:11:44 2008
5 %%Pages: 2
6 %%PageOrder: Ascend
7 %%BoundingBox: 0 0 596 842
8 %%DocumentFonts: SFTT1728 SFRM1728 SFRM1200 SFBX1440 SFRM1000
9 %%DocumentPaperSizes: a4
10 %%EndComments
11 %DVIPSWebPage: (www.radicaleye.com)
12 %DVIPSCommandLine: dvips test_04.dvi
13 %DVIPSParameters: dpi=600
14 %DVIPSSource:  TeX output 2008.07.13:1411
15 %%BeginProcSet: tex.pro 0 0
16 %!
17 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
18 N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
19 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
20 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
21 landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
22 mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
23 matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
24 exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
25 statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
26 N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
27 /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
28 /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
29 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
30 df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
31 definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
32 }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
33 B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
34 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
35 /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
36 setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
37 restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
38 /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
39 }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
40 bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
41 mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
42 SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
43 userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
44 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
45 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
46 /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
47 /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
48 (LaserWriter 16/600)]{A length product length le{A length product exch 0
49 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
50 end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
51 grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
52 imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
53 exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
54 fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
55 delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
56 B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
57 p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
58 rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
59
60 %%EndProcSet
61 %%BeginProcSet: pstricks.pro 0 0
62 % $Id: pstricks.pro 34 2008-06-25 17:20:01Z herbert $
63 %
64 %% PostScript prologue for pstricks.tex.
65 %% Version 1.05, 2008/06/25
66 %%
67 %% This program can be redistributed and/or modified under the terms
68 %% of the LaTeX Project Public License Distributed from CTAN archives
69 %% in directory macros/latex/base/lppl.txt.
70 %
71 %
72 % Define the follwing gs-functions if not known, eg when using distiller
73 %
74 systemdict /.setopacityalpha known not {/.setopacityalpha { pop } def } if
75 systemdict /.setblendmode known not {/.setblendmode { pop } def } if
76 systemdict /.setshapealpha known not {/.setshapealpha { pop } def } if
77 %
78 /tx@Dict 200 dict def                           % the main PSTricks dictionary
79 tx@Dict begin
80 /ADict 25 dict def                              % The arrow dictionaray
81 /CM { matrix currentmatrix } bind def
82 /SLW /setlinewidth load def
83 /CLW /currentlinewidth load def
84 /CP /currentpoint load def
85 /ED { exch def } bind def
86 /L /lineto load def
87 /T /translate load def
88 /TMatrix { } def
89 /RAngle { 0 } def
90 /Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def  % return 0 for negative arguments 
91 /Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known
92 /ATAN1 {neg -1 atan 180 sub } def               % atan(x) (only one parameter)
93 /Div { dup 0 eq { pop } { div } ifelse } def    % control the division
94 /tan { dup cos abs 1.e-10 lt 
95   { pop 1.e10 }                                 % return 1.e10 as infinit
96   { dup sin exch cos div } ifelse               % default sin/cos
97 } def
98 /Tan { dup sin exch cos Div } def               % sin(x)/cos(x) x in degrees
99 /Acos {dup dup mul neg 1 add dup 0 lt {         % arc cos, returns 0 when negative root
100   pop pop 0 }{ sqrt exch atan} ifelse } def
101 /NET { neg exch neg exch T } def                % change coordinate system to the negative one          
102 /Pyth { dup mul exch dup mul add sqrt } def     % Pythagoras, expects 2 parameter
103 /Pyth2 {                                        % Pythagoras, xA yA xB yB
104   3 -1 roll             % xA xB yB yA
105   sub                   % xA xB yB-yA
106   3 1 roll              % yB-yA xA xB
107   sub                   % yB-yA xA-xB
108   Pyth } def
109 /PtoC { 2 copy cos mul 3 1 roll sin mul } def   % Polar to Cartesian
110 /Rand { rand 4294967295 div } def               % a real random number
111 %----------------- hv added 20050516 ---------------
112 /PiDiv2 1.57079632680 def
113 /Pi 3.14159265359 def 
114 /TwoPi 6.28318530718 def
115 /Euler 2.71828182846 def 
116 %/e Euler bind def
117 /RadtoDeg { 180 mul Pi div } bind def           % convert from radian to degrees
118 /DegtoRad { Pi mul 180 div } bind def           % viceversa
119 %----------------- hv end---------------------------
120 /PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def
121 /PathLength { 
122   flattenpath /z 0 def 
123   { /y1 ED /x1 ED /y2 y1 def /x2 x1 def }
124   { /y ED /x ED PathLength@ } 
125   {} 
126   { /y y2 def /x x2 def PathLength@ }
127   /pathforall load stopped { pop pop pop pop } if 
128   z 
129 } def
130 %
131 /STP { .996264 dup scale } def                  % BP/PT scaling
132 /STV { SDict begin normalscale end STP  } def   % 
133 %
134 %%-------------- DG begin patch 15 ---------------%%
135 %/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
136 %PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
137 %mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
138 %/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ]
139 %0 } ifelse setdash stroke } def
140 /DashLine {
141   dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse
142   /b ED /x1 ED /y1 ED /x ED /y ED 
143   /z y x add y1 add x1 add def
144   /Coef b a .5 sub 2 mul y mul sub z Div round 
145     z mul a .5 sub 2 mul y mul add b exch Div def 
146   /y y Coef mul def 
147   /x x Coef mul def 
148   /y1 y1 Coef mul def 
149   /x1 x1 Coef mul def
150   x1 0 gt y1 0 gt or x 0 gt or y 0 gt and 
151     { [ y x y1 x1 ] 1 a sub y mul }
152     { [ 1 0 ] 0 } ifelse 
153   setdash stroke
154 } def
155 %%-------------- DG end patch 15 ---------------%%
156 /DotLine { 
157   /b PathLength def 
158   /a ED /z ED /y CLW def 
159   /z y z add def 
160   a 0 gt { 
161     /b b a div def 
162   }{ 
163     a 0 eq { 
164       /b b y sub def 
165     }{ a -3 eq { 
166       /b b y add def } if 
167     } ifelse 
168   } ifelse 
169   [ 0 b b z Div round Div dup 0 le { pop 1 } if ] 
170   a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse 
171   setdash 1 setlinecap stroke 
172 } def
173 %
174 /LineFill { % hv ------------ patch 7 -------------
175   gsave 
176   abs /hatchWidthInc ED
177   abs /hatchSepInc ED
178   abs CLW add /a ED 
179   a 0 dtransform round exch round exch
180   2 copy idtransform 
181   exch Atan rotate 
182   idtransform pop /a ED 
183   .25 .25 itransform pathbbox 
184   /y2 ED 
185   a Div ceiling cvi /x2 ED /y1 ED 
186   a Div cvi /x1 ED /y2 y2 y1 sub def 
187   clip 
188   newpath 
189   2 setlinecap 
190   systemdict
191   /setstrokeadjust known { true setstrokeadjust } if 
192   x2 x1 sub 1 add { 
193     x1 a mul y1 moveto 0 y2 rlineto stroke 
194     /x1 x1 1 add 
195       hatchWidthInc 0 gt { CLW add } if 
196     def 
197     hatchSepInc 0 gt hatchWidthInc 0 gt or { 
198       /a a hatchSepInc add def
199       CLW hatchWidthInc add SLW 
200     } if
201   } repeat 
202   grestore 
203   pop pop } def
204 %
205 /PenroseFill {%  on stack: scaling factor
206   dup dup scale
207   1 exch div round /penroseFactor ED 
208   a 0 dtransform round exch round exch
209   2 copy idtransform 
210   exch Atan rotate 
211   idtransform pop /a ED 
212   .25 .25 itransform pathbbox 
213   /y2 ED 
214   a Div ceiling cvi /x2 ED /y1 ED 
215   a Div cvi /x1 ED /y2 y2 y1 sub def 
216   clip 
217   newpath 
218   systemdict
219   /setstrokeadjust known { true setstrokeadjust } if 
220   /I/S/L/W/G/+/Z/F/E/D[/def/exch/for{E D}/add{s E get mul}
221  { Z -36.2001 1 33 }{25 E S rlineto}{/q Z dup q G E q 1 + G}{Z 2 2}]{cvx def}forall
222   [0 72 1008 {dup sin E cos }F ]1 setlinejoin/s W{/a W{/b I 10{/i I 4{/m I moveto
223   i m +/j I 10{/l Z b m l + G a l G sub s m get div .2 + floor .3 + 25
224   mul j l + S rmoveto}F i L j L stroke }F}F}F}F 
225   grestore 
226   pop pop 
227 } def
228 %
229 %gsave abs CLW add /a ED a 0 dtransform round exch round exch
230 %2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25
231 %% DG/SR modification begin - Dec. 12, 1997 - Patch 2
232 %%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
233 %itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
234 %% DG/SR modification end
235 %Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict
236 %/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1
237 %% DG/SR modification begin - Jun.  1, 1998 - Patch 3 (from Michael Vulis)
238 %% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore }
239 %% def
240 %a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore
241 %pop pop } def
242 %% DG/SR modification end
243 %
244 /BeginArrow { 
245   ADict begin                   % hold it local, for end see EndArrow
246   /@mtrx CM def 
247   gsave 
248   2 copy T 
249   2 index sub neg exch 
250   3 index sub exch Atan 
251   rotate newpath 
252 } def
253 %
254 /EndArrow { @mtrx setmatrix CP grestore end } def % end the ADict
255 %
256 /Arrow { 
257   CLW mul add dup 
258   2 div /w ED 
259   mul dup /h ED 
260   mul /a ED 
261   { 0 h T 1 -1 scale } if 
262   w neg h moveto 
263   0 0 L w h L w neg a neg rlineto 
264   gsave fill grestore 
265 } def
266 %
267 /ArrowD { % the sides are drawn as curves (hv 20071211)
268   CLW mul add dup 
269   2 div /w ED 
270   mul dup /h ED 
271   mul /Inset ED 
272   { 0 h T 1 -1 scale } if % changes the direction
273 % we use y=w/h^2 * x^2 as equation for the control points
274 % for the coordinates the arrow is seen from top to bottom
275 % the bottom (tip) is (0;0)
276   w neg h moveto % lower left of >
277   w 9 div 4 mul neg h 3 div 2 mul
278   w 9 div neg       h 3 div  
279   0 0 curveto    % tip of >
280   w 9 div        h 3 div  
281   w 9 div 4 mul  h 3 div 2 mul
282   w h curveto % upper left of >
283   w neg Inset neg rlineto % move to x=0 and inset
284   gsave fill grestore 
285 } def 
286 %
287 /Tbar { 
288   CLW mul add /z ED 
289   z -2 div CLW 2 div moveto 
290   z 0 rlineto stroke 
291   0 CLW moveto 
292 } def
293 %
294 /Bracket { 
295   CLW mul add dup CLW sub 2 div 
296   /x ED mul CLW add /y ED /z CLW 2 div def 
297   x neg y moveto 
298   x neg CLW 2 div L x CLW 2 div L x y L stroke 
299   0 CLW moveto 
300 } def
301 %
302 /RoundBracket { 
303   CLW mul add dup 2 div 
304   /x ED mul /y ED /mtrx CM def 
305   0 CLW 2 div T x y mul 0 ne { x y scale } if 
306   1 1 moveto 
307   .85 .5 .35 0 0 0 curveto 
308   -.35 0 -.85 .5 -1 1 curveto 
309   mtrx setmatrix stroke 0 CLW moveto 
310 } def
311 %
312 /SD { 0 360 arc fill } def
313 %
314 /EndDot { % DS is the dot size 
315   { /z DS def } { /z 0 def } ifelse 
316   /b ED 0 z DS SD b { 0 z DS CLW sub SD } if 
317   0 DS z add CLW 4 div sub moveto } def
318 %
319 /Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
320   /closepath load } /pathforall load stopped { pop pop pop pop CP /moveto
321   load } if ] cvx newpath 3 1 roll T exec } def
322 %
323 %/NArray { 
324 %   aload length 2 div dup dup cvi eq not { exch pop } if /n exch
325 %   cvi def 
326 %} def
327 %
328 /NArray { % holds the coordinates and on top of stack the showpoints boolean
329   /showpoints ED 
330   counttomark 2 div dup cvi /n ED 
331   n eq not { exch pop } if
332   showpoints { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse 
333 } def
334 %
335 /Line { 
336   NArray n 0 eq not 
337     { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def 
338       n { Lineto } repeat 
339       CP 4 2 roll ArrowB L pop pop 
340     } if 
341 } def
342 %
343 /Arcto { 
344   /a [ 6 -2 roll ] cvx def 
345   a r 
346   /arcto load stopped { 5 } { 4 } ifelse { pop } repeat 
347   a 
348 } def
349 %
350 /CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
351   and { pop pop /n n 1 sub def } if } def
352 /Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
353   repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
354   ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
355   moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
356   Lineto pop pop closepath } ifelse } def
357 /Diamond { 
358   /mtrx CM def 
359   T rotate 
360   /h ED 
361   /w ED 
362   dup 0 eq { pop } { CLW mul neg 
363     /d ED 
364     /a w h Atan def 
365     /h d a sin Div h add def 
366     /w d a cos Div w add def } ifelse 
367   mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div 
368   /ArrowA { moveto } def 
369   /ArrowB { } def 
370   false Line 
371   closepath mtrx setmatrix } def
372 % DG modification begin - Jan. 15, 1997
373 %/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq {
374 %pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
375 %div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0
376 %d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
377 %setmatrix } def
378 /Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup
379 CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
380 div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0
381 d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
382 % DG/SR modification begin - Jun.  1, 1998 - Patch 3 (from Michael Vulis)
383 % setmatrix } def
384 setmatrix pop } def
385 % DG/SR modification end
386 %
387 /CCA { 
388   /y ED /x ED 
389   2 copy y sub /dy1 ED 
390   x sub /dx1 ED 
391   /l1 dx1 dy1 Pyth def 
392 } def
393 %
394 /CC { 
395   /l0 l1 def 
396   /x1 x dx sub def 
397   /y1 y dy sub def 
398   /dx0 dx1 def 
399   /dy0 dy1 def 
400   CCA 
401   /dx dx0 l1 c exp mul dx1 l0 c exp mul add def 
402   /dy dy0 l1 c exp mul dy1 l0 c exp mul add def 
403   /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def 
404   /x2 x l0 dx mul m mul sub def
405   /y2 y l0 dy mul m mul sub def 
406   /dx l1 dx mul m mul neg def 
407   /dy l1 dy mul m mul neg def 
408 } def
409 %
410 /IC { 
411   /c c 1 add def 
412   c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse 
413   /a a 2 mul 3 div 45 cos b exp div def 
414   CCA 
415   /dx 0 def 
416   /dy 0 def 
417 } def
418 %
419 /BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
420 /NC { CC x1 y1 x2 y2 x y curveto } def
421 /EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
422 /BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
423 /NAC { x2 y2 x y curveto CC x1 y1 } def
424 /EAC { x2 y2 x y ArrowB curveto pop pop } def
425 %
426 /OpenCurve { 
427   NArray n 3 lt 
428     { n { pop pop } repeat } 
429     { BOC /n n 3 sub def n { NC } repeat EOC } ifelse 
430 } def
431 %
432 /AltCurve { 
433   { false NArray n 2 mul 2 roll 
434     [ n 2 mul 3 sub 1 roll ] aload
435     /Points ED 
436     n 2 mul -2 roll } 
437   { false NArray } ifelse 
438   n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse 
439 } def
440 %
441 /ClosedCurve { 
442   NArray n 3 lt 
443     { n { pop pop } repeat } 
444     { n 3 gt { CheckClosed } if 
445       6 copy n 2 mul 6 add 6 roll 
446       IC CC x y moveto n { NC } repeat 
447       closepath pop pop 
448     } ifelse 
449 } def
450 %
451 /SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
452 /ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
453 /SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
454 def
455 /FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix
456 rotate matrix concatmatrix exch findfont exch makefont setfont } def
457 /Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
458 x1 y1 lineto closepath } def
459 /OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
460 y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
461 exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
462 /b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
463 x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
464 ifelse } def
465 /Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
466 /y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
467 pop pop Rect } { OvalFrame } ifelse } def
468 %
469 /BezierNArray { 
470   /f ED 
471   counttomark 2 div dup cvi /n ED 
472   n eq not { exch pop } if 
473   n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat 
474   f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse 
475 } def
476 %
477 /OpenBezier { 
478   BezierNArray 
479   n 1 eq 
480     { pop pop } 
481     { ArrowA n 4 sub 3 idiv 
482       { 6 2 roll 4 2 roll curveto } repeat 
483       6 2 roll 4 2 roll ArrowB curveto } ifelse 
484 } def
485 %
486 /ClosedBezier { 
487   BezierNArray 
488   n 1 eq 
489     { pop pop } 
490     { moveto n 1 sub 3 idiv 
491       { 6 2 roll 4 2 roll curveto } repeat 
492       closepath } ifelse 
493 } def
494 %
495 /BezierShowPoints { 
496   gsave 
497   Points aload length 2 div cvi /n ED 
498   moveto 
499   n 1 sub { lineto } repeat 
500   CLW 2 div SLW [ 4 4 ] 0 setdash stroke 
501   grestore 
502 } def
503 %
504 /Parab { 
505   /y0 ED /x0 ED /y1 ED /x1 ED 
506   /dx x0 x1 sub 3 div def 
507   /dy y0 y1 sub 3 div def 
508   x0 dx sub y0 dy add x1 y1 ArrowA
509   x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB 
510   curveto 
511   /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def 
512 } def
513 %
514 /Grid { 
515   newpath 
516   /a 4 string def 
517   /b ED /c ED /n ED 
518   cvi dup 1 lt { pop 1 } if 
519   /s ED 
520   s div dup 0 eq { pop 1 } if 
521   /dy ED s div dup 0 eq { pop 1 } if
522   /dx ED dy div round dy mul 
523   /y0 ED dx div round dx mul 
524   /x0 ED dy div round cvi 
525   /y2 ED dx div round cvi 
526   /x2 ED dy div round cvi 
527   /y1 ED dx div round cvi 
528   /x1 ED 
529   /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def 
530   /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def 
531   b 0 gt { 
532     /z1 b 4 div CLW 2 div add def
533 %    /Helvetica findfont b scalefont setfont 
534     /b b .95 mul CLW 2 div add def } if 
535   systemdict /setstrokeadjust known 
536     { true setstrokeadjust /t { } def }
537     { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add
538        exch itransform } bind def } ifelse 
539   gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse 
540   /i x1 def 
541   /f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def 
542   /g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def 
543   x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if 
544   { i dx mul dup y0 moveto 
545     b 0 gt 
546       { gsave c i a cvs dup stringwidth pop 
547         /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse 
548         h 0 gt {b neg}{z1} ifelse 
549         rmoveto show grestore } if 
550     dup t f moveto 
551     g t L stroke 
552     /i i w add def 
553   } repeat 
554   grestore 
555   gsave 
556   n 0 gt
557   % DG/SR modification begin - Nov. 7, 1997 - Patch 1
558   %{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash }
559     { 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash }
560   % DG/SR modification end
561     { 2 setlinecap } ifelse 
562   /i y1 def 
563   /f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def 
564   /g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def 
565   y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if 
566   { newpath i dy mul dup x0 exch moveto 
567     b 0 gt { gsave c i a cvs dup stringwidth pop 
568       /z2 ED 
569       w 0 gt {z1 z2 add neg} {z1} ifelse 
570       h 0 gt {z1} {b neg} ifelse 
571       rmoveto show grestore } if 
572     dup f exch t moveto 
573     g exch t L stroke 
574     /i i h add def 
575   } repeat 
576   grestore 
577 } def
578 %
579 /ArcArrow { 
580   /d ED /b ED /a ED 
581   gsave 
582   newpath 0 -1000 moveto clip 
583   newpath 
584   0 1 0 0 b 
585   grestore 
586   c mul 
587   /e ED 
588   pop pop pop r a e d PtoC y add exch x add
589   exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
590   mul neg d 
591 } def
592 %
593 /Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
594 %
595 /ArcAdjust { %%%% Vincent Guirardel
596 % given a target length (targetLength) and an initial angle (angle0) [in the stack],
597 % let  M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0).
598 % This computes an angle t such that (x0,y0) is at distance 
599 % targetLength from the point M(t)=(rx*cos(t),ry*sin(t)).
600 % NOTE: this an absolute angle, it does not have to be added or substracted to angle0
601 % contrary to TvZ's code.
602 % To achieve, this, one iterates the following process: start with some angle t,
603 % compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)].
604 % Now take t' (= new angle) so that (0,0) M(t') and M' are aligned.
605 %
606 % Another difference with TvZ's code is that we need d (=add/sub) to be defined.
607 % the value of d = add/sub is used to know on which side we have to move.
608 % It is only used in the initialisation of the angle before the iteration.
609 %
610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
611 % Input stack:  1: target length 2: initial angle
612 % variables used : rx, ry, d (=add/sub)
613 %
614   /targetLength ED /angle0 ED
615   /x0 rx angle0 cos mul def
616   /y0 ry angle0 sin mul def
617 % we are looking for an angle t such that (x0,y0) is at distance targetLength 
618 % from the point M(t)=(rx*cos(t),ry*sin(t)))
619 %initialisation of angle (using 1st order approx = TvZ's code)
620   targetLength 57.2958 mul
621   angle0 sin rx mul dup mul
622   angle0 cos ry mul dup mul
623   add sqrt div 
624 % if initialisation angle is two large (more than 90 degrees) set it to 90 degrees
625 % (if the ellipse is very curved at the point where we draw the arrow, %
626 % the value can be much more than 360 degrees !)
627 % this should avoid going on the wrong side (more than 180 degrees) or go near
628 % a bad attractive point (at 180 degrees)
629   dup 90 ge { pop 90 } if 
630   angle0 exch d % add or sub
631 % maximum number of times to iterate the iterative procedure:
632 % iterative procedure: takes an angle t on top of stack, computes a 
633 % better angle (and put it on top of stack)
634   30 { dup
635 % compute distance D between (x0,y0) and M(t)
636     dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt
637 % if D almost equals targetLength, we stop
638     dup targetLength sub abs 1e-5 le { pop exit } if
639 % stack now contains D t
640 % compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]:
641 % M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 )
642     exch dup cos rx mul x0 sub  exch sin ry mul y0 sub
643 % stack contains:  y(t)-y0, x(t)-x0, d
644     2 index Div targetLength mul y0 add ry Div exch
645     2 index Div targetLength mul x0 add rx Div
646 % stack contains x(t')/rx , y(t')/ry , d
647 % now compute t', and remove D from stack
648     atan exch pop
649   } repeat
650 % we don't look at what happened... in particular, if targetLength is greater 
651 % than the diameter of the ellipse...
652 % the final angle will be around /angle0 + 180. maybe we should treat this pathological case...
653 % after iteration, stack contains an angle t such that M(t) is the tail of the arrow
654 % to give back the result as a an angle relative to angle0 we could add the following line:
655 % angle0 sub 0 exch d
656 %
657 % begin bug fix 2006-01-11
658 % we want to adjust the new angle t' by a multiple of 360 so that  | t'-angle0 | <= 180
659 %(we don't want to make the ellipse turn more or less than it should)...
660 dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse
661 % end bug fix
662 } def
663 %
664 /EllipticArcArrow {
665   /d ED      % is add or sub
666   /b ED      % arrow procedure
667   /a1 ED     % angle
668   gsave
669   newpath
670   0 -1000 moveto
671   clip                  % Set clippath far from arrow.
672   newpath
673   0 1 0 0 b             % Draw arrow to determine length.
674   grestore
675 % Length of arrow is on top of stack. Next 3 numbers are junk.
676 %
677   a1 exch ArcAdjust   % Angular position of base of arrow.
678   /a2 ED
679   pop pop pop
680   a2 cos rx mul xOrig add % hv 2007-08-29   x->xOrig
681   a2 sin ry mul yOrig add % hv 2007-08-29   y->yOrig
682   a1 cos rx mul xOrig add % 
683   a1 sin ry mul yOrig add % 
684 % Now arrow tip coor and base coor are on stack.
685   b pop pop pop pop       % Draw arrow, and discard coordinates.
686   a2 CLW 8 div
687 % change value of d (test it by looking if  `` 1 1 d '' gives 2 or not )
688   1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse
689   ArcAdjust
690 % resets original value of d
691   1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse  % Adjust angle to give overlap.
692 } def
693 %%------------------ tvz/DG/hv (2004-05-10) end -------------------%%
694 %
695 /Rot { CP CP translate 3 -1 roll neg rotate NET  } def
696 %
697 /RotBegin { 
698   tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if 
699   /TMatrix [ TMatrix CM ] cvx def 
700   /a ED 
701   a Rot /RAngle [ RAngle dup a add ] cvx def 
702 } def
703 %
704 /RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] cvx def } def
705 %
706 /PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
707 /PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def
708 /PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def
709 /Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
710 abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
711 div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
712 h1 abs h sub dup s mul abs } ifelse } def
713 /UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
714 mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
715 { x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
716 exch } def
717 /BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible
718 /IfVisible true def } if } { IfVisible { Invisible /IfVisible false def
719 } if } ifelse } def
720 /InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def
721 /Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit
722 neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def
723 /IfVisible true def } def
724 end
725 %-----------------------------------------------------------------------------%
726
727 % END pstricks.pro
728
729 %%EndProcSet
730 %%BeginProcSet: pst-algparser.pro 0 0
731 %!
732 % PostScript prologue for PSTricks algorithm parser
733 % Version 0.01, 2008/01/01
734 % For distribution and copyright, see pstricks.tex.   hv@pstricks.de
735 %
736 %-----------------------------------------------------------------------------%
737 /AlgParser { tx@AlgToPs begin AlgToPs end } def  % Dominique Rodriguez
738 %
739 /tx@CoreAnalyzerDict 100 dict def tx@CoreAnalyzerDict begin
740 %
741 % PS ANALYZER FOR ALGEBRAIC EXPRESSION V1.12
742 % E->T|E+T
743 % T->FS|T*FS
744 % FS -> F | +FS | -FS
745 % F->P|F^SF
746 % P->(E)|literal
747 % literal->number|var|var[E]|func(params)
748 % params->E|E,param
749 % number->TOBEFINISHED
750 %
751 %% E expression, T term, SF signed factor, F factor, P power
752 %
753 %% parser
754 %
755 %% str
756 %
757 %% C->E<condition_operators>E
758 %% STR index -> STR index+lenExpr
759 /AnalyzeCond { AnalyzeExpr ReadCondOp AnalyzeExpr EvalCondOp  } def
760 %
761 %% analyze Expression List (separator , or | )
762 %% STR index -> STR index+lenExpr
763 %% /AnalyzeListOfE {
764 %%   { NextNonBlankChar pop AnalyzeExpr%%dup Strlen eq { exit } if NextNonBlankChar
765 %%     NextNonBlankChar dup 0 eq { pop exit } if
766 %%     dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if
767 %%     pop NextNonBlankChar dup 0 eq { exit } if 124 ne { PROBLEMCONTACTBILLOU } if 1 add NextNonBlankChar 0 eq {toto} if } loop
768 %%   AnalyzeListOfEPostHook
769 %% } def
770 /AnalyzeListOfE {
771   /NotFirst false def
772   { NextNonBlankChar pop AnalyzeExpr
773     NotFirst { EvalListOfExpr } { /NotFirst true def } ifelse
774     dup Strlen eq { exit } if NextNonBlankChar
775     dup 44 ne 1 index 124 ne and
776     { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse }
777     if  pop 1 add } loop
778   AnalyzeListOfEPostHook
779 } def
780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
781 %% E->T|E+T
782 %% STR index -> STR index+lenExpr
783 /AnalyzeExpr {
784   AnalyzePreHook AnalyzeTerm IsEndingExpr
785   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
786   { { RollOp 1 add NextNonBlankChar pop AnalyzeTerm PreEvalHook EvalAddSub IsEndingExpr { pop exit } if } loop }
787   ifelse
788   AnalyzePostHook
789 } def
790 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
791 %% T->FS|T*FS
792 %% STR index
793 /AnalyzeTerm {
794   AnalyzePreHook AnalyzeSignedFactor IsEndingTerm
795   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
796   { { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor PreEvalHook EvalMulDiv IsEndingTerm { pop exit } if} loop }
797   ifelse
798   AnalyzePostHook
799 } def
800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
801 %% FS -> F | +FS | -FS
802 %% STR index
803 /AnalyzeSignedFactor {
804   AnalyzePreHook 2 copy get dup IsUnaryOp
805   { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor EvalUnaryOp }
806   { pop AnalyzeFactor }
807   ifelse AnalyzePostHook
808 } def
809 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
810 %% F->P|F^P
811 %% STR index
812 /AnalyzeFactor {
813   AnalyzePreHook AnalyzePower IsEndingFactor
814   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
815   { { RollOp 1 add NextNonBlankChar pop AnalyzePower PreEvalHook EvalPower IsEndingFactor { pop exit } if} loop }
816   ifelse  AnalyzePostHook
817 } def
818 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
819 %% P->(E)|literal
820 %% STR index
821 /AnalyzePower {
822   %% depending of first char either a number, or a literal
823   2 copy get dup 40 eq%%an open par
824   { pop 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop }
825   { AnalyzeLiteral }
826   ifelse
827 } def
828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
829 %% STR index STR[index] -> STR index
830 %/AnalyzeLiteral { IsNumber { EvalNumber } { EvalLiteral } ifelse } def
831 /AnalyzeLiteral { dup IsUnaryOp exch IsNumber or { EvalNumber } { EvalLiteral } ifelse } def%%dr 09102006
832 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
833 %% recognize + or -
834 %% chr -> T/F
835 /IsUnaryOp { dup 43 eq exch 45 eq or } bind def
836 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
837 %% a number can contain only : 0123456789.
838 %% chr -> T/F
839 /IsNumber { dup 48 ge exch dup 57 le 3 -1 roll and exch 46 eq or } bind def
840 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
841 %% STR index -> STR index number
842 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
843 %% STR index -> STR index' number
844 /ReadNumber {
845   exch dup 3 -1 roll dup 3 1 roll
846   %%read mantissa
847   { 1 add  2 copy dup Strlen eq { pop pop 0 exit } if get dup IsNumber not { exit } if pop } loop
848   dup 101 eq exch 69 eq or
849   %%% there is a "e" or "E" -> read exponant
850   { 1 add 2 copy get dup IsUnaryOp
851     { pop 1 add 2 copy get } if
852     { IsNumber not { exit } if 1 add 2 copy get } loop }
853   if
854   dup 4 1 roll
855   3 -1 roll exch 1 index sub getinterval
856 } def
857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
858 %% a number can contain only : 0123456789.
859 %% chr -> T/F
860 /IsCondOp { dup 30 eq exch dup 60 ge exch 62 le and or } bind def
861 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
862 %% STR index -> STR index number
863 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
864 %% STR index -> STR index' number
865 /ReadCondOp {
866   NextNonBlankChar 1 index 4 1 roll
867   { IsCondOp not { exit } if 1 add  2 copy get } loop
868   2 copy 5 -1 roll
869   exch 1 index sub getinterval 3 1 roll
870 } def
871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
872 %% a literal can contain only : 0123456789.
873 %% chr -> T/F
874 /IsLiteral {%
875   dup 48 ge exch dup  57 le 3 -1 roll and exch
876   dup 65 ge exch dup  90 le 3 -1 roll and 3 -1 roll or exch
877   dup 97 ge exch     122 le and or } bind def
878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879 %% a literal can be of the form [a-zA-Z][a-zA-Z0-9]*\(\((Expression)\)|\(\[Expression\]\)\)?
880 %% STR index -> literal STR index' nextchr
881 /ReadLiteral {
882   exch dup 3 -1 roll dup 3 1 roll
883   %%read literal core
884   { 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsLiteral not { exit } if pop 1 add } loop
885   4 1 roll dup 5 1 roll 3 -1 roll exch 1 index sub getinterval 4 1 roll
886 } def
887 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
888 %% expr is ended by end of str or a clpar
889 %% STR index -> STR index STR[index] T/F
890 /IsEndingExpr {%
891   2 copy dup Strlen eq
892   %% if end of str is reached -> end !
893   { pop pop 0 true }
894   %% ending chr -> clpar, comma, |, <, >, =, !,
895   {get dup  dup  41 eq
896        exch dup 124 eq
897        exch dup  93 eq
898        exch dup  44 eq
899        exch dup  30 eq
900        exch dup  60 ge exch 62 le and or or or or or}
901   ifelse } def
902 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903 %% expr is ended by end of str or a +-
904 %% STR index -> STR index STR[index] T/F
905 /IsEndingTerm { IsEndingExpr { true } { dup dup 43 eq exch 45 eq or } ifelse } def
906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
907 %% expr is ended by end of str or */
908 %% STR index -> STR index STR[index] T/F
909 /IsEndingFactor { IsEndingTerm { true } { dup dup 42 eq exch 47 eq or } ifelse } def
910 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
911 %% expr is ended by end of str or ^
912 %% STR index -> STR index STR[index] T/F
913 /IsEndingPower { IsEndingFactor { true } { dup 94 eq } ifelse } def
914 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
915 %% STR index -> STR index STR[index]
916 /NextNonBlankChar { { dup Strlen eq { 0 exit } if 2 copy get dup neBlkChar { exit } if pop 1 add } loop } bind def
917 /neBlkChar { dup 32 ne exch dup 10 ne exch 9 ne and and } bind def
918 %%%%%%%%%%%%%%%%%%%%%%%%
919 %% DEBUG
920 /BRK {false} def
921 /BRKtrue {/BRK true def} def
922 /BRKStop {BRK {BRKtoto} if } def
923 /BRKEvalStop {BRK exch if } def
924 /BRKBRK2true {BRK {BRK2true} if } def
925 /BRK2 {false} def
926 /BRK2true {/BRK2 true def} def
927 /BRK2Stop {BRK2 {BRK2toto} if } def/BRK {false} def
928 end
929 %
930 %-------------------------------------------------------------------------------%
931 %
932 /tx@AlgToPs 12 dict def tx@AlgToPs begin
933 %
934 %% algExpr -> PSVector
935 /AlgToPs { tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE pop pop EndingSequence end } def
936 /EndingSequence { ExpressionVector aload length /end cvx exch 1 add array astore } def
937 /InitParser { /ExpressionVector [ /tx@AddMathFunc cvx /begin cvx ] def dup length /Strlen exch def 0 } def
938 /Strlen 0 def
939 /EvalListOfExpr {} def%
940 /EvalNumber {%
941     ReadNumber  cvr /ExpressionVector ExpressionVector aload length dup 3 add -1 roll cvx
942     exch 1 add array astore def NextNonBlankChar pop } def
943 /EvalAddSub {%
944   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
945   43 eq { /add } { /sub } ifelse cvx exch 1 add array astore def
946 } def
947 /EvalMulDiv {%
948   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
949   42 eq { /mul } { /div } ifelse cvx exch 1 add array astore def
950 } def
951 /EvalPower {%
952   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
953   pop /exp cvx exch 1 add array astore def
954 } def
955 /EvalLiteral {%
956   ReadLiteral
957   dup 40 eq%%% there is an open par -> function call
958   { pop 2 index
959     dup (Sum) eq { EvalSum }
960     { dup (IfTE) eq { EvalCond }
961       { dup (Derive) eq { pop EvalDerive }
962         { pop 1 add NextNonBlankChar pop AnalyzeListOfE 2 index TrigoFunc
963           /ExpressionVector ExpressionVector aload length dup 5 add -1 roll cvn cvx
964           exch 1 add array astore def 1 add NextNonBlankChar pop } ifelse } ifelse} ifelse }
965   { /ExpressionVector ExpressionVector aload length dup 6 add -1 roll cvn cvx exch 1 add array astore def
966     dup 91 eq%%% there is an open bracket -> vector element
967     { pop 1 add NextNonBlankChar pop AnalyzeExpr
968       /ExpressionVector ExpressionVector aload length /cvi cvx exch /get cvx exch 2 add array astore def 1 add }
969     { pop NextNonBlankChar pop }
970     ifelse}
971   ifelse
972 } def
973 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
974 %% the derive function : Derive(n,f(x))
975 %% firstparindex lastparindex ->
976 /EvalDerive {
977   %% manage the function descripiton
978   1 add ReadNumber 3 1 roll NextNonBlankChar
979   44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
980   1 add NextNonBlankChar pop
981   3 -1 roll cvi
982   dup 0 eq
983   { pop AnalyzeExpr 3 -1 roll pop 1 add }
984   { 1 sub 3 1 roll (x)  exch tx@Derive begin DeriveIndexed end 4 -1 roll
985     { (x) tx@Derive begin Derive end } repeat
986     ExpressionVector exch /ExpressionVector [] def
987     AlgToPs aload length
988     /ExpressionVector 1 index 3 add -1 roll aload length dup 3 add -1 roll  /l2 exch def /l1 exch def
989     l1 l2 add 1 add l2 neg roll l1 l2 add array astore def 3 -1 roll pop 1 add
990     1 index length /Strlen exch def } ifelse
991 } def
992 /EvalSum {%
993   pop 1 add NextNonBlankChar pop
994   %% read the variable name
995   ReadLiteral pop NextNonBlankChar
996   44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
997   %% read the initial value
998   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
999   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1000   %% read the increment value
1001   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
1002   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1003   %% read the limit value
1004   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
1005   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1006   /ExpressionVector ExpressionVector aload length dup 7 add -3 roll 0 4 1 roll
1007   5 -1 roll 4 add array astore def
1008   %% keep ExpressionVector for later and create a new one for internal Sum computation
1009   ExpressionVector 3 1 roll /ExpressionVector [ 6 -1 roll cvn /exch cvx /def cvx ] def
1010   1 add NextNonBlankChar pop AnalyzeExpr
1011   %% add each term
1012   /ExpressionVector ExpressionVector aload length 1 add /add cvx exch array astore def
1013   /ExpressionVector 4 -1 roll aload length ExpressionVector cvx /for cvx 3 -1 roll 2 add
1014   array astore def 3 -1 roll pop 1 add
1015 } def
1016 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1017 %% Convert to radians if trigo function call
1018 %% (name) ->
1019 /TrigoFunc {
1020   dup (cos) eq 1 index (sin) eq or exch (tan) eq or
1021   { /ExpressionVector ExpressionVector aload length Pi /div cvx 180 /mul cvx 5 -1 roll 4 add
1022     array astore def
1023   } if
1024 } def
1025 /EvalCond {%
1026   pop 1 add AnalyzeCond NextNonBlankChar
1027   44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
1028   ExpressionVector 3 1 roll /ExpressionVector [] def
1029   1 add AnalyzeExpr ExpressionVector 3 1 roll /ExpressionVector [] def
1030   NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
1031   1 add AnalyzeExpr
1032   NextNonBlankChar 41 ne { ANALYZER_ERROR_missing_ending parenthesis_in_IfTE } if
1033   ExpressionVector
1034   /ExpressionVector 6 -1 roll aload length dup
1035   6 add -1 roll cvx exch dup 4 add -1 roll cvx /ifelse cvx 3 -1 roll 3 add array astore def
1036   1 add 3 -1 roll pop
1037 } def
1038 %% CondOp STR index
1039 /EvalCondOp {%
1040   3 -1 roll
1041   dup (=) eq  { /eq } {%
1042   dup (<) eq  { /lt } {%
1043   dup (>) eq  { /gt } {%
1044   dup (>=) eq { /ge } {%
1045   dup (<=) eq { /ge } {%
1046   dup (!=) eq { /ne } { ERROR_non_valid_conditional_operator }
1047   ifelse } ifelse } ifelse } ifelse } ifelse } ifelse
1048   cvx exch pop
1049   /ExpressionVector ExpressionVector aload length dup 3 add -1 roll exch 1 add array astore def } def
1050 /EvalUnaryOp {
1051   3 -1 roll 45 eq { /ExpressionVector ExpressionVector aload length /neg cvx exch 1 add array astore def } if
1052 } def
1053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1054 %% H O O K S
1055 /AnalyzePreHook {} bind def
1056 /PreEvalHook {} bind def
1057 /AnalyzeListOfEPostHook {} bind def
1058 /AnalyzePostHook {} def
1059 /RollOp { 3 1 roll } bind def
1060 end   %tx@CoreAnalyzerDict
1061 %
1062 %--------------------------------------------------------------------%
1063 %
1064 /tx@Derive 41 dict def tx@Derive begin
1065 %%increase ^^ for each function added
1066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1067 %% algExpr variable -> PSVector
1068 /Derive {%
1069   10240 string 3 1 roll 0 3 1 roll
1070   /Variable exch def
1071   tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE end
1072 } def
1073 /Strlen 0 def
1074 /InitParser { dup length /Strlen exch def 0 } def
1075 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1076 %% algExpr variable index -> PSVector
1077 /DeriveIndexed {%
1078   3 1 roll 10240 string 3 1 roll 0 3 1 roll
1079   /Variable exch def
1080   tx@CoreAnalyzerDict begin InitParser pop 4 -1 roll AnalyzeExpr 4 -2 roll pop pop 4 -2 roll exch pop end
1081 } def
1082 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1083 %% (u,v)'=-(u',v')
1084 /EvalListOfExpr {%
1085   4 2 roll 2 copy 9 -1 roll dup length 4 1 roll putinterval add AddPipe
1086            2 copy 7 -1 roll dup length 4 1 roll putinterval add
1087   6 -2 roll pop pop
1088   2 copy pop 0 6 2 roll GetIntervalNewStr 5 1 roll 2 copy 0 exch getinterval 6 1 roll } def
1089 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1090 %% (-u)'=-(u')
1091 /EvalUnaryOp {
1092   4 -2 roll 4 index (0) eq
1093   { (0) StrConcat 7 -1 roll pop }
1094   { 7 -1 roll 45 eq
1095     { AddSub AddOpPar true } { false } ifelse
1096     3 1 roll 5 index StrConcat 3 -1 roll { AddClPar } if } ifelse
1097   2 copy pop 0 6 2 roll GetIntervalNewStr
1098   7 -2 roll pop pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1099 } def
1100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1101 %% (number)'=0
1102 /EvalNumber { ReadNumber (0) 6 2 roll } def
1103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1104 %% (u+v)'=u'+v'
1105 /EvalAddSub {%
1106   7 index dup (0) eq
1107   { pop true }%% du=0 nothing added
1108   { dup length exch 5 index 5 index 3 -1 roll putinterval 4 -1 roll add 3 1 roll false }
1109   ifelse
1110   5 index dup (0) eq
1111   { pop { (0) } { 4 -2 roll 2 copy pop 0  6 2 roll GetIntervalNewStr } ifelse }%%dv=0
1112   { exch
1113     { 5 -2 roll 7 index 45 eq { AddSub } if false } %%nothing yet added
1114     { 5 -2 roll 7 index 43 eq%%something yet added
1115       { AddAdd false } { AddSub AddOpPar true } ifelse }
1116     ifelse 11 1 roll
1117     3 -1 roll StrConcat 10 -1 roll { AddClPar } if
1118     2 copy pop 0 6 2 roll GetIntervalNewStr }
1119   ifelse
1120   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1121 } def
1122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1123 %% (u*v)' or (u/v)'
1124 /EvalMulDiv { 6 index 42 eq {EvalMul} {EvalDiv} ifelse } def
1125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1126 %% (u*v)'=u'*v+u*v'
1127 /EvalMul {%
1128   4 -2 roll 7 index dup (0) eq
1129   { pop false }%%du=0
1130   { (1) eq%%du=1
1131     { false }
1132     { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
1133     3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if
1134     true }%%du!=0
1135   ifelse
1136   5 1 roll 5 index (0) eq
1137   { 5 -1 roll not { (0) StrConcat } if }%%dv=0
1138   { 5 -1 roll { AddAdd } if
1139     4 index (1) eq
1140     { 8 index StrConcat }
1141     { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
1142     ifelse
1143   }%%dv!=0
1144   ifelse
1145   2 copy pop 0 6 2 roll GetIntervalNewStr
1146   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1147 } def
1148 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1149 %% (u/v)'=(u'*v-u*v')/v^2
1150 /EvalDiv {%
1151   4 -2 roll
1152   4 index (0) eq%%dv=0 -> u'/v
1153   { 7 index (0) eq { (0) StrConcat } { AddOpPar 7 index StrConcat AddClPar AddDiv 5 index StrConcat } ifelse }
1154   { 7 index dup (0) eq
1155     { pop }%%du=0
1156     { (1) eq%%du=1
1157       { false }
1158       { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
1159       3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if}%%du!=0
1160     ifelse
1161       AddSub
1162       4 index (1) eq
1163       { 8 index StrConcat }
1164       { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
1165       ifelse
1166     %}%%dv!=0
1167     2 copy GetIntervalNewStr 3 1 roll pop 0 AddOpPar 3 -1 roll StrConcat AddClPar
1168     AddDiv AddOpPar 5 index StrConcat AddClPar 2 copy (^2) putinterval 2 add }
1169   ifelse
1170   2 copy pop 0 6 2 roll GetIntervalNewStr
1171   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1172 } def
1173 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1174 %% str1 index str2 -> str1 index
1175 /StrConcat { dup length 4 2 roll 2 copy 6 -1 roll putinterval 3 -1 roll add } bind def
1176 /GetIntervalNewStr { 0 exch getinterval dup length string copy } bind def
1177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1178 %% (u^v)'=(u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1179 /EvalPower {%
1180   4 -2 roll 7 index (0) eq
1181   {%%if du=0 then (u^v)'=v'ln(u)u^v
1182     4 index (0) eq
1183     { (0) StrConcat }%%if dv=0 then (u^v)'=0
1184     { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1185       8 index (e) ne { (ln\() StrConcat 8 index StrConcat (\)*) StrConcat } if
1186       AddOpPar 8 index StrConcat (\)^\() StrConcat 5 index StrConcat AddClPar } ifelse
1187   }
1188   {%%du!=0
1189     4 index (0) eq
1190     {%%if dv=0 then (u^v)'=vu'u^(v-1)
1191       5 index dup IsStrNumber
1192       { dup (0) eq
1193         { StrConcat }
1194         { dup dup (1) eq exch (1.0) eq or
1195           { StrConcat  }
1196           { StrConcat
1197             7 index dup (1) ne exch (1.0) ne and%%%dr 09102006 insert du if <> 1
1198             { (*\() StrConcat 7 index StrConcat (\)) StrConcat } if%%%dr 09102006
1199             (*\() StrConcat 8 index StrConcat (\)) StrConcat
1200             5 index  dup dup (2) eq exch (2.0) eq or
1201             { pop } { cvr 1 sub 20 string cvs 3 1 roll (^) StrConcat 3 -1 roll StrConcat } ifelse } ifelse } ifelse }
1202       { pop AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat
1203         5 index StrConcat (-1\)) StrConcat } ifelse
1204     }
1205     {%%if dv!=0 and du!=0 then (u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1206       7 index (1) ne { AddOpPar 7 index StrConcat (\)*) StrConcat } if
1207       AddOpPar 5 index StrConcat (\)*\() StrConcat
1208       8 index StrConcat (\)^\() StrConcat
1209       5 index StrConcat (-1\)+\() StrConcat
1210       4 index (1) ne { 4 index StrConcat (\)*\() StrConcat } if
1211       8 index StrConcat (\)^\() StrConcat
1212       5 index StrConcat (\)*ln\() StrConcat
1213       8 index StrConcat AddClPar
1214     } ifelse
1215   } ifelse
1216   2 copy pop 0 6 2 roll GetIntervalNewStr
1217   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1218 } def
1219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1220 %% str -> true/false
1221 /IsStrNumber {%
1222   true exch
1223   { dup 48 lt exch dup 57 gt 3 -1 roll or
1224     exch dup 46 ne%%.
1225     exch dup 43 ne%%+
1226     exch 45 ne%%-
1227     and and and { pop false } if } forall
1228 } def
1229 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1230 %% literal switch -> func call, vector, variables
1231 /EvalLiteral {%
1232   ReadLiteral dup 40 eq%%% there is an open par -> function call
1233   { pop (EvalFunc_             ) 9 4 index StrConcat 0 exch getinterval cvn cvx exec }
1234   { dup 91 eq%%% there is an open bracket -> vector element
1235     { ERROR_vector_not_yet_implemented }
1236     { pop EvalVariable }
1237     ifelse }
1238   ifelse
1239 } def
1240 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1241 %% first last parpos Expr[first:parpos-1] ->
1242 /EvalVariable { 2 index Variable eq { (1) } { (0) } ifelse 4 -1 roll exch 6 2 roll } def
1243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1244 %% (f(u))'=u'f'(u)
1245 /EvalFunc {
1246   4 2 roll 4 index (1) ne
1247   { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1248   (Eval             ) 4 8 index StrConcat 0 exch getinterval cvn cvx exec
1249   2 copy pop 0 6 2 roll GetIntervalNewStr
1250   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1251 } def
1252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1253 %% Func derivative -> Eval<func>
1254 /EvalFunc_sin {%
1255   PreCommonFunc
1256   { (cos\() StrConcat 5 index StrConcat AddClPar } if
1257   PostCommonFunc } def
1258 /EvalFunc_cos {%
1259   PreCommonFunc
1260   { (\(-sin\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1261   PostCommonFunc } def
1262 /EvalFunc_tan {%
1263   PreCommonFunc
1264   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse  (/cos\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1265   PostCommonFunc } def
1266 /EvalFunc_asin {%
1267   PreCommonFunc
1268   { (1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1269   PostCommonFunc } def
1270 /EvalFunc_acos {%
1271   PreCommonFunc
1272   { (-1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1273   PostCommonFunc } def
1274 /EvalFunc_atg {%
1275   PreCommonFunc
1276   { (1/\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1277   PostCommonFunc } def
1278 /EvalFunc_ln {%
1279   PreCommonFunc
1280   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if
1281   PostCommonFunc } def
1282 /EvalFunc_exp {%
1283   PreCommonFunc
1284   {  (exp\() StrConcat 5 index StrConcat AddClPar } if
1285   PostCommonFunc } def
1286 /EvalFunc_sqrt {%
1287   PreCommonFunc
1288   { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\(2*sqrt\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1289   PostCommonFunc } def
1290 /EvalFunc_Fact {%
1291   PreCommonFunc { ERROR_no_variable_expression_in_Fact } if
1292   PostCommonFunc } def
1293 /EvalFunc_sh {%
1294   PreCommonFunc
1295   { (ch\() StrConcat 5 index StrConcat AddClPar } if
1296   PostCommonFunc } def
1297 /EvalFunc_ch {%
1298   PreCommonFunc
1299   { (sh\() StrConcat 5 index StrConcat AddClPar } if
1300   PostCommonFunc } def
1301 /EvalFunc_th {%
1302   PreCommonFunc
1303   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse  (/ch\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1304   PostCommonFunc } def
1305 /EvalFunc_Argsh {%
1306   PreCommonFunc
1307   { (1/sqrt\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1308   PostCommonFunc } def
1309 /EvalFunc_Argch {%
1310   PreCommonFunc
1311   { (1/sqrt\(\() StrConcat 5 index StrConcat (\)^2-1\)\)) StrConcat } if
1312   PostCommonFunc } def
1313 /EvalFunc_Argth {%
1314   PreCommonFunc
1315   { (1/\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1316   PostCommonFunc } def
1317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1318 /PreCommonFunc {
1319   1 add NextNonBlankChar pop 3 -1 roll 5 1 roll AnalyzeExpr 1 add NextNonBlankChar pop
1320   4 2 roll 4 index (0) eq
1321   { (0) StrConcat false }
1322   { 4 index (1)  ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if true } ifelse
1323 } def
1324 /PostCommonFunc {
1325   2 copy pop 0 6 2 roll GetIntervalNewStr
1326   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1327 } def
1328 /EvalFunc_Derive {%
1329   1 add ReadNumber cvi 1 add dup cvr log 1 add cvi string cvs
1330   4 -1 roll pop 5 1 roll 1 add NextNonBlankChar pop AnalyzeExpr 1 add
1331   4 -2 roll (Derive\() StrConcat 7 -1 roll StrConcat (,) StrConcat 6 -1 roll StrConcat AddClPar
1332   2 copy pop 0 6 2 roll GetIntervalNewStr 6 -1 roll pop 2 index 6 index dup 4 index exch sub getinterval
1333   exch 6 2 roll } def
1334 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1335 %% literal switch -> func call, vector, variables
1336 /EvalFunc_Sum {%
1337   1 add NextNonBlankChar pop
1338   %% read the variable name
1339   ReadLiteral pop 3 -1 roll pop NextNonBlankChar
1340   44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
1341   %% read the initial value
1342   1 add NextNonBlankChar pop ReadNumber pop
1343   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1344   %% read the increment value
1345   1 add NextNonBlankChar pop ReadNumber pop
1346   2 copy get 44 ne { ANALYZER_ERROR_missing_third_comma_in_Sum } if
1347   %% read the limit value
1348   1 add NextNonBlankChar pop ReadNumber pop
1349   2 copy get 44 ne { ANALYZER_ERROR_missing_fourth_comma_in_Sum } if
1350   1 add NextNonBlankChar pop dup 6 1 roll 3 -1 roll pop AnalyzeExpr 1 add NextNonBlankChar pop
1351   4 -2 roll 3 index 8 index dup 9 index exch sub getinterval StrConcat
1352   4 index StrConcat AddClPar
1353   2 copy pop 0 6 2 roll GetIntervalNewStr
1354   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1355 } def
1356 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1357 %% literal switch -> func call, vector, variables
1358 /EvalFunc_IfTE {%
1359   3 -1 roll pop 1 add NextNonBlankChar pop SkipCond
1360   NextNonBlankChar
1361   44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
1362   1 add NextNonBlankChar pop dup 5 1 roll
1363   AnalyzeExpr NextNonBlankChar
1364   44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
1365   1 add NextNonBlankChar pop
1366   AnalyzeExpr 1 add NextNonBlankChar pop
1367   4 -2 roll 3 index 10 index dup 11 index exch sub getinterval StrConcat
1368   6 index StrConcat (,) StrConcat 4 index StrConcat AddClPar
1369   2 copy pop 0 6 2 roll GetIntervalNewStr
1370   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1371 } def
1372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1373 %% advance in str until a comma is found (no error detection!)
1374 %% str index -> str index'
1375 /SkipCond { { 1 add 2 copy get 44 eq {exit } if } loop } bind def
1376 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1377 %% Convert to radians if trigo function call
1378 %% (name) ->
1379 /TrigoFunc {
1380   dup (cos) eq 1 index (sin) eq or exch (tan) eq or
1381   { /ExpressionVector ExpressionVector aload length Pi /div cvx 180 /mul cvx 5 -1 roll 4 add
1382     array astore def
1383   } if
1384 } def
1385 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1386 %% No derivative for condition....
1387 /EvalCondOp { 3 -1 roll pop } bind def
1388 /PutIntervalOneAdd {putinterval 1 add} bind def
1389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1390 %% Add open parenthesis in string at the given index
1391 %% str index -> str index+1
1392 /AddOpPar {2 copy (\() PutIntervalOneAdd} bind def
1393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1394 %% Add close parenthesis in string at the given index
1395 %% str index -> str index+1
1396 /AddClPar {2 copy (\)) PutIntervalOneAdd} bind def
1397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1398 %% Add 0 in string at the given index
1399 %% str index -> str index+1
1400 /AddZero {2 copy (0) PutIntervalOneAdd} bind def
1401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1402 %% Add open parenthesis in string at the given index
1403 %% str index -> str index+1
1404 /AddMul {2 copy (*) PutIntervalOneAdd} bind def
1405 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1406 %% Add open parenthesis in string at the given index
1407 %% str index -> str index+1
1408 /AddDiv {2 copy (/) PutIntervalOneAdd} bind def
1409 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1410 %% Add a plus sign in string at the given index
1411 %% str index -> str index+1
1412 /AddAdd {2 copy (+) PutIntervalOneAdd} bind def
1413 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1414 %% Add a minus sign in string at the given index
1415 %% str index -> str index+1
1416 /AddSub {2 copy (-) PutIntervalOneAdd} bind def
1417 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1418 %% Add a pipe sign in string at the given index
1419 %% str index -> str index+1
1420 /AddPipe {2 copy (|) PutIntervalOneAdd} bind def
1421 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1422 %% H O O K S
1423 /AnalyzePreHook { dup 5 1 roll } bind def
1424 /PreEvalHook {} def
1425 /AnalyzePostHook { 7 -1 roll pop } bind def
1426 /AnalyzeListOfEPostHook { 6 -1 roll mark 6 1 roll cleartomark } bind def
1427 /RollOp { 5 1 roll } bind def
1428 end%%%tx@CoreAnalyzerDict
1429 /tx@AddMathFunc 12 dict def tx@AddMathFunc begin
1430 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1431 %% NEW FUNC
1432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433 %% function arcsine in radians asin(x)=atan(x/sqrt(1-x^2))
1434 %% x -> theta
1435 /asin {%
1436   dup abs 1 gt { EQDFasinrangeerror  } if
1437   dup dup dup mul 1 exch sub sqrt atan exch 0 lt { 360 sub } if DegtoRad
1438 } def
1439 %% function arccosine in radians acos(x)=atan(sqrt(1-x^2)/x)
1440 %% x -> theta
1441 /acos {%
1442   dup abs 1 gt { EQDFacosrangeerror  } if
1443   dup dup mul 1 exch sub sqrt exch atan DegtoRad
1444 } def
1445 %% function arctangent in radians
1446 %% x -> theta
1447 /atg { 1 atan dup 90 gt { 360 sub } if DegtoRad } bind def
1448 %% HYPERBOLIC FUNCTIONS
1449 /sh { dup Ex exch neg Ex sub 2 div } def
1450 /ch { dup Ex exch neg Ex add 2 div } def
1451 /th { dup sh exch ch div } def
1452 /Argsh { dup dup mul 1 add sqrt add ln } def
1453 /Argch { dup dup mul 1 sub sqrt add ln } def
1454 /Argth { dup 1 add exch 1 exch sub div ln 2 div } def
1455 %% modified exponential funtion for 0
1456 %% x n -> x^n
1457 /Exp { dup 0 eq { pop pop 1 } { exp } ifelse } bind def
1458 %% modified exponential funtion for 0
1459 %% x -> e^x
1460 /Ex { Euler exch exp } bind def
1461 %%
1462 %% factorial function
1463 %% n -> n!
1464 /Fact { 1 exch 2 exch 1 exch { mul } for } bind def
1465 /fact { Fact } bind def
1466 end
1467
1468 % END pstricks.pro
1469
1470 %%EndProcSet
1471 %%BeginProcSet: pst-dots.pro 0 0
1472 % $Id: pst-dots.pro 11 2008-01-24 13:37:27Z herbert $
1473 %
1474 %% PostScript prologue for pstricks.tex.
1475 %% Version 2.01,  2008/04/18
1476 %%
1477 %% For distribution, see pstricks.tex.
1478 %%
1479 %% Timothy Van Zandt <tvz@Princeton.EDU>
1480 %%
1481 %% This program can be redistributed and/or modified under the terms
1482 %% of the LaTeX Project Public License Distributed from CTAN archives
1483 %% in directory macros/latex/base/lppl.txt.
1484 %%
1485 %% Modified by Etienne Riga  - Dec. 16, 1999
1486 %% Modified by Etienne Riga  - 2005/01/01 (er)
1487 %% to add /Diamond, /SolidDiamond and /BoldDiamond
1488 %% Modified by Herbert Voss (hv) - 2008/04/17 
1489 %
1490 10 dict dup begin                       % hold local
1491   /FontType 3 def
1492   /FontMatrix [.001 0 0 .001 0 0] def
1493   /FontBBox [-571.5 -742.5 571.5 742.5] def
1494 %  /FontBBox [-1000 -1000 1000 1000] def  % See end of file in /BuildGlyph
1495   /Encoding 256 array def
1496   0 1 255 {Encoding exch /.notdef put} for % fill the array with /.notdef
1497   Encoding                                 % replace with given dot names
1498     dup (b) 0 get /Bullet put              % get the numerical position of b in ASCII
1499 %                                          % and save /Bullet at this place in Encoding 
1500     dup (c) 0 get /Circle put
1501     dup (C) 0 get /BoldCircle put       % 67
1502     dup (u) 0 get /SolidTriangle put
1503     dup (t) 0 get /Triangle put
1504     dup (T) 0 get /BoldTriangle put
1505     dup (r) 0 get /SolidSquare put
1506     dup (s) 0 get /Square put
1507     dup (S) 0 get /BoldSquare put
1508     dup (q) 0 get /SolidPentagon put
1509     dup (p) 0 get /Pentagon put
1510     dup (P) 0 get /BoldPentagon put
1511 %%%               
1512     dup (k) 0 get /Asterisk put
1513     dup (K) 0 get /BoldAsterisk put
1514     dup (J) 0 get /SolidAsterisk put
1515     dup (h) 0 get /Hexagon put
1516     dup (H) 0 get /BoldHexagon put
1517     dup (G) 0 get /SolidHexagon put
1518     dup (f) 0 get /Octogon put          % 2008-04-18 hv
1519     dup (F) 0 get /BoldOctogon put      % 2008-04-18 hv
1520     dup (g) 0 get /SolidOctogon put     % 2008-04-18 hv
1521     dup (a) 0 get /Add put
1522     dup (A) 0 get /BoldAdd put          % 65
1523     dup (x) 0 get /Mul put
1524     dup (X) 0 get /BoldMul put
1525     dup (m) 0 get /Oplus put
1526     dup (M) 0 get /BOplus put
1527     dup (e) 0 get /SolidOplus put
1528     dup (n) 0 get /Otimes put
1529     dup (N) 0 get /BOtimes put
1530     dup (E) 0 get /SolidOtimes put
1531     dup (i) 0 get /Bar put
1532     dup (I) 0 get /BoldBar put
1533     dup (l) 0 get /SolidDiamond put
1534     dup (d) 0 get /Diamond put
1535         (D) 0 get /BoldDiamond put
1536 %%%  
1537 /CharProcs 47 dict def
1538 CharProcs begin
1539   /CirclePath {0 0 500 0 360 arc closepath} def
1540   /Bullet {CirclePath fill} def
1541   /Circle {CirclePath .9 .9 scale CirclePath eofill} def
1542   /BoldCircle {CirclePath .8 .8 scale CirclePath eofill} def
1543   /TrianglePath {0 660 moveto -571.5 -330 lineto 571.5 -330 lineto closepath} def
1544   /SolidTriangle {TrianglePath fill} def
1545   /Triangle {TrianglePath .85 .85 scale TrianglePath eofill} def
1546   /BoldTriangle {TrianglePath .7 .7 scale TrianglePath eofill} def
1547   /SquarePath {-450 450 moveto 450 450 lineto 450 -450 lineto -450 -450 lineto closepath} def
1548   /SolidSquare {SquarePath fill} def
1549   /Square {SquarePath .89 .89 scale SquarePath eofill} def
1550   /BoldSquare {SquarePath .78 .78 scale SquarePath eofill} def
1551   /PentagonPath {
1552     -337.8 -465 moveto 337.8 -465 lineto 546.6 177.6 lineto
1553     0 574.7 lineto -546.6 177.6 lineto closepath
1554   } def
1555   /SolidPentagon {PentagonPath fill} def
1556   /Pentagon {PentagonPath .89 .89 scale PentagonPath eofill} def
1557   /BoldPentagon {PentagonPath .78 .78 scale PentagonPath eofill} def
1558 %-------------- hv begin 2004/07/25   from: er 2003/03/24
1559   /HexagonPath {
1560     0 550 moveto -476 275 lineto -476 -275 lineto
1561     0 -550 lineto 476 -275 lineto 476 275 lineto closepath
1562   } def
1563   /SolidHexagon {HexagonPath fill} def
1564   /Hexagon {HexagonPath .89 .89 scale HexagonPath eofill} def
1565   /BoldHexagon {HexagonPath .79 .79 scale HexagonPath eofill} def
1566 %                                       2008-04-18 hv
1567   /OctogonPath {
1568     228 550 moveto 7 { -456 0 rlineto 45 rotate } repeat 
1569     closepath
1570   } def 
1571   /SolidOctogon { OctogonPath fill                             } def
1572   /Octogon {      OctogonPath .89 .89 scale OctogonPath eofill } def
1573   /BoldOctogon {  OctogonPath .79 .79 scale OctogonPath eofill } def
1574 %
1575   /AsteriskPath {
1576     20 0 moveto 10 250 180 500 0 500 curveto
1577     -180 500 -10 250 -20 0 curveto closepath
1578   } def
1579   /Asterisk {
1580     AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath
1581     60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath fill
1582   } def
1583 %
1584   /Basterp {50 250 220 500 0 500 curveto -220 500 -50 250 -50 30 cos 100 mul curveto} def
1585   /BoldAsteriskPath {
1586     50 30 cos 100 mul moveto  Basterp
1587     60 rotate Basterp 60 rotate Basterp
1588     60 rotate Basterp 60 rotate Basterp
1589     60 rotate Basterp closepath
1590   } def
1591   /BoldAsterisk {BoldAsteriskPath fill} def
1592   /SolidAsterisk {CirclePath .9 .9 scale BoldAsteriskPath eofill} def
1593   /CrossPath {
1594     40 550 moveto -40 550 lineto -40 40 lineto -550 40 lineto
1595     -550 -40 lineto -40 -40 lineto -40 -550 lineto 40 -550 lineto 
1596     40 -40 lineto 550 -40 lineto 550 40 lineto 40 40 lineto closepath
1597   } def
1598   /BoldCrossPath {80 550 moveto -80 550 lineto -80 80 lineto -550 80 lineto
1599     -550 -80 lineto -80 -80 lineto -80 -550 lineto 80 -550 lineto 
1600     80 -80 lineto 550 -80 lineto 550 80 lineto 80 80 lineto closepath
1601   } def
1602   /Add {CrossPath fill} def
1603   /Mul {45 rotate CrossPath fill} def
1604   /BoldAdd {BoldCrossPath fill} def
1605   /BoldMul {45 rotate BoldCrossPath fill} def
1606   /Oplus {CirclePath .9 .9 scale CirclePath eofill .775 .775 scale CrossPath fill } def 
1607   /SolidOplus {CirclePath .775 .775 scale BoldCrossPath eofill} def 
1608   /BOplus {CirclePath .8 .8 scale CirclePath eofill .775 .775 scale BoldCrossPath fill} def 
1609   /Otimes {CirclePath .9 .9 scale CirclePath eofill 45 rotate .775 .775 scale CrossPath fill} def 
1610   /BOtimes {CirclePath .8 .8 scale CirclePath eofill 45 rotate .775 .775 scale BoldCrossPath fill } def 
1611   /SolidOtimes {CirclePath 45 rotate .775 .775 scale BoldCrossPath eofill} def 
1612   /BarPath {40 660 moveto -40 660 lineto -40 -660 lineto 40 -660 lineto closepath} def
1613   /Bar {BarPath fill} def
1614   /BoldBarPath {80 660 moveto -80 660 lineto -80 -660 lineto 80 -660 lineto closepath} def
1615   /BoldBar {BoldBarPath fill} def
1616   /DiamondPath {0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto 428.5 0 lineto closepath} def
1617   /SolidDiamond {DiamondPath fill} def
1618   /Diamond {DiamondPath .865 .865 scale DiamondPath eofill} def
1619   /BoldDiamond {DiamondPath .73 .73 scale DiamondPath eofill} def
1620 %%%
1621   /.notdef { } def
1622 end
1623 %
1624 /BuildGlyph {
1625   exch
1626   begin                 
1627 %  Metrics 1 index get exec 0
1628     0 0
1629 %      BBoxes 3 index get exec
1630     -1000 -1000 1000 1000
1631 %     -571.5 -742.5 571.5 742.5
1632     setcachedevice
1633     CharProcs begin load exec end
1634   end
1635 } def
1636 %
1637 /BuildChar {
1638   1 index /Encoding get exch get
1639   1 index /BuildGlyph get exec
1640 } bind def
1641
1642 end
1643 /PSTricksDotFont exch definefont pop
1644
1645 %% end
1646
1647 %%EndProcSet
1648 %%BeginProcSet: pst-node.pro 0 0
1649 %!PS
1650 % PostScript prologue for pst-node.tex.
1651 % Version 97 patch 1, 97/05/09.
1652 % For distribution, see pstricks.tex.
1653 %
1654 /tx@NodeDict 400 dict def tx@NodeDict begin
1655 tx@Dict begin 
1656  /T /translate load def 
1657 end
1658 /NewNode { % on stack: { x y } boolean N@name type InitXnode 
1659   gsave 
1660   /next ED                      % { x y } boolean N@name type  
1661   dict dup                      % { x y } boolean N@name dict dict
1662   3 1 roll def                  % { x y } boolean dict N@name dict def
1663   exch { dup 3 1 roll def } if  % { x y } dict boolean
1664   begin                         % { x y } dict begin
1665   tx@Dict begin 
1666     STV CP T exec               % set scaling
1667   end 
1668   /NodeMtrx CM def              % save CM
1669   next                          % InitXNode
1670   end
1671   grestore 
1672 } def
1673 %
1674 /NewNode2 { % on stack:  x y  N@name type 
1675   gsave 
1676   dict dup                      %  x y  N@name dict dict
1677   3 1 roll def                  %  x y  dict N@name dict def
1678   begin                         %  x y  dict begin
1679   tx@Dict begin 
1680     STV CP T                    % set scaling
1681   end 
1682   /NodeMtrx CM def              % save CM
1683   /Y ED /X ED 
1684   /NodePos { NodeSep Cos mul NodeSep Sin mul } def
1685   end
1686   grestore 
1687 } def
1688 %
1689 /InitPnode { 
1690   /Y ED /X ED 
1691   /NodePos { NodeSep Cos mul NodeSep Sin mul } def
1692 } def
1693 %
1694 /InitCnode { 
1695   /r ED /Y ED /X ED 
1696   /NodePos { NodeSep r add dup Cos mul exch Sin mul } def 
1697 } def
1698 %
1699 /GetRnodePos { Cos 0 gt { /dx r NodeSep add def } { /dx l NodeSep sub def
1700 } ifelse Sin 0 gt { /dy u NodeSep add def } { /dy d NodeSep sub def }
1701 ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
1702 dup Sin mul Cos Div } ifelse } def
1703 /InitRnode { /Y ED /X ED X sub /r ED /l X neg def Y add neg /d ED Y sub
1704 /u ED /NodePos { GetRnodePos } def } def
1705 /DiaNodePos { w h mul w Sin mul abs h Cos mul abs add Div NodeSep add dup
1706 Cos mul exch Sin mul } def
1707 /TriNodePos { Sin s lt { d NodeSep sub dup Cos mul Sin Div exch } { w h
1708 mul w Sin mul h Cos abs mul add Div NodeSep add dup Cos mul exch Sin mul
1709 } ifelse } def
1710 /InitTriNode { sub 2 div exch 2 div exch 2 copy T 2 copy 4 index index /d
1711 ED pop pop pop pop -90 mul rotate /NodeMtrx CM def /X 0 def /Y 0 def d
1712 sub abs neg /d ED d add /h ED 2 div h mul h d sub Div /w ED /s d w Atan
1713 sin def /NodePos { TriNodePos } def } def
1714 /OvalNodePos { /ww w NodeSep add def /hh h NodeSep add def Sin ww mul Cos
1715 hh mul Atan dup cos ww mul exch sin hh mul } def
1716 /GetCenter { begin X Y NodeMtrx transform CM itransform end } def
1717 %
1718 /XYPos { dup sin exch cos Do /Cos ED /Sin ED /Dist ED Cos 0 gt { Dist
1719   Dist Sin mul Cos div } { Cos 0 lt { Dist neg Dist Sin mul Cos div neg }
1720   { 0 Dist Sin mul } ifelse } ifelse Do 
1721 } def
1722 /GetEdge { dup 0 eq { pop begin 1 0 NodeMtrx dtransform CM idtransform
1723   exch atan sub dup sin /Sin ED cos /Cos ED /NodeSep ED NodePos NodeMtrx
1724   dtransform CM idtransform end } { 1 eq {{exch}} {{}} ifelse /Do ED pop
1725   XYPos } ifelse 
1726 } def
1727 /AddOffset { 1 index 0 eq { pop pop } { 2 copy 5 2 roll cos mul add 4 1
1728 roll sin mul sub exch } ifelse } def
1729 /GetEdgeA { NodeSepA AngleA NodeA NodeSepTypeA GetEdge OffsetA AngleA
1730 AddOffset yA add /yA1 ED xA add /xA1 ED } def
1731 /GetEdgeB { NodeSepB AngleB NodeB NodeSepTypeB GetEdge OffsetB AngleB
1732 AddOffset yB add /yB1 ED xB add /xB1 ED } def
1733 /GetArmA { ArmTypeA 0 eq { /xA2 ArmA AngleA cos mul xA1 add def /yA2 ArmA
1734 AngleA sin mul yA1 add def } { ArmTypeA 1 eq {{exch}} {{}} ifelse /Do ED
1735 ArmA AngleA XYPos OffsetA AngleA AddOffset yA add /yA2 ED xA add /xA2 ED
1736 } ifelse } def
1737 /GetArmB { ArmTypeB 0 eq { /xB2 ArmB AngleB cos mul xB1 add def /yB2 ArmB
1738 AngleB sin mul yB1 add def } { ArmTypeB 1 eq {{exch}} {{}} ifelse /Do ED
1739 ArmB AngleB XYPos OffsetB AngleB AddOffset yB add /yB2 ED xB add /xB2 ED
1740 } ifelse } def
1741 /InitNC { 
1742   /b ED /a ED % second and first node
1743   /NodeSepTypeB ED /NodeSepTypeA ED 
1744   /NodeSepB ED /NodeSepA ED 
1745   /OffsetB ED /OffsetA ED 
1746   tx@NodeDict a known tx@NodeDict b known and dup { 
1747     /NodeA a load def 
1748     /NodeB b load def 
1749     NodeA GetCenter /yA ED /xA ED 
1750     NodeB GetCenter /yB ED /xB ED } if 
1751 } def
1752 %
1753 /LPutLine { 4 copy 3 -1 roll sub neg 3 1 roll sub Atan /NAngle ED 1 t sub
1754 mul 3 1 roll 1 t sub mul 4 1 roll t mul add /Y ED t mul add /X ED } def
1755 /LPutLines { mark LPutVar counttomark 2 div 1 sub /n ED t floor dup n gt
1756 { pop n 1 sub /t 1 def } { dup t sub neg /t ED } ifelse cvi 2 mul { pop
1757 } repeat LPutLine cleartomark } def
1758 /BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
1759 /t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
1760 mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
1761 sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
1762 add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
1763 y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
1764 mul 2 bx t mul mul add cx add atan /NAngle ED /Y ED /X ED } def
1765 /HPosBegin { yB yA ge { /t 1 t sub def } if /Y yB yA sub t mul yA add def
1766 } def
1767 /HPosEnd { /X Y yyA sub yyB yyA sub Div xxB xxA sub mul xxA add def
1768 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1769 /HPutLine { HPosBegin /yyA ED /xxA ED /yyB ED /xxB ED HPosEnd  } def
1770 /HPutLines { HPosBegin yB yA ge { /check { le } def } { /check { ge } def
1771 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { dup Y check { exit
1772 } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark HPosEnd 
1773 } def
1774 /VPosBegin { xB xA lt { /t 1 t sub def } if /X xB xA sub t mul xA add def
1775 } def
1776 /VPosEnd { /Y X xxA sub xxB xxA sub Div yyB yyA sub mul yyA add def
1777 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1778 /VPutLine { VPosBegin /yyA ED /xxA ED /yyB ED /xxB ED VPosEnd  } def
1779 /VPutLines { VPosBegin xB xA ge { /check { le } def } { /check { ge } def
1780 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { 1 index X check {
1781 exit } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark
1782 VPosEnd  } def
1783 /HPutCurve { gsave newpath /SaveLPutVar /LPutVar load def LPutVar 8 -2
1784 roll moveto curveto flattenpath /LPutVar [ {} {} {} {} pathforall ] cvx
1785 def grestore exec /LPutVar /SaveLPutVar load def } def
1786 /NCCoor { /AngleA yB yA sub xB xA sub Atan def /AngleB AngleA 180 add def
1787 GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 xA1 yA1 ] cvx def /LPutPos {
1788 LPutVar LPutLine } def /HPutPos { LPutVar HPutLine } def /VPutPos {
1789 LPutVar VPutLine } def LPutVar } def
1790 /NCLine { NCCoor tx@Dict begin ArrowA CP 4 2 roll ArrowB lineto pop pop
1791 end } def
1792 /NCLines { false NArray n 0 eq { NCLine } { 2 copy yA sub exch xA sub
1793 Atan /AngleA ED n 2 mul dup index exch index yB sub exch xB sub Atan
1794 /AngleB ED GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 n 2 mul 4 add 4 roll xA1
1795 yA1 ] cvx def mark LPutVar tx@Dict begin false Line end /LPutPos {
1796 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1797 ifelse } def
1798 /NCCurve { GetEdgeA GetEdgeB xA1 xB1 sub yA1 yB1 sub Pyth 2 div dup 3 -1
1799 roll mul /ArmA ED mul /ArmB ED /ArmTypeA 0 def /ArmTypeB 0 def GetArmA
1800 GetArmB xA2 yA2 xA1 yA1 tx@Dict begin ArrowA end xB2 yB2 xB1 yB1 tx@Dict
1801 begin ArrowB end curveto /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ]
1802 cvx def /LPutPos { t LPutVar BezierMidpoint } def /HPutPos { { HPutLines
1803 } HPutCurve } def /VPutPos { { VPutLines } HPutCurve } def } def
1804 %
1805 /NCAngles { 
1806   GetEdgeA GetEdgeB GetArmA GetArmB 
1807   /mtrx AngleA matrix rotate def 
1808   xA2 yA2 mtrx transform pop 
1809   xB2 yB2 mtrx transform exch pop 
1810   mtrx itransform 
1811   /y0 ED /x0 ED 
1812   mark ArmB 0 ne { xB1 yB1 } if 
1813   xB2 yB2 x0 y0 xA2 yA2 
1814   ArmA 0 ne { xA1 yA1 } if 
1815   tx@Dict begin false Line end 
1816   /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA2 yA2 xA1 yA1 ] cvx def 
1817   /LPutPos { LPutLines } def
1818   /HPutPos { HPutLines } def 
1819   /VPutPos { VPutLines } def } def
1820 %
1821 /NCAngle { GetEdgeA GetEdgeB GetArmB /mtrx AngleA matrix rotate def xB2
1822 yB2 mtrx itransform pop xA1 yA1 mtrx itransform exch pop mtrx transform
1823 /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA1 yA1
1824 tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA1 yA1 ]
1825 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1826 VPutLines } def } def
1827 /NCBar { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def
1828 xA2 yA2 mtrx itransform pop xB2 yB2 mtrx itransform pop sub dup 0 mtrx
1829 transform 3 -1 roll 0 gt { /yB2 exch yB2 add def /xB2 exch xB2 add def }
1830 { /yA2 exch neg yA2 add def /xA2 exch neg xA2 add def } ifelse mark ArmB
1831 0 ne { xB1 yB1 } if xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict
1832 begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx
1833 def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1834 VPutLines } def } def
1835 /NCDiag { GetEdgeA GetEdgeB GetArmA GetArmB mark ArmB 0 ne { xB1 yB1 } if
1836 xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end
1837 /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1838 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1839 def
1840 /NCDiagg { GetEdgeA GetArmA yB yA2 sub xB xA2 sub Atan 180 add /AngleB ED
1841 GetEdgeB mark xB1 yB1 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin
1842 false Line end /LPutVar [ xB1 yB1 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1843 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1844 def
1845 /NCLoop { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate
1846 def xA2 yA2 mtrx transform loopsize add /yA3 ED /xA3 ED /xB3 xB2 yB2
1847 mtrx transform pop def xB3 yA3 mtrx itransform /yB3 ED /xB3 ED xA3 yA3
1848 mtrx itransform /yA3 ED /xA3 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2
1849 xB3 yB3 xA3 yA3 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false
1850 Line end /LPutVar [ xB1 yB1 xB2 yB2 xB3 yB3 xA3 yA3 xA2 yA2 xA1 yA1 ]
1851 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1852 VPutLines } def } def
1853 % DG/SR modification begin - May 9, 1997 - Patch 1
1854 %/NCCircle { 0 0 NodesepA nodeA \tx@GetEdge pop xA sub 2 div dup 2 exp r
1855 %r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1856 %exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1857 %mul add dup 5 1 roll 90 sub \tx@PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1858 /NCCircle { NodeSepA 0 NodeA 0 GetEdge pop 2 div dup 2 exp r
1859 r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1860 exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1861 mul add dup 5 1 roll 90 sub PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1862 % DG/SR modification end
1863 } def /HPutPos { LPutPos } def /VPutPos { LPutPos } def r AngleA 90 sub a add
1864 AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c 57.2957 r
1865 Div def /y ED /x ED } def
1866 /NCBox { /d ED /h ED /AngleB yB yA sub xB xA sub Atan def /AngleA AngleB
1867 180 add def GetEdgeA GetEdgeB /dx d AngleB sin mul def /dy d AngleB cos
1868 mul neg def /hx h AngleB sin mul neg def /hy h AngleB cos mul def
1869 /LPutVar [ xA1 hx add yA1 hy add xB1 hx add yB1 hy add xB1 dx add yB1 dy
1870 add xA1 dx add yA1 dy add ] cvx def /LPutPos { LPutLines } def /HPutPos
1871 { xB yB xA yA LPutLine } def /VPutPos { HPutPos } def mark LPutVar
1872 tx@Dict begin false Polygon end } def
1873 /NCArcBox { /l ED neg /d ED /h ED /a ED /AngleA yB yA sub xB xA sub Atan
1874 def /AngleB AngleA 180 add def /tA AngleA a sub 90 add def /tB tA a 2
1875 mul add def /r xB xA sub tA cos tB cos sub Div dup 0 eq { pop 1 } if def
1876 /x0 xA r tA cos mul add def /y0 yA r tA sin mul add def /c 57.2958 r div
1877 def /AngleA AngleA a sub 180 add def /AngleB AngleB a add 180 add def
1878 GetEdgeA GetEdgeB /AngleA tA 180 add yA yA1 sub xA xA1 sub Pyth c mul
1879 sub def /AngleB tB 180 add yB yB1 sub xB xB1 sub Pyth c mul add def l 0
1880 eq { x0 y0 r h add AngleA AngleB arc x0 y0 r d add AngleB AngleA arcn }
1881 { x0 y0 translate /tA AngleA l c mul add def /tB AngleB l c mul sub def
1882 0 0 r h add tA tB arc r h add AngleB PtoC r d add AngleB PtoC 2 copy 6 2
1883 roll l arcto 4 { pop } repeat r d add tB PtoC l arcto 4 { pop } repeat 0
1884 0 r d add tB tA arcn r d add AngleA PtoC r h add AngleA PtoC 2 copy 6 2
1885 roll l arcto 4 { pop } repeat r h add tA PtoC l arcto 4 { pop } repeat }
1886 ifelse closepath /LPutVar [ x0 y0 r AngleA AngleB h d ] cvx def /LPutPos
1887 { LPutVar /d ED /h ED /AngleB ED /AngleA ED /r ED /y0 ED /x0 ED t 1 le {
1888 r h add AngleA 1 t sub mul AngleB t mul add dup 90 add /NAngle ED PtoC }
1889 { t 2 lt { /NAngle AngleB 180 add def r 2 t sub h mul t 1 sub d mul add
1890 add AngleB PtoC } { t 3 lt { r d add AngleB 3 t sub mul AngleA 2 t sub
1891 mul add dup 90 sub /NAngle ED PtoC } { /NAngle AngleA 180 add def r 4 t
1892 sub d mul t 3 sub h mul add add AngleA PtoC } ifelse } ifelse } ifelse
1893 y0 add /Y ED x0 add /X ED } def /HPutPos { LPutPos } def /VPutPos {
1894 LPutPos } def } def
1895 /Tfan { /AngleA yB yA sub xB xA sub Atan def GetEdgeA w xA1 xB sub yA1 yB
1896 sub Pyth Pyth w Div CLW 2 div mul 2 div dup AngleA sin mul yA1 add /yA1
1897 ED AngleA cos mul xA1 add /xA1 ED /LPutVar [ xA1 yA1 m { xB w add yB xB
1898 w sub yB } { xB yB w sub xB yB w add } ifelse xA1 yA1 ] cvx def /LPutPos
1899 { LPutLines } def /VPutPos@ { LPutVar flag { 8 4 roll pop pop pop pop }
1900 { pop pop pop pop 4 2 roll } ifelse } def /VPutPos { VPutPos@ VPutLine }
1901 def /HPutPos { VPutPos@ HPutLine } def mark LPutVar tx@Dict begin
1902 /ArrowA { moveto } def /ArrowB { } def false Line closepath end } def
1903
1904 /LPutCoor { NAngle tx@Dict begin /NAngle ED end gsave CM STV CP Y sub neg
1905 exch X sub neg exch moveto setmatrix CP grestore } def
1906
1907 /LPut { tx@NodeDict /LPutPos known { LPutPos } { CP /Y ED /X ED /NAngle 0
1908 def } ifelse LPutCoor  } def
1909 /HPutAdjust { Sin Cos mul 0 eq { 0 } { d Cos mul Sin div flag not { neg }
1910 if h Cos mul Sin div flag { neg } if 2 copy gt { pop } { exch pop }
1911 ifelse } ifelse s add flag { r add neg } { l add } ifelse X add /X ED }
1912 def
1913 /VPutAdjust { Sin Cos mul 0 eq { 0 } { l Sin mul Cos div flag { neg } if
1914 r Sin mul Cos div flag not { neg } if 2 copy gt { pop } { exch pop }
1915 ifelse } ifelse s add flag { d add } { h add neg } ifelse Y add /Y ED }
1916 def
1917 end
1918 % END pst-node.pro
1919
1920 %%EndProcSet
1921 %%BeginProcSet: solides.pro 0 0
1922 %!
1923 % PostScript prologue for pst-solides3d.tex.
1924 % Version 4.03, 2008/07/12
1925 %
1926 %% COPYRIGHT 2008 by Jean-Paul Vignault
1927 %%
1928 %% This program can be redistributed and/or modified under the terms
1929 %% of the LaTeX Project Public License Distributed from CTAN
1930 %% archives in directory macros/latex/base/lppl.txt.
1931 %
1932 /SolidesDict 100 dict def
1933 /SolidesbisDict 100 dict def
1934 SolidesDict begin
1935
1936 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1937 %% %% les variables globales gerees par PSTricks %%
1938 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1939 %% %% les lignes dessous sont a decommenter si l on veut utiliser le
1940 %% %% fichier solides.pro independamment du package PSTricks
1941 %% /Dobs 20 def
1942 %% /THETA 20 def
1943 %% /PHI 50 def
1944 %% /Decran 30 def
1945 %% /XpointVue {Dobs Cos1Cos2 mul} def
1946 %% /YpointVue {Dobs Sin1Cos2 mul} def
1947 %% /ZpointVue {Dobs Sin2 mul} def
1948 %% /xunit 28.14 def
1949 %% /solidhollow false def
1950 %% /solidbiface false def
1951 %% /xunit 28.45 def
1952 %% /tracelignedeniveau? true def
1953 %% /hauteurlignedeniveau 1 def
1954 %% /couleurlignedeniveau {rouge} def
1955 %% /linewidthlignedeniveau 4 def
1956 %% /solidgrid true def
1957 /aretescachees true def
1958 /defaultsolidmode 2 def
1959 /Stroke { strokeopacity .setopacityalpha stroke } def
1960 /Fill { fillopacity .setopacityalpha fill } def
1961
1962 %% variables globales specifiques a PSTricks
1963 %% /activationgestioncouleurs true def
1964 /xmin -10 def
1965 /xmax 10 def
1966 /ymin -10 def
1967 /ymax 10 def
1968
1969 /fillstyle {} def
1970 /startest false def
1971 /cm {} def
1972 /cm_1 {} def
1973 /yunit {xunit} def
1974 /angle_repere 90 def
1975
1976 /hadjust 2.5 def
1977 /vadjust 2.5 def
1978 /pl@n-en-cours false def
1979
1980 /pointilles {
1981    [6.25 3.75] 1.25 setdash
1982 } def
1983 /stockcurrentcpath {} def
1984 /newarrowpath {} def
1985 /chaine 15 string def
1986
1987 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1988 %% choix d une fonte accentuee pour le .ps %%
1989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1990 /ReEncode { exch findfont
1991 dup length dict begin { 1 index /FID eq {pop pop} {def} ifelse
1992 }forall /Encoding ISOLatin1Encoding def currentdict end definefont
1993 pop }bind def
1994 /Font /Times-Roman /ISOfont ReEncode /ISOfont def
1995 %Font findfont 10 scalefont setfont
1996
1997 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1998 %% extrait de color.pro pour pouvoir recuperer ses couleurs %%
1999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2000 /GreenYellow{0.15 0 0.69 0 setcmykcolor}def
2001 /Yellow{0 0 1 0 setcmykcolor}def
2002 /Goldenrod{0 0.10 0.84 0 setcmykcolor}def
2003 /Dandelion{0 0.29 0.84 0 setcmykcolor}def
2004 /Apricot{0 0.32 0.52 0 setcmykcolor}def
2005 /Peach{0 0.50 0.70 0 setcmykcolor}def
2006 /Melon{0 0.46 0.50 0 setcmykcolor}def
2007 /YellowOrange{0 0.42 1 0 setcmykcolor}def
2008 /Orange{0 0.61 0.87 0 setcmykcolor}def
2009 /BurntOrange{0 0.51 1 0 setcmykcolor}def
2010 /Bittersweet{0 0.75 1 0.24 setcmykcolor}def
2011 /RedOrange{0 0.77 0.87 0 setcmykcolor}def
2012 /Mahogany{0 0.85 0.87 0.35 setcmykcolor}def
2013 /Maroon{0 0.87 0.68 0.32 setcmykcolor}def
2014 /BrickRed{0 0.89 0.94 0.28 setcmykcolor}def
2015 /Red{0 1 1 0 setcmykcolor}def
2016 /OrangeRed{0 1 0.50 0 setcmykcolor}def
2017 /RubineRed{0 1 0.13 0 setcmykcolor}def
2018 /WildStrawberry{0 0.96 0.39 0 setcmykcolor}def
2019 /Salmon{0 0.53 0.38 0 setcmykcolor}def
2020 /CarnationPink{0 0.63 0 0 setcmykcolor}def
2021 /Magenta{0 1 0 0 setcmykcolor}def
2022 /VioletRed{0 0.81 0 0 setcmykcolor}def
2023 /Rhodamine{0 0.82 0 0 setcmykcolor}def
2024 /Mulberry{0.34 0.90 0 0.02 setcmykcolor}def
2025 /RedViolet{0.07 0.90 0 0.34 setcmykcolor}def
2026 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}def
2027 /Lavender{0 0.48 0 0 setcmykcolor}def
2028 /Thistle{0.12 0.59 0 0 setcmykcolor}def
2029 /Orchid{0.32 0.64 0 0 setcmykcolor}def
2030 /DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}def
2031 /Purple{0.45 0.86 0 0 setcmykcolor}def
2032 /Plum{0.50 1 0 0 setcmykcolor}def
2033 /Violet{0.79 0.88 0 0 setcmykcolor}def
2034 /RoyalPurple{0.75 0.90 0 0 setcmykcolor}def
2035 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}def
2036 /Periwinkle{0.57 0.55 0 0 setcmykcolor}def
2037 /CadetBlue{0.62 0.57 0.23 0 setcmykcolor}def
2038 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}def
2039 /MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}def
2040 /NavyBlue{0.94 0.54 0 0 setcmykcolor}def
2041 /RoyalBlue{1 0.50 0 0 setcmykcolor}def
2042 /Blue{1 1 0 0 setcmykcolor}def
2043 /Cerulean{0.94 0.11 0 0 setcmykcolor}def
2044 /Cyan{1 0 0 0 setcmykcolor}def
2045 /ProcessBlue{0.96 0 0 0 setcmykcolor}def
2046 /SkyBlue{0.62 0 0.12 0 setcmykcolor}def
2047 /Turquoise{0.85 0 0.20 0 setcmykcolor}def
2048 /TealBlue{0.86 0 0.34 0.02 setcmykcolor}def
2049 /Aquamarine{0.82 0 0.30 0 setcmykcolor}def
2050 /BlueGreen{0.85 0 0.33 0 setcmykcolor}def
2051 /Emerald{1 0 0.50 0 setcmykcolor}def
2052 /JungleGreen{0.99 0 0.52 0 setcmykcolor}def
2053 /SeaGreen{0.69 0 0.50 0 setcmykcolor}def
2054 /Green{1 0 1 0 setcmykcolor}def
2055 /ForestGreen{0.91 0 0.88 0.12 setcmykcolor}def
2056 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}def
2057 /LimeGreen{0.50 0 1 0 setcmykcolor}def
2058 /YellowGreen{0.44 0 0.74 0 setcmykcolor}def
2059 /SpringGreen{0.26 0 0.76 0 setcmykcolor}def
2060 /OliveGreen{0.64 0 0.95 0.40 setcmykcolor}def
2061 /RawSienna{0 0.72 1 0.45 setcmykcolor}def
2062 /Sepia{0 0.83 1 0.70 setcmykcolor}def
2063 /Brown{0 0.81 1 0.60 setcmykcolor}def
2064 /Tan{0.14 0.42 0.56 0 setcmykcolor}def
2065 /Gray{0 0 0 0.50 setcmykcolor}def
2066 /Black{0 0 0 1 setcmykcolor}def
2067 /White{0 0 0 0 setcmykcolor}def
2068 %% fin de l extrait color.pro
2069
2070 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2071 %%%%             autres couleurs                        %%%%
2072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2073
2074 /bleu {0 0 1 setrgbcolor} def
2075 /rouge {1 0 0 setrgbcolor} def
2076 /vert {0 .5 0 setrgbcolor} def
2077 /gris {.4 .4 .4 setrgbcolor} def
2078 /jaune {1 1 0 setrgbcolor} def
2079 /noir {0 0 0 setrgbcolor} def
2080 /blanc {1 1 1 setrgbcolor} def
2081 /orange {1 .65 0 setrgbcolor} def
2082 /rose {1 .01 .58  setrgbcolor} def
2083 /cyan {1 0 0 0 setcmykcolor} def
2084 /magenta {0 1 0 0 setcmykcolor} def
2085
2086 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2087 %%%%             definition du point de vue             %%%%
2088 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2089 %% pour la 3D conventionnelle
2090 %% Dony : graphisme scientifique : page 187
2091 %% Editeur : Masson
2092
2093 %% calcul des coefficients de la matrice
2094 %% de transformation
2095 /Sin1 {THETA sin} def
2096 /Sin2 {PHI sin} def
2097 /Cos1 {THETA cos} def
2098 /Cos2 {PHI cos} def
2099 /Cos1Sin2 {Cos1 Sin2 mul} def
2100 /Sin1Sin2 {Sin1 Sin2 mul} def
2101 /Cos1Cos2 {Cos1 Cos2 mul} def
2102 /Sin1Cos2 {Sin1 Cos2 mul} def
2103
2104 /3dto2d {
2105 6 dict begin
2106    /Zcote exch def
2107    /Yordonnee exch def
2108    /Xabscisse exch def
2109    /xObservateur
2110       Xabscisse Sin1 mul neg Yordonnee Cos1 mul add
2111    def
2112    /yObservateur
2113       Xabscisse Cos1Sin2 mul neg Yordonnee Sin1Sin2 mul sub Zcote Cos2
2114       mul add
2115    def
2116    /zObservateur
2117       Xabscisse neg Cos1Cos2 mul Yordonnee Sin1Cos2 mul sub Zcote Sin2
2118       mul sub Dobs add
2119    def
2120    %% maintenant on depose les resultats sur la pile
2121    Decran xObservateur mul zObservateur div cm
2122    Decran yObservateur mul zObservateur div cm
2123 end
2124 } def
2125
2126 /getpointVue {
2127    XpointVue
2128    YpointVue
2129    ZpointVue
2130 } def
2131
2132 /GetCamPos {
2133    getpointVue
2134 } def
2135
2136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2137 %%%%         jps modifie pour PSTricks                  %%%%
2138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2139
2140 /solid {continu} def
2141 /dashed {pointilles} def
2142
2143 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2144 %%%%             geometrie basique                      %%%%
2145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2146
2147 %% syntaxe~: [x1 y1 ... xn yn] ligne
2148 /ligne {
2149 gsave
2150    newpath
2151       dup 0 getp smoveto
2152       ligne_
2153       starfill
2154    Stroke
2155 grestore
2156 } def
2157
2158 %% syntaxe~: [x1 y1 ... xn yn] ligne_
2159 /ligne_ {
2160    reversep
2161    aload length 2 idiv
2162    {
2163       slineto
2164    } repeat
2165 } def
2166
2167 %% syntaxe~: [x1 y1 ... xn yn] polygone
2168 /polygone* {
2169 1 dict begin
2170    /startest {true} def
2171    polygone
2172 end
2173 } def
2174
2175 /polygone_ {
2176    newpath
2177       aload length 2 idiv
2178       3 copy pop
2179       smoveto
2180       {
2181          slineto
2182       } repeat
2183    closepath
2184 } def
2185
2186 /polygone {
2187    gsave
2188       polygone_
2189       starfill
2190       currentlinewidth 0 eq {} {Stroke} ifelse
2191    grestore
2192 } def
2193
2194 %% syntaxe : x y point
2195 /point {
2196 gsave
2197    1 setlinecap
2198    newpath
2199       smoveto
2200       0 0 rlineto
2201       5 setlinewidth
2202    Stroke
2203 grestore
2204 } def
2205
2206 /point_ {
2207    1 setlinecap
2208    5 setlinewidth
2209       smoveto
2210       0 0 rlineto
2211 } def
2212
2213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2215 %%%%                                                    %%%%
2216 %%%%          insertion librairie jps                   %%%%
2217 %%%%                                                    %%%%
2218 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2220
2221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2222 %%%%              le repere jps                         %%%%
2223 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2224
2225 /sysatan {systemdict /atan get exec} def
2226 /atan {2 copy 0 0 eqp {pop pop 0} {sysatan} ifelse} def
2227 %%%%% ### AAAscale ###
2228 %%%%%%%%%%%%%%%% les deplacements a l echelle %%%%%%%%%%%%%%%%%%%
2229
2230  /v@ct_I {xunit 0} def
2231  /v@ct_J {angle_repere cos yunit mul angle_repere sin yunit mul} def
2232
2233 /xscale {} def
2234 /yscale {} def
2235
2236 /xscale-1 {} def
2237 /yscale-1 {} def
2238
2239 /gtransform {} def
2240 /gtransform-1 {} def
2241
2242 /jtoppoint {
2243 2 dict begin
2244    gtransform
2245    /y exch yscale def
2246    /x exch xscale def
2247    v@ct_I x mulv
2248    v@ct_J y mulv
2249    addv
2250 end
2251 } def
2252
2253 /rptojpoint {
2254    xtranslate ytranslate 
2255    3 1 roll         %% xA yB yA xB 
2256    4 1 roll         %% xB xA yB yA 
2257    sub neg 3 1 roll %% yB-yA xB xA 
2258    sub neg exch
2259    ptojpoint
2260 } def
2261
2262 /rptoppoint {
2263    xtranslate ytranslate 
2264    3 1 roll         %% xA yB yA xB 
2265    4 1 roll         %% xB xA yB yA 
2266    sub neg 3 1 roll %% yB-yA xB xA 
2267    sub neg exch
2268 } def
2269
2270 /ptojpoint {
2271 4 dict begin
2272    /Y exch yscale-1 def
2273    /X exch xscale-1 def
2274    /y Y yunit angle_repere sin mul div def
2275    /x X y yunit mul angle_repere cos mul sub xunit div def
2276    x y
2277    gtransform-1
2278 end
2279 } def
2280
2281 /smoveto {
2282    jtoppoint
2283    moveto
2284 } def
2285
2286 /srmoveto {
2287    jtoppoint
2288    rmoveto
2289 } def
2290
2291 /slineto {
2292    jtoppoint
2293    lineto
2294 } def
2295
2296 /srlineto {
2297    jtoppoint
2298    rlineto
2299 } def
2300
2301 /stranslate {
2302    jtoppoint
2303    translate
2304 } def
2305
2306 %%%%% ### fin insertion ###
2307
2308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2309 %%%%            methodes numeriques                     %%%%
2310 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2311
2312 %%%%% ### solve2nddegre ###
2313 %% syntaxe : a b c solve2nddegre --> x1 x2
2314 /solve2nddegre {
2315 5 dict begin
2316    /@c exch def
2317    /@b exch def
2318    /@a exch def
2319    /delt@ @b dup mul 4 @a mul @c mul sub def
2320    @b neg delt@ sqrt sub 2 @a mul div
2321    @b neg delt@ sqrt add 2 @a mul div
2322 end
2323 } def
2324
2325 %%%%% ### fin insertion ###
2326
2327 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2328 %%%%                  la 2D                             %%%%
2329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2330
2331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2332 %%%%                  points                            %%%%
2333 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2334
2335 %%%%% ### tripointangle ###
2336 %% syntaxe : A B C tripointangle --> angle ABC
2337 /tripointangle {
2338 9 dict begin
2339    /yC exch def
2340    /xC exch def
2341    /yB exch def
2342    /xB exch def
2343    /yA exch def
2344    /xA exch def
2345    /A {xA yA} def
2346    /B {xB yB} def
2347    /C {xC yC} def
2348    B C angle
2349    B A angle
2350    sub
2351 end   
2352 } def
2353
2354 %%%%% ### angle ###
2355 %% syntaxe : A B angle
2356 %% --> num, l'angle defini par le vecteur AB dans le repere orthonorme jps 
2357 /angle {
2358    vecteur exch atan
2359    dup 180 gt 
2360       {360 sub}
2361    if
2362 } def
2363
2364 %% syntaxe : A B pangle
2365 %% --> num, l'angle defini par le vecteur AB dans le repere postscript
2366 /pangle {
2367    jtoppoint exchp jtoppoint exchp vecteur exch atan
2368    dup 180 gt 
2369          {360 sub}
2370    if
2371 } def
2372
2373 %%%%% ### setxrange ###
2374 /setxrange {
2375    /xmax exch def
2376    /xmin exch def
2377 } def
2378
2379 %%%%% ### setyrange ###
2380 /setyrange {
2381    /ymax exch def
2382    /ymin exch def
2383 } def
2384
2385 %%%%% ### defpoint ###
2386 %% syntaxe : xA yA /A defpoint
2387 /defpoint {
2388 1 dict begin
2389    /t@mp@r@ire exch def
2390    [ 3 1 roll ] cvx t@mp@r@ire exch 
2391 end def
2392 } def
2393
2394 %%%%% ### milieu ###
2395 %% syntaxe~: A B milieu 
2396 /milieu {  
2397                 %% xA yA xB yB
2398    3 -1 roll    %% xA xB yB yA 
2399    add 2 div    %% xA xB yM
2400    3 1 roll     %% yM xA xB 
2401    add 2 div    %% yM xM
2402    exch
2403 } def
2404
2405 %%%%% ### parallelopoint ###
2406 %% syntaxe : A B C parallelopoint --> point D, tel que ABCD parallelogramme
2407 /parallelopoint {
2408 11 dict begin
2409    /yC exch def
2410    /xC exch def
2411    /yB exch def
2412    /xB exch def
2413    /yA exch def
2414    /xA exch def
2415    /A {xA yA} def
2416    /B {xB yB} def
2417    /C {xC yC} def
2418    /d1 {A B C paral} def
2419    /d2 {B C A paral} def
2420    d1 d2 interdroite
2421 end
2422 } def
2423
2424 %%%%% ### translatepoint ###
2425 %% syntaxe : A u translatepoint --> B image de A par la translation de vecteur u
2426 /translatepoint {
2427    addv
2428 } def
2429
2430 %%%%% ### rotatepoint ###
2431 %% syntaxe : B A r rotatepoint --> C image de B par la rotation de centre A,
2432 %% d'angle r (en degre)
2433 %% En prenant les affixes des pts associes, il vient
2434 %%    (zC - zA) = (zB-zA) e^(ir)
2435 %% soit 
2436 %%    zC = (zB-zA) e^(ir) + zA
2437 /rotatepoint {     %% B, A, r
2438    5 copy          %% B, A, r, B, A, r
2439    cos 5 1 roll    %% B, A, r, cos r, B, A
2440    4 1 roll        %% B, A, r, cos r, yA, B, xA
2441    4 1 roll        %% B, A, r, cos r, A, B 
2442    vecteur         %% B, A, r, cos r, xB-xA, yB-yA
2443    4 -1 roll sin   %% B, A, cos r, xB-xA, yB-yA, sin r
2444    4 copy mul      %% B, A, cos r, xB-xA, yB-yA, sin r, cos r, xB-xA, (yB-yA) sin r
2445    7 1 roll mul    %% B, A, (yB-yA) sin r, cos r, xB-xA, yB-yA, sin r, cos r (xB-xA)
2446    5 1 roll        %% B, A, (yB-yA) sin r, cos r (xB-xA), cos r, xB-xA, yB-yA, sin r
2447    exch            %% B, A, (yB-yA) sin r, cos r (xB-xA), cos r, xB-xA, sin r, yB-yA
2448    4 -1 roll mul   %% B, A, (yB-yA) sin r, cos r (xB-xA), xB-xA, sin r, (yB-yA)cos r
2449    3 1 roll mul    %% B, A, (yB-yA) sin r, cos r (xB-xA), (yB-yA) cos r, (xB-xA) sin r
2450    add             %% B, A, (yB-yA) sin r, cos r (xB-xA), (yB-yA) cos r +(xB-xA) sin r
2451    3 1 roll        %% B, A, (yB-yA) cos r + (xB-xA) sin r, (yB-yA) sin r, cos r (xB-xA), 
2452    exch sub        %% B, A, (yB-yA) cos r + (xB-xA) sin r, cos r (xB-xA)-(yB-yA) sin r 
2453    exch            %% B, zA, (zB-zA) e^(ir)
2454    addv
2455    3 -1 roll pop
2456    3 -1 roll pop
2457 } def
2458
2459 %%%%% ### hompoint ###
2460 %% syntaxe : B A alpha hompoint -> le point A' tel que AA' = alpha AB
2461 /hompoint {
2462    5 copy
2463    pop
2464    vecteur      %% vecteur BA
2465    3 -1 roll
2466    neg
2467    mulv   %% alpha x vecteur AB
2468    addv
2469    4 -1 roll
2470    4 -1 roll
2471    pop pop
2472 } def
2473
2474 %%%%% ### orthoproj ###
2475 %% syntaxe : A D orthoproj --> B, le projete orthogonal de A sur D
2476 /orthoproj {
2477    6 -1 roll
2478    6 -1 roll            %% D A
2479    6 copy               %% D A D A
2480    7 -1 roll pop
2481    7 -1 roll pop        %% D D A
2482    perp 
2483    interdroite
2484 } def
2485
2486 %% syntaxe : A projx --> le projete orthogonal de A sur Ox
2487 /projx {
2488    pop 0
2489 } def
2490
2491 %% syntaxe : A projy --> le projete orthogonal de A sur Oy
2492 /projy {
2493    exch pop 0 exch
2494 } def
2495
2496 %%%%% ### sympoint ###
2497 %% syntaxe : A I sympoint --> point A', le symetrique de A par rapport
2498 %% au point I
2499 /sympoint {
2500    4 copy
2501    pop pop
2502    vecteur 
2503    -2 mulv
2504    addv
2505 } def
2506
2507 %%%%% ### axesympoint ###
2508 %% syntaxe : A D axesympoint --> point B, le symetrique de A par rapport
2509 %% a la droite D
2510 /axesympoint {
2511 2 dict begin
2512    6 copy
2513    pop pop pop pop
2514    /yA exch def
2515    /xA exch def
2516    orthoproj 
2517    xA yA vecteur 
2518    -2 mulv
2519    xA yA addv
2520 end   
2521 } def
2522
2523 %%%%% ### cpoint ###
2524 %% syntaxe : alpha C cpoint -> M, le point du cercle C correspondant a
2525 %% l'angle alpha
2526 /cpoint {           %% a, xI, yI, r 
2527 1 dict begin
2528    dup              %% a, xI, yI, r, r
2529    5 -1 roll        %% xI, yI, r, r, a
2530    /alpha exch def  
2531    alpha cos mul    %% xI, yI, r, r cos a
2532    exch
2533    alpha sin mul    %% xI, yI, r cos a, r sin a
2534    3 -1 roll add    %% xI, r cos a, yI + r sin a
2535    3 1 roll         %% yI + r sin a, xI, r cos a, 
2536    add exch         %% xI + r cos a, yI + r sin a
2537 end
2538 } def
2539
2540 %%%%% ### xdpoint ###
2541 %% x A B xdpoint : le point de la droite (AB) d'abscisse x
2542 /xdpoint {
2543 5 dict begin
2544    /pt2 defpoint
2545    /pt1 defpoint
2546    /x exch def
2547    /a pt1 pt2 coeffdir def
2548    /b pt1 pt2 ordorig def
2549    x dup a mul b add
2550 end   
2551 } def
2552
2553 %%%%% ### ydpoint ###
2554 %% y A B ydpoint : le point de la droite (AB) d'ordonnee y
2555 /ydpoint {
2556 5 dict begin
2557    /pt2 defpoint
2558    /pt1 defpoint
2559    /y exch def
2560    pt1 pt2 verticale? 
2561       {
2562          pt1 pop y
2563       }
2564       {
2565          /a pt1 pt2 coeffdir def
2566          /b pt1 pt2 ordorig def
2567          y b sub a div y
2568       }
2569    ifelse
2570 end   
2571 } def
2572
2573 %%%%% ### ordonnepoints ###
2574 %% syntaxe : xA yA xB yB ordonnepoints --> idem si yB>yA ou si yB=yA
2575 %% avec xB>xA, sinon xB yB xA yA
2576 /ordonnepoints {
2577    4 copy
2578    exch pop             %% ... xA, yA, yB
2579    lt                   %% yA < yB ?
2580       {pop}                     %% oui, c'est fini
2581       {                         %% non : yA >= yB
2582          pop 4 copy  
2583          exch pop               %% ... xA, yA, yB
2584          eq                     %% yA = yB ?
2585             {
2586                3 copy                   %% oui, yA = yB
2587                pop pop                  %% ... xA, xB
2588                le                       %% xA =< xB ?
2589                   {}                          %% oui, c'est fini
2590                   {                           %% non, on echange A et B
2591                      4 -1 roll
2592                      4 -1 roll
2593                   }
2594                ifelse
2595             }
2596             {                           %% non : yA < yB => on echange A et B
2597                pop
2598                4 -1 roll
2599                4 -1 roll
2600             }
2601          ifelse
2602       } 
2603    ifelse
2604 } def
2605
2606 %%%%% ### distance ###
2607 %% syntaxe~: A B distance
2608 /distance {      %% xA yA xB yB
2609    vecteur       %% x y
2610    dup mul exch  %% y^2 x
2611    dup mul       %% y^2 x^2
2612    add
2613    sqrt
2614 } def
2615
2616 %%%%% ### dup ###
2617 /dupp {2 copy} def
2618 /dupc {3 copy} def
2619 /dupd {4 copy} def
2620
2621 %%%%% ### fin insertion ###
2622 /interdroites {interdroite} def
2623
2624 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2625 %%%%                 vecteurs                           %%%%
2626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2627
2628 %%%%% ### vecteur ###
2629 %% syntaxe~: A B vecteur
2630 /vecteur {
2631                 %% xA yA xB yB 
2632    3 -1 roll    %% xA xB yB yA 
2633    sub          %% xA xB yB-yA 
2634    3 1 roll     %% yB-yA xA xB 
2635    exch sub     %% yB-yA xB-xA 
2636    exch
2637 } def
2638
2639 %%%%% ### normalize ###
2640 %% syntaxe : u normalize -> u / ||u||
2641 /normalize {
2642 2 dict begin
2643    /u defpoint
2644    /n u norme def
2645    u 1 n div mulv
2646 end
2647 } def
2648
2649 %%%%% ### addv ###
2650 %% syntaxe : u v addv --> u+v
2651 /addv {         %% xA yA xB yB
2652    3 1 roll     %% xA yB yA xB 
2653    4 1 roll     %% xB xA yB yA 
2654    add 3 1 roll %% yB+yA xB xA 
2655    add exch
2656 } def
2657
2658 %%%%% ### subv ###
2659 %% syntaxe : u v subv --> u - v
2660 /subv { %% xA yA xB yB
2661    -1 mulv
2662    addv
2663 } def
2664
2665 %%%%% ### mulv ###
2666 %% syntaxe : u a mulv --> au
2667 /mulv {   %% xA, yA, a
2668    dup          %% xA, yA, a, a
2669    3 1 roll     %% xA, a, yA, a
2670    mul 3 1 roll %% ayA, xA, a
2671    mul exch
2672 } def
2673
2674 %%%%% ### scalprod ###
2675 %% syntaxe : u v scalprod --> le produit scalaire de u par v
2676 /scalprod {
2677 2 dict begin
2678    /y' exch def
2679    exch 
2680    /y exch def
2681    mul y y' mul add
2682 end
2683 } def
2684
2685 %%%%% ### normal ###
2686 %% syntaxe : u normal --> v tel u.v = 0
2687 /normal {
2688    neg exch
2689 } def
2690
2691 %%%%% ### norme ###
2692 %% syntaxe : u norme --> |u|
2693 /norme {
2694    dup mul
2695    exch
2696    dup mul
2697    add sqrt
2698 } def
2699
2700 %%%%% ### oldarrow ###
2701 %% syntaxe : A B oldarrow --> trace fleche en B, direction AB
2702 /oldarrow {
2703 4 dict begin
2704 gsave
2705    /B defpoint
2706    /A defpoint
2707    oldarrowscale scale
2708    oldarrowangle rotate
2709    newpath 
2710    B smoveto
2711    A B vecteur normalize /u defpoint
2712    u neg exch /v defpoint
2713    u oldarrowpointe neg mulv rmoveto %% ainsi c'est la pointe qui est en (0, 0)
2714    %% le pt extremal arriere haut
2715       u oldarrowplume neg mulv        %% l'abscisse
2716       v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul mulv addv %% l'ordonnee
2717    rlineto
2718       u oldarrowplume oldarrowpointe add mulv
2719       v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul neg mulv addv
2720    rlineto 
2721       u oldarrowplume oldarrowpointe add neg mulv
2722       v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul neg mulv addv
2723    rlineto
2724    closepath Fill
2725 grestore
2726 end
2727 } def
2728
2729 /oldarrowpointe {xunit 5 div} def
2730 /oldarrowplume {xunit 10 div} def 
2731 /oldarrow@ngle 45 def        
2732 /oldarrowscale {1 1} def
2733 /oldarrowangle 0 def     %% pour l'utilisateur
2734
2735 %%%%% ### drawvecteur ###
2736 %% syntaxe : A B drawvecteur
2737 /drawvecteur {
2738 2 dict begin
2739    /B defpoint
2740    /A defpoint
2741    [A B] ligne
2742    A B oldarrow
2743 end
2744 } def
2745
2746 %%%%% ### orthovecteur ###
2747 %% syntaxe : u orthovecteur --> v, vecteur orthogonal a u
2748 /orthovecteur {
2749    neg exch
2750 } def
2751
2752 %%%%% ### fin insertion ###
2753
2754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2755 %%%%                  cercles                           %%%%
2756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2757
2758 %%%%% ### defcercle ###
2759 %% syntaxe : A r /d defcercle
2760 /defcercle {
2761 1 dict begin
2762    /t@mp@r@ire exch def
2763    [ 4 1 roll ] cvx t@mp@r@ire exch 
2764 end def
2765 } def
2766
2767 %%%%% ### interdroitecercle ###
2768 %% intersection de la droite y = ax+b avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2769 %% { --       b - y                   2          2           3
2770 %% { |  x = - -----, y = (b + a x0 + a  y0 + (2 a  b y0 - 2 a  b x0 +
2771 %% { --         a
2772 %% 
2773 %%       3          2  2    2  2    4  2    2   2    4   2             2
2774 %%    2 a  x0 y0 - a  b  + a  r  + a  r  - a  y0  - a  x0 )^(1/2)) / (a  + 1)
2775 %% 
2776 %% 
2777 %%    -- 
2778 %%     |,
2779 %%    -- 
2780 %%     --       b - y                   2          2           3
2781 %%     |  x = - -----, y = (b + a x0 + a  y0 - (2 a  b y0 - 2 a  b x0 +
2782 %%     --         a
2783 %% 
2784 %%       3          2  2    2  2    4  2    2   2    4   2             2
2785 %%    2 a  x0 y0 - a  b  + a  r  + a  r  - a  y0  - a  x0 )^(1/2)) / (a  + 1)
2786 %% 
2787 %%    -- }
2788 %%     | }
2789 %%    -- }
2790
2791 %% intersection de la droite x = a avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2792 %%                              2    2     2 1/2
2793 %% {[x = a, y = y0 + (2 a x0 - a  + r  - x0 )   ],
2794 %% 
2795 %%                                2    2     2 1/2
2796 %%    [x = a, y = y0 - (2 a x0 - a  + r  - x0 )   ]}
2797
2798 %% intersection de la droite y = b avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2799 %%                              2    2     2 1/2
2800 %% {[y = b, x = x0 + (2 b y0 - b  + r  - y0 )   ],
2801 %% 
2802 %%                                2    2     2 1/2
2803 %%    [y = b, x = x0 - (2 b y0 - b  + r  - y0 )   ]}
2804
2805 %% syntaxe : D I r interdroitecercle
2806 /interdroitecercle {
2807 16 dict begin
2808    /r exch def
2809    /y0 exch def
2810    /x0 exch def
2811    /yB exch def
2812    /xB exch def
2813    /yA exch def
2814    /xA exch def
2815
2816    xA yA xB yB verticale?
2817
2818    %% la droite est verticale
2819    {
2820       /xpt1 xA def
2821       /xpt2 xA def
2822       /quantite 
2823          2 xA mul x0 mul xA dup mul sub r dup mul add x0 dup mul sub sqrt
2824       def
2825       /ypt1
2826          y0 quantite add
2827       def
2828       /ypt2
2829          y0 quantite sub
2830       def
2831    }
2832
2833    %% la droite n'est pas verticale
2834    {
2835       /a xA yA xB yB coeffdir def
2836       /b xA yA xB yB ordorig def
2837
2838       0 a eq 
2839       %% la droite est horizontale
2840       {
2841          /quantite
2842             2 b mul y0 mul 
2843             b dup mul sub
2844             r dup mul add
2845             y0 dup mul sub
2846             sqrt
2847          def
2848          /xpt1 
2849             x0 quantite add
2850          def
2851          /xpt2 
2852             x0 quantite sub
2853          def
2854          /ypt1 b def
2855          /ypt2 b def
2856       } 
2857
2858       %% la droite n'est pas horizontale
2859       {
2860          /quantite1 
2861             b 
2862             a x0 mul add
2863             a dup mul y0 mul add
2864          def
2865          /quantite2
2866             2 a dup mul mul b mul y0 mul 
2867             2 a 3 exp mul b mul x0 mul sub
2868             2 a 3 exp mul x0 mul y0 mul add
2869             a dup mul b dup mul mul sub
2870             a dup mul r dup mul mul add
2871             a 4 exp r dup mul mul add
2872             a dup mul y0 dup mul mul sub
2873             a 4 exp x0 dup mul mul sub 
2874             sqrt 
2875          def
2876          /quantite3 
2877             a dup mul 1 add 
2878          def
2879          /ypt1
2880             quantite1 quantite2 add quantite3 div
2881          def
2882          /xpt1 
2883             ypt1 b sub a div 
2884          def
2885          /ypt2
2886             quantite1 quantite2 sub quantite3 div
2887          def
2888          /xpt2 
2889             ypt2 b sub a div 
2890          def
2891       } 
2892       ifelse
2893    }
2894    ifelse
2895    
2896    xpt1 ypt1 
2897    xpt2 ypt2 
2898    ordonnepoints
2899 end
2900 } def
2901
2902 %%%%% ### intercercle ###
2903 %% syntaxe : cerc1 cerc2 intercercle --> A B les points d'intersection
2904 %% des 2 cercles, tries par 'ordonnepoints'
2905 /intercercle {
2906 12 dict begin
2907    /r2 exch def
2908    /y2 exch def
2909    /x2 exch def
2910    /r1 exch def
2911    /y1 exch def
2912    /x1 exch def
2913
2914    %% on translate pour se ramener a (x1, y1) = (0, 0)
2915    x2 y2 x1 y1 subv
2916    /y2 exch def
2917    /x2 exch def
2918
2919    %% on prepare l'equation du 2nd degre
2920
2921 %%                    2       2    2
2922 %%   {y = RootOf((4 x2  + 4 y2 ) _Z
2923 %% 
2924 %%                  3        2              2       2            4
2925 %%          + (-4 y2  - 4 r1~  y2 + 4 y2 r2~  - 4 x2  y2) _Z + x2
2926 %% 
2927 %%               4       2    2       2   2       2    2        2   2
2928 %%          + r2~  - 2 y2  r2~  + 2 x2  y2  - 2 x2  r2~  - 2 r1~  x2
2929 %% 
2930 %%               4     4        2   2        2    2
2931 %%          + r1~  + y2  + 2 r1~  y2  - 2 r1~  r2~ ), x = 1/2 (-2 y2
2932 %% 
2933 %%                     2       2    2
2934 %%         RootOf((4 x2  + 4 y2 ) _Z
2935 %% 
2936 %%                  3        2              2       2            4
2937 %%          + (-4 y2  - 4 r1~  y2 + 4 y2 r2~  - 4 x2  y2) _Z + x2
2938 %% 
2939 %%               4       2    2       2   2       2    2        2   2
2940 %%          + r2~  - 2 y2  r2~  + 2 x2  y2  - 2 x2  r2~  - 2 r1~  x2
2941 %% 
2942 %%               4     4        2   2        2    2       2     2     2
2943 %%          + r1~  + y2  + 2 r1~  y2  - 2 r1~  r2~ ) + r1~  + x2  + y2
2944 %% 
2945 %%               2
2946 %%          - r2~ )/x2}
2947
2948    %% coeff pour le degre 2
2949    /a 
2950       %%                    2       2    2
2951       %%   {y = RootOf((4 x2  + 4 y2 ) _Z
2952       4 x2 dup mul mul
2953       4 y2 dup mul mul add
2954    def
2955
2956    %% coeff pour le degre 1
2957    %%
2958    /b 
2959       %%                    3        2              2       2        
2960       %%            + (-4 y2  - 4 r1~  y2 + 4 y2 r2~  - 4 x2  y2) _Z 
2961       -4 y2 3 exp mul
2962       4 r1 dup mul mul y2 mul sub
2963       4 r2 dup mul mul y2 mul add
2964       4 x2 dup mul mul y2 mul sub
2965    def
2966
2967    %% coeff pour le degre 0
2968    %%
2969    /c {
2970       %%              4
2971       %%          + x2
2972       x2 4 exp
2973       %% 
2974       %%               4       2    2       2   2       2    2        2   2
2975       %%          + r2~  - 2 y2  r2~  + 2 x2  y2  - 2 x2  r2~  - 2 r1~  x2
2976       r2 4 exp add
2977       2 y2 dup mul mul r2 dup mul mul sub
2978       2 x2 dup mul mul y2 dup mul mul add
2979       2 x2 dup mul mul r2 dup mul mul sub
2980       2 x2 dup mul mul r1 dup mul mul sub
2981       %% 
2982       %%               4     4        2   2        2    2
2983       %%          + r1~  + y2  + 2 r1~  y2  - 2 r1~  r2~ )
2984       r1 4 exp add
2985       y2 4 exp add
2986       2 r1 dup mul mul y2 dup mul mul add
2987       2 r1 dup mul mul r2 dup mul mul sub
2988    } def
2989
2990    a b c solve2nddegre
2991    /Y1 exch def
2992    /Y0 exch def
2993    
2994    /X0
2995       %% x = 1/2 (-2 y2  Y
2996       -2 y2 mul Y0 mul
2997       %% 
2998       %%        2     2     2
2999       %% + r1~  + x2  + y2
3000       r1 dup mul add
3001       x2 dup mul add
3002       y2 dup mul add
3003       %% 
3004       %%                 2
3005       %%            - r2~ )/x2}
3006       r2 dup mul sub
3007    
3008       2 x2 mul div
3009    def
3010    
3011    /X1
3012       %% x = 1/2 (-2 y2  Y
3013       -2 y2 mul Y1 mul
3014       %% 
3015       %%        2     2     2
3016       %% + r1~  + x2  + y2
3017       r1 dup mul add
3018       x2 dup mul add
3019       y2 dup mul add
3020       %% 
3021       %%                 2
3022       %%            - r2~ )/x2}
3023       r2 dup mul sub
3024    
3025       2 x2 mul div
3026    def
3027
3028    %% on depose le resultat, en n'oubliant pas de retranslater en sens
3029    %% inverse
3030
3031    X0 Y0 x1 y1 addv
3032    X1 Y1 x1 y1 addv
3033    ordonnepoints
3034 end
3035 } def
3036
3037 %%%%% ### ABcercle ###
3038 %% syntaxe : A B C ABcercle --> le cercle passant par A, B, C
3039 /ABcercle {
3040 3 dict begin
3041    /@3 defpoint
3042    /@2 defpoint
3043    /@1 defpoint
3044    @1 @2 mediatrice
3045    @1 @3 mediatrice
3046    interdroite
3047    dupp
3048    @3 distance
3049 end   
3050 } def
3051
3052 %%%%% ### diamcercle ###
3053 %% syntaxe : A B diamcercle --> le cercle de diametre [AB]
3054 /diamcercle {
3055    4 copy
3056    distance 2 div
3057    5 1 roll 
3058    milieu
3059    3 -1 roll 
3060 } def
3061
3062 %%%%% ### fin insertion ###
3063
3064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3065 %%%%                  droites                           %%%%
3066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3067
3068 %%%%% ### horizontale ###
3069 %% syntaxe : y horizontale 
3070 /horizontale {
3071 1 dict begin
3072    /y exch def
3073    xmin y xmax y
3074 end
3075 } def
3076
3077 %%%%% ### coeffdir ###
3078 %% syntaxe~: A B coeffdir
3079 /coeffdir {
3080    vecteur exch div
3081 } def
3082
3083 %%%%% ### ordorig ###
3084 %% syntaxe : A B ordorig
3085 %% attention, la droite est supposee ne pas etre verticale
3086 /ordorig {
3087    /dr@ite 4 array def
3088    dr@ite 3 3 -1 roll put
3089    dr@ite 2 3 -1 roll put
3090    dr@ite 1 3 -1 roll put
3091    dr@ite 0 3 -1 roll put
3092    dr@ite aload pop coeffdir /c@eff exch def
3093    dr@ite aload pop pop pop  %% xA yA
3094    exch                      %% yA xA 
3095    c@eff mul neg add
3096 } def
3097
3098 %%%%% ### verticale ###
3099 %% syntaxe~: A B verticale?
3100 /verticale? {
3101    pop 2 1 roll pop
3102    eq
3103 } def
3104
3105 %% syntaxe : x verticale
3106 /verticale {
3107 1 dict begin
3108    /x exch def
3109    x ymin x ymax
3110 end
3111 } def
3112
3113 %%%%% ### droite ###
3114 %% %% syntaxe : A B droite
3115 %% /droite {
3116 %% gsave
3117 %% 6 dict begin
3118 %%    /yB exch def
3119 %%    /xB exch def
3120 %%    /yA exch def
3121 %%    /xA exch def
3122 %%    xA yA xB yB
3123 %%    eqp
3124 %%       {}
3125 %%       { 
3126 %%          xA yA xB yB
3127 %%       verticale?
3128 %%       {
3129 %%       newpath
3130 %%          xA ymin smoveto
3131 %%          xA ymax slineto
3132 %%             stockcurrentcpath
3133 %%       Stroke
3134 %%       }
3135 %%       {
3136 %%       newpath
3137 %%          /alpha xA yA xB yB coeffdir def
3138 %%          /beta xA yA xB yB ordorig def
3139 %%          xmin dup alpha mul beta add smoveto
3140 %%          xmax dup alpha mul beta add slineto
3141 %%             stockcurrentcpath
3142 %%       Stroke
3143 %%       }
3144 %%       ifelse
3145 %%       }
3146 %%    ifelse
3147 %% end
3148 %% grestore
3149 %% } def
3150
3151 %% syntaxe : A B droite
3152 /droite {
3153 gsave
3154 6 dict begin
3155    /B defpoint
3156    /A defpoint
3157    A pop B pop eq {
3158       %% droite verticale
3159       newpath
3160          A pop ymin smoveto
3161          A pop ymax slineto
3162          stockcurrentcpath
3163       Stroke
3164    } {
3165       %% on cherche le point le + a gauche
3166       xmin A B xdpoint /C defpoint
3167       C exch pop ymin lt {
3168          %% trop a gauche
3169          ymin A B ydpoint /C defpoint
3170       } if
3171       C exch pop ymax gt {
3172          %% trop a gauche
3173          ymax A B ydpoint /C defpoint
3174       } if
3175       %% on cherche le point le + a droite
3176       xmax A B xdpoint /D defpoint
3177       D exch pop ymin lt {
3178          %% trop a droite
3179          ymin A B ydpoint /D defpoint
3180       } if
3181       D exch pop ymax gt {
3182          %% trop a gauche
3183          ymax A B ydpoint /D defpoint
3184       } if
3185       newpath
3186          C smoveto
3187          D slineto
3188          stockcurrentcpath
3189      Stroke
3190    } ifelse
3191 end
3192 grestore
3193 } def
3194
3195 %%%%% ### defdroite ###
3196 %% syntaxe : A B /d defdroite
3197 /defdroite {
3198 1 dict begin
3199    /t@mp@r@ire exch def
3200    [ 5 1 roll ] cvx t@mp@r@ire exch 
3201 end def
3202 } def
3203
3204 %%%%% ### paral ###
3205 %% syntaxe : D A paral --> droite parallele a D passant par A
3206 /paral {
3207 4 dict begin
3208    /yA exch def
3209    /xA exch def
3210    vecteur
3211    /u2 exch def
3212    /u1 exch def
3213    xA yA
3214    2 copy
3215    u1 u2 translatepoint
3216 end
3217 } def
3218
3219 %%%%% ### interdroite ###
3220 /interdroite {
3221                 %% A B C D
3222    /dr@ite2 4 array def
3223    dr@ite2 3 3 -1 roll put
3224    dr@ite2 2 3 -1 roll put
3225    dr@ite2 1 3 -1 roll put
3226    dr@ite2 0 3 -1 roll put
3227    /dr@ite1 4 array def
3228    dr@ite1 3 3 -1 roll put
3229    dr@ite1 2 3 -1 roll put
3230    dr@ite1 1 3 -1 roll put
3231    dr@ite1 0 3 -1 roll put
3232
3233 %%%    %% trace pour deboguage
3234 %%%    dr@ite1 aload pop droite
3235 %%%    dr@ite2 aload pop droite
3236
3237 %%% Dans tous les cas, on suppose que l'intersection existe
3238 %%% 
3239 %%% * la 1ere droite est verticale. les equations reduites sont
3240 %%%       x = a1      et       y = a2 x + b2
3241 %%% Le point d'intersection est :
3242 %%%       {{x = a1, y = b2 + a1 a2}}
3243 %%% 
3244 %%% * la 2eme droite est verticale. les equations reduites sont
3245 %%%       x = a1 x+ b1     et       x = a2
3246 %%% Le point d'intersection est :
3247 %%%       {{x = a2, y = b1 + a1 a2}}
3248 %%% 
3249 %%% * aucune n'est verticale. Les equations reduites sont
3250 %%%       y = a1 x + b1      et       y = a2 x + b2
3251 %%% Le point d'intersection est :
3252 %%%                 { {     b2 - b1      a1 b2 - a2 b1 } }
3253 %%%                 { { x = -------, y = ------------- } }
3254 %%%                 { {     a1 - a2         a1 - a2    } }
3255
3256 %%% remarque : pour le moment, je n'arrive pas a rendre mes variables
3257 %%% locales : elle restent globales. Pour que cela ne soit pas trop
3258 %%% genant, je les note respectivement @1, @@1, @2 et @@2 au lieu de a1,
3259 %%% b1, a2 et b2.
3260
3261    dr@ite1 aload pop verticale?
3262       {
3263          /@1 {dr@ite1 aload pop pop pop pop} def
3264          /@2 {dr@ite2 aload pop coeffdir} def
3265          /@@2 {dr@ite2 aload pop ordorig} def
3266          @1 
3267          @1 @2 mul @@2 add
3268       }
3269       {
3270       dr@ite2 aload pop verticale?
3271          {
3272             /@1 {dr@ite1 aload pop coeffdir} def
3273             /@@1 {dr@ite1 aload pop ordorig} def
3274             /@2 {dr@ite2 aload pop pop pop pop} def
3275             @2
3276             @1 @2 mul @@1 add
3277          }
3278          {
3279             /@1 {dr@ite1 aload pop coeffdir} def
3280             /@@1 {dr@ite1 aload pop ordorig} def
3281             /@2 {dr@ite2 aload pop coeffdir} def
3282             /@@2 {dr@ite2 aload pop ordorig} def
3283             @@2 @@1 sub @1 @2 sub div
3284             @1 @@2 mul @2 @@1 mul sub
3285             @1 @2 sub div
3286          }
3287       ifelse
3288       }
3289    ifelse
3290 } def
3291
3292 %%%%% ### perp ###
3293 %% syntaxe : D A perp --> droite perpendiculaire a D passant par A
3294 /perp {
3295 4 dict begin
3296    /yA exch def
3297    /xA exch def
3298    vecteur orthovecteur
3299    /u2 exch def
3300    /u1 exch def
3301    xA yA
3302    2 copy
3303    u1 u2 translatepoint
3304 end
3305 } def
3306
3307 %%%%% ### mediatrice ###
3308 %% synaxe : A B mediatrice --> droite
3309 /mediatrice {
3310    4 copy 
3311    milieu
3312    perp
3313 } def
3314
3315 %%%%% ### bissectrice ###
3316 %% syntaxe : A B C bissectrice --> B E ou E est un point de la bissectrice
3317 /bissectrice {
3318 10 dict begin
3319    /yC exch def
3320    /xC exch def
3321    /yB exch def
3322    /xB exch def
3323    /yA exch def
3324    /xA exch def
3325    /A {xA yA} def
3326    /B {xB yB} def
3327    /C {xC yC} def
3328    /alpha {A B C tripointangle} def
3329    B
3330    A B alpha rotatepoint
3331    A milieu
3332 end
3333 } def
3334
3335 %%%%% ### angledroit  ###
3336  /widthangledroit 5 def
3337
3338 %% syntaxe : A B C angledroit --> dessine un angle droit en B
3339 /angledroit {
3340 10 dict begin
3341    dup xcheck {
3342       /widthangledroit exch def
3343    } if
3344    /C defpoint
3345    /B defpoint
3346    /A defpoint
3347    B C vecteur normalize widthangledroit 20 div mulv /u defpoint
3348    B A vecteur normalize widthangledroit 20 div mulv /v defpoint
3349    [B u addv dupp v addv B v addv] ligne
3350 end
3351 } def
3352
3353 %%%%% ### translatedroite ###
3354 %% syntaxe : A B u translatedroite --> C D images resp de A et B par la translation de vecteur u
3355 /translatedroite {         %% A B u
3356    2 copy          %% A B u u
3357    6 1 roll       
3358    6 1 roll        %% A u B u 
3359    addv      %% A u D
3360    6 1 roll        
3361    6 1 roll        %% D A u 
3362    addv
3363    4 1 roll
3364    4 1 roll
3365 } def
3366
3367 %%%%% ### rotatedroite ###
3368 %% syntaxe : A B O r rotatedroite --> C D images resp de A et B par la
3369 %% rotation de centre O et d'angle r (en degre)
3370 /rotatedroite {
3371    5 copy rotatepoint   %% A B O r D
3372    6 -1 roll pop        %% A xB O r D
3373    6 -1 roll pop        %% A O r D
3374    7 1 roll
3375    7 1 roll rotatepoint %% D C
3376    4 1 roll 4 1 roll 
3377 } def
3378
3379 /rotatevecteur {
3380    rotatedroite
3381 } def
3382
3383 /rotatesegment {
3384    rotatedroite
3385 } def
3386
3387 %%%%% ### axesymdroite ###
3388 %% syntaxe : d D axesymdroite --> droite d', symetrique de la droite d par rapport
3389 %% a la droite D
3390 /axesymdroite {
3391 2 dict begin
3392    /D defdroite
3393    /B defpoint
3394    D axesympoint
3395    B D axesympoint
3396 end   
3397 } def
3398
3399 %%%%% ### fin insertion ###
3400
3401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3402 %%%%                  polygones                         %%%%
3403 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3404
3405 %%%%% ### poltransformfile ###
3406 %% syntaxe : pol u translatepol --> pol'
3407 /translatepol {
3408 2 dict begin   
3409    /uy exch def
3410    /ux exch def
3411    {ux uy translatepoint} papply
3412 end
3413 } def
3414
3415 %% syntaxe : pol u rotatepol --> pol'
3416 /rotatepol {
3417 2 dict begin   
3418    /alpha exch def
3419    /I defpoint
3420    {I alpha rotatepoint} papply
3421 end
3422 } def
3423
3424 %% syntaxe : pol I alpha hompol --> pol'
3425 /hompol {
3426 2 dict begin   
3427    /alpha exch def
3428    /I defpoint
3429    {I alpha hompoint} papply
3430 end
3431 } def
3432
3433 %% syntaxe : pol I sympol --> pol'
3434 /sympol {
3435 1 dict begin   
3436    /I defpoint
3437    {I sympoint} papply
3438 end
3439 } def
3440
3441 %% syntaxe : pol D axesympol --> pol'
3442 /axesympol {
3443 1 dict begin   
3444    /D defdroite
3445    {D axesympoint} papply
3446 end
3447 } def
3448
3449 %%%%% ### fin insertion ###
3450
3451 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3452 %%%%                  les tests                         %%%%
3453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3454
3455 %%%%% ### isbool ###
3456 %% syntaxe : any isbool --> booleen
3457 /isbool {
3458    type (booleantype) cvn eq
3459 } def
3460
3461 %%%%% ### isarray ###
3462 %% syntaxe : any isarray --> booleen
3463 /isarray {
3464    type (arraytype) cvn eq
3465 } def
3466
3467 %%%%% ### isstring ###
3468 %% syntaxe : any isstring --> booleen
3469 /isstring {
3470    type (stringtype) cvn eq
3471 } def
3472
3473 %%%%% ### isinteger ###
3474 %% syntaxe : any isinteger --> booleen
3475 /isinteger {
3476    type (integertype) cvn eq
3477 } def
3478
3479 %%%%% ### isnum ###
3480 %% syntaxe : any isnum --> booleen
3481 /isnum {
3482    dup isreal 
3483    exch isinteger or
3484 } def
3485
3486 %%%%% ### isreal ###
3487 %% syntaxe : any isreal --> booleen
3488 /isreal {
3489    type (realtype) cvn eq
3490 } def
3491
3492 %%%%% ### eq ###
3493 %% syntaxe : A B eqp3d --> booleen = true si les points A et B sont identiques
3494 /eqp3d {
3495                %% x1 y1 z1 x2 y2 z2
3496    4 -1 roll   %% x1 y1 x2 y2 z2 z1 
3497    eq {        %% x1 y1 x2 y2 
3498       eqp
3499    } {
3500       pop pop pop pop false
3501    } ifelse
3502 } def
3503
3504 %% syntaxe : A B eqp --> booleen = true si les points A et B sont identiques
3505 /eqp {
3506    3 -1 roll
3507    eq 
3508       {
3509          eq 
3510             {true} 
3511             {false}
3512          ifelse
3513       }
3514       {pop pop false}
3515    ifelse
3516 } def
3517
3518 %% syntaxe : z z' eqc --> true si z = z', false sinon
3519 /eqc {
3520    eqp
3521 } def
3522
3523 %%%%% ### eqstring ###
3524 /eqstring {
3525 3 dict begin
3526    /str2 exch def
3527    /str1 exch def
3528    str1 length str2 length eq {
3529       /i 0 def
3530       true
3531       str1 length {
3532          str1 i get str2 i get eq and
3533          /i i 1 add store
3534       } repeat
3535    } {
3536       false
3537    } ifelse
3538 end
3539 } def
3540
3541 %%%%% ### fin insertion ###
3542
3543 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3544 %%%%                conversions de types                %%%%
3545 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3546
3547 %%%%% ### astr2str ###
3548 %% syntaxe : array str astr2str --> str
3549 %% convertit le contenu de array en chaines de caracteres puis les
3550 %% concatene avec str, en inserant un caractere "space" apres chaque
3551 %% element du tableau array
3552 /astr2str {
3553 5 dict begin
3554    /str exch def
3555    /table exch def
3556    /n table length def
3557    n 0 eq {
3558       str
3559    } {
3560       table 0 n 1 sub getinterval
3561       table n 1 sub get (                               ) cvs
3562       ( ) append
3563       str append
3564       astr2str
3565    } ifelse
3566 end
3567 } def
3568
3569 %%%%% ### numstr2array ###
3570 %% syntaxe : str str2num --> num
3571 /str2num {
3572 5 dict begin
3573    /str exch def
3574    /n str length def
3575    /signnum 1 def
3576    /frct false def
3577    /k 0 def
3578    0 1 n 1 sub {
3579       /i exch def
3580       str i get
3581       dup 46 eq {
3582          %% il y a un point
3583          /frct true def
3584          pop
3585          i 0 eq {
3586             0
3587          } if
3588       } {
3589          dup 45 eq {
3590             /signnum -1 def
3591             pop
3592          } {
3593             frct not {
3594                i 1 ge signnum 0 ge and i 2 ge or {
3595                   exch 10 mul 48 sub add
3596                } {
3597                   48 sub
3598                } ifelse
3599             } {
3600                48 sub
3601                /k k 1 add store
3602                10 k exp div add
3603             } ifelse
3604          } ifelse
3605       } ifelse
3606    } for
3607    signnum mul
3608 end
3609 } def
3610
3611 /str2num {cvx exec} def
3612
3613 %% syntaxe : str numstr2array -> array
3614 %% ou str est une chaine de nombres reels separes par des espaces
3615 %% et array est constitue des elements numeriques de string.
3616 %% exemple :
3617 %% (0 -12 .234 54) --> [0 -12 0.234 54]
3618 /numstr2array {
3619 6 dict begin
3620    /str exch def
3621    /n str length def
3622    /separateurs [] def
3623    [
3624       0 1 n 1 sub {
3625          /i exch def
3626          str i get
3627          32 eq {
3628             /separateurs [separateurs aload pop i] def
3629          } if
3630       } for
3631       /j 0 def
3632       /oldsep 0 def
3633       0 1 separateurs length 1 sub {
3634          /i exch def
3635          str j separateurs i get oldsep sub getinterval str2num
3636          /j separateurs i get 1 add def
3637          /oldsep separateurs i get 1 add def
3638       } for
3639       str j n oldsep sub getinterval str2num
3640    ]
3641 end
3642 } def
3643
3644 %% syntaxe : array numstr2array -> array
3645 /arraynumstr2arrayarray {
3646    {numstr2array} apply
3647 } def
3648
3649 %%%%% ### fin insertion ###
3650
3651 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3652 %%%%                macros de projection                %%%%
3653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3654
3655 %%%%% ### projtext ###
3656 %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> -
3657 %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> -
3658 %% syntaxe : str x0 y0 plantype ultextp3d --> -
3659 %% syntaxe : str x0 y0 plantype bool ultextp3d --> -
3660 %% syntaxe : str1 solid i str2 ultextp3d --> -
3661 %% syntaxe : str1 solid i str2 bool ultextp3d --> -
3662 %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> -
3663  /initpr@jtext {
3664 5 dict begin
3665    dup isbool {
3666       /mybool exch def
3667    } {
3668       /mybool true def
3669    } ifelse
3670    dup isplan {
3671       /type_plan_proj true def
3672       /lepl@n exch def
3673       lepl@n plangetbase aload pop
3674       /@V defpoint3d
3675       /@U defpoint3d
3676       lepl@n plangetorigine
3677       /z0 exch def
3678       /y0 exch def
3679       /x0 exch def
3680       /table [@U @U @V vectprod3d] def
3681    } {
3682       dup isarray {
3683          %% c est un planprojpath
3684          /type_plan_proj true def
3685          /table exch def
3686          /z0 exch def
3687          /y0 exch def
3688          /x0 exch def
3689          0 0
3690       } {
3691          %% c est un solidprojpath
3692          /type_plan_proj false def
3693          %% y a-t-il un str2
3694          dup isstring {
3695             /str2 exch def
3696          } {
3697             /str2 {} def
3698          } ifelse
3699          %% y a-t-il un alpha
3700          2 copy pop issolid {
3701             /alpha 0 def
3702          } {
3703             /alpha exch def
3704          } ifelse
3705          /i exch def
3706          /solid exch def
3707          0 0
3708       } ifelse
3709    } ifelse
3710 } def
3711  /closepr@jtext {
3712    type_plan_proj {
3713       x0 y0 z0 table mybool projpath
3714    } {
3715       solid i alpha str2 mybool projpath
3716    } ifelse
3717    Fill
3718    Stroke
3719 end
3720 } def
3721
3722 %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> -
3723 %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> -
3724 %% syntaxe : str1 solid i str2 ultextp3d --> -
3725 %% syntaxe : str1 solid i str2 bool ultextp3d --> -
3726 %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> -
3727 /ultextp3d {initpr@jtext ultext_ closepr@jtext} def
3728 /cltextp3d {initpr@jtext cltext_ closepr@jtext} def
3729 /bltextp3d {initpr@jtext bltext_ closepr@jtext} def
3730 /dltextp3d {initpr@jtext dltext_ closepr@jtext} def
3731 /ubtextp3d {initpr@jtext ubtext_ closepr@jtext} def
3732 /cbtextp3d {initpr@jtext cbtext_ closepr@jtext} def
3733 /bbtextp3d {initpr@jtext bbtext_ closepr@jtext} def
3734 /dbtextp3d {initpr@jtext dbtext_ closepr@jtext} def
3735 /uctextp3d {initpr@jtext uctext_ closepr@jtext} def
3736 /cctextp3d {initpr@jtext cctext_ closepr@jtext} def
3737 /bctextp3d {initpr@jtext bctext_ closepr@jtext} def
3738 /dctextp3d {initpr@jtext dctext_ closepr@jtext} def
3739 /urtextp3d {initpr@jtext urtext_ closepr@jtext} def
3740 /crtextp3d {initpr@jtext crtext_ closepr@jtext} def
3741 /brtextp3d {initpr@jtext brtext_ closepr@jtext} def
3742 /drtextp3d {initpr@jtext drtext_ closepr@jtext} def
3743
3744 %%%%% ### currentppathtransform ###
3745 %% syntaxe : {f} currentppathtransform --> applique la transformation f
3746 %% au chemin courant
3747 /currentppathtransform {
3748 6 dict begin
3749    /warp exch def
3750    %% pour remplacer 'move'
3751    /warpmove{
3752       2 index {
3753         newpath
3754       } if
3755       warp moveto
3756       pop false
3757    } def
3758
3759    %% pour remplacer 'lineto'
3760    /warpline {
3761       warp lineto
3762    } bind def
3763
3764    %% pour remplacer 'curveto'
3765    /warpcurve {
3766       6 2 roll warp
3767       6 2  roll warp
3768       6 2 roll warp
3769       curveto
3770    }  bind def
3771
3772    true
3773    { warpmove } {  warpline } { warpcurve } { closepath } pathforall
3774    pop
3775 end
3776 } def
3777
3778 %% syntaxe : {f} currentpathtransform --> applique la transformation f
3779 %% au chemin courant
3780 /currentpathtransform {
3781 7 dict begin
3782    /transform exch def
3783    /warp {ptojpoint transform} def
3784    %% pour remplacer 'move'
3785    /warpmove{
3786       2 index {
3787         newpath
3788       } if
3789       warp smoveto
3790       pop false
3791    } def
3792
3793    %% pour remplacer 'lineto'
3794    /warpline {
3795       warp slineto
3796    } bind def
3797
3798    %% pour remplacer 'curveto'
3799    /warpcurve {
3800       6 2 roll warp
3801       6 2  roll warp
3802       6 2 roll warp
3803       scurveto
3804    }  bind def
3805
3806    true
3807    { warpmove } {  warpline } { warpcurve } { closepath } pathforall
3808    pop
3809 end
3810 } def
3811
3812 %%%%% ### normalvect_to_orthobase ###
3813 %% syntaxe : [normal_vect] normalvect_to_orthobase
3814 %%    --> imI imJ imK
3815 /normalvect_to_orthobase {
3816 4 dict begin
3817    dup length 3 eq {
3818       aload pop normalize3d /normal_vect defpoint3d
3819       normal_vect -1 0 0 eqp3d {
3820          /imageI {0 -1 0} def
3821          /imageK {-1 0 0} def
3822          /imageJ {0 0 1} def 
3823       } {
3824          %% on calcule l image de la base (I,J,K)
3825          /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
3826          /imageK {normal_vect} def
3827          /imageI {imageJ imageK vectprod3d} def
3828          1 0 0 imageK angle3d 0 eq {
3829             0 1 0 normal_vect vectprod3d /imageI defpoint3d
3830             /imageJ {0 1 0} def
3831             normal_vect /imageK defpoint3d
3832          } if
3833       } ifelse
3834    } {
3835       dup length 6 eq {
3836          aload pop
3837          normalize3d /imageK defpoint3d
3838          normalize3d /imageI defpoint3d
3839          imageK imageI vectprod3d /imageJ defpoint3d
3840       } {
3841          dup length 7 eq {
3842             aload pop 
3843             /alpha exch 2 div def
3844             normalize3d /imageK defpoint3d
3845             normalize3d /imageI defpoint3d
3846             imageK imageI vectprod3d /imageJ defpoint3d
3847             %% et ensuite, on fait tourner la base autour de imageK
3848             imageI alpha cos mulv3d
3849             imageJ alpha sin mulv3d
3850             addv3d
3851    
3852             imageI alpha sin neg mulv3d
3853             imageJ alpha cos mulv3d
3854             addv3d
3855    
3856             /imageJ defpoint3d
3857             /imageI defpoint3d
3858          } {
3859             %% length = 4
3860             aload pop
3861             /alpha exch def
3862             normalize3d /normal_vect defpoint3d
3863    
3864             normal_vect -1 0 0 eqp3d {
3865                /imageI {0 -1 0} def
3866                /imageK {-1 0 0} def
3867                /imageJ {0 0 1} def 
3868             } {
3869                %% on calcule l image de la base (I,J,K)
3870                /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
3871                /imageK {normal_vect} def
3872                /imageI {imageJ imageK vectprod3d} def
3873                1 0 0 imageK angle3d 0 eq {
3874                   0 1 0 normal_vect vectprod3d /imageI defpoint3d
3875                   /imageJ {0 1 0} def
3876                   normal_vect /imageK defpoint3d
3877                } if
3878             } ifelse
3879          } ifelse
3880
3881          %% et ensuite, on fait tourner la base autour de imageK
3882          imageI alpha cos mulv3d
3883          imageJ alpha sin mulv3d
3884          addv3d
3885
3886          imageI alpha sin neg mulv3d
3887          imageJ alpha cos mulv3d
3888          addv3d
3889
3890          /imageJ defpoint3d
3891          /imageI defpoint3d
3892       } ifelse
3893    } ifelse
3894    imageI
3895    imageJ
3896    imageK
3897 end
3898 } def
3899
3900 %%%%% ### projpath ###
3901 %% syntaxe : x y z [normal] projpath --> planprojpath
3902 %% syntaxe : x y z [normal] bool projpath --> planprojpath
3903 %% syntaxe : solid i projpath --> solidprojpath
3904 %% syntaxe : solid i bool projpath --> solidprojpath
3905 %% syntaxe : solid i str bool projpath --> solidprojpath
3906 %% syntaxe : solid i alpha str bool projpath --> solidprojpath
3907 /projpath {
3908 2 dict begin
3909    dup isbool {
3910       /mybool exch def
3911    } {
3912       /mybool true def
3913    } ifelse
3914    dup isplan {
3915       3 dict begin
3916          /lepl@n exch def
3917          lepl@n plangetbase aload pop
3918          /@V defpoint3d
3919          /@U defpoint3d
3920          lepl@n plangetorigine
3921          [@U @U @V vectprod3d] mybool planprojpath
3922       end
3923    } {
3924       dup isarray {
3925          mybool planprojpath
3926       } {
3927          mybool solidprojpath
3928       } ifelse
3929    } ifelse
3930 end
3931 } def
3932
3933
3934 %% %% syntaxe : x y z [normal] projpath --> planprojpath
3935 %% %% syntaxe : x y z [normal] bool projpath --> planprojpath
3936 %% %% syntaxe : solid i projpath --> solidprojpath
3937 %% %% syntaxe : solid i bool projpath --> solidprojpath
3938 %% %% syntaxe : solid i str bool projpath --> solidprojpath
3939 %% %% syntaxe : solid i alpha str bool projpath --> solidprojpath
3940 %% /projpath {
3941 %% 2 dict begin
3942 %%    dup isbool {
3943 %%       /mybool exch def
3944 %%    } {
3945 %%       /mybool true def
3946 %%    } ifelse
3947 %%    dup isarray {
3948 %%       mybool planprojpath
3949 %%    } {
3950 %%       mybool solidprojpath
3951 %%    } ifelse
3952 %% end
3953 %% } def
3954 %% 
3955 %% syntaxe : solid i str bool solidprojpath --> -
3956 %% ou
3957 %% syntaxe : solid i alpha str bool solidprojpath --> -
3958 %% projette le chemin courant sur la face i du solide, apres
3959 %% eventuellement une rotation d angle alpha autour de la normale
3960 %% bool : pour savoir si on tient compte de la visibilite
3961 /solidprojpath {
3962 5 dict begin
3963    /visibility exch def
3964    dup isstring {
3965       /option exch def
3966    } if
3967    2 copy pop
3968    issolid {
3969       /alpha 0 def
3970    } {
3971       /alpha exch def
3972    } ifelse
3973    /i exch def
3974    /solid exch def
3975    solid issolid not {
3976       (Error : mauvais type d argument dans solidprojpath) ==
3977    } if
3978    /n solid solidnombrefaces def
3979    i n 1 sub le {
3980       visibility not solid i solidfacevisible? or {
3981          currentdict /option known {
3982             option cvx exec
3983          } {
3984             solid i solidcentreface 
3985          } ifelse
3986          [
3987             solid 0 i solidgetsommetface 
3988             solid 1 i solidgetsommetface 
3989             vecteur3d normalize3d
3990             solid i solidnormaleface alpha 
3991          ] false planprojpath 
3992       } {
3993          newpath 0 0 smoveto
3994       } ifelse
3995    } {
3996       (Error : indice trop grand dans solidprojpath) ==
3997       quit
3998    } ifelse
3999 end
4000 } def
4001
4002 %% syntaxe : x y z [normal] bool planprojpath
4003 /planprojpath {
4004 6 dict begin
4005    /visibility exch def
4006    %% on calcule l image de la base (I,J,K)
4007    normalvect_to_orthobase
4008    /imageK defpoint3d
4009    /imageJ defpoint3d
4010    /imageI defpoint3d
4011    /z exch def
4012    /y exch def
4013    /x exch def
4014
4015    visibility not x y z imageK planvisible? or {
4016       {ptojpoint 0
4017       imageI
4018       imageJ
4019       imageK
4020       transformpoint3d
4021       x y z addv3d
4022       3dto2d jtoppoint} currentppathtransform
4023    } {
4024       newpath
4025    } ifelse
4026 end
4027 } def
4028
4029 %%%%% ### projscene ###
4030 %% syntaxe : plantype bool bprojscene ... eprojscene
4031 /bprojscene {
4032 10 dict begin
4033 gsave
4034    dup isbool {
4035       /mybool exch def
4036    } {
4037       /mybool true def
4038    } ifelse
4039    /l@pl@n exch def
4040    /saveStroke {SolidesDict /Stroke get exec} def
4041    /Stroke {l@pl@n mybool projpath saveStroke} def
4042    /savefill {SolidesDict /Fill get exec} def 
4043    /Fill {l@pl@n mybool projpath savefill} def
4044    /masque {} def
4045    l@pl@n plangetrange aload pop 
4046    setyrange setxrange
4047    newpath
4048 %%       xmin ymin l@pl@n pointplan smoveto
4049 %%       xmin ymax l@pl@n pointplan slineto
4050 %%       xmax ymax l@pl@n pointplan slineto
4051 %%       xmax ymin l@pl@n pointplan slineto
4052 %%       xmin ymin l@pl@n pointplan smoveto
4053 %%  %   closepath
4054 %% %gsave orange fill grestore
4055 %%    clip
4056 } def
4057 /eprojscene {
4058 grestore
4059 end
4060 } def
4061
4062 %%%%% ### fin insertion ###
4063
4064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4065 %%%%          fonctions numeriques                      %%%%
4066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4067
4068 %%%%% ### courbeparam ###
4069 /setresolution {
4070    /resolution exch def
4071 } def
4072 /resolution 200 def
4073
4074 /courbe_dic 2 dict def
4075 courbe_dic /X {} put
4076 courbe_dic /Y {} put
4077
4078 %% syntaxe : tmin tmax C@urbeparam_
4079  /C@urbeparam_ {
4080 6 dict begin
4081    /tmax@ exch def
4082    /tmin@ exch def
4083    /t tmin@ def
4084    /dt tmax@ tmin@ sub resolution 1 sub div def
4085    tmin@ courbe_dic /X get exec
4086    pstrickactionR
4087    tmin@ courbe_dic /Y get exec
4088    pstrickactionR
4089    smoveto
4090    resolution 1 sub
4091    {
4092       t courbe_dic /X get exec
4093       pstrickactionR
4094       t courbe_dic /Y get exec
4095       pstrickactionR
4096       slineto
4097
4098       /t t dt add store                      %% on incremente
4099    }
4100    repeat
4101    tmax@ courbe_dic /X get exec
4102    pstrickactionR
4103    tmax@ courbe_dic /Y get exec
4104    pstrickactionR
4105    slineto
4106 end
4107 } def
4108
4109 %% syntaxe : tmin tmax {X} {Y} Courbeparam_
4110 /Courbeparam_ {
4111    courbe_dic exch /Y exch put
4112    courbe_dic exch /X exch put
4113    C@urbeparam_
4114 } def
4115
4116 %% syntaxe : {X} {Y} courbeparam_
4117 /courbeparam_ {
4118    tmin tmax
4119    4 -1 roll
4120    4 -1 roll
4121    Courbeparam_
4122 } def
4123
4124 %% syntaxe : tmin tmax {X} {Y} Courbeparam
4125 /Courbeparam {
4126 gsave
4127 6 dict begin
4128    dup isstring
4129       {
4130          /option exch def
4131       }
4132    if
4133    courbe_dic exch /Y exch put
4134    courbe_dic exch /X exch put
4135    /tmax exch def
4136    /tmin exch def
4137
4138    newpath
4139       tmin courbe_dic /X get exec
4140       pstrickactionR
4141       tmin courbe_dic /Y get exec
4142       pstrickactionR
4143       smoveto                        %% on commence le chemin
4144       tmin tmax C@urbeparam_
4145       starfill
4146
4147    stockcurrentcpath
4148    newarrowpath
4149    currentdict /option known
4150       {
4151          /dt tmax tmin sub resolution 1 sub div def
4152          tmin dt add courbe_dic /X get exec
4153          tmin dt add courbe_dic /Y get exec
4154          tmin courbe_dic /X get exec
4155          tmin courbe_dic /Y get exec
4156          arrowpath0
4157          tmax dt sub courbe_dic /X get exec
4158          tmax dt sub courbe_dic /Y get exec
4159          tmax courbe_dic /X get exec
4160          tmax courbe_dic /Y get exec
4161          currentdict /dt undef
4162          arrowpath1
4163          option
4164          gere_arrowhead
4165       }
4166    if
4167
4168    currentlinewidth 0 eq {} {Stroke} ifelse
4169
4170 end
4171 grestore
4172 } def
4173
4174 %% syntaxe : {X} {Y} courbeparam
4175 /courbeparam {
4176    dup isstring
4177       {
4178          tmin tmax
4179          5 -1 roll
4180          5 -1 roll
4181          5 -1 roll
4182       }
4183       {
4184          tmin tmax
4185          4 -1 roll
4186          4 -1 roll
4187       }
4188    ifelse
4189    Courbeparam
4190 } def
4191
4192 %% syntaxe : tmin tmax {X} {Y} Courbeparam*
4193 /Courbeparam* {
4194 1 dict begin
4195    /startest {true} def
4196    Courbeparam
4197 end
4198 } def
4199
4200 %% syntaxe : {X} {Y} courbeparam*
4201 /courbeparam* {
4202 1 dict begin
4203    /startest {true} def
4204    courbeparam
4205 end
4206 } def
4207
4208 %%%%% ### courbe ###
4209 %% syntaxe : {f} courbe
4210 /courbe {
4211    dup isstring   %% y a-t-il une option de fin de ligne ?
4212       {
4213          xmin xmax 
4214          {} 
4215          5 -1 roll
4216          5 -1 roll
4217       }
4218       {
4219          xmin xmax 
4220          {} 
4221          4 -1 roll
4222       }
4223    ifelse
4224    Courbeparam
4225 } def
4226
4227 %% syntaxe : mini maxi {f} Courbe
4228 /Courbe {
4229    dup isstring {
4230       {}
4231       3 -1 roll
4232       3 -1 roll
4233    } {
4234       {}
4235       2 -1 roll
4236    } ifelse
4237    Courbeparam
4238 } def
4239
4240 %% syntaxe : {f} courbe_
4241 /courbe_ {
4242    xmin xmax 
4243    {} 
4244    4 -1 roll
4245    Courbeparam_
4246 } def
4247
4248 %% syntaxe : mini maxi {f} Courbe_
4249 /Courbe_ {
4250    {}
4251    2 -1 roll
4252    Courbeparam_
4253 } def
4254
4255 %% syntaxe : mini maxi {f} Courbe*
4256 /Courbe* {
4257 1 dict begin
4258    /startest {true} def
4259    Courbe
4260 end
4261 } def
4262
4263 %% syntaxe : {f} courbe*
4264 /courbe* {
4265 1 dict begin
4266    /startest {true} def
4267    courbe
4268 end
4269 } def
4270
4271 %%%%% ### courbeR2 ###
4272 %% syntaxe : tmin tmax C@urbeR2_
4273  /C@urbeR2_ {
4274 6 dict begin
4275    /tmax@ exch def
4276    /tmin@ exch def
4277    /t tmin@ def
4278    /dt tmax@ tmin@ sub resolution 1 sub div def
4279    tmin@ courbe_dic /X get exec
4280    pstrickactionR2
4281    smoveto
4282    /t t dt add store
4283    resolution 2 sub
4284    {
4285       t courbe_dic /X get exec
4286       pstrickactionR2
4287       slineto
4288       /t t dt add store                      %% on incremente
4289    }
4290    repeat
4291    tmax@ courbe_dic /X get exec
4292    pstrickactionR2
4293    slineto
4294 end
4295 } def
4296
4297 %% syntaxe : tmin tmax {X} CourbeR2_
4298 /CourbeR2_ {
4299    courbe_dic exch /X exch put
4300    C@urbeR2_
4301 } def
4302
4303 %% syntaxe : {X} courbeR2_
4304 /courbeR2_ {
4305    tmin tmax
4306    3 -1 roll
4307    3 -1 roll
4308    CourbeR2_
4309 } def
4310
4311 %% syntaxe : tmin tmax {X} CourbeR2
4312 /CourbeR2+ {
4313 2 dict begin
4314    /slineto {} def
4315    /smoveto {} def
4316    CourbeR2
4317 end
4318 } bind def
4319
4320 /CourbeR2 {
4321 gsave
4322 6 dict begin
4323    dup isstring
4324       {
4325          /option exch def
4326       }
4327    if
4328    courbe_dic exch /X exch put
4329    /tmax exch def
4330    /tmin exch def
4331
4332    newpath
4333       tmin tmax C@urbeR2_
4334       starfill
4335    currentlinewidth 0 eq {} {Stroke} ifelse
4336
4337 end
4338 grestore
4339 } def
4340
4341 %% syntaxe : {X} courbeR2
4342 /courbeR2 {
4343    tmin tmax
4344    3 -1 roll
4345    CourbeR2
4346 } def
4347
4348 %% syntaxe : tmin tmax {X} CourbeR2*
4349 /CourbeR2* {
4350 1 dict begin
4351    /startest {true} def
4352    CourbeR2
4353 end
4354 } def
4355
4356 %% syntaxe : {X} {Y} courbeR2*
4357 /courbeR2* {
4358 1 dict begin
4359    /startest {true} def
4360    courbeR2
4361 end
4362 } def
4363
4364 %%%%% ### courbeR3 ###
4365 %% syntaxe : t1 t2 {f} (option) CourbeR3
4366 /CourbeR3 {
4367 2 dict begin
4368    dup isstring {
4369       /option exch def
4370    } if
4371    /lafonction exch def
4372    {lafonction 3dto2d}
4373    currentdict /option known
4374       {option}
4375    if
4376   CourbeR2
4377 end
4378 } def
4379
4380 %% syntaxe : {f} (option) CourbeR3
4381 /courbeR3 {
4382    tmin tmax 3 -1 roll CourbeR3
4383 } def
4384
4385 %%%%% ### cercle ###
4386 %% syntaxe : x0 y0 r cercle
4387 /cercle {
4388 3 dict begin
4389    /r@y@n exch def
4390    /y@ exch def
4391    /x@ exch def
4392    0 360 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam
4393 end
4394 } def
4395
4396 %% syntaxe : x0 y0 r cercle_
4397 /cercle_ {
4398 3 dict begin
4399    /r@y@n exch def
4400    /y@ exch def
4401    /x@ exch def
4402    x@ r@y@n add y@ smoveto
4403    0 360 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4404 end
4405 } def
4406
4407 %% syntaxe : x0 y0 r cercle-_
4408 /cercle-_ {
4409 3 dict begin
4410    /r@y@n exch def
4411    /y@ exch def
4412    /x@ exch def
4413    x@ r@y@n add y@ smoveto
4414    360 0 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4415 end
4416 } def
4417
4418 %% syntaxe : x0 y0 r cercle*
4419 /cercle* {
4420 1 dict begin
4421    /startest true def
4422    cercle
4423 end
4424 } def
4425
4426 %% syntaxe : alpha beta x0 y0 r Cercle
4427 /Cercle {
4428 4 dict begin
4429    dup isstring
4430       {/option exch def}
4431    if
4432    /r@y@n exch def
4433    /y@ exch def
4434    /x@ exch def
4435    {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} 
4436    currentdict /option known
4437       {option}
4438    if
4439    Courbeparam
4440 end
4441 } def
4442
4443 %% syntaxe : alpha beta x0 y0 r Cercle_
4444 /Cercle_ {
4445 3 dict begin
4446    /r@y@n exch def
4447    /y@ exch def
4448    /x@ exch def
4449    {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4450 end
4451 } def
4452
4453 %% syntaxe : alpha beta x0 y0 r Cercle
4454 /Cercle* {
4455 1 dict begin
4456    /startest {true} def
4457    Cercle
4458 end
4459 } def
4460
4461 %%%%% ### fin insertion ###
4462
4463 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4464 %%%%      fonctions et constantes mathematiques         %%%%
4465 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4466
4467 %%%%% ### math ###
4468 %%%%%%%%%%% constantes mathematiques %%%%%%%%%%%%%%
4469
4470 /pi 3.14159 def
4471 /e 2.71828 def
4472
4473 %%%%%%%%%%% fonctions mathematiques %%%%%%%%%%%%%%%
4474
4475 /rd {180 pi div mul} def        %% transforme des rd en degres
4476 /deg {pi mul 180 div} def       %% transforme des degres en rd
4477 /log {ln 10 ln div} def
4478 /Exp {e exch exp} def
4479 /Cos {rd cos} def
4480 /Sin {rd sin} def
4481 /tan {dup sin exch cos div} def
4482 /cotan {dup cos exch sin div} def
4483 /Tan {dup Sin exch Cos div} def
4484 /Cotan {dup Cos exch Sin div} def
4485 /coTan {Cotan} def
4486 /arctan {
4487 dup 0 ge
4488    {1 atan}
4489    {neg 1 atan neg}
4490 ifelse
4491 } def
4492 /Arctan {arctan deg} def
4493 /arccos {
4494    dup
4495    dup mul neg 1 add sqrt
4496    exch
4497    atan
4498 } def
4499 /Arccos {arccos deg} def
4500 /arcsin {
4501    dup 1 eq {
4502       90
4503    } {
4504       dup
4505       dup mul neg 1 add sqrt
4506       atan
4507       dup 90 lt
4508          {}
4509          {360 sub}
4510       ifelse
4511    } ifelse
4512 } def
4513 /Arcsin {arcsin deg} def
4514 /cosh {dup Exp exch neg Exp add 2 div} def
4515 /sinh {dup Exp exch neg Exp sub 2 div} def
4516 /tanh {dup sinh exch cosh div} def
4517 /cotanh {dup cosh exch sinh div} def
4518 /argcosh {dup dup mul 1 sub sqrt add ln} def
4519 /argsinh {dup dup mul 1 add sqrt add ln} def
4520 /argtanh {
4521    setxvar
4522    x 1 add
4523    1 x sub
4524    div
4525    ln
4526    2 div
4527 } def
4528 /factorielle {
4529       dup 0 eq
4530          {pop 1}
4531          {dup 1 sub factorielle mul}
4532       ifelse
4533 } def
4534 /Gauss {
4535 3 dict begin
4536    /sigma exch def
4537    /m exch def
4538    /x exch def
4539    x m sub dup mul sigma dup mul 2 mul div neg Exp
4540    2 pi mul sigma dup mul mul sqrt div
4541 end
4542 } def
4543 %% syntaxe : a n modulo
4544 /modulo {
4545 2 dict begin
4546    /n exch def
4547    /a exch def
4548    {
4549       a 0 lt {
4550          /a a n add store
4551       } {
4552          exit
4553       } ifelse
4554    } loop
4555    a n mod
4556 end
4557 } def
4558
4559 %%%%% ### max ###
4560 /max {
4561    2 copy
4562    lt {exch} if
4563    pop
4564 } def
4565
4566 %%%%% ### min ###
4567 /min {
4568 2 dict begin
4569    dup isarray {
4570       duparray /table exch def pop
4571       table 0 get
4572       1 1 table length 1 sub {
4573          /i exch def
4574          table i get
4575          min
4576       } for
4577    } {
4578       2 copy
4579       gt {exch} if
4580       pop
4581    } ifelse
4582 end
4583 } def
4584
4585 %%%%% ### setcolor ###
4586 %% syntaxe : tableau setcolor
4587 /setcolor {
4588    dup length 4 eq
4589       {aload pop setcmykcolor}
4590       {aload pop setrgbcolor}
4591    ifelse
4592 } def
4593
4594 %%%%% ### in ###
4595 %% cherche si un elt donne appartient au tableau donne
4596 %% rque : utilise 3 variables locales
4597 %% syntaxe : elt array in --> index boolean
4598 /in {
4599 3 dict begin
4600    /liste exch def
4601    /elt exch def
4602    /i 0 def
4603    false                        %% la reponse a priori
4604    liste length {
4605       liste i get elt eq {
4606          pop                    %% en enleve la reponse
4607          i true                 %% pour mettre la bonne
4608          exit
4609       } if
4610       /i i 1 add store
4611    } repeat
4612 end
4613 } def
4614
4615 %% cherche si un elt donne appartient au tableau donne
4616 %% syntaxe : elt array in --> boolean
4617 /In {
4618 3 dict begin
4619    /liste exch def
4620    /elt exch def
4621    /i 0 def
4622    false                        %% la reponse a priori
4623    liste length {
4624       liste i get elt eq {
4625          pop                    %% en enleve la reponse
4626          true                 %% pour mettre la bonne
4627          exit
4628       } if
4629       /i i 1 add store
4630    } repeat
4631 end
4632 } def
4633
4634 %%%%% ### starfill ###
4635 %% la procedure pour les objets "star"
4636 %% si c est "star" on fait le fillstyle, sinon non
4637 /starfill {
4638    startest {
4639       gsave
4640          clip
4641          fillstyle
4642       grestore
4643       /startest false def
4644    } if
4645 } def
4646
4647 %%%%% ### addv ###
4648 %% syntaxe : u v addv --> u+v
4649 /addv {         %% xA yA xB yB
4650    3 1 roll     %% xA yB yA xB 
4651    4 1 roll     %% xB xA yB yA 
4652    add 3 1 roll %% yB+yA xB xA 
4653    add exch
4654 } def
4655
4656 %%%%% ### continu ### 
4657 /continu {
4658    [] 0 setdash 
4659 } def
4660
4661 %%%%% ### trigospherique ### 
4662 %% passage spherique --> cartesiennes
4663 %% les formules de passage ont été récupérées ici :
4664 %%    http://fr.wikipedia.org/wiki/Coordonn%C3%A9es_polaires
4665 %% syntaxe : r theta phi rtp2xyz -> x y z
4666 /rtp2xyz {
4667 6 dict begin
4668    /phi exch def
4669    /theta exch def
4670    /r exch def
4671    /x phi cos theta cos mul r mul def 
4672    /y phi cos theta sin mul r mul def
4673    /z phi sin r mul def
4674    x y z
4675 end
4676 } def
4677
4678 %% trace d'un arc sur une sphere de centre O
4679 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
4680 /arcspherique {
4681 9 dict begin
4682    dup isstring {
4683       /option exch def
4684    } if
4685    /phi2 exch def
4686    /theta2 exch def
4687    pop
4688    /phi1 exch def
4689    /theta1 exch def
4690    /r exch def
4691    /n 12 def
4692
4693    1 theta1 phi1 rtp2xyz /u defpoint3d
4694    1 theta2 phi2 rtp2xyz /v defpoint3d
4695    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4696
4697    /sinalpha u v vectprod3d norme3d def
4698    /cosalpha u v scalprod3d def
4699    /alpha sinalpha cosalpha atan def
4700    /n 12 def
4701    /pas alpha n div def
4702
4703    gsave
4704       /t pas neg def
4705       [
4706          n 1 add {
4707             /t  t pas add store
4708             u t cos r mul mulv3d
4709             w t sin r mul mulv3d
4710             addv3d
4711          } repeat
4712       ] 
4713       currentdict /option known {
4714          option
4715       } if
4716       ligne3d
4717    grestore
4718 end
4719 } def
4720
4721 %% trace d'un arc sur une sphere de centre O
4722 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
4723 /arcspherique_ {
4724 8 dict begin
4725    /phi2 exch def
4726    /theta2 exch def
4727    pop
4728    /phi1 exch def
4729    /theta1 exch def
4730    /r exch def
4731    /n 12 def
4732
4733    1 theta1 phi1 rtp2xyz /u defpoint3d
4734    1 theta2 phi2 rtp2xyz /v defpoint3d
4735    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4736
4737    /sinalpha u v vectprod3d norme3d def
4738    /cosalpha u v scalprod3d def
4739    /alpha sinalpha cosalpha atan def
4740    /n 12 def
4741    /pas alpha n div def
4742
4743    /t pas neg def
4744    [
4745       n 1 add {
4746          /t  t pas add store
4747          u t cos r mul mulv3d
4748          w t sin r mul mulv3d
4749          addv3d
4750       } repeat
4751    ] ligne3d_
4752 end
4753 } def
4754
4755 %% trace d'une geodesique sur une sphere de centre O
4756 %% syntaxe : r theta1 phi1 r theta2 phi2 geodesique_sphere
4757 /geodesique_sphere {
4758 13 dict begin
4759    /phi2 exch def
4760    /theta2 exch def
4761    pop
4762    /phi1 exch def
4763    /theta1 exch def
4764    /r exch def
4765    /n 360 def
4766
4767    1 theta1 phi1 rtp2xyz /u defpoint3d
4768    1 theta2 phi2 rtp2xyz /v defpoint3d
4769    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4770
4771    /sinalpha u v vectprod3d norme3d def
4772    /cosalpha u v scalprod3d def
4773    /alpha sinalpha cosalpha atan def
4774    /pas 360 n div def
4775
4776    gsave
4777       /t pas neg def
4778       [
4779          n 1 add {
4780             /t  t pas add store
4781             u t cos r mul mulv3d
4782             w t sin r mul mulv3d
4783             addv3d
4784          } repeat
4785       ] ligne3d
4786    grestore
4787 end
4788 } def
4789
4790
4791 %% syntaxe : A B C trianglespherique --> trace le rtiangle ABC
4792 %% (coordonnees spheriques)
4793 /trianglespherique* {
4794 1 dict begin
4795    /startest {true} def
4796    trianglespherique
4797 end
4798 } def
4799
4800 /trianglespherique {
4801 10 dict begin
4802    /C defpoint3d
4803    /B defpoint3d
4804    /A defpoint3d
4805    gsave
4806    newpath
4807       A rtp2xyz 3dto2d smoveto
4808       A B arcspherique_
4809       B C arcspherique_
4810       C A arcspherique_
4811    closepath
4812    starfill
4813    currentlinewidth 0 eq {} {Stroke} ifelse
4814    grestore
4815 end
4816 } def
4817
4818 %%%%% ### fin insertion ###
4819
4820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4821 %%%%         operations sur les tableaux                %%%%
4822 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4823
4824 %%%%% ### duparray ###
4825 /duparray {
4826 1 dict begin
4827    /table exch def
4828    table
4829    [ table aload pop ]
4830 end
4831 } def
4832
4833 %%%%% ### append ###
4834 %% syntaxe : string1 string2 append --> concatene les 2 chaines ou fusionne 2 tableaux
4835 /append {
4836 3 dict begin
4837    dup isarray {
4838       /tab2 exch def
4839       /tab1 exch def
4840       [ tab1 aload pop tab2 aload pop ]
4841    } {
4842       /str2 exch def
4843       /str1 exch def
4844       /result str1 length str2 length add string def
4845       str1 result copy pop
4846       result str1 length str2 putinterval
4847       result
4848    } ifelse
4849 end
4850 } def
4851
4852 %%%%% ### rollparray ###
4853 %% syntaxe : array n rollparray -> array
4854 %% opere une rotation de n sur les couplets du tableau array
4855 /rollparray {
4856 4 dict begin
4857    /k exch def
4858    /table exch def
4859    /n table length def
4860    k 0 eq {
4861        table
4862    } {
4863        k 0 ge {
4864           [ table aload pop 2 {n 1 roll} repeat ]
4865            k 1 sub
4866        } {
4867           [ table aload pop 2 {n -1 roll} repeat ]
4868            k 1 add
4869        } ifelse
4870        rollparray
4871    } ifelse
4872 end
4873 } def
4874
4875 %%%%% ### bubblesort ###
4876 %% syntaxe : array bubblesort --> array2 trie par ordre croissant
4877 %% code de Bill Casselman
4878 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
4879 /bubblesort {
4880 4 dict begin
4881    /a exch def
4882    /n a length 1 sub def
4883    n 0 gt {
4884       % at this point only the n+1 items in the bottom of a remain to
4885       % the sorted largest item in that blocks is to be moved up into
4886       % position n
4887       n {
4888          0 1 n 1 sub {
4889             /i exch def
4890             a i get a i 1 add get gt {
4891                % if a[i] > a[i+1] swap a[i] and a[i+1]
4892                a i 1 add
4893                a i get
4894                a i a i 1 add get
4895                % set new a[i] = old a[i+1]
4896                put
4897                % set new a[i+1] = old a[i]
4898                put
4899             } if
4900          } for
4901          /n n 1 sub def
4902       } repeat
4903    } if
4904    a
4905 end
4906 } def
4907
4908 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
4909 %% trie par ordre croissant et array2 correspond a la position des
4910 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
4911 %% code de Bill Casselman, modifie par jpv, 15/08/2006
4912 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
4913 /doublebubblesort {
4914 5 dict begin
4915    /table exch def
4916    /n table length 1 sub def
4917    /indices [ 0 1 n {} for ] def
4918    n 0 gt {
4919       % at this point only the n+1 items in the bottom of a remain to
4920       % the sorted largest item in that blocks is to be moved up into
4921       % position n
4922       n {
4923          0 1 n 1 sub {
4924             /i exch def
4925             table i get table i 1 add get gt {
4926                % if a[i] > a[i+1] swap a[i] and a[i+1]
4927                table i 1 add
4928                table i get
4929                table i table i 1 add get
4930                % set new a[i] = old a[i+1]
4931                put
4932                % set new a[i+1] = old a[i]
4933                put
4934
4935                indices i 1 add
4936                indices i get
4937                indices i indices i 1 add get
4938                % set new a[i] = old a[i+1]
4939                put
4940                % set new a[i+1] = old a[i]
4941                put
4942             } if
4943          } for
4944          /n n 1 sub def
4945       } repeat
4946    } if
4947    indices table
4948 end
4949 } def
4950
4951 %%%%% ### quicksort ###
4952 %% src : http://www.math.ubc.ca/~cass/graphics/text/www/code/sort.inc
4953 %% code de Bill Casselman, modifie par jpv, 18/10/2007
4954
4955 /qsortdict 8 dict def
4956
4957 qsortdict begin
4958
4959 % args: /comp a L R x
4960 % effect: effects a partition into two pieces [L j] [i R]
4961 %     leaves i j on stack
4962
4963 /partition { 8 dict begin
4964 /x exch def
4965 /j exch def
4966 /i exch def
4967 /a exch def
4968 load /comp exch def
4969 {
4970   {
4971     a i get x comp exec not {
4972       exit
4973     } if
4974     /i i 1 add def
4975   } loop
4976   {
4977     x a j get comp exec not {
4978       exit
4979     } if
4980     /j j 1 sub def
4981   } loop
4982
4983   i j le {
4984     % swap a[i] a[j]
4985     a j a i get
4986     a i a j get
4987     put put
4988     indices j indices i get
4989     indices i indices j get
4990     put put
4991     /i i 1 add def
4992     /j j 1 sub def
4993   } if
4994   i j gt {
4995     exit
4996   } if
4997 } loop
4998 i j
4999 end } def
5000
5001 % args: /comp a L R
5002 % effect: sorts a[L .. R] according to comp
5003
5004 /subsort {
5005 % /c a L R
5006 [ 3 1 roll ] 3 copy
5007 % /c a [L R] /c a [L R]
5008 aload aload pop
5009 % /c a [L R] /c a L R L R
5010 add 2 idiv
5011 % /c a [L R] /c a L R (L+R)/2
5012 3 index exch get
5013 % /c a [L R] /c a L R x
5014 partition
5015 % /c a [L R] i j
5016 % if j > L subsort(a, L, j)
5017 dup
5018 % /c a [L R] i j j
5019 3 index 0 get gt {
5020   % /c a [L R] i j
5021   5 copy
5022   % /c a [L R] i j /c a [L R] i j
5023   exch pop
5024   % /c a [L R] i j /c a [L R] j
5025   exch 0 get exch
5026   % ... /c a L j
5027   subsort
5028 } if
5029 % /c a [L R] i j
5030 pop dup
5031 % /c a [L R] i i
5032 % if i < R subsort(a, i, R)
5033 2 index 1 get lt {
5034   % /c a [L R] i
5035   exch 1 get
5036   % /c a i R
5037   subsort
5038 }{
5039   4 { pop } repeat
5040 } ifelse
5041 } def
5042
5043 end
5044
5045 % args: /comp a
5046 % effect: sorts the array a
5047 % comp returns truth of x < y for entries in a
5048
5049 /quicksort { qsortdict begin
5050 dup length 1 gt {
5051 % /comp a
5052 dup
5053 % /comp a a
5054 length 1 sub
5055 % /comp a n-1
5056 0 exch subsort
5057 } {
5058 pop pop
5059 } ifelse
5060 end } def
5061
5062 % ----------------------------------------
5063
5064 %% fin du code de Bill Casselman
5065
5066 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
5067 %% trie par ordre croissant et array2 correspond a la position des
5068 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
5069 %% code de Bill Casselman, modifie par jpv, 18/10/2007
5070 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
5071 /doublequicksort {
5072 qsortdict begin
5073    /comp exch
5074    /a exch def
5075    a dup length /n exch def
5076    /indices [0 1 n 1 sub {} for ] def
5077    dup length 1 gt {
5078       % /comp a
5079       dup
5080       % /comp a a
5081       length 1 sub
5082       % /comp a n-1
5083       0 exch subsort
5084    } {
5085       pop pop
5086    } ifelse
5087    indices a
5088 end
5089 } def
5090
5091 /comp {lt} def
5092
5093 %%%%% ### apply ###
5094 %% syntaxe : [x1 ... xn] (f) apply --> [f(x1) ... f(xn)]
5095 /apply {
5096 3 dict begin
5097    dup isstring
5098       {/fonction exch cvx def}
5099       {/fonction exch def}
5100    ifelse
5101    /liste exch def
5102    /@i 0 def
5103    [
5104    liste length {
5105       liste @i get fonction
5106       /@i @i 1 add store
5107    } repeat
5108    counttomark
5109    0 eq
5110       {pop}
5111       {]}
5112    ifelse
5113 end
5114 } def
5115
5116 %% syntaxe : [x1 ... xn] (f) papply
5117 /papply {
5118 3 dict begin
5119    dup isstring
5120       {/fonction exch cvx def}
5121       {/fonction exch def}
5122    ifelse
5123    /liste exch def
5124    /@i 0 def
5125    [
5126    liste length 2 idiv {
5127       liste @i get
5128       liste @i 1 add get
5129       fonction
5130       /@i @i 2 add store
5131    } repeat
5132    counttomark
5133    0 eq
5134       {pop}
5135       {]}
5136    ifelse
5137 end
5138 } def
5139
5140 %% syntaxe : [x1 ... xn] (f) capply 
5141 /capply {
5142 3 dict begin
5143    dup isstring
5144       {/fonction exch cvx def}
5145       {/fonction exch def}
5146    ifelse   
5147    /liste exch def
5148    /@i 0 def
5149    [
5150    liste length 3 idiv {
5151       liste @i get 
5152       liste @i 1 add get 
5153       liste @i 2 add get 
5154       fonction
5155       /@i @i 3 add store
5156    } repeat
5157    counttomark 
5158    0 eq
5159       {pop}
5160       {]}
5161    ifelse
5162 end
5163 } def
5164
5165 %%%%% ### reverse ###
5166 %% syntaxe : array reverse --> inverse l ordre des items dans
5167 %% le tableau
5168 /reverse {
5169 3 dict begin
5170    /le_tableau exch def
5171    /n le_tableau length def
5172    /i n 1 sub def
5173    [
5174       n {
5175          le_tableau i get
5176          /i i 1 sub store
5177       } repeat
5178    ]
5179 end
5180 } def
5181
5182 %% syntaxe : array_points reversep --> inverse l ordre des points dans
5183 %% le tableau
5184 /reversep {
5185 3 dict begin
5186    /le_tableau exch def
5187    /n le_tableau length 2 idiv def
5188    /i n 1 sub def
5189    [
5190       n {
5191          le_tableau i getp
5192          /i i 1 sub store
5193       } repeat
5194    ]
5195 end
5196 } def
5197
5198 %%%%% ### get ###
5199 %% syntaxe : array_points n getp --> le n-ieme point du tableau de
5200 %% points array_points
5201 /getp {
5202    2 copy
5203    2 mul get
5204    3 1 roll
5205    2 mul 1 add get
5206 } def
5207
5208 %%%%% ### fin insertion ###
5209
5210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5211 %%%%             matrices                               %%%%
5212 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5213
5214 %%%%% ### linear ###
5215 %% syntaxe : M i j any --> depose any dans M en a_ij
5216 /put_ij {
5217 5 dict begin
5218    /a exch def
5219    /j exch def
5220    /i exch def
5221    /M exch def
5222    /L M i get_Li def
5223    L j a put
5224    M i L put_Li
5225 end
5226 } def
5227
5228 %% syntaxe : M i j get_ij --> le coeff c_ij
5229 /get_ij {
5230    3 1 roll   %% j M i
5231    get_Li     %% j L_i
5232    exch get
5233 } def
5234
5235 %% syntaxe : M i L put_Li --> remplace dans M la ligne Li par L
5236 /put_Li {
5237    put
5238 } def
5239
5240 %% syntaxe : M i get_Li --> la ligne Li de M
5241 /get_Li {
5242    get
5243 } def
5244
5245 %%%%% ### fin insertion ###
5246
5247 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5248 %%%%          geometrie 3d (calculs)                    %%%%
5249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5250
5251 %%%%% ### sortp3d ### 
5252 /sortp3d {
5253 6 dict begin
5254    /M1 defpoint3d
5255    /M0 defpoint3d
5256    M1
5257    /z1 exch def
5258    /y1 exch def
5259    /x1 exch def
5260    M0
5261    /z0 exch def
5262    /y0 exch def
5263    /x0 exch def
5264    x0 x1 lt {
5265       M0 M1
5266    } {
5267       x0 x1 gt {
5268          M1 M0
5269       } {
5270          y0 y1 lt {
5271             M0 M1
5272          } {
5273             y0 y1 gt {
5274                M1 M0
5275             } {
5276                z0 z1 lt {
5277                   M0 M1
5278                } {
5279                   M1 M0
5280                } ifelse
5281             } ifelse
5282          } ifelse
5283       } ifelse
5284    } ifelse
5285 end
5286 } def
5287
5288 %%%%% ### dupp3d ### 
5289 %% duplique le vecteur 3d
5290 /dupp3d { %% x y z
5291         3 copy
5292 } def
5293 /dupv3d {dupp3d} def
5294
5295 %%%%% ### angle3d ###
5296 %% syntaxe : vect1 vect2 angle3d
5297 /angle3d {
5298 4 dict begin
5299    normalize3d /vect2 defpoint3d
5300    normalize3d /vect1 defpoint3d
5301    /cosalpha vect1 vect2 scalprod3d def
5302    /sinalpha vect1 vect2 vectprod3d norme3d def
5303    sinalpha cosalpha atan
5304 end
5305 } def
5306
5307 %%%%% ### transformpoint3d ###
5308 %% syntaxe : x y z a11 a21 a31 a12 a22 a32 a13 a23 a33
5309 %%    transformpoint3d -> X Y Z
5310 /transformpoint3d {
5311 12 dict begin
5312    /a33 exch def
5313    /a23 exch def
5314    /a13 exch def
5315    /a32 exch def
5316    /a22 exch def
5317    /a12 exch def
5318    /a31 exch def
5319    /a21 exch def
5320    /a11 exch def
5321    /z   exch def
5322    /y   exch def
5323    /x   exch def
5324    a11 x mul a12 y mul add a13 z mul add
5325    a21 x mul a22 y mul add a23 z mul add
5326    a31 x mul a32 y mul add a33 z mul add
5327 end
5328 } def
5329
5330 %%%%% ### normalize3d ###
5331 %% rend le vecteur 3d unitaire. Ne fait rien si u=0
5332 /unitaire3d { %% x y z
5333 2 dict begin
5334    /u defpoint3d
5335    /norme u norme3d def
5336    norme 0 eq {
5337       u
5338    } {
5339       u 1 norme div mulv3d
5340    } ifelse
5341 end
5342 } def
5343 /normalize3d {unitaire3d} def
5344
5345 %%%%% ### geom3d ###
5346 %% syntaxe : A k1 B k2 barycentre3d -> G, barycentre du systeme
5347 %% [(A, k1) (B, k2)]
5348 /barycentre3d {
5349 4 dict begin
5350    /k2 exch def
5351    /B defpoint3d
5352    /k1 exch def
5353    /A defpoint3d
5354    A k1 mulv3d
5355    B k2 mulv3d
5356    addv3d
5357    1 k1 k2 add div mulv3d
5358 end
5359 } def
5360
5361 %% syntaxe : array isobarycentre3d --> G
5362 /isobarycentre3d {
5363 2 dict begin
5364    /table exch def
5365    /n table length 3 idiv def
5366    table 0 getp3d
5367    1 1 n 1 sub {
5368        table exch getp3d
5369        addv3d
5370    } for
5371    1 n div mulv3d
5372 end
5373 } def
5374
5375 %% syntaxe : M A alpha hompoint3d -> le point M' tel que AM' = alpha AM 
5376 /hompoint3d {
5377 3 dict begin
5378    /alpha exch def
5379    /A defpoint3d
5380    /M defpoint3d
5381    A M vecteur3d alpha mulv3d A addv3d
5382 end
5383 } def
5384
5385 %% syntaxe : M A sympoint3d -> le point M' tel que AM' = -AM
5386 /sympoint3d {
5387 2 dict begin
5388    /A defpoint3d
5389    /M defpoint3d
5390    A M vecteur3d -1 mulv3d A addv3d
5391 end
5392 } def
5393
5394 %% syntaxe : A u translatepoint3d --> B image de A par la translation de vecteur u
5395 /translatepoint3d {
5396    addv3d
5397 } def
5398
5399 /scaleOpoint3d {
5400 6 dict begin
5401    /k3 exch def
5402    /k2 exch def
5403    /k1 exch def
5404    /z exch def
5405    /y exch def
5406    /x exch def
5407    k1 x mul
5408    k2 y mul
5409    k3 z mul
5410 end
5411 } def
5412
5413 % syntaxe : M alpha_x alpha_y alpha_z rotateOpoint3d --> M'
5414 /rotateOpoint3d {
5415 21 dict begin
5416    /RotZ exch def
5417    /RotY exch def
5418    /RotX exch def
5419    /Zpoint exch def
5420    /Ypoint exch def
5421    /Xpoint exch def
5422    /c1 {RotX cos} bind def
5423    /c2 {RotY cos} bind def
5424    /c3 {RotZ cos} bind def
5425    /s1 {RotX sin} bind def
5426    /s2 {RotY sin} bind def
5427    /s3 {RotZ sin} bind def
5428    /M11 {c2 c3 mul} bind def
5429    /M12 {c3 s1 mul s2 mul c1 s3 mul sub} bind def
5430    /M13 {c1 c3 mul s2 mul s1 s3 mul add} bind def
5431    /M21 {c2 s3 mul} bind def
5432    /M22 {s1 s2 mul s3 mul c1 c3 mul add} bind def
5433    /M23 {s3 s2 mul c1 mul c3 s1 mul sub} bind def
5434    /M31 {s2 neg} bind def
5435    /M32 {s1 c2 mul} bind def
5436    /M33 {c1 c2 mul} bind def
5437    M11 Xpoint mul M12 Ypoint mul add M13 Zpoint mul add
5438    M21 Xpoint mul M22 Ypoint mul add M23 Zpoint mul add
5439    M31 Xpoint mul M32 Ypoint mul add M33 Zpoint mul add
5440 end
5441 } def
5442
5443 %%%%% ### symplan3d ###
5444 %% syntaxe : M eqplan/plantype symplan3d --> M'
5445 %% ou M' symetrique de M par rapport au plan P defini par eqplan/plantype
5446 /symplan3d {
5447 13 dict begin
5448    dup isplan {
5449       plan2eq /args exch def
5450    } {
5451       /args exch def
5452    } ifelse
5453    /z exch def
5454    /y exch def
5455    /x exch def
5456    args aload pop
5457    /d1 exch def
5458    /c1 exch def
5459    /b1 exch def
5460    /a1 exch def
5461    /n_U a1 dup mul b1 dup mul add c1 dup mul add sqrt def
5462    /a a1 n_U div def
5463    /b b1 n_U div def
5464    /c c1 n_U div def
5465    /d d1 n_U div def
5466    /u a x mul b y mul add c z mul add d add def
5467    x 2 a mul u mul sub
5468    y 2 b mul u mul sub
5469    z 2 c mul u mul sub
5470 end
5471 } def
5472
5473 %%%%% ### vecteur3d ###
5474 %% creation du vecteur AB a partir de A et B
5475 /vecteur3d { %% xA yA zA xB yB zB
5476 6 dict begin
5477    /zB exch def
5478    /yB exch def
5479    /xB exch def
5480    /zA exch def
5481    /yA exch def
5482    /xA exch def
5483    xB xA sub
5484    yB yA sub
5485    zB zA sub
5486 end
5487 }def
5488
5489 %%%%% ### vectprod3d ###
5490 %% produit vectoriel de deux vecteurs 3d
5491 /vectprod3d { %% x1 y1 z1 x2 y2 z2
5492 6 dict begin
5493    /zp exch def
5494    /yp exch def
5495    /xp exch def
5496    /z exch def
5497    /y exch def
5498    /x exch def
5499    y zp mul z yp mul sub
5500    z xp mul x zp mul sub
5501    x yp mul y xp mul sub
5502 end
5503 } def
5504
5505 %%%%% ### scalprod3d ###
5506 %% produit scalaire de deux vecteurs 3d
5507 /scalprod3d { %% x1 y1 z1 x2 y2 z2
5508 6 dict begin
5509    /zp exch def
5510    /yp exch def
5511    /xp exch def
5512    /z exch def
5513    /y exch def
5514    /x exch def
5515    x xp mul y yp mul add z zp mul add
5516 end
5517 } def
5518
5519 %%%%% ### papply3d ###
5520 %% syntaxe : [A1 ... An] (f) papply3d --> [f(A1) ... f(An)]
5521 /papply3d {
5522 3 dict begin
5523    /fonction exch def
5524    /liste exch def
5525    /i 0 def
5526    [
5527    liste length 3 idiv {
5528       liste i get
5529       liste i 1 add get
5530       liste i 2 add get
5531       fonction
5532       /i i 3 add store
5533    } repeat
5534    counttomark
5535    0 eq
5536       {pop}
5537       {]}
5538    ifelse
5539 end
5540 } def
5541
5542 %%%%% ### defpoint3d ###
5543 %% creation du point A a partir de xA yA yB et du nom /A
5544 /defpoint3d { %% xA yA zA /nom
5545 1 dict begin
5546    /memo exch def
5547    [ 4 1 roll ] cvx memo exch
5548 end def
5549 }def
5550
5551 %%%%% ### distance3d ###
5552 /distance3d { %% A B
5553    vecteur3d norme3d
5554 } def
5555
5556 %%%%% ### get3d ###
5557 /getp3d { %% [tableau de points 3d] i --> donne le ieme point du tableau
5558    2 copy 2 copy
5559    3 mul get
5560    5 1 roll
5561    3 mul 1 add get
5562    3 1 roll
5563    3 mul 2 add get
5564 } def
5565
5566 %%%%% ### norme3d ###
5567 %% norme d un vecteur 3d
5568 /norme3d { %% x y z
5569 3 dict begin
5570    /z exch def
5571    /y exch def
5572    /x exch def
5573    x dup mul y dup mul add z dup mul add sqrt
5574 end
5575 } def
5576
5577 %%%%% ### mulv3d ###
5578 %% (scalaire)*(vecteur 3d) Attention : dans l autre sens !
5579 /mulv3d { %% x y z lambda
5580 4 dict begin
5581    /lambda exch def
5582    /z exch def
5583    /y exch def
5584    /x exch def
5585    x lambda mul
5586    y lambda mul
5587    z lambda mul
5588 end
5589 } def
5590
5591 %%%%% ### addv3d ###
5592 %% addition de deux vecteurs 3d
5593 /addv3d { %% x1 y1 z1 x2 y2 z2
5594 6 dict begin
5595    /zp exch def
5596    /yp exch def
5597    /xp exch def
5598    /z exch def
5599    /y exch def
5600    /x exch def
5601    x xp add
5602    y yp add
5603    z zp add
5604 end
5605 } def
5606
5607 %%%%% ### milieu3d ###
5608 /milieu3d { %% A B --> I le milieu de [AB]
5609    addv3d 0.5 mulv3d
5610 } def
5611
5612 %%%%% ### exch ###
5613 /exchp {
5614    4 -1 roll
5615    4 -1 roll
5616 } def
5617 /exchc {
5618    6 -1 roll
5619    6 -1 roll
5620    6 -1 roll
5621 } def
5622 /exchd {
5623    4 {8 -1 roll} repeat
5624 } def
5625 /exchp3d {
5626    6 -1 roll
5627    6 -1 roll
5628    6 -1 roll
5629 } def
5630
5631 %%%%% ### ABpoint3d ###
5632 %% syntaxe : A B k ABpoint3d --> M
5633 %% M tel que vect(AM) = k vect (AB)
5634 /ABpoint3d {
5635 3 dict begin
5636    /k exch def
5637    /B defpoint3d
5638    /A defpoint3d
5639    A B vecteur3d
5640    k mulv3d
5641    A addv3d 
5642 end
5643 } def
5644
5645 %%%%% ### angle3doriente ###
5646 %% syntaxe : vect1 vect2 vect3 angle3d
5647 %% vect3 est la normale au plan (vect1, vect2)
5648 /angle3doriente {
5649 4 dict begin
5650    normalize3d /vect3 defpoint3d
5651    normalize3d /vect2 defpoint3d
5652    normalize3d /vect1 defpoint3d
5653    /cosalpha vect1 vect2 scalprod3d def
5654    /sinalpha vect1 vect2 vectprod3d vect3 scalprod3d def
5655    sinalpha cosalpha atan
5656 end
5657 } def
5658
5659 %%%%% ### points3dalignes ###
5660 %% syntaxe : A B C points3dalignes -> bool
5661 /points3dalignes {
5662 3 dict begin
5663    /C defpoint3d
5664    /B defpoint3d
5665    /A defpoint3d
5666    A B vecteur3d /u defpoint3d
5667    A C vecteur3d /v defpoint3d
5668    u v vectprod3d norme3d 1E-7 lt
5669 end
5670 } def
5671
5672 %% syntaxe : M A B point3dsursegment --> true si M in [AB], false sinon
5673 /point3dsursegment {
5674 3 dict begin
5675    /B defpoint3d
5676    /A defpoint3d
5677    /M defpoint3d
5678    M A B points3dalignes {
5679       M A vecteur3d
5680       M B vecteur3d
5681       scalprod3d 0 lt {
5682          true
5683       } {
5684          false
5685       } ifelse
5686    } {
5687       false
5688    } ifelse
5689 end
5690 } def
5691
5692 %%%%% ### fin insertion ###
5693
5694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5695 %%%%          geometrie 3d (dessins)                    %%%%
5696 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5697
5698 %%%%% ### point3d ###
5699 /point3d { %% A
5700    3dto2d point
5701 } def
5702
5703 /points3d { %% tableau de points3d
5704    tab3dto2d points
5705 } def
5706
5707 %%%%% ### ligne3d ###
5708 %% [tableau de points3d] option --> trace la ligne brisee
5709 /ligne3d { 
5710 1 dict begin
5711    dup isstring
5712       {/option exch def}
5713    if
5714    tab3dto2d
5715    currentdict /option known
5716       {option}
5717    if
5718    ligne
5719 end
5720 } def
5721
5722 %% [tableau de points3d] option --> trace la ligne brisee
5723 /ligne3d_ { 
5724 1 dict begin
5725    dup isstring
5726       {/option exch def}
5727    if
5728    tab3dto2d
5729    currentdict /option known
5730       {option}
5731    if
5732    ligne_
5733 end
5734 } def
5735
5736 %%%%% ### tab3dto2d ###
5737 %% transforme un tableau de points 3d en tableau de points 2d
5738 /tab3dto2d {
5739 2 dict begin
5740    /T exch def
5741    /n T length def
5742    [ T aload pop
5743    n 1 sub -1 n 3 idiv 2 mul
5744    { 1 dict begin
5745    /i exch def
5746    3dto2d i 2 roll
5747    end } for ]
5748 end
5749 } def
5750
5751 %%%%% ### polygone3d ###
5752 /polygone3d { %% tableau de points3d
5753    tab3dto2d polygone
5754 } def
5755
5756 /polygone3d* { %% tableau de points3d
5757    tab3dto2d polygone*
5758 } def
5759
5760 %%%%% ### fin insertion ###
5761
5762 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5763 %%%%                 gestion du texte                   %%%%
5764 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5765
5766 %%%%% ### marks ###
5767 /xmkstep 1 def          % les marques sur Ox
5768 /xmarkstyle {dctext} def
5769 /ymarkstyle {(-1 0) bltext} def
5770 /setxmkstep {
5771    /xmkstep exch def
5772 } def
5773 /xmark {
5774    dup xtick
5775    /Courier findfont .8 fontsize mul scalefont setfont
5776    dup dup truncate eq {
5777       cvi dup chaine cvs exch 
5778    } {
5779       dup chaine cvs exch 
5780    } ifelse
5781    Oy xmarkstyle
5782 } def
5783 /xmarks {
5784 2 dict begin
5785    /n xmax xmax xmin sub 1000 div sub xmkstep div truncate cvi 
5786       xmkstep mul def                   % mark max
5787    /i xmin xmkstep div truncate cvi 
5788       xmkstep mul def                   % la 1ere
5789    i xmin lt {/i i xmkstep add store} if
5790    {
5791       i 0 ne {i xmark} if
5792       /i i xmkstep abs add store
5793       i n gt {exit} if
5794    } loop 
5795 end
5796 } def
5797
5798 /ymkstep 1 def          % les marques sur Oy
5799 /setymkstep {
5800    /ymkstep exch def
5801 } def
5802 /ymark {
5803    dup ytick
5804    /Courier findfont .8 fontsize mul scalefont setfont
5805    dup chaine cvs exch 
5806    Ox exch ymarkstyle
5807 } def
5808 /ymarks {
5809 2 dict begin
5810    /n ymax ymax ymin sub 1000 div sub ymkstep div truncate cvi 
5811       ymkstep mul def                   % mark max
5812    /i ymin ymkstep div truncate cvi 
5813       ymkstep mul def                   % la 1ere
5814    {
5815       i 0 ne {i ymark} if
5816       /i i ymkstep abs add store
5817       i n gt {exit} if
5818    } loop 
5819 end
5820 } def
5821
5822 /setmkstep {
5823    setymkstep
5824    setxmkstep
5825 } def
5826 /marks {
5827    xmarks
5828    ymarks
5829 } def
5830
5831 %%%%% ### setfontsize ###
5832 /setfontsize {
5833    /fontsize exch def
5834 } def
5835
5836 %%%%% ### setCourrier ###
5837 /Courier findfont 
5838 dup length dict begin
5839    {
5840    1 index /FID ne 
5841       {def}
5842       {pop pop} 
5843    ifelse
5844    } forall
5845    /Encoding ISOLatin1Encoding def
5846    currentdict
5847 end
5848
5849 /Courier-ISOLatin1 exch definefont pop
5850
5851 /setCourier {
5852    /Courier-ISOLatin1 findfont 
5853    fontsize scalefont 
5854    setfont
5855 } def
5856
5857 %%%%% ### pathtext ###
5858 %% syntaxe : string x y initp@thtext
5859  /initp@thtext {
5860 7 dict begin
5861    /y exch def
5862    /x exch def
5863    /str exch def
5864    str 0 0 show_dim
5865    /wy exch def
5866    /wx exch def
5867    /lly exch def
5868    /llx exch def
5869    pop pop pop
5870    newpath 
5871       x y  smoveto
5872 } def
5873  /closep@thtext {
5874       str true charpath
5875 end
5876 } def
5877
5878 %% syntaxe : string x y cctext_
5879 /cctext_ {
5880    initp@thtext
5881    llx wx add lly wy add -.5 mulv rmoveto
5882    closep@thtext
5883 } def
5884
5885 /brtext_ {
5886    initp@thtext
5887    hadjust 0 rmoveto
5888    llx neg 0 rmoveto
5889    closep@thtext
5890 } def
5891
5892 /bbtext_ {
5893    initp@thtext
5894    0 0 rmoveto
5895    0 0 rmoveto
5896    closep@thtext
5897 } def
5898
5899 /bltext_ {
5900    initp@thtext
5901    hadjust neg 0 rmoveto
5902    wx neg 0 rmoveto
5903    closep@thtext
5904 } def
5905
5906 /bctext_ {
5907    initp@thtext
5908    0 0 rmoveto
5909    wx llx add -.5 mul 0 rmoveto
5910    closep@thtext
5911 } def
5912
5913 /ubtext_ {
5914    initp@thtext
5915    0 vadjust rmoveto
5916    0 lly neg rmoveto
5917    closep@thtext
5918 } def
5919
5920 /urtext_ {
5921    initp@thtext
5922    hadjust vadjust rmoveto
5923    llx neg lly neg rmoveto
5924    closep@thtext
5925 } def
5926
5927 /ultext_ {
5928    initp@thtext
5929    hadjust neg vadjust rmoveto
5930    wx neg lly neg rmoveto
5931    closep@thtext
5932 } def
5933
5934 /uctext_ {
5935    initp@thtext
5936    0 vadjust rmoveto
5937    llx wx add -.5 mul lly neg rmoveto
5938    closep@thtext
5939 } def
5940
5941 /drtext_ {
5942    initp@thtext
5943    hadjust vadjust neg rmoveto
5944    llx neg wy neg rmoveto
5945    closep@thtext
5946 } def
5947
5948 /dbtext_ {
5949    initp@thtext
5950    0 vadjust neg rmoveto
5951    0 wy neg rmoveto
5952    closep@thtext
5953 } def
5954
5955 /dltext_ {
5956    initp@thtext
5957    hadjust neg vadjust neg rmoveto
5958    wx neg wy neg rmoveto
5959    closep@thtext
5960 } def
5961
5962 /dctext_ {
5963    initp@thtext
5964    0 vadjust neg rmoveto
5965    llx wx add -2 div wy neg rmoveto
5966    closep@thtext
5967 } def
5968
5969 /crtext_ {
5970    initp@thtext
5971    hadjust 0 rmoveto
5972    llx neg lly wy add -2 div rmoveto
5973    closep@thtext
5974 } def
5975
5976 /cbtext_ {
5977    initp@thtext
5978    0 0 rmoveto
5979    0 lly wy add -2 div rmoveto
5980    closep@thtext
5981 } def
5982
5983 /cltext_ {
5984    initp@thtext
5985    hadjust neg 0 rmoveto
5986    wx neg lly wy add -2 div rmoveto
5987    closep@thtext
5988 } def
5989
5990 /cctext_ {
5991    initp@thtext
5992    0 0 rmoveto
5993    llx wx add lly wy add -.5 mulv rmoveto
5994    closep@thtext
5995 } def
5996
5997 %%%%% ### text3d ###
5998 %%%% Version 3d des commandes jps TEXTE
5999  /pr@p@re3d {
6000 2 dict begin
6001 %   /vect_echelle [1 1] def
6002 %   /angle_de_rot {0} def
6003 %   dup xcheck
6004 %      {/angle_de_rot exch def}
6005 %   if
6006 %   dup isarray
6007 %      {/vect_echelle exch def}
6008 %   if%   CamView vect_echelle {angle_de_rot}
6009    3dto2d
6010 } def
6011
6012 /bbtext3d {
6013    pr@p@re3d
6014    bbtext
6015 end
6016 } def
6017
6018 /bbtexlabel3d {
6019    pr@p@re3d
6020    bbtexlabel
6021 end
6022 } def
6023
6024 /bctext3d {
6025    pr@p@re3d
6026    bctext
6027 end
6028 } def
6029
6030 /bctexlabel3d {
6031    pr@p@re3d
6032    bctexlabel
6033 end
6034 } def
6035
6036 /bltext3d {
6037    pr@p@re3d
6038    bltext
6039 end
6040 } def
6041
6042 /bltexlabel3d {
6043    pr@p@re3d
6044    bltexlabel
6045 end
6046 } def
6047
6048 /brtext3d {
6049    pr@p@re3d
6050    brtext
6051 end
6052 } def
6053
6054 /brtexlabel3d {
6055    pr@p@re3d
6056    brtexlabel
6057 end
6058 } def
6059
6060 /cbtext3d {
6061    pr@p@re3d
6062    cbtext
6063 end
6064 } def
6065
6066 /cbtexlabel3d {
6067    pr@p@re3d
6068    cbtexlabel
6069 end
6070 } def
6071
6072 /cctext3d {
6073    pr@p@re3d
6074    cctext
6075 end
6076 } def
6077
6078 /cctexlabel3d {
6079    pr@p@re3d
6080    cctexlabel
6081 end
6082 } def
6083
6084 /cltext3d {
6085    pr@p@re3d
6086    cltext
6087 end
6088 } def
6089
6090 /cltexlabel3d {
6091    pr@p@re3d
6092    cltexlabel
6093 end
6094 } def
6095
6096 /crtext3d {
6097    pr@p@re3d
6098    crtext
6099 end
6100 } def
6101
6102 /crtexlabel3d {
6103    pr@p@re3d
6104    crtexlabel
6105 end
6106 } def
6107
6108 /dbtext3d {
6109    pr@p@re3d
6110    dbtext
6111 end
6112 } def
6113
6114 /dbtexlabel3d {
6115    pr@p@re3d
6116    dbtexlabel
6117 end
6118 } def
6119
6120 /dctext3d {
6121    pr@p@re3d
6122    dctext
6123 end
6124 } def
6125
6126 /dctexlabel3d {
6127    pr@p@re3d
6128    dctexlabel
6129 end
6130 } def
6131
6132 /dltext3d {
6133    pr@p@re3d
6134    dltext
6135 end
6136 } def
6137
6138 /dltexlabel3d {
6139    pr@p@re3d
6140    dltexlabel
6141 end
6142 } def
6143
6144 /drtext3d {
6145    pr@p@re3d
6146    drtext
6147 end
6148 } def
6149
6150 /drtexlabel3d {
6151    pr@p@re3d
6152    drtexlabel
6153 end
6154 } def
6155
6156 /ubtext3d {
6157    pr@p@re3d
6158    ubtext
6159 end
6160 } def
6161
6162 /ubtexlabel3d {
6163    pr@p@re3d
6164    ubtexlabel
6165 end
6166 } def
6167
6168 /uctext3d {
6169    pr@p@re3d
6170    uctext
6171 end
6172 } def
6173
6174 /uctexlabel3d {
6175    pr@p@re3d
6176    uctexlabel
6177 end
6178 } def
6179
6180 /ultext3d {
6181    pr@p@re3d
6182    ultext
6183 end
6184 } def
6185
6186 /ultexlabel3d {
6187    pr@p@re3d
6188    ultexlabel
6189 end
6190 } def
6191
6192 /urtext3d {
6193    pr@p@re3d
6194    urtext
6195 end
6196 } def
6197
6198 /urtexlabel3d {
6199    pr@p@re3d
6200    urtexlabel
6201 end
6202 } def
6203
6204 %%%%% ### fin insertion ###
6205
6206 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6207 %%%%             bibliotheque sur les solides           %%%%
6208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6209
6210 %%%%% ### solide ###
6211 %% solid = [Sommets Faces Colors_Faces InOut_Table]
6212 /solidgetsommets {
6213    0 get
6214 } def
6215 /solidgetpointstable {solidgetsommets} def
6216
6217 /solidgetfaces {
6218    1 get
6219 } def
6220
6221 /solidgetface {
6222 1 dict begin
6223    /i exch def
6224    solidgetfaces i get
6225 end
6226 } def
6227
6228 /solidgetfcolors {
6229    2 get
6230 } def
6231
6232 %% syntaxe : solid i solidgetfcolor --> str
6233 /solidgetfcolor {
6234 1 dict begin
6235    /i exch def
6236    solidgetfcolors i get
6237 end
6238 } def
6239
6240 %% syntaxe : solid i str solidputfcolor --> -
6241 /solidputfcolor {
6242 2 dict begin
6243    /str exch def
6244    /i exch def
6245    solidgetfcolors i str put
6246 end
6247 } def
6248
6249 /solidgetinouttable {
6250    3 get
6251 } def
6252
6253 /solidputsommets {
6254    0 exch put
6255 } def
6256 /solidputpointstable {solidputsommets} def
6257
6258 /solidputfaces {
6259    1 exch put
6260 } def
6261
6262 %% syntaxe : solid solidfacesreverse -> -
6263 /solidfacesreverse {
6264 5 dict begin
6265    /solid exch def
6266    /n solid solidnombrefaces def
6267    0 1 n 1 sub {
6268       /i exch def
6269       /F solid i solidgetface reverse def
6270       /m F length def
6271       solid i [F aload pop m 0 roll ] solidputface
6272    } for
6273 end
6274 } def
6275
6276 /solidputfcolors {
6277    2 exch put
6278 } def
6279
6280 /solidputinouttable {
6281    3 exch put
6282 } def
6283
6284 %% syntaxe : any issolid --> booleen, vrai si any est de type solid
6285 /issolid {
6286 1 dict begin
6287    /candidat exch def
6288    candidat isarray {
6289       candidat length 4 eq {
6290          candidat 0 get isarray
6291          candidat 1 get isarray and
6292          candidat 2 get isarray and
6293          candidat 3 get isarray and {
6294             /IO candidat 3 get def
6295             IO length 4 eq 
6296             IO 0 get isnum and
6297             IO 1 get isnum and
6298             IO 2 get isnum and
6299             IO 3 get isnum and
6300          } {
6301             false
6302          } ifelse
6303       } {
6304          false
6305       } ifelse
6306    } {
6307       false
6308    } ifelse
6309 end
6310 } def
6311
6312 /dupsolid {
6313 5 dict begin
6314    /solid exch def
6315    /S solid solidgetsommets def
6316    /F solid solidgetfaces def
6317    /FC solid solidgetfcolors def
6318    /IO solid solidgetinouttable def
6319    solid
6320    [
6321       S duparray exch pop
6322       F duparray exch pop
6323       FC duparray exch pop
6324       IO duparray exch pop
6325    ]
6326 end
6327 } def
6328
6329 %% syntaxe : solid array solidputinfaces --> -
6330 /solidputinfaces {
6331 4 dict begin
6332    /facesinternes exch def
6333    /solid exch def
6334    /n2 facesinternes length def
6335    /IO solid solidgetinouttable def
6336    /facesexternes solid solidgetoutfaces def
6337    /n1 facesexternes length def
6338    solid
6339       [facesexternes aload pop facesinternes aload pop]
6340       solidputfaces
6341    IO 0 0 put
6342    IO 1 n1 1 sub put
6343    IO 2 n1 put
6344    IO 3 n1 n2 add 1 sub put
6345 end
6346 } def
6347
6348 %% syntaxe : solid array solidputoutfaces --> -
6349 /solidputoutfaces {
6350 4 dict begin
6351    /facesexternes exch def
6352    /solid exch def
6353    /n1 facesexternes length def
6354    /IO solid solidgetinouttable def
6355    /facesinternes solid solidgetinfaces def
6356    /n2 facesinternes length def
6357    solid
6358       [facesexternes aload pop facesinternes aload pop]
6359       solidputfaces
6360    IO 0 0 put
6361    IO 1 n1 1 sub put
6362    IO 2 n1 put
6363    IO 3 n1 n2 add 1 sub put
6364 end
6365 } def
6366
6367 /solidnombreinfaces {
6368 1 dict begin
6369    /solid exch def
6370    solid solidwithinfaces {
6371       /IO solid solidgetinouttable def
6372       IO 3 get IO 2 get sub 1 add
6373    } {
6374       0
6375    } ifelse
6376 end
6377 } def
6378
6379 /solidnombreoutfaces {
6380 1 dict begin
6381    /solid exch def
6382    /IO solid solidgetinouttable def
6383    IO 1 get IO 0 get sub 1 add
6384 end
6385 } def
6386
6387 %% syntaxe : solid solidgetinfaces --> array
6388 /solidgetinfaces {
6389 4 dict begin
6390    /solid exch def
6391    solid issolid not {
6392       (Error : mauvais type d argument dans solidgetinfaces) ==
6393       quit
6394    } if
6395    solid solidwithinfaces {
6396       /IO solid solidgetinouttable def
6397       /F solid solidgetfaces def
6398       /n1 IO 2 get def
6399       /n2 IO 3 get def
6400       /n n2 n1 sub 1 add def
6401       F n1 n getinterval
6402    } {
6403       []
6404    } ifelse
6405 end
6406 } def
6407
6408 %% syntaxe : solid solidgetoutfaces --> array
6409 /solidgetoutfaces {
6410 4 dict begin
6411    /solid exch def
6412    solid issolid not {
6413       (Error : mauvais type d argument dans solidgetoutfaces) ==
6414       quit
6415    } if
6416    /IO solid solidgetinouttable def
6417    /F solid solidgetfaces def
6418    /n1 IO 0 get def
6419    /n2 IO 1 get def
6420    /n n2 n1 sub 1 add def
6421    F n1 n getinterval
6422 end
6423 } def
6424
6425 %% /tracelignedeniveau? false def
6426 %% /hauteurlignedeniveau 1 def
6427 %% /couleurlignedeniveau {rouge} def
6428 %% /linewidthlignedeniveau 4 def
6429
6430 /solidgridOn {
6431    /solidgrid true def
6432 } def
6433 /solidgridOff {
6434    /solidgrid false def
6435 } def
6436
6437 %% syntaxe : solid i string solidputfcolor
6438 %% syntaxe : solid str outputcolors
6439 %% syntaxe : solid str1 str2 inoutputcolors
6440 %% syntaxe : solid string n solidputncolors
6441 %% syntaxe : solid array solidputincolors --> -
6442 %% syntaxe : solid array solidputoutcolors --> -
6443 %% syntaxe : solid solidgetincolors --> array
6444 %% syntaxe : solid solidgetoutcolors --> array
6445
6446 %% syntaxe : solid array solidputinfaces --> -
6447 %% syntaxe : solid array solidputoutfaces --> -
6448 %% syntaxe : solid solidgetinfaces --> array
6449 %% syntaxe : solid solidgetoutfaces --> array
6450
6451 %% syntaxe : solid1 solid2 solidfuz -> solid
6452
6453 %% syntaxe : solid i solidgetsommetsface -> array
6454 %% array = tableau de points 3d
6455 /solidgetsommetsface {
6456 1 dict begin
6457    /i exch def
6458    /solid exch def
6459    /F solid i solidgetface def
6460    [
6461       0 1 F length 1 sub {
6462          /k exch def
6463          solid F k get solidgetsommet
6464       } for
6465    ]
6466 end
6467 } def
6468
6469 %% syntaxe : solid index table solidputface -> -
6470 /solidputface {
6471 1 dict begin
6472    /table exch def
6473    /i exch def
6474    solidgetfaces i table put
6475 end
6476 } def
6477
6478 %% syntaxe : solid table solidaddface -> -
6479 %% syntaxe : solid table (couleur) solidaddface -> -
6480 %% on ne se preoccupe pas des faces internes
6481 /solidaddface {
6482 6 dict begin
6483    dup isstring {
6484       /lac@uleur exch def
6485    } {
6486       /lac@uleur () def
6487    } ifelse
6488    /table exch def
6489    /solid exch def
6490    /IO solid solidgetinouttable def
6491    /n2 IO 1 get def
6492    /FC solid solidgetoutcolors def
6493    IO 1 n2 1 add put
6494    solid [ solid solidgetfaces aload pop table ] solidputfaces
6495    solid IO solidputinouttable
6496 %   solid solidnombrefaces
6497     solid [
6498       FC aload pop lac@uleur
6499     ] solidputoutcolors
6500 end
6501 } def
6502
6503 /solidnombrefaces {
6504 1 dict begin
6505    /solid exch def
6506    solid solidnombreinfaces
6507    solid solidnombreoutfaces
6508    add 
6509 end
6510 } def
6511
6512 %% syntaxe : solid M solidaddsommetexterne -> -
6513 %% on ajoute le sommet sans se preoccuper de rien
6514 /solidaddsommetexterne {
6515 2 dict begin
6516    /M defpoint3d
6517    /solid exch def
6518    solid
6519    [ solid solidgetsommets aload pop M ]
6520    solidputsommets
6521 end
6522 } def
6523
6524 %% syntaxe : solid array solidaddsommets -> -
6525 /solidaddsommets {
6526 2 dict begin
6527    /table exch def
6528    /solid exch def
6529    /n table length 3 idiv def
6530    0 1 0 {
6531       /i exch def
6532       solid table i getp3d solidaddsommet pop
6533    } for
6534 end
6535 } def
6536
6537 %% syntaxe : solid M solidaddsommet -> k
6538 %% on ajoute le sommet M. Si il est deja sur une arete,
6539 %% on l incorpore a la face concernee 
6540 %% s il est deja present, on ne le rajoute pas.
6541 %% Renvoie l indice du sommet rajoute.
6542 /solidaddsommet {
6543 10 dict begin
6544    /M defpoint3d
6545    /solid exch def
6546    /nbf solid solidnombrefaces def
6547    /N solid solidnombresommets def
6548    /sortie -1 def
6549    %% le sommet est-il deja dans la structure
6550    0 1 N 1 sub {
6551       /i exch def
6552 %%       (addsommet) ==
6553 %%       solid i solidgetsommet == == == 
6554 %%       M == == ==
6555 %%       solid i solidgetsommet M eqp3d ==
6556    
6557 %      solid i solidgetsommet M eqp3d {
6558       solid i solidgetsommet M distance3d 1e-5 le {
6559          %% oui => c est fini
6560          /sortie i store
6561       } if
6562    } for
6563    sortie 0 lt {
6564       %% non => on le rajoute
6565       /sortie N def
6566       solid M solidaddsommetexterne
6567       %% est il sur une arete deja codee
6568       0 1 nbf 1 sub {
6569          %% face d indice i
6570          /i exch def
6571          solid i solidgetface /F exch def
6572          /nbsf F length def
6573          0 1 nbsf 1 sub {
6574             /j exch def
6575             M
6576             solid j i solidgetsommetface 
6577             solid j 1 add nbsf mod i solidgetsommetface 
6578             point3dsursegment {
6579                %% il est sur l arete concernee
6580                solid i [
6581                   0 1 j {
6582                      /k exch def
6583                      F k get
6584                   } for
6585                   N
6586                   j 1 add nbsf mod dup 0 eq {
6587                      pop
6588                   } {
6589                      1 nbsf 1 sub {
6590                         /k exch def
6591                         F k get
6592                      } for
6593                   } ifelse
6594                ]  solidputface
6595                exit
6596             } if
6597          } for 
6598       } for
6599    } if
6600    sortie
6601 end
6602 } def
6603
6604 %%%%% ### solidrmsommet ###
6605 %% syntaxe : solid i solidrmsommet -> -
6606 /solidrmsommet {
6607 5 dict begin
6608    /i exch def
6609    /solid exch def
6610    solid issolid not {
6611       (Erreur : mauvais type d argument dans solidrmsommet) ==
6612       quit 
6613    } if
6614    solid i solidsommetsadjsommet length 0 gt {
6615       (Erreur : sommet non isole dans solidrmsommet) ==
6616       quit 
6617    } if
6618
6619    %% on s occupe des sommets
6620    /n solid solidnombresommets def
6621    /S [
6622       0 1 n 1 sub {
6623          /j exch def
6624          j i ne {
6625             solid j solidgetsommet
6626          } if
6627       } for
6628    ] def
6629    solid S solidputsommets
6630    %% on s occupe des faces
6631    /n solid solidnombrefaces def
6632    /F [
6633       0 1 n 1 sub {
6634          %% face d indice j
6635          /j exch def
6636          /Fj solid j solidgetface def
6637          [0 1 Fj length 1 sub {
6638             %% sommet d indice k de la face Fj
6639             /k exch def
6640             Fj k get dup i gt {
6641                1 sub
6642             } if
6643          } for]
6644       } for
6645    ] def
6646    solid F solidputfaces
6647 end
6648 } def
6649
6650 %%%%% ### solidsommetsadjsommet ###
6651 %% syntaxe : solid i solidsommetsadjsommet --> array
6652 %% array est le tableau des indices des sommets adjacents au
6653 %% sommet d indice i
6654 /solidsommetsadjsommet {
6655 6 dict begin
6656    /no exch def
6657    /solid exch def
6658    solid no solidfacesadjsommet /facesadj exch def
6659    /sommetsadj [] def
6660    /nbadj facesadj length def
6661    0 1 nbadj 1 sub {
6662       /j exch def
6663       %% examen de la jieme face
6664       %/j 0 def
6665       /F solid facesadj j get solidgetface def
6666       /nbsommetsface F length def
6667       no F in {
6668          /index exch def
6669          /i1 F index 1 sub nbsommetsface modulo get def
6670          /i2 F index 1 add nbsommetsface mod get def
6671          %% si i1 n est pas deja note, on le rajoute
6672          i1 sommetsadj in {
6673             pop
6674          } {
6675             /sommetsadj [ sommetsadj aload pop i1 ] store
6676          } ifelse
6677          %% si i2 n est pas deja note, on le rajoute
6678          i2 sommetsadj in {
6679             pop
6680          } {
6681             /sommetsadj [ sommetsadj aload pop i2 ] store
6682          } ifelse
6683       } {
6684          (Error : bug dans solidsommetsadjsommet) ==
6685          quit
6686       } ifelse
6687    } for
6688    sommetsadj
6689 end
6690 } def
6691
6692 %%%%% ### solidfacesadjsommet ###
6693 %% syntaxe : solid i solidfacesadjsommet --> array
6694 %% array est le tableau des indices des faces adjacentes au
6695 %% sommet d indice i
6696 /solidfacesadjsommet {
6697 6 dict begin
6698    /no exch def
6699    /solid exch def
6700    /n solid solidnombrefaces def
6701    /indicesfacesadj [] def
6702    0 1 n 1 sub {
6703       /j exch def
6704       /F solid j solidgetface def
6705       no F in {
6706          pop
6707          /indicesfacesadj [ indicesfacesadj aload pop j ] store
6708       } if
6709    } for
6710    indicesfacesadj
6711 end
6712 } def
6713
6714 %%%%% ### ordonnepoints3d ###
6715 %% syntaxe : array1 M ordonnepoints3d --> array2
6716 %% array1 = tableau de points 3d coplanaires (plan P)
6717 %% M = point3d indiquant la direction de la normale a P
6718 %% array2 = les indices des points de depart, ranges dans le 
6719 %% sens trigo par rapport a la normale
6720 /ordonnepoints3d {
6721 5 dict begin
6722    /M defpoint3d
6723    /table exch def
6724    table isobarycentre3d /G defpoint3d
6725    %% calcul de la normale
6726    table 0 getp3d /ptref defpoint3d
6727    table 1 getp3d /A defpoint3d
6728    G ptref vecteur3d
6729    G A vecteur3d
6730    vectprod3d /vecteurnormal defpoint3d
6731    vecteurnormal G M vecteur3d scalprod3d 0 lt {
6732       vecteurnormal -1 mulv3d /vecteurnormal defpoint3d
6733    } if
6734    %% la table des angles
6735    table duparray exch pop
6736    {1 dict begin
6737       /M defpoint3d
6738       G ptref vecteur3d
6739       G M vecteur3d
6740       vecteurnormal angle3doriente
6741    end} papply3d
6742 %   [0 1 table length 3 idiv 1 sub {} for]
6743 %   exch
6744     doublebubblesort pop
6745 end
6746 } def
6747
6748 %%%%% ### fin insertion ###
6749
6750 %% /tracelignedeniveau? false def
6751 %% /hauteurlignedeniveau 1 def
6752 %% /couleurlignedeniveau {rouge} def
6753 %% /linewidthlignedeniveau 4 def
6754 %% 
6755 %% /solidgrid true def
6756 %% /aretescachees true def
6757 %% /defaultsolidmode 2 def
6758
6759 %% syntaxe : alpha beta r h newpie --> solid
6760 /newpie {
6761 6 dict begin
6762    [[/resolution /nbetages] [8 1] [10 1] [12 1] [18 3] [36 5]] gestionsolidmode
6763    /h exch def
6764    /r exch def
6765    /beta exch def
6766    /alpha exch def
6767    [
6768       0 0
6769 %      alpha cos r mul alpha sin r mul
6770       alpha beta {1 dict begin /t exch def t cos r mul t sin r mul end} CourbeR2+
6771    ] 0 h [nbetages] newprismedroit
6772 end
6773 } def
6774
6775 %%%%% ### newsolid ###
6776 %% syntaxe : newsolid --> depose le solide nul sur la pile
6777 /newsolid {
6778    [] [] generesolid
6779 } def
6780
6781 %%%%% ### generesolid ###
6782 /generesolid {
6783 2 dict begin
6784    /F exch def
6785    /S exch def
6786    [S F [F length {()} repeat] [0 F length 1 sub -1 -1]]
6787 end
6788 } def
6789
6790 %%%%% ### nullsolid ###
6791 %% syntaxe : solide nullsolid -> booleen, vrai si le solide est nul
6792 /nullsolid {
6793 1 dict begin
6794    /candidat exch def
6795    candidat issolid not {
6796       (Error type argument dans "nullsolid") ==
6797       quit
6798    } if
6799    candidat solidgetsommets length 0 eq {
6800       true
6801    } {
6802       false
6803    } ifelse
6804 end
6805 } def
6806
6807 %%%%% ### solidnombreoutfaces ###
6808 /solidnombreoutfaces {
6809 4 dict begin
6810    /solid exch def
6811    solid issolid not {
6812       (Error : mauvais type d argument dans solidnombreoutfaces) ==
6813       quit
6814    } if
6815    solid nullsolid {
6816       0
6817    } {
6818       /IO solid solidgetinouttable def
6819       IO 1 get
6820       IO 0 get sub
6821       1 add
6822    } ifelse
6823 end
6824 } def
6825
6826 %%%%% ### solidnombreinfaces ###
6827 /solidnombreinfaces {
6828 4 dict begin
6829    /solid exch def
6830    solid issolid not {
6831       (Error : mauvais type d argument dans solidnombreinfaces) ==
6832       quit
6833    } if
6834    solid solidwithinfaces {
6835       /IO solid solidgetinouttable def
6836       IO 3 get
6837       IO 2 get sub
6838       1 add
6839    } {
6840       0
6841    } ifelse
6842 end
6843 } def
6844
6845 %%%%% ### solidtests ###
6846 %% syntaxe : solid solidwithinfaces --> bool, true si le solide est vide
6847 /solidwithinfaces {
6848 2 dict begin
6849    /solid exch def
6850    solid issolid not {
6851       (Error : mauvais type d argument dans solidwithinfaces) ==
6852       quit
6853    } if
6854    /table solid solidgetinouttable def
6855    table 2 get -1 ne {
6856       true
6857    } {
6858       false
6859    } ifelse
6860 end
6861 } def
6862
6863 %%%%% ### solidgetsommet ###
6864 %% syntaxe : solid i j solidgetsommetface --> sommet i de la face j
6865 /solidgetsommetface {
6866 6 dict begin
6867    /j exch def
6868    /i exch def
6869    /solid exch def
6870    solid issolid not {
6871       (Error : mauvais type d argument dans solidgetsommetface) ==
6872       quit
6873    } if
6874    /table_faces solid solidgetfaces def
6875    /table_sommets solid solidgetsommets def
6876    /k table_faces j get i get def
6877    table_sommets k getp3d
6878 end
6879 } def
6880
6881 %% syntaxe : solid i solidgetsommetsface --> array, tableau des
6882 %% sommets de la face i du solide
6883 /solidgetsommetsface {
6884 6 dict begin
6885    /i exch def
6886    /solid exch def
6887    solid issolid not {
6888       (Error : mauvais type d argument dans solidgetsommetsface) ==
6889       quit
6890    } if
6891    /table_faces solid solidgetfaces def
6892    /table_sommets solid solidgetsommets def
6893    /table_indices table_faces i get def
6894    [
6895       0 1 table_indices length 1 sub {
6896          /j exch def
6897          table_sommets table_indices j get getp3d
6898       } for
6899    ]
6900 end
6901 } def
6902
6903 %% syntaxe : solid i solidgetsommet --> sommet i du solide
6904 /solidgetsommet {
6905 3 dict begin
6906    /i exch def
6907    /solid exch def
6908    solid issolid not {
6909       (Error : mauvais type d argument dans solidgetsommet) ==
6910       quit
6911    } if
6912    /table_sommets solid solidgetsommets def
6913    table_sommets i getp3d
6914 end
6915 } def
6916
6917 %%%%% ### solidcentreface ###
6918 %% syntaxe : solid i solidcentreface --> M
6919 /solidcentreface {
6920    solidgetsommetsface isobarycentre3d
6921 } def
6922
6923 %%%%% ### solidnombre ###
6924 /solidnombresommets {
6925    solidgetsommets length 3 idiv
6926 } def
6927
6928 /solidfacenombresommets {
6929    solidgetface length
6930 } def
6931
6932 /solidnombrefaces {
6933    solidgetfaces length
6934 } def
6935
6936 %%%%% ### solidshowsommets ###
6937 /solidshowsommets {
6938 8 dict begin
6939    dup issolid not {
6940       %% on a un argument
6941       /option exch def
6942    } if
6943    /sol exch def
6944    /n sol solidnombresommets def
6945    /m sol solidnombrefaces def
6946    currentdict /option known not {
6947       /option [0 1 n 1 sub {} for] def
6948    } if
6949    0 1 option length 1 sub {
6950       /k exch def
6951       option k get /i exch def       %% indice du sommet examine
6952       sol i solidgetsommet point3d
6953    } for
6954 end
6955 } def
6956
6957 %%%%% ### solidnumsommets ###
6958 /solidnumsommets {
6959 8 dict begin
6960    Font findfont 10 scalefont setfont
6961    dup issolid not {
6962       %% on a un argument
6963       /option exch def
6964    } if
6965    /sol exch def
6966    /n sol solidnombresommets def
6967    /m sol solidnombrefaces def
6968    currentdict /option known not {
6969       /option [0 1 n 1 sub {} for] def
6970    } if
6971    /result [
6972       n {false} repeat
6973    ] def
6974    0 1 option length 1 sub {
6975       /k exch def
6976       option k get /i exch def       %% indice du sommet examine
6977       0 1 m 1 sub {
6978          /j exch def %% indice de la face examinee
6979          i sol j solidgetface in {
6980             %% le sommet i est dans la face j
6981             pop
6982             exit
6983          } if
6984       } for
6985       %% le sommet i est dans la face j
6986       sol j solidcentreface /G defpoint3d
6987       sol i solidgetsommet /S defpoint3d
6988       i (   ) cvs
6989       G S vecteur3d normalize3d
6990       15 dup ptojpoint pop
6991       mulv3d
6992       S addv3d
6993       3dto2d cctext 
6994    } for
6995 end
6996 } def
6997
6998 %%%%% ### gestionsolidmode ###
6999 %% table = [ [vars] [mode0] [mode1] [mode2] [mode3] [mode4] ]
7000 /gestionsolidmode {
7001 5 dict begin
7002    /table exch def
7003    dup xcheck {
7004       /mode exch def
7005    } {
7006       dup isarray {
7007          /tableaffectation exch def
7008          /mode -1 def
7009       } {
7010          /mode defaultsolidmode def
7011       } ifelse
7012    } ifelse
7013    /vars table 0 get def
7014    /nbvars vars length def
7015    mode 0 ge {
7016       /tableaffectation table mode 1 add 5 min get def
7017    } if
7018    0 1 nbvars 1 sub {
7019       /i exch def
7020       vars i get
7021       tableaffectation i get
7022    } for
7023    nbvars 
7024 end
7025    {def} repeat
7026 } def
7027
7028 %%%%% ### solidfuz ###
7029 %% syntaxe : solid1 solid2 solidfuz -> solid
7030 /solidfuz {
7031 5 dict begin
7032    /solid2 exch def
7033    /solid1 exch def
7034    /S1 solid1 solidgetsommets def
7035    /S2 solid2 solidgetsommets def
7036    /n S1 length 3 idiv def
7037
7038    %% les sommets
7039    /S S1 S2 append def
7040
7041    %% les faces internes et leurs couleurs
7042    /FI1 solid1 solidgetinfaces def
7043    /FIC1 solid1 solidgetincolors def
7044    solid2 solidnombreinfaces 0 eq {
7045       /FI2 [] def
7046       /FIC2 [] def
7047    } {
7048       /FI2 solid2 solidgetinfaces {{n add} apply} apply def
7049       /FIC2 solid2 solidgetincolors def
7050    } ifelse
7051    /FI [FI1 aload pop FI2 aload pop] def
7052    /FIC [FIC1 aload pop FIC2 aload pop] def
7053
7054    %% les faces externes et leurs couleurs
7055    /FO1 solid1 solidgetoutfaces def
7056    /FOC1 solid1 solidgetoutcolors def
7057    /FO2 solid2 solidgetoutfaces {{n add} apply} apply def
7058    /FOC2 solid2 solidgetoutcolors def
7059    /FO [FO1 aload pop FO2 aload pop] def
7060    /FOC [FOC1 aload pop FOC2 aload pop] def
7061
7062    /F [FO aload pop FI aload pop] def
7063    /FC [FOC aload pop FIC aload pop] def
7064    /IO [
7065       0 FO length 1 sub
7066       FI length 0 gt {
7067          dup 1 add dup FI length add 1 sub
7068       } {
7069          -1 -1
7070       } ifelse
7071    ] def
7072
7073    S F generesolid
7074    dup FC solidputfcolors
7075    dup IO solidputinouttable
7076 end
7077 } def
7078
7079 %%%%% ### solidnormaleface ###
7080 %% syntaxe : solid i solidnormaleface --> u, vecteur normale a la
7081 %% face d indice i du solide
7082 /solidnormaleface {
7083 4 dict begin
7084    /i exch def
7085    /solid exch def
7086    solid issolid not {
7087       (Error : mauvais type d argument dans solidgetsommetface) ==
7088       quit
7089    } if
7090 %%    solid 0 i solidgetsommetface /G defpoint3d
7091 %%    G
7092 %%    solid 1 i solidgetsommetface
7093 %%    vecteur3d
7094 %%    G
7095 %%    solid 2 i solidgetsommetface
7096 %%    vecteur3d
7097
7098    /n solid i solidfacenombresommets def
7099    solid i solidcentreface /G defpoint3d
7100   %% debug %%   G 3dto2d point
7101    G
7102    solid 0 i solidgetsommetface
7103    /A defpoint3d
7104   %   gsave bleu A point3d grestore
7105    A
7106    vecteur3d normalize3d
7107    G
7108    solid 1 i solidgetsommetface
7109    /A defpoint3d
7110   %   gsave orange A point3d grestore
7111    A
7112    vecteur3d normalize3d
7113    vectprod3d
7114    /resultat defpoint3d
7115    resultat normalize3d
7116 end
7117 } def
7118
7119 %%%%% ### solidtransform ###
7120 %% syntaxe : solid1 {f} solidtransform --> solid2, solid2 est le
7121 %% transforme de solid1 par la transformation f : R^3 -> R^3
7122 /solidtransform {
7123 3 dict begin
7124    /@f exch def
7125    /solid exch def
7126    solid issolid not {
7127       (Error : mauvais type d argument dans solidtransform) ==
7128       quit
7129    } if
7130    /les_sommets
7131       solid solidgetsommets {@f} papply3d
7132    def
7133    solid les_sommets solidputsommets
7134    solid
7135 end
7136 } def
7137
7138 %%%%% ### solidputcolor ###
7139 %% syntaxe : solid i string solidputfcolor
7140 /solidputfcolor {
7141 3 dict begin
7142    /str exch def
7143    /i exch def
7144    /solid exch def
7145    /FC solid solidgetfcolors def
7146    i FC length lt {
7147       FC i str put
7148    } if
7149 end
7150 } def
7151
7152 %% syntaxe : solid solidgetincolors --> array
7153 /solidgetincolors {
7154 3 dict begin
7155    /solid exch def
7156    solid issolid not {
7157       (Error : mauvais type d argument dans solidgetincolors) ==
7158       quit
7159    } if
7160    solid solidwithinfaces {
7161       /fcol solid solidgetfcolors def
7162       /IO solid solidgetinouttable def
7163       /n1 IO 2 get def
7164       /n2 IO 3 get def
7165       /n n2 n1 sub 1 add def
7166       fcol n1 n getinterval
7167    } {
7168       []
7169    } ifelse
7170 end
7171 } def
7172
7173 %% syntaxe : solid solidgetoutcolors --> array
7174 /solidgetoutcolors {
7175 3 dict begin
7176    /solid exch def
7177    solid issolid not {
7178       (Error : mauvais type d argument dans solidgetoutcolors) ==
7179       quit
7180    } if
7181    /fcol solid solidgetfcolors def
7182    /IO solid solidgetinouttable def 
7183    /n1 IO 0 get def
7184    /n2 IO 1 get def
7185    /n n2 n1 sub 1 add def
7186    fcol n1 n getinterval 
7187 end
7188 } def
7189  
7190 %% syntaxe : solid array solidputincolors --> -
7191 /solidputincolors {
7192 4 dict begin
7193    /newcolorstable exch def
7194    /solid exch def
7195    solid issolid not {
7196       (Error : mauvais type d argument dans solidputincolors) ==
7197       quit
7198    } if
7199    /n newcolorstable length def
7200    n solid solidnombreinfaces ne {
7201       (Error : mauvaise longueur de tableau dans solidputincolors) ==
7202       quit
7203    } if
7204    n 0 ne {
7205       /FC solid solidgetfcolors def
7206       /IO solid solidgetinouttable def
7207       /n1 IO 2 get def
7208       FC n1 newcolorstable putinterval
7209    } if
7210 end
7211 } def
7212
7213 %% syntaxe : solid array solidputoutcolors --> -
7214 /solidputoutcolors {
7215 4 dict begin
7216    /newcolorstable exch def
7217    /solid exch def
7218    solid issolid not {
7219       (Error : mauvais type d argument dans solidputoutcolors) ==
7220       quit
7221    } if
7222    /n newcolorstable length def
7223    n solid solidnombreoutfaces ne {
7224       (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
7225       quit
7226    } if
7227    n 0 ne {
7228       /FC solid solidgetfcolors def
7229       /IO solid solidgetinouttable def
7230       /n1 IO 0 get def
7231       FC n1 newcolorstable putinterval
7232    } if
7233 end
7234 } def
7235
7236 %% syntaxe : solid str outputcolors
7237 /outputcolors {
7238 5 dict begin
7239    /color exch def
7240    /solid exch def
7241    solid issolid not {
7242       (Error : mauvais type d argument dans inoutputcolors) ==
7243       quit
7244    } if
7245    /n solid solidnombreoutfaces def
7246    solid [ n {color} repeat ] solidputoutcolors
7247 end
7248 } def
7249
7250 %% syntaxe : solid str inputcolors
7251 /inputcolors {
7252 5 dict begin
7253    /color exch def
7254    /solid exch def
7255    solid issolid not {
7256       (Error : mauvais type d argument dans inoutputcolors) ==
7257       quit
7258    } if
7259    /n solid solidnombreinfaces def
7260    solid [ n {color} repeat ] solidputincolors
7261 end
7262 } def
7263
7264 %% syntaxe : solid str1 str2 inoutputcolors
7265 /inoutputcolors {
7266 5 dict begin
7267    /colout exch def
7268    /colin exch def
7269    /solid exch def
7270    solid colin inputcolors
7271    solid colout outputcolors
7272 end
7273 } def
7274
7275 %% syntaxe : solid array solidputoutcolors --> -
7276 /solidputoutcolors {
7277 4 dict begin
7278    /newcolorstable exch def
7279    /solid exch def
7280    solid issolid not {
7281       (Error : mauvais type d argument dans solidputoutcolors) ==
7282       quit
7283    } if
7284    /n newcolorstable length def
7285    n solid solidnombreoutfaces ne {
7286       (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
7287       quit
7288    } if
7289    n 0 ne {
7290       /FC solid solidgetfcolors def
7291       /IO solid solidgetinouttable def
7292       /n1 IO 0 get def
7293       FC length n n1 add lt {
7294          solid newcolorstable solidputfcolors
7295       } {
7296          FC n1 newcolorstable putinterval
7297       } ifelse
7298    } if
7299 end
7300 } def
7301
7302 /solidputcolors {
7303 3 dict begin
7304    2 copy pop
7305    isstring {
7306       inoutputcolors
7307    } {
7308       outputcolors
7309    } ifelse
7310 end
7311 } def
7312
7313 %%%%% ### solidputhuecolors ###
7314 %% syntaxe : solid table solidputhuecolors --> -
7315 /solidputhuecolors {
7316 1 dict begin
7317    2 copy pop
7318    solidgetinouttable /IO exch def
7319    IO 0 get
7320    IO 1 get
7321    s@lidputhuec@l@rs
7322 end
7323 } def
7324
7325 /solidputinhuecolors {
7326 2 dict begin
7327    /table exch def
7328    /solid exch def
7329    solid solidgetinouttable /IO exch def
7330    solid solidwithinfaces {
7331       solid table
7332       IO 2 get
7333       IO 3 get
7334       s@lidputhuec@l@rs
7335    } if
7336 end
7337 } def
7338
7339 /solidputinouthuecolors {
7340 1 dict begin
7341    2 copy pop
7342    solidgetinouttable /IO exch def
7343    IO 0 get
7344    IO 3 get IO 1 get max
7345    s@lidputhuec@l@rs
7346 end
7347 } def
7348
7349 %% syntaxe : solid table n1 n2 s@lidputhuec@l@rs --> -
7350 %% affecte les couleurs des faces d indice n1 a n2 du solid solid, par
7351 %% un degrade defini par la table.
7352  /s@lidputhuec@l@rs {
7353 9 dict begin
7354    /n2 exch def
7355    /n1 exch def
7356    /table exch def
7357    /solid exch def
7358    /n n2 n1 sub def
7359
7360    table length 2 eq {
7361        /a0 table 0 get def
7362        /a1 table 1 get def
7363        a1 isstring {
7364           /lacouleurdepart {
7365              gsave
7366                 [a0 cvx exec] length 0 eq {
7367                    a0 cvx exec currentrgbcolor
7368                 } {
7369                    a0 cvx exec
7370                 } ifelse 
7371              grestore
7372           } def
7373           /lacouleurarrivee {
7374              gsave
7375                 [a1 cvx exec] length 0 eq {
7376                    a1 cvx exec currentrgbcolor
7377                 } {
7378                    a1 cvx exec
7379                 } ifelse 
7380              grestore
7381           } def
7382           /table [lacouleurdepart lacouleurarrivee] def
7383        } {
7384           /A {a0 i a1 a0 sub mul n 1 sub div add} def
7385           /B {1} def
7386           /C {1} def
7387           /D {} def
7388           /espacedecouleurs (sethsbcolor) def
7389        } ifelse
7390    } if
7391
7392    table length 4 eq {
7393        /a0 table 0 get def
7394        /a1 table 1 get def
7395        /A {a0 i a1 a0 sub mul n 1 sub div add} def
7396        /B table 2 get def
7397        /C table 3 get def
7398        /D {} def
7399        /espacedecouleurs (sethsbcolor) def
7400    } if
7401
7402    table length 6 eq {
7403        /a0 table 0 get def
7404        /b0 table 1 get def
7405        /c0 table 2 get def
7406        /a1 table 3 get def
7407        /b1 table 4 get def
7408        /c1 table 5 get def
7409        /A {a0 i a1 a0 sub mul n 1 sub div add} def
7410        /B {b0 i b1 b0 sub mul n 1 sub div add} def
7411        /C {c0 i c1 c0 sub mul n 1 sub div add} def
7412        /D {} def
7413        /espacedecouleurs (setrgbcolor) def
7414    } if
7415
7416    table length 7 eq {
7417        /a0 table 0 get def
7418        /b0 table 1 get def
7419        /c0 table 2 get def
7420        /a1 table 3 get def
7421        /b1 table 4 get def
7422        /c1 table 5 get def
7423        /A {a0 i a1 a0 sub mul n 1 sub div add} def
7424        /B {b0 i b1 b0 sub mul n 1 sub div add} def
7425        /C {c0 i c1 c0 sub mul n 1 sub div add} def
7426        /D {} def
7427        /espacedecouleurs (sethsbcolor) def
7428    } if
7429
7430    table length 8 eq {
7431        /a0 table 0 get def
7432        /b0 table 1 get def
7433        /c0 table 2 get def
7434        /d0 table 3 get def
7435        /a1 table 4 get def
7436        /b1 table 5 get def
7437        /c1 table 6 get def
7438        /d1 table 7 get def
7439        /A {a0 i a1 a0 sub mul n 1 sub div add} def
7440        /B {b0 i b1 b0 sub mul n 1 sub div add} def
7441        /C {c0 i c1 c0 sub mul n 1 sub div add} def
7442        /D {d0 i d1 d0 sub mul n 1 sub div add} def
7443        /espacedecouleurs (setcmykcolor) def
7444    } if
7445
7446    n1 1 n2 {
7447       /i exch def
7448       solid i
7449       [A B C D] espacedecouleurs astr2str
7450       solidputfcolor
7451    } for
7452    
7453 end
7454 } def
7455
7456 %%%%% ### solidrmface ###
7457 %% syntaxe : solid i solidrmface -> -
7458 /solidrmface {
7459 5 dict begin
7460    /i exch def
7461    /solid exch def
7462    solid issolid not {
7463       (Error : mauvais type d argument dans solidrmface) ==
7464       quit
7465    } if
7466    %% on enleve la face
7467    /F solid solidgetfaces def
7468    F length 1 sub i lt {
7469       (Error : indice trop grand dans solidrmface) ==
7470       quit
7471    } if
7472    [
7473       0 1 F length 1 sub {
7474          /j exch def
7475          i j ne {
7476             F j get
7477          } if
7478       } for
7479    ]
7480    /NF exch def
7481    solid NF solidputfaces
7482    %% on enleve la couleur correspondante
7483    /FC solid solidgetfcolors def
7484    [
7485       0 1 FC length 1 sub {
7486          /j exch def
7487          i j ne {
7488             FC j get
7489          } if
7490       } for
7491    ]
7492    /NFC exch def
7493    solid NFC solidputfcolors
7494    %% on ajuste la table inout
7495    /IO solid solidgetinouttable def
7496    solid i solidisoutface {
7497       IO 1 IO 1 get 1 sub put 
7498       solid solidwithinfaces {
7499          IO 2 IO 2 get 1 sub put
7500          IO 3 IO 3 get 1 sub put
7501       } if
7502    } if
7503    solid i solidisinface {
7504       IO 1 IO 1 get 1 sub put
7505       IO 2 IO 2 get 1 sub put
7506       IO 3 IO 3 get 1 sub put
7507    } if
7508    solid IO solidputinouttable
7509 end
7510 } def
7511
7512 %% syntaxe : solid table solidrmfaces --> -
7513 /solidrmfaces {
7514 2 dict begin
7515    /table exch bubblesort reverse def
7516    /solid exch def
7517    table {solid exch solidrmface} apply
7518 end
7519 } def
7520
7521 %%%%% ### videsolid ###
7522 %% syntaxe : solid videsolid -> -
7523 /videsolid {
7524 5 dict begin
7525    /solid exch def
7526    solid issolid not {
7527       (Error : mauvais type d argument dans videsolid) ==
7528       quit
7529    } if
7530    solid solidwithinfaces not {
7531       /IO solid solidgetinouttable def
7532       /FE solid solidgetfaces def
7533       /n FE length def
7534       IO 2 n put
7535       IO 3 2 n mul 1 sub put
7536       solid IO solidputinouttable
7537       %% on inverse chaque face
7538       /FI FE {reverse} apply def
7539       solid FE FI append solidputfaces
7540       %% et on rajoute autant de couleurs vides que de faces
7541       /FEC solid solidgetfcolors def
7542 %      /FIC [FI length {()} repeat] def
7543 %      solid FEC FIC append solidputfcolors
7544       solid FEC duparray append solidputfcolors
7545    } if 
7546 end
7547 } def
7548
7549 %%%%% ### solidnumfaces ###
7550 %% syntaxe : solid array solidnumfaces
7551 %% syntaxe : solid array bool solidnumfaces
7552 %% array, le tableau des indices des faces a numeroter, est optionnel
7553 %% si bool=true, on ne numerote que les faces visibles
7554 /solidnumfaces {
7555 5 dict begin
7556    dup isbool {
7557       /bool exch def
7558    } {
7559       /bool true def
7560    } ifelse
7561    setTimes
7562    dup issolid not {
7563       %% on a un argument
7564       /option exch def 
7565    } if
7566    /sol exch def
7567    /n sol solidnombrefaces def
7568    currentdict /option known not {
7569       /option [0 1 n 1 sub {} for] def
7570    } if
7571
7572    0 1 option length 1 sub {
7573       /i exch def
7574       /j option i get def
7575       j (     ) cvs sol j bool cctextp3d
7576    } for
7577 end
7578 } def
7579
7580 %%%%% ### creusesolid ###
7581 %% syntaxe : solid creusesolid -> -
7582 /creusesolid {
7583 5 dict begin
7584    /solid exch def
7585    solid issolid not {
7586       (Error : mauvais type d argument dans creusesolid) ==
7587       quit
7588    } if
7589    %% on enleve le fond et le chapeau
7590    solid 1 solidrmface
7591    solid 0 solidrmface
7592    %% on inverse chaque face
7593    solid videsolid
7594 end
7595 } def
7596
7597 %%%%% ### fin insertion ###
7598
7599 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7600 %%%%                 dessin des solides                 %%%%
7601 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7602
7603 %%%%% ### solidisinface ###
7604 %% syntaxe : solid i solidisinface --> bool
7605 %% true si i est l indice d une face interne, false sinon
7606 /solidisinface {
7607 4 dict begin
7608    /i exch def
7609    solidgetinouttable /IO exch def
7610    /n1 IO 2 get def
7611    /n2 IO 3 get def
7612    n1 i le 
7613    i n2 le and
7614 end
7615 } def
7616
7617 %%%%% ### solidisoutface ###
7618 %% syntaxe : solid i solidisoutface --> bool
7619 %% true si i est l indice d une face externe, false sinon
7620 /solidisoutface {
7621 4 dict begin
7622    /i exch def
7623    solidgetinouttable /IO exch def
7624    /n1 IO 0 get def
7625    /n2 IO 1 get def
7626    n1 i le 
7627    i n2 le and
7628 end
7629 } def
7630
7631 %%%%% ### planvisible ###
7632 %% syntaxe : A k planvisible? --> true si le plan est visible
7633 /planvisible? {
7634 4 dict begin
7635    /normale_plan defpoint3d
7636    /origine defpoint3d
7637    /ligne_de_vue {
7638       origine
7639       GetCamPos
7640       vecteur3d
7641    } def
7642    ligne_de_vue normale_plan scalprod3d 0 gt
7643 end
7644 } def
7645
7646 %%%%% ### solidlight ###
7647 /setlightintensity {
7648    /lightintensity exch def
7649 } def
7650
7651 /setlightsrc {
7652    /lightsrc defpoint3d
7653 } def
7654
7655 /setlight {
7656 1 dict begin
7657 gsave
7658    exec
7659    [ currentrgbcolor ] /lightcolor exch 
7660 grestore
7661 end
7662 def
7663 } def
7664
7665 %%%%% ### drawsolid ###
7666 /solidlightOn {
7667    /s@lidlight true def
7668 } def
7669 /solidlightOff {
7670    /s@lidlight false def
7671 } def
7672 solidlightOff
7673
7674 %% syntaxe : solid i solidfacevisible? --> true si la face est visible
7675 /solidfacevisible? {
7676 4 dict begin
7677    /i exch def
7678    /solid exch def
7679    solid issolid not {
7680       (Error : mauvais type d argument dans solidgetsommetface) ==
7681       quit
7682    } if
7683    solid i solidgetface length 2 le {
7684       true
7685    } {
7686       /ligne_de_vue {
7687          solid i solidcentreface
7688          GetCamPos
7689          vecteur3d
7690       } def
7691    
7692       /normale_face {
7693          solid i solidnormaleface
7694       } def
7695       ligne_de_vue normale_face scalprod3d 0 gt
7696    } ifelse
7697 end
7698 } def
7699
7700 %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de
7701 %% la face i est definie, affecte fillstyle a cette couleur
7702 /affectecouleursolid_facei {
7703 3 dict begin
7704    /i exch def
7705    /solid exch def
7706    solid solidgetfcolors /FC exch def
7707    FC length 1 sub i ge {
7708       FC i get length 1 ge {
7709          /fillstyle FC i get ( Fill) append cvx
7710          solidgrid not {
7711             FC i get cvx exec
7712          } if
7713          true
7714       } {
7715          false
7716       } ifelse
7717    } {
7718       false
7719    } ifelse
7720 end
7721 {def} if
7722 } def
7723
7724 %% syntaxe : solid i dessinefacecachee
7725 /dessinefacecachee {
7726 11 dict begin
7727    /i exch def
7728    /solid exch def
7729    solid issolid not {
7730       (Error : mauvais type d argument dans dessinefacecachee) ==
7731       quit
7732    } if
7733
7734    /F solid solidgetfaces def
7735    /S solid solidgetsommets def
7736
7737    %% face cachee => on prend chacune des aretes de la face et on
7738    %% la dessine
7739    4 dict begin
7740       /n F i get length def %% nb de sommets de la face
7741       0 1 n 1 sub {
7742          /k exch def
7743          /k1 F i k get_ij def              %% indice sommet1
7744          /k2 F i k 1 add n mod get_ij def  %% indice sommet2
7745          gsave
7746             currentlinewidth .5 mul setlinewidth
7747             pointilles
7748             [S k1 getp3d
7749             S k2 getp3d sortp3d] ligne3d
7750          grestore
7751       } for
7752
7753    %% trace de la ligne de niveau
7754    solidintersectiontype 0 ge {
7755       /face_a_dessiner [  %% face visible : F [i]
7756          0 1 n 1 sub {
7757             /j exch def
7758             solid j i solidgetsommetface
7759          } for
7760       ] def 
7761       0 1 solidintersectionplan length 1 sub {
7762          /k exch def
7763          /lignedeniveau [] def
7764          gsave
7765             pointilles
7766             k solidintersectionlinewidth length lt {
7767                solidintersectionlinewidth k get setlinewidth
7768             } {
7769                solidintersectionlinewidth 0 get setlinewidth
7770             } ifelse
7771             k solidintersectioncolor length lt {
7772                solidintersectioncolor k get cvx exec
7773             } {
7774                solidintersectioncolor 0 get cvx exec
7775             } ifelse
7776             0 1 n 1 sub {
7777                /j exch def
7778                face_a_dessiner j getp3d
7779                face_a_dessiner j 1 add n mod getp3d
7780                solidintersectionplan k get
7781                dup isarray {
7782                   segment_inter_plan
7783                } {
7784                   segment_inter_planz
7785                } ifelse {
7786                1 dict begin
7787                   /table exch def
7788                   table length 6 eq {
7789                      /lignedeniveau table store
7790                      exit
7791                   } {
7792                      /lignedeniveau [ 
7793                         lignedeniveau aload pop 
7794                         table 0 getp3d
7795                      ] store
7796                   } ifelse
7797                end
7798                } if
7799             } for
7800             
7801             %% dessin de la ligne
7802             lignedeniveau length 4 ge {
7803                [lignedeniveau aload pop sortp3d] ligne3d
7804             } if
7805          grestore
7806       } for         
7807    } if
7808    
7809    end
7810 end
7811 } def
7812
7813 %% syntaxe : solid i dessinefacevisible
7814 /dessinefacevisible {
7815 8 dict begin
7816    /i exch def
7817    /solid exch def
7818    solid issolid not {
7819       (Error : mauvais type d argument dans dessinefacevisible) ==
7820       quit
7821    } if
7822    /F solid solidgetfaces def
7823    /S solid solidgetsommets def
7824
7825    /n F i get length def %% nb de sommets de la face
7826
7827    startest {
7828       s@lidlight {
7829          /coeff
7830             lightintensity
7831             solid i solidnormaleface normalize3d
7832             solid i solidcentreface lightsrc vecteur3d normalize3d
7833             scalprod3d mul
7834             0 max 1 min
7835          def
7836          /lightcolor where {
7837             pop
7838             /lacouleur lightcolor def
7839          } {
7840             /lacouleur [
7841                gsave
7842                   solid solidgetfcolors i get cvx exec currentrgbcolor
7843                grestore
7844             ] def
7845          } ifelse
7846          /fillstyle {
7847              lacouleur {coeff mul} apply setcolor Fill
7848          } def
7849          solidgrid not {
7850             lacouleur {coeff mul} apply setcolor
7851          } if
7852       } {
7853          n 2 eq {
7854             1 dict begin
7855                solidgridOff
7856                solid i affectecouleursolid_facei
7857             end
7858          } {
7859             solid i affectecouleursolid_facei
7860          } ifelse
7861       } ifelse
7862    } if
7863
7864    /face_a_dessiner [  %% face visible : F [i]
7865       0 1 n 1 sub {
7866          /j exch def
7867          solid j i solidgetsommetface
7868       } for
7869    ] def 
7870    face_a_dessiner polygone3d
7871
7872    %% trace de la ligne de niveau
7873    solidintersectiontype 0 ge {
7874       0 1 solidintersectionplan length 1 sub {
7875          /k exch def
7876          /lignedeniveau [] def
7877          gsave
7878             k solidintersectionlinewidth length lt {
7879                solidintersectionlinewidth k get setlinewidth
7880             } {
7881                solidintersectionlinewidth 0 get setlinewidth
7882             } ifelse
7883             k solidintersectioncolor length lt {
7884                solidintersectioncolor k get cvx exec
7885             } {
7886                solidintersectioncolor 0 get cvx exec
7887             } ifelse
7888             0 1 n 1 sub {
7889                /j exch def
7890                face_a_dessiner j getp3d
7891                face_a_dessiner j 1 add n mod getp3d
7892                solidintersectionplan k get
7893                dup isarray {
7894                   segment_inter_plan
7895                } {
7896                   segment_inter_planz
7897                } ifelse {
7898                1 dict begin
7899                   /table exch def
7900                   /lignedeniveau [ 
7901                      lignedeniveau aload pop 
7902                      table 0 getp3d
7903                      table length 4 ge {
7904                         table 1 getp3d
7905                      } if
7906                   ] store
7907                end
7908                } if
7909             } for
7910             
7911             %% dessin de la ligne
7912             lignedeniveau length 4 ge {
7913                solid i solidisinface {
7914                   pointilles 
7915                } if
7916                lignedeniveau ligne3d
7917             } if
7918          grestore
7919       } for         
7920    } if
7921       
7922 end
7923 } def
7924
7925 /drawsolid* {
7926 1 dict begin
7927    /startest {true} def
7928    drawsolid
7929 end
7930 } def
7931
7932 /peintrealgorithme false def
7933
7934 /drawsolid** {
7935 2 dict begin
7936    /aretescachees false def
7937    /peintrealgorithme true def
7938    drawsolid*
7939 end
7940 } def
7941
7942 %% syntaxe : solid array drawsolid
7943 %% array est en option, il indique les faces triees
7944 /drawsolid {
7945 8 dict begin
7946    dup issolid not {
7947       /ordre exch def
7948    } if
7949    /solid exch def
7950    solid issolid not {
7951       (Error : mauvais type d argument dans drawsolid) ==
7952       quit
7953    } if
7954    solid nullsolid not {
7955       solid solidgetfaces
7956       /F exch def
7957       solid solidgetsommets
7958       /S exch def
7959       /n S length 3 idiv def
7960
7961       currentdict /ordre known not {
7962          peintrealgorithme {
7963             %% tri des indices des faces par distance decroissante
7964             [
7965                0 1 F length 1 sub {
7966                   /i exch def
7967                   solid i solidcentreface
7968                   GetCamPos
7969                   distance3d
7970                } for
7971             ] doublequicksort pop reverse
7972          } {
7973             [
7974                0 1 F length 1 sub {
7975                } for
7976             ]
7977          } ifelse
7978          /ordre exch def
7979       } if
7980
7981       0 1 F length 1 sub {
7982          /k exch def
7983          /i ordre k get def
7984          gsave
7985             solid i solidfacevisible? {
7986                solid i dessinefacevisible
7987             } if
7988          grestore
7989       } for
7990       aretescachees {
7991          0 1 F length 1 sub {
7992             /k exch def
7993             /i ordre k get def
7994             gsave
7995                solid i solidfacevisible? not {
7996                   solid i dessinefacecachee
7997                } if 
7998             grestore
7999          } for
8000       } if
8001
8002 %%       %% si on veut repasser les traits des faces visibles
8003 %%       0 1 F length 1 sub {
8004 %%          /k exch def
8005 %%          /i ordre k get def
8006 %%          gsave
8007 %%          1 dict begin
8008 %%             /startest false def
8009 %%             solid i solidfacevisible? {
8010 %%             solid i dessinefacevisible
8011 %%             } if
8012 %%          end
8013 %%          grestore
8014 %%       } for
8015    } if
8016 end
8017 } def
8018
8019 %%%%% ### segment_inter_planz ###
8020 %% syntaxe : A B k segment_inter_planz --> array true ou false
8021 /segment_inter_planz {
8022 4 dict begin
8023    /k exch def
8024    /B defpoint3d
8025    /A defpoint3d
8026    A /zA exch def pop pop
8027    B /zB exch def pop pop
8028    zA k sub zB k sub mul dup 0 gt {
8029       %% pas d intersection
8030       pop
8031       false
8032    } {
8033       0 eq {
8034          %% intersection en A ou en B
8035          [ 
8036             zA k eq {A} if
8037             zB k eq {B} if
8038          ] true
8039       } {
8040          %% intersection entre A et B
8041          [
8042             A B vecteur3d
8043             k zA sub zB zA sub div mulv3d
8044             A addv3d
8045          ] true
8046       } ifelse
8047    } ifelse
8048 end
8049 } def
8050
8051 %%%%% ### fin insertion ###
8052
8053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8054 %%%%                  plans affines                     %%%%
8055 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8056
8057 %%%%% ### planaffine ###
8058 %% plan : origine, base, range, ngrid
8059 %% [0 0 0 [1 0 0 0 1 0] [-3 3 -2 2] [1. 1.] ]
8060
8061 /explan [0 0 0 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1. 1.] ] def
8062
8063 %% syntaxe : any isplan --> bool
8064 /isplan {
8065 1 dict begin
8066    /candidat exch def
8067    candidat isarray {
8068       candidat length 6 eq {
8069          candidat 3 get isarray {
8070             candidat 4 get isarray {
8071                candidat 5 get isarray              
8072             } {
8073                false
8074             } ifelse
8075          } {
8076             false
8077          } ifelse
8078       } {
8079          false
8080       } ifelse
8081    } {
8082       false
8083    } ifelse
8084 end
8085 } def
8086
8087 /newplanaffine {
8088    [0 0 0 [1 0 0 0 1 0] [-3 3 -2 2] [1 1]] 
8089 } def
8090
8091 /dupplan {
8092 4 dict begin
8093    /leplan exch def
8094    /result newplanaffine def
8095    result leplan plangetorigine planputorigine
8096    result leplan plangetbase planputbase
8097    result leplan plangetrange planputrange
8098    result leplan plangetngrid planputngrid
8099    result
8100 end
8101 } def
8102
8103 %% syntaxe : plantype getorigine --> x y z
8104 /plangetorigine {
8105 1 dict begin
8106    /plan exch def
8107    plan isplan not {
8108       (Erreur : mauvais type d argument dans plangetorigine) ==
8109       Error
8110    } if
8111    plan 0 get 
8112    plan 1 get 
8113    plan 2 get 
8114 end
8115 } def
8116
8117 %% syntaxe : plantype getbase --> [u v w]
8118 %% ou u, v et w vecteurs de R^3
8119 /plangetbase {
8120 1 dict begin
8121    /plan exch def
8122    plan isplan not {
8123       (Erreur : mauvais type d argument dans plangetbase) ==
8124       Error
8125    } if
8126    plan 3 get 
8127 end
8128 } def
8129
8130 %% syntaxe : plantype getrange --> array
8131 %% ou array = [xmin xmax ymin ymax]
8132 /plangetrange {
8133 1 dict begin
8134    /plan exch def
8135    plan isplan not {
8136       (Erreur : mauvais type d argument dans plangetrange) ==
8137       Error
8138    } if
8139    plan 4 get 
8140 end
8141 } def
8142
8143 %% syntaxe : plantype getngrid --> array
8144 %% ou array = [n1 n2]
8145 /plangetngrid {
8146 1 dict begin
8147    /plan exch def
8148    plan isplan not {
8149       (Erreur : mauvais type d argument dans plangetngrid) ==
8150       Error
8151    } if
8152    plan 5 get 
8153 end
8154 } def
8155
8156 %% ===================
8157
8158 %% syntaxe : plantype x y z putorigine --> -
8159 /planputorigine {
8160 4 dict begin
8161    /z exch def
8162    /y exch def
8163    /x exch def
8164    /plan exch def
8165    plan isplan not {
8166       (Erreur : mauvais type d argument dans planputorigine) ==
8167       Error
8168    } if
8169    plan 0 x put 
8170    plan 1 y put 
8171    plan 2 z put 
8172 end
8173 } def
8174
8175 %% syntaxe : plantype [u v w] putbase --> -
8176 %% ou u, v et w vecteurs de R^3
8177 /planputbase {
8178 2 dict begin
8179    /base exch def
8180    /plan exch def
8181    plan isplan not {
8182       (Erreur : mauvais type d argument dans planputbase) ==
8183       Error
8184    } if
8185    plan 3 base put 
8186 end
8187 } def
8188
8189 %% syntaxe : plantype array putrange --> -
8190 %% ou array = [xmin xmax ymin ymax]
8191 /planputrange {
8192 2 dict begin
8193    /table exch def
8194    /plan exch def
8195    plan isplan not {
8196       (Erreur : mauvais type d argument dans planputrange) ==
8197       Error
8198    } if
8199    plan 4 table put 
8200 end
8201 } def
8202
8203 %% syntaxe : plantype array putngrid --> -
8204 %% ou array = [n1 n2]
8205 /planputngrid {
8206 2 dict begin
8207    /table exch def
8208    /plan exch def
8209    plan isplan not {
8210       (Erreur : mauvais type d argument dans planputngrid) ==
8211       quit
8212    } if
8213    plan 5 table put 
8214 end
8215 } def
8216
8217 %% -3 3 -2 2 1. 1. newgrille
8218 %% drawsolid
8219
8220 %orange
8221
8222 %% plan : origine, base, range, ngrid
8223
8224 %% syntaxe : plantype drawplanaffine --> -
8225 /drawplanaffine {
8226 5 dict begin
8227    /plan exch def
8228    plan plangetbase 
8229    aload pop
8230    /imK defpoint3d
8231    /imJ defpoint3d
8232    /imI defpoint3d
8233    newpath
8234       plan plangetrange plan plangetngrid aload pop  quadrillagexOy_
8235       plan plangetorigine [imI imK] false planprojpath
8236    Stroke
8237 end
8238 } def
8239
8240
8241 %% %% syntaxe : [a b c d] (x0 y0 z0) alpha defeqplanaffine --> plantype
8242 %% %% plan defini par l equation ax+by+cz+d=0, 
8243 %% %% rotation de alpha autour de la normale (alpha est optionnel)
8244 %% %% origine (x0, y0, z0). l origine est optionnelle
8245 %% /defeqplanaffine {
8246 %% 5 dict begin
8247 %%    dup isarray {
8248 %%       /alpha 0 def
8249 %%    } {
8250 %%       dup isstring {
8251 %%          /alpha 0 def
8252 %%       } {
8253 %%          /alpha exch def
8254 %%       } ifelse
8255 %%    } ifelse
8256 %%    dup isstring {
8257 %%       cvx /origine exch def
8258 %%    } if
8259 %%    /table exch def
8260 %%    table length 4 ne {
8261 %%       (Erreur : mauvais type d argument dans defeqplanaffine) ==
8262 %%       Error
8263 %%    } if
8264 %%    table 0 get /a exch def
8265 %%    table 1 get /b exch def
8266 %%    table 2 get /c exch def
8267 %%    table 3 get /d exch def
8268 %%    /resultat newplanaffine def
8269 %%    [a b c alpha] normalvect_to_orthobase
8270 %%    /imK defpoint3d
8271 %%    /imJ defpoint3d
8272 %%    /imI defpoint3d
8273 %%    resultat [imI imJ imK] planputbase
8274 %%    currentdict /origine known {
8275 %%       origine /z exch def /y exch def /x exch def
8276 %%       a x mul b y mul add c z mul add d add 0 ne {
8277 %%          (Erreur : mauvaise origine dans defeqplanaffine) ==
8278 %%          Error
8279 %%       } if
8280 %%       resultat origine planputorigine
8281 %%    } {
8282 %%       c 0 ne {
8283 %%          resultat 0 0 d neg c div planputorigine
8284 %%       } {
8285 %%          a 0 ne {
8286 %%             resultat d neg a div 0 0 planputorigine
8287 %%          } {
8288 %%             resultat 0 d neg b div 0 planputorigine
8289 %%          } ifelse
8290 %%       } ifelse
8291 %%    } ifelse
8292 %%    resultat
8293 %% end
8294 %% } def
8295
8296 %% /explan [0 0 0 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1 1] ] def
8297 %% explan drawplanaffine
8298 %% noir
8299 %% /explan [0 0 2 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1 .5] ] def
8300 %% explan drawplanaffine
8301
8302 %% orange
8303 %% [0 0 1 -2] defeqplanaffine
8304 %% drawplanaffine
8305 %% noir
8306 %% [0 0 1 0] defeqplanaffine
8307 %% drawplanaffine
8308 %% bleu
8309 %% [1 1 1 0] (1 -1 0) defeqplanaffine
8310 %% drawplanaffine
8311 %% 
8312
8313 /dessinebase {
8314 4 dict begin
8315 gsave
8316    /V3 defpoint3d
8317    /V2 defpoint3d
8318    /V1 defpoint3d
8319    /M0 defpoint3d
8320    rouge
8321    V3 newvecteur 
8322    {M0 translatepoint3d} solidtransform
8323    drawsolid**
8324    bleu
8325    V2 newvecteur 
8326    {M0 translatepoint3d} solidtransform
8327    drawsolid**
8328    orange
8329    V1 newvecteur 
8330    {M0 translatepoint3d} solidtransform
8331    drawsolid**
8332 grestore
8333 end
8334 } def
8335
8336 %% syntaxe : solid i solidface2eqplan --> [a b c d]
8337 %% equation cartesienne de la face d'indice i du solide solid
8338 /solidface2eqplan {
8339 8 dict begin
8340    /i exch def
8341    /solid exch def
8342    solid i solidnormaleface
8343    /c exch def
8344    /b exch def
8345    /a exch def
8346    solid 0 i solidgetsommetface
8347    /z exch def
8348    /y exch def
8349    /x exch def
8350    [a b c a x mul b y mul add c z mul add neg]
8351 end
8352 } def
8353
8354
8355 %% syntaxe : plantype newplan --> solid
8356 /newplan {
8357 5 dict begin
8358    /lepl@n exch def
8359    lepl@n plangetbase /@base exch def
8360    @base 0 getp3d /@U defpoint3d
8361    @base 1 getp3d /@V defpoint3d
8362    lepl@n plangetorigine /@M defpoint3d
8363    lepl@n plangetrange /@range exch def
8364    lepl@n plangetngrid /@ngrid exch def
8365    /@F {
8366    2 dict begin
8367       /@y exch def
8368       /@x exch def
8369       @U @x mulv3d
8370       @V @y mulv3d
8371       addv3d
8372       @M addv3d
8373    end
8374    } def
8375    @range aload pop @ngrid {@F} newsurfaceparametree
8376 end
8377 } def
8378
8379 %% syntaxe : M eqplan --> real
8380 %% image de M par la fonction definie par l equation eqplan
8381 /pointeqplan {
8382 8 dict begin
8383    /eqplan exch def
8384    /@z exch def
8385    /@y exch def
8386    /@x exch def
8387    /@a eqplan 0 get def
8388    /@b eqplan 1 get def
8389    /@c eqplan 2 get def
8390    /@d eqplan 3 get def
8391    @a @x mul @b @y mul add @c @z mul add @d add
8392 end
8393 } def
8394
8395 /plan2eq {
8396 6 dict begin
8397    /leplan exch def
8398    leplan plangetbase aload pop vectprod3d
8399    /c exch def
8400    /b exch def
8401    /a exch def
8402    leplan plangetorigine
8403    /z0 exch def
8404    /y0 exch def
8405    /x0 exch def
8406    [a b c a x0 mul b y0 mul add c z0 mul add neg]
8407 end
8408 } def
8409
8410 %% syntaxe : [a b c d] (x0 y0 z0) alpha defeqplanaffine --> plantype
8411 %% plan defini par l equation ax+by+cz+d=0, 
8412 %% rotation de alpha autour de la normale (alpha est optionnel)
8413 %% origine (x0, y0, z0). l origine est optionnelle
8414 /eq2plan {
8415 5 dict begin
8416    dup isarray {
8417       /alpha 0 def
8418    } {
8419       dup isstring {
8420          /alpha 0 def
8421       } {
8422          /alpha exch def
8423       } ifelse
8424    } ifelse
8425    dup isstring {
8426       cvx /origine exch def
8427    } if
8428    /table exch def
8429    table length 4 ne {
8430       (Erreur : mauvais type d argument dans eq2plan) ==
8431       quit
8432    } if
8433    table 0 get /a exch def
8434    table 1 get /b exch def
8435    table 2 get /c exch def
8436    table 3 get /d exch def
8437    /resultat newplanaffine def
8438    [a b c alpha] normalvect_to_orthobase
8439    /imK defpoint3d
8440    /imJ defpoint3d
8441    /imI defpoint3d
8442    resultat [imI imJ] planputbase
8443    currentdict /origine known {
8444       origine /z exch def /y exch def /x exch def
8445       a x mul b y mul add c z mul add d add 0 ne {
8446          (Erreur : mauvaise origine dans eq2plan) ==
8447          quit
8448       } if
8449       resultat origine planputorigine
8450    } {
8451       c 0 ne {
8452          resultat 0 0 d neg c div planputorigine
8453       } {
8454          a 0 ne {
8455             resultat d neg a div 0 0 planputorigine
8456          } {
8457             b 0 ne {
8458                resultat 0 d neg b div 0 planputorigine
8459             } {
8460                (Error dans eq2plan : (a,b,c) = (0,0,0)) ==
8461             } ifelse
8462          } ifelse
8463       } ifelse
8464    } ifelse
8465    resultat
8466 end
8467 } def
8468
8469 /points2eqplan {
8470 10 dict begin
8471    /C defpoint3d
8472    /B defpoint3d
8473    /A defpoint3d
8474    A B vecteur3d
8475    A C vecteur3d
8476    vectprod3d
8477    normalize3d
8478    /c exch def
8479    /b exch def
8480    /a exch def
8481    A
8482    /zA exch def
8483    /yA exch def
8484    /xA exch def
8485    [a b c a xA mul b yA mul add c zA mul add neg]
8486 end
8487 } def
8488
8489 %% /monplan 
8490 %% %[0 0 -2 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1. 1.]]
8491 %% [0 0 1 1] 30 eq2plan
8492 %% def
8493 %% 
8494 %% [0 0 1 -2] eq2plan newplan
8495 %% dup (blanc) outputcolors
8496 %% monplan newplan
8497 %% dup (blanc) outputcolors
8498 %% solidfuz
8499 %% drawsolid**
8500 %% monplan plangetorigine
8501 %% monplan plangetbase aload pop dessinebase
8502
8503 %% syntaxe : x0 y0 z0 [normalvect] norm2plan
8504 /norm2plan {
8505 9 dict begin
8506    normalvect_to_orthobase
8507    /imK defpoint3d
8508    /imJ defpoint3d
8509    /imI defpoint3d
8510    imK
8511    /c exch def
8512    /b exch def
8513    /a exch def
8514    /z0 exch def
8515    /y0 exch def
8516    /x0 exch def
8517    [a b c a x0 mul b y0 mul add c z0 mul add neg] eq2plan
8518    dup x0 y0 z0 planputorigine
8519    dup [imI imJ] planputbase
8520 end
8521 } def
8522
8523 %% syntaxe : plantype planxmarks
8524 /planxmarks {
8525 5 dict begin
8526    dup isbool {
8527       /mybool exch def
8528    } {
8529       /mybool true def
8530    } ifelse
8531    /leplan exch def
8532    leplan plangetrange aload pop
8533    /ymax exch def
8534    /ymin exch def
8535    /xmax exch def
8536    /xmin exch def
8537    newpath
8538       xmin truncate cvi 0 smoveto
8539       xmax truncate cvi 0 slineto
8540       leplan mybool projpath
8541    Stroke
8542    xmin truncate cvi xmkstep xmax truncate cvi {
8543       dup 0 ne {
8544          /x exch def
8545          x
8546          x x truncate eq {
8547             cvi
8548          } if
8549          dup chaine cvs exch 0 leplan mybool dctextp3d
8550          newpath
8551             x 0 smoveto
8552             0 2.5 rmoveto
8553             0 -5 rlineto
8554             leplan mybool projpath
8555          Stroke
8556       } {
8557          pop (0) 0 0 leplan mybool dltextp3d 
8558       } ifelse
8559    } for
8560 end
8561 } def
8562
8563 %% syntaxe : plantype planymarks
8564 /planymarks {
8565 5 dict begin
8566    dup isbool {
8567       /mybool exch def
8568    } {
8569       /mybool true def
8570    } ifelse
8571    /leplan exch def
8572    leplan plangetrange aload pop
8573    /ymax exch def
8574    /ymin exch def
8575    /xmax exch def
8576    /xmin exch def
8577    newpath
8578       0 ymin truncate cvi smoveto
8579       0 ymax truncate cvi slineto
8580       leplan mybool projpath
8581    Stroke
8582    ymin truncate cvi ymkstep ymax truncate cvi {
8583       dup 0 ne {
8584          /y exch def
8585          y
8586          y y truncate eq {
8587              cvi
8588          } if
8589          dup chaine cvs exch 0 exch leplan mybool cltextp3d
8590          newpath
8591             0 y smoveto
8592             2.5 0 rmoveto
8593             -5 0 rlineto
8594             leplan mybool projpath
8595          Stroke
8596       } {
8597          pop (0) 0 0 leplan mybool dltextp3d 
8598       } ifelse
8599    } for
8600 end
8601 } def
8602
8603 %% syntaxe : plantype planmarks
8604 /planmarks {
8605 1 dict begin
8606     dup isbool {
8607       /mybool exch def
8608    } {
8609       /mybool true def
8610    } ifelse
8611    dup mybool planxmarks mybool planymarks
8612 end
8613 } def
8614
8615 %% bleu
8616 %% [-3 3 -2 2] quadrillagexOy_
8617 %% Stroke
8618 %% noir
8619
8620 %% syntaxe : [xmin xmax ymin ymax] dx dy quadrillagexOy_
8621 /quadrillagexOy_ {
8622 4 dict begin
8623    dup isarray {
8624       /dx 1 def
8625       /dy 1 def
8626    } {
8627       /dy exch def
8628       dup isarray {
8629          /dx dy def
8630       } {
8631          /dx exch def
8632       } ifelse
8633    } ifelse
8634    /table exch def
8635    table 0 get /xmin exch def
8636    table 1 get /xmax exch def
8637    table 2 get /ymin exch def
8638    table 3 get /ymax exch def
8639    ymin dy ymax {
8640       /y exch def
8641       xmin y smoveto
8642       xmax y slineto
8643    } for
8644    xmin dx xmax {
8645       /x exch def
8646       x ymin smoveto
8647       x ymax slineto
8648    } for
8649 end
8650 } def
8651
8652 %% syntaxe : plan [ngrid] planquadrillage
8653 /planquadrillage {
8654 4 dict begin
8655    dup isbool {
8656       /mybool exch def
8657    } {
8658       /mybool true def
8659    } ifelse
8660    dup isplan {
8661       /ngrid [1 1] def
8662    } {
8663       /ngrid exch def
8664    } ifelse
8665    /leplan exch def
8666    /dx ngrid 0 get def
8667    /dy ngrid 1 get def
8668    /table leplan plangetrange def
8669    table 0 get cvi truncate /xmin exch def
8670    table 1 get cvi truncate /xmax exch def
8671    table 2 get cvi truncate /ymin exch def
8672    table 3 get cvi truncate /ymax exch def
8673    newpath
8674       ymin dy ymax {
8675          /y exch def
8676          xmin y smoveto
8677          xmax y slineto
8678       } for
8679       xmin dx xmax {
8680          /x exch def
8681          x ymin smoveto
8682          x ymax slineto
8683       } for
8684       leplan mybool projpath
8685    Stroke
8686 end
8687 } def
8688
8689 %% syntaxe : plantype str1 str2 planshowbase -> - 
8690 %% syntaxe : plantype str2 planshowbase -> - 
8691 %% syntaxe : plantype planshowbase -> - 
8692 /planshowbase {
8693 3 dict begin
8694    dup isbool {
8695       /mybool exch def
8696    } {
8697       /mybool true def
8698    } ifelse
8699    dup isstring {
8700       /couleur2 exch def
8701       dup isstring {
8702          /couleur1 exch def
8703       } {
8704          /couleur1 (rouge) def
8705       } ifelse
8706    } {
8707       /couleur1 (rouge) def
8708       /couleur2 (vert) def
8709    } ifelse
8710    mybool bprojscene
8711       couleur1 cvx exec
8712       newpath
8713          0 0 smoveto
8714          1 0 slineto
8715       Stroke
8716       0 0 1 0 oldarrow
8717       couleur2 cvx exec
8718       newpath
8719          0 0 smoveto
8720          0 1 slineto
8721       Stroke
8722       0 0 0 1 oldarrow
8723    eprojscene
8724 end
8725 } def
8726
8727 %% syntaxe : plantype str1 str2 str3 planshowbase3d -> - 
8728 %% syntaxe : plantype str2 str3 planshowbase3d -> - 
8729 %% syntaxe : plantype str3 planshowbase3d -> - 
8730 %% syntaxe : plantype planshowbase3d -> - 
8731 %% syntaxe : plantype str1 str2 str3 array planshowbase3d -> - 
8732 %% syntaxe : plantype str2 str3 array planshowbase3d -> - 
8733 %% syntaxe : plantype str3 array planshowbase3d -> - 
8734 %% syntaxe : plantype array planshowbase3d -> - 
8735 /planshowbase3d {
8736 7 dict begin
8737    dup isbool {
8738       /mybool exch def
8739    } {
8740       /mybool true def
8741    } ifelse
8742    dup dup isarray exch isplan not and {
8743       /table exch def
8744    } {
8745       /table {} def
8746    } ifelse
8747    dup isstring {
8748       /couleur3 exch def
8749       dup isstring {
8750          /couleur2 exch def
8751          dup isstring {
8752             /couleur1 exch def
8753          } {
8754             /couleur1 (rouge) def
8755          } ifelse
8756       } {
8757          /couleur2 (vert) def
8758          /couleur1 (rouge) def
8759       } ifelse
8760    } {
8761       /couleur1 (rouge) def
8762       /couleur2 (vert) def
8763       /couleur3 (bleu) def
8764    } ifelse
8765    /plan exch def
8766    plan couleur1 couleur2 mybool planshowbase
8767    plan plangetorigine /I defpoint3d
8768    plan plangetbase
8769    dup 0 getp3d /u defpoint3d
8770    1 getp3d /v defpoint3d
8771    u v vectprod3d table newvecteur
8772    {I addv3d} solidtransform
8773    dup couleur3 solidputcolors
8774    solidgridOff
8775    drawsolid**
8776 end
8777 } def
8778
8779 %% syntaxe : plantype x y z plantranslate --> -
8780 /plantranslate {
8781 4 dict begin
8782    /M defpoint3d
8783    /plan exch def
8784    plan isplan not {
8785       (Erreur : mauvais type d argument dans plantranslate) ==
8786       quit
8787    } if
8788    plan plan plangetorigine M addv3d planputorigine
8789 end
8790 } def
8791
8792 % syntaxe : alpha_x alpha_y alpha_z rotateOpplan --> -
8793 /rotateOplan {
8794 4 dict begin
8795    /Rxyz defpoint3d
8796    /plan exch def
8797    plan isplan not {
8798       (Erreur : mauvais type d argument dans rotateOplan) ==
8799       quit
8800    } if
8801    plan plan plangetorigine Rxyz rotateOpoint3d planputorigine
8802
8803    plan plangetbase 0 getp3d /U defpoint3d
8804    plan plangetbase 1 getp3d /V defpoint3d
8805    plan [
8806       U Rxyz rotateOpoint3d
8807       V Rxyz rotateOpoint3d
8808    ] planputbase
8809 end
8810 } def
8811
8812 %% syntaxe : plantype phi rotateplan --> -
8813 /rotateplan {
8814 5 dict begin
8815    /phi exch def
8816    /leplan exch def
8817    leplan plangetbase 0 getp3d /U defpoint3d
8818    leplan plangetbase 1 getp3d /V defpoint3d
8819    U phi cos mulv3d
8820    V phi sin mulv3d addv3d /U0 defpoint3d
8821    U phi sin neg mulv3d
8822    V phi cos mulv3d addv3d /V0 defpoint3d
8823    leplan [U0 V0] planputbase
8824 end
8825 } def
8826
8827 %% syntaxe : solid i solidface2plan --> plantype
8828 %% syntaxe : solid i I solidface2plan --> plantype
8829 /solidface2plan {
8830 5 dict begin
8831    2 copy pop issolid {
8832       /i exch def
8833       /solid exch def
8834       solid i solidcentreface /I defpoint3d
8835    } {
8836       /I defpoint3d
8837       /i exch def
8838       /solid exch def
8839    } ifelse
8840    /result newplanaffine def
8841    solid i solidcentreface /G defpoint3d
8842    solid i solidnormaleface /K defpoint3d
8843    solid 0 i solidgetsommetface
8844    solid 1 i solidgetsommetface
8845    milieu3d /A defpoint3d
8846    G A vecteur3d normalize3d /U defpoint3d
8847    K U vectprod3d /V defpoint3d
8848    result [U V] planputbase
8849    result I planputorigine
8850    result
8851 end
8852 } def
8853
8854 %%%%% ### fin insertion ###
8855 %% syntaxe : x y plantype pointplan --> X Y Z
8856 /pointplan {
8857 5 dict begin
8858    /leplan exch def
8859    /y exch def
8860    /x exch def
8861    leplan plangetbase 0 getp3d /U defpoint3d
8862    leplan plangetbase 1 getp3d /V defpoint3d
8863    U x mulv3d V y mulv3d addv3d
8864 end
8865 } def
8866
8867 %%%%% ### fin insertion ###
8868
8869
8870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8871 %%%%     operations sur des solides particuliers        %%%%
8872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8873
8874 /piedist {
8875 4 dict begin
8876    /mypie exch def
8877    mypie 0 solidgetface length /n exch def
8878    mypie n 2 idiv solidgetsommet /A defpoint3d
8879    mypie n 2 idiv 1 add solidgetsommet /B defpoint3d
8880    A B milieu3d GetCamPos distance3d
8881 end
8882 } def
8883
8884 /sortpieset {
8885 5 dict begin
8886    dup issolid {
8887       ]
8888    } if
8889    /table exch def
8890    [
8891       0 1 table length 1 sub {
8892          /i exch def
8893          table i get piedist
8894       } for
8895    ]
8896    doublequicksort pop reverse
8897    /result exch def
8898    [
8899       0 1 result length 1 sub {
8900          /i exch def
8901          table result i get get 
8902       } for
8903    ]
8904 end
8905 } def
8906
8907 /drawpieset {
8908 1 dict begin
8909    /startest true def
8910    sortpieset dup {drawsolid**} apply {0 dessinefacevisible} apply
8911 end
8912 } def
8913
8914 %%%%% ### solidchanfreine ###
8915 %% syntaxe : solid coeff solidchanfreine --> solid
8916 /solidchanfreine {
8917 10 dict begin
8918    /coeff exch def
8919    /solid exch def
8920    /result newsolid def
8921    solid issolid not {
8922       (Erreur : mauvais type d argument dans solidchanfreine) ==
8923       quit
8924    } if
8925    /n solid solidnombresommets def
8926    /nf solid solidnombrefaces def
8927
8928    %% ajout des faces reduites
8929    0 1 nf 1 sub {
8930       /i exch def
8931       /Fsommets solid i solidgetsommetsface def
8932       /Findex solid i solidgetface def
8933       /ns Fsommets length 3 idiv def
8934       /couleurfaceorigine solid i solidgetfcolor def
8935       Fsommets isobarycentre3d /G defpoint3d
8936       %% on ajoute les nouveaux sommets
8937       /Sindex [] def
8938       0 1 ns 1 sub {
8939          /j exch def
8940          /Sindex [ Sindex aload pop
8941             Fsommets j getp3d /M defpoint3d
8942             result M G coeff hompoint3d solidaddsommet
8943          ] store
8944       } for
8945       %% Sindex contient les indices des nouveaux sommets
8946       result Sindex couleurfaceorigine solidaddface
8947    } for
8948
8949    %% ajout des faces rectangulaires entre faces d'origines adjacentes
8950    %% pour chaque face de depart
8951    0 1 nf 2 sub {
8952       /i exch def
8953       /F solid i solidgetface def
8954       /couleurfaceorigine solid i solidgetfcolor def
8955       /Fres result i solidgetface def
8956       %% pour chaque arete de la face
8957       0 1 F length 1 sub {
8958          /j exch def
8959          /trouve false def
8960          /indice1 F j get def
8961          /indice2 F j 1 add F length mod get def
8962          /a1 j def
8963          /a2 j 1  add F length mod def
8964          %% on regarde toutes les autres faces
8965          i 1 add 1 nf 1 sub {
8966             /k exch def
8967             /Ftest solid k solidgetface def
8968             indice1 Ftest in {pop true} {false} ifelse
8969             indice2 Ftest in {pop true} {false} ifelse
8970             and {
8971                /indiceFadj k def
8972                indice1 Ftest in pop /k1 exch def
8973                indice2 Ftest in pop /k2 exch def
8974                /trouve true def
8975             exit
8976             } if
8977          } for
8978          trouve {
8979             /Fadj solid indiceFadj solidgetface def
8980             result [
8981                Fres a1 get
8982                result indiceFadj solidgetface k1 get
8983                result indiceFadj solidgetface k2 get
8984                Fres a2 get
8985             ] couleurfaceorigine solidaddface
8986          } if
8987       } for
8988    } for
8989
8990    %% pour chaque face
8991    0 1 nf 2 sub {
8992       /i exch def
8993       /F solid i solidgetface def
8994       /couleurfaceorigine solid i solidgetfcolor def
8995       %% et pour chaque sommet de cette face
8996       0 1 F length 1 sub {
8997          /j exch def
8998          /k F j get def
8999          solid k solidfacesadjsommet /adj exch def
9000          %% adj est le tableau des indices des faces adjacentes
9001          %% au sommet d'indice k
9002          %% rque : toutes les faces d'indice strict inferieur a i
9003          %% sont deja traitees
9004          %% Pour chaque face adjacente, on repere l'indice du sommet concerne dans
9005          %% la face
9006          adj min i lt not {
9007             /indadj [] def
9008             0 1 adj length 1 sub {
9009                /m exch def
9010                k solid adj m get solidgetface in {
9011                   /ok exch def
9012                   /indadj [indadj aload pop ok] store
9013                } if
9014             } for
9015          
9016             /aajouter [
9017                0 1 adj length 1 sub {
9018                   /m exch def
9019                   result adj m get solidgetface indadj m get get
9020                } for
9021             ] def
9022
9023             %% la table des sommets
9024             [0 1 aajouter length 1 sub {
9025                /m exch def
9026                result aajouter m get solidgetsommet
9027             } for]
9028             solid k solidgetsommet %% le point indiquant la direction de la normale
9029             ordonnepoints3d
9030             /indicestries exch def
9031
9032             result [
9033                0 1 indicestries length 1 sub {
9034                   /m exch def
9035                   aajouter indicestries m get get
9036                } for
9037             ] couleurfaceorigine solidaddface
9038          } if
9039       } for
9040    } for
9041
9042    result
9043 end
9044 } def
9045
9046 %%%%% ### solidplansection ###
9047 %% syntaxe : M eqplan --> real
9048 %% image de M par la fonction definie par l equation eqplan
9049 /pointeqplan {
9050 8 dict begin
9051    /@qplan exch def
9052    /@z exch def
9053    /@y exch def
9054    /@x exch def
9055    /@a @qplan 0 get def
9056    /@b @qplan 1 get def
9057    /@c @qplan 2 get def
9058    /@d @qplan 3 get def
9059    @a @x mul @b @y mul add @c @z mul add @d add 
9060 end
9061 } def
9062
9063 %% syntaxe : A B eqplan segment_inter_plan --> array true ou false
9064 %% array contient 1 point M si [AB] inter plan = {M}
9065 %% array contient les 2 points A et B si [AB] inter plan = [AB]
9066 /segment_inter_plan {
9067 4 dict begin
9068    dup isplan {plan2eq} if
9069    /plan exch def
9070    plan aload pop
9071    /d exch def
9072    /c exch def
9073    /b exch def
9074    /a exch def
9075    /B defpoint3d
9076    /A defpoint3d
9077    A 
9078    /zA exch def
9079    /yA exch def
9080    /xA exch def
9081    B 
9082    /zB exch def
9083    /yB exch def
9084    /xB exch def
9085    /imA a xA mul b yA mul add c zA mul add d add def
9086    /imB a xB mul b yB mul add c zB mul add d add def
9087    imA imB mul dup 0 gt {
9088       %% pas d intersection
9089       pop
9090       false
9091    } {
9092       0 eq {
9093          %% intersection en A ou en B
9094          [ 
9095             imA 0 eq {A} if 
9096             imB 0 eq {B} if 
9097          ] true
9098       } {
9099          %% intersection entre A et B
9100          /k 
9101             imA neg
9102             xB xA sub a mul
9103             yB yA sub b mul add
9104             zB zA sub c mul add
9105             dup 0 eq {
9106                (Error dans segment_inter_plan) ==
9107                quit
9108             } if
9109             div
9110          def
9111          [
9112             A B vecteur3d
9113             k mulv3d
9114             A addv3d
9115          ] true
9116       } ifelse
9117    } ifelse
9118 end
9119 } def
9120
9121 %% syntaxe : solid i solidface2eqplan --> [a b c d]
9122 %% equation cartesienne de la face d'indice i du solide solid
9123 /solidface2eqplan {
9124 8 dict begin
9125    /i exch def
9126    /solid exch def
9127    solid i solidnormaleface
9128    /c exch def
9129    /b exch def
9130    /a exch def
9131    solid 0 i solidgetsommetface
9132    /z exch def
9133    /y exch def
9134    /x exch def
9135    [a b c a x mul b y mul add c z mul add neg]
9136 end
9137 } def
9138
9139 %% syntaxe : array1 arrayrmdouble --> array2
9140 %% remplace 2 elts identiques consecutifs par 1 elt
9141 /arrayrmdouble {
9142 5 dict begin
9143    /table exch def
9144    /result [table 0 get] def
9145    /j 0 def
9146    1 1 table length 1 sub {
9147       /i exch def
9148       table i get
9149       result j get
9150       eq not {
9151          /result [result aload pop table i get] store
9152          /j j 1 add store
9153       } if
9154    } for
9155    result
9156 end
9157 } def
9158
9159 %% syntaxe : solid eqplan/plantype solidplansection --> solid2
9160 /solidplansection {
9161 10 dict begin
9162    dup isbool {
9163       /tr@nsmit exch def
9164    } {
9165       /tr@nsmit false def
9166    } ifelse
9167    dup isplan {
9168       plan2eqplan
9169       /eqplan exch def
9170    } {
9171       /eqplan exch def
9172    } ifelse
9173    dupsolid /result exch def
9174    /solid exch def
9175    /aenlever [] def
9176    /indnouveauxsommets [] def
9177    /nouvellesaretes [] def
9178
9179    %% pour chaque face d'indice i
9180    0 1 solid solidnombrefaces 1 sub {
9181       /i exch def
9182       /lacouleur solid i solidgetfcolor def
9183       /F solid i solidgetface def %% table des indices des sommets
9184       /n F length def %% nb d'aretes
9185       /k1 -1 def
9186       /k2 -1 def
9187       /k3 -1 def
9188       /k4 -1 def
9189       /k3a -3 def
9190       /k4a -3 def
9191       %% pour chaque arete [AB]
9192       0 1 n 1 sub {
9193          /j exch def
9194          %% arete testee : [j, j+1 mod n] (indices relatifs a la face i)
9195          solid j i solidgetsommetface /A defpoint3d
9196          solid j 1 add n mod i solidgetsommetface /B defpoint3d
9197          %% y a-t-il intersection
9198          A B eqplan segment_inter_plan {
9199             %% il y a intersection
9200             dup length 6 eq {
9201                %% l'intersection, c'est [AB]
9202                /k1 -1 def
9203                /k2 -1 def
9204                /k3 -1 def
9205                /k4 -1 def
9206                /k3a -1 def
9207                /k4a -1 def
9208                dup 0 getp3d /A defpoint3d
9209                1 getp3d /B defpoint3d
9210                result A solidaddsommet /a1 exch def
9211                result B solidaddsommet /a2 exch def
9212                /indnouveauxsommets [
9213                   indnouveauxsommets aload pop a1 a2
9214                ] store
9215                /nouvellesaretes [
9216                   [a1 a2]
9217                   nouvellesaretes aload pop
9218                ] store
9219                exit %% c est deja scinde
9220             } if
9221             %% il y a intersection <> [AB]
9222             k1 0 lt {
9223             %% 1ere intersection de la face
9224                /k1 j def %% sommet precedent intersection 1
9225                result exch aload pop solidaddsommet
9226                /k1a exch def %% sommet intersection 1
9227             } {
9228                k2 0 lt {
9229                %% 2eme intersection de la face
9230                   /k2 j def %% sommet precedent intersection 2
9231                   result exch aload pop solidaddsommet
9232                   /k2a exch def %% sommet intersection 2
9233                } {
9234                   k3 0 lt {
9235                   %% 3eme intersection de la face
9236                      /k3 j def %% sommet precedent intersection 3
9237                      result exch aload pop solidaddsommet
9238                      /k3a exch def %% sommet intersection 3
9239                   } {
9240                   %% 4eme intersection de la face
9241                      /k4 j def %% sommet precedent intersection 4
9242                      result exch aload pop solidaddsommet
9243                      /k4a exch def %% sommet intersection 4
9244                   } ifelse
9245                } ifelse
9246             } ifelse
9247          } if
9248       } for
9249       
9250       %% y a-t-il eu une coupe ?
9251       %% si oui, il faut scinder la face d'indice i en cours 
9252       k1 0 ge {
9253 %% (coupe) ==
9254 %% (n) == n ==
9255 %% k1 == k2 == k3 == k4 ==
9256 %% (a) ==
9257 %% k1a == k2a == k3a == k4a ==
9258          k1a k2a eq k3 0 lt and {
9259             %% 1 pt d'intersection
9260          } {
9261             %% il y a coupe, on cherche a eliminer les
9262             %% doublons dans {k1a, k2a, k3a, k4a}
9263             k1a k2a eq k3 0 ge and {
9264                %% 2 pts d'intersection
9265                /k2a k3a def
9266                /k2 k3 def
9267             } if
9268             k1a k3a eq k4 0 ge and {
9269                %% 2 pts d'intersection
9270                /k2a k4a def
9271                /k2 k4 def
9272             } if
9273             /nouvellesaretes [
9274                [k1a k2a]
9275                nouvellesaretes aload pop
9276             ] store
9277             [
9278                k1a F k1 1 add n mod get ne {
9279                   k1a
9280                } if
9281                k1 1 add n mod 1 k2 {F exch get} for
9282                k2a F k2 get ne {
9283                   k2a
9284                } if
9285             ]
9286             result exch lacouleur solidaddface
9287             /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store
9288             [
9289                k2a F k2 1 add n mod get ne {
9290                   k2a
9291                } if
9292                k2 1 add n ne {
9293                   k2 1 add n mod 1 n 1 sub {F exch get} for
9294                } if
9295                0 1 k1 {F exch get} for
9296                k1a F k1 get ne {
9297                   k1a
9298                } if
9299             ]
9300             result exch lacouleur solidaddface
9301             /aenlever [aenlever aload pop i] store
9302          } ifelse
9303       } if
9304    } for
9305    result aenlever solidrmfaces
9306
9307    nouvellesaretes separe_composantes
9308    /composantes exch def
9309
9310    %% pour chacune des composantes
9311    0 1 composantes length 1 sub {
9312       %% on oriente et on ajoute la face
9313       /icomp exch def
9314       %indnouveauxsommets bubblesort arrayrmdouble
9315       /indnouveauxsommets composantes icomp get def
9316       %% maintenant, on ajoute la face de plan de coupe
9317       /nouveauxsommets [
9318          0 1 indnouveauxsommets length 1 sub {
9319             /i exch def
9320             result indnouveauxsommets i get solidgetsommet
9321          } for
9322       ] def
9323    
9324       0 0 0 eqplan pointeqplan 0 eq {
9325          /ptref {0 1 1} def
9326       } {
9327          /ptref {0 0 0} def
9328       } ifelse
9329    
9330       %% restera a traiter le cas limite ou la nouvelle face existe deja
9331       %% tester si max(indicestries) < nb sommets avant section
9332       nouveauxsommets ptref ordonnepoints3d
9333       /indicestries exch def
9334       /nvelleface [
9335          0 1 indicestries length 1 sub {
9336             /m exch def
9337             indnouveauxsommets indicestries m get get
9338          } for
9339       ] def
9340       /F result solidgetfaces def
9341       /FC result solidgetfcolors def
9342       /IO result solidgetinouttable def
9343       /n1 IO 1 get def
9344       IO 1 n1 1 add put
9345       result IO solidputinouttable
9346       result [nvelleface F aload pop] solidputfaces
9347       result [lacouleur FC aload pop] solidputfcolors
9348    } for
9349    result
9350    tr@nsmit {
9351       composantes length 
9352    } if
9353 end    
9354 } def
9355
9356 %% syntaxe : elt array compteoccurences
9357 %% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ]
9358 /compteoccurences {
9359 5 dict begin
9360    /table exch def
9361    /elt exch def
9362    /n 0 def
9363    0 1 table length 1 sub {
9364       /i exch def
9365       elt table i get in {
9366          pop
9367          /n n 1 add store
9368       } if
9369    } for
9370    n
9371 end
9372 } def
9373
9374 /separe_composantes {
9375 10 dict begin
9376    /result [] def %% les composantes deja faites
9377    /table exch def %% ce qui reste a faire
9378
9379 %   (recu) == table {==} apply
9380    {
9381       /ext1 table 0 get 1 get def
9382       /ext0 table 0 get 0 get def
9383       /composante [] def
9384    
9385       { %% maintenant on suit les extremites et on epluche une composante
9386          /change false def
9387          /aenlever [] def
9388          0 1 table length 1 sub {
9389             /i exch def
9390             ext1 table i get In
9391             ext0 table i get In or {
9392                /aenlever [aenlever aload pop i] store
9393                /change true store
9394                %% l'arete i contient l'extremite ext0 ou ext1
9395                ext0 table i get in {
9396                   %% index = 0 ou 1
9397                   neg 1 add table i get exch get
9398                   /ext0 exch store
9399                   ext0 composante In not {
9400                      /composante [composante aload pop ext0] store
9401                   } if
9402                   %% on verifie que ext0 est legitime
9403                   ext0 table compteoccurences 2 gt {
9404                      /ext0 -1 store
9405                   } if
9406                } if
9407                ext1 table i get in {
9408                   %% index = 0 ou 1
9409                   neg 1 add table i get exch get
9410                   /ext1 exch store
9411                   ext1 composante In not {
9412                      /composante [composante aload pop ext1] store
9413                   } if
9414                   %% on verifie que ext1 est legitime
9415                   ext1 table compteoccurences 2 gt {
9416                      /ext1 -1 store
9417                   } if
9418                } if
9419             } if
9420          } for
9421          %% il faut reconstruire table
9422          /table [
9423             0 1 table length 1 sub {
9424                /i exch def
9425                i aenlever in {
9426                   pop
9427                } {
9428                   table i get
9429                } ifelse
9430             } for
9431          ] store
9432          change not {exit} if
9433       } loop
9434       %% on vient de finir une composante
9435       /result [result aload pop composante] store
9436       %% (nouvelle comp) == composante {==} apply
9437       table length 0 eq {exit} if
9438    } loop
9439    result
9440 %   (renvoie) == result {==} apply
9441 end
9442 } def
9443
9444 /solideqplansepare {solidplansepare} def
9445     
9446 %% syntaxe : solid eqplan/plantype solidplansepare --> solid1 solid2
9447 /solidplansepare {
9448 10 dict begin
9449    dup isplan {
9450       plan2eq
9451       /eqplan exch def
9452    } {
9453       /eqplan exch def
9454    } ifelse
9455    eqplan true solidplansection
9456    /nbcomposantes exch def
9457    /solid exch def
9458    /n solid solidnombrefaces def
9459
9460    /F [] def
9461    /FC [] def
9462    %% on retire les faces de coupe
9463    0 1 nbcomposantes 1 sub {
9464       /i exch def
9465       /F [F aload pop solid i solidgetface] store
9466       /FC [FC aload pop solid i solidgetfcolor] store
9467    } for
9468    solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces
9469    /n n nbcomposantes sub store
9470
9471    %% on separe les autres faces en 2 parties
9472    /lesneg [] def %% indices des faces "positives"
9473    /lespos [] def %% indices des faces negatives"
9474    0 1 n 1 sub {
9475       /i exch def
9476       solid i solidcentreface /G defpoint3d
9477       G eqplan pointeqplan dup 0 gt {
9478          pop
9479          /lespos [lespos aload pop i] store
9480       } {
9481          0 lt {
9482             /lesneg [lesneg aload pop i] store
9483          } {
9484 %           /lesneg [lesneg aload pop i] store
9485 %           /lespos [lespos aload pop i] store
9486          } ifelse
9487       } ifelse
9488    } for
9489    solid
9490    dupsolid dup lesneg solidrmfaces
9491    /result1 exch def
9492    dupsolid dup lespos solidrmfaces
9493    /result2 exch def
9494    pop
9495
9496    0 1 nbcomposantes 1 sub {
9497       /i exch def
9498       /facecoupe F i get def
9499       /couleurfacecoupe FC i get def
9500       /lesfaces1 result1 solidgetfaces def
9501       /lescouleurs1 result1 solidgetfcolors def
9502       /IO1 result1 solidgetinouttable def
9503       /lesfaces2 result2 solidgetfaces def
9504       /lescouleurs2 result2 solidgetfcolors def
9505       /IO2 result2 solidgetinouttable def
9506       %% on rajoute maintenant la face du plan de coupe
9507 %      result1 facecoupe couleurfacecoupe solidaddface
9508       result1 [facecoupe lesfaces1 aload pop] solidputfaces
9509       result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors
9510       result1 IO1 dup dup 1 get 1 add 1 exch put solidputinouttable
9511       %% et on verifie l'orientation
9512 %      result1 dup solidnombrefaces 1 sub solidnormaleface 
9513 %      result1 dup solidnombrefaces 1 sub solidcentreface addv3d
9514       result1 0 solidnormaleface 
9515       result1 0 solidcentreface addv3d
9516       eqplan pointeqplan 0 gt {
9517          %% l'orientation est mauvaise
9518          result1 0 solidrmface 
9519          result2 [facecoupe lesfaces2 aload pop] solidputfaces
9520          result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors
9521          result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable
9522          result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces
9523          result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors
9524          result1 dup solidgetinouttable dup dup 1 get 1 add 1 exch put solidputinouttable
9525       } {
9526          %% l'orientation est ok
9527          result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable
9528          result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces
9529          result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors
9530       } ifelse
9531    } for
9532    
9533    %% maintenant on enleve les sommets isoles
9534    /sommetspos [] def
9535    /sommetsneg [] def
9536    %% pour chaque face du cote negatif
9537    0 1 lesneg length 1 sub {
9538       lesneg exch get /i exch def
9539       /F solid i solidgetface def
9540       %% pour chaque sommet de cette face
9541       0 1 F length 1 sub {
9542          /j exch def
9543          /sommet F j get def
9544          %% si le sommet n'est pas encore note
9545          sommet sommetsneg in not {
9546             %% et s'il est isole, on peut l'enlever
9547             result1 sommet solidsommetsadjsommet length 0 eq {
9548                /sommetsneg [sommetsneg aload pop sommet] store
9549             } if
9550          } {
9551             pop
9552          } ifelse
9553       } for
9554    } for
9555    sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply
9556
9557    %% pour chaque face du cote positif
9558    0 1 lespos length 1 sub {
9559       lespos exch get /i exch def
9560       /F solid i solidgetface def
9561       %% pour chaque sommet de cette face
9562       0 1 F length 1 sub {
9563          /j exch def
9564          /sommet F j get def
9565          %% si le sommet n'est pas encore note
9566          sommet sommetspos in not {
9567             %% et s'il est isole, on peut l'enlever
9568             result2 sommet solidsommetsadjsommet length 0 eq {
9569                /sommetspos [sommetspos aload pop sommet] store
9570             } if
9571          } {
9572             pop
9573          } ifelse
9574       } for
9575    } for
9576    sommetspos bubblesort reverse {result2 exch solidrmsommet} apply
9577
9578    result1 result2
9579 end
9580 } def
9581
9582 %%%%% ### solidaffine ###
9583 %% syntaxe : solid coeff i solidaffine -> -
9584 %% syntaxe : solid coeff array solidaffine -> -
9585 %% syntaxe : solid coeff solidaffine -> -
9586 %% syntaxe : solid coeff str solidaffine -> -
9587 %% syntaxe : solid coeff bool solidaffine -> -
9588 /solidaffine {
9589 10 dict begin
9590    dup isbool {
9591       /rmfacecentrale exch def
9592    } {
9593       /rmfacecentrale true def
9594    } ifelse
9595    dup isstring {
9596       /couleurface exch def
9597    } if
9598    2 copy pop issolid {
9599       %% 2 arguments --> on affine tout
9600       2 copy pop solidnombrefaces /n exch def
9601       /table [n 1 sub -1 0 {} for] def 
9602    } {
9603       %% 1 tableau --> il donne les faces a enlever
9604       dup isarray {
9605          /table exch bubblesort reverse def
9606       } {
9607       %% 1 seule face a enlever
9608          [ exch ] /table exch def
9609       } ifelse
9610    } ifelse
9611    /coeff exch def
9612    /solid exch def
9613    0 1 table length 1 sub {
9614       /i exch def
9615       solid coeff table i get 
9616       currentdict /couleurface known {
9617          couleurface 
9618       } if
9619       rmfacecentrale s@lidaffineface
9620    } for
9621 end
9622 } def
9623
9624 %% syntaxe : solid coeff i s@lidaffineface
9625  /s@lidaffineface {
9626 10 dict begin
9627    /rmfacecentrale exch def
9628    dup isstring {
9629       /couleurface exch def
9630    } if
9631    /indice_a_chamfreiner exch def
9632    /i indice_a_chamfreiner def
9633    /coeff exch def
9634    /solid exch def
9635    solid issolid not {
9636       (Erreur : mauvais type d argument dans affine) ==
9637       quit
9638    } if
9639    /n solid solidnombresommets def
9640    /F solid i solidgetsommetsface def
9641    /Findex solid i solidgetface def
9642    /ni F length 3 idiv def
9643    /couleurfaceorigine solid i solidgetfcolor def
9644    F isobarycentre3d /G defpoint3d
9645    %% on ajoute les nouveaux sommets
9646    /Sindex [] def
9647    0 1 ni 1 sub {
9648       /j exch def
9649       /Sindex [ Sindex aload pop
9650          solid G F j getp3d vecteur3d coeff mulv3d G addv3d solidaddsommet
9651       ] store
9652    } for
9653    %% Sindex contient les indices des nouveaux sommets
9654    %% on prepare les faces a ajouter
9655    /facestoadd [] def
9656    /facestoadd [facestoadd aload pop
9657    0 1 ni 1 sub {
9658       /j exch def
9659       [Findex j get
9660       Findex j 1 add ni mod get
9661       Sindex j 1 add ni mod get
9662       Sindex j get]
9663    } for
9664    ] store
9665    0 1 ni 1 sub {
9666       /i exch def
9667       solid facestoadd i get solidaddface
9668    } for
9669    %% on enleve la face d origine
9670    solid indice_a_chamfreiner solidrmface
9671    %% on ajuste les couleurs des nouvelles faces
9672    /N solid solidnombrefaces def
9673    0 1 ni 1 sub {
9674       /i exch def
9675       solid N 1 sub i sub couleurfaceorigine solidputfcolor
9676    } for
9677    %% puis on ajoute eventuellement la face centrale
9678    rmfacecentrale not {
9679       solid
9680       [0 1 ni 1 sub {
9681          /j exch def
9682          Sindex j get
9683       } for]
9684       solidaddface
9685       %% en ajustant la couleur de cette derniere
9686       solid N
9687       currentdict /couleurface known {
9688             couleurface 
9689       } {
9690          couleurfaceorigine
9691       } ifelse
9692       solidputfcolor
9693    } if
9694 end
9695 } def
9696
9697 %%%%% ### solidtronque ###
9698 %% syntaxe : solid indicesommet k solidtronque --> solid
9699 %% syntaxe : solid array k solidtronque --> solid
9700 %% syntaxe : solid k solidtronque --> solid
9701 %% k entier > 0, array = tableau des indices des sommets
9702 /solidtronque {
9703 10 dict begin
9704    /coeff exch def
9705    dup issolid {
9706       dup solidnombresommets /N exch def
9707       /table [0 1 N 1 sub {} for] def
9708    } {
9709       dup isarray {
9710          /table exch def
9711       } {
9712          [ exch ] /table exch def
9713       } ifelse
9714    } ifelse
9715    /solid exch def
9716    solid dupsolid /result exch def pop
9717    /n solid solidnombrefaces def
9718    0 1 table length 1 sub {
9719       table exch get /no exch def
9720       result no solidgetsommet /sommetvise defpoint3d
9721       %% on recup les sommets adjacents au sommet vise
9722       /sommetsadj solid no solidsommetsadjsommet def
9723       %% on calcule les nouveaux sommets
9724       /nouveauxsommets [
9725          0 1 sommetsadj length 1 sub {
9726             /i exch def
9727             solid sommetsadj i get solidgetsommet
9728          } for
9729       ] {sommetvise exchp3d coeff ABpoint3d} papply3d def 
9730       %% on pose G = barycentre de ces points
9731       nouveauxsommets isobarycentre3d /G defpoint3d
9732       %% il faut ordonner ces sommets
9733       nouveauxsommets 0 getp3d /ptref defpoint3d
9734       G result no solidgetsommet vecteur3d /vecteurnormal defpoint3d
9735       %% on construit le tableau des angles ordonnes par rapport
9736       %% a la normale
9737       nouveauxsommets duparray exch pop
9738       {1 dict begin
9739          /M defpoint3d
9740          G ptref vecteur3d
9741          G M vecteur3d
9742          vecteurnormal angle3doriente
9743       end} papply3d
9744       doublebubblesort pop
9745       %% nos sommets sont tries
9746       /indicesommetstries exch def
9747       %% on rajoute les sommets au solide, et on note les nouveaux indices
9748       /nouveauxindices [
9749          0 1 nouveauxsommets length 3 idiv 1 sub {
9750             /k exch def
9751             result nouveauxsommets k getp3d solidaddsommet
9752          } for
9753       ] def
9754       %% on ajoute la face concernee
9755       result [
9756          0 1 indicesommetstries length 1 sub {
9757             /k exch def
9758          nouveauxindices indicesommetstries k get get
9759          } for 
9760       ] solidaddface
9761       result no solidfacesadjsommet /lesfaces exch def
9762       %% on examine la face d indice i, et on elimine le
9763       %% sommet vise
9764       0 1 lesfaces length 1 sub {
9765          /i exch def
9766          /j lesfaces i get def
9767          /F result j solidgetface def 
9768          result [
9769             0 1 F length 1 sub {
9770                /k exch def 
9771                F k get dup no eq {pop} if
9772             } for
9773          ] j exch solidputface 
9774       } for
9775    } for
9776    table bubblesort reverse {result exch solidrmsommet} apply
9777    result
9778 end
9779 } def
9780
9781 %%%%% ### dualpolyedre ###
9782 %% syntaxe : solid dualpolyedreregulier --> solid
9783 %% syntaxe : solid r dualpolyedreregulier --> solid
9784 %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r
9785 /dualpolyedreregulier {
9786 20 dict begin
9787    dup isnum {
9788       /r exch def
9789       /projection true def
9790    } {
9791       /projection false def
9792    } ifelse
9793    /solid exch def
9794    solid dupsolid /result exch def pop
9795    /n solid solidnombrefaces def
9796    /N solid solidnombresommets def
9797    /facesaenlever [] def
9798    %% pour chacun des sommets
9799    0 1 N 1 sub {
9800       %% sommet d indice i
9801       /i exch def
9802       %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i
9803       /indicesfacesadj solid i solidfacesadjsommet def
9804       %% on recupere les centres des faces concernees
9805       /nouveauxsommets [
9806          0 1 indicesfacesadj length 1 sub {
9807             /k exch def 
9808             solid indicesfacesadj k get solidgetsommetsface isobarycentre3d
9809          } for
9810       ] def
9811       %% et on pose G = barycentre de ces points
9812       nouveauxsommets isobarycentre3d /G defpoint3d
9813       %% il faut ordonner ces sommets
9814       nouveauxsommets 0 getp3d /ptref defpoint3d
9815       G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d
9816       nouveauxsommets duparray exch pop
9817       {1 dict begin
9818          /M defpoint3d
9819          G ptref vecteur3d
9820          G M vecteur3d
9821          vecteurnormal angle3doriente
9822       end} papply3d
9823       doublebubblesort pop
9824       %% nos sommets sont tries
9825       /indicesommetstries exch def
9826       projection {
9827          %% on projette les sommets sur la sphere
9828          /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store
9829       } if
9830       %% puis on les rajoute au solide
9831       /nouveauxindices [
9832          0 1 nouveauxsommets length 3 idiv 1 sub {
9833             /k exch def
9834             result nouveauxsommets k getp3d solidaddsommet
9835          } for
9836       ] def
9837       %% ainsi que la face concernee
9838       result [
9839          0 1 indicesommetstries length 1 sub {
9840             /k exch def
9841          nouveauxindices indicesommetstries k get get
9842          } for 
9843       ] solidaddface
9844       /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store
9845    } for
9846    result [0 1 n 1 sub {} for] solidrmfaces
9847    [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply
9848    result
9849 end
9850 } def
9851
9852 %%%%% ### newgeode ###
9853 %% syntaxe : solid r newgeode --> solid
9854 %% syntaxe : N r newgeode --> solid
9855 %% N in {3,4,5} -> polyhedre de depart, r = niveau de recursion
9856 /newgeode {
9857 2 dict begin
9858    /r exch def
9859    dup issolid not {
9860       /N exch def
9861       N 3 eq {
9862          1 newtetraedre
9863       } {
9864          N 4 eq {
9865             1 newoctaedre
9866          } {
9867             1 newicosaedre
9868          } ifelse
9869       } ifelse
9870    } if
9871
9872    r {
9873       15 dict begin   
9874          /solid exch def
9875          solid dupsolid /result exch def pop
9876          /n solid solidnombrefaces def
9877          n 1 sub -1 0 {
9878             /i exch def
9879             %% la face d indice i
9880             solid i solidgetface /F exch def
9881             /i0 F 0 get def
9882             /i1 F 1 get def
9883             /i2 F 2 get def
9884             solid i0 solidgetsommet /A0 defpoint3d
9885             solid i1 solidgetsommet /A1 defpoint3d
9886             solid i2 solidgetsommet /A2 defpoint3d
9887             A0 A1 milieu3d normalize3d /A01 defpoint3d
9888             A1 A2 milieu3d normalize3d /A12 defpoint3d
9889             A2 A0 milieu3d normalize3d /A20 defpoint3d
9890             result A01 solidaddsommet /i01 exch def
9891             result A12 solidaddsommet /i12 exch def
9892             result A20 solidaddsommet /i20 exch def
9893             result i solidrmface
9894             result [i0 i01 i20] solidaddface
9895             result [i01 i1 i12] solidaddface
9896             result [i01 i12 i20] solidaddface
9897             result [i20 i12 i2] solidaddface
9898          } for
9899          result
9900       end
9901    } repeat
9902 end
9903 } def
9904
9905 %% syntaxe : N r newdualgeode --> solid
9906 /newdualgeode {
9907    newgeode 1
9908    dualpolyedreregulier
9909 } def
9910
9911 %%%%% ### fin insertion ###
9912
9913
9914 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9915 %%%%             quelques solides precalcules           %%%%
9916 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9917
9918 %%%%% ### newface ### 
9919 %% syntaxe : array newmonoface -> solid
9920 %% ou array = tableau de points 2d
9921 /newmonoface {
9922 4 dict begin
9923    /table exch def
9924    /n table length 2 idiv def
9925    /S table {0} papply def
9926
9927    /F [
9928        [0 1 n 1 sub {} for]
9929    ] def
9930    S F generesolid
9931 end
9932 } def
9933
9934 %% syntaxe : array newbiface -> solid
9935 %% ou array = tableau de points 2d
9936 /newbiface {
9937    newmonoface
9938    dup videsolid
9939 } def
9940
9941 %%%%% ### newpolreg ### 
9942 %% syntaxe : r n newpolreg --> solid
9943 /newpolreg {
9944 5 dict begin
9945    /n exch def
9946    /r exch def
9947    /S [
9948        0 360 n div 360 360 n div sub {
9949            /theta exch def
9950            theta cos r mul
9951            theta sin r mul
9952            0
9953        } for
9954    ] def
9955    /F [
9956        [0 1 n 1 sub {} for]
9957    ] def
9958
9959    S F generesolid
9960    dup videsolid
9961 end
9962 } def
9963
9964 %%%%% ### newgrille ### 
9965 %% syntaxe : xmin xmax ymin ymax [dx dy] newgrille -> solid
9966 %% syntaxe : xmin xmax ymin ymax [nx ny] newgrille -> solid
9967 %% syntaxe : xmin xmax ymin ymax {mode} newgrille -> solid
9968 %% syntaxe : xmin xmax ymin ymax newgrille -> solid
9969 /newgrille {
9970 10 dict begin
9971    [[/nx /ny] [1 1] [1. 1.] [1. 1.] [1. 1.] [.5 .5]] gestionsolidmode
9972    %% ny nb d etages en y
9973    %% nx nb d etages en x
9974    /biface false def
9975    [nx ny] {0} newsurfaceparametree
9976 end
9977 } def
9978
9979 %% %% syntaxe : xmin xmax ymin ymax [dx dy] {f} newsurface -> solid
9980 %% %% f : R^2 -> R
9981 /newsurface {
9982    true newsurfaceparametree
9983 } def
9984
9985 /biface true def
9986
9987 /newsurfaceparametree {
9988 10 dict begin
9989    dup isbool {
9990       pop /surfz true def
9991    } {
9992       /surfz false def
9993    } ifelse
9994    /f_surface exch def
9995    [[/nx /ny] [2 2] [4 4] [1. 1.] [1. 1.] [.25 .25]] gestionsolidmode
9996    %% ny nb d etages en y
9997    %% nx nb d etages en x
9998    /ymax exch def
9999    /ymin exch def
10000    /xmax exch def
10001    /xmin exch def
10002
10003    nx isinteger not {
10004        %% alors nx est un dx
10005        /nx xmax xmin sub nx div cvi store
10006    } if
10007    ny isinteger not {
10008        %% alors ny est un dy
10009        /ny ymax ymin sub ny div cvi store
10010    } if
10011    /dy ymax ymin sub ny div def %% le pas sur y
10012    /dx xmax xmin sub nx div def %% le pas sur x
10013
10014    /S [
10015        0 1 nx {
10016            /i exch def
10017            0 1 ny {
10018                /j exch def
10019                /u xmin i dx mul add def
10020                /v ymin j dy mul add def
10021                u v
10022                surfz {2 copy} if
10023                f_surface
10024                pstrickactionR3
10025            } for
10026        } for
10027    ] def
10028
10029    /F [
10030        0 1 nx 1 sub {
10031           /i exch def
10032           0 1 ny 1 sub {
10033              /j exch def
10034              [
10035                 j 1 add        i ny 1 add mul add
10036                 j              i ny 1 add mul add
10037                 j ny 1 add add i ny 1 add mul add
10038                 j ny 2 add add i ny 1 add mul add
10039              ]
10040           } for
10041        } for
10042 %%       0 1 0 {%nx 1 sub {
10043 %%          /i exch def
10044 %%          0 1 0 {%ny 2 sub {
10045 %%             /j exch def
10046 %%             [
10047 %%             j 1 add        %% i ny mul add
10048 %%             j              %% i ny mul add
10049 %%             ny 1 add j add       %% i ny mul add
10050 %%             ny 2 add j add     %% i ny mul add
10051 %%             ]
10052 %%          } for
10053 %%       } for
10054    ] def
10055    S F generesolid
10056    biface pl@n-en-cours not and {dup videsolid} if
10057 end
10058 } def
10059
10060 %%%%% ### newgrillecirculaire ### 
10061 %% syntaxe : r option newgrillecirculaire -> solid
10062 /newgrillecirculaire {
10063 6 dict begin
10064    [[/K /N] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode
10065
10066    %% N = nb de meridiens (diviseur de 360 = 2^4 * 3^2 * 5)
10067    %% K = nb d horizontales (diviseur de 160 = 2^5 * 5)
10068
10069    /r exch def
10070    /F [
10071        %% 1er etage
10072        1 1 N {
10073            /i exch def
10074            [0 i i N mod 1 add]
10075        } for
10076        %% etages suivants
10077        0 1 K 2 sub {
10078            /j exch def
10079            1 1 N {
10080                /i exch def
10081                [i      j N mul add
10082                i N add j N mul add
10083                i N mod N add 1 add j N mul add
10084                i N mod 1 add j N mul add]
10085            } for
10086       } for
10087    ] def
10088
10089    %% tableau des sommets
10090    /S [
10091        0 0 0
10092        1 1 K {
10093            /j exch def
10094            1 1 N {
10095              /i exch def
10096              /theta i 360 mul N div def
10097              theta cos r j mul K div mul
10098              theta sin r j mul K div mul
10099              0 %2 copy f %exch atan 90 div
10100           } for
10101        } for
10102    ] def
10103
10104    S F generesolid
10105 end
10106 } def
10107
10108 %% syntaxe : r [dx dy] {f} newsurface* -> solid
10109 /newsurface* {
10110 7 dict begin
10111    /f_surface exch def
10112    [[/nx /ny] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode
10113
10114    nx isinteger not {
10115        %% alors nx est un dx
10116        /nx xmax xmin sub nx div cvi store
10117    } if
10118    ny isinteger not {
10119        %% alors ny est un dy
10120        /ny ymax ymin sub ny div cvi store
10121    } if
10122    /dy ymax ymin sub ny div def %% le pas sur y
10123    /dx xmax xmin sub nx div def %% le pas sur x
10124
10125    %% ny = nb de meridiens
10126    %% nx = nb d horizontales
10127
10128    /r exch def
10129    /F [
10130        %% 1er etage
10131        1 1 ny {
10132            /i exch def
10133            [0 i i ny mod 1 add]
10134        } for
10135        %% etages suivants
10136        0 1 nx 2 sub {
10137            /j exch def
10138            1 1 ny {
10139                /i exch def
10140                [i      j ny mul add
10141                i ny add j ny mul add
10142                i ny mod ny add 1 add j ny mul add
10143                i ny mod 1 add j ny mul add]
10144            } for
10145       } for
10146    ] def
10147
10148    %% tableau des sommets
10149    /S [
10150        0 0 0
10151        1 1 nx {
10152            /j exch def
10153            1 1 ny {
10154              /i exch def
10155              /theta i 360 mul ny div def
10156              theta cos r j mul nx div mul
10157              theta sin r j mul nx div mul
10158              2 copy f_surface
10159           } for
10160        } for
10161    ] def
10162
10163    S F generesolid
10164 end
10165 } def
10166
10167 %%%%% ### newruban ### 
10168 %% syntaxe : array h u [n] newruban -> solid d axe (O, u), de maillage vertical n
10169 %% syntaxe : array h u newruban -> solid d axe (O, u),
10170 %% syntaxe : array h newruban -> solid d axe (O, k),
10171 %% ou array tableau de points 2d
10172 /newruban {
10173 7 dict begin
10174    %% N = nb d etages
10175    [[/N] [1] [1] [1] [3] [4]] gestionsolidmode
10176    2 copy pop isarray {
10177       /u {0 0 1} def
10178    } {
10179       /u defpoint3d
10180    } ifelse
10181    u 0 eq {
10182       (Error : 3eme composante nulle dans le vecteur pour newruban) ==
10183       quit
10184    } if
10185    pop pop
10186    /h exch def
10187    /table exch def
10188    %% n = indice du dernier point
10189    /n table length 2 idiv 1 sub def
10190    %% vecteur de translation
10191    u
10192    h u norme3d div
10193    mulv3d /v defpoint3d
10194
10195    %% tableau des sommets
10196    /S [
10197       0 1 N {
10198          /j exch def
10199          0 1 n {
10200              /i exch def
10201              table i getp
10202              0
10203              v N j sub N div mulv addv3d
10204          } for
10205       } for
10206    ] def
10207
10208    /F [
10209       %% faces etage
10210       1 1 N {
10211          /j exch def
10212          1 1 n {
10213              /i exch def
10214              [i                   j 1 sub n 1 add mul add
10215               i 1 sub             j 1 sub n 1 add mul add
10216               n 1 add i add 1 sub j 1 sub n 1 add mul add
10217               n 1 add i add       j 1 sub n 1 add mul add]
10218          } for
10219      } for
10220    ] def
10221
10222    S F generesolid
10223    dup videsolid
10224 end
10225 } def
10226
10227 %%%%% ### newicosaedre ### 
10228 /newicosaedre {
10229 3 dict begin
10230    /a exch def
10231    /S [
10232       0.8944271  0              0.4472137
10233       0.2763932  0.8506507      0.4472137
10234       -0.7236067 0.5257311      0.4472137
10235       -0.7236067 -0.5257311     0.4472137
10236       0.2763932  -0.8506507     0.4472137
10237       0          0              1
10238       0          0              -1
10239       -0.8944271 0              -0.4472137
10240       -0.2763932 -0.8506507     -0.4472137
10241       0.7236067  -0.5257311     -0.4472137
10242       0.7236067  0.5257311      -0.4472137
10243       -0.2763932 0.8506507      -0.4472137
10244    ] {a mulv3d} papply3d def
10245
10246    /F [
10247       [0 1 5]   %% 1  2 6  ]
10248       [1 2 5]   %% 2  3 6  ]
10249       [2 3 5]   %% 3  4 6  ]
10250       [3 4 5]   %% 4  5 6  ]
10251       [4 0 5]   %% 5  1 6  ]
10252       [9 0 4]   %% 10 1 5  ]
10253       [0 9 10]  %% 1  10 11]
10254       [10 1 0]  %% 11 2 1  ]
10255       [1 10 11] %% 2  11 12]
10256       [11 2 1]  %% 12 3 2  ]
10257       [2 11 7]  %% 3  12 8 ]
10258       [2 7 3]   %% 3  8 4  ]
10259       [3 7 8]   %% 4  8 9  ]
10260       [3 8 4]   %% 4  9 5  ]
10261       [4 8 9]   %% 5  9 10 ]
10262       [6 7 11]  %% 7  8 12 ]
10263       [6 8 7]   %% 7  9 8  ]
10264       [6 9 8]   %% 7  10 9 ]
10265       [6 10 9]  %% 7  11 10]
10266       [6 11 10] %% 7  12 11]
10267    ] def
10268
10269    S F generesolid
10270 end
10271 } def
10272
10273 %%%%% ### newdodecaedre ### 
10274 /newdodecaedre {
10275 3 dict begin
10276    /a exch def
10277    /S [
10278       0          0.607062   0.7946545
10279       -0.5773503 0.1875925  0.7946545
10280       -0.3568221 -0.4911235 0.7946545
10281       0.3568221  -0.4911235 0.7946545
10282       0.5773503  0.1875925  0.7946545
10283       0          0.982247   0.1875925
10284       -0.9341724 0.303531   0.1875925
10285       -0.5773503 -0.7946645 0.1875925
10286       0.5773503  -0.7946645 0.1875925
10287       0.9341724  0.303531   0.1875925
10288       0          -0.982247  -0.1875925
10289       0.9341724  -0.303531  -0.1875925
10290       0.5773503  0.7946545  -0.1875925
10291       -0.5773503 0.7946545  -0.1875925
10292       -0.9341724 -0.303531  -0.1875925
10293       -0.5773503 -0.1875925 -0.7946545
10294       -0.3568221 0.4911235  -0.7946545
10295       0.3568221  0.4911235  -0.7946545
10296       0.5773503  -0.1875925 -0.7946545
10297       0          -0.607062  -0.7946545
10298    ] {a mulv3d} papply3d def
10299
10300    /F [
10301       [0 1 2 3 4]
10302       [4 3 8 11 9]
10303       [4 9 12 5 0]
10304       [0 5 13 6 1]
10305       [1 6 14 7 2]
10306       [2 7 10 8 3]
10307       [10 19 18 11 8]
10308       [11 18 17 12 9]
10309       [12 17 16 13 5]
10310       [13 16 15 14 6]
10311       [14 15 19 10 7]
10312       [15 16 17 18 19]
10313    ] def
10314    S F generesolid
10315 end
10316 } def
10317
10318 %%%%% ### newoctaedre ### 
10319 /newoctaedre {
10320 3 dict begin
10321    /a exch def
10322    %%Sommets
10323    /S [
10324       0  0  1
10325       1  0  0
10326       0  1  0
10327       -1 0  0
10328       0  -1 0
10329       0  0  -1
10330    ] {a mulv3d} papply3d def
10331
10332    /F [
10333       [0 4 1]
10334       [1 2 0]
10335       [0 2 3]
10336       [3 4 0]
10337       [1 5 2]
10338       [2 5 3]
10339       [3 5 4]
10340       [4 5 1]
10341    ] def
10342
10343    S F generesolid
10344 end
10345 } def
10346
10347 %%%%% ### newtetraedre ### 
10348 /newtetraedre {
10349 3 dict begin
10350    /r exch def
10351    %%Tetraedre
10352    /S [
10353       0          0          1
10354       -0.4714045 -0.8164965 -1 3 div
10355       0.942809   0          -1 3 div
10356       -0.4714045 0.8164965  -1 3 div
10357    ] {r mulv3d} papply3d def
10358
10359    /F [
10360       [0 1 2]
10361       [0 2 3]
10362       [0 3 1]
10363       [1 3 2]
10364    ] def
10365
10366    S F generesolid
10367 end
10368 } def
10369
10370 %%%%% ### newcube ### 
10371 /newcube {
10372 3 dict begin
10373    [[/n] [1] [1] [1] [3] [4]] gestionsolidmode
10374    /a exch 2 div def
10375
10376    n 1 le {
10377       /F [
10378      [0 1 2 3]
10379      [0 4 5 1]
10380      [1 5 6 2]
10381      [2 6 7 3]
10382      [0 3 7 4]
10383      [4 7 6 5]
10384       ] def
10385
10386       %% tableau des sommets
10387       /S [
10388       1  1  1 %% 0
10389      -1  1  1 %% 1
10390      -1 -1  1 %% 2
10391       1 -1  1 %% 3
10392       1  1 -1 %% 4
10393      -1  1 -1 %% 5
10394      -1 -1 -1 %% 6
10395       1 -1 -1 %% 7
10396       ] {a mulv3d} papply3d def
10397       S F generesolid
10398    } {
10399       /dl 2 n div def
10400       /N n dup mul n add 4 mul def
10401       /n1 n 1 sub dup mul def %% nb sommets centre d une face
10402
10403       %% tableau des sommets
10404       /S1 [
10405      0 1 n 1 sub {
10406         /j exch def
10407         0 1 n {
10408            /i exch def
10409            -1 i dl mul add
10410            -1 j dl mul add
10411         1
10412         } for
10413      } for
10414       ] def
10415
10416       /S2 S1 {-90 0 0 rotateOpoint3d} papply3d def
10417       /S3 S2 {-90 0 0 rotateOpoint3d} papply3d def
10418       /S4 S3 {-90 0 0 rotateOpoint3d} papply3d def
10419
10420       /S5 [
10421      1 1 n 1 sub {
10422         /j exch def
10423         1 1 n 1 sub {
10424            /i exch def
10425         1
10426            -1 i dl mul add
10427            -1 j dl mul add
10428         } for
10429      } for
10430       ] def
10431
10432       /S6 [
10433      1 1 n 1 sub {
10434         /j exch def
10435         1 1 n 1 sub {
10436            /i exch def
10437            -1
10438            -1 i dl mul add
10439            -1 j dl mul add
10440         } for
10441      } for
10442       ] def
10443
10444       %% tableau des faces
10445       /F1 [
10446      0 1 n 1 sub {
10447         /j exch def
10448         0 1 n 1 sub {
10449            /i exch def
10450            [
10451           i n 1 add j mul add
10452           dup 1 add
10453           dup n 1 add add
10454           dup 1 sub
10455            ]
10456         } for
10457      } for
10458       ] def
10459
10460       %% syntaxe : i sommettourgauche --> l indice du i-eme sommet du tour
10461       %% de la face gauche (en commencant par l indice 0). ATTENTION :
10462       %% utilise la variable globale n = nb d etages
10463       /sommettourgauche {
10464       1 dict begin
10465      /i exch def
10466      i 4 n mul ge {
10467         i
10468         (Error: indice trop grand dans sommettourgauche) ==
10469         exit
10470      } if
10471      n n 1 add i mul add
10472       end
10473       } def
10474
10475       %% syntaxe : i sommetcentregauche --> l indice du i-eme sommet du centre
10476       %% de la face gauche (en commencant par l indice 0). ATTENTION :
10477       %% utilise les variables globales n = nb d etages, et N = nb sommets
10478       %% des 4 1eres faces
10479       /sommetcentregauche {
10480       1 dict begin
10481      /i exch def
10482      i n 1 sub dup mul ge {
10483         i
10484         (Error: indice trop grand dans sommetcentregauche) ==
10485         exit
10486      } if
10487      N i add
10488       end
10489       } def
10490
10491       /F5 [
10492      %%%%% la face gauche %%%%%
10493      %% le coin superieur gauche
10494      [
10495         1 sommettourgauche
10496         0 sommettourgauche
10497         n 4 mul 1 sub sommettourgauche
10498         n1 n 1 sub sub sommetcentregauche
10499      ]
10500
10501      %% la bande superieure (i from 1 to n-2)
10502      1 1 n 2 sub {
10503         /i exch def
10504         [
10505            i 1 add sommettourgauche
10506            i sommettourgauche
10507            n1 n sub i add sommetcentregauche
10508            n1 n sub i 1 add add sommetcentregauche
10509         ]
10510      } for
10511
10512      %% le coin superieur droit
10513      [
10514         n sommettourgauche
10515         n 1 sub sommettourgauche
10516         n1 1 sub sommetcentregauche
10517         n 1 add sommettourgauche
10518      ]
10519
10520      %% la descente gauche
10521      %% j from 1 to n-2
10522      1 1 n 2 sub {
10523         /j exch def
10524         [
10525            n1 n 1 sub j mul sub sommetcentregauche
10526            n 4 mul j sub sommettourgauche
10527            n 4 mul j 1 add sub sommettourgauche
10528            n1 n 1 sub j 1 add mul sub sommetcentregauche
10529         ]
10530      } for
10531
10532      %% les bandes centrales (j from 1 to n-2 et i from 1 to n-2)
10533      1 1 n 2 sub {
10534         /j exch def
10535         1 1 n 2 sub {
10536            /i exch def
10537            [
10538           n1 i n 1 sub j 1 sub mul add sub sommetcentregauche
10539           n1 i 1 add n 1 sub j 1 sub mul add sub sommetcentregauche
10540           n1 i 1 add n 1 sub j mul add sub sommetcentregauche
10541           n1 i n 1 sub j mul add sub sommetcentregauche
10542            ]
10543         } for
10544      } for
10545
10546      %% la descente droite
10547      1 1 n 2 sub {
10548         /j exch def
10549         [
10550            n j add sommettourgauche
10551            n1 1 sub j 1 sub n 1 sub mul sub sommetcentregauche
10552            n1 1 sub j n 1 sub mul sub sommetcentregauche
10553            n j 1 add add sommettourgauche
10554         ]
10555      } for
10556
10557      %% le coin inferieur gauche
10558      [
10559         0 sommetcentregauche
10560         n 3 mul 1 add sommettourgauche
10561         n 3 mul sommettourgauche
10562         n 3 mul 1 sub sommettourgauche
10563      ]
10564
10565      %% la bande inferieure (i from 1 to n-2)
10566      1 1 n 2 sub {
10567         /i exch def
10568         [
10569            i sommetcentregauche
10570            i 1 sub sommetcentregauche
10571            n 3 mul i sub sommettourgauche
10572            n 3 mul i sub 1 sub sommettourgauche
10573         ]
10574      } for
10575
10576      %% le coin inferieur droit
10577      [
10578         n 2 mul 1 sub sommettourgauche
10579         n 2 sub sommetcentregauche
10580         n 2 mul 1 add sommettourgauche
10581         n 2 mul sommettourgauche
10582      ]
10583       ] def
10584
10585       %% syntaxe : i sommettourdroit --> l indice du i-eme sommet du tour
10586       %% de la face droit (en commencant par l indice 0). ATTENTION :
10587       %% utilise la variable globale n = nb d etages
10588       /sommettourdroit {
10589       1 dict begin
10590      /i exch def
10591      i 4 n mul ge {
10592         i
10593         (Error: indice trop grand dans sommettourdroit) ==
10594         exit
10595      } if
10596      n 1 add i mul
10597       end
10598       } def
10599
10600       %% syntaxe : i sommetcentredroit --> l indice du i-eme sommet du centre
10601       %% de la face droit (en commencant par l indice 0). ATTENTION :
10602       %% utilise les variables globales n = nb d etages, et N = nb sommets
10603       %% des 4 1eres faces
10604       /sommetcentredroit {
10605       1 dict begin
10606      /i exch def
10607      i n 1 sub dup mul ge {
10608         i
10609         (Error: indice trop grand dans sommetcentredroit) ==
10610         exit
10611      } if
10612      N n1 add i add
10613       end
10614       } def
10615
10616       /F6 [
10617      %% coin superieur droit
10618      [
10619         0 sommettourdroit
10620         1 sommettourdroit
10621         n1 n 1 sub sub sommetcentredroit
10622         4 n mul 1 sub sommettourdroit
10623      ]
10624      %% coin superieur gauche
10625      [
10626         n 1 sub sommettourdroit
10627         n sommettourdroit
10628         n 1 add sommettourdroit
10629         n1 1 sub sommetcentredroit
10630      ]
10631      %% coin inferieur gauche
10632      [
10633         n 2 sub sommetcentredroit
10634         2 n mul 1 sub sommettourdroit
10635         2 n mul sommettourdroit
10636         2 n mul 1 add sommettourdroit
10637      ]
10638      %% coin inferieur droit
10639      [
10640         3 n mul 1 add sommettourdroit
10641         0 sommetcentredroit
10642         3 n mul 1 sub sommettourdroit
10643         3 n mul sommettourdroit
10644      ]
10645      %% bande superieure
10646      1 1 n 2 sub {
10647         /i exch def
10648         [
10649            i sommettourdroit
10650            i 1 add sommettourdroit
10651            n 1 sub n 2 sub mul i add sommetcentredroit
10652            n 1 sub n 2 sub mul i 1 sub add sommetcentredroit
10653         ]
10654      } for
10655      %% bande inferieure
10656      1 1 n 2 sub {
10657         /i exch def
10658         [
10659            i 1 sub sommetcentredroit
10660            i sommetcentredroit
10661            3 n mul 1 sub i sub sommettourdroit
10662            3 n mul i sub sommettourdroit
10663         ]
10664      } for
10665      %% descente gauche
10666      1 1 n 2 sub {
10667         /i exch def
10668         [
10669            n1 1 sub i 1 sub n 1 sub mul sub sommetcentredroit
10670            n i add sommettourdroit
10671            n i 1 add add sommettourdroit
10672            n1 1 sub i n 1 sub mul sub sommetcentredroit
10673         ]
10674      } for
10675      %% descente droite
10676      1 1 n 2 sub {
10677         /i exch def
10678         [
10679            4 n mul i sub sommettourdroit
10680            n 1 sub n 1 sub i sub mul sommetcentredroit
10681            n 1 sub n 2 sub i sub mul sommetcentredroit
10682            4 n mul i sub 1 sub sommettourdroit
10683         ]
10684      } for
10685      %% bandes interieures
10686      1 1 n 2 sub {
10687         /j exch def
10688         1 1 n 2 sub {
10689            /i exch def
10690            [
10691           n 1 sub j mul i 1 sub add sommetcentredroit
10692           n 1 sub j mul i add sommetcentredroit
10693           n 1 sub j 1 sub mul i add sommetcentredroit
10694           n 1 sub j 1 sub mul i 1 sub add sommetcentredroit
10695            ]
10696         } for
10697      } for
10698
10699       ] def
10700
10701       /F2 F1 {{n dup mul n add add} apply} apply def
10702       /F3 F2 {{n dup mul n add add} apply} apply def
10703       /F4 F3 {{n dup mul n add add} apply} apply def
10704
10705
10706       S1 S2 append S3 append S4 append S5 append S6 append {a mulv3d} papply3d
10707       F1 F2 append F3 append F4 append {{N mod} apply} apply F5 append F6 append
10708       generesolid
10709    } ifelse
10710 end
10711 } def
10712
10713 %%%%% ### newparallelepiped ### 
10714 % 14 octobre 2006
10715 /newparallelepiped {
10716 2 dict begin
10717    /c exch 2 div def
10718    /b exch 2 div def
10719    /a exch 2 div def
10720    /F [
10721       [0 1 2 3]
10722       [0 4 5 1]
10723       [1 5 6 2]
10724       [2 6 7 3]
10725       [0 3 7 4]
10726       [4 7 6 5]
10727     ] def
10728
10729     %% tableau des sommets
10730     /S [
10731        a     b     c %% 0
10732        a neg b     c %% 1
10733        a neg b neg c %% 2
10734        a     b neg c %% 3
10735        a     b     c neg %% 4
10736        a neg b     c neg %% 5
10737        a neg b neg c neg %% 6
10738        a     b neg c neg %% 7
10739     ] def
10740     S F generesolid
10741 } def
10742
10743 %%%%% ### newcylindre ### 
10744 %% syntaxe : z0 r0 z1 newcylindre -> solide
10745 %% syntaxe : z0 r0 z1 {mode} newcylindre -> solide
10746 %% syntaxe : z0 r0 z1 [n1 n2] newcylindre -> solide
10747 %% syntaxe : a b {f} {u} h [n1 n2] newcylindre
10748 /newcylindre {
10749 2 dict begin
10750    [[/n2 /n1] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode
10751    2 copy pop xcheck {
10752       %% cylindre cas general
10753       /h exch def
10754       /U exch def
10755       U normalize3d /u defpoint3d
10756       /lafonction exch def
10757       /b exch def
10758       /a exch def
10759       /pas b a sub n1 div def
10760       /vpas h n2 div def
10761       /S [
10762          0 1 n2 {
10763             /j exch def
10764             0 1 n1 {
10765                /i exch def
10766                a i pas mul add lafonction
10767                u j vpas mul mulv3d addv3d
10768             } for
10769          } for
10770       ] def
10771       /F [
10772          0 1 n2 1 sub {
10773             /j exch def
10774             0 1 n1 1 sub {
10775                /i exch def
10776                [
10777                   i n1 1 add j mul add 
10778                   dup 1 add
10779                   dup n1 1 add add
10780                   dup 1 sub
10781                ]
10782             } for
10783          } for
10784       ] def
10785       
10786       S F generesolid
10787 %      dup videsolid
10788    } {
10789       %% cylindre de revolution
10790       2 copy pop [n2 n1] newtronccone
10791    } ifelse
10792 end
10793 } def
10794
10795 %% syntaxe : z0 r0 z1 newcylindrecreux -> solide
10796 /newcylindrecreux {
10797    newcylindre
10798    dup creusesolid
10799 } def
10800
10801 %%%%% ### newtronccone ### 
10802 %% syntaxe : z0 r0 z1 r1 newtronccone -> solid
10803 /newtronccone {
10804 11 dict begin
10805    [[/n /N] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode
10806
10807    /r1 exch def
10808    /z1 exch def
10809    /r0 exch def
10810    /z0 exch def
10811    /dz z1 z0 sub n div def
10812    /dr r1 r0 sub n div def
10813
10814    /FE [
10815       [0 1 N 1 sub {} for]
10816       [n 1 add N mul 1 sub -1 n N mul {} for]
10817
10818       0 1 n 1 sub {
10819       /k exch def
10820          k N mul 1 add 1 k 1 add N mul 1 sub {
10821              /i exch def
10822              [i i 1 sub N i add 1 sub N i add]
10823          } for
10824          [k N mul k 1 add N mul 1 sub k 2 add N mul 1 sub k 1 add N mul]
10825       } for
10826
10827    ] def
10828
10829    %% tableau des sommets
10830    /S [
10831       n -1 0 {
10832          /k exch def
10833          0 1 N 1 sub {
10834              /i exch def
10835              360 N idiv i mul cos r0 dr k mul add mul
10836              360 N idiv i mul sin r0 dr k mul add mul
10837              z0 dz k mul add
10838          } for
10839       } for
10840    ] def
10841    S FE generesolid
10842 end
10843 } def
10844
10845 %% syntaxe : z0 r0 z1 r1 newtroncconecreux -> solid
10846 /newtroncconecreux {
10847    newtronccone
10848    dup creusesolid
10849 } def
10850
10851 %%%%% ### newcone ### 
10852 %% syntaxe : z0 r0 z1 newcone -> solid
10853 %% syntaxe : z0 r0 z1 {mode} newcone -> solid
10854 %% syntaxe : z0 r0 z1 [n1 n2] newcone -> solid
10855 %% syntaxe : a b {f} {sommet} [n1 n2] newcone -> solid
10856 /newcone {
10857 11 dict begin
10858    [ [/n /N] [1 6] [1 8] [1 10] [3 12] [5 18] ] gestionsolidmode
10859    dup xcheck {
10860       %% cas general
10861       /sommet exch def
10862       /lafonction exch def
10863       /b exch def
10864       /a exch def
10865
10866       /pas b a sub N div def
10867       /S [
10868          sommet
10869          0 1 n 1 sub {
10870             /j exch def
10871             0 1 N {
10872                /i exch def
10873                a i pas mul add lafonction
10874                dupp3d sommet vecteur3d j n div mulv3d addv3d
10875             } for
10876          } for
10877          1 1 n {
10878             /j exch def
10879             0 1 N {
10880                /i exch def
10881                a i pas mul add lafonction
10882                sommet vecteur3d j n div mulv3d sommet addv3d
10883             } for
10884          } for
10885       ] def
10886
10887       /F [
10888          %% les etages inferieurs
10889          0 1 n 2 sub {
10890             /j exch def
10891             1 1 N {
10892                /i exch def
10893                [
10894                   i j N 1 add mul add
10895                   dup 1 add
10896                   dup N add 1 add
10897                   dup 1 sub
10898                ]
10899             } for
10900          } for
10901          %% dernier etage inferieur
10902          1 1 N {
10903             /i exch def
10904             [
10905                i N 1 add n 1 sub mul add
10906                dup 1 add
10907                0
10908             ]
10909          } for
10910          %% premier etage superieur
10911          1 1 N {
10912             /i exch def
10913             [
10914                i N 1 add n mul add
10915                dup 1 add
10916                0
10917                exch
10918             ]
10919          } for
10920          %% les etages superieurs
10921          n 1 n 2 mul 2 sub {
10922             /j exch def
10923             1 1 N {
10924                /i exch def
10925                [
10926                   i j N 1 add mul add
10927                   dup 1 add
10928                   dup N add 1 add
10929                   dup 1 sub
10930                ]
10931             } for
10932          } for
10933       ] def
10934
10935       S F generesolid
10936 %      dup videsolid
10937    } {
10938       %% cylindre de revolution
10939       /z1 exch def
10940       /r0 exch def
10941       /z0 exch def
10942       /dz z1 z0 sub n div def
10943       /dr r0 n div def
10944    
10945       /F [
10946          %% la base
10947          [N 1 sub -1 0 {} for]
10948          %% le dernier etage
10949          n 1 sub N mul 1 add 1 n N mul 1 sub {
10950               /i exch def
10951               [i 1 sub i n N mul]
10952          } for
10953          [n N mul 1 sub n 1 sub N mul n N mul]
10954          %% les autres etages
10955          0 1 n 2 sub {
10956             /j exch def
10957             0 N j mul add 1 N N j mul add 2 sub {
10958                /i exch def
10959                [i i 1 add dup N add dup 1 sub]
10960             } for
10961             [N N j mul add 1 sub N j mul dup N add dup N add 1 sub]
10962          } for
10963       ] def
10964    
10965       %% tableau des sommets
10966       /S [
10967          %% etage no j (in [1; n])
10968          0 1 n 1 sub {
10969             /j exch def
10970             0 1 N 1 sub {
10971                 /i exch def
10972                 360 N idiv i mul cos r0 dr j mul sub mul
10973                 360 N idiv i mul sin r0 dr j mul sub mul
10974                 z0 dz j mul add
10975             } for
10976          } for
10977          0 0 z1
10978       ] def
10979       S F generesolid
10980    } ifelse
10981 end
10982 } def
10983
10984 %% %% syntaxe : z0 r0 z1 newconecreux -> solid
10985  /newconecreux {
10986     newcone
10987     dup 0 solidrmface
10988     dup videsolid
10989  } def
10990
10991 %%%%% ### newtore ### 
10992 %% syntaxe : r R newtore -> solid
10993 /newtore {
10994 10 dict begin
10995    [[/n1 /n2] [4 5] [6 10] [8 12] [9 18] [18 36]] gestionsolidmode
10996    /n2 n2 3 max store
10997    /n1 n1 2 max store
10998    /R exch def
10999    /r exch def
11000    /S [
11001          0 1 n1 1 sub {
11002             /i exch def
11003             360 n1 div i mul cos r mul R add
11004             360 n1 div i mul sin r mul
11005          } for
11006       ]
11007    def
11008    S [n2] newanneau
11009 end
11010 } def
11011
11012 %%%%% ### newprisme ### 
11013 %% syntaxe : array z0 z1 newprisme -> solid d axe (O, u),
11014 /newprismedroit {
11015    [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
11016    0 0 1 [N] newprisme
11017 } def
11018
11019 %% syntaxe : array z0 z1 u newprisme -> solid d axe (O, u),
11020 %% ou array tableau de points 2d
11021 /newprisme {
11022 7 dict begin
11023    [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
11024    dup 0 eq {
11025       (Error : 3eme composante nulle dans le vecteur pour newprisme) ==
11026       quit
11027    } if
11028    /u defpoint3d
11029    /z1 exch def
11030    /z0 exch def
11031    %% N = nb d etages
11032    /table exch def
11033    %% n = indice du dernier point
11034    /n table length 2 idiv 1 sub def
11035    %% vecteur de translation
11036    u
11037    z1 z0 sub u norme3d div
11038    mulv3d /v defpoint3d
11039
11040    %% tableau des sommets
11041    /S [
11042       0 1 N {
11043          /j exch def
11044          0 1 n {
11045              /i exch def
11046              table i getp
11047              z0
11048              v N j sub N div mulv addv3d
11049          } for
11050       } for
11051    ] def
11052
11053    /F [ 
11054       %% face superieure
11055       [0 1 n {} for]
11056       %% base
11057       [N 1 add n 1 add mul 1 sub -1 N n 1 add mul {} for]
11058       %% faces etage
11059       1 1 N {
11060          /j exch def
11061          1 1 n {
11062              /i exch def
11063              [i                   j 1 sub n 1 add mul add
11064               i 1 sub             j 1 sub n 1 add mul add
11065               n 1 add i add 1 sub j 1 sub n 1 add mul add
11066               n 1 add i add       j 1 sub n 1 add mul add]
11067          } for
11068          [0            j 1 sub n 1 add mul add
11069          n             j 1 sub n 1 add mul add
11070          2 n mul 1 add j 1 sub n 1 add mul add
11071          n 1 add       j 1 sub n 1 add mul add]
11072      } for
11073    ] def
11074
11075    S F generesolid
11076 end
11077 } def
11078
11079 %%%%% ### newsphere ### 
11080 %% syntaxe : r option newsphere -> solid
11081 /newsphere {
11082 2 dict begin
11083    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11084    -90 90 [K N] newcalottesphere
11085 end
11086 } def
11087
11088 %% syntaxe : r phi theta option newcalottesphere -> solid
11089 /newcalottesphere {
11090 6 dict begin
11091    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11092
11093    %% test de beta (ex-theta)
11094    dup 90 eq {
11095       /beta exch def
11096       /idebut 1 def
11097    } {
11098       /beta exch 80 min -80 max def
11099       /idebut 0 def
11100    } ifelse
11101    %% test de alpha (ex-phi)
11102    dup -90 eq {
11103       /alpha exch def
11104    } {
11105       /alpha exch beta min -80 max def
11106    } ifelse
11107    /r exch def
11108    beta 90 eq {
11109        alpha -90 eq {
11110            /ifin K def
11111           /db alpha beta sub K 1 add div def
11112        } {
11113            /ifin K def
11114           /db alpha beta sub K div def
11115        } ifelse
11116    } {
11117        alpha -90 eq {
11118            /ifin K 1 sub def
11119           /db alpha beta sub K div def
11120        } {
11121            /ifin K 1 sub def
11122           /db alpha beta sub K 1 sub div def
11123        } ifelse
11124    } ifelse
11125
11126    %% nombre de sommets -2
11127    /nb N K mul def
11128
11129    %% tableau des sommets
11130    /S [
11131        idebut 1 ifin {
11132            /j exch def
11133            /phi beta j db mul add def
11134            phi cos r mul /r_tmp exch def
11135            0 1 N 1 sub {
11136                 /i exch def
11137                 360 N idiv i mul cos r_tmp mul
11138                 360 N idiv i mul sin r_tmp mul
11139                 phi sin r mul
11140             } for
11141        } for
11142       0 0 r neg
11143       0 0 r
11144    ] def
11145
11146    /F [
11147      %% calotte inferieure
11148      alpha -90 eq {
11149          1 1 N 1 sub {
11150          /i exch def
11151             [
11152                 nb
11153                 nb i sub
11154                 nb i 1 add sub
11155             ]
11156          } for
11157          [nb nb N sub nb 1 sub]
11158      } {
11159         [nb 1 sub -1 nb N sub {} for ]
11160      } ifelse
11161
11162      %% calotte superieure
11163      beta 90 eq {
11164          0 1 N 1 sub {
11165             /i exch def
11166              [i i 1 add N mod N K mul 1 add]
11167          } for
11168       } {
11169          [0 1 N 1 sub {} for]
11170       } ifelse
11171
11172      1 1 K 1 sub {
11173           /j exch def
11174        [
11175            j N mul
11176            j N mul 1 add
11177            j 1 sub N mul 1 add
11178            j 1 sub N mul
11179        ]
11180        N 2 sub {dup {1 add} apply} repeat
11181        [
11182            j 1 add N mul 1 sub
11183            j N mul
11184            j 1 sub N mul
11185            j N mul 1 sub
11186        ]
11187     } for
11188    ] def
11189
11190    S F generesolid
11191 end
11192 } def
11193
11194 %% syntaxe : r phi theta option newcalottespherecreuse -> solid
11195 /newcalottespherecreuse {
11196 6 dict begin
11197    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11198
11199    %% test de beta (ex-theta)
11200    dup 90 eq {
11201       /beta exch def
11202       /idebut 1 def
11203    } {
11204       /beta exch 80 min -80 max def
11205       /idebut 0 def
11206    } ifelse
11207    %% test de alpha (ex-phi)
11208    dup -90 eq {
11209       /alpha exch def
11210    } {
11211       /alpha exch beta min -80 max def
11212    } ifelse
11213    /r exch def
11214    beta 90 eq {
11215        alpha -90 eq {
11216            /ifin K def
11217           /db alpha beta sub K 1 add div def
11218        } {
11219            /ifin K def
11220           /db alpha beta sub K div def
11221        } ifelse
11222    } {
11223        alpha -90 eq {
11224            /ifin K 1 sub def
11225           /db alpha beta sub K div def
11226        } {
11227            /ifin K 1 sub def
11228           /db alpha beta sub K 1 sub div def
11229        } ifelse
11230    } ifelse
11231
11232    %% nombre de sommets -2
11233    /nb N K mul def
11234
11235    %% tableau des sommets
11236    /S [
11237        idebut 1 ifin {
11238            /j exch def
11239            /phi beta j db mul add def
11240            phi cos r mul /r_tmp exch def
11241            0 1 N 1 sub {
11242                 /i exch def
11243                 360 N idiv i mul cos r_tmp mul
11244                 360 N idiv i mul sin r_tmp mul
11245                 phi sin r mul
11246             } for
11247        } for
11248       0 0 r neg
11249       0 0 r
11250    ] def
11251
11252    /F [
11253      %% calotte inferieure
11254      alpha -90 eq {
11255          1 1 N 1 sub {
11256          /i exch def
11257             [
11258                 nb
11259                 nb i sub
11260                 nb i 1 add sub
11261             ]
11262          } for
11263          [nb nb N sub nb 1 sub]
11264      } {
11265 %        [nb 1 sub -1 nb N sub {} for ]
11266      } ifelse
11267
11268      %% calotte superieure
11269      beta 90 eq {
11270          0 1 N 1 sub {
11271             /i exch def
11272              [i i 1 add N mod N K mul 1 add]
11273          } for
11274       } {
11275 %         [0 1 N 1 sub {} for]
11276       } ifelse
11277
11278      1 1 K 1 sub {
11279           /j exch def
11280        [
11281            j N mul
11282            j N mul 1 add
11283            j 1 sub N mul 1 add
11284            j 1 sub N mul
11285        ]
11286        N 2 sub {dup {1 add} apply} repeat
11287        [
11288            j 1 add N mul 1 sub
11289            j N mul
11290            j 1 sub N mul
11291            j N mul 1 sub
11292        ]
11293     } for
11294    ] def
11295
11296    S F generesolid
11297    dup videsolid
11298 end
11299 } def
11300
11301 %%%%% ### newanneau ### 
11302 %% syntaxe : array n newanneau --> solid
11303 %% syntaxe : array {mode} newanneau --> solid
11304 %% ou array est un tableau de points de R^2 et n un nombre entier positif
11305 /newanneau {
11306 10 dict begin
11307    dup isnum {
11308       /n exch def
11309       [n]
11310    } if
11311    [[/n2] [6] [12] [24] [32] [36]] gestionsolidmode
11312    /n2 n2 3 max store
11313    %% on plonge la section dans R^3 par projection sur yOz
11314    /S1 exch {0 3 1 roll} papply def
11315    %% nombre de sommets
11316    /n1 S1 length 3 idiv def
11317
11318    /S S1
11319       n2 {
11320          duparray
11321          {0 0 360 n2 div rotateOpoint3d} papply3d
11322       } repeat
11323       n2 {append} repeat
11324    def
11325
11326    /F [
11327       0 1 n2 1 sub {
11328          /j exch def
11329          n1 j mul 1 j 1 add n1 mul 2 sub {
11330             /i exch def
11331             [i 1 add i dup n1 add i n1 1 add add]
11332          } for
11333          [n1 j mul j 1 add n1 mul 1 sub j 2 add n1 mul 1 sub j 1 add n1 mul]
11334       } for
11335    ] def
11336
11337    S F generesolid
11338 end
11339 } def
11340
11341 %%%%% ### newvecteur ### 
11342 %% syntaxe : x y z newvecteur
11343 %% syntaxe : x y z array newvecteur
11344 /newvecteur {
11345 4 dict begin
11346    dup isarray {
11347       /table exch def
11348       /h@uteur table 1 get def
11349       /r@y@n table 0 get def
11350    } {
11351       /h@uteur .3 def
11352       /r@y@n .1 def
11353    } ifelse
11354    /A defpoint3d
11355    %%Sommets
11356    /S [0 0 0 A] def
11357    /F [
11358       [0 1]
11359    ] def
11360    S F generesolid
11361    [ A ]
11362    normalvect_to_orthobase
11363    /imK defpoint3d
11364    /imJ defpoint3d
11365    /imI defpoint3d
11366
11367    A norme3d /z exch h@uteur sub def 
11368    0 r@y@n h@uteur [1 8] newcone
11369    dup (noir) outputcolors
11370    {0 0 z translatepoint3d} solidtransform
11371    {imI imJ imK transformpoint3d} solidtransform
11372    solidfuz
11373 end
11374 } def
11375
11376 %%%%% ### readsolidfile ###
11377 %% syntaxe : str readsolidfile -> solid
11378 /readsolidfile {
11379 1 dict begin
11380    /str exch def
11381    [str (-sommets.dat) append run] 
11382    [str (-faces.dat) append run]
11383    generesolid
11384    dup [str (-couleurs.dat) append run] solidputfcolors
11385    dup [str (-io.dat) append run] solidputinouttable
11386 end
11387 } def
11388
11389 %%%%% ### writesolidfile ###
11390 %% syntaxe : solid str writesolidfile -> -
11391 /writesolidfile {
11392 10 dict begin
11393    /str exch def
11394    /solid exch def
11395    solid issolid not {
11396       (Error : mauvais type d argument dans writesolidfile) ==
11397       quit
11398    } if
11399    str (-sommets.dat) append (w) file /lefichiersommets exch def
11400    str (-faces.dat) append (w) file /lefichierfaces exch def
11401    str (-couleurs.dat) append (w) file /lefichiercouleurs exch def
11402    str (-io.dat) append (w) file /lefichierio exch def
11403
11404    /S solid solidgetsommets def
11405    0 1 S length 3 idiv 1 sub {
11406       /i exch def
11407       solid i solidgetsommet
11408       /z exch def
11409       /y exch def
11410       /x exch def
11411       lefichiersommets x chaine cvs writestring
11412       lefichiersommets 32 write %% espace
11413       lefichiersommets y chaine cvs writestring
11414       lefichiersommets 32 write %% espace
11415       lefichiersommets z chaine cvs writestring
11416       lefichiersommets 10 write %% CR
11417    } for
11418    lefichiersommets closefile
11419
11420    /F solid solidgetfaces def
11421    0 1 F length 1 sub {
11422       /i exch def
11423       /Fi solid i solidgetface def
11424       lefichierfaces 91 write %% [
11425       0 1 Fi length 1 sub {
11426          /j exch def
11427          lefichierfaces Fi j get chaine cvs writestring
11428          lefichierfaces 32 write %% espace
11429       } for
11430       lefichierfaces 93 write %% ]
11431       lefichierfaces 10 write %% CR
11432    } for
11433    lefichierfaces closefile
11434
11435    /C solid solidgetfcolors def
11436    0 1 C length 1 sub {
11437       /i exch def
11438       lefichiercouleurs 40 write %% (
11439       lefichiercouleurs C i get writestring
11440       lefichiercouleurs 41 write %% )
11441       lefichiercouleurs 10 write %% CR
11442    } for
11443    lefichiercouleurs closefile
11444
11445    /IO solid solidgetinouttable def
11446    0 1 3 {
11447       /i exch def
11448       lefichierio IO i get chaine cvs writestring
11449       lefichierio 32 write %% space
11450    } for
11451    lefichierio closefile
11452 end
11453 } def
11454
11455 %%%%% ### writeobjfile ###
11456 %% syntaxe : solid str writeobjfile -> -
11457 /writeobjfile {
11458 10 dict begin
11459    /str exch (.obj) append def
11460    /solid exch def
11461    solid issolid not {
11462       (Erreur : mauvais type d argument dans writeobjfile) ==
11463       quit
11464    } if
11465    /n solid solidnombresommets def
11466    str (w) file /lefichier exch def
11467    0 1 n 1 sub {
11468       /i exch def
11469       solid i solidgetsommet
11470       /z exch def
11471       /y exch def
11472       /x exch def
11473       lefichier (v ) writestring
11474       lefichier x chaine cvs writestring
11475       lefichier 32 write %% espace
11476       lefichier y chaine cvs writestring
11477       lefichier 32 write %% espace
11478       lefichier z chaine cvs writestring
11479       lefichier 10 write %% CR
11480    } for
11481    /n solid solidnombrefaces def
11482    0 1 n 1 sub {
11483       /i exch def
11484       lefichier (f ) writestring
11485       /F solid i solidgetface {1 add} apply def
11486       F {
11487          lefichier exch
11488          chaine cvs writestring
11489          lefichier  32  write %% espace
11490       } apply
11491       lefichier  10  write %% CR
11492    } for
11493    lefichier closefile
11494 end
11495 } def
11496
11497 %%%%% ### writeofffile ###
11498 %% syntaxe : solid str writeobjfile -> -
11499 /writeofffile {
11500 12 dict begin
11501    /str exch (.off) append def
11502    /solid exch def
11503    solid issolid not {
11504       (Erreur : mauvais type d argument dans writeofffile) ==
11505       quit
11506    } if
11507    /n solid solidnombresommets def
11508    /nf solid solidnombrefaces def
11509    str (w) file /lefichier exch def
11510    lefichier (OFF) writestring
11511    lefichier 10 write %% CR
11512    lefichier n chaine cvs writestring
11513    lefichier 32 write %% espace
11514    lefichier nf chaine cvs writestring
11515    lefichier 32 write %% espace
11516    lefichier 0 chaine cvs writestring
11517    lefichier 10 write %% CR
11518    0 1 n 1 sub {
11519       /i exch def
11520       solid i solidgetsommet
11521       /z exch def
11522       /y exch def
11523       /x exch def
11524       lefichier z chaine cvs writestring
11525       lefichier 32 write %% espace
11526       lefichier y chaine cvs writestring
11527       lefichier 32 write %% espace
11528       lefichier x chaine cvs writestring
11529       lefichier 10 write %% CR
11530    } for
11531    0 1 nf 1 sub {
11532       /i exch def
11533       /F solid i solidgetface def
11534       lefichier F length chaine cvs writestring
11535       lefichier 32 write %% espace
11536       F {
11537          lefichier exch
11538          chaine cvs writestring
11539          lefichier  32  write %% espace
11540       } apply
11541       lefichier  10  write %% CR
11542    } for
11543    lefichier closefile
11544 end
11545 } def
11546
11547 %%%%% ### newobjfile ###
11548 /newobjfile {
11549 3 dict begin
11550    /objfilename exch (.obj) append def
11551    /v {} def
11552    /ok true def
11553    /f {
11554        ok {
11555         %% 1ere fois
11556            ] %% ferme les sommets
11557         [ [ %% ouvre les faces
11558         /ok false store
11559        } {
11560         %% les autres fois
11561            ] %% ferme la face
11562         [ %% ouvre la nouvelle
11563        } ifelse
11564    } def
11565    [ 0 0 0 %% sommet fantome pour respecter l'indexation (a partir de l'indice 1)
11566    objfilename run
11567    ]]
11568    /F exch def
11569    /S exch def
11570
11571    S F generesolid
11572 %   dup videsolid
11573 end
11574 } def
11575
11576 %%%%% ### newofffile ###
11577 /newofffile {
11578 3 dict begin
11579    /str 35 string def
11580    /offfilename exch (.off) append def
11581    offfilename (r) file
11582    /offfile exch def
11583    offfile str readline pop pop
11584    offfile str readline pop
11585    numstr2array
11586    dup 0 get /ns exch def
11587    1 get /nf exch def
11588    [ns {
11589       offfile str readline pop numstr2array aload pop
11590       3 1 roll
11591    } repeat]
11592    /S exch def
11593    [nf {
11594       [
11595       offfile str readline pop numstr2array
11596       /table exch def
11597       1 1 table length 1 sub {
11598          /i exch def
11599          table i get
11600       } for
11601       ]
11602    } repeat]
11603    /F exch def
11604
11605    S F generesolid
11606 %   dup videsolid
11607 end
11608 } def
11609
11610 %%%%% ### newtube ###
11611  /tub@dernierk1 [1 0 0] def
11612  /tub@dernierk2 [0 1 0] def
11613  /tub@dernierk3 [0 0 1] def
11614
11615 /inittube {
11616 2 dict begin
11617    normalize3d /vect3 defpoint3d
11618    normalize3d /vect2 defpoint3d
11619    normalize3d /vect1 defpoint3d
11620    vect1 norme3d 0 eq {
11621       vect2 vect3 vectprod3d /vect1 defpoint3d
11622    } if
11623    vect2 norme3d 0 eq {
11624       vect3 vect1 vectprod3d /vect2 defpoint3d
11625    } if
11626    vect3 norme3d 0 eq {
11627       vect1 vect2 vectprod3d /vect3 defpoint3d
11628    } if
11629    /tub@dernierk1 [vect1] store
11630    /tub@dernierk2 [vect2] store
11631    /tub@dernierk3 [vect3] store
11632 end
11633 } def
11634  
11635 %% syntaxe : tmin tmax (f) array r newtube -> solid
11636 %% array = [K N]
11637 /newtube {
11638 10 dict begin
11639    /table exch def
11640    /K table 0 get def %% nb d etages
11641    /N table 1 get def %% nb de points sur le perimetre
11642    /@r exch def       %% le rayon du tube
11643    /str exch def
11644    /lafonction str cvx def
11645    /laderivee str (') append cvx def
11646 %%   /laderivee2nd str ('') append cvx def
11647    /tmax exch def
11648    /tmin exch def
11649    /pas tmax tmin sub K 1 sub div def
11650
11651    %% definition des sommets
11652    [
11653    /@k 0 def
11654    K {
11655       /a0 tmin @k pas mul add def
11656    
11657       %% definition du repere de Frenet (k1, k2, k3) au point f(a)
11658       a0 lafonction /M defpoint3d
11659
11660       str (') append cvlit where {
11661          pop 
11662          a0 laderivee normalize3d /k1 defpoint3d
11663 %         pop /avecderiv true def
11664       } {
11665          M a0 pas 100 div add lafonction vecteur3d normalize3d /k1 defpoint3d
11666 %         /avecderiv false
11667       } ifelse
11668
11669       k1 baseplannormal /K3 defpoint3d /K2 defpoint3d
11670 %      a0 laderivee2nd normalize3d /k2 defpoint3d
11671
11672       %% projete orthogonal du dernier rayon sur le plan actuel
11673       %% (normal a la vitesse)
11674       K2 tub@dernierk2 aload pop K2 scalprod3d mulv3d 
11675       K3 tub@dernierk2 aload pop K3 scalprod3d mulv3d addv3d /k2 defpoint3d
11676 %      M k1 K2 K3 dessinebase
11677       k1 norme3d 0 eq {
11678          tub@dernierk1 aload pop /k1 defpoint3d
11679       } {
11680          /tub@dernierk1 [k1] store
11681       } ifelse
11682       k2 norme3d 0 eq {
11683          tub@dernierk2 aload pop /k2 defpoint3d
11684       } {
11685          /tub@dernierk2 [k2] store
11686       } ifelse
11687       k1 k2 vectprod3d normalize3d /k3 defpoint3d
11688       k3 norme3d 0 eq {
11689           tub@dernierk3 aload pop /k3 defpoint3d
11690       } {
11691          /tub@dernierk3 [k3] store
11692       } ifelse
11693       k3 k1 vectprod3d normalize3d /k2 defpoint3d
11694 %%      M k1 k2 k3 dessinebase
11695       /tub@dernierk2 [k2] store
11696       /@n 360 N div def %% le pas angulaire
11697       0 @n 360 @n sub {
11698          /@i exch def
11699          M
11700          k2 @i cos @r mul mulv3d addv3d
11701          k3 @i sin @r mul mulv3d addv3d
11702       } for
11703       /@k @k 1 add store
11704    } repeat
11705    ]
11706
11707    dup length 3 idiv /nb exch def
11708    %% definition des faces
11709    [
11710       %% face de depart
11711       [N 1 sub -1 0 {} for]
11712       %% face d arrivee
11713       [nb 1 sub N 1 sub {dup 1 sub} repeat] reverse
11714    
11715       %% les etages
11716       /j 0 def
11717       K 1 sub {
11718          0 1 N 1 sub {
11719             /i exch def
11720             [
11721                i                   N j mul add
11722                i 1 add N mod       N j mul add
11723                i 1 add N mod N add N j mul add
11724                i N add             N j mul add
11725             ]
11726          } for
11727          /j j 1 add store
11728       } repeat
11729    ]
11730    generesolid
11731 end
11732 } def
11733
11734 %%%%% ### newcourbe ###
11735 %% syntaxe : a b {f} array newcourbe --> solid
11736 /newcourbe {
11737 10 dict begin
11738    dup xcheck not {
11739       0 get /n exch def
11740    } {
11741       /n 80 def
11742    } ifelse
11743    /l@f@nct exch def
11744    /b exch def
11745    /a exch def
11746    /pas b a sub n 1 sub div def
11747    /S [
11748    0 1 n 1 sub {
11749       /@i exch def
11750       a @i pas mul add
11751       l@f@nct
11752       pstrickactionR3
11753    } for
11754    ] def
11755    /@F [
11756       0 1 n 2 sub {
11757          /@i exch def
11758          [@i @i 1 add]
11759       } for
11760    ] def
11761    S @F generesolid
11762 end
11763 } def
11764
11765 %%%%% ### baseplannormal ###
11766 %% syntaxe : x y z baseplannormal -> x1 y1 z1 x2 y2 z2
11767 /baseplannormal {
11768 5 dict begin
11769    /K defpoint3d
11770    1 0 0 K vectprod3d normalize3d /U defpoint3d
11771    U norme3d 0 eq {
11772       0 1 0 K vectprod3d normalize3d /U defpoint3d
11773    } if
11774    K U vectprod3d normalize3d /V defpoint3d
11775    U V
11776 end
11777 } def
11778
11779 %%%%% ### fin insertion ###
11780
11781 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11783 %%%%                                                    %%%%
11784 %%%%      fin insertion librairie jps                   %%%%
11785 %%%%                                                    %%%%
11786 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11787 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11788
11789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11790 %%%%          gestion de chaine de caracteres           %%%%
11791 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11792
11793 /Times-Roman findfont 
11794 dup length dict begin
11795    {
11796    1 index /FID ne 
11797       {def}
11798       {pop pop} 
11799    ifelse
11800    } forall
11801    /Encoding ISOLatin1Encoding def
11802    currentdict
11803 end
11804 /Times-Roman-ISOLatin1 exch definefont pop
11805
11806 /setTimesRoman {
11807    /Times-Roman-ISOLatin1 findfont 
11808    fontsize scalefont 
11809    setfont
11810 } def
11811
11812 /setTimes {
11813    setTimesRoman
11814 } def
11815
11816 %% syntaxe : string x y cctext
11817 /cctext {
11818 5 dict begin
11819    /y exch def
11820    /x exch def
11821    /str exch def
11822    str stringwidth
11823    /wy exch def
11824    /wx exch def
11825    gsave
11826       x y smoveto
11827       wx -2 div wy -2 div rmoveto
11828       str show
11829    grestore
11830 end
11831 } def
11832
11833 /dbtext {gsave newpath dbtext_ Fill grestore} def
11834 /dctext {gsave newpath dctext_ Fill grestore} def
11835 /dltext {gsave newpath dltext_ Fill grestore} def
11836 /drtext {gsave newpath drtext_ Fill grestore} def
11837
11838 /bbtext {gsave newpath bbtext_ Fill grestore} def
11839 /bctext {gsave newpath bctext_ Fill grestore} def
11840 /bltext {gsave newpath bltext_ Fill grestore} def
11841 /brtext {gsave newpath brtext_ Fill grestore} def
11842
11843 /cbtext {gsave newpath cbtext_ Fill grestore} def
11844 /cctext {gsave newpath cctext_ Fill grestore} def
11845 /cltext {gsave newpath cltext_ Fill grestore} def
11846 /crtext {gsave newpath crtext_ Fill grestore} def
11847
11848 /ubtext {gsave newpath ubtext_ Fill grestore} def
11849 /uctext {gsave newpath uctext_ Fill grestore} def
11850 /ultext {gsave newpath ultext_ Fill grestore} def
11851 /urtext {gsave newpath urtext_ Fill grestore} def
11852
11853
11854 %% syntaxe : str x y show_dim --> str x y llx lly wx wy 
11855 %% attention, doit laisser la pile intacte
11856 /show_dim {
11857    3 copy pop pop
11858    newpath
11859       0 0 moveto
11860       true charpath flattenpath pathbbox 
11861    closepath
11862    newpath
11863 } def
11864
11865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11866 %%%%             procedures pour PSTricks               %%%%
11867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11868
11869 %%% les 3 procedures utilisees pour transformer les depots de AlgToPs en nombres
11870 /pstrickactionR3 { 
11871 3 dict begin 
11872   /len@3 exch def 
11873   /len@2 exch def 
11874   /len@1 exch def 
11875   len@1 exec 
11876   len@2 exec 
11877   len@3 exec 
11878 end 
11879 } def 
11880
11881 /pstrickactionR2 {
11882    exec exch exec exch
11883 } def
11884
11885 /pstrickactionR {
11886    exec
11887 } def
11888
11889 /gere_pst-deffunction {
11890    counttomark
11891    dup 1 eq {
11892       pop
11893       pstrickactionR
11894       ] aload pop
11895    } {
11896       2 eq {
11897          pstrickactionR2
11898          ] aload pop
11899       } {
11900          pstrickactionR3
11901          ] aload pop
11902       } ifelse
11903    } ifelse
11904 } def
11905
11906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11907 %%%%             procedures pour \psSolid               %%%%
11908 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11909
11910 /all (all) def
11911
11912 /draw {drawsolid} def
11913 /draw* {drawsolid*} def
11914 /draw** {drawsolid**} def
11915 /writeobj {solidfilename writeobjfile} def
11916 /writesolid {solidfilename writesolidfile} def
11917 /writeoff {solidfilename writeofffile} def
11918 /none {pop} def
11919 /vecteur_en_c@urs false def
11920
11921 /gere_pstricks_color_inout {
11922    gsave
11923       dup  [fillincolor] (setrgbcolor) astr2str
11924          [fillcolor] (setrgbcolor) astr2str inoutputcolors
11925    grestore
11926 } def
11927
11928 /gere_pstricks_color_out {
11929    gsave
11930       dup  [fillcolor] (setrgbcolor) astr2str outputcolors
11931    grestore
11932 } def
11933
11934 /gere_pstricks_opt {
11935 %   /CourbeR2 {CourbeR2+} def
11936    linecolor
11937    linestyle
11938    solidlinewidth setlinewidth
11939    solidtrunc length 0 ne {
11940       solidtrunc 0 get isstring {
11941          dup trunccoeff solidtronque
11942       } {
11943          dup solidtrunc trunccoeff solidtronque
11944       } ifelse
11945    } if
11946    solidgeode {
11947       1 newgeode
11948    } if
11949    soliddualreg {
11950       dualpolyedreregulier
11951    } if
11952    chanfrein {
11953       dup chanfreincoeff solidchanfreine
11954    } if
11955    RotX 0 ne RotY 0 ne or RotZ 0 ne or {
11956       {RotX RotY RotZ rotateOpoint3d} solidtransform
11957    } if
11958    CX 0 ne CY 0 ne or CZ 0 ne or {
11959       {CX CY CZ translatepoint3d} solidtransform
11960    } if
11961    plansection length 0 gt {
11962       0 1 plansection length 1 sub {
11963          /i exch def
11964          plansection i get solidplansection
11965          dup 0 solidrmface
11966       } for
11967    } if
11968    /rmfaces rmfaces bubblesort reverse store
11969    0 1 rmfaces length 1 sub {
11970       /i exch def
11971       dup rmfaces i get solidrmface
11972    } for
11973    tx@Dict /pst-transformoption known {
11974       dup {pst-transformoption} solidtransform 
11975    } if
11976    solidaffinage length 0 ne {
11977       %% si on affine, il faut colorier avant
11978       activationgestioncouleurs {
11979          gere_pstricks_color_out
11980       } if
11981       solidaffinage 0 get isstring {
11982          dup affinagecoeff
11983          /solidfcolor where {
11984             pop
11985             solidfcolor
11986          } if
11987          affinagerm solidaffine
11988       } {
11989          dup affinagecoeff solidaffinage
11990          /solidfcolor where {
11991             pop
11992             solidfcolor
11993          } if
11994          affinagerm solidaffine
11995       } ifelse
11996       %% et il faut evider et coloriier l'interieur si necessaire
11997       solidhollow {
11998          dup videsolid
11999          activationgestioncouleurs {
12000             gsave
12001                dup  [fillincolor] (setrgbcolor) astr2str inputcolors
12002             grestore
12003          } if
12004       } if
12005       /activationgestioncouleurs false def
12006    } if
12007    tx@Dict /plansepare known {
12008       plansepare solidplansepare
12009       tx@Dict /plansepare undef
12010       tx@Dict /solidname known {
12011          solidname (1) append cvlit exch def
12012          dup solidname (0) append cvlit exch def
12013          %%
12014          solidname (1) append cvx exec
12015          solidhollow {
12016             dup videsolid
12017          } if
12018          activationgestioncouleurs {
12019             dup solidwithinfaces {
12020                gere_pstricks_color_inout 
12021             } {
12022                gere_pstricks_color_out
12023             } ifelse
12024          } if
12025          solidinouthue length 0 gt { 
12026             dup solidinouthue solidputinouthuecolors 
12027          } {
12028             solidhue length 0 gt {
12029                dup solidhue solidputhuecolors
12030             } if
12031             solidinhue length 0 gt {
12032                dup solidinhue solidputinhuecolors
12033             } if
12034          } ifelse
12035          pop
12036          tx@Dict /solidname undef
12037       } {
12038          /solid1 exch def
12039          /solid2 exch def
12040       } ifelse
12041    } if
12042    solidhollow {
12043       dup videsolid
12044    } if
12045    activationgestioncouleurs {
12046       dup solidwithinfaces {
12047          gere_pstricks_color_inout 
12048       } {
12049          gere_pstricks_color_out
12050       } ifelse
12051       solidinouthue length 0 gt { 
12052          dup solidinouthue solidputinouthuecolors 
12053       } {
12054          solidhue length 0 gt {
12055             dup solidhue solidputhuecolors
12056          } if
12057          solidinhue length 0 gt {
12058             dup solidinhue solidputinhuecolors
12059          } if
12060       } ifelse
12061    } if
12062
12063    0 1 fcol length 2 idiv 1 sub {
12064       /i exch def 
12065       dup fcol 2 i mul get fcol 2 i mul 1 add get solidputfcolor
12066    } for
12067    vecteur_en_c@urs not {
12068       /lightsrc where {pop solidlightOn} if
12069    } {
12070       /vecteur_en_c@urs false def
12071    } ifelse
12072    dup action cvx exec
12073    noir
12074    solidnumf length 0 ne {
12075       solidnumf 0 get isstring {
12076          dup projectionsifacevisible solidnumfaces
12077       } {
12078          dup solidnumf projectionsifacevisible solidnumfaces
12079       } ifelse
12080    } if
12081    solidshow length 0 ne {
12082       solidshow 0 get isstring {
12083          dup solidshowsommets
12084       } {
12085          dup solidshow solidshowsommets
12086       } ifelse
12087    } if
12088    solidnum length 0 ne {
12089       solidnum 0 get isstring {
12090          dup solidnumsommets
12091       } {
12092          dup solidnum solidnumsommets
12093       } ifelse
12094    } {
12095       %% pop
12096    } ifelse
12097    tx@Dict /solidname known {
12098       solidname cvlit exch bind def
12099       tx@Dict /solidname undef
12100    } {
12101       pop
12102    } ifelse
12103 } def
12104
12105 /pst-octahedron {
12106    a newoctaedre
12107    gere_pstricks_opt
12108 } def
12109
12110 /pst-dodecahedron {
12111    a newdodecaedre
12112    gere_pstricks_opt
12113 } def
12114
12115 /pst-icosahedron {
12116    a newicosaedre
12117    gere_pstricks_opt
12118 } def
12119
12120 /pst-cube {
12121    a
12122    ngrid length 1 eq {
12123       ngrid
12124    } {
12125       {Mode}
12126    } ifelse
12127    newcube 
12128 %%    solidhollow {
12129 %%       dup videsolid
12130 %%    } if
12131    gere_pstricks_opt
12132 } def
12133
12134 /pst-parallelepiped {
12135    a b c
12136    newparallelepiped
12137    gere_pstricks_opt
12138 } def
12139
12140 /pst-tetrahedron {
12141    r newtetraedre
12142    gere_pstricks_opt
12143 } def
12144
12145 /pst-tore {
12146    r0 r1
12147    ngrid length 2 eq {
12148       ngrid
12149    } {
12150       {Mode}
12151    } ifelse
12152    newtore
12153    gere_pstricks_opt
12154 } def
12155
12156 /pst-sphere {
12157    % rayon
12158    % mode
12159   %   r {Mode} newsphere
12160    r
12161    ngrid length 2 eq {
12162       ngrid
12163    } {
12164       {Mode}
12165    } ifelse
12166    newsphere
12167    gere_pstricks_opt
12168 } def
12169
12170 /pst-cylindre {
12171    /save-cylinderhollow solidhollow def
12172    tx@Dict /function known {
12173       range aload pop function cvx {axe} h ngrid newcylindre
12174       tx@Dict /function undef
12175       /solidhollow true def
12176    } {
12177       % rayon
12178       % mode
12179       0 r h
12180       ngrid length 2 eq {
12181          ngrid
12182       } {
12183          {Mode}
12184       } ifelse
12185       newcylindre
12186       solidhollow {
12187          dup creusesolid
12188       } if
12189    } ifelse
12190    gere_pstricks_opt
12191    /solidhollow save-cylinderhollow store
12192 } def
12193
12194 /pst-cylindrecreux {
12195    % rayon
12196    % mode
12197    0 r h
12198    ngrid length 2 eq {
12199       ngrid
12200    } {
12201       {Mode}
12202    } ifelse
12203    newcylindre
12204    dup creusesolid
12205    gere_pstricks_opt
12206 } def
12207
12208 /pst-cone {
12209    /save-conehollow solidhollow def
12210    tx@Dict /function known {
12211       range aload pop function cvx {origin} ngrid newcone
12212       tx@Dict /function undef
12213       /solidhollow true def
12214    } {
12215       % rayon
12216       % mode
12217       0 r h
12218       ngrid length 2 eq {
12219          ngrid
12220       } {
12221          {Mode}
12222       } ifelse
12223       solidhollow {
12224          newconecreux
12225       } {
12226          newcone
12227       } ifelse
12228    } ifelse
12229    gere_pstricks_opt
12230    /solidhollow save-conehollow store
12231 } def
12232
12233 /pst-tronccone {
12234    % rayon
12235    % mode
12236    0 r0 h r1
12237    ngrid length 2 eq {
12238       ngrid
12239    } {
12240       {Mode}
12241    } ifelse
12242    solidhollow {
12243       newtroncconecreux
12244    } {
12245       newtronccone
12246    } ifelse
12247    gere_pstricks_opt
12248 } def
12249
12250 /pst-troncconecreux {
12251    % rayon
12252    % mode
12253    0 r0 h r1
12254    ngrid length 2 eq {
12255       ngrid
12256    } {
12257       {Mode}
12258    } ifelse
12259    newtroncconecreux
12260    gere_pstricks_opt
12261 } def
12262
12263 /pst-conecreux {
12264    % rayon
12265    % mode
12266    0 r h
12267    ngrid length 2 eq {
12268       ngrid
12269    } {
12270       {Mode}
12271    } ifelse
12272    newconecreux
12273    gere_pstricks_opt
12274 } def
12275
12276 /pst-anneau {
12277    [ section ]
12278    ngrid length 1 ge {
12279       [ngrid 0 get]
12280    } {
12281       [24]
12282    } ifelse
12283    newanneau
12284    gere_pstricks_opt
12285 } def
12286
12287
12288 /pst-prisme {
12289    % tableau des points de la base
12290    % h hauteur du prisme
12291    % axe : vecteur direction de l axe
12292    base decal rollparray
12293    0 h axe
12294    ngrid length 1 ge {
12295       [ngrid 0 get]
12296    } if
12297    newprisme
12298    solidhollow {
12299       dup creusesolid
12300    } if
12301    gere_pstricks_opt
12302 } def
12303
12304 /pst-prismecreux {
12305    % tableau des points de la base
12306    % h hauteur du prisme
12307    % axe : vecteur direction de l axe
12308    base
12309    0 h axe
12310    ngrid length 1 ge {
12311       [ngrid 0 get]
12312    } if
12313    newprisme
12314    dup creusesolid
12315    gere_pstricks_opt
12316 } def
12317
12318 /pst-grille {
12319    base aload pop
12320    ngrid length 2 ge {
12321       [ngrid 0 get ngrid 1 get]
12322    } {
12323       ngrid length 1 eq {
12324          [ngrid 0 get dup]
12325       } if
12326    } ifelse
12327    newgrille
12328    gere_pstricks_opt
12329 } def
12330
12331 %% syntaxe : array N h u newruban -> solid d axe (O, u),
12332 /pst-ruban {
12333    % tableau des points de la base
12334    % h hauteur du prisme
12335    % axe : vecteur direction de l axe
12336    base
12337    h axe 
12338    ngrid length 1 ge {
12339       [ngrid 0 get]
12340    } if
12341    newruban
12342    gere_pstricks_opt
12343 } def
12344
12345 %% syntaxe : r phi option newcalottesphere -> solid
12346 /pst-calottesphere {
12347    % rayon
12348    % mode
12349    % r phi theta option newcalottesphere
12350    r
12351    phi theta
12352    ngrid length 2 eq {
12353       ngrid
12354    } {
12355       {Mode}
12356    } ifelse
12357    solidhollow {
12358       newcalottespherecreuse
12359    } {
12360       newcalottesphere
12361    } ifelse
12362    gere_pstricks_opt
12363 } def
12364
12365 %% syntaxe : r phi option newcalottesphere -> solid
12366 /pst-calottespherecreuse {
12367    % rayon
12368    % mode
12369    % r phi theta option newcalottespherecreuse
12370    r
12371    phi theta
12372    ngrid length 2 eq {
12373       ngrid
12374    } {
12375       {Mode}
12376    } ifelse
12377    newcalottespherecreuse
12378    gere_pstricks_opt
12379 } def
12380
12381 /pointtest{2 2 2} def
12382
12383 /pst-face {
12384    % tableau des points de la base
12385    % h hauteur du prisme
12386    % axe : vecteur direction de l axe
12387    base
12388    solidbiface {
12389       newbiface
12390    } {
12391       newmonoface 
12392    } ifelse
12393    gere_pstricks_opt
12394 } def
12395
12396 /pst-surface {
12397    base
12398    base aload pop
12399    ngrid length 2 ge {
12400       [ngrid 0 get ngrid 1 get]
12401    } {
12402       ngrid length 1 eq {
12403          [ngrid 0 get dup]
12404       } ifelse
12405    } ifelse
12406    {f} newsurface
12407    solidbiface {
12408       dup videsolid
12409    } if
12410    gere_pstricks_opt
12411 } def
12412
12413 /pst-polygoneregulier {
12414    r ngrid 0 get
12415    newpolreg
12416    solidbiface {
12417    } {
12418       dup 1 solidrmface
12419    } ifelse
12420    gere_pstricks_opt
12421 } def
12422
12423 /pst-fusion {
12424 1 dict begin
12425    /activationgestioncouleurs false def
12426    /n base length def
12427    base aload pop n 1 sub {solidfuz} repeat
12428    gere_pstricks_opt
12429 end
12430 } def
12431
12432 /pst-new {
12433    sommets faces
12434    generesolid
12435 %%    solidhollow {
12436 %%       dup videsolid
12437 %%    } if
12438    gere_pstricks_opt
12439 } def
12440
12441 /pst-courbe {
12442    solidlinewidth setlinewidth
12443    r 0 eq {
12444       range aload pop function cvx [resolution] newcourbe
12445       gere_pstricks_opt
12446    } {
12447       range aload pop function r ngrid newtube
12448       gere_pstricks_opt %% r function [36 12] newtube
12449    } ifelse
12450 } def
12451
12452 /pst-surfaceparametree {
12453    base aload pop
12454    ngrid length 2 ge {
12455       [ngrid 0 get ngrid 1 get]
12456    } {
12457       ngrid length 1 eq {
12458          [ngrid 0 get dup]
12459       } if
12460    } ifelse
12461    { function cvx exec } newsurfaceparametree
12462    dup videsolid
12463    gere_pstricks_opt
12464 } def
12465
12466 /pst-surface* {
12467    r
12468    ngrid length 2 ge {
12469       [ngrid 0 get ngrid 1 get]
12470    } {
12471       ngrid length 1 eq {
12472          [ngrid 0 get dup]
12473       } if
12474    } ifelse
12475    { function cvx exec } newsurface*
12476    dup videsolid
12477    gere_pstricks_opt
12478 } def
12479
12480 /pst-vecteur {
12481 gsave
12482    /activationgestioncouleurs false def
12483    /vecteur_en_c@urs true def
12484    solidlinewidth setlinewidth
12485    2 setlinejoin
12486    1 setlinecap
12487    linecolor
12488    linestyle
12489    tx@Dict /solidname known {
12490       texte args definition cvx exec
12491       solidname cvlit exch defpoint3d
12492       tx@Dict /solidname undef
12493    } if
12494    args definition cvx exec newvecteur
12495    dup
12496    gsave
12497       [linecolor currentrgbcolor] ( ) astr2str (setrgbcolor) append 
12498       outputcolors
12499    grestore
12500    gere_pstricks_opt
12501 grestore
12502 } def
12503
12504 %/pst-vect- {} def
12505 %/pst-vect-2points {vecteur3d} def
12506 /pst-line {
12507    gsave
12508       linestyle 
12509       linecolor
12510       [args] ligne3d
12511    grestore
12512 } def
12513
12514 /pst-objfile {
12515    solidfilename newobjfile
12516    gere_pstricks_opt
12517 } def
12518
12519 /pst-offfile {
12520    solidfilename newofffile
12521    gere_pstricks_opt
12522 } def
12523
12524 /pst-datfile {
12525    solidfilename readsolidfile
12526 %   /activationgestioncouleurs false def
12527    gere_pstricks_opt
12528 } def
12529
12530 /pst-plantype {
12531 %   args definition
12532    args (pst-plan-) definition append cvx exec
12533    dup phi rotateplan
12534    base length 4 eq {
12535       dup base planputrange
12536    } if
12537    origin eqpl@n pointeqplan 0 eq {
12538       dup origin planputorigine
12539    } if
12540    ngrid length 0 ne {
12541       dup ngrid planputngrid
12542    } if
12543    tx@Dict /solidname known {
12544       solidname cvlit exch bind def
12545       tx@Dict /solidname undef
12546    } {
12547       pop
12548    } ifelse
12549 } def
12550 /pst-plan- {pst-plan-plantype} def
12551
12552 %x0 y0 z0 [normalvect] norm2plan
12553 /pst-plan-plantype {
12554    dup plan2eq /eqpl@n exch def
12555    /plan-@k true def
12556 } def
12557
12558 /pst-plan {
12559 %   args definition
12560    args (pst-plan-) definition append cvx exec
12561    /pl@n-en-cours true def
12562    definition length 0 ne {
12563 %   plan-@k not {
12564       dup
12565       base 0 get base 1 get lt
12566       base 2 get base 3 get lt and {
12567          base
12568       } {
12569          [-3 3 -2 2] %pop base %aload pop boum
12570       } ifelse
12571       planputrange
12572       origin eqpl@n pointeqplan 0 eq {
12573          dup origin planputorigine
12574       } if
12575       CX isreal
12576       CX 0 eq and
12577       CY isreal and
12578       CY 0 eq and
12579       CZ isreal and
12580       CZ 0 eq and not {
12581          dup CX CY CZ planputorigine
12582       } if
12583       /CX 0. def
12584       /CY 0. def
12585       /CZ 0. def
12586       ngrid length 0 ne {
12587          dup ngrid planputngrid
12588       } if
12589    } if
12590 %   dup RotX RotY RotZ rotateOplan
12591    dup phi rotateplan
12592    /l@pl@n exch def
12593    tx@Dict /solidname known {
12594       l@pl@n solidname cvlit exch bind def
12595       /solidname solidname (_s) append store
12596    } if
12597    l@pl@n newplan
12598    gere_pstricks_opt
12599    /pl@n-en-cours false def
12600 %   action ==
12601 %   noir
12602    l@pl@n RotX RotY RotZ rotateOplan
12603 %   l@pl@n CX CY CZ plantranslate
12604    fontsize setfontsize
12605    setTimes
12606    solidplanmarks {l@pl@n projectionsifacevisible planmarks} if
12607    solidplangrid {linecolor l@pl@n projectionsifacevisible planquadrillage} if
12608    solidshowbase {l@pl@n projectionsifacevisible planshowbase} if
12609    solidshowbase3d {l@pl@n projectionsifacevisible planshowbase3d} if
12610 } def
12611
12612
12613 /pst-plan-normalpoint {
12614    /plan-@k false def
12615    norm2plan
12616    dup plan2eq /eqpl@n exch def
12617 } def
12618
12619 /pst-plan-equation {
12620    /plan-@k false def
12621    dup isarray {
12622       dup /eqpl@n exch def
12623    } {
12624       2 copy pop /eqpl@n exch def
12625    } ifelse
12626    eq2plan 
12627 } def
12628
12629 /pst-plan-solidface {
12630    /plan-@k false def
12631    solidface2plan
12632    CX isreal
12633    CX 0 eq and
12634    CY isreal and
12635    CY 0 eq and
12636    CZ isreal and
12637    CZ 0 eq and not {
12638       dup CX CY CZ planputorigine
12639    } if
12640    
12641 %   dup plangetrange aload pop boum
12642 %   dup origin planputorigine
12643    dup plan2eq /eqpl@n exch def
12644 } def
12645
12646 /pst-geode {
12647    ngrid aload pop newgeode
12648    gere_pstricks_opt
12649 } def
12650
12651 /pst-load {
12652    solidloadname 
12653 %   /activationgestioncouleurs false def
12654    gere_pstricks_opt
12655 } def
12656
12657 /pst-point {
12658 gsave
12659    fontsize setfontsize
12660    setTimes
12661    linecolor
12662    action (none) eqstring not {
12663       args definition cvx exec point3d
12664    } if
12665    texte args definition cvx exec pos (text3d) append cvx exec
12666    tx@Dict /solidname known {
12667       texte args definition cvx exec
12668       solidname cvlit defpoint3d
12669       tx@Dict /solidname undef
12670    } if
12671 grestore
12672 } def
12673
12674 %% syntaxe : alpha beta r h newpie --> solid
12675 /pst-pie {
12676    phi theta r h 
12677    ngrid length 2 ge {
12678       [ngrid 0 get ngrid 1 get]
12679    } if
12680    newpie
12681    gere_pstricks_opt
12682 } def
12683
12684 /pst-trigospherique {
12685 3 dict begin
12686 gsave
12687    solidlinewidth setlinewidth
12688    linecolor
12689    linestyle
12690    args definition cvx exec
12691 grestore
12692 end
12693 } def
12694
12695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12696 %%%%         procedures pour \psProjection              %%%%
12697 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12698
12699 /gere_pstricks_proj_opt {
12700       /planprojpst where {
12701          pop
12702          planprojpst projectionsifacevisible projpath
12703 %        /planprojpst where pop /planprojpst undef
12704       } {
12705          /solidprojname where {
12706             /solidprojname get noface phi  
12707             xorigine 0 eq
12708             yorigine 0 eq and
12709             zorigine 0 eq and 
12710             xorigine isinteger not and
12711             yorigine isinteger not and
12712             yorigine isinteger not and {
12713             } {
12714                [xorigine yorigine zorigine] (                 ) astr2str 
12715             } ifelse
12716             projectionsifacevisible solidprojpath
12717          } {
12718             xorigine yorigine zorigine [ normale ] projectionsifacevisible planprojpath
12719          } ifelse
12720       } ifelse
12721 } def
12722
12723 /proj-pst-chemin {
12724    solidlinewidth setlinewidth
12725    1 dict begin
12726    newpath
12727       /cercle {cercle_} def
12728       path
12729       linecolor
12730       gere_pstricks_proj_opt
12731    end
12732 } def
12733
12734 /proj-pst-courbeR2 {
12735    l@pl@n plangetrange aload pop 
12736    setyrange setxrange
12737    newpath
12738       xmin ymin l@pl@n pointplan smoveto
12739       xmin ymax l@pl@n pointplan slineto
12740       xmax ymax l@pl@n pointplan slineto
12741       xmax ymin l@pl@n pointplan slineto
12742       xmin ymin l@pl@n pointplan slineto
12743       planprojpst projpath
12744    clip
12745    solidlinewidth setlinewidth
12746    newpath
12747       linecolor
12748       range aload pop { function cvx exec } CourbeR2_
12749       gere_pstricks_proj_opt
12750 } def
12751
12752 /proj-pst-courbe {
12753    l@pl@n plangetrange aload pop 
12754    setyrange setxrange
12755    newpath
12756       xmin ymin l@pl@n pointplan smoveto
12757       xmin ymax l@pl@n pointplan slineto
12758       xmax ymax l@pl@n pointplan slineto
12759       xmax ymin l@pl@n pointplan slineto
12760       xmin ymin l@pl@n pointplan slineto
12761       planprojpst projpath
12762    clip
12763    solidlinewidth setlinewidth
12764    newpath
12765       linecolor
12766       range aload pop {} { function cvx exec } Courbeparam_
12767       gere_pstricks_proj_opt
12768 } def
12769
12770 /proj-pst-point {
12771    [proj-args] length 0 eq {
12772       xorigine yorigine /proj-args defpoint
12773    } if
12774    /projname where {
12775       pop
12776       [proj-args proj-definition cvx exec]
12777       dup 0 getp projname cvlit defpoint
12778       dup length 2 gt {
12779          1 getp projname (0) append cvlit defpoint
12780       } if
12781       /projname where pop /projname undef
12782    } if
12783    proj-action (none) eqstring not {
12784       solidlinewidth setlinewidth
12785       linecolor
12786       [proj-args proj-definition cvx exec] 0 getp point_
12787       gere_pstricks_proj_opt
12788       Stroke
12789    } if
12790 %   1 1 0 0 1 1 Diamond
12791    texte length 0 gt {
12792       proj-fontsize setfontsize
12793       setTimes 
12794       solidlinewidth setlinewidth
12795       newpath
12796       linecolor
12797       texte [proj-args proj-definition cvx exec 0 0 phi neg rotatepoint] 0 getp 
12798       pos (text_) append cvx exec
12799 %%    /planprojpst where {
12800 %%       planprojpst dupplan dup phi rotateplan /planprojpst exch def
12801 %%       pop
12802 %%       xorigine yorigine
12803 %%       0 0 phi neg rotatepoint
12804 %%    } {
12805 %%       0 0
12806 %%    } ifelse
12807       %gere_pstricks_proj_opt
12808       planprojpst dupplan dup phi rotateplan projectionsifacevisible projpath
12809       Fill
12810    } if
12811 } def
12812
12813 /proj-pst-vecteur {
12814    proj-action (none) eqstring not {
12815       planprojpst bprojscene
12816       solidlinewidth setlinewidth
12817       linestyle
12818       linecolor
12819       xorigine yorigine 2 copy proj-args proj-definition cvx exec addv drawvecteur
12820       eprojscene
12821    } if
12822    /projname where {
12823       pop
12824       proj-args proj-definition cvx exec projname cvlit defpoint
12825       /projname where pop /projname undef
12826    } if
12827 } def
12828
12829 /proj-pst-droite {
12830    proj-action (none) eqstring not {
12831       l@pl@n plangetrange aload pop 
12832       setyrange setxrange
12833 %%       newpath
12834 %%          xmin ymin l@pl@n pointplan smoveto
12835 %%          xmin ymax l@pl@n pointplan slineto
12836 %%          xmax ymax l@pl@n pointplan slineto
12837 %%          xmax ymin l@pl@n pointplan slineto
12838 %%          xmin ymin l@pl@n pointplan smoveto
12839 %%       planprojpst projpath
12840 %%       clip
12841       planprojpst bprojscene
12842       solidlinewidth setlinewidth
12843       linestyle
12844       linecolor
12845       proj-args proj-definition cvx exec droite
12846       eprojscene
12847    } if
12848    /projname where {
12849       pop
12850       proj-args proj-definition cvx exec projname cvlit defdroite
12851       /projname where pop /projname undef
12852    } if
12853 } def
12854
12855 /proj-pst-polygone {
12856    proj-action (none) eqstring not {
12857       l@pl@n plangetrange aload pop 
12858       setyrange setxrange
12859       newpath
12860          xmin ymin l@pl@n pointplan smoveto
12861          xmin ymax l@pl@n pointplan slineto
12862          xmax ymax l@pl@n pointplan slineto
12863          xmax ymin l@pl@n pointplan slineto
12864          xmin ymin l@pl@n pointplan slineto
12865          planprojpst projpath
12866       clip
12867       solidlinewidth setlinewidth
12868       linestyle
12869       linecolor
12870       proj-definition length 0 eq {
12871          [proj-args]
12872       } {
12873          proj-args 
12874       } ifelse
12875       proj-definition cvx exec polygone_
12876       planprojpst projectionsifacevisible projpath
12877    } if
12878    /projname where {
12879       pop
12880       proj-definition length 0 eq {
12881          [proj-args]
12882       } {
12883          proj-args 
12884       } ifelse
12885       proj-definition cvx exec projname cvlit exch def
12886       /projname where pop /projname undef
12887    } if
12888 } def
12889
12890 /proj-pst-cercle {
12891    /projname where {
12892       pop
12893       proj-args proj-definition cvx exec projname cvlit defcercle
12894       /projname where pop /projname undef
12895    } if
12896    proj-action (none) eqstring not {
12897       l@pl@n plangetrange aload pop 
12898       setyrange setxrange
12899       newpath
12900          xmin ymin l@pl@n pointplan smoveto
12901          xmin ymax l@pl@n pointplan slineto
12902          xmax ymax l@pl@n pointplan slineto
12903          xmax ymin l@pl@n pointplan slineto
12904          xmin ymin l@pl@n pointplan slineto
12905          planprojpst projpath
12906       clip
12907       solidlinewidth setlinewidth
12908       linestyle
12909       linecolor
12910       newpath
12911       range aload pop proj-args
12912       proj-definition cvx exec Cercle_
12913       planprojpst projectionsifacevisible projpath
12914    } if
12915 } def
12916
12917 /proj-pst-line {
12918    proj-action (none) eqstring not {
12919       l@pl@n plangetrange aload pop 
12920       setyrange setxrange
12921       newpath
12922          xmin ymin l@pl@n pointplan smoveto
12923          xmin ymax l@pl@n pointplan slineto
12924          xmax ymax l@pl@n pointplan slineto
12925          xmax ymin l@pl@n pointplan slineto
12926          xmin ymin l@pl@n pointplan slineto
12927          planprojpst projpath
12928       clip
12929       planprojpst bprojscene
12930       solidlinewidth setlinewidth
12931       linestyle
12932       linecolor
12933       proj-definition length 0 eq {
12934          [proj-args]
12935       } {
12936          proj-args 
12937       } ifelse
12938       proj-definition cvx exec ligne
12939       eprojscene
12940    } if
12941    /projname where {
12942       pop
12943       proj-definition length 0 eq {
12944          [proj-args]
12945       } {
12946          proj-args 
12947       } ifelse
12948       proj-definition cvx exec projname cvlit exch def
12949       /projname where pop /projname undef
12950    } if
12951 } def
12952
12953 /proj-pst-rightangle {
12954    proj-action (none) eqstring not {
12955       planprojpst bprojscene
12956       solidlinewidth setlinewidth
12957       linestyle
12958       linecolor
12959       proj-args proj-definition cvx exec angledroit
12960       eprojscene
12961    } if
12962 } def
12963
12964 /proj-pst-texte {
12965 2 dict begin
12966    proj-fontsize setfontsize
12967    setTimes 
12968    solidlinewidth setlinewidth
12969    newpath
12970    linecolor
12971    texte 
12972    /planprojpst where {
12973       planprojpst dupplan dup phi rotateplan /planprojpst exch def
12974       pop
12975       xorigine yorigine
12976       0 0 phi neg rotatepoint
12977    } {
12978       0 0
12979    } ifelse
12980    pos (text_) append cvx exec
12981    gere_pstricks_proj_opt
12982 Fill
12983 end
12984 } def
12985
12986 % END solides.pro
12987
12988 %%EndProcSet
12989 %%BeginProcSet: cm-super-t1.enc 0 0
12990 % This file is generated from `T1uni.map' and `glyphlist.txt', `gl-other.txt'
12991 %
12992 % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
12993 % LIGKERN quoteleft quoteleft =: quotedblleft ;
12994 % LIGKERN quoteright quoteright =: quotedblright ;
12995 % LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
12996 % LIGKERN greater greater =: guillemotright ;
12997 % LIGKERN f f =: ff ; f i =: fi ; f l =: fl ; ff i =: ffi ; ff l =: ffl ;
12998 %
12999 % LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
13000 % LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
13001 % LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
13002 % LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
13003 % LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
13004 % LIGKERN nine {} * ; * {} nine ;
13005 %
13006 /T1Encoding [
13007 % 0x00
13008 /grave
13009 /acute
13010 /circumflex
13011 /tilde
13012 /dieresis
13013 /hungarumlaut
13014 /ring
13015 /caron
13016 /breve
13017 /macron
13018 /dotaccent
13019 /cedilla
13020 /ogonek
13021 /quotesinglbase
13022 /guilsinglleft
13023 /guilsinglright
13024 % 0x10
13025 /quotedblleft
13026 /quotedblright
13027 /quotedblbase
13028 /guillemotleft
13029 /guillemotright
13030 /endash
13031 /emdash
13032 /afii61664
13033 /perthousandzero % PERTHOUSAND ZERO
13034 /dotlessi
13035 /dotlessj
13036 /ff
13037 /fi
13038 /fl
13039 /ffi
13040 /ffl
13041 % 0x20
13042 /uni2423
13043 /exclam
13044 /quotedbl
13045 /numbersign
13046 /dollar
13047 /percent
13048 /ampersand
13049 /quoteright
13050 /parenleft
13051 /parenright
13052 /asterisk
13053 /plus
13054 /comma
13055 /hyphen
13056 /period
13057 /slash
13058 % 0x30
13059 /zero
13060 /one
13061 /two
13062 /three
13063 /four
13064 /five
13065 /six
13066 /seven
13067 /eight
13068 /nine
13069 /colon
13070 /semicolon
13071 /less
13072 /equal
13073 /greater
13074 /question
13075 % 0x40
13076 /at
13077 /A
13078 /B
13079 /C
13080 /D
13081 /E
13082 /F
13083 /G
13084 /H
13085 /I
13086 /J
13087 /K
13088 /L
13089 /M
13090 /N
13091 /O
13092 % 0x50
13093 /P
13094 /Q
13095 /R
13096 /S
13097 /T
13098 /U
13099 /V
13100 /W
13101 /X
13102 /Y
13103 /Z
13104 /bracketleft
13105 /backslash
13106 /bracketright
13107 /asciicircum
13108 /underscore
13109 % 0x60
13110 /quoteleft
13111 /a
13112 /b
13113 /c
13114 /d
13115 /e
13116 /f
13117 /g
13118 /h
13119 /i
13120 /j
13121 /k
13122 /l
13123 /m
13124 /n
13125 /o
13126 % 0x70
13127 /p
13128 /q
13129 /r
13130 /s
13131 /t
13132 /u
13133 /v
13134 /w
13135 /x
13136 /y
13137 /z
13138 /braceleft
13139 /bar
13140 /braceright
13141 /asciitilde
13142 /hyphen.alt % HANGING HYPHEN
13143 % 0x80
13144 /Abreve
13145 /Aogonek
13146 /Cacute
13147 /Ccaron
13148 /Dcaron
13149 /Ecaron
13150 /Eogonek
13151 /Gbreve
13152 /Lacute
13153 /Lcaron
13154 /Lslash
13155 /Nacute
13156 /Ncaron
13157 /Eng
13158 /Ohungarumlaut
13159 /Racute
13160 % 0x90
13161 /Rcaron
13162 /Sacute
13163 /Scaron
13164 /Scedilla
13165 /Tcaron
13166 /Tcommaaccent
13167 /Uhungarumlaut
13168 /Uring
13169 /Ydieresis
13170 /Zacute
13171 /Zcaron
13172 /Zdotaccent
13173 /IJ
13174 /Idotaccent
13175 /dcroat
13176 /section
13177 % 0xA0
13178 /abreve
13179 /aogonek
13180 /cacute
13181 /ccaron
13182 /dcaron
13183 /ecaron
13184 /eogonek
13185 /gbreve
13186 /lacute
13187 /lcaron
13188 /lslash
13189 /nacute
13190 /ncaron
13191 /eng
13192 /ohungarumlaut
13193 /racute
13194 % 0xB0
13195 /rcaron
13196 /sacute
13197 /scaron
13198 /scedilla
13199 /tcaron
13200 /tcommaaccent
13201 /uhungarumlaut
13202 /uring
13203 /ydieresis
13204 /zacute
13205 /zcaron
13206 /zdotaccent
13207 /ij
13208 /exclamdown
13209 /questiondown
13210 /sterling
13211 % 0xC0
13212 /Agrave
13213 /Aacute
13214 /Acircumflex
13215 /Atilde
13216 /Adieresis
13217 /Aring
13218 /AE
13219 /Ccedilla
13220 /Egrave
13221 /Eacute
13222 /Ecircumflex
13223 /Edieresis
13224 /Igrave
13225 /Iacute
13226 /Icircumflex
13227 /Idieresis
13228 % 0xD0
13229 /Eth
13230 /Ntilde
13231 /Ograve
13232 /Oacute
13233 /Ocircumflex
13234 /Otilde
13235 /Odieresis
13236 /OE
13237 /Oslash
13238 /Ugrave
13239 /Uacute
13240 /Ucircumflex
13241 /Udieresis
13242 /Yacute
13243 /Thorn
13244 /SS % Germandbls
13245 % 0xE0
13246 /agrave
13247 /aacute
13248 /acircumflex
13249 /atilde
13250 /adieresis
13251 /aring
13252 /ae
13253 /ccedilla
13254 /egrave
13255 /eacute
13256 /ecircumflex
13257 /edieresis
13258 /igrave
13259 /iacute
13260 /icircumflex
13261 /idieresis
13262 % 0xF0
13263 /eth
13264 /ntilde
13265 /ograve
13266 /oacute
13267 /ocircumflex
13268 /otilde
13269 /odieresis
13270 /oe
13271 /oslash
13272 /ugrave
13273 /uacute
13274 /ucircumflex
13275 /udieresis
13276 /yacute
13277 /thorn
13278 /germandbls % or /germandbls.alt
13279 ] def
13280
13281 %%EndProcSet
13282 %%BeginProcSet: texps.pro 0 0
13283 %!
13284 TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
13285 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
13286 exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
13287 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
13288 pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
13289 div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
13290 /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
13291 definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
13292 sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
13293 mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
13294 exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
13295 forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
13296 end
13297
13298 %%EndProcSet
13299 %%BeginProcSet: special.pro 0 0
13300 %!
13301 TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
13302 /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
13303 /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
13304 /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
13305 /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
13306 X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
13307 /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
13308 /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
13309 {userdict/md get type/dicttype eq{userdict begin md length 10 add md
13310 maxlength ge{/md md dup length 20 add dict copy def}if end md begin
13311 /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
13312 atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
13313 itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
13314 transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
13315 curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
13316 pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
13317 if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
13318 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
13319 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
13320 yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
13321 neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
13322 noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
13323 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
13324 neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
13325 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
13326 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
13327 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
13328 TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
13329 Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
13330 }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
13331 save N userdict maxlength dict begin/magscale true def normalscale
13332 currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
13333 /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
13334 psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
13335 psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
13336 TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
13337 @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
13338 newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
13339 closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
13340 /@beginspecial{SDict begin/SpecialSave save N gsave normalscale
13341 currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
13342 N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
13343 neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
13344 rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
13345 scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
13346 lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
13347 ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
13348 /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
13349 pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
13350 restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
13351 /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
13352 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
13353 moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
13354 matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
13355 savematrix setmatrix}N end
13356
13357 %%EndProcSet
13358 %%BeginProcSet: color.pro 0 0
13359 %!
13360 TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop
13361 setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll
13362 }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def
13363 /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{
13364 setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{
13365 /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch
13366 known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC
13367 /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC
13368 /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0
13369 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0
13370 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61
13371 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC
13372 /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0
13373 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87
13374 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{
13375 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{
13376 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC
13377 /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0
13378 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0
13379 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90
13380 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC
13381 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0
13382 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0
13383 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{
13384 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{
13385 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC
13386 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0
13387 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC
13388 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0
13389 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1
13390 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11
13391 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0
13392 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0
13393 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC
13394 /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0
13395 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0
13396 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0
13397 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC
13398 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0
13399 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{
13400 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor}
13401 DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70
13402 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0
13403 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1
13404 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end
13405
13406 %%EndProcSet
13407 %%BeginFont: SFRM1000
13408 %!FontType1-1.0: SFRM1000 0.3
13409 %%CreationDate: Wed Sep 12 2001
13410 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13411 % See the file COPYING (GNU General Public License) for license conditions.
13412 % Converted from METAFONT EC/TC and LH fonts:
13413 % ecrm1000, tcrm1000, larm1000, lbrm1000, lcrm1000, rxrm1000.
13414 11 dict begin
13415 /FontInfo 6 dict dup begin
13416 /version (0.3) def
13417 /FullName (Computer Modern Roman) def
13418 /FamilyName (Computer Modern) def
13419 /ItalicAngle 0 def
13420 /isFixedPitch false def
13421 /Weight (Medium) def
13422 end readonly def
13423 /FontName /SFRM1000 def
13424 /Encoding StandardEncoding def
13425 /PaintType 0 def
13426 /FontType 1 def
13427 /FontMatrix [0.001 0 0 0.001 0 0] def
13428 /FontBBox{-189 -321 1456 937}readonly def
13429 currentdict end
13430 currentfile eexec
13431 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13432 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13433 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13434 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13435 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13436 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13437 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13438 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13439 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13440 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13441 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE17ADBB75815
13442 7BF819C45DA64CEAA10062501C3B0FE0387FD5406CBDB17A69376AFED2632E2A
13443 C400D16CA3657327EBBCF7CAC55A62AC9AB3D07691C97D98ABFA2A4C85DB2345
13444 C8773110004A7812B031AB3F9B3AB9C7D0E5A2317931334466110BC5C95CE00C
13445 E1CD16242B71CCB962978DB5B8FB03BB2FED25589D10F8B3861F73DAEE17BC59
13446 B909B17D2510F640D341330CCF08ADF9E3106B0C8BB0D04D5F939FAE21AFE501
13447 4614CBFE82CAEF30ECC2B6B47B373FAB1A828AA3CDF7B59BF013442EEFE267AA
13448 AF153EE99EBE4743CA764DA09185666446630553F3D278E1953BFF08FE477C68
13449 4661A47656EC28B2039365CA017F4F1B6E9F85525565795336F7137CD6A3B915
13450 8DE385C64EDA6B73D489FB7338C23DBE575E588D42B0EE3DB6FBE29CC460BCFF
13451 2CD1B7CE1F259C7CC696E94019AD3E8183EA4A4525499ABBCB06ED61E8A86A8A
13452 7D19918F0464D56D7C7D75085EE53E1A7E6216471473E77E4901277294AE262E
13453 5A97692DB5BA38CA0076B6F4989B3FD5F350F66484E3AD84FFA53803A1F58968
13454 0866CC1AC68E6F645C27A233AAEADA7A412C7D3B5264952A58F7F7615C6A17F6
13455 471485C60607EB281BBBC65460660B90B1BBEEC0AF1A50754FD941C2E88135AE
13456 30195934CA89869D420A6BE98B492BCECE484A55E0557A2D6FA9C40313FAB7EB
13457 99FD04C2959AEE5D59A44EFA71313EF1C4F1E479C02EF08F614BBB421B54B89F
13458 3064A82E89500DA311DF77D9CAE81E58E287BE516AB15FA7F4FBA621F4F90F15
13459 DA162F56664AA594B81273331DBAA2475604BC0F2A13AC1911E23D60CE399FEB
13460 1319BF88B2396DBC7A0CDC15FAC9E0C0F0E7F1B96B0FE2C76D37BD4A38F3659E
13461 4856CB453A783846E199E049A580674100049BED20A5E825997B66CAA56436FD
13462 01E2EF83A37E21CCE83AE1102EC3A99442A63BCF80AE21F5CF2807B77EEE3879
13463 067CD0F020DA7E11834B239EC548D4B89141D8190749ED464DC06C800509497D
13464 15514BBE90E47A17CAC50BB75B7A22FB16072CEE88E0257EDACFB176757ACC94
13465 9C1BDEB937270E42A166741048A5C0F67B7D199DC3D2EC1893
13466 0000000000000000000000000000000000000000000000000000000000000000
13467 0000000000000000000000000000000000000000000000000000000000000000
13468 0000000000000000000000000000000000000000000000000000000000000000
13469 0000000000000000000000000000000000000000000000000000000000000000
13470 0000000000000000000000000000000000000000000000000000000000000000
13471 0000000000000000000000000000000000000000000000000000000000000000
13472 0000000000000000000000000000000000000000000000000000000000000000
13473 0000000000000000000000000000000000000000000000000000000000000000
13474 cleartomark
13475 %%EndFont 
13476 %%BeginFont: SFBX1440
13477 %!FontType1-1.0: SFBX1440 0.3
13478 %%CreationDate: Wed Sep 12 2001
13479 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13480 % See the file COPYING (GNU General Public License) for license conditions.
13481 % Converted from METAFONT EC/TC and LH fonts:
13482 % ecbx1440, tcbx1440, labx1440, lbbx1440, lcbx1440, rxbx1440.
13483 11 dict begin
13484 /FontInfo 6 dict dup begin
13485 /version (0.3) def
13486 /FullName (Computer Modern Bold Extended) def
13487 /FamilyName (Computer Modern) def
13488 /ItalicAngle 0 def
13489 /isFixedPitch false def
13490 /Weight (Bold) def
13491 end readonly def
13492 /FontName /SFBX1440 def
13493 /Encoding StandardEncoding def
13494 /PaintType 0 def
13495 /FontType 1 def
13496 /FontMatrix [0.001 0 0 0.001 0 0] def
13497 /FontBBox{-218 -316 1652 915}readonly def
13498 currentdict end
13499 currentfile eexec
13500 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13501 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13502 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13503 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13504 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13505 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13506 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13507 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13508 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13509 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13510 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1D9F9948B28E5C
13511 88B31806AF1433ACB13EE555D069E50649D3C93032500DE92DCEF42B7487E4A4
13512 1ABF7F6C8F177A4CF5776AFDE02721C8B9F69A7CA769B2466EB4501A7E5683FC
13513 58FFB0982039E9154719C1C110840B2DC207902F8EE3E83464C763A03C52F60D
13514 D7194DA5888BCAFEECA5C0AC8DE6DCA956F1D0E6AABAB6E20F7B64BBC9871543
13515 D62E73F596D732C3A412E916A3EDADAC745BED5D2176C14AF05DC28DBEF5C944
13516 FDFFD52D98A35990F8D5FE21D5DCF5C9900FAFFB698C14E56B6667CF8734534D
13517 8698ABFC9B4BE68E86CC30704F0CE920EF1B2B0F3A73E6FB24B20F9702ED522D
13518 C0854E870B8B81B62B48650AA5E74D2F06FC2BB2E06DAE38B8F0D9D9664C7A10
13519 2DC9E0DA440F8F4DF1FC4532D5EAA610DE6FBA5F839B7645BE2C1B14B0684FCB
13520 2D97C7A8B8BBC478B454BFD2805DAA4324F87F4A9206931E71D5BD825F0F2220
13521 2836DFE33E7ECCCE97BC128FFC7ABF8356F948165A407C536FAD655329402D5C
13522 4F0B2B631756B1FB6CA2A9577F3700C4BDB7CD07D076306963C5927121445F9F
13523 B2A08B48360A2C32DF5CC083CF8244C847A68F1A9E84D0B64A8492B501FF9D6B
13524 0C2B1D11E547FC663E3745691C86ABBA55A9569249BCAF9FCA6C29F6E8FA877A
13525 8A8287775266A02FE509C316F3283B001FE5C89A5FA05A5BD7228BDBDBD6D140
13526 1B54E1ED68102880B10DA773F8E3BC936787F848BAC19030A1329D906157DA37
13527 8B4444C199C7A8359BAA60C6767EE6BA4CD355485B16820E7A851EA4E4C87ABE
13528 B28963109500A343D563AF22D46D885D465424003106954A8340390BFAD74BAD
13529 DEFB530839891695920917766B0C5D66E40AE25DB740CB8B825B27897B72CBA3
13530 AC1C1F757223FD86E8F2008CBE039CD4FDFA838B6B6DC28604677967B3D259D7
13531 CB6F5FAD59EABAE0BFFAA07F750E319C02486B34501D24AE4CDE4AA40568CA3F
13532 6E7E9585C0E050CC75AEF3371DCDB6F3E640ACD1466BF435E7274DEC215D4416
13533 756677B758304DAA5B9E8C0403CFE671A8BB4EFCB64BF1634E724F5EC926026D
13534 A25D51A2F8C9EA9AE6CF552A8A84E3BB231F9B2A3E48C880C85E43719D80375F
13535 3B47EC33351219D3DB3DC54EE1EE6149F64F24049F06009F37F439C19530E3C0
13536 D286CD96F40485ADFB51E5F304B9DAE508C15C022B54B6610D97C22562BB06F6
13537 8286959DCB63E0A012AB1049BD3BE5CA703C7E92E0E09BAAFB00958840354F07
13538 B8B0680931BE97472148DAA479968F05C3924C920B41AF22FB8A18B518CED1B6
13539 6B2150EFDC9282774E1B073AA37E46D93E36A72267BE5F0309533369565507AB
13540 1C2EF748F28171E1B86987F1979E12A8520DB33D95C7AD737CA33AA277CB4916
13541 20998649FD98D8B3FB555CA1653FEF4751FBBE48314F99AD07B76C5F235ABB85
13542 81CB84D2059F59C5DACD728661B3974327FE71894E30182A0D505546A7B8DF3D
13543 9BB2161ED64F70103C7633A490126CB37244E4BFF4186AD39598099B22060C51
13544 AE000C81A236E1CD12D8593FA6DC92940706707997810AB774A568FED3E4DF9C
13545 2D5213CE612958EB8A30ADBC187F5A76A7B6CB69958C63587F36249D2815CF93
13546 1828B48A787774C3932A7E0B6490FBF64851305308F7F6F0DD72851EA85DDFA8
13547 CEDBE3DD9919F1A01CBAB6C96CDBC99701486E6C7B1D3A8DA318C9BDFE316D58
13548 2C7A94DE3027FD767D6DD528EEA22D6511B0590FD6BEAF50DF131A2B4EEF04A9
13549 9639761EDD698D9759C250A3BC81FAB57808479B7B488456C2FB7BB64D2A9C29
13550 AF8A992F293724FCC05E318AA97686E8C27F8FF52EFD355D4C34FCF7169446D2
13551 9AC24141E6C7CD96E84A36BA989823E3CAF96727105A46C57EEA149A0C169E3F
13552 CCD9AE73E1A245B091707F5B73FB24648387F15D56DFAB048DBF15050B577364
13553 7BFF70650A4868EDFCE51CB15ADBDC51BC68EFAAE6CB55ABA4D286060988C251
13554 6A81623DF105FFC0DC492F5D65B758F97102E7AE06C021C15494978306B7449F
13555 059AE81AF0826C679CE44A084B470CA3360AD9989FBF7C54CA8478904EC152E3
13556 A4F818C6DE8A07294FAEA035E283D0E4B4C9307FBBCC5ADCDE0E39CB06F6F19A
13557 A2F1F87BFC2A9E0C0F647788CF1CC9BD04C4512F5214B3BA392999D09144C510
13558 9FF036FEAE14A1171BD2C15C916898BC30968ABFE5578A31823AC06055C62DFF
13559 E4D82E81DA35FE96483354EDC3E7C61816D57CA96BA38358EF44095D6C5BEC9A
13560 0A2E0ED85E7AA8FF4E920CD6CCFD9ACC174A58719DEAC5A61E85F87CC1EBD95E
13561 63DA3C27D1766B0C73701B10ACF7891ABB0F75E834F09E0010533BD1753F87D7
13562 0E8DC843FDBDFEAA1103551898282051FB5E0632A04F180EFFBEFC7FE8CF720F
13563 21CCC225A8ADFBD4B2909199F3FDDF8A406D54EE9273CAEC6EE3A558A2E0593E
13564 472B57DC7CAD3B89FECB4B28DB0C85764B70DE623EF399A112714A67EC9F8530
13565 F5AD1A77217ACA3433D0F32F8B7C6B390EAF9B71682231886B7B339629688267
13566 DD946C8A05268F147654BF2F6C294912AB113DEE87010CB717F150816985FBDF
13567 DA6D3E8DA003CBF00B53EA8AF730878A978ABEF1C432539E4C1D58481F850CCB
13568 7714367D1FA2B81AE01A8ACC72FF67FFA5F6B58508575F944970EB57107BB8FF
13569 0113FD82DE758218B82FD38C1FF2E594DD8E01FC6C65FA0F2D3A78B159C0F505
13570 BE626E6F5D17F4305D749B3659AB24DFF6BC71F1C072C404F4E2C0507A361BF7
13571 F774505C5163C35BAF0768DA860819B17F95F121B5894A362455615F94AE9AF7
13572 4B4F0070ACDF7CA979C28CAA156C45671FB5B4F0460EA634E97FAF1696A09F13
13573 0B3D7BD0EC942FDAA944F1B6EB45D58CA9C51DC93BC429B8C7AA577C30EA9E53
13574 F7461B2C08438D5EFF37C5D6080453284D318EC0FD5DDBA3269175FD5753ABF5
13575 433C5A48188ED97C5481528A53B426A832F3900E6494FFF9E4D785C7683A4299
13576 C2E9B0F4A2CDA7BBAD5C077185DC62365BC1C062358726FAF6C0C6A0354776E0
13577 5D610F7F982ABC334A276ED33A96BE15986088EDDE1CE03BC5972F05E6532BBC
13578 805FC2365E00CE5D4796F1A3C57B6E596E2A02EC3194131B54E4D3954093316F
13579 759CF19AAC8C8169AC63B5C34BE3FECFBF56C7774EC4DB40369F75FAB4DCFF52
13580 EEF5F7D16589E421FB0F7F662A6A9E410135D41EDB10155C6A7DCC13B29A702E
13581 9C34D543F6CFD18198A3B2DA975E78924AB40F0519F04EE1C20EF5B1C1F6AAD9
13582 B05156A54FD3546C06B8790959990DB0004191188036F0ABBEF31C6A0F7EDAA1
13583 0160C274C3CD492EE4DC9F3EDF13D08BFC798011E8F1CFF61783632A9025428E
13584 E579B51F8E2B1464EE07EE95C6C547175D3BA80CDDFA340C41990C4DAF52B10E
13585 C7FFFB8895A41E347F87C989B838AEE1FF2EEBA3156D44019448036DC6131C1C
13586 F4E73DCB55B4E28E0E38DB134E274851CA7BC294EC5221389115D7BF174FAAC6
13587 A113BB26B76375356A4D33105A4B75DA31652F1C04E26D4682DCD380533686E0
13588 7C8858688648B47F563B1BD32EBB4139C440B18BA92D66196CEAE2600677A4EA
13589 18CE93A465AAB4808BD6560B71BF92DE3B1ECA5D3BEA2BCDB30364D11FE025AD
13590 7C7ECAAE990D780F4102847A9845C833F932D90AD2994C7EAF39C90E9AB2531C
13591 33BFAE360B955226876AB84DABD1C005FFA6754CC6047783E14FCA7E3CCF6AF2
13592 5C1057AE07F9762A049FB5971B622655D8D3B073F306F9041319034558B08088
13593 1DF4893B17E75EA17AC2339498400B4AD1A7DBBD5469B8A5BFB7A119CF97D5F9
13594 3DC0307942FC969545915C6A9FAB3F87E64FA94B4134A71F71EF0386A643B901
13595 8FCA3F06234252E2AFAD0680837BF7F8CB17FE8956035877BC1449C1A3D74190
13596 7D5BC8B1E0A4D5D7F55D3DA106271029E3285A3768890DDD9D7C08705E89A232
13597 B2533A229759098B5DD721AF9DFAF2216B7E52495C9FCFEC70746A13928DBF94
13598 63C27326AC79D4BB6BFC1F44173F0E31B5B5628254B5FA1451E5346001B95ECA
13599 E55528267D5EBE3B65DF6F9B2DB409F26A1D1828643E8ED218666DEB7D2AA576
13600 AD47319FFCE63EA6188B133C796E447F8E3A0905F12292068127F0DACF39A519
13601 4709521FDAD74FE0505B23F243715C52271351B69F1D0F91929A1D45FBA4277D
13602 1438F6BBCD98E127CA12B0D2FDBA2F3C0CD6AB4D0F22C93A8C2E912F859AE206
13603 B2EE7E2B8C468B6249A951CD1AB6EACF03793E04ED300860A7D9C36B64CDC70B
13604 85BE89BD437F0C136C24B0E396C87D8D4C6BB505271AB557F5842899B6B8F952
13605 1BCD1156ADB74CFE6F51B34AD2E9A32B1ECC192AE7F43B3C0F19B553FFF55BB3
13606 15C6B061EF8C0457B0DF7DE7BA17CE0F8F51C1E63C253AA09B4C6439A262F4F1
13607 6448A2E37BAB25EE56CC846C6676F17CC61385772FDDF94D4B3002D9C498C3D8
13608 A48838A442E796E1104AF70B3E2FDDB5299E1916F8F80D81970750B5C1C42FC4
13609 95BEAABD17277C289C864A35F38BC1343DF8510D7672CE0C0BDF3135BA2A8E65
13610 8EE9C13C7377DA0C2D6475E33EC6BE31AF1A1F18567E551A6CBFF1CD7CD6AB83
13611 23797B2EC8FD384609C8AC12751904E473D03FA6C3182C1E8786656388145B7D
13612 75E6772AA830769E9262E9B4BF8CCA17D4C8DC390C683B6F9CC9914C344872DB
13613 FC2CA1737162F1BDD5D142D4BBFF8C194008BC51CC2D6EBA722B76839719BF3C
13614 BA3CBEF3E021148D8D5526ABD6308009DE710899BE19CE63E3A54F87017B56AE
13615 D20AD69E65CBC9AE3B6824DC956BFB9666CA339E375F331AA0B08EF537ED3263
13616 9CFA3A3C33B647F2AF59247A30E508E8B8CC621CD50860AD79D8418FA53C3885
13617 F3AB0CBAED9356E725F9D17E88141158140A88FCC5D646DCB9085FCE051B1D7D
13618 AFBF5DFF147F95578DC1859362380A8324998B80ECE40F291325A17D6A9F13E9
13619 6413271D136352159E3814C8F18132585D02990857E9092FE84C3AA5D733BF21
13620 E3F79BC18A2A75664127973AE6010DE1CE9F4CA2D99A323F46E30B6110BCA39F
13621 C49EFBEBF7863B4BDA6B02D7A33DF8ACC3DF50653049EF92008CFBF8B6638AC0
13622 DC101C452AA9DB1A674DA949322FFD0E67B1A0000BA182CAC2A40D0EE72E5C85
13623 2E8A76A4387A3112E645CB61DF3B72C904E621B5887FE3D1297A2D0511E442B3
13624 3B4990833C226F12A4EADC89E061D6E1B04A02C6EE756864C6452B64BFF5E4EE
13625 520F835168BF1DDF77BB8B71E3C20B3B56644254EC9916BB64EF2E4C6D9773D0
13626 F79287C522598853720D365275AE4499BC639FCB45ECC8E55495FB8D2FD68CF0
13627 5CA1604FBA5A8605DEC5A6772A63D781C9FFF9C07BC7B002DB51B991870A6E55
13628 001743069B6611987E070F4C57807757E955E8279541C1D1B6672FA4640F53BD
13629 DB0FC967D045AA570637152BA948E1EC4647886027D7754CEAC6FBCAF77A08AE
13630 9F93F7A015CF24E6B0F09475AF34DDD3F2C348B78C1EC35E0FA39B9C9A1D143B
13631 A01D7D099AB28A59FBBA2855BA09FD47D7B7F1A1A1047CA97DBE228B33A8432F
13632 B415168A1FF842C42EE1D31E06373CC1A239519B2B7A737262E1DCDC504B38EC
13633 1D9049E4AB223FCF9C7D4A0B7879247212B7D8316349A0C9B6B6A4CE7D9E28E4
13634 0FB271AE2C5F8D2F556F60CEF2B45B990D6345D6D1524F132A4B8311E8D4CA88
13635 7617E218EF90C974BCC28E075EDA93FAF8487F908BC74BEDA6AF0524CAFD1DE3
13636 43E46B12B76231E0DF91E46DC72501FF75D6CE49A0F3906A70E8ED74EE7E550E
13637 996CACD1C1D18C0B7AB164EE9A217E632730EFA136082DECB1DBE361EE840B6E
13638 F6245573D15D816D48FCD4CEB4F08790D164002A9E97F17B7BBD36DCEF9B7994
13639 AA043F7AB084E74453BDDC618F4A063A676691C478F07E4D73C5A839E994FB5B
13640 60865AF75FA77E93DDF43CEAE9884C4CDF432A0FA96BDDCB0E43B3872A721136
13641 D7F43073AD578970D0CE846A3E34E5F4895B52328AC1739B43113FDAC9A7A4D0
13642 4BC61E91F8C0960846D9718A9D9818B2F7F1E8F45B35D595220D94EC71E4C55A
13643 A8BC19BE2E55EAFBD3CB9A058D31539A7E4911DBF1C53BE0B858CEE26B8CD7D2
13644 2D7A3F1EC33C583E9784E90BCF386E6A93C6FCDDECC4F7856F481E25637573D3
13645 7FAAE6CDBC22878EFF50A3CEDE4428C88E769720607F87E6240C36FF9C5C4239
13646 70752BC49F8717AB334820FED5BDB2F07295B8064C335484F873CD01D09229C8
13647 0137E605F08C9D4AFD281ACEB4E5E3C17FDFE1FFD07C7AF266A26F46014A804B
13648 CAB7DBCFCDEC3844AD368A838CE265083322176390B47BCFAE2312D2AE49E1E8
13649 7614A9035E7A662715E93C525951E8D6A281B1F6B9E2B6160A4C58BFC92A307F
13650 F7FAE3068468A09527D8239BD60DAF10998D1FF250603306506C6804045C240A
13651 4CD877658B6071E12DA389A9159DAB8EE4E0E42A1E444FCCE7159E6C437AA8B2
13652 8B73D52FE00F78DD12D9E79705605F512244D32C26F9DFBB6E09768DA3ACEC87
13653 BA2C543649DA7C8ECCC81FDF9800B925765C70C16236A3FB7F200A68082FF2D8
13654 437C4E85BFB031019B867189D3E1C9FBF81A9E7FC4AA236A4450A074B1ACB91A
13655 A6882CAD777B7F3973D0C0339487A7C4B3FA0E0CD9770AE380B7E7FD8E94D964
13656 F05B37700007400C99D41B4CA325C748FC43A09C5817593D02CBCE417C486AA5
13657 4A7D53A674746186A8D7CC2C6516886DBDB97BAB801C7E4B0A1D22771DDBD57A
13658 641C66507725A698B9F3E3992EABE0A2C2BFAA67B0569BCDE178DA5BFA578E5E
13659 29F62B88C6B0C64D69055939F322A79DBCB77B03D51B7A46D69774F36C977434
13660 7D3460A45490A6B6D9CDBCCFCFFE5D7849D734ACF129915AEA5D9228249C71F6
13661 DBD0BBD0EEAE7EA17EC97639C09A316BC8C853EB92E2D50DF6FD82D4047EADE9
13662 CE3832CF7344817E7384E3E7781B581FE4EF015C74AFCE52C532750A972AB442
13663 CBDDA7913DF1C7412FAEC1045451980CD3346BA277DD764C5A29F8A7ACA13BCD
13664 BD16E2DD26C9DFE4E452713911620588A8D3D2ECC1FC05C265F810773F237095
13665 A3289153CC241ACAE4E12B031124F9E8D0EE2F7070F172B42424F893E4658C3A
13666 3A8807B6E8F4BDD80FE28C4BD453FAB90B034E40FC353EBBC7D075655C046DF3
13667 D8128ACAF3911F4679108434AB4846CF4DCD10E13CA8990DCED602210DE05180
13668 F1111D806E6A8E718F54D08C8EA3C6057521811DBB57D9D3424A03ACAD85A8D7
13669 039EB206F025EE75EF233DF7189498B80F70788B50E52B7E153C354CF0640AE8
13670 C5A846C7C45FC5E31952D55B0D55144B86CC36DFD25686D44CA34B00B0F3D3B5
13671 913DB822E16F834BEF7CD5C08E42C27849EC2F034DFF52100E4C7445B7C08389
13672 F87BFFC5F91247BA7417F3742AEBFCD0C916034DCD4BBE0FE99B75CEE8D7EFFC
13673 D4773A0B01F272A81E85ABB0E1C3A8343EB64411F85A20A0D4CC2D8E18570098
13674 932B9F66FA1DEFED999020B01CC2CA8DEAE07099B1606A76C7FBFE7107729112
13675 5049B4039BF602CA8FD592CD44E860674F85E625D57D1775AACE59AB5B3801A7
13676 939F0F3909DFE1D281F65284C2D87760696BC95FCE34EB654A1E6E6282409A0A
13677 1053517F3348B96A6984E73C21F2C83072DFA155400F8D5413152DB08FB51496
13678 DB05B5E5A3F025610676C03EB1B58E4D469121E1B2BC67DCFC7AF9C3A198FF57
13679 39C688565F881B786322F63AD2D062C59ED0A4DEB10E74A09791A68E9FA393A3
13680 5D8AA214568285937A76DE9A0723C30599B2DEE1513712723813DE4FDD08BED5
13681 47005615DD2030345C776E2E75BB0F9B36DEA2BCE9E7790879F326D6C39EF865
13682 2435D8317B77DCB64BFA212B6607CC677DC2C82D88B0BF013D77F7013FC43746
13683 043B266F6B1C389EF0677D132B0A93CD1A148B9E6F4CE18673A6BC4488AEDF85
13684 3C4B6AE0029F09D6F82000FFCA75D118730F00ED8EFA4F481B0BC8F791FC30A0
13685 61C0E7E6890CC2948DC96CED6B1516EEB7D679849CA4A8C0ECE1688BBCADEDD6
13686 F560F346878A05258D3EED44A41A2D1E5443F53141A330A479B4BABD13F4515A
13687 4A8B723AF8538AAB6D10C59D056487DF1F82712BBA736A67F0E048BE695E4CBD
13688 4CEED44D1FB6D4037D7E1DF8F63804DC59968222734EBA59B9B7EF93985E49ED
13689 C967EE5FD8F1A5C2B55123E0117E77C1674DFFE102DB0A439421853DFD859749
13690 31C0D5F51FC08F5F95BCD748DB49830EAAF8525A509CFA480FF4A19FD6438C0C
13691 01F608F426873ADBF80D28F750FC12AFE27409C51837EE7A57BB4EA337648AD5
13692 35B2C190F082C8F72E8E9B29812BC67B634876AA058CB02230FE2A34E2F8C211
13693 120D73AE961F43012431411F730D1326D07A24B8FCDF5B10C7D3E55F65BF2D71
13694 E75209EF7FBCEC8D79FB20200C8B457E666C690646081A703591700BAE2F3534
13695 E6F4D0C20074C1B3F93A4C15EC0DE9AA9AFF1B3390D04FD948D117449B0ED385
13696 2DB081B42B375704BC403306D6F3462574F4AEEC80FD0CEB871078D572049798
13697 A7440207EE7973A36D3113A561ED016BBA0EDF9A18208E20664DB8CDD1211CD9
13698 F225AE1908F8610E903EC7A3BF6B0D57B0CFB392D2CD31532C6051C4B1D0848F
13699 677787C9DD5B1A5F8455515B7D6252F69D5CDDCAB9048F39400C7984A92AB9F7
13700 5DBC22BF0BB27A17C510E934D1A22ACA954BF5989851CA0782E78357F3B81E06
13701 8EB2761DDA2965A74244E5BF4959A1CC7B1B138F87FAA821247708EC21F9DDFE
13702 23EB1450BBA7232E63FFC8CE02E709CE5DEB8FF37C29C45E11D378BFCAB71FA0
13703 DAD8C5A75A6E36897BF397A293C02937B24DE2E5B2B9DAE5CE4511A471E174D0
13704 3557BF9B5DAEA7A7CA16C70BC378B5907B740AD2521CCAE39D3EB8287CC5092B
13705 AAB0834A5E59D08ED8824270866244094D1FA853632B1EF75C093AA734B26AB8
13706 10A0895DF75860BEB8BA902ABC948F73E912D0DC8CFFB7C2AD347D516A08D014
13707 5C825C78C9C864E2285B062955D94C89334C195A50ADCBBD41F6D81B3706DEA9
13708 C0ABA972DE6D609086E38A3893E1ECCC91181ADFAE54FC8B20BEF3C56902CC60
13709 1C2603C0C0886BA59CAF894294FE72A58A591D2263412392E1CC7C2EE420069D
13710 A2E012EC7C8DFBE7664BCF70081DDE4B4FE239CF773C49650FF62F9D96182649
13711 35FA6F9E72C238B7A48CACB4AC69B3DBCB36ED3F3EE9F48188286CB50AEE3437
13712 1A6314F052EC3919FB92DBE1EDF020EE0463626BE1DF94C9D23A93C9B918E4B8
13713 08DAFFA3261E252F8D170CB3017900EB4719340F8045CC52F279FEEA987A7C6F
13714 BF423892110B17487ECCD3585CF0F3E3B38E41D00558297AC290301225438C75
13715 B698DB9E6748C026C62C79287E82D34E3EF8C7EA2FA6C18872F82A9F40736746
13716 671DBEF3A4DA04A63EAD5E4FF6202FBD0042274B94BEAF0EB7F7CB36A0AE17F2
13717 BAEFDEC94F94B89E6D7BDC416FA11EE8BBB5B553846E2930CFC34EF650805200
13718 F62DA6826D46F90924B9FD409BF8FDC15082163FA6F752E74561656CD379AE6A
13719 35CA7EF4D761DFC781B13E77341630A98BD7D5E6D4C266BCF0E9FE0B0DAE30C8
13720 F2517246A1193E4F6F79AED993627B44BF73BBA5CC344376A529A388E4A864AC
13721 9AF8DEF756A9395F60478C26F5237044496B35D2311F183D4F571874B6264855
13722 3A7A28D60AADEAAAC234FF56D5A4D9F7A738766E7AB8B77FFA404E685B3C2196
13723 C827C61087200B45E53C4BB7DC831AEDCB65F8D40C7437A37D66BC018EB404B8
13724 7FA7241CFF200230AA7F3DF61AB8F22FC1280477B76050B0774A73C74D071123
13725 13621E519CF9549B3B5C4362DF0EE41B4D100FBF6D005EA0771D9026AF8F76AF
13726 A0DA33D0537CB08A09704D471A25F4F4BBB7CDC03109291BB73DEA2B8A914A15
13727 9533F0A776551EFDAF45F42DE4DDF0A80D004DA8D3E5DB224844AFF9AA7F739D
13728 48C8654C33769D75BF471FE3136A12023E54E834D2F522D531A104A218DA7B66
13729 FC122C88524893A3C7A3E8BD68F7A2C3061E544A89AEBA37A80A5A319C5FE61A
13730 64BF5FB1E9C2E439CC79BD87AD0EF0BF1DFACDE5D9FA248C3AD90CB4C3B35D8B
13731 D6C09F29CA205F9395CED7A72ECD14DF78AEA2029393F7A26FD7E028EB1A8F09
13732 11C952FE14918CD777691F1D78ACBEED666754D675F277615DE69FC6FE942452
13733 05C6E3198DF82D4F2E8AAE0AD0B9319AA1B972F0678BF43D83CD0D332EE94A90
13734 590C965E216C18318591C1929F1898DECB8205D79FDE84DD1B2405945774D118
13735 730F00ED8EFA4F481B0BC8F796E54BB5BE4E3F4C41AB42FB8020E9575401E87C
13736 A056E0F3B165FC1FB7AE7B507C0A245694AAE9B351E7DCBC970B04A385C87363
13737 E3EAC5160C866E46A7ABA1AF69B6DAEFDEC77E906AF096D6CD69A93435D64A98
13738 1A4F8D649C40A4E7239AA63931DE3B661F238BCF6CED850E58A6D1A6600EB836
13739 CC297709727629C1A74CA59FB97E706A248CC5D213BCB89E89F976CD60B01F7C
13740 A8C93F24F05DDEBFD6680783C726338A6CCFD0D1D2BFF16EE000E31FB0A3AA1F
13741 89AADEEF2A3EACD52109B4D001303443F2B9496B3ABE516B72E82AEFCCF26535
13742 D7CCFD61B369B9662627DADA0582729DAA880A7260B4F93318BDD448F1022618
13743 32EE3BE3F2EF44053D9B7185936FC36E2B3BB2438B0C0DEF66C9DF8236FC490F
13744 B80689255E7377E4E905FAE20C8CB226F1BA92FBED7BE7F3C2854E7D0752BFB6
13745 F97DFDA4187F4D9833244E58E9C9F9A5A8809459413EE8B7A76D20FCA70C570F
13746 37FEED177D438C06CEF7729364C0C3F6F96B20FC6947C2355AEDCFEAAF1B36A4
13747 B19F803785CB88EDDEFE9325ABD67DC4EDFE7D803CBCDE4D3D4B9080E3758D0D
13748 54DD13425781550C965B26A1EE18D72B236459B55B0365B011F5125CBD712ED3
13749 53353642782A51E5AEE39F81D81DC6FDB18A8F43B31E330BE53A5AF8F6D0F3BA
13750 8FBF629E7690D9613AA33E878F02E0EA8422B6F9EB064FA545841C4FDCD5C436
13751 0F156D1AA5B5E2E9BCCA216C1ED94C017BB7990AD4D1D042030FFD1FEABC1AB0
13752 26BB915C39779C6CEF53243684692CA63FD6A320D9CA98EA3330040298C4B93C
13753 B5C94E0268AE5625009EA6A0840A41792C004DBE17CE07E3786A647368AB4567
13754 102171C56B0DE32021438A2A99AF870E01034F399AF2E10D3A116396E2A7FE57
13755 C6C6372BB90A149DF5C4A435A1E6464D99B188E344FF6D43B436EF546B2218A3
13756 5BCD872F62FBBF2A6D2BBF82BC3ADE72D65B0B04689D9BE6CB9B0E8A0788155F
13757 6D9B8AE4F8035DBD9CFABADE0A4A03BF0799BDAA3C05293EDDDF036754AFDDDB
13758 25F39494094E3C158AC55E2A11DB3B0DB3F37344713A0873AEE6CB26DFACE554
13759 BA0AE1F33EC8821B552DEC6951619682E36AC1F1000681912B15DFC0926F8802
13760 E58D1A5A6247F6C48155A43A6AB0305679730FEE69C725B9FD9BCCE9E587DD16
13761 5974A8C4575606886D3AD63FF62834BFF03E80635848162D2C07BC086908E6C2
13762 4404C8A5DD929D61008EA274290FCB5D12E1BCB816EB688178606A6DEC9D5D63
13763 0116A2E89114144D994944BF936734B1F2D5B753BCA274FE59C7B529D57F922B
13764 7F2D8EB5D8AE904DA4FB1E687C00BB2C95BA01BE4561449B9C69F5C4AC362DF5
13765 96C4924FDC9B98B2F9A70239B27CB181CD17E1B1862D1702D8487D1FCE9273FF
13766 D52AB0F444B6557192914C7FE33FCA60ACA21C30FEEE1C0F22DD743D6FAE1F39
13767 8A679DC16F88AA2A1814118364281A3F2F5EB3C9B3AB66824070A8C2C84D0F19
13768 3B9EC6281282DF8FE445C59D2EEF5D96847689463904DE56B69F7ECB8E30CA50
13769 C213B4A7CC3D7D003BEEE7E9407A97A3C0EB1FC9DF0D8BDAF40A7882A0F28729
13770 4DDC576A4E406E0E12B8ECDAEA4A38FD51430D2AA6470C45985132A8373387D9
13771 52684AD45A3F75B3BD15F1E3287B918C8820FDF5E6C49E2B8699142D423DEA65
13772 2C099592C67F350AD5F1FBDF6C9DF894558B12808465210F6E4D0DB7823FC764
13773 032E59850C67DB709734C306B67E7401F68A8CC611DEC2E110825FD2443A3F50
13774 8A7B4A271C5FFAC26C08C70A1E9A6173D0D9B5CD88554B5CD108E71A49E0A37A
13775 C236C00CC476D72769B68D4DA2D0613E7C7E523538BB400905DAF677FF51DC26
13776 41D68D279BF62406BCFA1831B0859F7D44E60F35ABA9BBCA8E2B5EE8308209BC
13777 CD6435E8339AD98A7DE8FE76B658EC31B7D35CA64A51A4CC574A933A0AF70FB5
13778 F19F6113C4E0AB7098605D3A370832C9806BD7CB14F4C09A11BFB371294CE059
13779 4A8719D23BFF7225D2B254001652B1E470447552362C28EFD2DD02023D97B88D
13780 EE33B7B77C3EB974008E80E985D6D8F8B2F7FA6126E9A652F69C772CE34B037E
13781 481A5DC9ADC9255C2B1A742C2121FB00F03FB99A0EB3322C7909430D55957F4E
13782 0B4D4E3A887BBE081106935C0576DED542D996CA9AB64430CBC91819142E0826
13783 4F74F7E7BA726EC2936EE577D9BB5AD76F40BDC5789725AC69482A84EDC819B5
13784 829D5008C587DCB924E7E0051158F3FEACC7A4DC3CCECA20643DFB03B3634DCE
13785 1FD1379E05B9CFCB4AF6B0638307C1109BEA7F8BB1F068D5EC574135EF9CFBDB
13786 CD826BEF078700947E6004A924BD9C148DDE1B4446D881D0E11D6BED1B246030
13787 85A2971F80F7710C80F12FB6807A61CD5EB72ECAE813A15F0F4A1BA5E1DDED63
13788 E91A7C28ED6B634E0926B7F022222904B4750795E98BCAA1429F8ED2E2893982
13789 18A5683F33237A0427200E0F67C1446CADD4B2B0C9DEF20C9E3178A1BA4E7E43
13790 3C4836D6BB0E8377819E53521E0140DC768088CD8EE74E210A589C90C50BA3DB
13791 C2E0479C61B426F3E8F6FA4F78ABAD70774873E03B2552E227485C22C1D09684
13792 215ED3A54E36D5462C6742D01675DAE7DD35C28BAC9F447842585F0CBB0ADE49
13793 3CBF3CF15E3ED08331CEA12BEFE6BACD9F8A0339F223F7478181D6921C6F3186
13794 AB9CF291CF91CA1A3DC9823A9B93F07A273C44AA30159C47D3938BB417A2E8A2
13795 E1A2E0DF86EB9B0E3319CE01C7978345E4C4F96D95567DBFE86805BDB38332FD
13796 F9E5E07FACE75CFAB6C80FAE5E137508EE8A820060A5243710F5173EAAE55A8E
13797 99E893225EEDF5E186E57C8ED33F49F37A8ABC0783CDD93EE44D18858BB00DC8
13798 014BFBEE6A190327C2C4C12C5A4EB5F82200B873BAB1FD4EA1EF3D451D9A2E12
13799 30760FAE16A21F5792221703F15B1661885A43791573FCE20C7F2DB37C4BD225
13800 1B3BB4DCA831CF9340B441C08BE25D998D6954A2EA90A66DF8D5A72C20A6C9D1
13801 7F8A2D81B118938F19355DF0318E4877CA5DD726BDCC7CD4AEED372ED063D2DB
13802 2C6F80F48B380CD8975326C92171C18500DFB05579350AFD3072ABA288162AA4
13803 F0B41F854A3EB12936A9729930D611E605C365ACFDA021ED042A09BFBF7100EF
13804 9CDB3CF249922AC88C4CC0D892FEC2F8BDB5CBB2C0B8ED3721EFBF7A3CBF241D
13805 08FB7D1CB8F8123DF84EF2CAB434A83ED1494634314619059DA2E96EA19F35F2
13806 2C56F04EA92DFD2D2A1E0F0D07FAA78F3D4FBD946557666BBECBE89B54D2D99D
13807 B91E3D91CB4CE9335D0E38C7D56E228CA1116CAA20EE51D8585BBEAC69EABED6
13808 6A56F327EF37BB703542EC3F8FDA956724850E5EA9D11EC13908E652BE15A52F
13809 B019328E16A8A3B9CEEC69988D90562B4CF320AA09D44FAED8EF21A637957B4F
13810 A1AEC8898DEB2A4327F4CFC98E49FE140D52502EF5947A3CA785267018A9ADCD
13811 C25394CAC880AA7B2D592A7FBCE81CE1845800BE26F849C9BE5102C1F838F807
13812 55DDBB81420FF914099CDE0C7BC610224B501293975099899A7D53779F95C0BC
13813 DB911E4129AA225A9A0760CAA2DED183818A1769E9C48F19ED301064EE303BB1
13814 5647280A3DC6DD13B140F3008B872E898AE20B2B04B881A84D7CE05CB37BBC63
13815 E870C5597A8D1C87836E0E8F34562275B0040334D0164C8846C7F1876CDF26C5
13816 E90246229155D1E54B4AC356EFE2B3381B4989BC5B8FE47B7B54E28F556704F0
13817 5F2CC6EA252C1D3F49915212351EC110DC2515A90FCD39DD64B4C719875566C2
13818 13D306A1FA2903CC74288D1513CF1F1C2D4A21E9E1CD017CAF69622CDBACE18A
13819 5E16A1544782258BD3DFD3FBA287225EE895D5F877753F7646A97EB66ADF787C
13820 42E69F8A053A36AAE750394D00A2A86DA348F57BE80585EB1E757A219410D43F
13821 4373E74A1BDFAFF740E2A6661427F87735E06D444FAA1121A3C0E8E7468A0C74
13822 45DE24FD098DC4A670329F41B5F855B56DB76AD7E690F64C5F888919F747DD40
13823 53F6906F960396464D79EC4FF5941763DCD66B5FA57203B1137C06413B59B9C7
13824 2B109B04F7CF71397C23D5DC90260D2533BF3BEE60D65BDCECFE68C2FDED71E5
13825 6D82A07C5474C48503435A958FDB8ABBDD6CFBF89570412C6CC6DFA02C832CD4
13826 B984FC8B654B1751972D1A4FCB38C477B2F6F431E027A0610C0F97EF914A79B3
13827 535AA5214C0832AC27C79598419A87D1B2F55D2E04F029712EDB11E593EEB625
13828 E3547273E6FA998308973F5B41E47849B1F3E3BF36AD7A80A764CD384E0786A7
13829 E12F577B81911BA38E0530C54272243B12A68D7914ADB76EA497A64836512F42
13830 0498A9DD85DC7CA9176521DF1A643AE38221913655367AE84D8D807361DF9F0C
13831 468D4FEBA460D86F36577923452F1EA0A0A33D4F3D3310889B133684ED83A0E6
13832 A66E3AA1EF719A7CF85BF8689227E34B13E144CA299DC1915A9AD4FBEA674C9E
13833 6E847883D59A8D07DA9FD5A2433428969FB9E444ABA2F288450DC8F678B04D1C
13834 B189C9116DC7FC833B1D3F7603CA436D5E963CBBBF5A901B90DA59F8C852E9DB
13835 52B290B61938ED2502DA0FC812E0EBB7055161ABE7D037CB299113D8DC7E40CB
13836 C0D33B13C5C4643025B2FC0BD3732F2F60194C9A8A41630EEF7CE1D3D91107F0
13837 1B042EE419C6F6061417C39AD8095BB7BB2512C91DB5BD8B64D4EEDF1EE33461
13838 4328339AE484CB0535A5D3C935903948D7B5B7C84087F960A2F0C9D51E0B1A35
13839 808B18C7C555BBC6DE9F4BF9F57297A0432BDF24E4E46391C9B154461A154227
13840 8E3FAC57DE15325013B2C0CC1FAAEAAB69B4EA97BAD25B9724868CA307CB0173
13841 92592DA704653EC9545650AAD7E9B8E046360A28ECBAF6A6AAF4D569E6860E51
13842 6CC0DCCDE6EA89C7143F84A46FD8EE2C700C9501F4C7B98643F8F018E8800ABF
13843 6FCEC63751BD3651BCDE85F4C0ADC2904A2DEAD22B23ED42C3F403AE6F68C14C
13844 974E5E5AB812B53410DFB7A7D1B07C05F923714CF9D5EB0D2C994C9E71BEE9D3
13845 88348E00177A91D9817F0F2F2BDDD0594AC981440E2FFD9940620AF7E1C70CE3
13846 625DB4B1C628DBE068424D674F46BEA8D0026E9D049C402E34445F1577386DD3
13847 019C87F8751BCE093BCC18B9B77E4C19862714101F96B1002197A3E9934C9A6E
13848 FAE94AB6E9C9F3A6D024FB156417F156DCD9B7830102BAE3ADE6D2087D915C73
13849 DFB2D7C90A4D4607491D20581DADEC675A43AFD045924C87AAB139D8F09F558B
13850 BCAB143CDCB218779912B5067435C891F151618B3573BE60B3B85F96666B4DBD
13851 3C5F423580908E8B241C869B41C83B5D6F0C562933F0CBA3AFE80EA9F9678A3E
13852 B70BB0309C179EDC60B25A105A28ACB6C94E1E8D67946D52EBADEE304983794F
13853 FE2A5387BE3BFAC737F71CAE6BF3313CBDF6E7FD0B3E2DCBD6DD1753B816E7FE
13854 F3D89235AD94F6D8DC203E8BD0B9807BFABA9BD94A0684F7F0635FBBF03E5EBB
13855 A3F0B5124655738EEB51376448EB28CD1AFB5D4A699A16B8841D0EBF67CF9A3D
13856 93B64F19FD9DC12BB7A7826C27A7A945818F26AE4857093B4A9ECF642D9723E2
13857 4AAAECB2C0E31BED1952766BA96FCDEAF77071CD3B5AFF157947FCDFABFCF5BA
13858 3296CF9752D8021ADCCC859A5B5AD852BA9799FEA14C7C6B4CF3567AE39A62A6
13859 C165E6C85A686FAD9B9D5BA46AB696D2050405A559AB40C08808389F8487EE8B
13860 78A771B91E069CF48F79956735F95427764CF506B306B5D687B00909A637A1C9
13861 9528050136FD834670EF530F74B49EEFA6C731C5C81E95D97DADAF9F496A9269
13862 462EF34ADFD614FB22B0165C4224DE41AED6ABB8306231E2B51DC9B5501A0D89
13863 07977FCDC41D1327AA9CFB2DAA86FEE38BC0C43709349F0CA0FAAE3A4C009C10
13864 7C735A4FA0CD1C955CA45F8DC464F5B557221F2C0383713526D2B3C251C138A0
13865 F1C7D6FC83123B48554BC6EFF84E02CD58BC77A18E530E46576A8C7965B88FC8
13866 34ED316B161C1D2147582A3EAAF72D2F07A44BFB121A7E8858330034C8A601AC
13867 A36F4D150BC8D75ADD4F5BD084D28A32E822D17B9CB167ED74FFE47911DD5582
13868 2FD5A2F50C9824E7EBDB196195C7A1CFB30702093A159F6C66239139E1A28EDE
13869 49A143AA1E63FA5873C9F0C5B2DC09D19AF6A4740EACDEA3ED12B533847F5033
13870 60B077B5D0E72B5CF6DEBE74DBF5590C5165656FEBC33FE179B745811AF3C38B
13871 B610181B5B2E2294BF077F1B9EFD95F5B53B49329EAA56F0EF2CE99B1DB1A857
13872 62C8D510B8B474CF57B6C9DA6E28AEF743ABD33838B4F78AC3C6D35ABDBCC39D
13873 2D0CB8DD52324189934735581972A6C586B9F7959B560609166FB3C9F57866EF
13874 12FE891C4154E99311D7B37EF8D7874C47ECF9E0C30C43D27BA46A36EFF32E2D
13875 54E63AEC937F3E3E0A8CBFE83C9761DE5EA9026C27C3DCD293F69C2B7DCF3720
13876 6497C5636673FCDFF6605FFD468F2373CC205E75E0A961D6943E493D52AA6ED9
13877 783E8EFB52C34F7CDC2E197DBE82D2A4CF584016480009105E6DBB61BD849C34
13878 1015194C7C71E6F1121FE577A35205F6CC25A029FA329354F022B7CC4D92AB1D
13879 A4514D68587CD8F6EA074D8A2A3B38EB8103C40DF57E8A5E089644162A6C9DC5
13880 00686CEF0D553BA997A7DDFC1853D703C442EBDC49320D0520E96D180503E107
13881 ED9B58D287A94CF6D5899933BEE9498C395E54A737CEC3753B811196E9E59298
13882 F9B5F91BCDA04FD5FA368B2A3146B966CF0E92E86855ED95E333BB3C108F8D8F
13883 A1812C8D
13884 0000000000000000000000000000000000000000000000000000000000000000
13885 0000000000000000000000000000000000000000000000000000000000000000
13886 0000000000000000000000000000000000000000000000000000000000000000
13887 0000000000000000000000000000000000000000000000000000000000000000
13888 0000000000000000000000000000000000000000000000000000000000000000
13889 0000000000000000000000000000000000000000000000000000000000000000
13890 0000000000000000000000000000000000000000000000000000000000000000
13891 0000000000000000000000000000000000000000000000000000000000000000
13892 cleartomark
13893 %%EndFont 
13894 %%BeginFont: SFRM1200
13895 %!FontType1-1.0: SFRM1200 0.3
13896 %%CreationDate: Wed Sep 12 2001
13897 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13898 % See the file COPYING (GNU General Public License) for license conditions.
13899 % Converted from METAFONT EC/TC and LH fonts:
13900 % ecrm1200, tcrm1200, larm1200, lbrm1200, lcrm1200, rxrm1200.
13901 11 dict begin
13902 /FontInfo 6 dict dup begin
13903 /version (0.3) def
13904 /FullName (Computer Modern Roman) def
13905 /FamilyName (Computer Modern) def
13906 /ItalicAngle 0 def
13907 /isFixedPitch false def
13908 /Weight (Medium) def
13909 end readonly def
13910 /FontName /SFRM1200 def
13911 /Encoding StandardEncoding def
13912 /PaintType 0 def
13913 /FontType 1 def
13914 /FontMatrix [0.001 0 0 0.001 0 0] def
13915 /FontBBox{-185 -320 1420 942}readonly def
13916 currentdict end
13917 currentfile eexec
13918 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13919 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13920 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13921 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13922 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13923 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13924 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13925 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13926 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13927 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13928 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE17404B38C64
13929 2D990978CE255A54BFDCACFC8C47EC23234DE3BF30D80FC7554B3C8250010820
13930 CD396B43FBABD7A9C859B8A7E02A84AA32830987A502ECE9EBA01148EF0DD04F
13931 5E56C41647C1ACA4A5AAE50E8CF4877A87CD3C6CBC5E3D24B980864C67DA47B3
13932 A6E25BBFB6357E5BE16DD588A83E9B747303C1B50EE43637C741453A2359A917
13933 6E1BBB8549974FAA7B611B0FCC51EFC4F36A2DE53CBC9902BEF0DAA0F78067CC
13934 8CA5BD5BAD2FAE8231A2D4F53758AFA15F2E941138286D7A1B37982E457C4C2D
13935 E9C59C235A966FC802E74B6ACD601E5C70DF1A3A2C6A83ECA08C8F17D44EC82E
13936 A4A90A341504BD6A0E1B9F275C71228E3E61FAB609E5DC1F838885D10E052BB7
13937 94871776DA0DD6A2516D90EE7C62D1ED0BF44D79C278B41B40D79A294C95B273
13938 05BDCDE0AB2BF38816ED24B20E0A30BECCA0318828289E8B589A7E27DBFBE8C4
13939 6C8BA72ED4E2744ACF9F548D5D141D825F45C118FFDB6647AD3249036DE1A722
13940 A072D7433EF36C4D4F92D4FCF6767209C3DD2C4E988752A898BA472BA799BBE6
13941 44D3CEC78F0CDD45C31064B0D852B1618DDF827CEA2108B29B09222E96E6A273
13942 8D2A61D15E915E685ED114909B51B46F37163C32026246065D3E0B31620E25A0
13943 732B4308946270EFD297FF21A804AE3DA845EA4D5C70AF87E3AAB6169DF62175
13944 76D9871D190D5993DE256BB7B4ED36340CD545E79DC4797601B3B3C4394E9E2B
13945 6649661FB940989092B9DD89DCD335460B37921311F8BA3DA967ECF13C485F2C
13946 C8E86EF8B6C95F1BA7E3807A3C1D4AF146E6642DD086FA5B30D19D00E1A8BEDF
13947 7FAE632A09287BAF10879CB2F4334A5F8ADA3242140573F0379E1A96FAF6E8D4
13948 EA877B0E33989A8982548FC0437850C4A820C8709ADA1B9870F628B507DB1A1A
13949 704B01EF5A26E0319414B3F53A1C2CDA74DB0C401D15D1E664802F9C12262830
13950 1B463A5FCA7623B31715A8ED1CADB828028E26316CA2782005BF9D1D30C729BB
13951 618F6EA9AA4A31660EE294C4EFFEF9696162D5E7E67CAC6C6F867029E369B301
13952 795BDB2F3C0A53E24BCE1BAD2474756157053F82BA4BF3E8E4F7D19AE1206263
13953 3A852FDA96911B7294A827B018CF4E73FE10D63BECB0E9622ED06DB275A78BF3
13954 A39487DAE5C2154F81C8476220ED014A091DC95003223748B495A807D2AF179E
13955 82B79A40CCA5F62A9C56C5363623C7BF20C853AAB2A57DCEA9747723965BBFF9
13956 ADFBA701CBA0914FF8C156E2186F7B035F7E7ED63841BFC0A856F1263C8BB499
13957 753DEAE0D7BBCC4B1331F83699F9C3B6B13972441EF39E3E7E2953726CF2FF4D
13958 B50714EF195DF67D4CA3553DA6E3FA3B012398F4F7DBCF665C0B85EE554DE1FF
13959 A0ACDE9C1E65599B46B798E7B3A97AF495A7F2B6D7BB633ECC7E501829D28A7E
13960 2F2BFB0E747B9361F48F2A18CA77C0580F75B3BB678CBFD9976419841614B61A
13961 4A3DA50B1819A98BA0D11BFCB34FD0EB54324910056E67300AA518B35FFCA2BF
13962 9A151AF53ECE2A982CDDFEFE03D751F0A495337C5EFDFB9C854A31D188DAC792
13963 75EFE8216B2E91864909E4FC39EA7D93D0487E7D3AF6AC561EE22F2E678E6568
13964 5700673FF46320A138B7618189862A57A4B3B951BF89C82B078FF2827E2168A4
13965 B89535FBC8617C235562BB04E89C31A0167D93B54050BFA999B0E70740AC408B
13966 B9B61C2E8B9A24493C068F9A76395AAF48909C357E5DFDF0C13913A4462C63A0
13967 B6D795D0999506137E1CC4EA546414214267A09E921C85C242046F24AF4A5C4C
13968 B2B3CDA3B98FDF7BA2604D713C720DE6D3B23B3A7716339C45BB9F4143A25258
13969 88557F6E9ABF61B74965FE6593DE3A3B943697CC082920E4FB4699D84E009259
13970 F0DB23AADBE8ECA9501277F1CFA52143A3166E8F2AD737297D3BF885B5E6E235
13971 A58C64D8D0662B8F434A80AABB482532E9F0DFAB603A101F02000BF3635EDF1A
13972 3287C67E647F265A37620A6130031EED670768E3E04665B4EC4566EAB6B59FFE
13973 3798118FFB29A5B0927390D4E02B729D3A3B7C2A1260D75182C6DC98EEC32C7A
13974 D1C1209B9E66991F131514E8A76F9D5C431046A5C199EE9D910761E85C03DF77
13975 C1FB2E4C737EB40E697882E3E930BEFF452E0FA39E43397910B03B4FD68DA8D6
13976 B748BA55E4B1A46A7195F8F769B5CD39EFDA3B5FB9B2BA42E00ADB04BC1B298F
13977 EB5231DAADB87ACE62A6D3CE931B60115E3D30511624269F7600A300B8CF4ACD
13978 3844B6984FAF61FE14F4133F43F7625336580D12F04EEE67B5C1CE6E9161790F
13979 0F9176DFC6B634B930ADD720CF96E4D87576A6CAFCC8ED24BB0D41575C11BDE8
13980 1F9E6A2908A9BA7C4CCC2D0757B047D81075F02A94D59AEC3300BF059FC37FDD
13981 A42F8DDB80A47A6374D4FB01E6220B0016AE277DE63AC5BADF7C8C858F98FA55
13982 8639BF41F9205329B885DD61EDA0BF5C0EA32B89ADFF4E0BD4CB6BA8A2CC0881
13983 11A07B26EAE83DF4DD45E5B15CA078787DB9A2983764B848EB5F4D4076A37EB8
13984 58CA5666D2C1D17FD4D9B26D7099516940AAC6154D05EC73F8C024DDEDD6D7DF
13985 3B5DD41D6180AF94D6E0242A3329AABBCB57A96331BFE725CDA793F6108842C0
13986 2A3F2651F70008BBDF7BA9BB7E1E8B28B0B20AB88D4496C0F30A79BD56905DEE
13987 B2CA5387FA69F268D68578CFB30DDED984C2FBFB9EF2E73CC880592C2A0DAB50
13988 9732970C05BAC6FC723C732933783D54D6957A725EF7FBEFFE928BF1F7DE2072
13989 ADAF53BB0318446968E4DF9EA51078393906217A5F7D0A0CD8342D738E0B6BFC
13990 8969DA99215CEF239E6AF739C34A694FC67C6D401A3A8D355D4535F322C3401A
13991 04093C37D119B7709AAA194B50FE71C61100C985C1D706AFDA7D25E6266F3002
13992 AA8660868049AFD2C03299F76DECADA8BD9CE057CC271657BE86291FE59FD806
13993 895A197CA5415D1C2836D30E27ECD766EE1E9B2C0A60685070D6D5F61D5B0ECE
13994 F799D976FD5AF41A8DB91E6144CF9F3B99EFD8BD10DADBA506F4B9E48A19F5E9
13995 D0567DBB96BC6EFDB8E0D0CBFB6DB78AF3D7B7B948A1C226881E67FAEC8A131D
13996 966D3C60A0A3A977B37516886C28EF386DAC38385699BD29ECB48FE4A864AC9A
13997 FAB7B3B5DCBBD3211FE05680284BD50D9DCB2D2BC7266EDCC8F1B93AE9504438
13998 08017A279BB8A3FBD4B596BDEF06FCD73E9755D207FE95AAAA002172C3555030
13999 176418639001614499C185943691179E351A119922DE928C8C6D546FD77FEBF2
14000 01D9E55B2E3AE02EB5DDF6A31F01641FC71505E2E9E11C688B7347DCA89122D0
14001 1D3FF29FB92FEF1C8728F64CDB147AD4EAF2BF195583D824B2BB07331E3D458A
14002 078E235A08B8BE47F16C0A12C166F342C3CCAA8E4FB3BA34DD2E646C10C009DB
14003 EA4954C42987D9B88EF3EE140EE1008F17C5128A778A840A418074615F7371BC
14004 4C1FD21624B75589E4B6EB69128E5F4DA6E168612031E739FE5520B72534DFD3
14005 DC7D9DD86354761166DBF57784BCD075E22313DE20457AC527BE387378FC2323
14006 93D8A5F22E8F118E5F41FEDB6C1F42165F0D54454639F1EA6386DAFA0027EE74
14007 0B4A1080C9175BA52DA22F3FF78183DD701FF0D0FB269846AE10AE5316F3CFA6
14008 9EBD674FA7565DF18BDC853F8C093722C94D18F8E1B350EA7404E629DD665E8D
14009 B14DAE5A39C14B16C9695D49BBFCF53A39841CA1E81B31447C8C279EC6FFF847
14010 F654B6D836397D450CC951CDFFB579A56331DB3A312FE70F5091641F8629BB8F
14011 C1F3CDD80F0A14D38DF7EF2B0182B402E2795BB399EED6CDC9F059CFDAEC14E0
14012 F22B31CCCAE24620FE9AAEC1BF7AC43A38B240D1153A24A1B0BD174CA5E3CFB3
14013 9EBD284D514ADD0B01634B21EBDB9E19F1C2995B4E81C9A3D28742A9225CD059
14014 B50EF32846483BB59CA2C518558C49699477391F5DF8B411505C57787555106A
14015 2FFAFECC9BB7E6A53F452D174A5BE044F42EC0164050026C4E2F3D6337296DD0
14016 437B84A77E967C9F2E3512741C8D05CC9DB849CB9EB2DE70D39EF592578BCB79
14017 390BED73EE7BF6923BECAD6B0AEAF374556FD599C07882F77651E70D2298B815
14018 068C58BCA91885E74108E756C460FC1EB0697120E085C7CFD4C204DF37874745
14019 2C3A7FA3C689BA1CCA966BA9ADF1CAD49D2FF5470B9AD736353AC4E67A08B547
14020 001CD83C7BE7E5D75EB726F41E767DF2CC0BFDF1434251EB0D329E38BB43569C
14021 3E64D9D13660429D97CB771FBEB2856FB82C4B7611C2913826B8F71EC51A777B
14022 61BA7DC59AAB0204E38602D175989FE8ED3CB9D9391F0BC631BBA915976C99B3
14023 80E60449253E7C83EE7F2E2EA3A50A35202958FD1D63035C757B6E9D004859ED
14024 B9D667FBBA39AE8283306D13AB70D2E2CE7BBCBB788D520BAFD4A67ED9885D46
14025 4F639D0B81E85F287A1985E2D8DA265F872D639677C6C1E6A067F1FDBD28E6CE
14026 BA0277E6A66024E93C187B7DACB165BDEF69C0DDCDED8E9BADC63C39DC510E7C
14027 856098B5402576CBDF6A031338EF7755EAC857535B40D7B63D2E7272D9487299
14028 AC4C0D6FCEF162734BC08592EEC4FF17D667BB9A7801E03AD41CD762C34BDE41
14029 09073210DB822F668965A371DCE66F93FDE9781F6726B0187CF78E246AFA830B
14030 3560EBDFE9ADA568512DE96AA157139B62E63E55BB557C490E0A1E0F2E0F1200
14031 175BB55E65CA5B79EF495A0790ECBE12C655E3BDF3E2182424A7649C4838B94D
14032 02F5619C43E0BBB5C70BF02240AAC3FD9DDFB328F85C27AD29AC399228430622
14033 F9D743F680BE176C29F9B59BE5D76E4FB7BC2C470BBF18D406716AB49805DE8E
14034 E0BE989F253C99FED26938F3D6E34BC7190AC03C53A0FF128147976C7180525D
14035 C8E3D845D6D1EDF0BCCC48D652111D4EBDE7F94A2B6F1658F14DF709CFD63B92
14036 E85EBB77194F0EA9B44087B99E2B235B1427CCA26454EB04790C03B1319055F9
14037 47EFED6F3C802828C1F79C79684882969FBA58F8B0683C783582AED8FAD94580
14038 8DFDC255674EEFCAD79633F0154B6D31D98C5C3414F518FB7DB985EDFCD485C9
14039 A9D892513111286F70C3B0D3EA733EB51F6CF1D00396ABFC83060B0547375222
14040 A6693F97EE65914EA70B63E4E5D40D9B1A3235B5FC7A20ABEE6D518129A64517
14041 6E141357132A51B8E7C232FE3BBCAE37BCF5B4CDA696AF98E61A1393C227D71D
14042 D36979C599CFBEC0FB2CB6ABB6753DEFDDC722FECF62C99359340A3323DACCCA
14043 644D873E9AFD34DD1B695AB519714DC29C3E36FFDB7E29FB09B6026DBCEF3A65
14044 E83489E87EBB5D3F92FD236DE313A142295A8C7F0556BD268608FD711769482C
14045 0DA1F275D754C30476CF9BD308483B93A7A4CDA6C295E6949E690DC70B0401CE
14046 1D6544668A4178D3BBD1D06ABF29E4B28C7D73A493DA4EEC2019A802A795C555
14047 D9BDB44D673D7DD1E026AFD9B5D8016E8F7618B46D7857FB23AD2DE330DA2948
14048 6DC0FB5A32846334F0C2EECBB62160EDBB0473191678BCA02DC95684BEC04625
14049 7CAC1D69A47549CA07417E4ECD110CBC064997625F6F9B3FE408F50DD391460C
14050 ACA7DC16127925006C4F302C22053B595B877D7ACCD3A7548BFD10CEEE4DFFF9
14051 989B81F3D1279EC83215189E7D53065DBB672882A031A273C539ACB5B4FF9CC8
14052 7D51D65C3274FEAAE2D8D952700EF72E3B8520387B1CDDB1DF8E5E8E018203A0
14053 A52A00F99181551CF0D1D4D1D777450DE257261D57068B43EF2DEC578CBA5B83
14054 EB23F77B667D47560F3B3905C7D78626DAC13E567436C28A9D9D736D429DE0DD
14055 28011BE2A90CDE7BA89F220A096D98963912B7772ECA429BE03DDD1BDACB1A0A
14056 A3298DAB7E47A69E83A7FDB4E72EDA1894EF074ABE2C5A450D1A81769F62E131
14057 E8C384AFE2456913E4CD8B7697A9E474804EB3399EB1D34F6D0BB47D8B5AE4EB
14058 0C6234F466111098BE193B00152F3057855BBEF5F174798CEE274AE7843BFFE8
14059 3E15A84E7DE986BD29E622CFC80743167CF47D6C1BB06E0FE49EEA8528ECBF4C
14060 8416CA7B5E0259165CEEEA390D2DE1C38A0828FC2A6D8B6285F5C8C032E37392
14061 5D022A16D517E8C7520371A7972214962809046CC322DD3AAE8D1F23AD6CA5DB
14062 C05A791C9BD8AB03FD01A26120FDDDB27840C7B5F0FC99A106F63E9DA95D3698
14063 9805355FAFD271A95898634CB76B7EF07A23B1983AFC4148C96C95080D2AAB02
14064 95DA1A174ECD0102C5FA99DAF44C46E76F1421BE1C76E17707B5BF80D70B0A49
14065 024D38ED8B2914A1FAFD84DFFA3985EDC86A7750B331890A74C6A822AF7359BA
14066 3562E3D8B549EC385EE0D7D408B9C79E5BA65FB7E74FC9F017BEB0E3950CB4A1
14067 38CD5AED43177A56420C9927361C7138321AC39763FA11F08BAF3B741FA0B43E
14068 D2D2DFCBBDCF4B36EF6C9C3243247A485F79768AB4F5AA106D2E649318861FD9
14069 AD6BFA6CF5E8CCDBADA7F10AC70FF09E5DA0E3E71CBD4239EEA37BA5C17FB8E3
14070 06641DC5983673A80D0C523FFBCC153C670600240F96DFDB7D27791A41D784A9
14071 0C34E1BEDD84906B773D779AD2286C1C7C748961B3EDBA48770D0A5EEBD80F5C
14072 90609DB55252A0373B108D4EA3AADE0A0929542F99DE0F6E4B20FB3949E44D94
14073 AB088A91F2EFD1DC1AB0E70D6264972446B50D12A80EB00F9E62E353FA851430
14074 CBB4E642CDFC3B47C188ABEAE47B5870BFAECA629B4FB37728BBBEE7AC057A79
14075 5976B7AAAB09EBA481CD267B564F61D9745142652ACC6BF5C6C8E0F6A61CEFE1
14076 8FF3A61799D576D005E525A96E001AD7278A318F9B499FB5CA0A337D4197DA43
14077 F592A3A04583F3C075C0FE888B6E960E1C7AAB3C4213DB20CEED469E2447A1B8
14078 F27D469CC7D0E5423277D248141D8E4DA63289278925FFF9B826709AF9E12A78
14079 7D6CF9E1F77C86494D4A3577D445920797B2020D252EF0098AE31F54AE92F4F6
14080 00891540BFDBBD0119514D98A463F017731499E453BF2EE8960904B7CBB3F606
14081 4738952DC78CE4660DAF84AEA8C22734CDE6046F05D2D31C1ADD3166022BCB53
14082 78C5F0469607B0B968E1775F43B7724669B19576363E971760881AEA6ADA2C41
14083 B5D2591DEB1ECD5A3FA737526944B879E23DDA5858335E1A2F84B4F27F3B3FC5
14084 440F3DD5A1896EAD2373E1A6C04480D5469F07521A655FAE0F5944D260CBD811
14085 D2EEB18D4FA03E6940FC6E1B033110B62CF52F5B354E5E08C0FE36A2A2784558
14086 4168BC2A430D06DEE4545D87F120799F33408774069A906E35BE58360441902C
14087 88376A876EDE63682A24C3F9EFE4273BFF14BB7E08D5D985DDAE0158197E4887
14088 5B3FA6DB5D1980BE7AC4B2E752D2ADB9633FD0003A83685254DAB585AC14FD9D
14089 9BEB09C956D41B3683591FE504A26093A87A9ED4B5921A4CA409709FA7CC2A61
14090 A3473C6F0924D3C9C531C77AEC1C33CC61DA9514DDDA6A873BC0126759E52034
14091 DC73264AB36990D594FE1B2C2CA2AE907F303EEA8CCCFFF4777C92B255AC5E6F
14092 068CF2043B1A489E707AD15B135C2C79442052A2B9B2A53BCBAE7450A0F4ACAD
14093 CC92240795E6312E320CB9A2AB64837D89AF8F821BFBA75E06F4176ABCDC6470
14094 183BDA3D4B6BCA8A601BF9C6C6654897AB06A88DC601CE3DA0A4778486967171
14095 78F8FCF86B2600BDF5F75B56488A9621814FF1D8104389E300E223492EE5AC49
14096 C9EA48C69A5D39FBF00F1BD7FD0F6D0A3FDE5B519FF824236037C83A77756C25
14097 6A1119B4788193D5524B14273B0D52CA8AA19029C1A9CCFC5F15695C92C8F163
14098 2A05D0C9F34CBF2E5BEE5AF00720396B12D3AB9E2498BF607FC96D2ECF92AD53
14099 33A061F9323447BDD159F1A2DD3A24389AAAAF376B953DA1D758CD701C3969F4
14100 228CBD6D5F7213976AEC2AFAE98AD6F5BF332EA496DA503818E76C24D36E4A97
14101 9C9357FA3C6C26B465D408E7A67A3579A7ED352738AD7A0D5312CCB07440D88D
14102 FE356A3D2733F54341681378D38F50BC126C285E59CE23C69F61E1DCC90B33E2
14103 97882E29317BA96661945F4911597C26873DCC986EE324CF7BEAB4FB5B36958E
14104 6F19347C836B0D3BE3D44B0B4CC6D3E53291C6E7195BCAE0A2436D1409F50E42
14105 2BCBF705F516833DB7D6EE1F6C80AF0E3AC7988F22DD7D756E944F71743CBCFC
14106 A7D663523412D1573B768BEB3F2A238084375A5B8302ED2B74FBD22749984307
14107 1F58E2406D3AA0845785D860F7FF82EC4ADDD0971663197B35BF129E95B980E9
14108 AC0981D2A539A4556B9E82406DCA3D623CD171D313E7A34FEFA560C77128935B
14109 978C93CCACB9E409306866188181F58AA2949964EFF4CD9460C85EA5E5F01DC3
14110 355989AC465F9DEB15ECD759876098977BF70890C6613B9E83D73EC28FFBF4D1
14111 16FCC47F6BE71B96FA40713C2AE046A96B70FD26820F3962DA8A4C9A854BD228
14112 27AD7E7F8A2831CE022F01AF2550A07BD9D011AA776B58D20983A4C3A70E3E69
14113 D117EEC18C2D958FD9DC45D2CF5F7253FB5D2AE26DF1A1CEBB7577B627FF9FEF
14114 D6FDFA76A43D402C418743408D9481F15B64DF6A6F8D3212D143F7A5864B85E8
14115 C6E7BB26824CCF19FB29756E29E7F085C8D33946558639A461E692998AE060FB
14116 7403020E8CBC71BF20BD4327767293A9F2DA0BC0D8B6047621EA1AA3347D516A
14117 08D0145C825C78C9C864E2285393C614992A9169739CCAFD4ECE7F0AA58BBAE2
14118 5A826AEACDE99E785C1A8B2637FFC750593EC6B6552018037239B03D2D140C11
14119 32DBE09824E2B2F0EF3AD29C43D03202F172A99329C7E571FEEC33D547A17961
14120 5799442A1361E821570E9D7D74C7A2BBC4EF5ACF663DEFB98E4AD98C64950DC5
14121 A7D293D2C0CA700F03002746062D851A47A2D14372EC3DBACAD6A254F05CDE07
14122 3A17C26B2113DFEBB2722067BA36A6F3AD360A8CC19B2D71718C19D83B0C7F2F
14123 04705FE55B6F35124F9CE778DFFA335D5E99FAF90989AC7E1B13986F6D08D422
14124 34B3803A4FF311D52A7319C26D0C690B2DEBF68C0901C0933ECEDE0124A80CF9
14125 C809341750DBAA4E7CF3B15CC1DF4BCFAD1DE9489925EA09AD8584F96343BB03
14126 043F0C5F6D3FD56A5142B2E75A4245F4EFFBE43DEB94FB94C5167B5CC02E9A0C
14127 F47EE63D153CB8B941C8344D35777D39710B70F0361CF9789043774A411037D6
14128 8D14C7FB34A965F9245CE99910FFE6B1065CCC84B925D2EEBB3E2E8C05C05921
14129 73B4F4024C43C3D3C279260246FD78C82B8DD589E375C405756E4CAFF1FD4C23
14130 F90B67F79F3136B0164AB162420623DD3B2F19992F894CDFD0BAD703D41D43E5
14131 6522D30CF698674499C185943691179E351A119922DC35BDBD50A5B55EB9DE08
14132 6528834BEE3A0ED24FD66FE4C065450E0D7FAE48AD7E695E75ED10A025344480
14133 58A98B81B98E80520E9111B24B0BD4ED7C8E7D8A048A34859268FA7BF1D27B1C
14134 6FE3B2A2C6DB953ED292A6029B9963033044BD90AA51A75EC58D886995ED1FF2
14135 13A445A76021D7F914209AE12DC04D6D9B2FFDAF47669B66B7B4970CE005F417
14136 9B33B185AF2462FE4A142EF709DD5F9B9869CD06D49EA45E616C74F350F57D70
14137 8ADDB89C0AC1C6735D8FA22922761A4B3F22D894B6DA59541FD7E71B42B08824
14138 7AA035F3DC27FA986E5ED3585B4D9D4BDBBC9D7B5336204EC76F7A2C7CCBF8D7
14139 3B13087CDBF4D7739C0CE880CD47BF7D3C14CA769B19369642C65C282F513AAF
14140 8B8D797205E9631AE01222D74FD8202F8B19C8F7EAE856CAE129C39D589022E6
14141 59319C3734B81C2ADFF5D3E68A01E86B72C8D914AD83472952C896D6452B78BC
14142 5DFD5F4718CACF57593F4AB4513693FCA3D385BC8A7159F5E7576123DF52A1D2
14143 70340B3D4DFED870186012B60300ED2A954C28940F5679C50162FB62D8386DA6
14144 326F997372B9D307CF356EDF826289949B16E1A0789C6D4ED3B6FC050C6426E0
14145 43A109FD27E16298A6B8DC5F5AB1A617A324BB50A62CECCEE5BEE29A0514182B
14146 993ED115F2A60FF02EF6E59AB7A529DA186A60CB5EFC6EF5F845D8896FE4E7CC
14147 7C7BA7CAB73A0674B7EA6FED5E0B08AD851A31DB1F2147BA8035E5843B0C3410
14148 8C5548A8E678FA2A337AE1A95BC27711DC1CB2A8C54620AC0BCE04ED939ADCFC
14149 02E2FDEAD12F1710AFC302AB5458875D54E86F3D057FB5F46E04197643CDE344
14150 B5B9C92312E0FC17B2CE78565C26E2BA54191A806C68007CD2B2D2C50A373A23
14151 292B5BFCD5027A5F84AE69E00EB512806565F825B6EF780BD59AF9034C153CAB
14152 FDF3AFE46385F50CF4641D3A198A9A8877423FAE4BD67A6538B25FAA1E9F0AC1
14153 93470525FDB77F8C3EED0AC734005A70DB4931665D840B2B3297326D4053C7F1
14154 B96335CA7EF4D761DFC781B13E7734163772A9844FD3416099C56D124F73FF91
14155 CFE52109400315A0FC711872D308E3782FA0F6BA2016C33E93BA3AAAE6A0FEB3
14156 FF04F3FFA6EBFB243FA21C800F4B91B50946432A4B42120058F4AA7F45F16C1A
14157 080ACC735BE936B49A667CE543543538EA7D20E51721C8879B33BB7B918187FA
14158 87EFC6AAE69F735065A2F86634CF726914D1B8AFE8B5E7C494CADBDF8E740CB8
14159 960D9F79E244A59B27F1711E78CA5C6796FBB7E8B1E47E52E36696662F350EEF
14160 2CD6F86A19D4181FA2DA8EB3A100ABF69816E654BB8BEAA05471D5CB6D9FE95D
14161 9E88694DADF54B411296A5A8B254F45E4B3B61D5601DF1C80121D077C8403F2E
14162 719AAA194B50FE71C61100C985C1D70301FAA198384943804547EBA2564942BB
14163 5CAF55087EA04ABA777B17FC846017DDF490A9567DA1BA5DC25226D800606CA8
14164 51CD3343AC73C1BEB10E83BA1B89FA400DB65786B42B375704BC403306D6F346
14165 2574F4AEEBD76AC0469726CB0BBF6D1A0844AD12B1FF18B90DE8CDC18198F7A2
14166 596578B11218B80DED4D8F8280899AD800DF106A9747916A93649841C1C4AA6F
14167 AB75AFFBEEB315F71E5CE3496431BD1F1F91BA61EDDF6C37B2D46593E6BD5B9D
14168 548EA4AF2179AF87D099C6532CA54CB19158F279008D747BE13DB157FE8B6260
14169 502B600DA38D05E1FC21335CD2C6DB1B4E1D88C9D24DF5C2401D2AF137B002C6
14170 4B78E7C8498CF1AED5F21EC3365D3CAFF45C260475B5E59A5E40E40D79450C9E
14171 698CDAE6913BF7B3620B1C85656732B53BA02A02AECAEDF8B97014558ADE155E
14172 3F2F04EFB4C7D91581C9885CADA8B33DE67BA8284869CD0F8C738370C48AF271
14173 E1A55614D79249552B6AA31C8E89416001011FF98F9DD27AC2788BC968950BF3
14174 1F050998835D17EC04F9E247DC93CBDA0222A6A71FD8560AC8FEA256D9DE87E2
14175 3C22BD6B03F84D99BBA97830506DE264B0935CC78D1CF090385673DF614B517C
14176 05D31408F3BC6369C92606934553B76F7D4D915664AADCDA76880BF6DB4A3060
14177 4C566EDBC7AD5E41EB67DEC367C7C15CC63CDB81167C29B0DC1FF3A28002468E
14178 3F2B7FA84563B87B5F33DCF909620A5A8D1ACEE792409E5202C68E95A9E87F9F
14179 A03C6C4F7C0C60DB15BB23069121E3C7EA946ED443CCD40DFE38B2D5A73D96A1
14180 500442AFEC797FE4BFFF818D65A016EF312027D100E107806EFF044F79AAB659
14181 DEB9C7A4C75B98FBCE7C280BF78F278F612B880E6C0A328021F258E2ED8CF0C5
14182 56FEC47E25004F003D21EB64AB7F461DBA3ADC77B781EF03E5A9A982D357862F
14183 93ABE4BD017B134DD7757ECCCE492BA5A27A37F695DF8AA168A168CC8F58295F
14184 08251F5A676716C2788169EAE2DECD2D72AFCA9632BAD5821F1DFC9B5628B9EB
14185 5430836E9055B007398319845998E8DB36A612AFC7F64008A0AD0FF9FED81B71
14186 5B7825D2848D3EE6728594B13E0954C153C70024A354D9E3B12E08719DA8BBC7
14187 F25F4B6A2294708EA2A91208AAD4A9BBC741300695974667E4891D6570EC6078
14188 E5A66C8EE4538217B82C3CA29E5D1A18AFED916200A361FD3F877909B1D48D24
14189 D6FE389E8E42B7291FAC2FE201D2A9EBFE7949B842211DFE481C7CA972F80EBF
14190 B33505DF478DB0E0F1876BCC699E4E2F828217AC85B4A9DA9F52E5EF1CA0E3F2
14191 D03F15752D5A8AC6330D1CA97C19A0E29BC3ABB62E677AB94B9F889AF76C8892
14192 B8557C0B47319E38C8A0E5DE51170A3563B3EFBCC6810BDD121278179F207D38
14193 127A0B76CEE9F33B540E92D6A6FC84A31994B0564ED54ED5D09F9D65CF4004D4
14194 5E46C99A54C27C39F5FA2C09BA5CA65F50D094AA31D12FE284FB598FE53D04C6
14195 21EEB2666A6E91F338061A7AAD14E9477F51FD2E3A3BCFAF06001D373F368AA9
14196 0108755EDA2D28D2F0E3C08518261595698897454E6A217DE65EA79405DEBCC5
14197 AB0E3C815F7B88F4625A5B9A67C372720840A2005EB6E86C8B330BC024E30E02
14198 761FBF8ED90051180B6848B37122A76CED7408441F0F46DBAAA41583525D7D83
14199 1D1F89F26B235C8272114B9BE89A9DC161F717842C95BA01B3AC8C942B486FF2
14200 3428DA343DCA5AE981432C2F7D54CA39A47DBE5853A54E1F219D7E675AB9D646
14201 F40DD2103D5CE3A6CF8AE233A8DF665862CF6D6C4ED2AACF65D8C8301869491A
14202 24F2CBE98D889C8F65A08BF76FE138F8B285BD34CE8CFB31BD28018ABA74080E
14203 9889E72C81E3A4BA5BF6E400F8E6B3A5841B625AA42838E6A2B583A9780ACB70
14204 B4C5EFA4BE0463CF342DB74C0F823586C5AE85711397B996D57AC1E711AE61D7
14205 EA73ED4E5DBB1E86C46594AFA314403CEE6A17F843759A4F76D54F616D3087C7
14206 842A9D9803C2015FB66AF7C3D53BCEEEC84643EEB49A2E57D435142AE284287E
14207 F86378C70CBD25D789499339C1D63F2B604354D35A708A36D89A354AAEB20A95
14208 4E4FB9682D9D6450A87E092E839A1B7D5BDB6A12AF45EC3737E2436BCBD8B6A5
14209 A4CEBE2D2B9B963F299DD0A744E74749EC6F219A3BE37CAF615F1566DD1A57F3
14210 2AE798A28885ADB33E9D0BFE9B3A57733EEE3737CCD2EF0F44CFB7357BACB694
14211 48BCFA30F4DB2B4C609B66B55346267A3084EBB4C9F7C3E39468FAFC21CA086A
14212 0F12B55F802BDEF292F76BE4155E04FCDDAB10699FD9DE0FE4B16E8398AF3C5C
14213 9A0672AC71BFE0C18511C0477D9002FCC4831A04637C7F8C7FDD6EC8276CCE6F
14214 3334E8BE4783922E4EA8AC36D36AE4A2EFC306EA573F10EB1CD59B51A8DA748E
14215 9DA0294BE09A0ADB419B74A2372EEFD3E81131D86B17CA3A9F3687A89478B42E
14216 3938C18EF7954B6BA1ED86EBD9156CF922E58E7807335689D24AA6588FA7668C
14217 6AAB600242F4C6E9B56DABA83EBB68F11A3FF9D1825605DC790A8DB13F2FA5AB
14218 3DD2637177FFE4CEEF8EA283DFE606BC8103F26C025DA6B6B61CF594151A02BC
14219 CC17F2EF5DDA924A34963B5714AE2371E5F59882F43434D1737139627534AD07
14220 D144F71B66C8D25272E0D6E2424A14DB099C104BB4228CF8E4BFC93316CB94DD
14221 FB19DE7C206BF3DBEA823E5915799C49AB3D198F7C1A2C9D85C9BAD8134F8104
14222 E579B15AE40408086E8E9743496C9BCF6293494A9E0F0ADE16B1B51608916630
14223 5ABC6C076BF355444753DEF21BF0FC5CD3F86266E31EE84502851782B008A9C7
14224 97555294F65A2924F32C783DECAC2030C8E1A7DB3383290FE97C22D1BB5E9628
14225 58BC47A14A22501DD2F1E829C6F11CF375946EB18D912C4EEB1B298E293F0AB2
14226 5951B0E44ED956B4DF78E961CC203D503A36CAA3B623B57B19538538B502FFF8
14227 0F863914A2598842F2E377875A9D8410B60C8C4CEC87BF0DEA2CBC1970257D3F
14228 007E12012E5740289AF8516C7526A1326277764A401A9585AED5A3F78EA3DBD0
14229 040D7A49AA2ED063E09CC2C594918BBC8FCE9455245A4D61B7CC233DCE7D0201
14230 021844B03FD3D0EF68A82D002714976DFA440F699C497421FD7EB82931496543
14231 30AB9BD2DFA738A733E5948813DF4AAF7D7FC8F372E387D812500493B621DFE4
14232 89B0C18F7DF1C195C2AA763761005268C5176FBDF63AB5C8C05772DDEDE0E655
14233 52D5A98752F999196598DCC1D962CBAE36CB004348446ED2A593D53445C33C5C
14234 30143E503AD11E941A4CBFCB6E9368D57638F284B4F17FA92C75E1AFCFD552E8
14235 07474C8C1B55DC8A6F98D6209AAF1D7C7B15DFAB7C71BB5C6D6894BEAF5470BF
14236 E667B851364731D15BDAFE072BAA63B5D29C6109C35009D36F586FCCDA2B4CFC
14237 3B34EB79ECB0F9B9431457A9C3677D6E392B03752E550083414CCA4FC0F4193C
14238 F96809C6824C2C974E1F610F5CA843A901931E259383520951096603724F0C2D
14239 94AF8245A3EEE3B424DE27765EDF29754CA4E0E5798A6900B7B4529AA76B41B8
14240 76121A815852BAA6ADAD9979B3D5CBF7CF00A3859AB2EFB53CA53682897671D8
14241 809BA60611209467D5A8E942388DC5536DF009755A9C7AE2418E1C5D0B80F4E2
14242 F77EFF72AD69DF34EDA96F22E859F20359470E5146F225E6CAF23AF47367C969
14243 E654E99A5F4AE69CC674A94A43B414CADE8D686AF0DFA160DBEAD86A111D83A3
14244 B0CF52545A134E2C70ACA46E463F9C541A7F3E4FD2B7209594C1A4D739984682
14245 882AA02CA3714F7FBBA8E65842A251F680E6488FE38287F07F182597D99188C2
14246 2A33EF29A0A683FC3AFEEA3439CE5CB639D35B0524E8E01B812DCE7AC489A2A6
14247 FBF724AB4C5C38808EA26294E3CFD772B8800020A5C7E92654D3A5E4646D5FAB
14248 13EB3CD6D17C686999CCF18BA1794B20613BD592CF03E17780AEDE97865AE8B3
14249 4236CB3EC967D65786518EAA5A911983E64438A940DED8C65F0A7ABFB37266F5
14250 6ECED9AFAD12ECCDEAF557CA89303C742763924AC31F1AA87F27C84C687CB35E
14251 0961F5635BAC5755BACB5DEC39A2CDA2AE55DC9F2A4605E9ACF975EB142D847D
14252 2330EC265EBB0888529FD33DB84996461EB16B2A15AF8CF8192E557CD03547DB
14253 5E0F3F62250F6131FC759E562EC93AB168B99FBE201D099C19546107F3000B9E
14254 A432A32842B88F2CCC393CA098ED9C0E2A7F44D7395A461E591849F1087956EE
14255 B215734183C4FBF48F3EB04B5BBFE64BD4B37C0EF84C6163E6595775DF004212
14256 1649BA8DCE9298ED88144BAE07CE61455A658E92AB0E7ED4CEF0E5CF6B9F2E4D
14257 3F869CF99D0E043EE8AA7C8FDD5A643E590AA01CE607E74D92B8CB13D20981D4
14258 556CF327F8B9C4E11F44B3B1940F9BDA440D84AC0B2E8D722E14A1FFCA570545
14259 A2D1
14260 0000000000000000000000000000000000000000000000000000000000000000
14261 0000000000000000000000000000000000000000000000000000000000000000
14262 0000000000000000000000000000000000000000000000000000000000000000
14263 0000000000000000000000000000000000000000000000000000000000000000
14264 0000000000000000000000000000000000000000000000000000000000000000
14265 0000000000000000000000000000000000000000000000000000000000000000
14266 0000000000000000000000000000000000000000000000000000000000000000
14267 0000000000000000000000000000000000000000000000000000000000000000
14268 cleartomark
14269 %%EndFont 
14270 %%BeginFont: SFRM1728
14271 %!FontType1-1.0: SFRM1728 0.3
14272 %%CreationDate: Wed Sep 12 2001
14273 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
14274 % See the file COPYING (GNU General Public License) for license conditions.
14275 % Converted from METAFONT EC/TC and LH fonts:
14276 % ecrm1728, tcrm1728, larm1728, lbrm1728, lcrm1728, rxrm1728.
14277 11 dict begin
14278 /FontInfo 6 dict dup begin
14279 /version (0.3) def
14280 /FullName (Computer Modern Roman) def
14281 /FamilyName (Computer Modern) def
14282 /ItalicAngle 0 def
14283 /isFixedPitch false def
14284 /Weight (Medium) def
14285 end readonly def
14286 /FontName /SFRM1728 def
14287 /Encoding StandardEncoding def
14288 /PaintType 0 def
14289 /FontType 1 def
14290 /FontMatrix [0.001 0 0 0.001 0 0] def
14291 /FontBBox{-174 -318 1347 949}readonly def
14292 currentdict end
14293 currentfile eexec
14294 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
14295 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
14296 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
14297 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
14298 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
14299 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
14300 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
14301 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
14302 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
14303 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
14304 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE04D37507C3E
14305 D34F972BEDCDF781EB838C4B81CC7415A3C76D9C58D33F2E1B63328CB3163A79
14306 ED96F2271FB9D8AF720E71625E7EC8B297F556E4E780A7B5AB5B83A955BFF588
14307 F9F1D3F3CC4D5DD9C8702A431D1FB2DC1B2672A517B2513150B5A7C0C9ADF3D0
14308 25413F088E062F734F9572FFC91D97769D57AB355AD57DA9D9A8CE6AF162FF40
14309 9E77E2564A583C640601137CA517F9A18A462586FE920C1D4F8895F80F05C1B6
14310 C277757414D5D7C2769E37A67D9653FA81029DC6210ED534673F4E245E0C1A10
14311 F5A389F8815AFA3E225B87955C8E790983C39430C75F6F7672FE8F5B5D10CD98
14312 EEE3E79CEDBB206154AE310AE26167298D99970FA8274E44627C9E8C6EA15147
14313 5F538D77CBD1EF75B61DFBD18AA153C32B6F3E314DD950DDE193E5DADBFC0F08
14314 14EAF3AEE8495520BFD1D1D31A9D8D9A2E50D9084F83D0A6790668F60F7AD6C0
14315 1B95731FD323F754DE565885045369AD67944338E2D7ADBFBFF919016A865BC5
14316 84C7A9FD262DF82DD1B7A76B06A348EC25EC950E250511BCC1C0733B0D928EF3
14317 593C942539038A14C7FB34A965F9245CE99910FFE6BA51649E9FB697DA050074
14318 D7A7D21A099F2A7994FECA8247297578194EC04175994EEABB0773E2A47F6D47
14319 3F9756CE0C1F04A2C9E2D91E6DAB8619663C9B54CB2D539CF52CC6B6D3A523B8
14320 0543E5C5B99A35368D1BB6597E2C64066026BA3190DC801879DE9FEFDE29A5F8
14321 7B523A256EE64261E544F90ACC4955B15713E6104C0F8497EB926D2E948E317A
14322 4C2D8A84D6D5F5F25B800280517EF8AF6C244137E1C43D83F2E814980A99C822
14323 950233FF0020B1749EBBA97830506DE264B0935A66685A4FEA2FFED40032E538
14324 5748A6ACCDBDEF0CAC869DDEFDE714796C6BA453A9D7D12A2BCA32173A19DD82
14325 C80647C9658CBA9B32E2965FA547046F7E559C2E1B1D6511AA5594AAD4403F7C
14326 CB4FE283D388322456A86C09C7213CCBFC275E70EFBD1B678C8A58D421088D56
14327 F247AA68F869839BA984A39B55118773D1003F307FB7354277F8AA28DF50B54C
14328 E2DC59D3233BFE9285ABDF1F5DC092924B8AACE60F0F74126BF5B5E0CD856563
14329 3F5DCD819A8D5AAFDED9E927CF9662EE86C30D08FE14636D68F5C3231B5D0662
14330 B4FE3DB2468B1646E70C1186AC740FB2BC843D925EF0FAFD1139692736789AE4
14331 DD1FA1B5FA671CA6DF05AE8A910B180E6F9B009FE6F90108A0AAFD90D79C4462
14332 598DF206664AD9DE7E2D0BE8AD9B6D7947EFF830400F32ACAE284A925DED3979
14333 05EFB38ED274B370DA4FDABB121EB8A905FABBE98D164A1706AFFC8A5A95D881
14334 87D73526A32605653B69A0A256ED3D434667F08CDCBD04879C7498AC8B95E994
14335 FF0C6A61DD6AB5087F495FA3D8DA9F8227A5EB413E2BB41A07792472EDFB53F1
14336 4E7E4BAD77A4F4F3BC5A13F3D03F67B2EFE6358C6E3EEC6DE76639407656B54D
14337 C757EB089D71F5D7BD278EB41129B5EFA4F5C59B359C2211372EA8D7C0328891
14338 BE5F6A0A3116A2194688C693FAF1055EA707AD52D37A246656438AF684E286DA
14339 A6BC0B8A4DE3B8AEA25061A657D60E2C36D1BC7AF35453FAE1D2310E47026411
14340 96A40F406F24C1A9FB01F1F827C301EA631F6E521DA9A415D6BE607E48647905
14341 DC47D203DCD58E87A9DCBAC079DFD26BE7AD8EA2D015F32850E95B5786855E0A
14342 B86FFB48391393FDF4F8917F93E2E265838696FCE1079C8D314319F806306D59
14343 01EE0839ED51FF8A52DBF387BBA099512BDA1617DB499C384C0933754475B712
14344 B2AA3D7A821837562EC68A2DD2A76AF914A6B0EBCEF847AAEA25177DA75BA959
14345 917DF9DAFE98DB6C269417F3CEC3BCCA32CB4A81C40A66FB11E8860D37C71444
14346 E570E4FEB136486916B2F335A8F897A5D340C63110953C3020418649370B3B7D
14347 5CFC9723DD7BEFE15EA4C7A623E7DB883B1F2DEA306585AF745013ACF56DC130
14348 824BE562A3086DBE301E7B0080435752CFDE4501FA4334F2CE5D6972CAA0A30E
14349 8977819CDE090D0402BF4B8ADD65CA6F816E5103458E498C6D9AC75C7F141512
14350 43D996C8E15E5A5D1C6A8229A99A44D0C2556466F254236B7987E5EC56302420
14351 5C9F1790C43CB6EB81A52ECC936BE934C223F5AEE986E081B08C8EA86321A3F4
14352 EA849BD899A23EA5FF4BFDB666C49BE08571244BA8D628C26F57A2339A42F150
14353 6642CBEA98A65F3A016FE652A15332434667F0807138A5CC4A9C3987247D00F5
14354 5E9F16B3DBCBF3CED35FA769840D3F413E14651039A768A4E292DA4D6B1FDC7D
14355 C07EC2DBC4D52A4641E53CCE32565FFF84A6E42118CD542959F98DB3DA44E328
14356 42B62B23F955180A3B7278F97EA37D3A5BD929E65ACD2E558F73D7A2822936F1
14357 40D86E1DC900344753C23C732A955EA285C94FA8A1DBAC0ABC96649F57DE7E58
14358 C30BB08FA6F196D57E8DDDEF4C2E45885C5CEFCC1896163153862C4E061CDA06
14359 9C1E3F3A9523DF00845ED41E7139AB929E54C9706C3F9957D7D204A06E5E8AF2
14360 CEED07C803EEB81921A8EDF13C9B978671AC30C5C0AE9AD9EDF128B709506573
14361 996FFF006F8E439A83785242ED0AA53658E3D5C2D1527245991AF32AEE511D4C
14362 2FC7273AAC1D10D438E97D957AD762ABFAFDD1A907731CC4FFD460B10A365985
14363 F7D9A1CF5C0958A2888014BA9DC7A08708A3D6B29A7DCEB2DCD67FB3D5A90094
14364 2739DEB8C00A23AD7607577534138AE4B15D84C4B7B5C22AA1F27153C874C9C1
14365 1EE19DBF11EB76A5AACC26DE48CAA32EE2D617F29DC00E97AC2C7AE76BBA5C36
14366 51E885B6D6504FB3AAE54AB6961885232039BDE3F089B8367EC3B1722EA7E5E5
14367 737DC1F176ACB3B40C2AD6E5D354F8148CE1527CE2C233A0C777A8F534CCC906
14368 62593F645D7349742ED08E46570AB5F1AAAF7CE7B90B21A1C48181C93F2AFB1A
14369 F995800CF2B475A92576D75485DC48C5F13763677F45E7D1AFC398052AFA6084
14370 238548B2071AAD22383A1289A36BD5D285F8930589675C0AA9A73213FB0E6379
14371 0DCE125B7AA8FF4E920CD6CCFD9ACC174A587865EE30CD47FD348701CCE9F0EA
14372 CE9F97B599A149D9DF4382D98E1BEFF503D98CFC0094A30004EBC8FF46379DF2
14373 79EA92A7A00AD0CC152EAF04B84479FE9FEF9BEE08C93E676C586112DFC8F09D
14374 662F0F8AE1482310DBFF5032D8373A9095009EE2DD94C933D90900E98009AC80
14375 EE711EF4C64769914F7002F5E5E97097A781420C2CA15476104F2D781C3E4B8F
14376 BCBC19C7FCAFCCCC572024A39B1E7C85B8C0CB5391897B6973FAD7D4DB3A87A9
14377 2AB9F75DBC22BF0BB27A17C510EB96166EAF88C4646B5B6813BB2C0883CB5E34
14378 FD9DF5E66E8CA75AA379732957AC35E2C07BEEA5001890B5077001F6930F992B
14379 FE65A1CF86EE709DA9262225FF7F84DFAD1444B44DA94CA557CB25CF943BF286
14380 2E7DA32DD4D7C983AB5B84BF5808B927227E51E8644467885CF24C7147748E12
14381 43084ECD3CFC5FB9DF70E9E4E278EE880D1F0CCA7F0A4A781BE4AE8AED69FCCF
14382 546221774A27EA8C65F40390BE8BCA0FA476D68EEE1DCC3212B0782FE5B1AB82
14383 6C136BB7B612146B59593DFFD0A0CADE1F0CE5EF8EABE0C39BB2DEE5B7D67984
14384 9CA4A8C0ECE1688BBCADEFB7CEB4ADAC9C7D63C47155ACBF85B44CAD1DA73866
14385 EEC0B930F855F2532796B42E8DCEB86D63748C2F59663529B2D2C996F6D627A8
14386 31C809C50E4D34C89BD0A034352C6FFAA59A53D62B21CDC8AE308ED0033F5C21
14387 F590AF804B59DA2B6F1925BFC9594A97AD757E26FD8571CF8A722C5C9BC654EB
14388 E2158D2B3338E680D589BACA955A6F03B58AE362E9CE86EF54F229DCD2B9B532
14389 A58983B7E027E7118DB42E8F26942E63A76E5B77BE345D2AA073DE95DDE11F5E
14390 D2538ADD45B5D7CFF9739767252F02AB6A1C609C8D47E181EB5A6CC3EAB27716
14391 2366D2EDD758AB2BFE0396B68CB1B331B0B74EB6143DB7A1CA1986832A80B7D1
14392 C518A41ACBEEC17D5A5C31F27D81AF705B61BBBBF32C79B3E9EAAC2C9378E535
14393 0B764BE2ADEAF899B491DC118EE3C6A203FBD7B0C3C3EA63840413AF776F6043
14394 0A09793A4DD6789DD382CEC2720EBFCF320BC34D948F1A597EAA14FA1A81FDB1
14395 FFDF88410B5D21D4F5AC7D67178C57421A80DE770672A0F63069FCEDBF29C1E6
14396 DB9E8F7F08D441B2C4A672EC627172D10DD0A115AC0771657F8B57985CC6614D
14397 A60CB611C44049B6D4D0CD80907B1BD807C450CDBC14891BD1425DED198F08CA
14398 AF7D7179806883B57AB1597065B9B6161CAD3D4BAC7397EED2F5F4802FF6BE26
14399 955C7510EA319DE1BFD1A5A701A39483087ED3F80509D1099F9B38848ECB4BC8
14400 31F7B50B04B6F7E0A540F052BA6BE150DD5FCD6A8FA6CC0A0610DC07304177D4
14401 8E8505D63D92E4238E710DBF20CB16004549A9F94F320F96024C27E8BFDD8648
14402 5DF69A346FC66A801D6CFEB35227A30009293EA02C4BCCDEE4619834FEB296F6
14403 60F08D58ED189587B259D373C12201BBC92995926A9D122D5A091173001AC878
14404 E5E787A1937AB387D433E61AB73C6932C1D14EE16527CFCC0C2AB03FF7315679
14405 AB27274188B56C177DEAB05BBE6D0EE4E8CD0200BF5AA937C3E4F85E260591C1
14406 8FC29F0E6F448C738496AED563243111D02F4C22849CA0A1DFDB4F54C65218EE
14407 ECA811C2AF6A8E444AAD0ABFDFB6056DA72848745C4BAF967C98F3FFEB2EE32D
14408 DB5D5871C53A42F2A212A5EAC7876006F6EE05D1706F047543CF62B12E22D00A
14409 2EAD83C3E17923AC043A9D478C747A1A9DF6335FDB8F27314624BB3896BF938B
14410 14C56F9054CC6A5FC0B48EBE4E2E8AAB7FFE2D24996CEA8CAE5A330D8C45A767
14411 5BD1F1DBD7802F663FD46D6C80AB8AF23481E3BAE442800C12D742D1BCEB2429
14412 52196B54691321A26F3CFB3CFE695C7E7C69EF37854A04CEED2D2A2C3BF7A071
14413 19CE5CE6FDCA8F409C2EA15C0663A852293BEB0F8F14FFC524F1863B823E24A8
14414 5D00263439ED8B2914A1FAFD84DFFA3985EDC8694C29D4551810F9CD2CAEC740
14415 8077B9CAC039B9C89E5776278128297540CA0CBA13092C3D6BC64335A2D3843B
14416 81C19FEC33DD6F4AAEF7DC268533FF40B8AC03FA7386312D6B8983FD16FA4A50
14417 290CE3767FB3E937DFEE17D6A61AA95C29530006B4B1E6EDE30C2DE1F0AB31D4
14418 ABE6967E142AD6E6993375D15E52282BCCD4BCF668D5837386F411D75E8910B9
14419 FC9BB5B9184CCEE3A78173A5413651788700B06BF940C9D2C3516B02EEC66227
14420 A201923458A4CBD572A87DD3836D138A37113F1FF8D019CBFC09E5A519BBD1CC
14421 4C59310A424A723FEB45EF6BFA0E83CCB997626B8A90340FC7D1B223A217A89F
14422 4D2BF60C13332BA7F24343D322F73FA305264FF924336AAD4CDFA6147FD5EA78
14423 FB55C05A5B9529EE5A20C39BEAE4B89B4B6A3297CFBEBF782B2971AFCDFB64EC
14424 06E1403DABB296D5EA863C5113E08762979DFE862B2AD1A8502AA1F4C18907BF
14425 6F97FE571A3C0D59ABC42CA6B28AF249305C797733F46E88F105EDD16B685189
14426 5F335050C1DD71A3754CBE0F6EB63109294271780C608B104295FBA2F45D78EA
14427 6353D69F7C12C354E556F341F6AE59EF8983E4C0342B38CB0D14B1D74A9285CC
14428 CEB0E3A49CF9DE1BBF84445B419270D83EA5D600257AE6CEC1D4574A03D067AA
14429 FC826AA65D60734760DEF66AB7C55CF99CEEF6B7D6F8DF9A818A2F9EFF74ADDB
14430 CEE18A3B3E903C3322A492C71A4B02B36764097EF7610C8BA7BE5DD49F25182F
14431 74A1E33F4444F02697BD13633FF5DBFE6C600CA197A396DF8E4ACD967644E8E8
14432 896F63BF7E3CB80D293F004B860B0E4F1C357058A90731D26E1F0C780C2F682F
14433 86CA4C1C2772BB6BD7125ADC36D464358E797A7C3359E48A05E7D9D90A23BBCE
14434 9224FFEDC73D6C31559F15A7D2579BF6C2A8B5732EADFE2039C2323E30283543
14435 A9433D44374524C1179F933605A09EDD5A33B53526DE44417FDCD1056BECF062
14436 74C81F27305F5FCC71287D2664399BE301BA7832C42F14CB466BFE091031B907
14437 4A7D51FC61B9E1F60F25897B46A848022F4D64C2913DE7A17817B18F3EC54D33
14438 E4A4647162F39A7A27484A712D7740ABA0FD55479C202D1F6B26F3600428014F
14439 8287F331B0686B3F00416C56F2DD56BD8BA04A72B924615C0923E2C98C35BEB3
14440 43C91E53C88AF5F46730327FE6FD443FB8DEF2950CE0B62C8CDE7FA0C18C73CC
14441 4E75F77FDA0B83363F3E8D78BF60D638935B1A0963CBBE3A0BA0FAFEB6BB53FC
14442 8888A16394563A49798CC22D30BA340FF960A57AD44273289B497A0A49B838FB
14443 E325BEA95EAE2A54BC217CD7B44A8234C2C29D11991BC8FEEAD11AD54E7A4F23
14444 564C48AB0EF3F7661F56792CFD4C5BF79DFC50FA3D836863B73259C3BFD7D34C
14445 4615C8FB39B4EB103B4374E8259DA30E04C85E2C485DEA27326918F87DE6C57C
14446 9A4BF9A70C2E552761E76569FDF3142A0DFF65BACA18BB002855C5F34B6CA266
14447 F09C7828FE1D16B3A4790D5C3BE953686782C79E1B4C3A52DF013B1DB1475E6B
14448 3BE84EDD88CAF81959193388FE5E2D2835A715DFD954C9B4211F1E0644AFC9EA
14449 8601D48DCBAC07EB9057AAD2D6BD6DDE79C8DBED569903C464311238CF9259C3
14450 2862D959E6986B97765060B48F70CB735F3C5B179803502A51717245B3A27F16
14451 63845F8284AC6655B4B7833DF7283F9582CFECF202198AC9470B4E2C6FFD620D
14452 EC891E1F362CDD867D78932B672192B741E8E813F56A1BEA33549BFB41FEF1E5
14453 D184C959108F096BBD543980458A682EA0AD0B62BA31CEB37C
14454 0000000000000000000000000000000000000000000000000000000000000000
14455 0000000000000000000000000000000000000000000000000000000000000000
14456 0000000000000000000000000000000000000000000000000000000000000000
14457 0000000000000000000000000000000000000000000000000000000000000000
14458 0000000000000000000000000000000000000000000000000000000000000000
14459 0000000000000000000000000000000000000000000000000000000000000000
14460 0000000000000000000000000000000000000000000000000000000000000000
14461 0000000000000000000000000000000000000000000000000000000000000000
14462 cleartomark
14463 %%EndFont 
14464 %%BeginFont: SFTT1728
14465 %!FontType1-1.0: SFTT1728 0.3
14466 %%CreationDate: Wed Sep 12 2001
14467 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
14468 % See the file COPYING (GNU General Public License) for license conditions.
14469 % Converted from METAFONT EC/TC and LH fonts:
14470 % ectt1728, tctt1728, latt1728, lbtt1728, lctt1728, rxtt1728.
14471 11 dict begin
14472 /FontInfo 6 dict dup begin
14473 /version (0.3) def
14474 /FullName (Computer Modern Typewriter) def
14475 /FamilyName (Computer Modern) def
14476 /ItalicAngle 0 def
14477 /isFixedPitch true def
14478 /Weight (Medium) def
14479 end readonly def
14480 /FontName /SFTT1728 def
14481 /Encoding StandardEncoding def
14482 /PaintType 0 def
14483 /FontType 1 def
14484 /FontMatrix [0.001 0 0 0.001 0 0] def
14485 /FontBBox{-194 -360 1303 830}readonly def
14486 currentdict end
14487 currentfile eexec
14488 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
14489 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
14490 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
14491 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
14492 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
14493 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
14494 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
14495 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
14496 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
14497 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
14498 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1F779B7E7C4449
14499 0E3054D357BBBFDC280420240DC735FE124B0886A477DB2F2FC67ED580E822D0
14500 24250C6EB277BF3FB8813258A65C5A4C8F5DD7A562C845A538158725AB7D8993
14501 B42B21510EA5BACE73D4F283C95E3519C2A57E3AA9BBFDA9985A02C89A1B80C4
14502 B2398DE9604CD6754938F3C1E246C6667EB5AE63242CA503AF97EEB778B275C9
14503 B02EECFC1BDF5E8ED894FD8924638B660B3DF0389B26F07F66277828F9C32E4D
14504 96613BC2666546D81798601CDC88BCBA132E87237F6CBBBB213A1FC6A1C3B41D
14505 7F6183DDD84538DA290031D37ED94651E25181CBBDA11172BC569AA7DCC39F40
14506 1F009D9FDA74CD50FA614064F804DB6B6C32690F6E3DD4A9FD29E632FBE75C84
14507 EB19AD3B385D1EC21D1B51A31BBB96590E4A02FFF067F140FEE124708585FC7A
14508 80EB4D0018C8A0156D07CF21EFE48A70B0B58FA824D3AE5E86B7042A1D260114
14509 8707D80087D9E42A3D7690B054DBFC6A4DFA72DDC65D3EA4245F13660A977FAD
14510 0DE240764D2443EB3A0B338F0E2E2FBB15CBAE0CCE6181B61328DDB881B62873
14511 DFDF6E28DADB46971F3989F980B33BA410C7E2969191DF8221067FF8FCB32BC2
14512 AA6286AC2394A6FAE5F8FDA6BC1CC3C79A0297F6D6F6FE992B3B2B1C977AD126
14513 7FC4B53A93B97A6516861F669A18E2B4EC0A94C489E908F9707242A88FD283E1
14514 BC19A5F2E031DE6A15DCD17C357CBC217B8FADECBA8B4D399B65AE5873EA9BDF
14515 6929B1C79271D5D4B4D99B181E9BD9000FF23382B2D3DB8488DED17A0CECDD17
14516 8D4F777D2DC7496CA8A54DD71AB34760F8D136DB14CE0422227FAD9C5CDEAE55
14517 D0B63CD271B1E47E7F401693F823CB74464DFF46A8E8006362003FFC46781CEB
14518 7B94FC6FB53D5E18F74331CAC37712FBDC504BF7FA65CA458D73989558C19835
14519 5440F8790AA62B3BF15A00653A1ACFFFEB527E7F7C61BE8D5BEC4D956033639D
14520 38159C8476C9CFE9935C392AD1DA47315CDAD06E458370375E568277259E7C8F
14521 DCD0BAB32D05456BF5D7AE8F0D31B4A97DD3D6B5919748E4CF0BD89E71C3B1FE
14522 1F6A7D695F67EA1C7DAC77DAF51945B5B66DF4C58330C03364C7CCADD3F47A51
14523 63872D62E9258139EA4493649A1AA943D844B4F859BA49BD779C3C7F55CA5E6A
14524 DC87E473C3082F63B9CAD6F0E10BB869C910B7A7DD6EE645D92DF2FE97C825E7
14525 D9AC7D0D832E1739DB447C2E20479F66F3BECEB3463060EE1AB3AB803B0FE738
14526 CA05A3B890E925D24B1A40805A1E590FEA12378840D405B31E18DF51010B078F
14527 87BF7A118835ED8B2914A1FAFD84DFFA3985EDC86CD07EE29EA1FB1A23DFA701
14528 2316E7524FCDC9A9B64F2ACB9AE564EFA4D189AF425B96A23166E5930F575D71
14529 FBEB6E8DAEFA16E93C1F23A609D25B7BDB40CD67156FD2ADDE16CA010DAFAFF6
14530 DE23CBE6A297CABC8EAFF7A9BD9C333DDF5AEA2376B02DD4BC9491A7AAB3C0E5
14531 4C80D2CE7C5A77CB6B66763ECC2E11B61E3186ECA0F4B8C78DAE2B9C27B25AEF
14532 0ECDF6D938CA8DB4E820A9C81C1D37C2CFB46A86BB206C8FCCE78BD758DF4143
14533 BE17E8AEDE9355F68F76666D8DA05AD3347EFE165DAB87E080AC09E9C57BA5F3
14534 730400301AF70DA75B71E12938E91EE829D10EA96F411FC522B7AC9A2B673EC2
14535 9ABDFC6725D92CD82BE2BF67C46FD82BEEAD417F80EA659192BA8D3B14B11C95
14536 3D943A53F880D59EF3AA782D066878AA0BC6B25828B17DC59AAB0204E38602D1
14537 75989FE8E9E983E50DDC83CC3DDFF93BA686CF408F19363660F3888FB7476BC6
14538 3C53F306F8DC7969D2C61BDBD1BE39602C603E1E10F060F08D58ED189587B259
14539 D373C12206A7FF8297EA11745022C5854F50C7D92BF9E12981289C8BA32C031C
14540 B0D5CD360E5149E90B47B7990C1DDFD8AE8F680D6D36D2182564CBC6D032FD49
14541 D5AB137C104DDAFBE21B4F48A6FC603D3AB7CC8FCB90A018A8540F2A31ACEC2C
14542 AB047819D02B1ACD5D48A229E788CEAC05CDA985315C1BBA1ECF0CA773065E17
14543 744839EAE242BD3AF0772C9EBEDE3FC303EAE11BC75FBC706311191E76671B2B
14544 788F5C9DD15A93C258CC0A2793B013137AF0D768D24440C05BAFB44EDBADF26B
14545 8BA09F51156D3FC8A6CE75C46005D634328D15C87B45141AD506661CEB4BFA16
14546 A33873DAA93BCB493BD913CCBE31CFD5E8082CD99DDEF90BF7E49BF6ECA34AA1
14547 4DD2BDC5FD3EBB37B7665EA3AD3EDA4D4486413801D7244595F85A708F1360F0
14548 07C1D9B1DD84BDF52FF56B69C7A437E8206426CA4D5C7496EDB4748F1F95CF14
14549 177FB453C00D8DAF390C7A536837513B64D21A8A67E732E2D31DBF9729B4CD38
14550 DC959E22D46FC327F2101A79DA20D22A7E42C5EE670C5BDBB01B5E584B9AE29C
14551 03A9637040CEF206196B9530AD822AAF698BBC6019DF01262D349AA210D337A5
14552 940ECA307F781FD47FC6494038ACE864A89F33E4DF9E0ADAB5213B4F1FDC4C5D
14553 2CC96A89170BBC0019674E857087654343FBF47F4215A6729D11F396F3E8F5B0
14554 A60C521674011E5F20A3565EEA7543FD3B57466FFA35AE3951F03148BF9BFEE2
14555 2C49F950A31A6912A8E62A9B1A04B16B38EA429C40230FD36ECFB7110BC3DF57
14556 33BE741E34475DD07FC03ABBCBDEDD27BC5081D0ACFF86247EB90AD067E26ED1
14557 913555EA18D207397332B2EDF5F85B60274BB4A257C251EBCB59D554360C4224
14558 F6F5F52C89AB500B8CB4E904FE48C9CC06F195DBC92377E611AB2CEF66527B42
14559 E3BBEEB91AF7DBA148EA83B33936B47019F4B8E6142FA206A67C4E0D4C2F5D90
14560 7241C2E3684FB04DCC95C91FD3967DD4DD10899F9DA100E0941B86A91682FE1A
14561 6E115D3AD9E9AE3A34049A9CEFE25E2DD3676A8A9148B7B084F049E32FA3C614
14562 534ED336D12D2DBEED22E79A0FB1561CA675565CF5D7D8FCFD3FE4F4BD5FE64D
14563 FBC77E33356ABA4D08EBE43E676816DF010282199F40F0545855CD71B7622722
14564 8D7E834A3AE1AAD75B6CA1F7DDFC5C1634BAE86D4F2CE974E01DD8658FD241FE
14565 7988892E53C5C969387001C142E097AE4CE80AD360F8212B6607CC677DC2C82D
14566 88B0BF013FD5E6B8974BE5945F9A65475EBFA9FFD29A2BB5104C2D1520C2A7F5
14567 BCA90F1C4EC2C43FBAF9579554FAE68C578B3B5B9E4E99E0CB11E1BC6B53C4BD
14568 7F7B19FFA3EF4A1695F7C504259AA7BA2AF43249CF8C2EB97FD427B53A043DED
14569 3DF77D4343AB2CA195E397FF2CA7835613D02AF3AD430E4910D17127ADA937DC
14570 5376219227C62BD779D9E64F181C28F6997EEB0669E532A71D06278E80D3F95C
14571 69A265172F7BA4EADB943CB326F29BD7AF29B296B7CB8DC3C8C6A90BC4FA26B7
14572 7195A895F9E3481F303A60F8B73656C412849E352286CD7622AE5A33C6003F23
14573 292A4025F44039EC6C7782152D2D1A294F807F1F62F1A0B45065C712E8F1BFDF
14574 2249916C9192FA09BFFFF066ACC1D5B24A1D21A9C8661DB8261859EB26EF39F6
14575 97D96749677BCF4784FA5D7977C6AA97121E180BCB0A780DF6F3A23713F4ECCC
14576 67FCE3024F40456A60D597EB580B568E6AAA0CCFC12980C2EF7AF5DDB5318F92
14577 C6E3178467D9742F029D0207E2671EF952C17573E56B29B99A1B541310852D77
14578 1E946E9945015E9DEEB9EB267B3A272AE1CF34945207A8DE2FF1F9AAE22B32C3
14579 902F0EA39A778405729FA64B31B890E10374F4F96DEC455C6D5DF5818344B243
14580 149AD52A9AD5758B0661B3A1D2DCF495C4E276CEA6BC2152B5D6053506C39170
14581 592D8006EE125994271F0B5B3A5148DF78B0A129E27B05D967B7A8CCBF477AE6
14582 756D1F0F15B85D1DEF007C70AD6B3ABE2F9E0CEC9DD7EA34D08C4F16FD3723C6
14583 DBDD597644CE56746B5AA9F05DEC2FF008B6A551B0C734BA5D0B92557611B06D
14584 69873049981545F3C77B0D14333731EFE5A2261DD2E5776F01B143AF21963903
14585 CA246CC8CC072B11B3A9CB3A8152AEE6AEE2613DF7C77FA59010166C27BF4CF6
14586 F0D3C324C1DCE8A5C8BD45A39EB35870C3DF29E97986537516A6AE978A93B63D
14587 FA25147C28BFB42CB8071B25846146E92F6241990D4781BB77FF203C063E2785
14588 B8DF71CD39F600EA6613C24B94E5EF76557212A38887ACDE5E1607ED163F50ED
14589 A0F8C55D26FDA5546087C2755D41C6192EBBDEF781272500E62221F1CB8A5F93
14590 23980BCB64DE2B5330FCF157BD4709C3FC1A148773265CA8CE7B00B9C3F0AB75
14591 08430357F9F16BBD72F77A2A67EAF68DEDFBD6AC212A8F865B4254BD6CFECF55
14592 8E6418C80F41383DA439E45BE3B5FFAA93A6003301365FAA8A319EAC27AA2588
14593 082F0B8255F7C59FCF9A8F9020B01D38410588C12A71DAE2B1AEF6EDCF144F48
14594 9EF7116D3411A7976AE7C60804E0E96D97B8A79BA80FA383485266754CEC2D9C
14595 426F11118E79D1F3E208CC5331338A70CD9080AA97508F31B47F46D974468859
14596 0F50E29F1C2B4D56C375945F7539845881FAEB384D5A2A7914297DB82A1C7C63
14597 DBDB5089BA3FD9A9AF7C7859A6D73166E498409C3E7865A3F2A4D7C07D7F20DB
14598 E0525068F66EF1B00BB47A1DF1FF08C8F7C11F685DE55A83EBE38429AA590198
14599 C595733339154D1E1490B38C4729C67763358A9D8FCAC8FE822A6AADFC7978F1
14600 4D1AEFB4E8861EC9C429D89D4A615C6BDC65E9CB0E35AA7FEF980E86CACC1794
14601 397E739C254AD742531C793970867669C0587DAC3A4A3FC5741841C1DB4D8D7B
14602 86CE8CC8967E1AEB96C181AB61AB535883ECE15C725DF295DAA85778099F37D5
14603 7B0B774F5D113689C1751FA327BCFF2CC9585594C26BFFD4D9B82BFD6C6FEC87
14604 6EACD334AF741BC17C9B26166C41870797CED5DF95EC3BC31D3FAB9CEBFA16EA
14605 009223C277E6A0FC6158005511B081A79434C8FBE660FCE3AB1CA99F4009138F
14606 DD4A500FE3367FB7912F09465E34B0E51B93068092FC5DA011506E721D1550A3
14607 13D43B54DBEBB59F1BD0C81FC14C6A8323B062077E9B579190F177BA04D63516
14608 D012A2C649F79101E4F7FEBFE0B9B47D3138F766C68A02E63ECFC910D0CB5503
14609 ECA5CA374B66AD2D35BEB5B4352370EC61FDCE1FC102430C3D21EB64AB7F461D
14610 BA3ADC77B781EF06026DD3382F6CAFC5CDF08C00E06E0195EAF4CE98CACC15DA
14611 6F4AF54314CE6897429392BF6CD7E211F0362C60E8AE3B287732A74504B07FF1
14612 CD17B88DB8F1AED575F353B94CD698C2545FF3E3EA9E4947FF31DBB8C0E4137E
14613 DFB48C71E18E5C612529C9B9A1C8C5D07AF709F4E111E6AB73E5C50204E881A3
14614 D41D0D5C29D2F108A9533884C477F6AFD2C8145096B54FF6F5A4270E576D84C6
14615 AA5616210C1FC5002FB5F566CF858A46BB2A8E36EEE2A9FD82ED56CB43228470
14616 2C5F6840DE3FEDA12B9E0EBD68F2F2F16D656471B51DE3F0A59667F9434CBC8C
14617 49FC0FCBC63A74396ED8A13930118AEB195F99F5CC39FBFC6EB833FAFE81DF77
14618 653E23B38B5C78AE43C01ECC659F95AAD35C824CA29486FF5A70949988BBB9BA
14619 75183946BF0855A676753D5962156E0C8A058569083D3ACB37905DABAC804D86
14620 0DB6F53854C664F25749580AEF74461289141BD0F72B8BA4F1C73CF88F2D7B73
14621 B08161615A3A0FEC0729494003D58906ED0FFB75A752349C5E7DAB444162C5A0
14622 669500BC42B8784CA9068A365DD2BB6AE0054AFD0A6A63D1991FA99DC5E168E9
14623 6F432B66041B294EA92A370CB1DBC3E3A472D0F81128C27406AF8EA4A910FD6C
14624 3E13692EE0F768C4DB825D587FB71E82D1A537C094D2865FE30E93AB095B3857
14625 5EBBA555936618D513127180FA8C17833876B152EF4C7E85E5FE283216A4378B
14626 048A811626E6E23AFBF5EAD2922C91F87A53D8F90EA0F50DD917C678B66E566A
14627 EB86DC98EA7FD3DF1943B6CC9BB157D64DBB0FB5F4DD67DD7BA657DE4A57B781
14628 D221C2E0C92CFF820CBFE1325FABDE1006E3D3B4E46E8ACD2DA44D0871528402
14629 0E97B3DE5A1C9CC82CA5E6AFE7F8F903401B6D1B1C24FA4195B170A79F089352
14630 1450EA2EE20051A03A7907A725B02F08D3CE3720E27DF57AB2803B20AD604926
14631 A1F1C84F6743B985FB8048A4BC9A1CFC4D81B657DE03ED3D8B47D42F92B61A91
14632 5C25DB7BEF54369232D006ED7A42A296FD715125533C84D7BD52D6753D037887
14633 C4B65A656CEDB164E81175CF71021D94EC9526C9D33DA9BF6443145BF734128D
14634 E7EE3E332B67F9A2F7AD02EE189608267FEFCD4B77D88AF7E79C1C3EE2794921
14635 34B3432C7098C8365C77CC210177164F2B8926E679936C6F0FB5C583BB6C2BBE
14636 65D92DBC4AC36FF1FD4909E4BDEA6DE170F610887C2951D0EA79B74E2523EC60
14637 880FD4C8B8FD51449F12FDD82E07269B8992B8A05CFF40BCABB8EE5943E0AF23
14638 71B964F478088B63669EF26D64903C2293ECE3F54980F968AD89CFE59086EA48
14639 03FFB4C638389984AC6C9CAC0D5C42C6A05E81B2D105CE93F5C9ECE5F23D7160
14640 AC59951938A6CB2468B9884CAACB562DF00DE67D6D7ED1161591CE32D509438C
14641 43FAE9E726935DDC68DE6C781BC3A90F49453AE90513339DFC42255FBB61ECFB
14642 18E5B960865727DB344F4C566D25C42F35F9DF4D9E2E6258639775B8E3FBC1BE
14643 8F2E260434DA3F383A3D91648E4D1C3409F62DC4A7E06E782FEBEC19FCC9C86A
14644 B4178AD44469296E837A400EC7E1709AD7D041AA4A2A0BEDB4FD0417227B6FDF
14645 EE0EDCA87B9DD51F01AC1C215C915205F1067121289BD5D224B674AB420B7BD6
14646 D06484536E6CD12016975E45F191865146A487F39426EEDF2D8A778070B8BC17
14647 E9EEEB848144C593677426C6D0EAB6CEC4203026504A89E904C8A3FEE8D1DD41
14648 3BCCD00AD66AC17E63377C756E85205138C6D48364F827389094625D5F7DF0EE
14649 62F39BCDEA9706D0DE9D78BB1C8AD739BCE8311E97C3D6AAC538B46E5206D476
14650 49CBEAE6B3681E9DC9275448A68077CE35CF573112328F242BC959B1043C438C
14651 31DCA9696C282A37F42669DE92439BC9D4148844453974D4E2BA32941BCBE091
14652 3AEA983936A6C8C647C4A9C609BC4CE0F7CEB2BF8873C5EAE2E987EFAB2C3C08
14653 E38357AEF4D7A7376984FF2FB292F30D853DC5E6BA25574158AE9A63EC8B2A79
14654 F39E645CBAA42FA469C5D3D0DAD543F52EA2C8CE22F4573497D3911E9D143A20
14655 3E58207099433AC37C9A52426D7B7A92E1EDD14AF6A4D300B1578B0EDD5A5709
14656 731FC9D8566F12B955CAD748A7D7AFA00AA426C021230148E0041F205407839C
14657 EE5FE6E077364AAEC290BE7E5B23E1025CE46C93AAABBB713539877C718D28AA
14658 6D2B287CCEE75CC9934D6D85F62801A8E30DB734BBDA14D79E285BAF06F871DB
14659 941811ED36B292EF176138A88B16C314B427BAEE5B407C7D0760DDA666B64326
14660 393AB1BDCB8F09A5FD1F4F26E1624D46FD02DEC16E24B30259FF33652B5A4204
14661 2A65608248E964FFC5BCA6260C6D7171EE900009F02939A2DDC1036C15AD7965
14662 A34D3EFF2FF4BD7C970E4C519F1957F990524B9E26AC8899CD0DDA28B94FE0C1
14663 266549069AA043DC9DC3A1916F717F3D3A277056B987A51BCE072BC4015EE470
14664 8CC47EEB700A4619ABC955B81949FC630E040810A1ABBF50807ED4A60011BE83
14665 8D9BD0ED7AAA3C8B95FCBF75FD8BE023F84AF0EB13CDF12B57FA61AA135FC788
14666 C24F631414952348DA6ACFD677876957BB8F2A6E556E4B4DC1DC674E2101093E
14667 0F11DA6C227B73B08161615A3A0FEC0729494002295A65E59B15E932138CAC1E
14668 F93C280ED713BC49BE2DBF9663739C9EC2BFD00F84449B87CA7435DC8A6088C6
14669 B0DD600EB57A2398AB8D21F15E4F0489411A07EF9D22EBAD05161A3755B730C2
14670 5AD7BBFE1B129C72793BB97F1BACCA3210B7ADFFAE61F254E934BA4EEF8D1F22
14671 FAD6B2B2205CE966D64206E29CEA77370AA8F4036F1FDEAA3482339446733872
14672 D15A03C4ED41FAB734278171ED49887CA8FE6A3D8C38765D189749B5BF650B37
14673 2BE81895323E3AF598EB9149B347216158B45D1F6A18EE93F1868E8A1B13FE09
14674 06339F84190D423B3D3289D0453701393DAB03607172EE79C5DD9FDADCE7C566
14675 AF4F33BB22FACE863530C12720DBE461FEC4C00BA33DB12CE38B8748686EBADE
14676 4B4D44AEA5C4FE5D7849D734ACF129915AEA5D9229D2B9C3178617094102719B
14677 A0211BAA88951B939350AFB9FA5F642F6F04C3DBD06FA117A4C160EE1312C969
14678 322A29DB6A06A99FADFDCB3D71CBB866B83429B3B61C2C80341A96F6EA8EB5F9
14679 411DCA747CC217F9F56A05CBB1CED6C8E458B116002CA02CAE79CF2D574DA359
14680 0A8A20693C795088A101B9AD17929380F2300C64BCF1CCD842308DFA9F80392B
14681 B4CC21C1179CB6CC1E820CF9FF3BE6283366F1A023D9A302B915FF910E63CB39
14682 1CDB119C4120D06F11537A60DFBA63F1F41CFD50D266E94B6698BB8CBF4FDAF0
14683 D98B1128DAB29785407C494E561534BD3373E8D679CA5B0244D70751A782DA56
14684 A87801D9E2D9E33F0E46A3F7E15687CF71BFAF2716D0CD766A6BED0621D11331
14685 9D95D79BEB7538AB553BB62BE5505F275EF5835B8481A630563711901BBB7D87
14686 607CD598BCC5F878307AFD49DBC0316AD8F7098BC76CA1F3034734D91AB4F57B
14687 B7CF62CD4DD8B065A9C410314EADEA7667E1851CFD7055E9ABA4FA6157046177
14688 B2AA37519058625F9BE81F48BEDC9AE6168B553544E0913D4554731662930C46
14689 EF20FFEBA5E9F09364B1D9CC41BF3EC1FC50292D3597D5D4AD7A723EC1071A13
14690 740C24145222539FB7772F7BD8C913CA0FB37FA2C153261F0C3FD7A04A188337
14691 9F1EFE481C7CA972F80EBFB33505DF478A291BF4FFEBEA04314EF677B432A407
14692 FC3DE88BEA659429113075463C4214B86E9F3DED90B8A3AE1101D011D41BA245
14693 44943A9593EEF60A8505E00CC262DB1D363EB5DBCDC224D07A24B8FCDF5B10C7
14694 D3E55F65BF2D76ED6CCF2D72FA9EC990BBD3BB8E9F0456538CBDF57CB889914B
14695 0B47907F08AF08F6C8AACDB2DD3A05D5FF8DF8459F1AFCF2841A2AFA548FAA2D
14696 CD12570443FCD3BDC6D5303B01FD7E57B5FC29D9462AC46ACFE18F49F24A85D5
14697 9CAD0DF85BFD19567EA7C79D38F0185046A500CC54BFF9CB2509B6551EB5E1AA
14698 DB190332B9E2CD8681B8E7BDFAA8640CF1B8CAA8F570AF31243F791A848AD6FD
14699 62685D5594F53194E17A08991F068276AE27BD060BA3F1D894998F5E1689C4D5
14700 82EC7328601320D896092400C26EF0ECDD2C058A840831A6C7BAD9CBC58FF9B3
14701 CFDF386232D13AB5EE0CA3B6F1D083A36F2D86CACF1A19AA41435DEE264B2C13
14702 03C0A8AC13EDD7D7770A365E51EE47062CA2E5FCA74DA9D0DC2F7220D4DE9310
14703 A945A761892E4EC266DD36179DC20D916022CC1FCAAFB4755A6DA5DA9B6FBAD0
14704 38E0B3CFAC13492DFC5B5691F3C42E46ED111FFD5C24E79ECBF33092B5C0A897
14705 31945DF1F2C118119B191D72DB390CB5FE2334D6C3920FAB1B2FD02623F82D93
14706 0B71AAEC9BAFDACF01CDF9B995F56BD2ADDE16CA010DAFAFF6DE23CBE6A53585
14707 A316228629C95194CE5B022D9E5BE211981D4C4AD169E5E49AAB53CEACC46107
14708 6AC11AC9E1561406CC29E90A51AAC9346215BAE9128FE3AD12C19DB89CA91F15
14709 452FB0770A2F452FE8C9CC6CD829EC27C0DE75B2EAC43B4C28AE2E120D2784FA
14710 A9A2DDD36EDF5C0F4E66C309D54D709C50864C1051EC21A73221F6C261EB3BB8
14711 02BC07CB5E51D27F6185B280E6D1E63EBDD354638EC48CC49BB358231F2BD650
14712 B07D872CBC01CED984603A4226509FE3AC29A30A2AB3DA276A716C0019C7EFCB
14713 31B9A798C19754DFBE0331BFF1AAAF7CE7B90B21A1C48181C93F28148572BCEC
14714 5B31B7B8FBD382CE9E7C4BD49171D146316BF9BA1A4E969A1CD9797E056C430D
14715 B1951E70F9E6E773A0CD4248B15B49771A3FCCBF9B37BD1F233A909C9E8EC214
14716 A37E5862A9B1F1B18B3EE2B87190DE965792F0DB75B3A2E889CE39385C77FF85
14717 D9BBC6A24734B4587DDFCE77CDB4FB7E107BF2C20144CC9C5846C71C6B636246
14718 6410CA7D54E62EE33AC73EF5BF683D9A332101D344D26FCEAB44FE0219E1FE9D
14719 18D7BCEC0562B4A5AD10FFBC85F554AD7B9F50285AB25940EDBBD3E7DAA26A55
14720 27A212C90AF62E7F928FC5A0DE355782188CD1E9EE8B39A0D38C5CEF0AD05B3D
14721 6881ACBC6C811D416F9B3D5BEA1B27BEC92CFEB7394D5B99D462A384FB6AEDE2
14722 7BE8EE0AD75D15E78F0848BA9ADB75D1044F2AC668EBFB7EA2F8C7D14F9D84BB
14723 AFDA9162508803FFAA8396C20649B62A7623E77D6B4CB1B888469DF34ACCBAE0
14724 A19741376AB9214DAA7E2F61BEEE532C5CE253837BDB4F88D88FC8C73B78F1F1
14725 00A9123B155AE0D48770DF217D0EA0772808BCAFC6ED4C2141B83BCCE1A6FF19
14726 F68BB415434B39403226C0FAE01FCD2159FEFD3ADC575B231CE23085742109B8
14727 7E6267D1DEA0BD8CDB7C6092CB27CC98610F35EA1148C3A85A094864E246704A
14728 91E34EC130AED81877EFE4EB37BB7B802358B4662E40A3AC96911A3E50E363A6
14729 563DB556E660B7C33D02725640696B371DA41952760A1A676F96728A9A20D13A
14730 D762131FC7BDA5A03B5DD26329299C925F3A18B2625F9556985A8E9D7EBDC78A
14731 CEC1F3EF29E775E1C4E4C7A4B82ECA8876DBCC17324EE79571B219B3843ACCC7
14732 82383CCFFF61D7B38EE8C9F376DD1FB9FBAED8D52C6EBBD8289D0E9A984A2C79
14733 30E118D43C83833FC8F45FDB5AE79051D1435B98496F7C7C0EA03255B9ECFB39
14734 FC538AF30515A1C8918D8015AD00E2191357C6E2736E95E6CA82F4D4D153235E
14735 5476F217324345F9908DEDB94A76DF11C173EBE1970A374869C3D4DAD6FC517E
14736 A536BC8951002536CD36DF87833C4576D24A193B4192900C12D6A78950B93F1C
14737 94F11476BD78B2325FFBA6A0E30E46E86A5AC1C86F26B754467AF668B9B8CD11
14738 F31FB75C3E973F69ED9A777EC0E9DB507F0DDCA82E589B79E9792A203B13D798
14739 64AA5D4F13695138F3AB74E12DBDA229F9630945CEFF1954A1FF65BD8F40D8D4
14740 64C94C6EA77630CF5A74F5D7E13104D5EBC6BDC8417DC9736A3A5009F8AA47AD
14741 7514984DFA9DADFB2EC71A920C9DCF97936270EFD297FF21A804AE3DA845EA48
14742 520CE409B509D7884DA5EDEB4B417A21BD6617E4EA740A3F0DB67B02C9F5B7BB
14743 957F7BF1AE787E8E4B5D7BC96FA23F67673A8174B5E91882518BC17AA8EF1CBA
14744 E9775E4E084C4ACDFCC96EB0914113B3BDB005D9CB9DC887C23A2C6C312C6349
14745 DCDDFD47AA39764C20D90FACD7EC702B7E2BCA16C510B999F2C79160207D979A
14746 968B940908D65F11853FB779ACC6EA36DFA64CD70F522B39834C2436CCB54BE3
14747 CC18124AEF1C56CD1A02B666133C18EAEFA25E625020B56DA1BEACDCF12A9E0C
14748 0F647788CF1CC9BD04C4512CCDAAD015EC8A301F9AAAB2910DF1314D19FB893F
14749 2AEA58EAC9CE6F847C9AC1F9BCCD8114FA2112A88D2EDB3CAE1DD1B07F793949
14750 B53EDE8601EBCC13D9F119B813E15DA2BE3090B1ABA25258E706979BF74311BA
14751 6B538C00AD7FA9FA044C5A574B9489FEFBCF9E2DF3664489047D91724BBC432E
14752 470A46784242143516BC569187AC6FAD645CE655C6349B7AD6D1E5BDB6F9AB1A
14753 F4056C369DA9AA0F8C0F3266FE2BDB0ECDC694C0A0BD1D1CE937890EC3E52020
14754 5FD96880ECE94B8E6EA72FF7EF2047FF0B5FE2414668CB1667A35432D5EAA610
14755 4B726CD2B9B1844E06CBB204A8F2391DB2EC4704E4C7DB807BBA1E3A4D1025B6
14756 30C13D74E792976737C4EDEC7D108E93449AB8BB31789982D566148C6B0021DA
14757 12FC7B595D344C554209CF14C15DFEE48DC1993EB5DBD0A3FD8A9F88AF43B229
14758 22CCAA63F2D4E96E9E422F75140C6CCA5B4ECFE34CCD0279E0F5079650DC8F96
14759 135F62B792A29C10E4F6E88D8CD565397A6845EDBBD3E7DAA26A5527A212C90A
14760 F62E7700027DEE6FAEEA505CC7FBE5464EF4127A46D1B94F529726A26CE338CF
14761 E5F50CF47A67EAB0E48C62DE18ACA26481A48A9E0AE92608B90F73C1DDDE691C
14762 8FBF4E59F6667E71A36A782472DB13758307085B236FFDB1A192D8C4993C3132
14763 9C0933CF4A100B0AA71012BE6D2CAE7E22C45E6E106E1337193110BCE6153436
14764 D889DF33A8E1101310206526A067F3EBDBCDD7922FD97A6EEFEE6090A1DF9AE4
14765 29B46774D148F993B882B61069D0DE94A4CA2FB4043AC7DAECF91FE837FB59EB
14766 975B479CEA0E6C6F76FCC0454612FAADA65EC6EC83FAA0C7E599AEF82993A388
14767 B8490DFEF8F537998597B2FDFB71C20DEDB1549725090BFC0596AE4F530A6DFB
14768 4AC18153AB8059C9E468FEFB0ABCB006353648DA6AE3131FC978766EBE596869
14769 FAF56CBF44E25C3EC5BA5C82C87CED6667D2D40F5C7F4B972A641B00DEDE85C3
14770 299C13270B89DA5C0C487406E9C1CC5BC9A9BE0E1BD0457AAD37CD2D4D036337
14771 A1D2AA8496C5E77D60C96DC3E56FD28AF18CB636FFEE11D9F2E1E200BDC0C8F3
14772 3C5668DE61906A2CC9003A1848DF8FE8E51D9DA0422B3C323AFF82271FE22791
14773 FAC321A688E7F9910DFAE65D713CCF6AF25C1057AE07F9762A049FB159F4C52F
14774 DBEC766BAD7F4C72F0A343B79E1D4C9D7C0C2C6126B14C41C029E9A4E7320D85
14775 B987AC46C57F81416876F3534D7B908C998341F7A53BB70F9DB3CC9C894CFD8F
14776 AF466CA11FD65D7207C5F92022C5D8E51485EEA0DBADB82856C6369D2A4F2C8D
14777 13724B218AADC4B026D06EDE524EEAA170C20F8FA7E85BEAA6DC683CD294255A
14778 A41FC4BFB36876B5A6457B892917CA7B902309CAE9B7A4706325806A394634FF
14779 7311FA695AFE6584F0A6F59B670996ED91EAE32DD4672CD37CAD66DB521351F7
14780 47ACF26571E3B2C275CD0501617022EC6FEB8BFCBFCD73E96480CE7F978D4344
14781 44E6BA9E6A2F7C2AD8E85270F4E755A55A19E0E76C59B1B136DFA6573245CC7E
14782 A6AEC349A681931AADA4A4CD53257EA2BCDE7EEAB1DCC71DCFFF624E035282E5
14783 FA1236ACC0FBC7C94A3EACEF43971AB81018E1A1443CA8E39245AFFEE4A232E6
14784 F9626745ECA614F78CB5E75F4C6636CE784EC1A7909E909D724509C98058B68C
14785 3CD377525003EBC0DF06BE2986C124C0DEA1983552C6E8A75E1DA22C4DC4CE21
14786 59B139C262332643E24582DCF397C1C5B6821791EB06C80B1329E92399BA1372
14787 6632F177668AF1AF59F4A534AD0CFB082B1D8E6D2353EC3209A7EB25C39E8AE3
14788 44232978D1FC45FCB84E2248DBC10CC75EC1B938107043F0D7679E822203F21E
14789 9977D171B15DD33AD98A925E68F7527488B25CA376EC614BEA4DDF8491E5A9E2
14790 97ED0F5E004AF837EA7C078D708FB02B9C55E908FBB890C5C7222AB1060283C0
14791 C553E5563DA5F894941B64CD9C58BFF9F5EC1BA33391A60E465827E8A0B55336
14792 74B9B039D48C5AC921E2F2AC2B228CAD39241840A431834008E8448ADB78D438
14793 A56AEDE025ABEA630B1D89E5835B0DD4BCEC788BF2934AA97CFBE378C0EA2869
14794 4A1C8C85A9588432E92AAA4B658651C5705B19BB055EBFC65565CAB2143ABDFA
14795 4A737028E3C7DE31E4E520361DF241E2492BC07C084CA309463EB975EE2F7BE1
14796 00150EE39F0EE2074F57C71D65F0BC75A07D0448611C06B2AB6632B61C6213F6
14797 59D4C6BDA43FCFAB7E1BA0303BEAF123EF489F6126A199A07D456273B6AB1037
14798 E85B0310A153EB711DC1FFCC45CC7EA6AEC349A681931AADA4A4CD54D1895C36
14799 5D9B418DAB42E32C9BC594136F94E211DDDA11451304B512A0DA55686EB27B70
14800 D856D3D6F9C16701969CECE3555E3CF563259E6BC35930F7B4EF9C75EDB10FC2
14801 F779901C98FECC06B25E97892E09B979F5FF9C9BFB2F72DF2A0F3C318333382E
14802 A6388B3077A1F86BB8CA5F5108063281861E9A4219339939252194463F90AD6A
14803 52E1E8978A1F6E7DBC86382033CE7E801178FB41FC881A09E33230981984D612
14804 DBB455D062D5A8BA2AD366E93E476563AD2F51D2218D2D2378912B980D623928
14805 358821227C1ACA70B7B388B3E8FE676823FE0926718FD3713C6AE898A0F6EB04
14806 A9D2CB2985041253E32FE8638F1F2033DF4B6179070C904B4AEBD54996706AB5
14807 1991B5906BEFA5B5D6BCCA5F196F28847A0F757821DA85B6724744DB3ED87BEE
14808 605425019F309E87F5743B651538BFEDA3BCD93B468BEF10EC0C46F4BEFBE6E8
14809 35E58A03B7690A98D0887D850F2AA26E37D6D3AF4180565CC2810636D594C609
14810 48FE711ADB30AF5F8DB069FD98201ECD2B58C48B305E53B4517BAB48DED8C324
14811 1F0B4F32ADAC7D618A937D90CCC5891EEA9F03105A483D5A43557F03F4644BF3
14812 1F27E8CF35A20E7F9061138FED81D4E9E0C3E520C772C5DB21BB9E9D6CA09289
14813 60579F6436CEAF49836EEBD6D957F7368EA1DAA2649DE89CC72C79287E82D34E
14814 3EF8C7EA2FA6C18E22DBF3742B6FF2694D34F46001319CBEAA3A49614504C33E
14815 73D671FA1EE0B245E0FB01FB929856BCC95C248257AFCF78B5AD05728787EBF0
14816 64D5A965CF29595BD5A8A00FA4E07E1445827779564F17C7E38B333C7B246AC9
14817 6DC3E56FD28AF18CB636FFEE11D9FA7C05C6DE8312474589418F10A45FDA8715
14818 52D27B17377D335B1CDD913269816341D10663A1B26BD72FDB3CF816719A53EB
14819 BEC0D2F76531BC9E9315D4192E141233CD8933A68BECA3A7C536836ACF5A2EE7
14820 EA03B1B3515C56E24E948DD1A81F988A6DFAF89EA0068B8A00B7FBB65F3C273E
14821 D7CFA73F1590F90DC588808D52E462703F6251F58BB47EC7EA51399E75F2EB6E
14822 9806F3DDB54D82496E3C99591FAD26A91A4CCF5D2513062D97AF34AD932FD6AA
14823 8264C370708D8A50532210658CA60BA8F45DA70D25766949D36653F042DEE328
14824 E9227CD706507E8035D4FF822196FEB29E48A58F615EDCC9947F32A795E0A9E1
14825 4AEFF3ABE0605909792BD183F541EE5B483C22AE9A15CFF16DCC8B88C7865AC6
14826 B86BC41FE30BA0DC23CF2E78D333E885883790F18A87ABB2E339DA3F03FDCA02
14827 E340A35A0C2B62F1C4F4259E6596290A1E7E0BBB5912D6B87175F272E4E3C12C
14828 98166AA4083CAD660AF78EA61BD66B3714B8EE748BF0742EB8512B31AC3E3B33
14829 C3F21E0385055EBC0DFB7682CF489CC6FCBE00A4EF39BB437AA1FFFB75C1502F
14830 623E4865D8458D291FB06025FB4392EF087C1000ADD77D2F2E97A82481E49A6B
14831 96E53FED60C902161853643A2EF56BB682CF20716B559A93FDA0D377450DE257
14832 261D57068B43EF2DEC53B518821A55634B99DD7E5A2E66BB265F68C2389EDCDE
14833 2FBE1C1669B4BA30854D6D0D0CC4A6D1ADC46D04C670733B2C23FCEA76ED5B4D
14834 A1D5D065E0C3D5C01B95731FD3267068482015FAF8929BA836CE401105AAFEF5
14835 943242790378B9DBCE27D9AF179FD6BC16FA9C98F53DB52D5BADC9C6524D9749
14836 867131917FA7EE6FD52921A358CDB75221E9F67C7881FF976C898917A599E09B
14837 53EC91C3371E6C06441FAE21E1F7493976B1051771E7F7C83E4103196BFD11A1
14838 8D1A428A96BF399B7C0E156E755B87C4B93B734C1CA3AC61BB2B539672C411B6
14839 F44B06C1D9FE94D5D954F7112E2D44A3D1EB246A9BD9BCCAB3C31766A5147A5C
14840 FDA08E27C4BFEF9A390F8BA9F81F469362528A78C899C531EFC99AEFD00CC400
14841 AD76F40ACF9023E2C046AB199EE60D222FBC972F7275BA69DCCE0B54A3D3D30D
14842 43AF0EBCFB5D7B0B7F3A707984D64FB088B5D0D4837BBB5F6FB859EA249DEC5C
14843 1C96E50F855EDBC867E6501F47A66733E271B6FA1F8FA0FF13E6CD6149A20189
14844 7CFC194A15D90A41B08C217375B95EC1483E88E094376635CD60F27E1EC9E805
14845 68141268422E83C6E32F7AC88BA4381C9283191C9CD98C4D7B9B7ACEECFE48F0
14846 636EF971DD2D7BDFB527FFEC1C1777EBC3EF465BDA9D08D50986BE365026DAC8
14847 3ADD89BFC13B978749DE9EBFA882BDE41EECDF1DF61284B5F2CB6C40BA049238
14848 72199FA302572EEB1738ABF523892A76DD1DEDCD3C5C8AA13D01309BCABDF299
14849 892BCD7422B724600C7387AB28882E3C7B1404D7D5C8EDED379907A30FE2CE26
14850 2F0C1ED75A204729B4D91C23F4B400E8B0F68ECDFFDF65B4D74A7E487064E8CE
14851 36FB590ED2ADBD67DED04BFE66932B66B6C9149975A5282286E92EB1B2F3A5B7
14852 70504F122868778E8DC4A5D8254A3EEE2EAF443F6E69C007FE1C06C98575E4DD
14853 475BE0910A1F1B271B3AAE6657E094DB56B99A4CDF90354E80E9A8DCCE618765
14854 17087B18C3E2A55530832004C8AA5A9B1F05A63A214EA717A1329DEE785A43A1
14855 B22079BB32C2E9DDBFE06E88EF3E5B91104C7E5AC053A6611BB46B30E7F80D07
14856 73C49196DD8C3630235EE894F413C481A4A323BC5D249C4D41EFC07FB9C4C046
14857 F0EAC23EB789A64FA0742FA6A954D20B08A3157BEDD43A41ABF18681F7C20B5C
14858 0C2A30782F55E907D237ACCDA986550271A75DF6649150F22325CBA4140882B7
14859 F576B024B01960A34028E7E242A6C17EEA153A44CF4C4C0FA45C5EB8C4C985E0
14860 6F606E4F936963E90C7547267FFD6FDA71065263DC2A4D33903E921B80696C5D
14861 EF829CAED4106791AE923AD5A4DD5976431B4F5B3640FEE2BE833E921AFC4028
14862 F57F2976E1A3D16D332E4A490D72647A7E768DF0C0A13EA6C0D7BA7C060CF82F
14863 494A32C40F4B1951C648D1F74FB9412048DB062B65E4CA60035F86019CD5CCFC
14864 7EB064FA0A0E47A5E7ADBC7E4CED66FA569F6E03B6E6741B83744060805DA8C0
14865 DF15C1AE3946453C56E559C22792F4D2A48C7C21E83D0FA04E9AAEBFC0150CC3
14866 33EF5632B9F43E42D726CB1D62F9858653C77B9804BFD52FFB7F1C62E4FF2EEB
14867 A3156D44019448036DC6131B679F1D1E7F9A1234329A8CB90819774D59EECEB0
14868 A008822C15998ABECC299990D5240668CC9947219B6254442EABC51525B75716
14869 320721DCAD60E489D0B55C3E45A65E5FA56599ED8EBA3C780831B62200C8EE61
14870 1FF8F2E20732D8F2126BC2D6D9F7D46C06CB1AAE2FF5F9FF80B56CA89B60B29C
14871 99F7370F70041D73FE8F7B8702BC64841BC9B7B6B205EE08E0E61EB4151D8659
14872 A891FFCDE592DD7BBF124DCD50403920D4CA8DAA5B4FF8D3B95B978379FB7EB5
14873 EE5DD2EFAFC07ACF6340D8F1ECDB1E903A4382BB418528EC373DA439E45BE3B5
14874 FFAA93A60033013658CEBD1FCF91B2B32E639E77BF875D7087C626856388EB91
14875 B40C21808A7396872257014945A7E77E0B0CD2AC3C5D5F8A297A925066A28042
14876 FC738A2DBA2BBF0E35FC96345362A00009293EA02C4BCCDEE4619834FEB40E7C
14877 725C7312BF339F46EBA329460CF598776C017577BAB6DD39BE74551019C4E127
14878 312CC4445DF31F297D07F12D5EAE1D7948E0DB0378AFA69E24CE29EB3DB1CBA4
14879 5D367278E95BE942C1771B1721F4EFFE581424C9C1B47E20FA0A7B6F21811B74
14880 95C1BC9DF17C624EBEFF3CE8FA7DB879F824738B6BE88AC2416447AF69A44F4D
14881 E5338B95073B4229A8406E48024F2A8EC86C95BFC3E9BE221140EA14D6BEAD3A
14882 8171CBAC1D41B43A8F0386D5DF5C73C7B1958D2A5C83C65E512E923C42985A0F
14883 79254F77E797A327685C3D4B9BF76BA43D37737A3A637CB9592932F0C5853E19
14884 CF0F08A1A0A6C249802208755B749AAC9EE1D540A4599C2C811F1ED8DF6911C6
14885 6B8E5F32957A06BEA865F81614B7089D73CAEC6EE3A558A2E0593E472B57D332
14886 4B1FC4A1230F1C5E07AB2D37B72E6CBF5DDB10DF142AE4C039B9982FD72BF46E
14887 47DBA78BEA6C827FE95A81B8D7F818939BA3181FA6C00D84FC2A9D24D1BF1576
14888 BC1C20DD1BE01222D74FD8202F8B19C8F7EAE8528AE33827B3159823501B4DEA
14889 9580E54EF6A59F8EB6DE1D1388DCEF5344AACC55D51812AF347D516A08D0145C
14890 825C78C9C864E667AC49D7E80233940C60A2AE1CC2C70CE7FC98B8C19BDF47AE
14891 CD7A73D7661387BD1898D4C5B0EBD0CA453AD07E13F93391F24B03D79FCD728B
14892 291A12AF5157B9EEB3ABCD9A1D5659EC3CE70D39DD2C4155898A4ED768D10B26
14893 9932DC5AAB4BB0A4C81748D366827F1A5A333268312FE6CFCC959848E5941816
14894 852E2D382C75B51ED8CDD5C08077E51D12241E808B10A3B43C0BEA3EC00A5554
14895 C6E4D0A0B8159DF6E079268D4E29B7FAA8E67D49E194F29351DEE5FE4D089EEF
14896 4FE14D8344F8F9AC480836EF7D426640589F5AB714A12ACBFE5E76CDBBE571AE
14897 F113C748607F7EC0E9DB507F0DDCA82E589B79E97AD8CA40477F32573BD733E0
14898 DEE8A4F5B8B9FD75B37B2A0741A225A740A482371DEEF9CF90680D4F25DB1E93
14899 B81A9634A7CF42562F279E84BBAFDA9162508803FFAA8396C2059E47B038CE37
14900 E5831EA9F6110B5F7919D1A71F4E0E6313E016CE39FA5F6A274994CAE2E54D53
14901 0C74C24991DC79AEB9C37A06947A14F50A8669FCCADC1A42DFE02C0150A5F37E
14902 D36FE65F746BFF51ADCA94A329EDE6EF3FE36AE41141998EA2D07E8CE14C9FF2
14903 C0B8C863156EC1636E573FFF75376588210AA4F0D186FDCA7236C4512B3A1FE9
14904 8449298847290E5A92A510D16F5FF5374BFD8CB5163CA6CD196C017172FC9E00
14905 FE06779F384A198088D8C3447E3C6D3EFEA669B793AD52D5AAD7CDAD1F12ACF0
14906 216B2D085F23A40C1E2D1912C00B6FD0B8F94F33159189005937BAABC36F78A9
14907 20E19C0C1E624A4CD7A8EF41CA5122A36852C62341D5A1054BCD8B21226DF5AE
14908 8CBF05BF06F07C03FFC9834BAD5B7AB0FBB5E01A3599671C1DFDFCEE378073D9
14909 DD0DDF49AC93F2613983FA37D15FA9CFE98CB28550E968467CB2180AB461756C
14910 4F5E8A4A32FE12026A4F66A29D46026886760FDFCA270F1CAB3BED624E3B0186
14911 B4D63BE5BD37AD0D2F38C7B1D4F806FCC4E5539369B34E491E39324BC14C95C4
14912 807AA58E006619AE4D6A3E410BBF112BA75975E481AA5E86B704BA42E806E623
14913 8C39A4E6E965C40F0659D9E1AE82A5410064BB8717F10FFA221A10976B9861E6
14914 81D9A7E3CB843DC05104CE94A68335278F48541EFED12892243A825A167FC91F
14915 C2688632BA024C4C0F01EAE7450F90F4BE84344432F60E7320AEED0B59489C3B
14916 CFB30D87A3BF218A601DFC9A4337A44F0D695DF834956C7787A9706BBFB43EDC
14917 DF27A1EA8BFD930B941213ACC5078429A4AA0CDFFDE0CC8C2F3ACB04E2738204
14918 836FC1648B391515116E6563EDAD359179B36A55DA08CD7E169510940A9B7578
14919 6211045BBFF3989A1841591ADB8D295E4788B4EB80DA5CD892DA734EC628DD81
14920 B041EF6F7F3B60D589217E7EC8D1D19EFE1BC27C989269A118BD87AB0AC5F00F
14921 CEA3016E33F372CAECB95E6CA60D1774E48FAE1593DEA84CAA9A6FF0E073F613
14922 E8C5CD0FF7F092CDD6CBE2D7D57CE103EB4698A8F71892709D640B155D386487
14923 6086D2C2D959F8D0C6DC427DC0A500228D3C4AE52D001E05C65100F73620FC5E
14924 9646094C740B8966A04BF561843A78AF2A9128766072E48BEADF8782CE7032AC
14925 B141704455B72B4BB6096885CD08570375DDAB6238D6CC59FB6CDFE9336F849B
14926 19310C0A93A97E2F142D2EA95C87B57CE863809E36912643F7BA79E5A635833C
14927 4D15DE4DE5FE3A7CF276290101AA79025F960F38798D99F65E0DBF66CDB26DBC
14928 40000030EC1E14DBEE19B4AE9BFCD93F2F9BCADDB3F85F51EFC80FDC10ED8071
14929 E884CB468A97584157D422ECAA97CA287AA786588D63571AE57B1C9A47C51653
14930 FAA26357ECECBD57D99D984882FFF6C169C9A3EE631989E9B71AE0A7D283B3B5
14931 D13A5E99119251BDCC492A24A9AC6CDDFC00D98E345570D75D6D42315A997092
14932 4D537A4B2E5565BE551101CB06C70A4293401C0CE6A08C8D11DBBEAF50DF131A
14933 2B4EEF04A99639761336CB4C6BA39F26DB3B8256839463E1473A417F91886BF2
14934 63A7BAA271B7429BC242ABBF0618E86C9CE91D2E87293390E2ED53ABD99695A2
14935 324A3AE6620224856DDE35FBDA1F2EB430073F69EFE08A44DE081A7A9EA16BD2
14936 0FB5023F64DC265DB823B56C20845C24C0DDA74A29DED7D04C8E2BC54F9D7BA8
14937 715449E60555FAE6DE1C0B9D7BB213724FF2C69F9D30C65CFB76F833FAFC4460
14938 565A4FE09F973DA79B49BBDFD3366CBFCD581994B169A999D5E985970AEE83A4
14939 475CEAF777F167FCAF398AD40B54AC5F434DFBD7BC3634367F8795669F1B752D
14940 2053B3D0781EF75100E4A7B55D10A241B70626C45A3FA14F77BB4340C201F961
14941 680A2C71EEBF9EE42ED4D850D8A6CECE5DAF940421FA781D9AD34F4187EDD858
14942 EF4C4795CF79D6A9BAEF45BA33E6410694CE6F131AF018B6309FFB7C1C459FF3
14943 A535894BEB3868DC84FE0F34F52532A1A111AE3B6C7E2689DF33968A03AD7B86
14944 AC93994CCFECF94544AC9979EBBC94909D6DEEC749414459C10E31A74143EEAF
14945 DA539EDC3D52BF2D678D597B2B23416CBB432AD9AE2DBC988640D4CE2CFC49E0
14946 F3EE13F667B66958B8607BCB4A3CD42FDFA3CDB7B5DD3CA79431C8D57133BE72
14947 4151786678CD5B5D1FB206ED3B0EC11204E3406F19BDA4A1DEF347A3A58F2FDF
14948 B8DF16CC6D1A25A201923458A4CBD572A87DD3836D19A3F25B5C966EE99D0992
14949 C57001EA90FE5B596D4E61F33BEBC14675BC7789D0FCB35C882C661BA38CCED7
14950 3D8B1038F974D988AD1D80938AEE2340AA0294971E32E3308C0C1A373EF51520
14951 DFE0919F4A6D5799A8B95779C86BA8A332A32AB14AC44E77FA87202CCDD29F61
14952 BA291ABB7C0529197AA0700E56578153AC833F4251E0A6FA28D02024F04C7FA5
14953 C3E2B3E1E8FAD7865C7B751E3E946D5E325D6E386634F1391D791A8B29CCFE96
14954 3EFCBF376716ACB7814D3B9B63C7022006370B4F56461B71D2D8FF5D9381936C
14955 B07ECB453EA6CC35184F12BDEB63BB085322956137ECAD6B0AEAF374556FD599
14956 C07882FEDCE56DFFE21B4F484A36591D047F7FA3B451C7FF5B7C37E7C0B29DD4
14957 A3538DBEA4E6E3E7767A9AAC3C8C5CEACC1258E869FF3B2A4226D71C930796AE
14958 78306B5A4FD89A01934A23083F238E72C7709FB8ACC63A0C38E38CC15019F352
14959 5DA9F7A7747E1F3AC1AB75928E0C91AAEB38581CB94FFEFFB2ACCEDD68D9A719
14960 ED5FA28F10A54FF2E189BDCD752086A6CEF84676A658207EDB4BF8BEEA7D5049
14961 BDBA2464D1FF7961431D209B3B76B029DF5019DF1F123CBA71350CAAFABB542C
14962 FF8B50010202425631404CED70B0431D3CA5A4678FD95BAE3BC87DF432813302
14963 BA64E364C2EE7B210074120DC1BCE6086799AAFB97F60008C8FEEF9B8FD45B00
14964 850F2C10ACB669B51AED25CA6D2931A309E2858DD58479CAE6B97B2703C4206C
14965 04B7C5235048667D1454D26B8BE73EAB9DC7B8996EB50CB4393F1CD83C7BE7E5
14966 D75EB726F417AD5BCBABEB283E7CB64D7560EF2FA838FCE8DBB89D7EE989E30A
14967 C245F6E924D719FBF06BAD828414C293BCBD09883E3130C65ACAFB9CCB3D7D2E
14968 B64C89F389183F2CBCDE4BBA7DC221521756DDD4816C6FB88D8E751CABA64328
14969 2E91CE181166327F296E625400760FC5876903F5A50814194E9447DF0FB9C6C5
14970 4A4F0FFFF5A1992D407177ABD609D8EF9EB679AAF16A6915909F2B67CA60FFD4
14971 79F968B801465E37E6C0F5AE2FE329BF83689452E60C3CFED8F475827A252CB8
14972 126230F6ACE477D9C80DA2AE3C4E3D2E01A9DC3B43F572B4A314A089D372DFEE
14973 7D9F8BC1E70E8853B4E8385268600F85CC0EC17EFE464215B619E659834B6DF6
14974 4D1B5101ED2EFC5E8D580C0BFD7CB1A9B500D54F9D078C0A2922682DD82B6D16
14975 796899F819A7F23BC9C8FB47ED25A9ADEDE6AD10F354EA1AEDFCD5382EF5193D
14976 14AF551E7660FEB5DFD13586E5FDC4A441D68D07A04EB1CF214984EF343661D7
14977 DD0F6DCAACC5C78220CFA51F7C41978B1AD434A288E99AD0A094883D453E1780
14978 897348E1E1EFF4470582E82C1B6466CFC8540C069DF75F95C4F4716519A8E12C
14979 6B302E060C81708A108ACBD7FE39FE5B2555753C2D3FE9B61A4A98EAEB075F2C
14980 190AAA3C8E8424378996E7B389612CFB01418D91025BC24BB52FBD3E862F1FFD
14981 1ED821AC347F880CF434F9D47FEFD2A56C1907E4BABBE8999D9FA5B6F03FBDC4
14982 3AA6155FD06F6A90C0F27E9F0CCBB4346A3CA6A7721E8098A231D3A44BD2BE3A
14983 8C677EB452E43D07EF30C49374365A99A1B97687787E0F8B1BBAC018ECBA3745
14984 B46EC288D4E1CC50620F792E63AAFFD5ABB4A5B25BB5BE297DF148A4B445FFB3
14985 F1B20CB27D67C5807A4B583243F43E70D6DD772EDEAEDF89BD895DA329FCDB92
14986 9D9456479A35B34248238B4846DF47472DA7F00C655D4C3AF1ADAD376E72249B
14987 C489E529CE3AE4F0E096C8A45D76B3D874B1393171CB7CCDB785E12C01023FEF
14988 7D5A18FAEC29D302A47BA5B67F97297562BFEECE929781880608A5E06E4F7ADD
14989 A6DCC39BAF56C8C376AE1E9568204D34D6774C46B6CB98D369E4D8ECA34947E3
14990 0E0D17F5A01704F5B99378373371341CED9DECA0D8BD454E25ED440B86FDFD3E
14991 01433F2F6490095BDBB01B5E584B9AE29C03A9637041F699F135009981D98D9A
14992 7B7AC441F71EDD93F2A8666CF42D20DD5939B26A068ABAB4433264ADE5E9BAE8
14993 CD373248E30F6EDA613F93E4671CB0AC98E304CA1D98797E79371E74C8A0CA1F
14994 3269D2164FBF23EB2C418D8DBF7096F017ABA030A54F770EEE3797C07032B887
14995 B914C828ABC6A1E7BA86929B96ACBF8A182A71C095C4263703BD61DBBF94F01C
14996 0EFFBEFC9C8D87B4E5E47F25A089284D0948BE7DBB1829FEDEA85A9371F8B5A0
14997 558630E939A93C9728DAEF0744AB53E6233777A7E164B1EFE1BB6288E2F78708
14998 E4FC46C44D49BA478465615479E5342721CB343062773B8D621B2E081DFB1B21
14999 A18EF7A5064CB0640FE67FEC8798D62F76E7BBC04874842F68C92DA115636581
15000 F274337D31C0A6FFFC0462AC496BB33CDDC1FA62A818B069251A0CE269080F97
15001 C476503D0C78CE61733D002FE7E92823B24742E7D82B72DD97CC6917023CE9CE
15002 A2E67FCD59D81747D6AA7FFD0612A89E241AD33B01FCFDC3A559499781A02B1F
15003 4DE65752F0DE916A96D7AA83E6FBA194BE43CCC1B7CA312B819AA54CFFFA83E8
15004 4F9E953A9CCD06EBD648B95EBC2300146F9D80E0B68DF98A0464D56D7C7D65AD
15005 C6254F7742B0681EF816B6F30E5D231CD72B3D0D16E9D6FCF728A0CB41BF1FD1
15006 25BE76EE9F21801518890B3CC56D0CB4DFB3E0D9B01F141F460B632DFCAB50D8
15007 CE9DB0F1D2CAED39B923980D5930FFA8956A5771E8D325E4F0660D646D18529F
15008 5E9516ECC8AB866364C632C8DC68191E424D1382C870E48FB8659DBD71120E63
15009 EB7CEF33C053251037E689BF66C50A8A282E5DC47D4739F891ED9A62E87168AC
15010 E39794FC8C85280D51FEE1CAA9CA375A4095BCF5858E8DF1B9F9783C9CABEBCB
15011 FF0436199873F1B40C51C1A83684A224B845AB92F0CE98F0B8C891DD2BA9FE7E
15012 A14ADAC936719AB2219EC48872C8700C3F4E48A987EE7096E0BBCAB8D2D1E702
15013 10A4683B9CBE917B0BCDAA87E101237FCD44DD74DAFA32DD5F18E73B32A51D5E
15014 33F0CED9BBF86A457CA84D8765C1A50C446D6B5F243E57512495CD732101ED5D
15015 DD23E0F7E1F94B80188DBB55135A0E5343DC8CA18AD0762214CA100965B9D6FB
15016 CD702A0447BB1EFC9136137E834E0B67B1F1AEDE14027B1A9302325960805A51
15017 3CF3AE7D6E9F30CBEEB1DE7113B024BB248311D141BFF2EA982104A9F80E163B
15018 946EE6AED956CBC6C5A551B40C7BBDDE96E9A15DDFAB3CDB3571CEC172E913B4
15019 202A301D75368073D9DD0DDF49AC93F2613983FA39B2968AFE15463FB70C1A2C
15020 02385E5E728FA1F6E9D30E9BA2F11EC991EC24B2BCA0B6C622075B1BA1CC48DF
15021 B9C229EB4E6279359DB8279056C98F9613193D5AA93BC8576C18C01AC4F1465E
15022 19E597F8F6C074278B1BA93C4BD9DD1A121B81DB3D9E9C9E53EEE7FCB292BCCF
15023 21C75341B990BF48F54C94948BBE3B7EF5B14E4B46FBEC3198CA758EC2FB6B60
15024 92998E8BB21C59825DE138E8A319337DE95A685B0B7528D1BDCF08B3DE2FF46B
15025 BEE88AF827DC4FDEE6E12FF3C51F0E0290DCAFFB86EBE80C17023E1F52279AE3
15026 6F87315D5123A91D30D8C505EF874F28F2910D56F5C5125253A6FA848F43A595
15027 982F07198D43984082737559D293C0E770474533E520003C0CB91921F63BB68D
15028 91BD5C8C11C01DA84D96B20368C421B09BB8FB1B2B9E10E69E06C1F3FF98DA04
15029 1CD83BC8D134C35508240D9E8717F8FE071B617D922CE893FD4B1AFD467B4557
15030 25549EF1A5BF2546132B0D6E642A18E9349655B64375CEB76B0295201847DB1B
15031 8DD9D04CD9FF571BBD073A6AD525D013A346721F648B2856C1E87485D7EB9951
15032 9F544FF2488AD14BAC378CE1123E4620BDA71C0994B1853324909E5601BC801E
15033 3FABFB8ADB167BEE897A226CBC66580D417B503AACDCC92F42216A11F2D202F0
15034 C2BC721D46570B72DBA6FC5C903AEB02223E806A27D13AB23F7861B4BF1D5888
15035 DACBED591D23ABEEBFCAFEA1722D77FF400C7173B57DC4189230B5771E456510
15036 B2AA4A57D7485F201E46DF12BCE5017C451B03920E90ED3E848A07FFF1AA8CDF
15037 97A19BFFBA49A40451BF1B6D1448B1FB2181998509EADEE578D6CA792F4AA58F
15038 D44B4F6EDA309492012D8211676F375782CBDCB2E42C04E3E5A3C48B9CA3558B
15039 104D2B3E010249317312004B92B5D812332F5677E3D47C32A89F942782EC1247
15040 DFDFD88ED3A9B18AB5FAFCA8AB9A67FE4EFA9C8A8D56A035BE9F8F9C31AD68B0
15041 CAA0B2C6FD8D0C446EBEC22EF4462510D829B808E7D62B4197D9A1915A28068B
15042 4E4CBBB11E039B4E52A2EC012EA2ABCB6CC8D7799517A115D3F7DFF7BDA21C92
15043 12688E365FBE5BFBA2578E432EED32A3A747C6D9FF8F2FD46AE89B188BE77E62
15044 720FAF77116B70E913E93851E82A2601FFA0B7ABF80D8F86934715DF1B76F759
15045 C4C44B295C81E72E04427C53E16265AC7505D518981094849F9D218170F2706A
15046 912A7DE583D3552FBADF4ED841FD5E33E68B87627F9B4EFBF79A9A196C4E2C8E
15047 6ED84703BE389DA59DA87A67B2EF7F980858066B58C65AE0ECFB3C38EB4ADEB4
15048 40266A3ECAF6198E83254EC24C14F1E30D80036436F7BAF296CFFA52B6AFD4CD
15049 717A7340AC83605B885C2794ECCDAFA6422E6D4EB2527C6F5D14B09F05FE8D84
15050 05F69C6631D8C42132E28AB2B0E37FBBF3F0DC770C081E874AD94901E7D1914B
15051 D14D4E77965E2751A705D116805B15434A01995E55DE4A57B781D221C2E0C92C
15052 FF820CBC57D9049DA2F2E3DF492EDDDBF4E6D9D5A589C580C5204028E01D0A51
15053 2FDFC13648D4160F9E72B31C78F41DE9262FB83F44DCC5E4055D8CAE3F7FCB8D
15054 A4641501B722EFA74971EB224E5817418D3C54D9BF040C4927DDD5C1C7B1A1D5
15055 348A7F7B9E2383960B460E2867A1E52FB76F3C2A0228DFA2BD4E2891BC09F378
15056 C0C7A3FCE06ED742CD57F2A168E561DB16B3555A11A93164B747B1CA7586D2EB
15057 D03EF6D5F125F6004E7E1FBD9B851F1CABB38379F6E44B0B3748B0FB4D394246
15058 05A208F141480A12047880155F806B4D271DA103E9085A13FA71EAB16710E466
15059 94D9C63519004233F9E490FEAD6C3638FA955A6A6A4810A88B1399815AF58520
15060 E7FFC694557F6B9C3507A22498265CDA41352B9047D65076D02F1BC8D04C6C84
15061 19FFF29DD5601C60A4E1DE954C1A385FB91E2CCEA174CCCD6076933119E9BF7C
15062 2E02379FE957C6A11C5C877AB543FBABB002006F5CF957CDC1BA2DCBDD016515
15063 A4694A704C11F848210ED18D4AECD4AB6F4B7CBDB017B74CEE5A2CC77D053049
15064 A1448BD7CAB5C3A53E5E1F2038084784571A69DF73908644F100F6499DB88CFB
15065 012A3F2D3EC433CF4C713EF80D3689FDC8ED8B739E7EDAF7E592EACC13B8BB5B
15066 ABE116C42F784B7015A7FBE5B8AA8EA93877E640925DC731A168BAE6B5D63629
15067 F7123FFB32427321CD8934546A99B27E5BFF84DEBA473CAD8CEE4553F98535C4
15068 937436A554B647153B14C0D3655051925B4F29F9B4F6A29049FFE25B53A401AD
15069 66ABDF9858D8314196F7B2334510E97FDF024A07CD964F5A3ABFD6EBB54C1933
15070 361AD8EA93B75B8DEAB2FF6F81145BC94272F384345EDB09788582EAEDEC906F
15071 EC7EC110DABC82DD7A789EA1FC80D691A0859ED07007855B478A2607278973E8
15072 52EF390F343CC072587E0BF4513D54AF951416B89EF0A04E522C1E0374FFBE1F
15073 030906581A858CBEFDD9D9057BEAB07A03E3739A2758E183C159F24F2B7F2C9B
15074 2C21EEFB7435F393E960A1388E0C90F2341AEA86F43BFDDBBF838209C278E0FA
15075 51A8DC8D0CCE8BDE7C61F639430ABC9FF231474EC572987693322F48C97DF1E7
15076 9C401DF86EC8B45F28B6457AACCBF4378590D6DF397573922F2718DE716237E6
15077 357984D6091A663521592F41B7176795E6BD9B40B284AF522D1AD7F9A9F03DE9
15078 3F129468A4164043E1045DF8996DC073CDD4ADE95C24E7D98D1893C2AEC9FDF0
15079 13228F7FAA9A4DAF7FFE8EFF0FE716845EA9BBD9265E36E8CC3C00D18BDF7222
15080 9385555F7AA6ECF39399CC8D3CCFA651735F48F18821860811D967B93BBC129C
15081 8F485D414AEBA3F80924223163D8682C7108D284324AD8DB3DE6C1AFF44BC35C
15082 13744F3B332FF3ED943E56D6DB9116F905FD270F9B0F9D334037A6CD22572AE4
15083 60D60BC6DA913D9B3C9EC922B3474149050E36C5A585B2BFF6F2EE6D0D43A93F
15084 55A99D4D9F68D6E89C5945A0D9FC9C5BDD9403476D09FFD687079BA3908BAA06
15085 CFF9D9DDB15F0EA586BB9D6403A447F0564B2F09B75FC9E354179AE3E6FA37AF
15086 7F580925F2AF9C2E1B1A83B3CA0B964A50DE907D129E6D344189A3E8CAC8F3AF
15087 D3C5A028745385FC7A0491A8C05A6392A2038AB5A145DF07A2A54E10F68F418D
15088 B655AB07FA98141F49ACB4BD29A3CB9587671BFB427A13352BF673FAABBDD02F
15089 DDC957FCDE3AB3A4ADBB84A6BA5104F5C6CF919DCED24CE2D94DB28C25F7B90D
15090 CD6CB0713730119066ED504CAD205D1733191DADDA166A380D893D2552F40F0E
15091 AEF28FFDEFD5742A3C17287558A12C0A930E2BE5EEDF439F57D643BCA5739D19
15092 4E73A7C1C50E89A1EEAF24D1350AE1F505011EC681FDDE8581C76DD8D5C5AE28
15093 CA5596228334333F672F778B37789212B258CD95F07F49A21E19AB79F3D1BC28
15094 FF92A7CC90F8EB2B5D60ACE8C6CF13C901C509C92ECAC8146F8A9B91C23555DB
15095 6564E80E08F5815C28CF76DA7815F53F759BDE8AD93E427A9D7083532AA7D4BB
15096 6FAD7833CE962DBA314D627C63DCEA9432BDADEF6BB9603D1D9FEB6CB5EFE591
15097 8F577BDCB69C4A0F8DFC402077820540F84413F301ED7B163C4C6E8A69AF7C9D
15098 A61041C2376D1250E6B7985356E9ED72BCC5FFA3DD0CFCE0739BCAB0A52D9480
15099 66559D94FABE3CB6776F55162EF4C46C2AF9B73F5363EEDFB3DC5B0237CBF8FE
15100 3947FBDB1647B595451095E7CCAB73A47B87C36277AE82180E509CC50F59A62F
15101 49AD4DF391196F4E4A737C7B59A3E243E26DDCB83B18B27DD5D40B605F699BD0
15102 2ACCFD4C13D6DA9A020C170948DB2521A91ACA819A8D45B0E414EC4A640EB4DE
15103 AB14B2D0E667E52C8AC0FE320CA0696B1828DE40C438DD8EF92BE1EFE1E83E11
15104 AB8E0CB83321DE45D0B3614AAA17CE9384F5BF918EC6D2625026F7C36B61ACC2
15105 1855CA70A6416B779DC2EB52ADE7D53AA474DB9D6D8A
15106 0000000000000000000000000000000000000000000000000000000000000000
15107 0000000000000000000000000000000000000000000000000000000000000000
15108 0000000000000000000000000000000000000000000000000000000000000000
15109 0000000000000000000000000000000000000000000000000000000000000000
15110 0000000000000000000000000000000000000000000000000000000000000000
15111 0000000000000000000000000000000000000000000000000000000000000000
15112 0000000000000000000000000000000000000000000000000000000000000000
15113 0000000000000000000000000000000000000000000000000000000000000000
15114 cleartomark
15115 %%EndFont 
15116 TeXDict begin 39158280 55380996 1000 600 600 (test_04.dvi)
15117 @start /Fa 205[42 42 49[{T1Encoding ReEncodeFont}2 83.022
15118 /SFRM1000 rf /Fb 22[60 114[69 73 51 52 53 1[73 66 3[69
15119 40 37 73 2[60 73 58 73 66 12[91 73 2[90 29[66 66 20[73
15120 28[{T1Encoding ReEncodeFont}23 119.552 /SFBX1440 rf /Fc
15121 134[51 3[54 8[27 33[50 17[49 4[49 49 49 49 3[27 44[{
15122 T1Encoding ReEncodeFont}10 99.6264 /SFRM1200 rf /Fd 139[52
15123 53 13[60 16[97 25[37 58[{T1Encoding ReEncodeFont}5 143.462
15124 /SFRM1728 rf /Fe 139[72 72 2[72 72 2[72 2[72 3[72 72
15125 48[72 5[72 45[{T1Encoding ReEncodeFont}10 143.462 /SFTT1728
15126 rf end
15127 %%EndProlog
15128 %%BeginSetup
15129 %%Feature: *Resolution 600dpi
15130 TeXDict begin
15131 %%BeginPaperSize: a4
15132 /setpagedevice where
15133 { pop << /PageSize [595 842] >> setpagedevice }
15134 { /a4 where { pop a4 } if }
15135 ifelse
15136 %%EndPaperSize
15137  end
15138 %%EndSetup
15139 %%Page: 1 1
15140 TeXDict begin 1 0 bop 0 TeXcolorgray Black 0 TeXcolorgray
15141 0 TeXcolorgray 0 TeXcolorgray 1371 304 a Fe(pst-solides3d)45
15142 b Fd(:)1755 487 y(T)-11 b(est)1597 922 y Fc(July)33 b(13,)f(2008)144
15143 1280 y Fb(1)131 b(T)-11 b(est)44 b(\351criture)h(de)e(\034c)l(hier)i
15144 (ob)7 b(j)44 b(a)l(v)l(ec)h(jps)p 0 TeXcolorgray 0 TeXcolorgray
15145 581 4464 a
15146  tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def
15147 /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h
15148 L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
15149  581 4464 a 1762 3520 a @beginspecial @setspecial
15150   tx@Dict begin STP newpath 0.8 SLW 0  setgray  0. true -142.26372
15151 -113.81097 170.71646 256.07469 .5 Frame  gsave 0.8 SLW 0  setgray 
15152 1. .setopacityalpha  0  setlinecap stroke  grestore end
15153
15154
15155 @endspecial @beginspecial @setspecial
15156   tx@Dict begin STP newpath 0.8 SLW 0  setgray   1 setlinejoin /pst@fill
15157 { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity
15158 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30
15159 rtp2xyz} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /fontsize
15160 {10  28.45274 mul 28.45 div } bind def /projectionsifacevisible true
15161 def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta
15162 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /trunccoeff .25
15163 def /chanfreincoeff .8 def /affinagecoeff .8 def /dualregcoeff 1 def
15164 /solidintersectiontype -1 def /section {R h 2 div neg R h 2 div r h
15165 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /solidintersectionlinewidth
15166 [ 1] def /solidintersectioncolor [ (rouge)] def /solidintersectionplan
15167 [ [0 0 1 0]] def /axe { 0 0 1} def /plansection [ ] def /definition
15168 () def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth
15169 {0.8 } def /linecolor {0  setgray } def /linestyle {solid} def /fillcolor
15170 {1  setgray currentrgbcolor} def /fillincolor {0 1 0  setrgbcolor currentrgbcolor}
15171 def /color1 {1 0 0 0  setcmykcolor } def /color2 {0 1 0 0  setcmykcolor
15172 } def /color3 {0 0 1  setrgbcolor } def /color4 {1 0 0  setrgbcolor
15173 } def /range [ -5 5] def /action (draw**) def /texte () def /pos (cc)
15174 def /proj-fontsize {10  28.45274 mul 28.45 div } bind def /lightsrc
15175 {10 0 10} def /rmfaces [] def /fcol [] def /solidhue [] def /solidinouthue
15176 [] def /solidinhue [] def /origin {0 0 0} def /sommets [] def /faces
15177 [] def /solidshow [] def /solidnum [] def /solidnumf [] def /solidtrunc
15178 [] def /solidaffinage [] def /ngrid [] def /affinagerm true def /chanfrein
15179 false def /solidgrid true def /solidplanmarks false def /solidplangrid
15180 false def /solidshowbase3d false def /activationgestioncouleurs true
15181 def /solidshowbase false def /soliddualreg false def /solidgeode false
15182 def /solidhollow false def /solidbiface true def viewpointXYZ /ZpointVue
15183 ED /YpointVue ED /XpointVue ED /THETA {YpointVue XpointVue atan} bind
15184 def /PHI {ZpointVue XpointVue dup mul YpointVue dup mul add sqrt atan}
15185 bind def /Dobs {XpointVue dup mul YpointVue dup mul add ZpointVue dup
15186 mul add sqrt} bind def XpointVue YpointVue ZpointVue /viewpoint defpoint3d
15187  SolidesDict begin 0 0 0 /CZ exch def /CY exch def /CX exch def  3
15188 newcube dup (jaune) outputcolors (cube) writeobjfile  end  gsave 0.8
15189 SLW 0  setgray  1. .setopacityalpha  0  setlinecap stroke  grestore
15190 end
15191  
15192 @endspecial 3180
15193 4464 a
15194  currentpoint initclip moveto
15195  3180 4464 a 0 TeXcolorgray 1860 6074 a Fa(1)p
15196 0 TeXcolorgray eop end
15197 %%Page: 2 2
15198 TeXDict begin 2 1 bop 0 TeXcolorgray 0 TeXcolorgray 0
15199 TeXcolorgray 144 -45 a Fb(2)131 b(T)-11 b(est)44 b(\351criture)h(de)e
15200 (\034c)l(hier)i(ob)7 b(j)44 b(a)l(v)l(ec)h(PST)-11 b(ric)l(ks)p
15201 0 TeXcolorgray 0 TeXcolorgray 581 3140 a
15202  tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def
15203 /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h
15204 L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
15205  581 3140 a 1762
15206 2195 a @beginspecial @setspecial
15207   tx@Dict begin STP newpath 0.8 SLW 0  setgray  0. true -142.26372
15208 -113.81097 170.71646 256.07469 .5 Frame  gsave 0.8 SLW 0  setgray 
15209 1. .setopacityalpha  0  setlinecap stroke  grestore end
15210  
15211 @endspecial @beginspecial
15212 @setspecial
15213   tx@Dict begin STP newpath 0.8 SLW 0  setgray   1 setlinejoin /pst@fill
15214 { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity
15215 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30
15216 rtp2xyz} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /fontsize
15217 {10  28.45274 mul 28.45 div } bind def /projectionsifacevisible true
15218 def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta
15219 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /trunccoeff .25
15220 def /chanfreincoeff .8 def /affinagecoeff .8 def /dualregcoeff 1 def
15221 /solidintersectiontype -1 def /section {R h 2 div neg R h 2 div r h
15222 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /solidintersectionlinewidth
15223 [ 1] def /solidintersectioncolor [ (rouge)] def /solidintersectionplan
15224 [ [0 0 1 0]] def /axe { 0 0 1} def /plansection [ ] def /definition
15225 () def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth
15226 {0.8 } def /linecolor {0  setgray } def /linestyle {solid} def /fillcolor
15227 {1  setgray currentrgbcolor} def /fillincolor {0 1 0  setrgbcolor currentrgbcolor}
15228 def /color1 {1 0 0 0  setcmykcolor } def /color2 {0 1 0 0  setcmykcolor
15229 } def /color3 {0 0 1  setrgbcolor } def /color4 {1 0 0  setrgbcolor
15230 } def /range [ -5 5] def /action (writeobj) def /texte () def /pos
15231 (cc) def /proj-fontsize {10  28.45274 mul 28.45 div } bind def /lightsrc
15232 {10 0 10} def /rmfaces [] def /solidfilename (test) def /fcol [] def
15233 /solidhue [] def /solidinouthue [] def /solidinhue [] def /origin {0
15234 0 0} def /sommets [] def /faces [] def /solidshow [] def /solidnum
15235 [] def /solidnumf [] def /solidtrunc [] def /solidaffinage [] def /ngrid
15236 [] def /affinagerm true def /chanfrein false def /solidgrid true def
15237 /solidplanmarks false def /solidplangrid false def /solidshowbase3d
15238 false def /activationgestioncouleurs true def /solidshowbase false
15239 def /soliddualreg false def /solidgeode false def /solidhollow false
15240 def /solidbiface true def viewpointXYZ /ZpointVue ED /YpointVue ED
15241 /XpointVue ED /THETA {YpointVue XpointVue atan} bind def /PHI {ZpointVue
15242 XpointVue dup mul YpointVue dup mul add sqrt atan} bind def /Dobs {XpointVue
15243 dup mul YpointVue dup mul add ZpointVue dup mul add sqrt} bind def
15244 XpointVue YpointVue ZpointVue /viewpoint defpoint3d  SolidesDict begin
15245 0. 0. 0. /CZ exch def /CY exch def /CX exch def pst-cube end  gsave
15246 0.8 SLW 0  setgray  1. .setopacityalpha  0  setlinecap stroke  grestore
15247 end
15248  
15249 @endspecial 3180 3140 a
15250  currentpoint initclip moveto
15251  3180 3140 a 0 TeXcolorgray
15252 1860 6074 a Fa(2)p 0 TeXcolorgray eop end
15253 %%Trailer
15254
15255 userdict /end-hook known{end-hook}if
15256 %%EOF

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.