0     """333DDDUUUfffwwwˆˆˆ™™™ªªª»»»ÌÌÌÝÝÝîîîÿÿÿ
0      ÿÿÿÿ    ÿÿÿÿ2Tv˜ºÜþïÍ«‰gE#2Tv˜ºÜþ2Tv˜ºÜþ	>                                                              -   €                €    € € €   € € €  À? """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ÂÌ"ÂÌ"Ì",ÌÌ,ÌÌ""""ÂÌ,ÌÂ,ÂÌ"ÂÌ,ÌÌ,"""ÂÌ,ÂÌ"Ì",ÌÌ,ÌÌ""""Â,"Â""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Ì",Ì",Ì",Ì""Ì",""""Ì"ÌÌ,Ì",Ì""Ì"""""Ì,"Ì",Ì",Ì""Ì","""Â,"","""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Ì""Ì",Ì",ÌÌ"Ì",""""Ì"ÌÌ,Ì",ÌÂ,ÌÌ""""ÂÌ"Ì",Ì",ÌÌ"Ì",""""""","""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Ì",Ì",ÂÌ"Ì""ÌÌ"""""Ì",,,ÌÌ,Ì",Ì""""""Ì,ÌÌ,ÂÌ"Ì""Ì","""Â,"","""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ÂÌ"ÂÌ"","ÌÌ,Ì","""ÂÌ,,",Ì",ÂÌ,ÌÌ,"""ÌÌ"Ì",","ÌÌ,ÌÌ""""Â,"Â""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""                                       ""33CDDUUUUUUUEDDcVED3 @UFDTUUfffvwwwwwwwgffVVUUEDD433#"""                                                         ""233DDDUTUUUEDD4gUD43 CeGDTUUfffvwwwwwwwgfffVUUED4433#"""                                                        !""33CDDDTUEDDD4sVUD430TvHDUUUfffvwwwwwwwgffVVUUEDD433#"""                                                        ""233CDDDDDDDD3gUED33@e†DDUUefffvwwwwwwwfffVUUUEDD433#"""                                                        !"23CDDUUUUUDD4VUD43#"Ee‡DDUUUfffvwwwwwwvfffVUUUDDD333#"""                                                        !"3CDTUUUUUUUEdUDD3E3BVv˜DDUUUffffwwwwwwgffffUUUDDD333#"""                                                        "23DDUUffwgfUUUED4S4#RVv¨DDUUUffffvwwwwwffffVUUUDDD333#"""                                                        !"3CDDUff‡˜xgfUFD43E3"TT†IDDUUUfffffwvwgffffeVUUEDDD333""""                                                        !23CDUUfvw‡wwfVFD3343"ee‡IDDTUUUfffffffffffffUUUEDD4333""""                                                        ""3DDwYffvwwgf†F33C3"Bee‡JDDTUUUffffffffffffVUUUDDC4333""""                                                        "23DDTU¶ffffffuG332#"BEe—CDDTUUUffffffffffffUUUUDDD333#"""                                                        "233CDDUgffffUuW#"3"CEe—3DDDUUUeffffffffffVUUUEDDD33##"""                                                        "2323CDDtUUUUUeV4"""CFe—3DDDUUUUffffffffffUUUUDDD4333""""                                                        ""3"333CDXUUUUeVU""!DUe73DDDTUUUUffffffffUUUUEDDD4333""""                                                        ""3!"3333eUUUDU5D1DVe73CDDDUUUUUffffffUUUTEDDDD33##""""                                                        ""3"3T33dDDDDD"31che63CDDDTUUUUUUUUUUUUUUEDDD4333#"""                                                        ""3!""C4SDDDDD"2che333DDDDUUUUUUUUUUUUUUDDDD3333""""                                                        ""3"2#BDDDD3"cgU333CDDDDUUUUUUUUUUUEDDDD433##""""                                                         !"3#33333 3"eg$3333DDDDTUUUUUUUUUUEDDDD3333""""                                                 CDDDDDD !"2333330  3  "ef$2333CDDDDTUUUUUUUTDDDDD43333""""                                               0DDTUUUUfUT"23"!003430 3REe#23333DDDDDDUUEUEEDDDDDD3333#""""                                              3DDUUUUUUUwVe!"3"" 30333 33  A5D""3333CDDDDDDDDDDDDDDDC33333""""                                              0CDTUUfffffUˆgW"3   3 033 0  A2$""23333D4DDDDDDDDDDDDC43333#""""                                             03DDUUfffffff¥‰fF23     033     D2#"""333334DDDDDDDDDDDD43333#""""                                             3CDTUefffffffV¥x†%3    333    ""#"""233333DDDDDDDDDDD333333""""                                             23DDUUfffwwwfffU›gX33  03333    !"""""#33333CDDDDDDD4333#33#""""                                             33DDUUffvwwwwffVUy–5233333333    01!BTe""33333333CDD33333333#"""""                                             "33DTUeffwwwwwgffU•gH          "  CTe'"233333333333333333#"""""                                             23CDTUeffwwwwwgffUUhv6             3CDUv""23#333333333333333#"""                                            "23CDTUeffwwwwwgffUUDhf          1!CDTv("33333CDDD4DDDDD333333""""                                            "23CDTUeffwwwwwgffUUDt5 " "      !CCDe7333CDDDDDDDDDDDDDDD33333""""                                           "23CDTUeffvwwwwgffUUD4ES            !23DTv3CDDDDTUUUUUUUUUDDDDD3333#"""                                        !"23CDTUeffvwwwwfffUUDdE#            !23CDeDDDDUUUUUUffwˆxfUUEDDD4333""""                                      ""233DDUUfffvwwffffUUDgU3            "2T3CTDDTEUUUfffwwˆˆwgfUUEDDD3333#"""                                     ""233DDUUeffffffffVUEDge$"            !"C63DGDUUUefffwwwwwwffUEUDDDD3333"""""                                    !""33DDTUUefffffffUUE„gE4B            "!2$3cGTUUUefffvwgwwffVUUUEDDD3332""""""                                    !""33CDTUUeffffffVUUD”gE5"           ""#BgFUUUUfffffffffffVUUUDDD43333#"""""                                    !""23CDDUUUeffffVUUUD”gE4#           "2TfFUUUUefffffffffVUUUUDDDD43333""""""                                   ""233DDTUUUUVfUUUUED”WE3#           ""AUUEUUUUUefffffffVUUUUEDDDD33333#"""""                                   """33CDDTUUUUUUUUEDD”VD3"           ""ADUDTUUUUUUeffVUUUUUUUDDDDD333333""""""                                   !""233DDDUUUUUUUUDDDƒVDS#           "2 ADDDDUUUUUUUUUUUUUUUUDDDDD43333333"""""                                   !""233CDDDTUUUUEDDD4ƒV4S#           !"2  CDDDDTUUUUUUUUUUUUUUDDDDDD33333333#""""                                   """333CDDDDDDDDDD433E4C#          !"2333CDADDTUUUUUUUUUUUUDDDDDD433333333#""""                                    !"""333DDDDDDDDDD333ED5          "2333DADDDDUUUUUUEUUDDDDDDDD3333333333""""                                    """2333CDD4DDC4333#Df%#          "2 33 @DDDDDDDUUUDDDDDDDDDD43333333333#"""                                    !"""33333CDDC33333"dgU#          "2    @DDDDDDDDDDDDDDDDDDD433333333333#"""                                     """"333333333333""cVE            0    @DDDDDDDDDDDDDDDDDD43333333333333"""                                      """"3333333333"""RUD                 @DDDDDDDDDDDDDDDDD333333333333333""                                     !"""3333CDDDDDD43333REDD                 3CDDDDDDDDDDDDDDD3333333333333333""                                    !""333DDDTUUfVUUUUEDD4CDD4#             0    333EDDDDDDDDDDDD4C333333333333333""                                    """33CDDTUefvwwwgffUUEDDDD4#             0   3333DCDDDDDDDDDD433333333333333333""                                     !""233DDDUUefffwgfffUUUDDDD3              0 03333T3CDDDDDDDD4333333333333333333""                                     !""333DDDUUUeffffffVUUUDDA3  3333333T333CDDDD433333333333333333333"                ""3333DDDTUUUUeVfVUUUUEDD    3333333T3333333333334333333333333333 !23333DDDDUUUUUUUUUUUUDDD     3333333D333333333333333333333333333  !23333CDDDDTUUUUUUUUEDDDD    0333333D33333333333333333333333333  !333333DDDDDDTUUUUUDDDDDD   0333333T333334C333333333333333333    !3333333DDDDDDDDDDDDDDDD33   33333C3333333333333333333333333    33333333DDDDDDDDDDDDDD433 333333333333334333333333333333    23333333CDDDDDDDDDDDDC3333 0333333d333333333333333333303      !""""233333333DDDDDDDDDDDDE33333"""""""""""""""""2333333C533C4333333333333333      !""""""""""""""""""""""233333333CDDDDDDDDDD4D3333""""""""""""""""" 333333T33333333333333333       """""""""""""""""""""""""""""""""""""""""""333333333DDDDDDDDDDS43333#""""""""""""""""""  033333333333333333333         """""""""""""""""""""""""""""""""""""""""""3333333333DDDDDDDD3W44333 """""""""""""""""""   33333333333333333          """"""""""""""""""""""""""""""""""""""""""""23333333333DDDDDD33F43333""""""""""""""""""""     3333333333             """""""""""""""""""""""""""""""""""""""""""""33333333333C333333E4333               """"""                             """""""""""""""""""""""""""""""""""""""""""""" 333333333333433cE4333                    "2                           """""""""""""""""""""""""""""""""""""""""""""""  03333333333333SD33                      33                                 """"""""""""""""""""""""""2"2333333333333    033333334CC43D3                       0                                         """"""""""3333333333333333333333333      33333333                                                                       0""""""33333333333333333333333333                                                                                          0333333333333333333333333333333                 0           0333                                                        03333333333333333333333333333                033333333333333333                                                        033333333333333333333333                          03333333333333                                                       033333333333333333333                              0333333333333                                                     033333333333333333333                                @DDDDDDDDD433333                                                 03333333333333333333333                               @DDDDDDDDDDDDDDDDDDD                                          00333333333333333C33333333                            @DDDDDDDDDDDDDDDDDDDDDDDDDDD                                333333333333333333333333CDDDDDDDDDD                     @DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD       433333333333333333333333333433CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTDDDDDDDDDDDDDDDDDDDDDDDDDDDD43C3333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD43333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD433333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD43333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD4DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTDDDDDDDDDDDDDDDDDDDtDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEDDDDDDDDDDDDDDDDDDDtGDDDDDDDDDDTDDDDDDDDDTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDdDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDGDDDDDDDDDwWwwwuwwwwwwEDEDDDDDDDDDDDDDDDDDEGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtGDDDDtwwwwwˆˆˆˆˆˆwwwwwDDDDEDDDDDDDDDDDDDDTtwGDDDDDDDDDDDDDDDDDDDDDDDDDDDDdDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwww‡ˆˆˆˆˆˆˆˆˆˆˆxwwWUUUUUUUUUUUUUUTDDDDtwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDdwwwwwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxwwUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDdDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwww‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxWWUUUUUUUUUUUUUUUUeUwwwwwwwwwxwxw‡wwwwwwDDDDDDDDDDDDDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTDDTTDDvwwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆWUUUUUUUUUUUUUUUUUVuwwww‡ˆˆˆˆˆˆw‡xwww‡‡wuwDDDDDDDDDDDVDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUwwwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆWeUUUUUUUUUUUUUUUUUuww‡ˆˆˆˆˆˆˆˆˆˆˆˆ‡wwwwwwwwwDDDDDDDDdDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUew‡wˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUuUUUUUUUUUUUUUUUeUww‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxwwwwwwwWwDDDDDDdFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUeww‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUuUUUUUUUUUUUUUUUVUw‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡wwwwwwwwwDDDDDVDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUuww‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUUUUUUUUUUUUUUUUUVuwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwxwwwwwwGDDDfDDDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUuwxˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUUVUUUUUUUUUUUUUeWu‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwwwwwwgFDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUvwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUVUUUUUUUUUUUUUeWuU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxwwwwwwwwwwgVDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUUUUUUvwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUUUUUUUUUUUuWWUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆx‡wwwwwwwwwfDDDDDDDDDDDDDDDDDETUUUUUUUUUUUUUUUUUUUUewwˆˆˆˆˆˆˆˆˆˆˆˆˆ™™‰ˆˆˆˆXUUUUUUUUUUUUUUUUUvwWUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡wwwwwwwwwfUDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUeww‡ˆˆˆˆˆˆˆˆ™™™™™™™™™ˆˆXUUUUUUUUUUUUUUUUUvwWUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwwwfUDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUeww‡ˆˆˆˆˆˆ™™™™™™™™™™™™ˆˆUUUUUUUUUUUUUUUUUvwXUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡wwwwwwwgVDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUvwwˆˆˆˆ˜™™™™™™™™™™™™™ˆˆUUUUUUUUUUUUUUUUevwUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwwgVUUDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUevw‡ˆˆˆ™™™™™©ªªªª™™™™ˆhfVUUUUUUUUUUUUUUewwXUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxxwwwwwwgVUUUEDTDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUfwwˆˆ˜™™™©ªªªªªªª™™‰ˆgfffUUUUUUUUUUUUUewwXUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwgfUUUUUDDEDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUfw‡ˆˆ™™©ªªª»»ªªš™ˆxwfffffUUUUUUUUUUUUewwXUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxwwwwwwgfUUUUUUEDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUUfwwˆˆ™™©º»¼«š™ˆˆwgffffffVUUUUUUUUUUUevwUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxwwwwwwgfUUUUUUUUDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUUfffvwˆˆˆˆˆˆˆˆxwwwgfvgfffVUUUUUUUUUUUevWUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwgfUUUUUUUUUETDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUffffffvwwwwwwwwwwwwwxwgffVUUUUUUUUUUUevUUUUUUˆ˜™™™™™™™‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwgfUUUUUUUUUUEDDDDDUUUUUUUUUUUUUUUUUUUUUUUUffffffvwwwwwwwwwwwwwwˆwwffVUUUUUUUUUUUUvUUUUU…™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwgfUUUUUUUUUUUUDDDDUUUUUUUUUUUUUUUUUUUUUUUffffffwvwwwwwwˆˆxwwwww‰ˆwwfVUUUUUUUUUUUUfUUUUe–™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwffUUUUUUUUUUUUUDDDUUUUUUUUUUUUUUUUUUUUUUefffffwwwwwwˆˆˆˆˆˆ‡ˆxwwšˆxwfUUUUUUUUUUUUUVeVfff–™™™™™™™™™™™™™™™‰ˆˆˆˆˆˆˆˆˆˆ‡wwwwwffUUUUUUUUUUUUUUDDUUUUUUUUUUUUUUUUUUUUUUfffffvwwwwˆˆˆˆˆˆˆˆˆˆˆˆwš‰ˆwgUUUUUUUUUUUUeffffff–™™™™™™™™™™™™™™™™‰ˆˆˆˆˆˆˆˆˆwwwwwwfVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUeffffvwwwwˆ‡ˆˆˆˆˆˆˆˆˆˆˆˆ«‰ˆwgUUUUUUUUUUUefffffff–™™™™™™™™™™™™™™™™™‰ˆˆˆˆˆˆˆˆwwwwwgfVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUefffvwwwwˆˆˆˆˆ˜™™˜‰‰ˆˆˆˆ«™ˆxweffVUUUUUUUfffffvww—™™™™™ªªªªªš™™™™™™™‰ˆˆˆˆˆˆxwwwwwffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUefffwwwwˆˆˆˆ˜™™™™™™™™ˆˆˆ¬™‰xwUUUUwVUUUUeffffwwww—™™™©ªªªªªªªª©™™™™™™ˆˆˆˆˆˆxwwwwgffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUeffvwww‡‡ˆˆ™™™™™™™™™™™‰ˆ¼š‰xWUUUUUugUUUefffwwwwx˜™™™©ªªªªªªªªªªš™™™™‰ˆˆˆˆˆwwwwwffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffwww‡ˆˆˆ™™™™™™™™™™™™™ˆ¼š‰wUUeUUUUugUUeffvww‡ˆˆ‰™™™©ªªªªªªªªªªªš™™™™ˆˆˆˆxwwwwgffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUfvwwwˆˆˆˆ™™™©ªªªªªª™™™™¼ª™weUUUUUU…wWUeffvw‡ˆˆ™Šˆ™™™ªªªªº»»«ªªªª™™™™ˆˆˆxxwwwgffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUfwww‡ˆˆ˜™™™ªªªªªªªªª™™™¹ª‰‡ˆˆˆˆˆˆUU…wVeffv‡ˆˆ™©‡ˆˆ™™™ªªªº»»»»«ªªš™™™ˆˆˆˆwwwwffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUewww‡ˆˆ™™™ªªªªªªªªªªª™™¹ªˆ‡ˆˆˆˆˆhfffugeffvˆˆ˜™ºw‡ˆˆ™™™©ªª»»»»»ªªš™™‰ˆˆˆxwwwfffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUewwwˆˆ˜™™©ªªªª«»»«ªªªš™™˜ˆff†ˆˆˆhffffwffffˆ˜™ª{ww‡ˆˆ˜™™™©ªºËÌ¼«ª™™‰ˆˆˆxwwwfffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUww‡ˆˆˆ™™ªªªº«»»»»ªªªš™™šˆfffˆˆˆhffffvgffvˆ™©º|wwwwˆˆˆ˜™™™™™™™™™‰‰ˆˆˆxwwwfffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUuw‡ˆˆ™™©ªªº»»»»»»»«ªª™¹šhfff†ˆˆhfffffffvw—™ªËwwwwww‡ˆˆˆˆˆ˜™™˜ˆˆˆˆˆˆwwwwfffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUuwˆˆ˜™™ªªº»»»»»»»»»ªª™¼‰ffff†ˆˆhfffffffwww©º{wwwwwwww‡ˆˆˆˆˆˆˆˆˆˆˆwwwwgfffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwˆˆ˜™©ªª»»»»»»»»»»ªªÙ«hffff†ˆˆhffffffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUuˆˆ˜™©ªª»»»ËÌÌ¼»»»ªªÎšfffff–‰ˆhffffffwwwwwwwwwwˆxˆˆˆˆˆxˆxwwwwwwwwwffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVUˆˆ™™©ªº»»ËÌÌÌÌ¼»»ªú¼ifffff™™™‰fffffvwwwwwwww‡ˆˆˆˆˆˆˆˆˆˆˆˆxwwwwwwgwfffffffVUUUUUUUUUUUUUUUUUUUUUj # title:   rayTracing
# author:  Gabin Lembrez
# desc:    attempt at ray tracing from scratch
# site:    website link
# license: MIT License (change this to your license of choice)
# version: 0.1
# script:  python

