static long timer_nextFireTime(O timer, long now) { long best = 0; for (O entry : unnull((Collection) getOpt(timer, 'entries))) { Long firstTime = cast getOpt(entry, 'firstTime); Long period = cast getOpt(entry, 'period); if (firstTime != null && period != null) if (now >= firstTime) { long fireTime = now + period-((now - firstTime) % period); if (best == 0 || fireTime < best) best = fireTime; } } ret best; }