Merge lp:~renatofilho/indicator-datetime/ignore-alarms-with-invalid-actions into lp:indicator-datetime

Proposed by Renato Araujo Oliveira Filho
Status: Merged
Approved by: Charles Kerr
Approved revision: 457
Merged at revision: 455
Proposed branch: lp:~renatofilho/indicator-datetime/ignore-alarms-with-invalid-actions
Merge into: lp:indicator-datetime
Diff against target: 1277 lines (+1209/-4)
4 files modified
src/engine-eds.cpp (+138/-4)
tests/CMakeLists.txt (+1/-0)
tests/test-eds-ics-repeating-events-with-individual-change.cpp (+101/-0)
tests/test-eds-ics-repeating-events-with-individual-change.ics.in (+969/-0)
To merge this branch: bzr merge lp:~renatofilho/indicator-datetime/ignore-alarms-with-invalid-actions
Reviewer Review Type Date Requested Status
Charles Kerr (community) Approve
PS Jenkins bot continuous-integration Pending
Review via email: mp+297719@code.launchpad.net

Commit message

Fetch individual detached instances for recurrence events.
Ignore alarms with invalid actions.

Description of the change

How to test:

1 - Create a new event that repeats every day starting yesterday
3 - Make sure that the event appears on the indicator
4 - Edit TODAY instance of the event, change title and time of the intance only
5 - Make sure that the indicator get update with the new event info

To post a comment you must log in.
452. By Renato Araujo Oliveira Filho

Add comments.

453. By Renato Araujo Oliveira Filho

Fetch deatached instances of events.

454. By Renato Araujo Oliveira Filho

Update comments.

455. By Renato Araujo Oliveira Filho

Create unit test

Revision history for this message
Charles Kerr (charlesk) wrote :

Comments inline

456. By Renato Araujo Oliveira Filho

Fixed typos;
Updated code based on review requests.

457. By Renato Araujo Oliveira Filho

Check for null before create std::string from uid.

Revision history for this message
Charles Kerr (charlesk) wrote :