from math import *
from random import *

class Vec3():
 def __init__(self,x,y,z):
  self.x = x
  self.y = y
  self.z = z
 def __add__(self,other):
  return Vec3(self.x+other.x,
              self.y+other.y,
              self.z+other.z)
 def __sub__(self,other):
  return Vec3(self.x-other.x,
              self.y-other.y,
              self.z-other.z)
 def __mul__(self,other):
  # term by term product
  return Vec3(self.x*other.x,
              self.y*other.y,
              self.z*other.z)
 def scale(self,t):
  # multiplication by a scalar
  return Vec3(t*self.x,t*self.y,t*self.z)  
 def norm(self):
  return  sqrt(self.x**2+self.y**2+self.z**2)
 def normalize(self):
  n = self.norm()
  self.x = self.x/n
  self.y = self.y/n
  self.z = self.z/n
 def dot(self,other):
  return self.x*other.x+self.y*other.y+self.z*other.z
 def abs(self):
  return Vec3(abs(self.x),abs(self.y),abs(self.z))
 def cross(self,other):
  return Vec3(self.y*other.z-other.y*self.z,
              self.z*other.x-other.z*self.x,
              self.x*other.y-other.x*self.y)
 def rotate(self,u,t):
  v_col=u.scale(self.dot(u))
  v_ort=self-v_col
  return v_col+u.cross(self).scale(sin(t))+v_ort.scale(cos(t))


