lottie-ios 3.4.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/.github/workflows/main.yml +10 -7
  2. package/.swift-version +1 -0
  3. package/Lottie.xcodeproj/project.pbxproj +5 -5
  4. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +81 -0
  5. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  7. package/Package.resolved +88 -0
  8. package/Package.swift +5 -0
  9. package/README.md +5 -6
  10. package/Rakefile +13 -17
  11. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
  12. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +191 -65
  13. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +79 -36
  14. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
  15. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +18 -6
  16. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +6 -0
  17. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +9 -2
  18. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +77 -34
  19. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +15 -1
  20. package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
  21. package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
  22. package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
  23. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +1 -1
  24. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
  25. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +0 -2
  26. package/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +1 -4
  27. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
  28. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
  29. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
  30. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
  31. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
  32. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
  33. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
  34. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
  35. package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
  36. package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
  37. package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
  38. package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
  39. package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
  40. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
  41. package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
  42. package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
  43. package/Sources/Public/Animation/AnimationPublic.swift +0 -3
  44. package/Sources/Public/Animation/AnimationView.swift +26 -6
  45. package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
  46. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
  47. package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
  48. package/Sources/Public/Logging/LottieLogger.swift +15 -2
  49. package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
  50. package/Sources/Public/iOS/AnimatedButton.swift +10 -4
  51. package/Sources/Public/iOS/AnimatedControl.swift +3 -5
  52. package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
  53. package/Sources/Public/iOS/BundleImageProvider.swift +0 -1
  54. package/Sources/Public/iOS/FilepathImageProvider.swift +0 -1
  55. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +0 -1
  56. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +0 -2
  57. package/Tests/ParsingTests.swift +2 -1
  58. package/Tests/PerformanceTests.swift +9 -9
  59. package/lottie-ios.podspec +1 -2
  60. package/package.json +1 -1
  61. package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
  62. package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
  63. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  64. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  65. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  66. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  67. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  68. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  69. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  70. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
  71. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  72. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  73. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
  74. package/Mintfile +0 -3
  75. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  76. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  77. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  78. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  79. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  80. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  81. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  82. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
  83. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  84. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  85. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  86. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  87. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  88. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  89. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  90. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  91. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  92. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  93. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  94. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  95. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  96. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  97. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  98. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  99. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  100. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  101. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  102. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  103. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  104. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  105. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  106. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  107. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  108. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  109. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  110. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  111. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
  112. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  113. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  114. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  115. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  116. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  117. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  118. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  119. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  120. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  121. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  122. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  123. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  124. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  125. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  126. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  127. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  128. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  129. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  130. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  131. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  132. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  133. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  134. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  135. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  136. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  137. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  138. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  139. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  140. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  141. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  142. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  143. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  144. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  145. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  146. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  147. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  148. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  149. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  150. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  151. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  152. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  153. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  154. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  155. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  156. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  157. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  158. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  159. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  160. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  161. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  162. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  163. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  164. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  165. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  166. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  167. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  168. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  169. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  170. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  171. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  172. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  173. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  174. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  175. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
  176. package/Tests/Samples/9squares_AlBoardman.json +0 -1
  177. package/Tests/Samples/Boat_Loader.json +0 -1
  178. package/Tests/Samples/HamburgerArrow.json +0 -1
  179. package/Tests/Samples/IconTransitions.json +0 -1
  180. package/Tests/Samples/Images/dog.png +0 -0
  181. package/Tests/Samples/Issues/issue_1403.json +0 -1
  182. package/Tests/Samples/Issues/issue_1407.json +0 -1
  183. package/Tests/Samples/Issues/issue_1488.json +0 -1
  184. package/Tests/Samples/Issues/issue_1505.json +0 -1
  185. package/Tests/Samples/Issues/issue_1628.json +0 -1
  186. package/Tests/Samples/Issues/pr_1536.json +0 -1
  187. package/Tests/Samples/Issues/pr_1563.json +0 -8439
  188. package/Tests/Samples/Issues/pr_1592.json +0 -5527
  189. package/Tests/Samples/Issues/pr_1599.json +0 -738
  190. package/Tests/Samples/Issues/pr_1604_1.json +0 -1
  191. package/Tests/Samples/Issues/pr_1604_2.json +0 -1
  192. package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
  193. package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
  194. package/Tests/Samples/LottieFiles/cactus.json +0 -1
  195. package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
  196. package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
  197. package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
  198. package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
  199. package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
  200. package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
  201. package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
  202. package/Tests/Samples/LottieFiles/growth.json +0 -1
  203. package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
  204. package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
  205. package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
  206. package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
  207. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
  208. package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
  209. package/Tests/Samples/LottieFiles/shop.json +0 -1
  210. package/Tests/Samples/LottieFiles/step_loader.json +0 -1
  211. package/Tests/Samples/LottieLogo1.json +0 -1
  212. package/Tests/Samples/LottieLogo1_masked.json +0 -1
  213. package/Tests/Samples/LottieLogo2.json +0 -1
  214. package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
  215. package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
  216. package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
  217. package/Tests/Samples/Nonanimating/FirstText.json +0 -1
  218. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
  219. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
  220. package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
  221. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
  222. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
  223. package/Tests/Samples/Nonanimating/Zoom.json +0 -1
  224. package/Tests/Samples/Nonanimating/_dog.json +0 -1
  225. package/Tests/Samples/Nonanimating/base64Test.json +0 -1
  226. package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
  227. package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
  228. package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
  229. package/Tests/Samples/PinJump.json +0 -1
  230. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
  231. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
  232. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
  233. package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
  234. package/Tests/Samples/Private/README.md +0 -7
  235. package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
  236. package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
  237. package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
  238. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
  239. package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
  240. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
  241. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
  242. package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
  243. package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
  244. package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
  245. package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
  246. package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
  247. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
  248. package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
  249. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
  250. package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
  251. package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
  252. package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
  253. package/Tests/Samples/Private/_flexible.json +0 -1
  254. package/Tests/Samples/Private/aircover.json +0 -1
  255. package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
  256. package/Tests/Samples/Private/celebration.json +0 -2821
  257. package/Tests/Samples/Private/checkbox.json +0 -1
  258. package/Tests/Samples/Private/checkbox_small.json +0 -1
  259. package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
  260. package/Tests/Samples/Private/gradient_afternoon.json +0 -1
  261. package/Tests/Samples/Private/gradient_brand.json +0 -1
  262. package/Tests/Samples/Private/gradient_evening.json +0 -1
  263. package/Tests/Samples/Private/gradient_morning.json +0 -1
  264. package/Tests/Samples/Private/issue_1467.json +0 -1
  265. package/Tests/Samples/Private/loading_dots.json +0 -1
  266. package/Tests/Samples/Private/loading_dots_small.json +0 -1
  267. package/Tests/Samples/Private/payment_loader.json +0 -1
  268. package/Tests/Samples/Private/radio_button.json +0 -1
  269. package/Tests/Samples/Private/selfie_intro.json +0 -1
  270. package/Tests/Samples/Private/stepper_add.json +0 -1
  271. package/Tests/Samples/Private/stepper_subtract.json +0 -1
  272. package/Tests/Samples/Private/switch.json +0 -1
  273. package/Tests/Samples/Private/thumb.json +0 -1
  274. package/Tests/Samples/Private/toggle_no.json +0 -1
  275. package/Tests/Samples/Private/toggle_yes.json +0 -1
  276. package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
  277. package/Tests/Samples/Private/user_error_cut_off.json +0 -1
  278. package/Tests/Samples/Switch.json +0 -1
  279. package/Tests/Samples/Switch_States.json +0 -1
  280. package/Tests/Samples/TwitterHeart.json +0 -1
  281. package/Tests/Samples/TwitterHeartButton.json +0 -1
  282. package/Tests/Samples/TypeFace/A.json +0 -1
  283. package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
  284. package/Tests/Samples/TypeFace/B.json +0 -1
  285. package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
  286. package/Tests/Samples/TypeFace/C.json +0 -1
  287. package/Tests/Samples/TypeFace/Colon.json +0 -1
  288. package/Tests/Samples/TypeFace/Comma.json +0 -1
  289. package/Tests/Samples/TypeFace/D.json +0 -1
  290. package/Tests/Samples/TypeFace/E.json +0 -1
  291. package/Tests/Samples/TypeFace/F.json +0 -1
  292. package/Tests/Samples/TypeFace/G.json +0 -1
  293. package/Tests/Samples/TypeFace/H.json +0 -1
  294. package/Tests/Samples/TypeFace/I.json +0 -1
  295. package/Tests/Samples/TypeFace/J.json +0 -1
  296. package/Tests/Samples/TypeFace/K.json +0 -1
  297. package/Tests/Samples/TypeFace/L.json +0 -1
  298. package/Tests/Samples/TypeFace/M.json +0 -1
  299. package/Tests/Samples/TypeFace/N.json +0 -1
  300. package/Tests/Samples/TypeFace/O.json +0 -1
  301. package/Tests/Samples/TypeFace/P.json +0 -1
  302. package/Tests/Samples/TypeFace/Q.json +0 -1
  303. package/Tests/Samples/TypeFace/R.json +0 -1
  304. package/Tests/Samples/TypeFace/S.json +0 -1
  305. package/Tests/Samples/TypeFace/T.json +0 -1
  306. package/Tests/Samples/TypeFace/U.json +0 -1
  307. package/Tests/Samples/TypeFace/V.json +0 -1
  308. package/Tests/Samples/TypeFace/W.json +0 -1
  309. package/Tests/Samples/TypeFace/X.json +0 -1
  310. package/Tests/Samples/TypeFace/Y.json +0 -1
  311. package/Tests/Samples/TypeFace/Z.json +0 -1
  312. package/Tests/Samples/Watermelon.json +0 -1
  313. package/Tests/Samples/setValueTest.json +0 -1
  314. package/Tests/Samples/timeremap.json +0 -1
  315. package/Tests/Samples/vcTransition1.json +0 -1
  316. package/Tests/Samples/vcTransition2.json +0 -1
  317. package/script/lint/airbnb.swiftformat +0 -68
  318. package/script/lint/swiftlint.yml +0 -38
  319. package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
  320. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
  321. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
  322. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
  323. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  324. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  325. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  326. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  327. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  328. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  329. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
  330. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  331. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  332. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
  333. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  334. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  335. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
  336. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  337. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
  338. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  339. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  340. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
  341. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  342. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  343. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  344. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
  345. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  346. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  347. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
  348. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
  349. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  350. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  351. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  352. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
  353. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
