content: package com.airbnb.lottie;
  
  import android.support.annotation.Nullable;
  
  import org.json.JSONArray;
  import org.json.JSONObject;
  
  import java.util.Collections;
  import java.util.List;
  
  class AnimatableValueParser<T> {
    @Nullable private final JSONObject json;
    private final float scale;
    private final LottieComposition composition;
    private final AnimatableValue.Factory<T> valueFactory;
  
    private AnimatableValueParser(@Nullable JSONObject json, float scale, LottieComposition
        composition, AnimatableValue.Factory<T> valueFactory) {
      this.json = json;
      this.scale = scale;
      this.composition = composition;
      this.valueFactory = valueFactory;
    }
  
    static <T> AnimatableValueParser<T> newInstance(@Nullable JSONObject json, float scale,
        LottieComposition composition, AnimatableValue.Factory<T> valueFactory) {
      return new AnimatableValueParser<>(json, scale, composition, valueFactory);
    }
  
    Result<T> parseJson() {
      List<Keyframe<T>> keyframes = parseKeyframes();
      T initialValue = parseInitialValue(keyframes);
      return new Result<>(keyframes, initialValue);
    }
  
    private List<Keyframe<T>> parseKeyframes() {
      if (json != null) {
        Object k = json.opt("k");
        if (hasKeyframes(k)) {
          return Keyframe.Factory.parseKeyframes((JSONArray) k, composition, scale, valueFactory);
        } else {
          return Collections.emptyList();
        }
      } else {
        return Collections.emptyList();
      }
    }
  
    @Nullable private T parseInitialValue(List<Keyframe<T>> keyframes) {
      if (json != null) {
        if (!keyframes.isEmpty()) {
          return keyframes.get(0).startValue;
        } else {
          return valueFactory.valueFromObject(json.opt("k"), scale);
        }
      } else {
        return null;
      }
    }
  
    private static boolean hasKeyframes(Object json) {
      if (!(json instanceof JSONArray)) {
        return false;
      } else {
        Object firstObject = ((JSONArray) json).opt(0);
        return firstObject instanceof JSONObject && ((JSONObject) firstObject).has("t");
      }
    }
  
    static class Result<T> {
      final List<Keyframe<T>> keyframes;
      final @Nullable T initialValue;
  
      Result(List<Keyframe<T>> keyframes, @Nullable T initialValue) {
        this.keyframes = keyframes;
        this.initialValue = initialValue;
      }
    }
  }
  