class Camera():
 def __init__(self,p,n,w,h):
  self.p = p
  self.n = n
  self.h = h
  self.w = w
  self.screen = w/h
 def uv(self,i,j):
  return (i/self.w-0.5)*self.screen,(self.h-j)/self.h-0.5
    
class Ray():
 def __init__(self,o,d):
  self.o=o
  self.d=d
 def intersect(self,scene):
  t=None
  intersected=None
  for obj in scene:
   t_new=obj.intersect(self)
   if t_new!=None:
    if t==None:
     t=t_new
     intersected=obj
    elif t_new<t:
     t=t_new
     intersected=obj
  if t!=None:
   P=self.o+Vec3(t,t,t)*self.d
   N=intersected.get_normal(P)
   return (P,N,intersected)
  return None
 def reflected_ray(self,P,N):
  eps_acne=0.0001
  t=2*self.d.dot(N)
  new_d=self.d-Vec3(t,t,t)*N
  new_o=P+Vec3(eps_acne,eps_acne,eps_acne)*N
  return Ray(new_o,new_d)

class Sphere():
 def __init__(self,c,r,id):
  self.c=c
  self.r=r
  self.id=id
 def get_normal(self,M):
  n=M-self.c
  n.normalize()
  return n
 def intersect(self,ray):
  a=ray.d.norm()**2
  b=2*(ray.o.dot(ray.d)-self.c.dot(ray.d))
  c=-self.r**2+ray.o.norm()**2+self.c.norm()**2-2*ray.o.dot(self.c)
  delta=b**2-4*a*c
  if delta<0 : return None
  else:
   t1 = -b/(2*a)+sqrt(delta)/(2*a)
   t2 = -b/(2*a)-sqrt(delta)/(2*a)
   if t1<=0 and t2>0:
    return t2
   elif t2<=0 and t1>0:
    return t1
   elif t1>0 and t2> 0:
    return min(t1,t2)
   else :
    return None
    
    
