/**
  * Refreshes the rules from the underlying data provider.
  *
  * <p>This method is an extension point that allows providers to refresh their rules dynamically
  * at a time of the applications choosing. After calling this method, the offset stored in any
  * {@link ZonedDateTime} may be invalid for the zone ID.
  *
  * <p>Dynamic behavior is entirely optional and most providers, including the default provider, do
  * not support it.
  *
  * @return true if the rules were updated
  * @throws ZoneRulesException if an error occurs during the refresh
  */
 public static boolean refresh() {
   boolean changed = false;
   for (ZoneRulesProvider provider : PROVIDERS) {
     changed |= provider.provideRefresh();
   }
   return changed;
 }
 /**
  * Registers the provider.
  *
  * @param provider the provider to register, not null
  * @throws ZoneRulesException if unable to complete the registration
  */
 private static void registerProvider0(ZoneRulesProvider provider) {
   for (String zoneId : provider.provideZoneIds()) {
     Objects.requireNonNull(zoneId, "zoneId");
     ZoneRulesProvider old = ZONES.putIfAbsent(zoneId, provider.provideBind(zoneId));
     if (old != null) {
       throw new ZoneRulesException(
           "Unable to register zone as one already registered with that ID: "
               + zoneId
               + ", currently loading from provider: "
               + provider);
     }
   }
 }
 @Override
 protected NavigableMap<String, ZoneRules> provideVersions(String zoneId) {
   return provider.provideVersions(zoneId);
 }
 private BoundProvider(ZoneRulesProvider provider, String zoneId) {
   this.provider = provider;
   this.zoneId = zoneId;
   this.rules = provider.provideRules(zoneId);
 }