LGTM.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/engine-eds.cpp'
2--- src/engine-eds.cpp 2016-05-14 02:07:10 +0000
3+++ src/engine-eds.cpp 2016-06-28 15:52:52 +0000
4@@ -569,6 +569,7 @@
5 std::string color;
6 GList *components;
7 GList *instance_components;
8+ std::set<std::string> parent_components;
9
10 ClientSubtask(const std::shared_ptr<Task>& task_in,
11 ECalClient* client_in,
12@@ -641,16 +642,146 @@
13 const gchar *uid = nullptr;
14 e_cal_component_get_uid (comp, &uid);
15 g_object_ref(comp);
16- if (e_cal_component_is_instance(comp))
17+
18+ if (e_cal_component_is_instance(comp) && (uid != nullptr)) {
19+ subtask->parent_components.insert(std::string(uid));
20 subtask->instance_components = g_list_append(subtask->instance_components, comp);
21- else
22+ } else {
23 subtask->components = g_list_append(subtask->components, comp);
24+ }
25 return TRUE;
26 }
27
28 static void
29+ merge_detached_instances(ClientSubtask *subtask, GSList *instances)
30+ {
31+ for (GSList *i=instances; i!=nullptr; i=i->next) {
32+ auto instance = static_cast<ECalComponent*>(i->data);
33+ auto instance_id = e_cal_component_get_id(instance);
34+ for (GList *c=subtask->instance_components ; c!= nullptr; c=c->next) {
35+ auto component = static_cast<ECalComponent*>(c->data);
36+ auto component_id = e_cal_component_get_id(component);
37+ bool found = false;
38+
39+ if (e_cal_component_id_equal(instance_id, component_id)) {
40+ // replaces virtual instance with the real one
41+ g_object_unref(component);
42+ c->data = g_object_ref(instance);
43+ found = true;
44+ }
45+ e_cal_component_free_id(component_id);
46+ if (found)
47+ break;
48+ }
49+ e_cal_component_free_id (instance_id);
50+ }
51+ }
52+
53+ static void
54+ fetch_detached_instances(GObject *,
55+ GAsyncResult *res,
56+ gpointer gsubtask)
57+ {
58+ auto subtask = static_cast<ClientSubtask*>(gsubtask);
59+ if (res) {
60+ GError *error = nullptr;
61+ GSList *comps = nullptr;
62+ e_cal_client_get_objects_for_uid_finish(subtask->client,
63+ res,
64+ &comps,
65+ &error);
66+ if (error) {
67+ g_warning("Fail to retrieve detached instances: %s", error->message);
68+ g_error_free(error);
69+ } else {
70+ merge_detached_instances(subtask, comps);
71+ e_cal_client_free_ecalcomp_slist(comps);
72+ }
73+ }
74+
75+ if (subtask->parent_components.empty()) {
76+ on_event_fetch_list_done(gsubtask);
77+ return;
78+ }
79+
80+ // continue fetch detached instances
81+ auto i_begin = subtask->parent_components.begin();
82+ std::string id = *i_begin;
83+ subtask->parent_components.erase(i_begin);
84+ e_cal_client_get_objects_for_uid(subtask->client,
85+ id.c_str(),
86+ subtask->cancellable.get(),
87+ (GAsyncReadyCallback) fetch_detached_instances,
88+ gsubtask);
89+ }
90+
91+ static void
92 on_event_generated_list_ready(gpointer gsubtask)
93 {
94+ fetch_detached_instances(nullptr, nullptr, gsubtask);
95+ }
96+
97+ static gint
98+ sort_events_by_start_date(ECalComponent *eventA, ECalComponent *eventB)
99+ {
100+ ECalComponentDateTime start_date_a;
101+ ECalComponentDateTime start_date_b;
102+
103+ e_cal_component_get_dtstart(eventA, &start_date_a);
104+ e_cal_component_get_dtstart(eventB, &start_date_b);
105+
106+ auto time_a = icaltime_as_timet(*start_date_a.value);
107+ auto time_b = icaltime_as_timet(*start_date_b.value);
108+ if (time_a == time_b)
109+ return 0;
110+ if (time_a < time_b)
111+ return -1;
112+ return 1;
113+ }
114+
115+ static bool
116+ is_alarm_interesting(ECalComponentAlarm *alarm)
117+ {
118+ if (alarm) {
119+ ECalComponentAlarmAction action;
120+ e_cal_component_alarm_get_action(alarm, &action);
121+ if ((action == E_CAL_COMPONENT_ALARM_AUDIO) ||
122+ (action == E_CAL_COMPONENT_ALARM_DISPLAY)) {
123+ return true;
124+ }
125+ }
126+ return false;
127+ }
128+
129+ // we only care about AUDIO or DISPLAY alarms, other kind of alarm will not generate a notification
130+ static bool
131+ event_has_valid_alarms(ECalComponent *event)
132+ {
133+ if (!e_cal_component_has_alarms(event))
134+ return false;
135+
136+ // check alarms
137+ bool valid = false;
138+ auto uids = e_cal_component_get_alarm_uids(event);
139+ for (auto l=uids; l!=nullptr; l=uids->next) {
140+ auto auid = static_cast<gchar*>(l->data);
141+ auto alarm = e_cal_component_get_alarm(event, auid);
142+
143+ valid = is_alarm_interesting(alarm);
144+ if (valid) {
145+ break;
146+ }
147+ }
148+
149+ cal_obj_uid_list_free(uids);
150+ return valid;
151+ }
152+
153+
154+
155+ static void
156+ on_event_fetch_list_done(gpointer gsubtask)
157+ {
158 auto subtask = static_cast<ClientSubtask*>(gsubtask);
159
160 // generate alarms
161@@ -687,10 +818,11 @@
162 add_alarms_to_subtask(static_cast<ECalComponentAlarms*>(l->data), subtask, subtask->task->gtz);
163
164 subtask->components = g_list_concat(subtask->components, subtask->instance_components);
165+ subtask->components = g_list_sort(subtask->components, (GCompareFunc) sort_events_by_start_date);
166 // add events without alarm
167 for (auto l=subtask->components; l!=nullptr; l=l->next) {
168 auto component = static_cast<ECalComponent*>(l->data);
169- if (!e_cal_component_has_alarms(component))
170+ if (!event_has_valid_alarms(component))
171 add_event_to_subtask(component, subtask, subtask->task->gtz);
172 }
173 g_list_free_full(subtask->components, g_object_unref);
174@@ -935,8 +1067,10 @@
175 {
176 auto ai = static_cast<ECalComponentAlarmInstance*>(l->data);
177 auto a = e_cal_component_get_alarm(component, ai->auid);
178- if (a == nullptr)
179+
180+ if (!is_alarm_interesting(a)) {
181 continue;
182+ }
183
184 auto instance_time = std::make_pair(DateTime{gtz, ai->occur_start},
185 DateTime{gtz, ai->occur_end});
186
187=== modified file 'tests/CMakeLists.txt'
188--- tests/CMakeLists.txt 2016-05-14 02:07:10 +0000
189+++ tests/CMakeLists.txt 2016-06-28 15:52:52 +0000
190@@ -98,6 +98,7 @@
191 add_eds_ics_test_by_name(test-eds-ics-tzids-2)
192 add_eds_ics_test_by_name(test-eds-ics-tzids-utc)
193 add_eds_ics_test_by_name(test-eds-ics-non-attending-alarms)
194+add_eds_ics_test_by_name(test-eds-ics-repeating-events-with-individual-change)
195
196
197 # disabling the timezone unit tests because they require
198
199=== added file 'tests/test-eds-ics-repeating-events-with-individual-change.cpp'
200--- tests/test-eds-ics-repeating-events-with-individual-change.cpp 1970-01-01 00:00:00 +0000
201+++ tests/test-eds-ics-repeating-events-with-individual-change.cpp 2016-06-28 15:52:52 +0000
202@@ -0,0 +1,101 @@
203+/*
204+ * Copyright 2016 Canonical Ltd.
205+ *
206+ * This program is free software: you can redistribute it and/or modify it
207+ * under the terms of the GNU General Public License version 3, as published
208+ * by the Free Software Foundation.
209+ *
210+ * This program is distributed in the hope that it will be useful, but
211+ * WITHOUT ANY WARRANTY; without even the implied warranties of
212+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
213+ * PURPOSE. See the GNU General Public License for more details.
214+ *
215+ * You should have received a copy of the GNU General Public License along
216+ * with this program. If not, see <http://www.gnu.org/licenses/>.
217+ *
218+ * Authors:
219+ * Renato Araujo Oliveira Filho <renato.filho@canonical.com>
220+ */
221+
222+#include <algorithm>
223+
224+#include <datetime/alarm-queue-simple.h>
225+#include <datetime/clock-mock.h>
226+#include <datetime/engine-eds.h>
227+#include <datetime/myself.h>
228+#include <datetime/planner-range.h>
229+
230+#include <gtest/gtest.h>
231+
232+#include "glib-fixture.h"
233+#include "print-to.h"
234+#include "timezone-mock.h"
235+#include "wakeup-timer-mock.h"
236+
237+using namespace unity::indicator::datetime;
238+using VAlarmFixture = GlibFixture;
239+
240+/***
241+****
242+***/
243+
244+TEST_F(VAlarmFixture, RepeatingEventsWithIndividualChange)
245+{
246+ // start the EDS engine
247+ auto engine = std::make_shared<EdsEngine>(std::make_shared<Myself>());
248+
249+ // we need a consistent timezone for the planner and our local DateTimes
250+ constexpr char const * zone_str {"America/Recife"};
251+ auto tz = std::make_shared<MockTimezone>(zone_str);
252+ auto gtz = g_time_zone_new(zone_str);
253+
254+ // make a planner that looks at the year of 2016 in EDS
255+ auto planner = std::make_shared<SimpleRangePlanner>(engine, tz);
256+ const DateTime range_begin {gtz, 2016,1, 1, 0, 0, 0.0};
257+ const DateTime range_end {gtz, 2016,12,31,23,59,59.5};
258+ planner->range().set(std::make_pair(range_begin, range_end));
259+
260+ // give EDS a moment to load
261+ if (planner->appointments().get().empty()) {
262+ g_message("waiting a moment for EDS to load...");
263+ auto on_appointments_changed = [this](const std::vector<Appointment>& appointments){
264+ g_message("ah, they loaded");
265+ if (!appointments.empty())
266+ g_main_loop_quit(loop);
267+ };
268+ core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed));
269+ constexpr int max_wait_sec = 10;
270+ wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND);
271+ }
272+
273+ // what we expect to get...
274+ Appointment expected_appt;
275+ expected_appt.summary = "Alarm";
276+ std::array<DateTime,10> expected_times = {
277+ DateTime(gtz,2016,6, 20,10,00,0),
278+ DateTime(gtz,2016,6, 21,10,00,0),
279+ DateTime(gtz,2016,6, 22,10,00,0),
280+ DateTime(gtz,2016,6, 23,10,00,0),
281+ DateTime(gtz,2016,6, 24,20,00,0),
282+ DateTime(gtz,2016,6, 25,10,00,0),
283+ DateTime(gtz,2016,6, 26,10,00,0),
284+ DateTime(gtz,2016,6, 27,10,00,0),
285+ DateTime(gtz,2016,6, 28,10,00,0),
286+ DateTime(gtz,2016,6, 29,10,00,0)
287+ };
288+
289+ // compare it to what we actually loaded...
290+ const auto appts = planner->appointments().get();
291+ EXPECT_EQ(expected_times.size(), appts.size());
292+ for (size_t i=0, n=expected_times.size(); i<n; i++) {
293+ const auto& appt = appts[i];
294+ if (i != 4)
295+ EXPECT_EQ("Every day and every night", appt.summary);
296+ else
297+ EXPECT_EQ("At night", appt.summary);
298+ EXPECT_EQ(expected_times[i], appt.begin);
299+ }
300+
301+ // cleanup
302+ g_time_zone_unref(gtz);
303+}
304
305=== added file 'tests/test-eds-ics-repeating-events-with-individual-change.ics.in'
306--- tests/test-eds-ics-repeating-events-with-individual-change.ics.in 1970-01-01 00:00:00 +0000
307+++ tests/test-eds-ics-repeating-events-with-individual-change.ics.in 2016-06-28 15:52:52 +0000
308@@ -0,0 +1,969 @@
309+BEGIN:VCALENDAR
310+CALSCALE:GREGORIAN
311+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
312+VERSION:2.0
313+X-EVOLUTION-DATA-REVISION:2016-06-21T21:42:08.507434Z(7)
314+BEGIN:VTIMEZONE
315+TZID:/freeassociation.sourceforge.net/Tzfile/America/Recife
316+X-LIC-LOCATION:America/Recife
317+BEGIN:STANDARD
318+TZNAME:BRT
319+DTSTART:19680301T000000
320+TZOFFSETFROM:-0200
321+TZOFFSETTO:-0300
322+END:STANDARD
323+BEGIN:DAYLIGHT
324+TZNAME:BRST
325+DTSTART:19851102T000000
326+TZOFFSETFROM:-0300
327+TZOFFSETTO:-0200
328+END:DAYLIGHT
329+BEGIN:STANDARD
330+TZNAME:BRT
331+DTSTART:19860315T000000
332+TZOFFSETFROM:-0200
333+TZOFFSETTO:-0300
334+END:STANDARD
335+BEGIN:DAYLIGHT
336+TZNAME:BRST
337+DTSTART:19861025T000000
338+TZOFFSETFROM:-0300
339+TZOFFSETTO:-0200
340+END:DAYLIGHT
341+BEGIN:STANDARD
342+TZNAME:BRT
343+DTSTART:19870214T000000
344+TZOFFSETFROM:-0200
345+TZOFFSETTO:-0300
346+END:STANDARD
347+BEGIN:DAYLIGHT
348+TZNAME:BRST
349+DTSTART:19871025T000000
350+TZOFFSETFROM:-0300
351+TZOFFSETTO:-0200
352+END:DAYLIGHT
353+BEGIN:STANDARD
354+TZNAME:BRT
355+DTSTART:19880207T000000
356+TZOFFSETFROM:-0200
357+TZOFFSETTO:-0300
358+END:STANDARD
359+BEGIN:DAYLIGHT
360+TZNAME:BRST
361+DTSTART:19881016T000000
362+TZOFFSETFROM:-0300
363+TZOFFSETTO:-0200
364+END:DAYLIGHT
365+BEGIN:STANDARD
366+TZNAME:BRT
367+DTSTART:19890129T000000
368+TZOFFSETFROM:-0200
369+TZOFFSETTO:-0300
370+END:STANDARD
371+BEGIN:DAYLIGHT
372+TZNAME:BRST
373+DTSTART:19891015T000000
374+TZOFFSETFROM:-0300
375+TZOFFSETTO:-0200
376+END:DAYLIGHT
377+BEGIN:STANDARD
378+TZNAME:BRT
379+DTSTART:19900211T000000
380+TZOFFSETFROM:-0200
381+TZOFFSETTO:-0300
382+END:STANDARD
383+BEGIN:DAYLIGHT
384+TZNAME:BRST
385+DTSTART:19991003T000000
386+TZOFFSETFROM:-0300
387+TZOFFSETTO:-0200
388+END:DAYLIGHT
389+BEGIN:STANDARD
390+TZNAME:BRT
391+DTSTART:20000227T000000
392+TZOFFSETFROM:-0200
393+TZOFFSETTO:-0300
394+END:STANDARD
395+BEGIN:DAYLIGHT
396+TZNAME:BRST
397+DTSTART:20001008T000000
398+TZOFFSETFROM:-0300
399+TZOFFSETTO:-0200
400+END:DAYLIGHT
401+BEGIN:STANDARD
402+TZNAME:BRT
403+DTSTART:20001015T000000
404+TZOFFSETFROM:-0200
405+TZOFFSETTO:-0300
406+END:STANDARD
407+BEGIN:DAYLIGHT
408+TZNAME:BRST
409+DTSTART:20011014T000000
410+TZOFFSETFROM:-0300
411+TZOFFSETTO:-0200
412+END:DAYLIGHT
413+BEGIN:STANDARD
414+TZNAME:BRT
415+DTSTART:20020217T000000
416+TZOFFSETFROM:-0200
417+TZOFFSETTO:-0300
418+END:STANDARD
419+END:VTIMEZONE
420+BEGIN:VTIMEZONE
421+TZID:/freeassociation.sourceforge.net/Tzfile/America/New_York
422+X-LIC-LOCATION:America/New_York
423+BEGIN:STANDARD
424+TZNAME:EST
425+DTSTART:19691026T020000
426+TZOFFSETFROM:-0400
427+TZOFFSETTO:-0500
428+END:STANDARD
429+BEGIN:DAYLIGHT
430+TZNAME:EDT
431+DTSTART:19700426T020000
432+TZOFFSETFROM:-0500
433+TZOFFSETTO:-0400
434+END:DAYLIGHT
435+BEGIN:STANDARD
436+TZNAME:EST
437+DTSTART:19701025T020000
438+TZOFFSETFROM:-0400
439+TZOFFSETTO:-0500
440+END:STANDARD
441+BEGIN:DAYLIGHT
442+TZNAME:EDT
443+DTSTART:19710425T020000
444+TZOFFSETFROM:-0500
445+TZOFFSETTO:-0400
446+END:DAYLIGHT
447+BEGIN:STANDARD
448+TZNAME:EST
449+DTSTART:19711031T020000
450+TZOFFSETFROM:-0400
451+TZOFFSETTO:-0500
452+END:STANDARD
453+BEGIN:DAYLIGHT
454+TZNAME:EDT
455+DTSTART:19720430T020000
456+TZOFFSETFROM:-0500
457+TZOFFSETTO:-0400
458+END:DAYLIGHT
459+BEGIN:STANDARD
460+TZNAME:EST
461+DTSTART:19721029T020000
462+TZOFFSETFROM:-0400
463+TZOFFSETTO:-0500
464+END:STANDARD
465+BEGIN:DAYLIGHT
466+TZNAME:EDT
467+DTSTART:19730429T020000
468+TZOFFSETFROM:-0500
469+TZOFFSETTO:-0400
470+END:DAYLIGHT
471+BEGIN:STANDARD
472+TZNAME:EST
473+DTSTART:19731028T020000
474+TZOFFSETFROM:-0400
475+TZOFFSETTO:-0500
476+END:STANDARD
477+BEGIN:DAYLIGHT
478+TZNAME:EDT
479+DTSTART:19740106T020000
480+TZOFFSETFROM:-0500
481+TZOFFSETTO:-0400
482+END:DAYLIGHT
483+BEGIN:STANDARD
484+TZNAME:EST
485+DTSTART:19741027T020000
486+TZOFFSETFROM:-0400
487+TZOFFSETTO:-0500
488+END:STANDARD
489+BEGIN:DAYLIGHT
490+TZNAME:EDT
491+DTSTART:19750223T020000
492+TZOFFSETFROM:-0500
493+TZOFFSETTO:-0400
494+END:DAYLIGHT
495+BEGIN:STANDARD
496+TZNAME:EST
497+DTSTART:19751026T020000
498+TZOFFSETFROM:-0400
499+TZOFFSETTO:-0500
500+END:STANDARD
501+BEGIN:DAYLIGHT
502+TZNAME:EDT
503+DTSTART:19760425T020000
504+TZOFFSETFROM:-0500
505+TZOFFSETTO:-0400
506+END:DAYLIGHT
507+BEGIN:STANDARD
508+TZNAME:EST
509+DTSTART:19761031T020000
510+TZOFFSETFROM:-0400
511+TZOFFSETTO:-0500
512+END:STANDARD
513+BEGIN:DAYLIGHT
514+TZNAME:EDT
515+DTSTART:19770424T020000
516+TZOFFSETFROM:-0500
517+TZOFFSETTO:-0400
518+END:DAYLIGHT
519+BEGIN:STANDARD
520+TZNAME:EST
521+DTSTART:19771030T020000
522+TZOFFSETFROM:-0400
523+TZOFFSETTO:-0500
524+END:STANDARD
525+BEGIN:DAYLIGHT
526+TZNAME:EDT
527+DTSTART:19780430T020000
528+TZOFFSETFROM:-0500
529+TZOFFSETTO:-0400
530+END:DAYLIGHT
531+BEGIN:STANDARD
532+TZNAME:EST
533+DTSTART:19781029T020000
534+TZOFFSETFROM:-0400
535+TZOFFSETTO:-0500
536+END:STANDARD
537+BEGIN:DAYLIGHT
538+TZNAME:EDT
539+DTSTART:19790429T020000
540+TZOFFSETFROM:-0500
541+TZOFFSETTO:-0400
542+END:DAYLIGHT
543+BEGIN:STANDARD
544+TZNAME:EST
545+DTSTART:19791028T020000
546+TZOFFSETFROM:-0400
547+TZOFFSETTO:-0500
548+END:STANDARD
549+BEGIN:DAYLIGHT
550+TZNAME:EDT
551+DTSTART:19800427T020000
552+TZOFFSETFROM:-0500
553+TZOFFSETTO:-0400
554+END:DAYLIGHT
555+BEGIN:STANDARD
556+TZNAME:EST
557+DTSTART:19801026T020000
558+TZOFFSETFROM:-0400
559+TZOFFSETTO:-0500
560+END:STANDARD
561+BEGIN:DAYLIGHT
562+TZNAME:EDT
563+DTSTART:19810426T020000
564+TZOFFSETFROM:-0500
565+TZOFFSETTO:-0400
566+END:DAYLIGHT
567+BEGIN:STANDARD
568+TZNAME:EST
569+DTSTART:19811025T020000
570+TZOFFSETFROM:-0400
571+TZOFFSETTO:-0500
572+END:STANDARD
573+BEGIN:DAYLIGHT
574+TZNAME:EDT
575+DTSTART:19820425T020000
576+TZOFFSETFROM:-0500
577+TZOFFSETTO:-0400
578+END:DAYLIGHT
579+BEGIN:STANDARD
580+TZNAME:EST
581+DTSTART:19821031T020000
582+TZOFFSETFROM:-0400
583+TZOFFSETTO:-0500
584+END:STANDARD
585+BEGIN:DAYLIGHT
586+TZNAME:EDT
587+DTSTART:19830424T020000
588+TZOFFSETFROM:-0500
589+TZOFFSETTO:-0400
590+END:DAYLIGHT
591+BEGIN:STANDARD
592+TZNAME:EST
593+DTSTART:19831030T020000
594+TZOFFSETFROM:-0400
595+TZOFFSETTO:-0500
596+END:STANDARD
597+BEGIN:DAYLIGHT
598+TZNAME:EDT
599+DTSTART:19840429T020000
600+TZOFFSETFROM:-0500
601+TZOFFSETTO:-0400
602+END:DAYLIGHT
603+BEGIN:STANDARD
604+TZNAME:EST
605+DTSTART:19841028T020000
606+TZOFFSETFROM:-0400
607+TZOFFSETTO:-0500
608+END:STANDARD
609+BEGIN:DAYLIGHT
610+TZNAME:EDT
611+DTSTART:19850428T020000
612+TZOFFSETFROM:-0500
613+TZOFFSETTO:-0400
614+END:DAYLIGHT
615+BEGIN:STANDARD
616+TZNAME:EST
617+DTSTART:19851027T020000
618+TZOFFSETFROM:-0400
619+TZOFFSETTO:-0500
620+END:STANDARD
621+BEGIN:DAYLIGHT
622+TZNAME:EDT
623+DTSTART:19860427T020000
624+TZOFFSETFROM:-0500
625+TZOFFSETTO:-0400
626+END:DAYLIGHT
627+BEGIN:STANDARD
628+TZNAME:EST
629+DTSTART:19861026T020000
630+TZOFFSETFROM:-0400
631+TZOFFSETTO:-0500
632+END:STANDARD
633+BEGIN:DAYLIGHT
634+TZNAME:EDT
635+DTSTART:19870405T020000
636+TZOFFSETFROM:-0500
637+TZOFFSETTO:-0400
638+END:DAYLIGHT
639+BEGIN:STANDARD
640+TZNAME:EST
641+DTSTART:19871025T020000
642+TZOFFSETFROM:-0400
643+TZOFFSETTO:-0500
644+END:STANDARD
645+BEGIN:DAYLIGHT
646+TZNAME:EDT
647+DTSTART:19880403T020000
648+TZOFFSETFROM:-0500
649+TZOFFSETTO:-0400
650+END:DAYLIGHT
651+BEGIN:STANDARD
652+TZNAME:EST
653+DTSTART:19881030T020000
654+TZOFFSETFROM:-0400
655+TZOFFSETTO:-0500
656+END:STANDARD
657+BEGIN:DAYLIGHT
658+TZNAME:EDT
659+DTSTART:19890402T020000
660+TZOFFSETFROM:-0500
661+TZOFFSETTO:-0400
662+END:DAYLIGHT
663+BEGIN:STANDARD
664+TZNAME:EST
665+DTSTART:19891029T020000
666+TZOFFSETFROM:-0400
667+TZOFFSETTO:-0500
668+END:STANDARD
669+BEGIN:DAYLIGHT
670+TZNAME:EDT
671+DTSTART:19900401T020000
672+TZOFFSETFROM:-0500
673+TZOFFSETTO:-0400
674+END:DAYLIGHT
675+BEGIN:STANDARD
676+TZNAME:EST
677+DTSTART:19901028T020000
678+TZOFFSETFROM:-0400
679+TZOFFSETTO:-0500
680+END:STANDARD
681+BEGIN:DAYLIGHT
682+TZNAME:EDT
683+DTSTART:19910407T020000
684+TZOFFSETFROM:-0500
685+TZOFFSETTO:-0400
686+END:DAYLIGHT
687+BEGIN:STANDARD
688+TZNAME:EST
689+DTSTART:19911027T020000
690+TZOFFSETFROM:-0400
691+TZOFFSETTO:-0500
692+END:STANDARD
693+BEGIN:DAYLIGHT
694+TZNAME:EDT
695+DTSTART:19920405T020000
696+TZOFFSETFROM:-0500
697+TZOFFSETTO:-0400
698+END:DAYLIGHT
699+BEGIN:STANDARD
700+TZNAME:EST
701+DTSTART:19921025T020000
702+TZOFFSETFROM:-0400
703+TZOFFSETTO:-0500
704+END:STANDARD
705+BEGIN:DAYLIGHT
706+TZNAME:EDT
707+DTSTART:19930404T020000
708+TZOFFSETFROM:-0500
709+TZOFFSETTO:-0400
710+END:DAYLIGHT
711+BEGIN:STANDARD
712+TZNAME:EST
713+DTSTART:19931031T020000
714+TZOFFSETFROM:-0400
715+TZOFFSETTO:-0500
716+END:STANDARD
717+BEGIN:DAYLIGHT
718+TZNAME:EDT
719+DTSTART:19940403T020000
720+TZOFFSETFROM:-0500
721+TZOFFSETTO:-0400
722+END:DAYLIGHT
723+BEGIN:STANDARD
724+TZNAME:EST
725+DTSTART:19941030T020000
726+TZOFFSETFROM:-0400
727+TZOFFSETTO:-0500
728+END:STANDARD
729+BEGIN:DAYLIGHT
730+TZNAME:EDT
731+DTSTART:19950402T020000
732+TZOFFSETFROM:-0500
733+TZOFFSETTO:-0400
734+END:DAYLIGHT
735+BEGIN:STANDARD
736+TZNAME:EST
737+DTSTART:19951029T020000
738+TZOFFSETFROM:-0400
739+TZOFFSETTO:-0500
740+END:STANDARD
741+BEGIN:DAYLIGHT
742+TZNAME:EDT
743+DTSTART:19960407T020000
744+TZOFFSETFROM:-0500
745+TZOFFSETTO:-0400
746+END:DAYLIGHT
747+BEGIN:STANDARD
748+TZNAME:EST
749+DTSTART:19961027T020000
750+TZOFFSETFROM:-0400
751+TZOFFSETTO:-0500
752+END:STANDARD
753+BEGIN:DAYLIGHT
754+TZNAME:EDT
755+DTSTART:19970406T020000
756+TZOFFSETFROM:-0500
757+TZOFFSETTO:-0400
758+END:DAYLIGHT
759+BEGIN:STANDARD
760+TZNAME:EST
761+DTSTART:19971026T020000
762+TZOFFSETFROM:-0400
763+TZOFFSETTO:-0500
764+END:STANDARD
765+BEGIN:DAYLIGHT
766+TZNAME:EDT
767+DTSTART:19980405T020000
768+TZOFFSETFROM:-0500
769+TZOFFSETTO:-0400
770+END:DAYLIGHT
771+BEGIN:STANDARD
772+TZNAME:EST
773+DTSTART:19981025T020000
774+TZOFFSETFROM:-0400
775+TZOFFSETTO:-0500
776+END:STANDARD
777+BEGIN:DAYLIGHT
778+TZNAME:EDT
779+DTSTART:19990404T020000
780+TZOFFSETFROM:-0500
781+TZOFFSETTO:-0400
782+END:DAYLIGHT
783+BEGIN:STANDARD
784+TZNAME:EST
785+DTSTART:19991031T020000
786+TZOFFSETFROM:-0400
787+TZOFFSETTO:-0500
788+END:STANDARD
789+BEGIN:DAYLIGHT
790+TZNAME:EDT
791+DTSTART:20000402T020000
792+TZOFFSETFROM:-0500
793+TZOFFSETTO:-0400
794+END:DAYLIGHT
795+BEGIN:STANDARD
796+TZNAME:EST
797+DTSTART:20001029T020000
798+TZOFFSETFROM:-0400
799+TZOFFSETTO:-0500
800+END:STANDARD
801+BEGIN:DAYLIGHT
802+TZNAME:EDT
803+DTSTART:20010401T020000
804+TZOFFSETFROM:-0500
805+TZOFFSETTO:-0400
806+END:DAYLIGHT
807+BEGIN:STANDARD
808+TZNAME:EST
809+DTSTART:20011028T020000
810+TZOFFSETFROM:-0400
811+TZOFFSETTO:-0500
812+END:STANDARD
813+BEGIN:DAYLIGHT
814+TZNAME:EDT
815+DTSTART:20020407T020000
816+TZOFFSETFROM:-0500
817+TZOFFSETTO:-0400
818+END:DAYLIGHT
819+BEGIN:STANDARD
820+TZNAME:EST
821+DTSTART:20021027T020000
822+TZOFFSETFROM:-0400
823+TZOFFSETTO:-0500
824+END:STANDARD
825+BEGIN:DAYLIGHT
826+TZNAME:EDT
827+DTSTART:20030406T020000
828+TZOFFSETFROM:-0500
829+TZOFFSETTO:-0400
830+END:DAYLIGHT
831+BEGIN:STANDARD
832+TZNAME:EST
833+DTSTART:20031026T020000
834+TZOFFSETFROM:-0400
835+TZOFFSETTO:-0500
836+END:STANDARD
837+BEGIN:DAYLIGHT
838+TZNAME:EDT
839+DTSTART:20040404T020000
840+TZOFFSETFROM:-0500
841+TZOFFSETTO:-0400
842+END:DAYLIGHT
843+BEGIN:STANDARD
844+TZNAME:EST
845+DTSTART:20041031T020000
846+TZOFFSETFROM:-0400
847+TZOFFSETTO:-0500
848+END:STANDARD
849+BEGIN:DAYLIGHT
850+TZNAME:EDT
851+DTSTART:20050403T020000
852+TZOFFSETFROM:-0500
853+TZOFFSETTO:-0400
854+END:DAYLIGHT
855+BEGIN:STANDARD
856+TZNAME:EST
857+DTSTART:20051030T020000
858+TZOFFSETFROM:-0400
859+TZOFFSETTO:-0500
860+END:STANDARD
861+BEGIN:DAYLIGHT
862+TZNAME:EDT
863+DTSTART:20060402T020000
864+TZOFFSETFROM:-0500
865+TZOFFSETTO:-0400
866+END:DAYLIGHT
867+BEGIN:STANDARD
868+TZNAME:EST
869+DTSTART:20061029T020000
870+TZOFFSETFROM:-0400
871+TZOFFSETTO:-0500
872+END:STANDARD
873+BEGIN:DAYLIGHT
874+TZNAME:EDT
875+DTSTART:20070311T020000
876+TZOFFSETFROM:-0500
877+TZOFFSETTO:-0400
878+END:DAYLIGHT
879+BEGIN:STANDARD
880+TZNAME:EST
881+DTSTART:20071104T020000
882+TZOFFSETFROM:-0400
883+TZOFFSETTO:-0500
884+END:STANDARD
885+BEGIN:DAYLIGHT
886+TZNAME:EDT
887+DTSTART:20080309T020000
888+TZOFFSETFROM:-0500
889+TZOFFSETTO:-0400
890+END:DAYLIGHT
891+BEGIN:STANDARD
892+TZNAME:EST
893+DTSTART:20081102T020000
894+TZOFFSETFROM:-0400
895+TZOFFSETTO:-0500
896+END:STANDARD
897+BEGIN:DAYLIGHT
898+TZNAME:EDT
899+DTSTART:20090308T020000
900+TZOFFSETFROM:-0500
901+TZOFFSETTO:-0400
902+END:DAYLIGHT
903+BEGIN:STANDARD
904+TZNAME:EST
905+DTSTART:20091101T020000
906+TZOFFSETFROM:-0400
907+TZOFFSETTO:-0500
908+END:STANDARD
909+BEGIN:DAYLIGHT
910+TZNAME:EDT
911+DTSTART:20100314T020000
912+TZOFFSETFROM:-0500
913+TZOFFSETTO:-0400
914+END:DAYLIGHT
915+BEGIN:STANDARD
916+TZNAME:EST
917+DTSTART:20101107T020000
918+TZOFFSETFROM:-0400
919+TZOFFSETTO:-0500
920+END:STANDARD
921+BEGIN:DAYLIGHT
922+TZNAME:EDT
923+DTSTART:20110313T020000
924+TZOFFSETFROM:-0500
925+TZOFFSETTO:-0400
926+END:DAYLIGHT
927+BEGIN:STANDARD
928+TZNAME:EST
929+DTSTART:20111106T020000
930+TZOFFSETFROM:-0400
931+TZOFFSETTO:-0500
932+END:STANDARD
933+BEGIN:DAYLIGHT
934+TZNAME:EDT
935+DTSTART:20120311T020000
936+TZOFFSETFROM:-0500
937+TZOFFSETTO:-0400
938+END:DAYLIGHT
939+BEGIN:STANDARD
940+TZNAME:EST
941+DTSTART:20121104T020000
942+TZOFFSETFROM:-0400
943+TZOFFSETTO:-0500
944+END:STANDARD
945+BEGIN:DAYLIGHT
946+TZNAME:EDT
947+DTSTART:20130310T020000
948+TZOFFSETFROM:-0500
949+TZOFFSETTO:-0400
950+END:DAYLIGHT
951+BEGIN:STANDARD
952+TZNAME:EST
953+DTSTART:20131103T020000
954+TZOFFSETFROM:-0400
955+TZOFFSETTO:-0500
956+END:STANDARD
957+BEGIN:DAYLIGHT
958+TZNAME:EDT
959+DTSTART:20140309T020000
960+TZOFFSETFROM:-0500
961+TZOFFSETTO:-0400
962+END:DAYLIGHT
963+BEGIN:STANDARD
964+TZNAME:EST
965+DTSTART:20141102T020000
966+TZOFFSETFROM:-0400
967+TZOFFSETTO:-0500
968+END:STANDARD
969+BEGIN:DAYLIGHT
970+TZNAME:EDT
971+DTSTART:20150308T020000
972+TZOFFSETFROM:-0500
973+TZOFFSETTO:-0400
974+END:DAYLIGHT
975+BEGIN:STANDARD
976+TZNAME:EST
977+DTSTART:20151101T020000
978+TZOFFSETFROM:-0400
979+TZOFFSETTO:-0500
980+END:STANDARD
981+BEGIN:DAYLIGHT
982+TZNAME:EDT
983+DTSTART:20160313T020000
984+TZOFFSETFROM:-0500
985+TZOFFSETTO:-0400
986+END:DAYLIGHT
987+BEGIN:STANDARD
988+TZNAME:EST
989+DTSTART:20161106T020000
990+TZOFFSETFROM:-0400
991+TZOFFSETTO:-0500
992+END:STANDARD
993+BEGIN:DAYLIGHT
994+TZNAME:EDT
995+DTSTART:20170312T020000
996+TZOFFSETFROM:-0500
997+TZOFFSETTO:-0400
998+END:DAYLIGHT
999+BEGIN:STANDARD
1000+TZNAME:EST
1001+DTSTART:20171105T020000
1002+TZOFFSETFROM:-0400
1003+TZOFFSETTO:-0500
1004+END:STANDARD
1005+BEGIN:DAYLIGHT
1006+TZNAME:EDT
1007+DTSTART:20180311T020000
1008+TZOFFSETFROM:-0500
1009+TZOFFSETTO:-0400
1010+END:DAYLIGHT
1011+BEGIN:STANDARD
1012+TZNAME:EST
1013+DTSTART:20181104T020000
1014+TZOFFSETFROM:-0400
1015+TZOFFSETTO:-0500
1016+END:STANDARD
1017+BEGIN:DAYLIGHT
1018+TZNAME:EDT
1019+DTSTART:20190310T020000
1020+TZOFFSETFROM:-0500
1021+TZOFFSETTO:-0400
1022+END:DAYLIGHT
1023+BEGIN:STANDARD
1024+TZNAME:EST
1025+DTSTART:20191103T020000
1026+TZOFFSETFROM:-0400
1027+TZOFFSETTO:-0500
1028+END:STANDARD
1029+BEGIN:DAYLIGHT
1030+TZNAME:EDT
1031+DTSTART:20200308T020000
1032+TZOFFSETFROM:-0500
1033+TZOFFSETTO:-0400
1034+END:DAYLIGHT
1035+BEGIN:STANDARD
1036+TZNAME:EST
1037+DTSTART:20201101T020000
1038+TZOFFSETFROM:-0400
1039+TZOFFSETTO:-0500
1040+END:STANDARD
1041+BEGIN:DAYLIGHT
1042+TZNAME:EDT
1043+DTSTART:20210314T020000
1044+TZOFFSETFROM:-0500
1045+TZOFFSETTO:-0400
1046+END:DAYLIGHT
1047+BEGIN:STANDARD
1048+TZNAME:EST
1049+DTSTART:20211107T020000
1050+TZOFFSETFROM:-0400
1051+TZOFFSETTO:-0500
1052+END:STANDARD
1053+BEGIN:DAYLIGHT
1054+TZNAME:EDT
1055+DTSTART:20220313T020000
1056+TZOFFSETFROM:-0500
1057+TZOFFSETTO:-0400
1058+END:DAYLIGHT
1059+BEGIN:STANDARD
1060+TZNAME:EST
1061+DTSTART:20221106T020000
1062+TZOFFSETFROM:-0400
1063+TZOFFSETTO:-0500
1064+END:STANDARD
1065+BEGIN:DAYLIGHT
1066+TZNAME:EDT
1067+DTSTART:20230312T020000
1068+TZOFFSETFROM:-0500
1069+TZOFFSETTO:-0400
1070+END:DAYLIGHT
1071+BEGIN:STANDARD
1072+TZNAME:EST
1073+DTSTART:20231105T020000
1074+TZOFFSETFROM:-0400
1075+TZOFFSETTO:-0500
1076+END:STANDARD
1077+BEGIN:DAYLIGHT
1078+TZNAME:EDT
1079+DTSTART:20240310T020000
1080+TZOFFSETFROM:-0500
1081+TZOFFSETTO:-0400
1082+END:DAYLIGHT
1083+BEGIN:STANDARD
1084+TZNAME:EST
1085+DTSTART:20241103T020000
1086+TZOFFSETFROM:-0400
1087+TZOFFSETTO:-0500
1088+END:STANDARD
1089+BEGIN:DAYLIGHT
1090+TZNAME:EDT
1091+DTSTART:20250309T020000
1092+TZOFFSETFROM:-0500
1093+TZOFFSETTO:-0400
1094+END:DAYLIGHT
1095+BEGIN:STANDARD
1096+TZNAME:EST
1097+DTSTART:20251102T020000
1098+TZOFFSETFROM:-0400
1099+TZOFFSETTO:-0500
1100+END:STANDARD
1101+BEGIN:DAYLIGHT
1102+TZNAME:EDT
1103+DTSTART:20260308T020000
1104+TZOFFSETFROM:-0500
1105+TZOFFSETTO:-0400
1106+END:DAYLIGHT
1107+BEGIN:STANDARD
1108+TZNAME:EST
1109+DTSTART:20261101T020000
1110+TZOFFSETFROM:-0400
1111+TZOFFSETTO:-0500
1112+END:STANDARD
1113+BEGIN:DAYLIGHT
1114+TZNAME:EDT
1115+DTSTART:20270314T020000
1116+TZOFFSETFROM:-0500
1117+TZOFFSETTO:-0400
1118+END:DAYLIGHT
1119+BEGIN:STANDARD
1120+TZNAME:EST
1121+DTSTART:20271107T020000
1122+TZOFFSETFROM:-0400
1123+TZOFFSETTO:-0500
1124+END:STANDARD
1125+BEGIN:DAYLIGHT
1126+TZNAME:EDT
1127+DTSTART:20280312T020000
1128+TZOFFSETFROM:-0500
1129+TZOFFSETTO:-0400
1130+END:DAYLIGHT
1131+BEGIN:STANDARD
1132+TZNAME:EST
1133+DTSTART:20281105T020000
1134+TZOFFSETFROM:-0400
1135+TZOFFSETTO:-0500
1136+END:STANDARD
1137+BEGIN:DAYLIGHT
1138+TZNAME:EDT
1139+DTSTART:20290311T020000
1140+TZOFFSETFROM:-0500
1141+TZOFFSETTO:-0400
1142+END:DAYLIGHT
1143+BEGIN:STANDARD
1144+TZNAME:EST
1145+DTSTART:20291104T020000
1146+TZOFFSETFROM:-0400
1147+TZOFFSETTO:-0500
1148+END:STANDARD
1149+BEGIN:DAYLIGHT
1150+TZNAME:EDT
1151+DTSTART:20300310T020000
1152+TZOFFSETFROM:-0500
1153+TZOFFSETTO:-0400
1154+END:DAYLIGHT
1155+BEGIN:STANDARD
1156+TZNAME:EST
1157+DTSTART:20301103T020000
1158+TZOFFSETFROM:-0400
1159+TZOFFSETTO:-0500
1160+END:STANDARD
1161+BEGIN:DAYLIGHT
1162+TZNAME:EDT
1163+DTSTART:20310309T020000
1164+TZOFFSETFROM:-0500
1165+TZOFFSETTO:-0400
1166+END:DAYLIGHT
1167+BEGIN:STANDARD
1168+TZNAME:EST
1169+DTSTART:20311102T020000
1170+TZOFFSETFROM:-0400
1171+TZOFFSETTO:-0500
1172+END:STANDARD
1173+BEGIN:DAYLIGHT
1174+TZNAME:EDT
1175+DTSTART:20320314T020000
1176+TZOFFSETFROM:-0500
1177+TZOFFSETTO:-0400
1178+END:DAYLIGHT
1179+BEGIN:STANDARD
1180+TZNAME:EST
1181+DTSTART:20321107T020000
1182+TZOFFSETFROM:-0400
1183+TZOFFSETTO:-0500
1184+END:STANDARD
1185+BEGIN:DAYLIGHT
1186+TZNAME:EDT
1187+DTSTART:20330313T020000
1188+TZOFFSETFROM:-0500
1189+TZOFFSETTO:-0400
1190+END:DAYLIGHT
1191+BEGIN:STANDARD
1192+TZNAME:EST
1193+DTSTART:20331106T020000
1194+TZOFFSETFROM:-0400
1195+TZOFFSETTO:-0500
1196+END:STANDARD
1197+BEGIN:DAYLIGHT
1198+TZNAME:EDT
1199+DTSTART:20340312T020000
1200+TZOFFSETFROM:-0500
1201+TZOFFSETTO:-0400
1202+END:DAYLIGHT
1203+BEGIN:STANDARD
1204+TZNAME:EST
1205+DTSTART:20341105T020000
1206+TZOFFSETFROM:-0400
1207+TZOFFSETTO:-0500
1208+END:STANDARD
1209+BEGIN:DAYLIGHT
1210+TZNAME:EDT
1211+DTSTART:20350311T020000
1212+TZOFFSETFROM:-0500
1213+TZOFFSETTO:-0400
1214+END:DAYLIGHT
1215+BEGIN:STANDARD
1216+TZNAME:EST
1217+DTSTART:20351104T020000
1218+TZOFFSETFROM:-0400
1219+TZOFFSETTO:-0500
1220+END:STANDARD
1221+BEGIN:DAYLIGHT
1222+TZNAME:EDT
1223+DTSTART:20360309T020000
1224+TZOFFSETFROM:-0500
1225+TZOFFSETTO:-0400
1226+END:DAYLIGHT
1227+BEGIN:STANDARD
1228+TZNAME:EST
1229+DTSTART:20361102T020000
1230+TZOFFSETFROM:-0400
1231+TZOFFSETTO:-0500
1232+END:STANDARD
1233+BEGIN:DAYLIGHT
1234+TZNAME:EDT
1235+DTSTART:20370308T020000
1236+TZOFFSETFROM:-0500
1237+TZOFFSETTO:-0400
1238+END:DAYLIGHT
1239+BEGIN:STANDARD
1240+TZNAME:EST
1241+DTSTART:20371101T020000
1242+TZOFFSETFROM:-0400
1243+TZOFFSETTO:-0500
1244+END:STANDARD
1245+END:VTIMEZONE
1246+BEGIN:VEVENT
1247+UID:20160621T214054Z-31488-1000-4151-27@rento-ubuntu
1248+DTSTAMP:20160621T123718Z
1249+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife:
1250+ 20160620T100000
1251+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife:
1252+ 20160620T103000
1253+TRANSP:OPAQUE
1254+SEQUENCE:2
1255+SUMMARY:Every day and every night
1256+CLASS:PUBLIC
1257+RRULE;X-EVOLUTION-ENDDATE=20160629T130000Z:FREQ=DAILY;COUNT=10
1258+CREATED:20160621T214124Z
1259+LAST-MODIFIED:20160621T214124Z
1260+END:VEVENT
1261+BEGIN:VEVENT
1262+UID:20160621T214054Z-31488-1000-4151-27@rento-ubuntu
1263+DTSTAMP:20160621T123718Z
1264+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife:
1265+ 20160624T200000
1266+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife:
1267+ 20160624T203000
1268+TRANSP:OPAQUE
1269+SEQUENCE:3
1270+SUMMARY:At night
1271+CLASS:PUBLIC
1272+CREATED:20160621T214124Z
1273+LAST-MODIFIED:20160621T214208Z
1274+RECURRENCE-ID;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife:
1275+ 20160624T100000
1276+END:VEVENT
1277+END:VCALENDAR

Subscribers

People subscribed via source and target branches