class Plane():
 def __init__(self,p,n,id):
  self.p=p
  self.n=n
  self.id=id
 def get_normal(self,M):
  return self.n
 def intersect(self,ray):
  denum = ray.d.dot(self.n)
  if abs(denum)<0.001: return None
  else:
   num = (self.p-ray.o).dot(self.n)
   if num/denum <= 0 : return None
   else : return num/denum
  
class Triangle():
 def __init__(self,a,b,c,id):
  self.a=Vec3(a[0],a[1],a[2])
  self.b=Vec3(b[0],b[1],b[2])
  self.c=Vec3(c[0],c[1],c[2])
  self.id=id
  self.n=self.norm()
 def norm(self):
  n=(self.b-self.a).cross(self.c-self.a)
  n.normalize()
  return n
 def get_normal(self,M):
  return self.n
 def intersect(self,ray):
  t=Plane(self.a,self.n,10).intersect(ray)
  if t!=None:
   P=ray.o+ray.d.scale(t)
   if (self.b-self.a).cross(P-self.a).dot(self.n)>=0 :
    if (self.c-self.b).cross(P-self.b).dot(self.n)>=0 :
     if (self.a-self.c).cross(P-self.c).dot(self.n)>=0 :
      return t
   return None
   
class Quad():
 def __init__(self,a,b,c,d,id):
  self.id = id
  self.mesh = [Triangle(a,b,c,id+1),Triangle(c,d,a,id+2)]
 def get_normal(self,M):
  return self.mesh[0].get_normal(M)
 def intersect(self,ray):
  t=self.mesh[0].intersect(ray)
  if t!= None:
   return t
  else:
   return self.mesh[1].intersect(ray)
 
