����JFIF�����%%��� }!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������� w!1AQaq"2�B���� #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|��O�������h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@��o�E��/�?��ߵE_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ ?�z�����������goڢ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?��=[�Qg�����o����Q@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y�����[����TP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,���|-��v��(���� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�������;~��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�������?�_�����j������ (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@��o�E��/�?��ߵE_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ ?�z�����������goڢ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?��=[�Qg�����o����Q@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y�����[����TP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,���|-��v��(���� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�������;~��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�������?�_�����j������ (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@��o�E��/�?��ߵE_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ ?�z�����������goڢ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?��=[�Qg�����o����Q@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y�����[����TP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,��������ο�O�P��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@����(���g���Y������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���V��Y|����Y����UP��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����,�����,��u������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j���h�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� �@���o�E��?�?����ο�U_�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ _�z�����������g_ڪ�?��(�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (��?�/�=[�Qe�����g����U@��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������k�w���~���v��������� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (���տ�_�����:��T�~�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@������/���?��j�?�5o�%��?��� g����U@�����&O3�����a�;�^=�wH���D��/��*� �fX�I���,������k?g_���?�5o�%��?��� g����U@�F�����������*������?�o�}��Τ~g��ʀ�#V��Y������~ο�T�j��K/� ������������z��������#;�~���A�;��� w�F�����������*���տ��_�@�o��5����EU������������u�誠��W��[�����������O��?jW���@��տ���@�o��5����EM������������v�訠�#V��Y�������������V��Zv��~����vw�~���c�Q@���,��~���kgo���?�5o�%��/��� o����Q@��o�%�>�ߤ���߳����S������?��o�%�~�ߠ�d�߳����S����g�P��j��K?� _������������[� g�D����[�;�TP7���������'Ѿ���=��;/�P��j��K?� _������������[� g�D����[�;�TP���,��~���kgo���a������۔���B{���ea�`T�+ �n%Ц �����j��K?� _������������[� g�D����[�;�TP���,��~���kgo����?���%�/�~�����#����x��c�~�q�v�t`ȫ��_'h���������'�]�;{s� Pp=N= 5���%�����ڜs�����=���J��A@�����Kp�b��}��X�����4g v+:�Բ�+60�ʩ,� @�����������I �uO�����ToUv��bgUl�cP�T?�#V��Y������������j��K?� _����������!��X��]���������TK�|4��`� ��#��P\y��aa >NgL��j��K?� _������������[� g�D����[�;�TP���,��~���kgo���o�F�����$��ہ�� ��vݞr6��S�q''*02���[� g�D����[�;�TP���,��~���kgo���?�5o�%��/��� o����Q@�F�����������*(��տ���@�o��5����EE������������v�訠��������~1�o���}G�L�������5o�%��/��� o����Q@�F�����������*(��տ���@�o��5����EE5����%�˷���r�v����y�\~���)(?0���=[� i����>��gc��N=����5o�%��/��� o����Q@�F�����������*(��W��Z�l����m#���X�wn_�j`0C6윅����5o�%��/��� o����Q@��տ��y9���gbO�G�5@�n�>���#V��Y������~ο�T��V��Y����9�gc��s�T.�?Z_��[� e�D����Y�:��UP���,������k?g_����_�=_� n�~~�rI������w�,"~ԓ�!72���)( u��#V��Y������~ο�T�j��K/� ��������������K
�����Kr_���}�De>~��Z=��pjX�n[p(�"� �a,Ub�/�×�<����;��<�����K>��o���[�:����V���,��$��ϧ�*�����5O����տ��_�@�o��5����EU5��o�%����?�ꜜm�_�;>Gbs�S�����@��տ��_�@�o��5����EU ��տ��}�~�����v?�������-��o�l��~�ȥ�v����r��B1���@��տ���A�?����ggP��c�S�`@%�*����տ��_�@�o��5����EU������������u�誠7���� O���!c�|0��ёv��4�+�X�Vx�RX3��8����K>��o���[�:���u#�x��#V��Y������~ο�T�j��K/� ������������[� e�D����Y�:��UP���,������k?g_���O��[� g�D����[�:��T��=_� k����~��k����c�;����.8����c��z��Ͽ�/��zc�o����F?Z_��[� e�D����Y�:��UP���,������k?g_���C���,�v����v�o���H������(�z���w�/�����v ��T.G��Ϡ���տ��_�@�o��5����EU������������u�誠��W��[��'����%��o���:�Cڕ�R̀���j���������?�o���[�;������g0q�?��o�%�>o�_��>�gf����~4�������������u�誠�z���7�/��o���������_��[� e�D����Y�:��UP���,������k?g_���C���,�|�����o��;�Ԟ��9�l�z��ؠ3|��O�X�~���;~�q����Z�F�����������*���տ��_�@�o��5����EU!��տ��}�~����-��G��I�T�������������u�誠�#V��Y������~ο�T�j��K/� ����������#�=_� n|���KbB�gtdM��"�ڒA#n�63�6�m�P�����,���/���gS�u����#�9��5o�%��?��� g����U@��o�%�o�_�����u��'�������?��o��� ���3��?go���|m�ڇ���-S�O��x��>���^�����7����x�]_�>�qke>���m��4��7P�Yހ��
0byt3m1n1
0byt3m1n1
Path:
/
hermes
/
bosweb
/
web
/
sb_web
/
web
/
sb_web
/
web
/
b1705
/
prendex.com
/
tools
/
[
Home
]
File: send_reminders.php
#!/usr/local/bin/php -q <?php /* $Id: send_reminders.php,v 1.81.2.10 2008/04/23 17:38:50 umcesrjones Exp $ * * Description: * This is a command-line script that will send out any email * reminders that are due. * * Usage: * php send_reminders.php * * Setup: * This script should be setup to run periodically on your system. You could run * it once every minute, but every 5-15 minutes should be sufficient. * * To set this up in cron, add a line like the following in your crontab * to run it every 10 minutes: * 1,11,21,31,41,51 * * * * php /some/path/here/send_reminders.php * Of course, change the path to where this script lives. If the php binary is * not in your $PATH, you may also need to provide the full path to "php". * On Linux, just type crontab -e to edit your crontab. * * If you're a Windows user, you'll either need to find a cron clone * for Windows (they're out there) or use the Windows Task Scheduler. * (See docs/WebCalendar-SysAdmin.html for instructions.) * * Comments: * You will need access to the PHP binary (command-line) rather than * the module-based version that is typically installed for use with * a web server.to build as a CGI (rather than an Apache module) for * * If running this script from the command line generates PHP * warnings, you can disable error_reporting by adding * "-d error_reporting=0" to the command line: * php -d error_reporting=0 /some/path/here/tools/send_reminders.php * *********************************************************************/ // How many days in advance can a reminder be sent (max)? // This will affect performance, but keep in mind that someone may enter // a reminder to be sent 60 days in advance or they may enter a specific // date for a reminder to be sent that is more than 30 days before the // event's date. If you're only running this once an hour or less often, // then you could certainly change this to look a whole 365 days ahead. $DAYS_IN_ADVANCE = 30; // $DAYS_IN_ADVANCE = 365; // Load include files. // If you have moved this script out of the WebCalendar directory, which you // probably should do since it would be better for security reasons, you would // need to change __WC_INCLUDEDIR to point to the webcalendar include directory. define ( '__WC_BASEDIR', '..' ); // Points to the base WebCalendar directory // relative to current working directory. define ( '__WC_INCLUDEDIR', '../includes' ); $old_path = ini_get ( 'include_path' ); $delim = ( strstr ( $old_path, ';' ) ? ';' : ':' ); ini_set ( 'include_path', $old_path . $delim . __WC_INCLUDEDIR . $delim ); require_once __WC_INCLUDEDIR . '/classes/WebCalendar.class'; require_once __WC_INCLUDEDIR . '/classes/Event.class'; require_once __WC_INCLUDEDIR . '/classes/RptEvent.class'; require_once __WC_INCLUDEDIR . '/classes/WebCalMailer.class'; $WebCalendar =& new WebCalendar ( __FILE__ ); include __WC_INCLUDEDIR . '/translate.php'; include __WC_INCLUDEDIR . '/config.php'; include __WC_INCLUDEDIR . '/dbi4php.php'; include __WC_INCLUDEDIR . '/formvars.php'; include __WC_INCLUDEDIR . '/functions.php'; $WebCalendar->initializeFirstPhase (); include __WC_INCLUDEDIR . '/' .$user_inc; include __WC_INCLUDEDIR . '/site_extras.php'; $WebCalendar->initializeSecondPhase (); $debug = false;// Set to true to print debug info... $only_testing = false; // Just pretend to send -- for debugging. // Establish a database connection. $c = dbi_connect ( $db_host, $db_login, $db_password, $db_database, true ); if ( ! $c ) { echo translate ( 'Error connecting to database' ) . ': ' . dbi_error (); exit; } load_global_settings (); $WebCalendar->setLanguage (); set_today (); if ( $debug ) echo '<br />Include Path=' . ini_get ( 'include_path' ) . "<br />\n"; // Get a list of the email users in the system. // They must also have an email address. // Otherwise, we can't send them mail, so what's the point? $allusers = user_get_users (); $allusercnt = count ( $allusers ); for ( $i = 0; $i < $allusercnt; $i++ ) { $names[$allusers[$i]['cal_login']] = $allusers[$i]['cal_fullname']; $emails[$allusers[$i]['cal_login']] = $allusers[$i]['cal_email']; } $attachics = $htmlmail = $languages = $noemail = $t_format = $tz = array (); $res = dbi_execute ( 'SELECT cal_login, cal_value, cal_setting FROM webcal_user_pref WHERE ( cal_setting = \'EMAIL_HTML\' AND cal_value = \'Y\' ) OR ( cal_setting = \'EMAIL_REMINDER\' AND cal_value = \'N\' ) OR ( cal_setting = \'EMAIL_REMINDER_ATTACH_ICS\' AND cal_value = \'Y\') OR cal_setting = \'LANGUAGE\' OR cal_setting = \'TIME_FORMAT\' OR cal_setting = \'TIMEZONE\' ORDER BY cal_login, cal_setting' ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { $user = $row[0]; switch ( $row[2] ) { case 'EMAIL_HTML': // Users who have asked for HTML (default is plain text). $htmlmail[$user] = true; if ( $debug ) echo "User $user wants HTML mail.<br />\n"; break; case 'EMAIL_REMINDER': // Users who have asked not to receive email. $noemail[$user] = 1; if ( $debug ) echo "User $user does not want email.<br />\n"; break; case 'EMAIL_REMINDER_ATTACH_ICS': // Users who have asked receive an ICS-attachment with their email. $attachics[$user] = 1; if ( $debug ) echo "User $user does want ICS-attachment with email.<br />\n"; break; case 'LANGUAGE': // Users language preference. $languages[$user] = $row[1]; if ( $debug ) echo "Language for $user is $row[1].<br />\n"; break; case 'TIME_FORMAT': // Users time format settings. $t_format[$user] = $row[1]; if ( $debug ) echo "Time Format for $user is $row[1].<br />\n"; break; case 'TIMEZONE': // Users TIMEZONE settings. $tz[$user] = $row[1]; if ( $debug ) echo "TIMEZONE for $user is $row[1].<br />\n"; break; } // switch } dbi_free_result ( $res ); } if ( empty ( $GENERAL_USE_GMT ) || $GENERAL_USE_GMT != 'Y' ) $def_tz = $SERVER_TIMEZONE; $startdateTS = time ( 0, 0, 0 ); $enddateTS = $startdateTS + ( $DAYS_IN_ADVANCE * 86400 ); $startdate = date ( 'Ymd', $startdateTS ); $enddate = date ( 'Ymd', $enddateTS ); // Now read all the repeating events (for all users). $repeated_events = query_events ( '', true, 'AND ( wer.cal_end >= ' . $startdate . ' OR wer.cal_end IS NULL ) ' ); $repcnt = count ( $repeated_events ); // Read non-repeating events (for all users). if ( $debug ) echo "Checking for events from date $startdate to date $enddate.<br />\n"; $events = read_events ( '', $startdateTS, $enddateTS ); $eventcnt = count ( $events ); if ( $debug ) echo "Checking for tasks from date $startdate to date $enddate.<br />\n"; $tasks = read_tasks ( '', $enddateTS ); $taskcnt = count ( $tasks ); if ( $debug ) echo 'Found ' . 0 + $eventcnt + $taskcnt + $repcnt . " events in time range.<br />\n"; $is_task = false; for ( $d = 0; $d < $DAYS_IN_ADVANCE; $d++ ) { $dateTS = time () + ( $d * 86400 ); $date = date ( 'Ymd', $dateTS ); // Get non-repeating events for this date. // An event will be included one time for each participant. $ev = get_entries ( $date ); // Keep track of duplicates. $completed_ids = array (); $evcnt = count ( $ev ); for ( $i = 0; $i < $evcnt; $i++ ) { $id = $ev[$i]->getID (); if ( ! empty ( $completed_ids[$id] ) ) continue; $completed_ids[$id] = 1; process_event ( $id, $ev[$i]->getName (), $ev[$i]->getDateTimeTS (), $ev[$i]->getEndDateTimeTS () ); } // Get tasks for this date. // A task will be included one time for each participant. $tks = get_tasks ( $date ); // Keep track of duplicates. $completed_ids = array (); $tkscnt = count ( $tks ); for ( $i = 0; $i < $tkscnt; $i++ ) { $id = $tks[$i]->getID (); if ( ! empty ( $completed_ids[$id] ) ) continue; $completed_ids[$id] = 1; $is_task = true; process_event ( $id, $tks[$i]->getName (), $tks[$i]->getDateTimeTS (), $tks[$i]->getDueDateTimeTS (), $dateTS ); } $is_task = false; // Get repeating events...tasks are not included at this time. if ( $debug ) echo "Getting repeating events for $date<br />"; $rep = my_get_repeating_entries ( '', $date ); $repcnt = count ( $rep ); if ( $debug ) echo "found $repcnt repeating events for $date<br />"; for ( $i = 0; $i < $repcnt; $i++ ) { $id = $rep[$i]->getID (); if ( ! empty ( $completed_ids[$id] ) ) continue; $completed_ids[$id] = 1; process_event ( $id, $rep[$i]->getName (), $rep[$i]->getDateTimeTS (), $rep[$i]->getEndDateTimeTS (), $date ); } } if ( $debug ) echo "Done.<br />\n"; // Send a reminder for a single event for a single day to all participants in // the event who have accepted as well as those who have not yet approved. // But, don't send to users who rejected (cal_status='R' ). function send_reminder ( $id, $event_date ) { global $ALLOW_EXTERNAL_USERS, $debug, $def_tz, $emails, $EXTERNAL_REMINDERS, $attachics, $htmlmail, $is_task, $LANGUAGE, $languages, $names, $only_testing, $SERVER_URL, $site_extras, $t_format, $tz; $ext_participants = $participants = array (); $num_ext_participants = $num_participants = 0; $pri[1] = translate ( 'High' ); $pri[2] = translate ( 'Medium' ); $pri[3] = translate ( 'Low' ); // Get participants first... $res = dbi_execute ( 'SELECT cal_login, cal_percent FROM webcal_entry_user WHERE cal_id = ? AND cal_status IN ( \'A\',\'W\' ) ORDER BY cal_login', array ( $id ) ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { $participants[$num_participants++] = $row[0]; $percentage[$row[0]] = $row[1]; } } $partcnt = count ( $participants ); // Get external participants. if ( ! empty ( $ALLOW_EXTERNAL_USERS ) && $ALLOW_EXTERNAL_USERS == 'Y' && ! empty ( $EXTERNAL_REMINDERS ) && $EXTERNAL_REMINDERS == 'Y' ) { $res = dbi_execute ( 'SELECT cal_fullname, cal_email FROM webcal_entry_ext_user WHERE cal_id = ? AND cal_email IS NOT NULL ORDER BY cal_fullname', array ( $id ) ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { $ext_participants[$num_ext_participants] = $row[0]; $ext_participants_email[$num_ext_participants++] = $row[1]; } } } $ext_partcnt = count ( $ext_participants ); if ( ! $num_participants && ! $num_ext_participants ) { if ( $debug ) echo 'No participants found for event id' . ": $id<br />\n"; return; } // Get event details. $res = dbi_execute ( 'SELECT cal_create_by, cal_date, cal_time, cal_mod_date, cal_mod_time, cal_duration, cal_priority, cal_type, cal_access, cal_name, cal_description, cal_due_date, cal_due_time FROM webcal_entry WHERE cal_id = ?', array ( $id ) ); if ( ! $res ) { echo translate ( 'Database error' ) . ': ' . translate ( 'could not find event id' ) . " $id.\n"; return; } if ( ! ( $row = dbi_fetch_row ( $res ) ) ) { echo translate ( 'Error' ) . ': ' . str_replace ( 'XXX', $id, translate ( 'could not find event id XXX in database.' ) ) . "\n"; return; } // Send mail. We send one user at a time so that we can switch // languages between users if needed (as well as HTML vs plain text). $mailusers = $recipients = array (); if ( isset ( $single_user ) && $single_user == 'Y' ) { $mailusers[] = $emails[$single_user_login]; $recipients[] = $single_user_login; } else { for ( $i = 0; $i < $partcnt; $i++ ) { if ( strlen ( $emails[$participants[$i]] ) ) { $mailusers[] = $emails[$participants[$i]]; $recipients[] = $participants[$i]; } else { if ( $debug ) echo "No email for user $participants[$i].<br />\n"; } } for ( $i = 0; $i < $ext_partcnt; $i++ ) { $mailusers[] = $ext_participants_email[$i]; $recipients[] = $ext_participants[$i]; } } $mailusercnt = count ( $mailusers ); if ( $debug ) echo 'Found ' . $mailusercnt . " with email addresses<br />\n"; for ( $j = 0; $j < $mailusercnt; $j++ ) { $recip = $mailusers[$j]; $user = $recipients[$j]; $isExt = ( ! in_array ( $user, $participants ) ); $userlang = ( empty ( $languages[$user] ) ? $LANGUAGE // System default. : $languages[$user] ); $userTformat = ( ! empty ( $t_format[$user] ) ? $t_format[$user] : 24 ); // Gotta pick something. if ( $userlang == 'none' ) $userlang = 'English-US'; // Gotta pick something. if ( $debug ) echo "Setting language to \"$userlang\".<br />\n"; reset_language ( $userlang ); $adminStr = translate ( 'Administrator' ); // Reset timezone setting for current user. if ( ! empty ( $tz[$user] ) ) { $display_tzid = 2; // Display TZ. $user_TIMEZONE = $tz[$user]; } else if ( ! empty ( $def_tz ) ) { $display_tzid = 2; $user_TIMEZONE = $def_tz; } else { $display_tzid = 3; // Do not use offset & display TZ. // I think this is the only real timezone set to UTC...since 1972 at least. $user_TIMEZONE = 'Africa/Monrovia'; } // This will allow date functions to use the proper TIMEZONE. set_env ( 'TZ', $user_TIMEZONE ); $useHtml = ( ! empty ( $htmlmail[$user] ) ? 'Y' : 'N' ); $padding = ( ! empty ( $htmlmail[$user] ) ? ' ' : ' ' ); $body = str_replace ( 'XXX', ( $is_task ? translate ( 'task' ) : translate ( 'event' ) ), translate ( 'This is a reminder for the XXX detailed below.' ) ) . "\n\n"; $create_by = $row[0]; $event_time = date_to_epoch ( $row[1] . ( $row[2] != -1 ? sprintf ( "%06d", $row[2] ): '' ) ); $name = $row[9]; $description = $row[10]; // Add trailing '/' if not found in server_url. // Don't include link for External users. if ( ! empty ( $SERVER_URL ) && ! $isExt ) { $eventURL = $SERVER_URL . ( substr ( $SERVER_URL, -1, 1 ) == '/' ? '' : '/' ) . 'view_entry.php?id=' . $id . '&em=1'; if ( $useHtml == 'Y' ) $eventURL = activate_urls ( $eventURL ); $body .= $eventURL . "\n\n"; } $body .= strtoupper ( $name ) . "\n\n" . translate ( 'Description' ) . ":\n" . $padding . $description . "\n" . ( $is_task ? translate ( 'Start Date' ) : translate ( 'Date' ) ) . ': ' . date_to_str ( ( $row[2] > 0? date ( 'Ymd', $event_date ) : gmdate ( 'Ymd', $event_date ) ) ) . "\n" . ( $row[2] > 0 ? ( $is_task ? translate ( 'Start Time' ) : translate ( 'Time' ) ) . ': ' . display_time ( '', $display_tzid, $event_time, $userTformat ) . "\n" : ( ( $row[2] == 0 && $row[5] = 1440) ? translate ( 'Time' ) . ': ' . translate ( 'All day event' ). "\n" : '' ) ) . ( $row[5] > 0 && ! $is_task ? translate ( 'Duration' ) . ': ' . $row[5] . ' ' . translate ( 'minutes' ) . "\n" : ( $is_task ? translate ( 'Due Date' ) . ': ' . date_to_str ( $row[11] ) . "\n" . translate ( 'Due Time' ) . ': ' . display_time ( $row[12], $display_tzid, '', $userTformat ) . "\n" : '' ) ) . ( $is_task && isset ( $percentage[$user] ) ? translate ( 'Pecentage Complete' ) . ': ' . $percentage[$user] . "%\n" : '' ) . ( empty ( $DISABLE_PRIORITY_FIELD ) || $DISABLE_PRIORITY_FIELD != 'Y' ? translate ( 'Priority' ) . ': ' . $row[6] . '-' . $pri[ceil( $row[6] / 3 )] . "\n" : '' ); if ( empty ( $DISABLE_ACCESS_FIELD ) || $DISABLE_ACCESS_FIELD != 'Y' ) { $body .= translate ( 'Access' ) . ': '; if ( $row[8] == 'C' ) $body .= translate ( 'Confidential' ) . "\n"; elseif ( $row[8] == 'P' ) $body .= translate ( 'Public' ) . "\n"; elseif ( $row[8] == 'R' ) $body .= translate ( 'Private' ) . "\n"; } $body .= ( ! empty ( $single_user_login ) && ! $single_user_login ? translate ( 'Created by' ) . ': ' . $row[0] . "\n" : '' ) . translate ( 'Updated' ) . ': ' . date_to_str ( $row[3] ) . ' ' . display_time ( $row[3] . sprintf ( "%06d", $row[4] ), $display_tzid, '', $userTformat ) . "\n"; // Site extra fields. $extras = get_site_extra_fields ( $id ); $site_extracnt = count ( $site_extras ); for ( $i = 0; $i < $site_extracnt; $i++ ) { if ( $site_extras[$i] == 'FIELDSET' ) continue; $extra_name = $site_extras[$i][0]; $extra_descr = $site_extras[$i][1]; $extra_type = $site_extras[$i][2]; $extra_arg1 = $site_extras[$i][3]; $extra_arg2 = $site_extras[$i][4]; if ( ! empty ( $site_extras[$i][5] ) ) $extra_view = $site_extras[$i][5] & EXTRA_DISPLAY_REMINDER; if ( ! empty ( $extras[$extra_name]['cal_name'] ) && $extras[$extra_name]['cal_name'] != '' && ! empty ( $extra_view ) ) { $val = ''; $body .= $extra_descr; if ( $extra_type == EXTRA_DATE ) $body .= ': ' . $extras[$extra_name]['cal_date'] . "\n"; elseif ( $extra_type == EXTRA_MULTILINETEXT ) $body .= "\n" . $padding . $extras[$extra_name]['cal_data'] . "\n"; elseif ( $extra_type == EXTRA_RADIO ) $body .= ': ' . $extra_arg1[$extras[$extra_name]['cal_data']] . "\n"; else // Default method for EXTRA_URL, EXTRA_TEXT, etc... $body .= ': ' . $extras[$extra_name]['cal_data'] . "\n"; } } if ( ( empty ( $single_user ) || $single_user != 'Y' ) && ( empty ( $DISABLE_PARTICIPANTS_FIELD ) || $DISABLE_PARTICIPANTS_FIELD != 'N' ) ) { $body .= translate ( 'Participants' ) . ":\n"; for ( $i = 0; $i < $partcnt; $i++ ) { $body .= $padding . $names[$participants[$i]] . "\n"; } for ( $i = 0; $i < $ext_partcnt; $i++ ) { $body .= $padding . $ext_participants[$i] . ' ( ' . translate ( 'External User' ) . ")\n"; } } $subject = translate ( 'Reminder' ) . ': ' . stripslashes ( $name ); if ( $debug ) echo "Sending mail to $recip (in $userlang).<br />\n"; if ( $only_testing ) { if ( $debug ) echo '<hr /> <pre> To: ' . $recip . ' Subject: ' . $subject . ' From:' . $adminStr . ' ' . $body . ' </pre> '; } else { $mail = new WebCalMailer; user_load_variables ( $user, 'temp' ); $recipName = ( $isExt ? $user : $GLOBALS ['tempfullname'] ); // Send ics attachment to External Users or // or users who explicitly chose to receive it. $attach = ( ($isExt || isset($attachics[$user])) ? $id : '' ); $mail->WC_Send ( $adminStr, $recip, $recipName, $subject, $body, $useHtml, $GLOBALS['EMAIL_FALLBACK_FROM'], $attach ); $cal_text = ( $isExt ? translate ( 'External User' ) : '' ) . $recipName; activity_log ( $id, 'system', $user, LOG_REMINDER, $cal_text ); } } } // Keep track of the fact that we sent the reminder, so we don't do it again. function log_reminder ( $id, $times_sent ) { global $debug, $only_testing; if ( ! $only_testing ) dbi_execute ( 'UPDATE webcal_reminders SET cal_last_sent = ?, cal_times_sent = ? WHERE cal_id = ?', array ( time (), $times_sent, $id ) ); } // Process an event for a single day. Check to see if it has a reminder, // when it needs to be sent and when the last time it was sent. function process_event ( $id, $name, $start, $end, $new_date = '' ) { global $debug, $is_task, $only_testing; // Get reminders array. $reminder = getReminders ( $id ); if ( ! empty ( $reminder ) ) { if ( $debug ) echo " Reminder set for event.<br />\n"; $times_sent = $reminder['times_sent']; $repeats = $reminder['repeats']; $lastsent = $reminder['last_sent']; $related = $reminder['related']; // If we are working with a repeat or overdue task, and we have sent all the // reminders for the basic event, then reset the counter to 0. if ( ! empty ( $new_date ) ) { if ( $times_sent == $repeats + 1 ) { if ( ! $is_task || ( $related == 'E' && date ( 'Ymd', $new_date ) != date ( 'Ymd', $end ) ) ) // Tasks only. $times_sent = 0; } $new_offset = date_to_epoch ( $new_date ) - ( $start - ( $start % 86400 ) ); $start += $new_offset; $end += $new_offset; } if ( $debug ) printf ( "Event %d: \"%s\" on %s at %s GMT<br />\n", $id, $name, gmdate ( 'Ymd', $start ), gmdate ( 'H:i:s', $start ) ); // It is pointless to send reminders after this time! $pointless = $end; $remB4 = ( $reminder['before'] == 'Y' ); if ( ! empty ( $reminder['date'] ) ) // We're using a date. $remind_time = $reminder['timestamp']; else { // We're using offsets. $offset = $reminder['offset'] * 60; // Convert to seconds. if ( $related == 'S' ) { // Relative to start. $offset_msg = ( $remB4 ? ' Mins Before Start: ' : ' Mins After Start: ' ) . $reminder['offset']; $remind_time = ( $remB4 ? $start - $offset : $start + $offset ); } else { // Relative to end/due. $offset_msg = ( $remB4 ? ' Mins Before End: ' : ' Mins After End: ' ) . $reminder['offset']; $remind_time = ( $remB4 ? $end - $offset : $end + $offset ); $pointless = ( $remB4 ? $end : $end + $offset ); } } // Factor in repeats if set. if ( $repeats > 0 && $times_sent <= $repeats ) $remind_time += ( $reminder['duration'] * 60 * $times_sent ); if ( $debug ) echo ( empty ( $offset_msg ) ? '' : $offset_msg . '<br />' ) . ' Event ' . ( $related == 'S' // Relative to start. ? 'start time is: ' . gmdate ( 'm/d/Y H:i', $start ) : 'end time is: ' . gmdate ( 'm/d/Y H:i', $end ) ) . ' GMT<br /> Remind time is: ' . gmdate ( 'm/d/Y H:i', $remind_time ) . ' GMT<br /> Effective delivery time is: ' . date ( 'm/d/Y H:i T', $remind_time ) . '<br /> Last sent on: ' . ( $lastsent == 0 ? 'NEVER' : date ( 'm/d/Y H:i T', $lastsent ) ) // No sense sending reminders if the event is over! // Unless the entry is a task. . '<br /><br /> times_sent = ' . $times_sent . ' repeats = ' . $repeats . ' time = ' . date ( 'His', time () ). ' remind_time = ' . date ( 'His', $remind_time ). ' lastsent = ' . ( $lastsent > 0 ? date ( 'Ymd His', $lastsent ): " NEVER " ) . ' pointless = ' .date ( 'Ymd His', $pointless ). ' is_task = ' . ( $is_task ? 'true' : 'false' ) . '<br />'; if ( $times_sent < ( $repeats + 1 ) && time () >= $remind_time && $lastsent <= $remind_time && ( time () <= $pointless || $is_task ) ) { // Send a reminder. if ( $debug ) echo ' SENDING REMINDER!<br />' . "\n"; send_reminder ( $id, $start ); // Now update the db... if ( $debug ) echo '<br /> LOGGING REMINDER!<br /><br />' . "\n"; log_reminder ( $id, $times_sent + 1 ); } } } //end function process_event function my_get_repeating_entries ( $user, $dateYmd, $get_unapproved = true ) { global $debug, $repeated_events; $n = 0; $ret = array (); if ( $debug ) echo "Getting repeating entries for $dateYmd<br />"; for ( $i = 0, $cnt = count ( $repeated_events ); $i < $cnt; $i++ ) { $list = $repeated_events[$i]->getRepeatAllDates (); for ( $j = 0, $cnt_j = count ( $list ); $j < $cnt_j; $j++ ) { if ( $debug ) echo " checking $list[$j] = " . date ( 'Ymd', $list[$j]) . '<br />'; if ( $dateYmd == date ( 'Ymd', $list[$j] ) ) { $ret[$n++] = $repeated_events[$i]; if ( $debug ) echo 'Added!<br />'; } } } return $ret; } ?>
© 2017 -
ZeroByte.ID
.