@@ -7,17 +7,29 @@ enum Keyframes {
7
7
  /// Combines the given `[KeyframeGroup]` of `Keyframe<T>`s
8
8
  /// into a single `KeyframeGroup` of `Keyframe<[T]>`s
9
9
  /// if all of the `KeyframeGroup`s have the exact same animation timing
10
- static func combinedIfPossible<T>(_ groups: [KeyframeGroup<T>]) -> KeyframeGroup<[T]>? {
10
+ static func combinedIfPossible<T>(_ allGroups: [KeyframeGroup<T>]) -> KeyframeGroup<[T]>? {
11
+ // Animations with no timing information (e.g. with just a single keyframe)
12
+ // can be trivially combined with any other set of keyframes, so we don't need
13
+ // to check those.
14
+ let animatingKeyframes = allGroups.filter { $0.keyframes.count > 1 }
15
+
11
16
  guard
12
- !groups.isEmpty,
13
- groups.allSatisfy({ $0.hasSameTimingParameters(as: groups[0]) })
17
+ !allGroups.isEmpty,
18
+ animatingKeyframes.allSatisfy({ $0.hasSameTimingParameters(as: animatingKeyframes[0]) })
14
19
  else { return nil }
15
20
 
16
21
  var combinedKeyframes = ContiguousArray<Keyframe<[T]>>()
22
+ let baseKeyframes = (animatingKeyframes.first ?? allGroups[0]).keyframes
17
23
 
18
- for index in groups[0].keyframes.indices {
19
- let baseKeyframe = groups[0].keyframes[index]
20
- let combinedValues = groups.map { $0.keyframes[index].value }
24
+ for index in baseKeyframes.indices {
25
+ let baseKeyframe = baseKeyframes[index]
26
+ let combinedValues = allGroups.map { otherKeyframes -> T in
27
+ if otherKeyframes.keyframes.count == 1 {
28
+ return otherKeyframes.keyframes[0].value
29
+ } else {
30
+ return otherKeyframes.keyframes[index].value
31
+ }
32
+ }
21
33
  combinedKeyframes.append(baseKeyframe.withValue(combinedValues))
22
34
  }
23
35
 
@@ -63,6 +63,12 @@ struct LayerAnimationContext {
63
63
  animation.progressTime(forFrame: timeRemapping(frame), clamped: false)
64
64
  }
65
65
 
66
+ /// The real-time `TimeInterval` for the given `AnimationFrameTime` within this layer,
67
+ /// accounting for the `timeRemapping` applied to this layer
68
+ func time(for frame: AnimationFrameTime) -> TimeInterval {
69
+ animation.time(forFrame: timeRemapping(frame))
70
+ }
71
+
66
72
  /// Chains an additional `timeRemapping` closure onto this layer context
67
73
  func withTimeRemapping(
68
74
  _ additionalTimeRemapping: @escaping (AnimationFrameTime) -> AnimationFrameTime)
@@ -70,9 +70,12 @@ final class GradientRenderLayer: CAGradientLayer {
70
70
  width: gradientPadding + gradientReferenceBounds.width + gradientPadding,
71
71
  height: gradientPadding + gradientReferenceBounds.height + gradientPadding)
72
72
 
73
+ // Align the center of this layer to be at the center point of its parent layer
74
+ let superlayerSize = superlayer?.frame.size ?? gradientReferenceBounds.size
75
+
73
76
  transform = CATransform3DMakeTranslation(
74
- -gradientPadding,
75
- -gradientPadding,
77
+ (superlayerSize.width - bounds.width) / 2,
78
+ (superlayerSize.height - bounds.height) / 2,
76
79
  0)
77
80
  }
78
81
 
@@ -83,5 +86,9 @@ final class GradientRenderLayer: CAGradientLayer {
83
86
  extension GradientRenderLayer: CustomLayoutLayer {
84
87
  func layout(superlayerBounds: CGRect) {
85
88
  gradientReferenceBounds = superlayerBounds
89
+
90
+ if let gradientMask = mask as? GradientRenderLayer {
91
+ gradientMask.layout(superlayerBounds: superlayerBounds)
92
+ }
86
93
  }
87
94
  }
@@ -69,27 +69,24 @@ final class ShapeItemLayer: BaseAnimationLayer {
69
69
  try setupSolidFillAnimations(shapeLayer: shapeLayer, context: context)
70
70
 
71
71
  case .gradientFill(let gradientLayers):
72
- try setupGradientFillAnimations(
73
- gradientLayer: gradientLayers.gradientLayer,
74
- maskLayer: gradientLayers.maskLayer,
75
- context: context)
72
+ try setupGradientFillAnimations(layers: gradientLayers, context: context)
76
73
  }
77
74
 
78
75
  if let gradientStrokeConfiguration = sublayerConfiguration.gradientStroke {
79
- try setupGradientStrokeAnimations(
80
- gradientLayer: gradientStrokeConfiguration.gradientLayer,
81
- maskLayer: gradientStrokeConfiguration.maskLayer,
82
- context: context)
76
+ try setupGradientStrokeAnimations(layers: gradientStrokeConfiguration, context: context)
83
77
  }
84
78
  }
85
79
 
86
80
  // MARK: Private
87
81
 
88
82
  private struct GradientLayers {
89
- /// The `CALayer` that renders the actual gradient
90
- let gradientLayer: GradientRenderLayer
91
- /// The `CAShapeLayer` that clips the gradient layer to the expected shape
92
- let maskLayer: CAShapeLayer
83
+ /// The `CALayer` that renders the RGB components of the gradient
84
+ let gradientColorLayer: GradientRenderLayer
85
+ /// The `CALayer` that renders the alpha components of the gradient,
86
+ /// masking the `gradientColorLayer`
87
+ let gradientAlphaLayer: GradientRenderLayer?
88
+ /// The `CAShapeLayer` that clips the gradient layers to the expected shape
89
+ let shapeMaskLayer: CAShapeLayer
93
90
  }
94
91
 
95
92
  /// The configuration of this layer's `fill` sublayers
@@ -115,15 +112,15 @@ final class ShapeItemLayer: BaseAnimationLayer {
115
112
  // we're rendering a gradient (a `CAGradientLayer` masked by a `CAShapeLayer`)
116
113
  // or a solid shape (a simple `CAShapeLayer`).
117
114
  let fillLayerConfiguration: FillLayerConfiguration
118
- if otherItems.contains(where: { $0.item is GradientFill }) {
119
- fillLayerConfiguration = setupGradientFillLayerHierarchy()
115
+ if let gradientFill = otherItems.first(GradientFill.self) {
116
+ fillLayerConfiguration = setupGradientFillLayerHierarchy(for: gradientFill)
120
117
  } else {
121
118
  fillLayerConfiguration = setupSolidFillLayerHierarchy()
122
119
  }
123
120
 
124
121
  let gradientStrokeConfiguration: GradientLayers?
125
- if otherItems.contains(where: { $0.item is GradientStroke }) {
126
- gradientStrokeConfiguration = setupGradientStrokeLayerHierarchy()
122
+ if let gradientStroke = otherItems.first(GradientStroke.self) {
123
+ gradientStrokeConfiguration = setupGradientStrokeLayerHierarchy(for: gradientStroke)
127
124
  } else {
128
125
  gradientStrokeConfiguration = nil
129
126
  }
@@ -144,18 +141,35 @@ final class ShapeItemLayer: BaseAnimationLayer {
144
141
  return .solidFill(shapeLayer)
145
142
  }
146
143
 
147
- private func setupGradientFillLayerHierarchy() -> FillLayerConfiguration {
144
+ private func setupGradientFillLayerHierarchy(
145
+ for gradientFill: GradientFill)
146
+ -> FillLayerConfiguration
147
+ {
148
148
  let pathMask = CAShapeLayer()
149
149
  pathMask.fillColor = .rgb(0, 0, 0)
150
150
  mask = pathMask
151
151
 
152
- let gradientLayer = GradientRenderLayer()
153
- addSublayer(gradientLayer)
152
+ let rgbGradientLayer = GradientRenderLayer()
153
+ addSublayer(rgbGradientLayer)
154
154
 
155
- return .gradientFill(.init(gradientLayer: gradientLayer, maskLayer: pathMask))
155
+ let alphaGradientLayer: GradientRenderLayer?
156
+ if gradientFill.hasAlphaComponent {
157
+ alphaGradientLayer = GradientRenderLayer()
158
+ rgbGradientLayer.mask = alphaGradientLayer
159
+ } else {
160
+ alphaGradientLayer = nil
161
+ }
162
+
163
+ return .gradientFill(GradientLayers(
164
+ gradientColorLayer: rgbGradientLayer,
165
+ gradientAlphaLayer: alphaGradientLayer,
166
+ shapeMaskLayer: pathMask))
156
167
  }
157
168
 
158
- private func setupGradientStrokeLayerHierarchy() -> GradientLayers {
169
+ private func setupGradientStrokeLayerHierarchy(
170
+ for gradientStroke: GradientStroke)
171
+ -> GradientLayers
172
+ {
159
173
  let container = BaseAnimationLayer()
160
174
 
161
175
  let pathMask = CAShapeLayer()
@@ -163,11 +177,22 @@ final class ShapeItemLayer: BaseAnimationLayer {
163
177
  pathMask.strokeColor = .rgb(0, 0, 0)
164
178
  container.mask = pathMask
165
179
 
166
- let gradientLayer = GradientRenderLayer()
167
- container.addSublayer(gradientLayer)
180
+ let rgbGradientLayer = GradientRenderLayer()
181
+ container.addSublayer(rgbGradientLayer)
168
182
  addSublayer(container)
169
183
 
170
- return .init(gradientLayer: gradientLayer, maskLayer: pathMask)
184
+ let alphaGradientLayer: GradientRenderLayer?
185
+ if gradientStroke.hasAlphaComponent {
186
+ alphaGradientLayer = GradientRenderLayer()
187
+ rgbGradientLayer.mask = alphaGradientLayer
188
+ } else {
189
+ alphaGradientLayer = nil
190
+ }
191
+
192
+ return GradientLayers(
193
+ gradientColorLayer: rgbGradientLayer,
194
+ gradientAlphaLayer: alphaGradientLayer,
195
+ shapeMaskLayer: pathMask)
171
196
  }
172
197
 
173
198
  private func setupSolidFillAnimations(
@@ -192,34 +217,41 @@ final class ShapeItemLayer: BaseAnimationLayer {
192
217
  }
193
218
 
194
219
  private func setupGradientFillAnimations(
195
- gradientLayer: GradientRenderLayer,
196
- maskLayer: CAShapeLayer,
220
+ layers: GradientLayers,
197
221
  context: LayerAnimationContext)
198
222
  throws
199
223
  {
200
- try maskLayer.addAnimations(for: shape.item, context: context.for(shape), pathMultiplier: 1)
224
+ try layers.shapeMaskLayer.addAnimations(
225
+ for: shape.item,
226
+ context: context.for(shape),
227
+ pathMultiplier: 1)
201
228
 
202
229
  if let (gradientFill, context) = otherItems.first(GradientFill.self, context: context) {
203
- try gradientLayer.addGradientAnimations(for: gradientFill, context: context)
230
+ try layers.gradientColorLayer.addGradientAnimations(for: gradientFill, type: .rgb, context: context)
231
+ try layers.gradientAlphaLayer?.addGradientAnimations(for: gradientFill, type: .alpha, context: context)
204
232
  }
205
233
  }
206
234
 
207
235
  private func setupGradientStrokeAnimations(
208
- gradientLayer: GradientRenderLayer,
209
- maskLayer: CAShapeLayer,
236
+ layers: GradientLayers,
210
237
  context: LayerAnimationContext)
211
238
  throws
212
239
  {
213
240
  var trimPathMultiplier: PathMultiplier? = nil
214
241
  if let (trim, context) = otherItems.first(Trim.self, context: context) {
215
- trimPathMultiplier = try maskLayer.addAnimations(for: trim, context: context)
242
+ trimPathMultiplier = try layers.shapeMaskLayer.addAnimations(for: trim, context: context)
216
243
  }
217
244
 
218
- try maskLayer.addAnimations(for: shape.item, context: context.for(shape), pathMultiplier: trimPathMultiplier ?? 1)
245
+ try layers.shapeMaskLayer.addAnimations(
246
+ for: shape.item,
247
+ context: context.for(shape),
248
+ pathMultiplier: trimPathMultiplier ?? 1)
219
249
 
220
250
  if let (gradientStroke, context) = otherItems.first(GradientStroke.self, context: context) {
221
- try gradientLayer.addGradientAnimations(for: gradientStroke, context: context)
222
- try maskLayer.addStrokeAnimations(for: gradientStroke, context: context)
251
+ try layers.gradientColorLayer.addGradientAnimations(for: gradientStroke, type: .rgb, context: context)
252
+ try layers.gradientAlphaLayer?.addGradientAnimations(for: gradientStroke, type: .alpha, context: context)
253
+
254
+ try layers.shapeMaskLayer.addStrokeAnimations(for: gradientStroke, context: context)
223
255
  }
224
256
  }
225
257
 
@@ -241,6 +273,17 @@ extension Array where Element == ShapeItemLayer.Item {
241
273
 
242
274
  return nil
243
275
  }
276
+
277
+ /// The first `ShapeItem` in this array of the given type
278
+ func first<ItemType: ShapeItem>(_: ItemType.Type) -> ItemType? {
279
+ for item in self {
280
+ if let match = item.item as? ItemType {
281
+ return match
282
+ }
283
+ }
284
+
285
+ return nil
286
+ }
244
287
  }
245
288
 
246
289
  extension LayerAnimationContext {
@@ -108,6 +108,12 @@ final class GroupLayer: BaseAnimationLayer {
108
108
  // because combining multiple paths into a single `CGPath` (instead of rendering them in separate layers)
109
109
  // allows `CAShapeLayerFillRule.evenOdd` to be applied if the paths overlap. We just can't do this
110
110
  // in all cases, due to limitations of Core Animation.
111
+ //
112
+ // As a fall back when this is not possible, we render each shape in its own `CAShapeLayer`,
113
+ // which causes the `fillRule` to be applied incorrectly in cases where the paths overlap.
114
+ // We can't really detect when this happens, so this is a case where `RenderingEngineMode.automatic`
115
+ // can behave incorrectly. In the future we could fix this by precomputing the full combined CGPath for each
116
+ // individual frame in the animation (like we do for some trim animations as of #1612).
111
117
  if
112
118
  shapeRenderGroup.pathItems.count > 1,
113
119
  let combinedShapeKeyframes = Keyframes.combinedIfPossible(
@@ -150,7 +156,15 @@ extension CALayer {
150
156
  /// - Each `Group` item becomes its own `GroupLayer` sublayer.
151
157
  /// - Other `ShapeItem` are applied to all sublayers
152
158
  fileprivate func setupGroups(from items: [ShapeItem], parentGroup: Group?, context: LayerContext) throws {
153
- let (groupItems, otherItems) = items.grouped(by: { $0 is Group })
159
+ var (groupItems, otherItems) = items.grouped(by: { $0 is Group })
160
+
161
+ // If this shape doesn't have any groups but just has top-level shape items,
162
+ // we can create a placeholder group with those items. (Otherwise the shape items
163
+ // would be silently ignored, since we expect all shape layers to have a top-level group).
164
+ if groupItems.isEmpty, parentGroup == nil {
165
+ groupItems = [Group(items: otherItems, name: "Group")]
166
+ otherItems = []
167
+ }
154
168
 
155
169
  // Groups are listed from front to back,
156
170
  // but `CALayer.sublayers` are listed from back to front.
@@ -109,7 +109,6 @@ private class MaskLayer: CALayer {
109
109
  actions = [
110
110
  "opacity" : NSNull(),
111
111
  ]
112
-
113
112
  }
114
113
 
115
114
  override init(layer: Any) {
@@ -152,7 +151,6 @@ private class MaskLayer: CALayer {
152
151
  }
153
152
  maskLayer.path = path
154
153
  }
155
-
156
154
  }
157
155
  }
158
156
 
@@ -107,12 +107,12 @@ final class PreCompositionLayer: CompositionLayer {
107
107
  } else {
108
108
  localFrame = (frame - startFrame) / timeStretch
109
109
  }
110
- animationLayers.forEach( { $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
110
+ animationLayers.forEach({ $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
111
111
  }
112
112
 
113
113
  override func updateRenderScale() {
114
114
  super.updateRenderScale()
115
- animationLayers.forEach( { $0.renderScale = renderScale } )
115
+ animationLayers.forEach({ $0.renderScale = renderScale })
116
116
  }
117
117
 
118
118
  // MARK: Fileprivate
@@ -93,7 +93,6 @@ final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
93
93
  super.init(layer: layer)
94
94
 
95
95
  currentFrame = typedLayer.currentFrame
96
-
97
96
  }
98
97
 
99
98
  required init?(coder _: NSCoder) {
@@ -195,7 +194,7 @@ final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
195
194
 
196
195
  /// Forces the view to update its drawing.
197
196
  func forceDisplayUpdate() {
198
- animationLayers.forEach( { $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
197
+ animationLayers.forEach({ $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
199
198
  }
200
199
 
201
200
  func logHierarchyKeypaths() {
@@ -311,7 +311,7 @@ final class CoreTextRenderLayer: CALayer {
311
311
  x: textAnchor.x.remap(fromLow: 0, fromHigh: drawingRect.size.width, toLow: 0, toHigh: 1),
312
312
  y: textAnchor.y.remap(fromLow: 0, fromHigh: drawingRect.size.height, toLow: 0, toHigh: 1))
313
313
 
314
- if fillFrameSetter != nil && strokeFrameSetter != nil {
314
+ if fillFrameSetter != nil, strokeFrameSetter != nil {
315
315
  drawingRect.size.width += strokeWidth
316
316
  drawingRect.size.height += strokeWidth
317
317
  }
@@ -16,7 +16,6 @@ final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
16
16
  // MARK: Lifecycle
17
17
 
18
18
  init(transform: Transform) {
19
-
20
19
  anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchorPoint.keyframes))
21
20
  scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
22
21
  rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
@@ -19,7 +19,6 @@ final class NodeTree {
19
19
 
20
20
  extension Array where Element == ShapeItem {
21
21
  func initializeNodeTree() -> NodeTree {
22
-
23
22
  let nodeTree = NodeTree()
24
23
 
25
24
  for item in self {
@@ -73,7 +72,6 @@ extension Array where Element == ShapeItem {
73
72
  nodeTree.transform = xform
74
73
  continue
75
74
  } else if let group = item as? Group {
76
-
77
75
  let tree = group.items.initializeNodeTree()
78
76
  let node = GroupNode(name: group.name, parentNode: nodeTree.rootNode, tree: tree)
79
77
  nodeTree.rootNode = node
@@ -149,7 +149,7 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
149
149
 
150
150
  /// Sets the initial keyframes. This is often only needed for the first check.
151
151
  if
152
- leadingIndex == nil &&
152
+ leadingIndex == nil,
153
153
  trailingIndex == nil
154
154
  {
155
155
  if frame < keyframes[0].time {
@@ -170,7 +170,6 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
170
170
  var newLeading = currentTrailing
171
171
  var keyframeFound = false
172
172
  while !keyframeFound {
173
-
174
173
  leadingIndex = newLeading
175
174
  trailingIndex = keyframes.validIndex(newLeading + 1)
176
175
 
@@ -192,13 +191,11 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
192
191
  let currentLeading = leadingIndex,
193
192
  frame < keyframes[currentLeading].time
194
193
  {
195
-
196
194
  /// Time is before the current span. Iterate backwards
197
195
  var newTrailing = currentLeading
198
196
 
199
197
  var keyframeFound = false
200
198
  while !keyframeFound {
201
-
202
199
  leadingIndex = keyframes.validIndex(newTrailing - 1)
203
200
  trailingIndex = newTrailing
204
201
 
@@ -142,7 +142,6 @@ final class TrimPathNode: AnimatorNode {
142
142
 
143
143
  /// Now loop through all path containers
144
144
  for pathContainer in upstreamPaths {
145
-
146
145
  let pathEnd = pathStart + pathContainer.totalLength
147
146
 
148
147
  if
@@ -214,11 +213,10 @@ final class TrimPathNode: AnimatorNode {
214
213
  let subpaths = pathContainer.removePaths(updateFrame: frame)
215
214
  var subpathStart: CGFloat = 0
216
215
  for path in subpaths {
217
-
218
216
  let subpathEnd = subpathStart + path.length
219
217
 
220
218
  if
221
- !startCutLength.isInRange(subpathStart, subpathEnd) &&
219
+ !startCutLength.isInRange(subpathStart, subpathEnd),
222
220
  !endCutLength.isInRange(subpathStart, subpathEnd)
223
221
  {
224
222
  // The whole path is included. Add
@@ -226,7 +224,7 @@ final class TrimPathNode: AnimatorNode {
226
224
  pathContainer.appendPath(path, updateFrame: frame)
227
225
 
228
226
  } else if
229
- startCutLength.isInRange(subpathStart, subpathEnd) &&
227
+ startCutLength.isInRange(subpathStart, subpathEnd),
230
228
  !endCutLength.isInRange(subpathStart, subpathEnd)
231
229
  {
232
230
  /// The start of the path needs to be trimmed
@@ -235,7 +233,7 @@ final class TrimPathNode: AnimatorNode {
235
233
  let newPath = path.trim(fromPosition: cutLength / path.length, toPosition: 1, offset: 0, trimSimultaneously: false)
236
234
  pathContainer.appendPath(newPath, updateFrame: frame)
237
235
  } else if
238
- !startCutLength.isInRange(subpathStart, subpathEnd) &&
236
+ !startCutLength.isInRange(subpathStart, subpathEnd),
239
237
  endCutLength.isInRange(subpathStart, subpathEnd)
240
238
  {
241
239
  // S|=======E----------------------|
@@ -244,7 +242,7 @@ final class TrimPathNode: AnimatorNode {
244
242
  pathContainer.appendPath(newPath, updateFrame: frame)
245
243
  break
246
244
  } else if
247
- startCutLength.isInRange(subpathStart, subpathEnd) &&
245
+ startCutLength.isInRange(subpathStart, subpathEnd),
248
246
  endCutLength.isInRange(subpathStart, subpathEnd)
249
247
  {
250
248
  // |-------S============E---------|
@@ -272,7 +270,6 @@ final class TrimPathNode: AnimatorNode {
272
270
 
273
271
  pathStart = pathEnd
274
272
  }
275
-
276
273
  }
277
274
 
278
275
  // MARK: Fileprivate
@@ -42,7 +42,7 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
42
42
  }
43
43
 
44
44
  func render(_ inContext: CGContext) {
45
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
45
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
46
46
  return
47
47
  }
48
48
 
@@ -56,7 +56,6 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
56
56
 
57
57
  /// Now draw the gradient.
58
58
  gradientRender.render(inContext)
59
-
60
59
  }
61
60
 
62
61
  func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
@@ -58,7 +58,7 @@ final class LegacyGradientFillRenderer: PassThroughOutputNode, Renderable {
58
58
  }
59
59
 
60
60
  func render(_ inContext: CGContext) {
61
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
61
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
62
62
  return
63
63
  }
64
64
  hasUpdate = false
@@ -140,7 +140,7 @@ final class StrokeRenderer: PassThroughOutputNode, Renderable {
140
140
  }
141
141
 
142
142
  func render(_ inContext: CGContext) {
143
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
143
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
144
144
  return
145
145
  }
146
146
  guard let color = color else { return }
@@ -171,7 +171,7 @@ extension BezierPath {
171
171
  CurveVertex(
172
172
  CGPoint(x: 0, y: radius), // In tangent
173
173
  CGPoint(x: 0, y: radius), // Point
174
- CGPoint(x: -controlPoint, y: radius))// Out tangent
174
+ CGPoint(x: -controlPoint, y: radius)) // Out tangent
175
175
  .translated(CGPoint(x: radius, y: -radius))
176
176
  .translated(CGPoint(x: -size.width, y: size.height))
177
177
  .translated(position),
@@ -158,17 +158,17 @@ extension BezierPath {
158
158
  for i in 0..<numPoints {
159
159
  var radius = longSegment ? outerRadius : innerRadius
160
160
  var dTheta = halfAnglePerPoint
161
- if partialPointRadius != 0 && i == numPoints - 2 {
161
+ if partialPointRadius != 0, i == numPoints - 2 {
162
162
  dTheta = anglePerPoint * partialPointAmount / 2
163
163
  }
164
- if partialPointRadius != 0 && i == numPoints - 1 {
164
+ if partialPointRadius != 0, i == numPoints - 1 {
165
165
  radius = partialPointRadius
166
166
  }
167
167
  previousPoint = point
168
168
  point.x = (radius * cos(currentAngle))
169
169
  point.y = (radius * sin(currentAngle))
170
170
 
171
- if innerRoundedness == 0 && outerRoundedness == 0 {
171
+ if innerRoundedness == 0, outerRoundedness == 0 {
172
172
  vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
173
173
  } else {
174
174
  let cp1Theta = (atan2(previousPoint.y, previousPoint.x) - CGFloat.pi / 2)
@@ -69,7 +69,7 @@ class ShapeContainerLayer: CALayer {
69
69
 
70
70
  func updateRenderScale() {
71
71
  contentsScale = renderScale
72
- renderLayers.forEach( { $0.renderScale = renderScale } )
72
+ renderLayers.forEach({ $0.renderScale = renderScale })
73
73
  }
74
74
 
75
75
  }
@@ -69,7 +69,6 @@ final class ShapeRenderLayer: ShapeContainerLayer {
69
69
  }
70
70
 
71
71
  override func rebuildContents(forFrame _: CGFloat) {
72
-
73
72
  if renderer.shouldRenderInContext {
74
73
  if let newPath = renderer.outputPath {
75
74
  bounds = renderer.renderBoundsFor(newPath.boundingBox)
@@ -7,7 +7,7 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
10
+ /// An item that define a a group of shape items
11
11
  final class Group: ShapeItem {
12
12
 
13
13
  // MARK: Lifecycle
@@ -24,6 +24,11 @@ final class Group: ShapeItem {
24
24
  try super.init(dictionary: dictionary)
25
25
  }
26
26
 
27
+ init(items: [ShapeItem], name: String) {
28
+ self.items = items
29
+ super.init(name: name, type: .group, hidden: false)
30
+ }
31
+
27
32
  // MARK: Internal
28
33
 
29
34
  /// A list of shape items.
@@ -26,7 +26,6 @@ final class TextAnimator: Codable, DictionaryInitializable {
26
26
  skewAxis = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis)
27
27
  rotation = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation)
28
28
  opacity = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity)
29
-
30
29
  }
31
30
 
32
31
  init(dictionary: [String: Any]) throws {
@@ -53,7 +53,7 @@ extension CALayer {
53
53
  string = string + " "
54
54
  }
55
55
  string = string + "|_" + String(describing: self)
56
- print(string)
56
+ LottieLogger.shared.info(string)
57
57
  if let sublayers = sublayers {
58
58
  for sublayer in sublayers {
59
59
  sublayer.logLayerTree(withIndent: withIndent + 1)
@@ -75,7 +75,6 @@ extension CALayer {
75
75
 
76
76
  @nonobjc
77
77
  func setDebuggingState(visible: Bool) {
78
-
79
78
  var sublayers = self.sublayers
80
79
  if let cust = self as? CustomLayerDebugging {
81
80
  sublayers = cust.layerForDebugging().sublayers
@@ -344,7 +344,6 @@ extension CGPoint {
344
344
  var closestPoint = 0
345
345
 
346
346
  while previousAmount < 1 {
347
-
348
347
  previousAmount = previousAmount + step
349
348
 
350
349
  if previousAmount < amount {
@@ -429,7 +428,7 @@ extension CGPoint {
429
428
  func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
430
429
  let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
431
430
  let accuracy: CGFloat = 0.05
432
- if area < accuracy && area > -accuracy {
431
+ if area < accuracy, area > -accuracy {
433
432
  return true
434
433
  }
435
434
  return false
@@ -16,7 +16,6 @@ extension String {
16
16
  }
17
17
 
18
18
  func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) {
19
-
20
19
  var cString: String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
21
20
 
22
21
  if cString.hasPrefix("#") {
@@ -14,7 +14,6 @@ extension Color {
14
14
 
15
15
  /// Initialize a new color with Hue Saturation and Value
16
16
  init(h: Double, s: Double, v: Double, a: Double) {
17
-
18
17
  let i = floor(h * 6)
19
18
  let f = h * 6 - i
20
19
  let p = v * (1 - s);