class Box():
 def __init__(self,x1,x2,x3,x4,x5,x6,x7,x8):
  self.mesh=[Triangle(x1,x2,x3),
             Triangle(x3,x4,x1),
             Triangle(x1,x2,x7),
             Triangle(x7,x6,x1),
             Triangle(x1,x4,x5),
             Triangle(x1,x5,x8),
             Triangle(x4,x3,x8),
             Triangle(x4,x5,x8),
             Triangle(x2,x3,x8),
             Triangle(x2,x8,x7),
             Triangle(x6,x7,x8),
             Triangle(x6,x8,x5)]
 def intersect(self,ray):
  t=self.mesh[0].intersect(ray)
  N=self.mesh[0].n
  for triangle in self.mesh:
   t_test=triangle.intersect(ray)    
   if t_test != None and t != None and t_test<t:
    t=t_test
    N=triangle.n
   if t_test!=None and t== None:
    t=t_test
    N=triangle.n
  if t!=None: return t,N
  else: return None 
  
class Light():
 def __init__(self,p0):
  self.p = p0
   

def is_in_shadow(object,P,N,scene,light):
 epsilon=0.0001
 l=light.p-P
 l.normalize()
 P=P+Vec3(epsilon,epsilon,epsilon)*N
 ray=Ray(P,l)
 # test_scene=[o for o in scene if o.id!=object.id]
 inter=ray.intersect(scene)
 if inter!=None: return True
 else: return False
 
def compute_color(u,v,cam,light,scene):
 depth_max=3
 reflection=1
 o=cam.p
 d=(Vec3(0,u,v)-cam.p)
 d.normalize()
 ray=Ray(o,d)
 intersection = ray.intersect(scene)
 depth=0
 intensity=0
 while intersection!=None and depth<depth_max :
  P,N,obj = intersection
  N.normalize()
  if not is_in_shadow(obj,P,N,scene,light):
   light_dir=(light.p-P)
   light_dir.normalize()
   c=cam.p-P
   c.normalize()
   BPcolor=light_dir+c
   BPcolor.normalize()
   intensity+=reflection*(light_dir.dot(N)+BPcolor.dot(N)**5)
  depth+=1
  reflection*=0.9
  ray=ray.reflected_ray(P,N)
  intersection = ray.intersect(scene)
 return intensity

cls(0)
scene=[
      Plane(Vec3(0,0,-0.2),Vec3(0,0,1),0),
      Sphere(Vec3(1,0.5,0.3),0.5,1),
      Sphere(Vec3(0.8,-0.5,0.1),0.3,2),
      Sphere(Vec3(1.2,-0.2,0.6),0.3,3),     
      #Triangle((1,0.5,0.3),(0.8,-0.5,0.1),(1.2,-0.2,0.6),4),
      #Box((-1,-1,-1),
      #    (1,-1,-1),
      #    (1,1,-1),
      #    (-1,1,-1),
      #    (-1,1,1),
      #    (-1,-1,1),
      #    (1,-1,1),
      #    (1,1,1),
      #    0)
      ]
cam=Camera(Vec3(-2,0,0.1),Vec3(1,0,0),240,136)
light = Light(Vec3(0,0,2))


def sample(L,k):
 l=[]
 L=list(L)
 for _ in range(k):
  N=len(L)
  id=randint(0,N-1)
  l.append(L.pop(id))
 return l


def TIC():
 global cam
 global light
 global scene
 if btn(0): light.p.x+=0.02
 if btn(1): light.p.x-=0.02
 if btn(2): light.p.y-=0.02
 if btn(3): light.p.y+=0.02
 poke(0x3FFB,1)
 list_i=sample(range(240),50)
 list_j=sample(range(136),50)
 for i in list_i:
  for j in list_j:
   u,v=cam.uv(i,j)
   intensity=compute_color(u,v,cam,light,scene)
   color=round(15*intensity/4)
   pix(i,j,color)
   
