res/nui_component_default_slider_thumb_n.png #common #mobile #mobile-emul #tv #wearable
res/nui_component_default_dropdown_button_icon.png #common #mobile #mobile-emul #tv #wearable
res/nui_component_default_dropdown_list_bg.png #common #mobile #mobile-emul #tv #wearable
+res/nui_wearable_checkbox_icon.json #wearable
+res/nui_wearable_radiobutton_icon.json #wearable
+res/nui_wearable_switch_icon.json #wearable
Tizen.Account.AccountManager.dll #mobile #mobile-emul #tv #wearable
Tizen.Account.FidoClient.dll #mobile #mobile-emul #wearable
Tizen.Account.OAuth2.dll #mobile #mobile-emul #wearable
/*
- * Copyright(c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
using System.ComponentModel;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Binding;
+using Tizen.NUI.Components.Extension;
namespace Tizen.NUI.Components
{
return instance.Style?.TextPadding;
});
- private ImageView overlayImage;
-
- private TextLabel buttonText;
- private ImageView buttonIcon;
-
private EventHandler<StateChangedEventArgs> stateChangeHander;
private bool isSelected = false;
private bool isEnabled = true;
private bool isPressed = false;
+ /// <summary>
+ /// Button's overlay image part.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected ImageView ButtonOverlayImage { get; set; }
+
+ /// <summary>
+ /// Button's text part.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected TextLabel ButtonText { get; set; }
+
+ /// <summary>
+ /// Button's icon part.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected ImageView ButtonIcon { get; set; }
+
+ /// <summary>
+ /// The last touch information triggering selected state change.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected Touch SelectionChangedByTouch { get; set; }
+
+ /// <summary>
+ /// The ButtonExtension instance that is injected by ButtonStyle.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected ButtonExtension Extension { get; set; }
+
+ /// <summary>
+ /// Creates Button's text part.
+ /// </summary>
+ /// <return>The created Button's text part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual TextLabel CreateText()
+ {
+ return new TextLabel();
+ }
+
+ /// <summary>
+ /// Creates Button's icon part.
+ /// </summary>
+ /// <return>The created Button's icon part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual ImageView CreateIcon()
+ {
+ return new ImageView();
+ }
+
+ /// <summary>
+ /// Creates Button's overlay image part.
+ /// </summary>
+ /// <return>The created Button's overlay image part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual ImageView CreateOverlayImage()
+ {
+ return new ImageView();
+ }
+
+ /// <summary>
+ /// Called when the Button is Clicked by a user
+ /// </summary>
+ /// <param name="eventArgs">The click information.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual void OnClick(ClickEventArgs eventArgs)
+ {
+ }
+
static Button() { }
/// <summary>
set
{
isSelected = value;
- UpdateState();
+
+ UpdateState(SelectionChangedByTouch);
+
+ SelectionChangedByTouch = null;
}
}
+
/// <summary>
/// Flag to decide enable or disable in Button.
/// </summary>
if (type == DisposeTypes.Explicit)
{
- if (buttonIcon != null)
+ Extension?.OnDispose(this);
+
+ if (ButtonIcon != null)
{
- Utility.Dispose(buttonIcon);
+ Utility.Dispose(ButtonIcon);
}
- if (buttonText != null)
+ if (ButtonText != null)
{
- Utility.Dispose(buttonText);
+ Utility.Dispose(ButtonText);
}
- if (overlayImage != null)
+ if (ButtonOverlayImage != null)
{
- Utility.Dispose(overlayImage);
+ Utility.Dispose(ButtonOverlayImage);
}
}
{
isPressed = true;
UpdateState();
- if(isEnabled)
- {
- ClickEventArgs eventArgs = new ClickEventArgs();
- OnClick(eventArgs);
- }
}
}
else if (key.State == Key.StateType.Up)
{
if (key.KeyPressedName == "Return")
{
+ bool clicked = isPressed && isEnabled;
+
isPressed = false;
+
if (Style.IsSelectable != null && Style.IsSelectable == true)
{
- isSelected = !isSelected;
+ IsSelected = !IsSelected;
+ }
+ else
+ {
+ UpdateState();
+ }
+
+ if (clicked)
+ {
+ ClickEventArgs eventArgs = new ClickEventArgs();
+ OnClickInternal(eventArgs);
}
- UpdateState();
}
}
return base.OnKey(key);
}
/// <summary>
- /// Tap gesture event callback.
- /// </summary>
- /// <param name="source">Source which recieved touch event.</param>
- /// <param name="e">Tap gesture event argument.</param>
- /// <since_tizen> 6 </since_tizen>
- /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- protected override void OnTapGestureDetected(object source, TapGestureDetector.DetectedEventArgs e)
- {
- if (isEnabled)
- {
- ClickEventArgs eventArgs = new ClickEventArgs();
- OnClick(eventArgs);
- base.OnTapGestureDetected(source, e);
- }
- }
- /// <summary>
/// Called after a touch event is received by the owning view.<br />
/// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
/// </summary>
{
case PointStateType.Down:
isPressed = true;
- UpdateState();
+ UpdateState(touch);
return true;
case PointStateType.Interrupted:
isPressed = false;
UpdateState();
return true;
case PointStateType.Up:
+ {
+ bool clicked = isPressed && isEnabled;
+
isPressed = false;
+
if (Style.IsSelectable != null && Style.IsSelectable == true)
{
- isSelected = !isSelected;
+ SelectionChangedByTouch = touch;
+ IsSelected = !IsSelected;
}
- UpdateState();
+ else
+ {
+ UpdateState(touch);
+ }
+
+ if (clicked)
+ {
+ ClickEventArgs eventArgs = new ClickEventArgs();
+ OnClickInternal(eventArgs);
+ }
+
return true;
+ }
default:
break;
}
if (null != buttonStyle)
{
- if (null == overlayImage)
- {
- overlayImage = new ImageView()
- {
- WidthResizePolicy = ResizePolicyType.FillToParent,
- HeightResizePolicy = ResizePolicyType.FillToParent
- };
- this.Add(overlayImage);
- }
-
- if (null == buttonText)
- {
- buttonText = new TextLabel();
- this.Add(buttonText);
- }
-
- if (null == buttonIcon)
- {
- buttonIcon = new ImageView();
- this.Add(buttonIcon);
- }
-
- overlayImage.ApplyStyle(buttonStyle.Overlay);
- buttonText.ApplyStyle(buttonStyle.Text);
- buttonIcon.ApplyStyle(buttonStyle.Icon);
+ ButtonOverlayImage?.ApplyStyle(buttonStyle.Overlay);
+ ButtonText?.ApplyStyle(buttonStyle.Text);
+ ButtonIcon?.ApplyStyle(buttonStyle.Icon);
}
}
{
base.OnUpdate();
UpdateUIContent();
+
+ Extension?.OnRelayout(this);
}
/// <summary>
/// Update Button State.
/// </summary>
+ /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
/// <since_tizen> 6 </since_tizen>
/// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
- protected void UpdateState()
+ protected void UpdateState(Touch touchInfo = null)
{
ControlStates sourceState = ControlState;
ControlStates targetState;
targetState = IsSelected ? ControlStates.DisabledSelected : (IsFocused ? ControlStates.DisabledFocused : ControlStates.Disabled);
}
- if(sourceState != targetState)
+ if (SetControlState(targetState, touchInfo))
{
- ControlState = targetState;
-
OnUpdate();
StateChangedEventArgs e = new StateChangedEventArgs
CurrentState = targetState
};
stateChangeHander?.Invoke(this, e);
+
+ Extension?.OnControlStateChanged(this, sourceState, touchInfo);
}
}
/// <since_tizen> 6 </since_tizen>
private void Initialize()
{
- if (null == Style.IconRelativeOrientation) Style.IconRelativeOrientation = IconOrientation.Left;
+ var style = (ButtonStyle)Style;
+
+ Extension = style.CreateExtension();
+
+ CreateComponents();
+
+ if (ButtonOverlayImage != null)
+ {
+ Add(ButtonOverlayImage);
+ ButtonOverlayImage.ApplyStyle(style.Overlay);
+ }
+
+ if (ButtonIcon != null)
+ {
+ Add(ButtonIcon);
+ ButtonIcon.ApplyStyle(style.Icon);
+ ButtonIcon.Relayout += OnIconRelayout;
+ }
+
+ if (null != ButtonText)
+ {
+ Add(ButtonText);
+ ButtonText.ApplyStyle(style.Text);
+ }
+
UpdateState();
+
LayoutDirectionChanged += OnLayoutDirectionChanged;
}
+ private void CreateComponents()
+ {
+ ButtonOverlayImage = CreateOverlayImage();
+ ButtonIcon = CreateIcon();
+ ButtonText = CreateText();
+
+ if (Extension == null)
+ {
+ return;
+ }
+
+ // Update component with extension
+ ButtonOverlayImage = Extension.OnCreateOverlayImage(this, ButtonOverlayImage);
+ ButtonIcon = Extension.OnCreateIcon(this, ButtonIcon);
+ ButtonText = Extension.OnCreateText(this, ButtonText);
+ }
+
/// <summary>
/// Measure text, it can be override.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
protected virtual void MeasureText()
{
- if (Style.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
+ if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
{
return;
}
- buttonText.WidthResizePolicy = ResizePolicyType.Fixed;
- buttonText.HeightResizePolicy = ResizePolicyType.Fixed;
+ ButtonText.WidthResizePolicy = ResizePolicyType.Fixed;
+ ButtonText.HeightResizePolicy = ResizePolicyType.Fixed;
int textPaddingStart = Style.TextPadding.Start;
int textPaddingEnd = Style.TextPadding.End;
int textPaddingTop = Style.TextPadding.Top;
if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
{
- buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
- buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - buttonIcon.SizeHeight;
+ ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
+ ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - ButtonIcon.SizeHeight;
}
else
{
- buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - buttonIcon.SizeWidth;
- buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
+ ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - ButtonIcon.SizeWidth;
+ ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
}
}
/// <summary>
[EditorBrowsable(EditorBrowsableState.Never)]
protected virtual void LayoutChild()
{
- if (Style.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
+ if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
{
return;
}
+ var buttonIcon = ButtonIcon;
+ var buttonText = ButtonText;
+
int textPaddingStart = Style.TextPadding.Start;
int textPaddingEnd = Style.TextPadding.End;
int textPaddingTop = Style.TextPadding.Top;
LayoutChild();
}
- private void OnClick(ClickEventArgs eventArgs)
+ private void OnClickInternal(ClickEventArgs eventArgs)
{
+ OnClick(eventArgs);
+ Extension?.OnClick(this, eventArgs);
ClickEvent?.Invoke(this, eventArgs);
}
public ControlStates CurrentState;
}
+ /// <summary>
+ /// A Selector class that describes Buttons state by actions.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class ActionSelector<T>
+ {
+ /// <summary>
+ /// Value used when the Button is created.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnCreate { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is selected.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnSelect { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is unselected.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnUnselect { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is disabled.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnDisable { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is disabled in selected state.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnDisableSelected { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is pressed.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnPress { get; set; }
+
+ /// <summary>
+ /// Value used when the Button is pressed in selected state.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public T OnPressSelected { get; set; }
+ }
+
+ /// <summary>
+ /// Get current text part to the attached ButtonExtension.
+ /// </summary>
+ /// <remarks>
+ /// It returns null if the passed extension is invaild.
+ /// </remarks>
+ /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+ /// <return>The button's text part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public TextLabel GetCurrentText(ButtonExtension extension)
+ {
+ return (extension == Extension) ? ButtonText : null;
+ }
+
+ /// <summary>
+ /// Get current icon part to the attached ButtonExtension.
+ /// </summary>
+ /// <remarks>
+ /// It returns null if the passed extension is invaild.
+ /// </remarks>
+ /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+ /// <return>The button's icon part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public ImageView GetCurrentIcon(ButtonExtension extension)
+ {
+ return (extension == Extension) ? ButtonIcon : null;
+ }
+
+ /// <summary>
+ /// Get current overlay image part to the attached ButtonExtension.
+ /// </summary>
+ /// <remarks>
+ /// It returns null if the passed extension is invaild.
+ /// </remarks>
+ /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+ /// <return>The button's overlay image part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public ImageView GetCurrentOverlayImage(ButtonExtension extension)
+ {
+ return (extension == Extension) ? ButtonOverlayImage : null;
+ }
}
}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// The ButtonExtension class allows developers to access the Button's components and extend their behavior in various states.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract class ButtonExtension
+ {
+ /// <summary>
+ /// Called immediately after the Button creates the text part.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ /// <param name="text">The created Button's text part.</param>
+ /// <return>The refined button text.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual TextLabel OnCreateText(Button button, TextLabel text)
+ {
+ return text;
+ }
+
+ /// <summary>
+ /// Called immediately after the Button creates the icon part.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ /// <param name="icon">The created Button's icon part.</param>
+ /// <return>The refined button icon.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual ImageView OnCreateIcon(Button button, ImageView icon)
+ {
+ return icon;
+ }
+
+ /// <summary>
+ /// Called immediately after the Button creates the overlay image part.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ /// <param name="overlayImage">The created Button's overlayImage part.</param>
+ /// <return>The refined button overlayImage.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual ImageView OnCreateOverlayImage(Button button, ImageView overlayImage)
+ {
+ return overlayImage;
+ }
+
+ /// <summary>
+ /// Describes actions on Button's ControlStates changed.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ /// <param name="previousState">The previous contol state of the Button.</param>
+ /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo)
+ {
+ }
+
+ /// <summary>
+ /// Called when the Button is Clicked by a user
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ /// <param name="eventArgs">The click event information.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual void OnClick(Button button, Button.ClickEventArgs eventArgs)
+ {
+ }
+
+ /// <summary>
+ /// Called after the size negotiation has been finished for the attached Control.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual void OnRelayout(Button button)
+ {
+ }
+
+ /// <summary>
+ /// Called when the attached Button is explicitly disposing.
+ /// </summary>
+ /// <param name="button">The Button instance that the extension currently applied to.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual void OnDispose(Button button)
+ {
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// LottieButtonExtension is a ButtonExtension class that uses Lottie image for a Button icon.
+ /// <remark>
+ /// This extension must be used within a class implementing LottieButtonStyle.
+ /// </remark>
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class LottieButtonExtension : ButtonExtension
+ {
+ /// <summary>
+ /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieButtonExtension() : base()
+ {
+ LottieView = new LottieAnimationView();
+ }
+
+ /// <summary>
+ /// The Lottie view that will be used as an icon part in a Button.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected LottieAnimationView LottieView { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageView OnCreateIcon(Button button, ImageView icon)
+ {
+ InitializeLottieView(button, LottieView);
+
+ return LottieView;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo)
+ {
+ UpdateLottieView(button, previousState, touchInfo, LottieView);
+ }
+
+ internal static void InitializeLottieView(Button button, LottieAnimationView lottieView)
+ {
+ if (button.Style as ILottieButtonStyle == null)
+ {
+ throw new Exception("LottieButtonExtension must be used within a ILottieButtonStyle or derived class.");
+ }
+
+ var lottieStyle = (ILottieButtonStyle)button.Style;
+ lottieView.URL = lottieStyle.LottieUrl;
+ lottieView.StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame;
+ lottieStyle.LottieFrameInfo.OnCreate?.Show(lottieView, true);
+ }
+
+ internal static void UpdateLottieView(Button button, ControlStates previousState, Touch touchInfo, LottieAnimationView lottieView)
+ {
+ var lottieStyle = (ILottieButtonStyle)button.Style;
+
+ switch (button.ControlState)
+ {
+ case ControlStates.Normal:
+ lottieStyle.LottieFrameInfo?.OnUnselect?.Show(lottieView, previousState == ControlStates.Disabled);
+ break;
+
+ case ControlStates.Focused:
+ lottieStyle.LottieFrameInfo?.OnUnselect?.Show(lottieView, previousState == ControlStates.DisabledFocused);
+ break;
+
+ case ControlStates.Selected:
+ case ControlStates.SelectedFocused:
+ lottieStyle.LottieFrameInfo?.OnSelect?.Show(lottieView);
+ break;
+
+ case ControlStates.Disabled:
+ case ControlStates.DisabledFocused:
+ lottieStyle.LottieFrameInfo?.OnDisable?.Show(lottieView);
+ break;
+
+ case ControlStates.DisabledSelected:
+ lottieStyle.LottieFrameInfo?.OnDisableSelected?.Show(lottieView);
+ break;
+
+ case ControlStates.Pressed:
+ if (button.IsSelected)
+ {
+ lottieStyle.LottieFrameInfo?.OnPressSelected?.Show(lottieView);
+ }
+ else
+ {
+ lottieStyle.LottieFrameInfo?.OnPress?.Show(lottieView);
+ }
+ break;
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// LottieSwitchExtension is a SwitchExtension class that uses Lottie image for a Switch icon.
+ /// <remark>
+ /// This extension must be used within a class implementing LottieSwitchStyle.
+ /// </remark>
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class LottieSwitchExtension : SwitchExtension
+ {
+ /// <summary>
+ /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieSwitchExtension() : base()
+ {
+ LottieView = new LottieAnimationView();
+ }
+
+ /// <summary>
+ /// The Lottie view that will be used as an icon part in a Button.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected LottieAnimationView LottieView { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageView OnCreateIcon(Button button, ImageView icon)
+ {
+ LottieButtonExtension.InitializeLottieView(button, LottieView);
+
+ return LottieView;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo)
+ {
+ LottieButtonExtension.UpdateLottieView(button, previousState, touchInfo, LottieView);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// The SlidingSwitchExtension class makes attached Switch to animate thumb when selected/unselected.
+ /// <remark>
+ /// This extension must be used within a class implementing SwitchStyle.
+ /// </remark>
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal class SlidingSwitchExtension : SwitchExtension
+ {
+ private Animation slidingAnimation;
+
+ public SlidingSwitchExtension() : base()
+ {
+ slidingAnimation = new Animation(100);
+ }
+
+ public override void OnClick(Button button, Button.ClickEventArgs eventArgs)
+ {
+ if (button as Switch == null)
+ {
+ throw new Exception("SlidingSwitchExtension must be used within a SwitchStyle or derived class.");
+ }
+
+ var switchButton = (Switch)button;
+ var track = switchButton.GetCurrentTrack(this);
+ var thumb = switchButton.GetCurrentThumb(this);
+
+ if (track == null || thumb == null || null == slidingAnimation)
+ {
+ return;
+ }
+
+ if (slidingAnimation.State == Animation.States.Playing)
+ {
+ slidingAnimation.Stop();
+ }
+
+ slidingAnimation.Clear();
+ slidingAnimation.AnimateTo(thumb, "PositionX", track.Size.Width - thumb.Size.Width - thumb.Position.X);
+ slidingAnimation.Play();
+ }
+
+ public override void OnDispose(Button button)
+ {
+ if (slidingAnimation != null)
+ {
+ if (slidingAnimation.State == Animation.States.Playing)
+ {
+ slidingAnimation.Stop();
+ }
+ slidingAnimation.Dispose();
+ slidingAnimation = null;
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// The SwitchExtension class allows developers to access the Switch's components and extend their behavior in various states.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract class SwitchExtension : ButtonExtension
+ {
+ internal SwitchExtension() : base()
+ {
+ }
+
+ /// <summary>
+ /// Called immediately after the Switch creates the track part.
+ /// </summary>
+ /// <param name="switchButton">The Switch instance that the extension currently applied to.</param>
+ /// <param name="track">The created Switch's track part.</param>
+ /// <return>The refined switch track.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual ImageView OnCreateTrack(Switch switchButton, ImageView track)
+ {
+ return track;
+ }
+
+ /// <summary>
+ /// Called immediately after the Switch creates the thumb part.
+ /// </summary>
+ /// <param name="switchButton">The Switch instance that the extension currently applied to.</param>
+ /// <param name="thumb">The created Switch's thumb part.</param>
+ /// <return>The refined switch thumb.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual ImageView OnCreateThumb(Switch switchButton, ImageView thumb)
+ {
+ return thumb;
+ }
+ }
+}
/// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
public RadioButton(ButtonStyle buttonStyle) : base(buttonStyle) { }
+
/// <summary>
/// Get RadioButtonGroup to which this selections belong.
/// </summary>
*
*/
using System;
-using Tizen.NUI.BaseComponents;
using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components.Extension;
namespace Tizen.NUI.Components
{
/// <since_tizen> 6 </since_tizen>
public class Switch : Button
{
- private const int aniTime = 100; // will be defined in const file later
- private ImageView trackImage;
- private ImageView thumbImage;
- private Animation handlerAni = null;
static Switch() { }
/// <summary>
}
/// <summary>
+ /// Switch's track part.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected ImageView Track { get; set; }
+
+ /// <summary>
+ /// Switch's thumb part.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected ImageView Thumb { get; set; }
+
+ /// <summary>
+ /// Creates Switch's track part.
+ /// </summary>
+ /// <return>The created Button's icon part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual ImageView CreateTrack()
+ {
+ return new ImageView();
+ }
+
+ /// <summary>
+ /// Creates Switch's overlay thumb part.
+ /// </summary>
+ /// <return>The created Button's overlay image part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual ImageView CreateThumb()
+ {
+ return new ImageView();
+ }
+
+ /// <summary>
/// Dispose Switch and all children on it.
/// </summary>
/// <param name="type">Dispose type.</param>
if (type == DisposeTypes.Explicit)
{
- if (null != handlerAni)
- {
- if (handlerAni.State == Animation.States.Playing)
- {
- handlerAni.Stop();
- }
- handlerAni.Dispose();
- handlerAni = null;
- }
-
- Utility.Dispose(thumbImage);
- Utility.Dispose(trackImage);
+ Utility.Dispose(Thumb);
+ Utility.Dispose(Track);
}
base.Dispose(type);
private void Initialize()
{
Style.IsSelectable = true;
- handlerAni = new Animation(aniTime);
- trackImage = new ImageView()
+
+ CreateComponents();
+
+ if (null != Track)
{
- ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
- PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
- PositionUsesPivotPoint = true,
- WidthResizePolicy = ResizePolicyType.FillToParent,
- HeightResizePolicy = ResizePolicyType.FillToParent,
- Name = "SwitchBackgroundImage",
- };
- Add(trackImage);
- trackImage.ApplyStyle(Style.Track);
-
- thumbImage = new ImageView()
+ Add(Track);
+ Track.ApplyStyle(Style.Track);
+ }
+
+ if (null != Thumb)
{
- ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
- PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
- PositionUsesPivotPoint = true,
- Name = "SwitchHandlerImage",
- };
- trackImage.Add(thumbImage);
- thumbImage.ApplyStyle(Style.Thumb);
+ Add(Thumb);
+ Thumb.ApplyStyle(Style.Thumb);
+ }
+ }
+
+ private void CreateComponents()
+ {
+ Track = CreateTrack();
+ Thumb = CreateThumb();
+
+ if (Extension as SwitchExtension == null)
+ {
+ return;
+ }
+
+ // Update component with extension
+ var extension = (SwitchExtension)Extension;
+ Track = extension.OnCreateTrack(this, Track);
+ Thumb = extension.OnCreateThumb(this, Thumb);
}
/// <summary>
private void OnSelect()
{
- if (handlerAni.State == Animation.States.Playing)
- {
- handlerAni.Stop();
- }
- handlerAni.Clear();
- handlerAni.AnimateTo(thumbImage, "PositionX", Size2D.Width - thumbImage.Size2D.Width - thumbImage.Position2D.X);
- trackImage.Opacity = 0.5f; ///////need defined by UX
- handlerAni.AnimateTo(trackImage, "Opacity", 1);
- handlerAni.Play();
-
if (SelectedEvent != null)
{
SelectEventArgs eventArgs = new SelectEventArgs();
/// <since_tizen> 6 </since_tizen>
public bool IsSelected;
}
+
+ /// <summary>
+ /// Get current track part to the attached SwitchExtension.
+ /// </summary>
+ /// <remarks>
+ /// It returns null if the passed extension is invaild.
+ /// </remarks>
+ /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
+ /// <return>The switch's track part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public ImageView GetCurrentTrack(SwitchExtension extension)
+ {
+ return (extension == Extension) ? Track : null;
+ }
+
+ /// <summary>
+ /// Get current thumb part to the attached SwitchExtension.
+ /// </summary>
+ /// <remarks>
+ /// It returns null if the passed extension is invaild.
+ /// </remarks>
+ /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
+ /// <return>The switch's thumb part.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public ImageView GetCurrentThumb(SwitchExtension extension)
+ {
+ return (extension == Extension) ? Thumb : null;
+ }
}
}
Size = new Size(96, 60),
Track = new ImageViewStyle
{
+ Size = new Size(96, 60),
ResourceUrl = new Selector<string>
{
Normal = DefaultStyle.GetResourcePath("nui_component_default_switch_track_n.png"),
Selected = DefaultStyle.GetResourcePath("nui_component_default_switch_track_s.png"),
Disabled = DefaultStyle.GetResourcePath("nui_component_default_switch_track_d.png"),
DisabledSelected = DefaultStyle.GetResourcePath("nui_component_default_switch_track_ds.png"),
- }
+ },
+ Border = new Rectangle(30, 30, 30, 30),
},
Thumb = new ImageViewStyle
{
- WidthResizePolicy = ResizePolicyType.DimensionDependency,
- HeightResizePolicy = ResizePolicyType.SizeRelativeToParent,
- SizeModeFactor = new Vector3(1, 1, 1),
+ Size = new Size(60, 60),
ResourceUrl = new Selector<string>
{
Normal = DefaultStyle.GetResourcePath("nui_component_default_switch_thumb_n.png"),
* limitations under the License.
*
*/
-using System.Collections.Generic;
using System.ComponentModel;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Binding;
+using Tizen.NUI.Components.Extension;
namespace Tizen.NUI.Components
{
}
}
+ /// <summary>
+ /// Create corresponding ButtonExtension.
+ /// This is to be called by a Button.
+ /// You may override this function to customize button's behavior.
+ /// </summary>
+ /// <return>The new ButtonExtension instance.</return>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public virtual ButtonExtension CreateExtension()
+ {
+ return null;
+ }
+
private void InitSubStyle()
{
Overlay = new ImageViewStyle()
PositionUsesPivotPoint = true,
ParentOrigin = Tizen.NUI.ParentOrigin.Center,
PivotPoint = Tizen.NUI.PivotPoint.Center,
- WidthResizePolicy = ResizePolicyType.FitToChildren,
- HeightResizePolicy = ResizePolicyType.FitToChildren,
};
Icon.PropertyChanged += SubStyleCalledEvent;
+
+ IconRelativeOrientation = Button.IconOrientation.Left;
}
private void SubStyleCalledEvent(object sender, global::System.EventArgs e)
--- /dev/null
+/*
+ * Copyright(c) 2019 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// Interface that provides style properties for Lottie playing in Button.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public interface ILottieButtonStyle
+ {
+ /// <summary>
+ /// Get/Set Lottie resource url.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ string LottieUrl { get; set; }
+
+ /// <summary>
+ /// Get/Set LottieFrameInfo on various action states of attached Button.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Button.ActionSelector<LottieFrameInfo> LottieFrameInfo { get; set; }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// LottieButtonStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class LottieButtonStyle : ButtonStyle, ILottieButtonStyle
+ {
+ static LottieButtonStyle()
+ {
+ }
+
+ /// <summary>
+ /// Create new instance of a LottieButtonStyle.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieButtonStyle() : base()
+ {
+ }
+
+ /// <summary>
+ /// Copy constructor.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieButtonStyle(LottieButtonStyle style) : base(style)
+ {
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public string LottieUrl { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Button.ActionSelector<LottieFrameInfo> LottieFrameInfo { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void CopyFrom(BindableObject bindableObject)
+ {
+ base.CopyFrom(bindableObject);
+
+ LottieButtonStyle style = bindableObject as LottieButtonStyle;
+
+ if (style == null)
+ {
+ return;
+ }
+
+ LottieUrl = style.LottieUrl;
+ LottieFrameInfo = style.LottieFrameInfo;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ButtonExtension CreateExtension()
+ {
+ return new LottieButtonExtension();
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Components.Extension
+{
+ /// <summary>
+ /// LottieSwitchStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class LottieSwitchStyle : SwitchStyle, ILottieButtonStyle
+ {
+ static LottieSwitchStyle()
+ {
+ }
+
+ /// <summary>
+ /// Create new instance of a LottieButtonStyle.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieSwitchStyle() : base()
+ {
+ }
+
+ /// <summary>
+ /// Copy constructor.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieSwitchStyle(LottieSwitchStyle style) : base(style)
+ {
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public string LottieUrl { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Button.ActionSelector<LottieFrameInfo> LottieFrameInfo { get; set; }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void CopyFrom(BindableObject bindableObject)
+ {
+ base.CopyFrom(bindableObject);
+
+ LottieSwitchStyle style = bindableObject as LottieSwitchStyle;
+
+ if (style == null)
+ {
+ return;
+ }
+
+ LottieUrl = style.LottieUrl;
+ LottieFrameInfo = style.LottieFrameInfo;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ButtonExtension CreateExtension()
+ {
+ return new LottieSwitchExtension();
+ }
+
+ private void InitSubStyle()
+ {
+ }
+ }
+}
using System.ComponentModel;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Binding;
+using Tizen.NUI.Components.Extension;
namespace Tizen.NUI.Components
{
}
}
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ButtonExtension CreateExtension()
+ {
+ return new SlidingSwitchExtension();
+ }
+
private void InitSubStyle()
{
Track = new ImageViewStyle()
/// StyleManager static instance.
/// </summary>
/// <since_tizen> 8 </since_tizen>
- public static StyleManager Instance { get; } = new StyleManager();
+ public static StyleManager Instance { get; internal set; } = new StyleManager();
/// <summary>
/// Style theme.
<ItemGroup>
<ProjectReference Include="..\Tizen.Applications.Common\Tizen.Applications.Common.csproj" />
<ProjectReference Include="..\Tizen.NUI\Tizen.NUI.csproj" />
+ <ProjectReference Include="..\Tizen.NUI.Components\Tizen.NUI.Components.csproj" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <None Update="res\*.json">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
</ItemGroup>
</Project>
\ No newline at end of file
--- /dev/null
+{"v":"5.6.6","fr":60,"ip":0,"op":40,"w":76,"h":76,"nm":"Basic/03_CONTROLLERS/Check_on","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Left_Arrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-45,"ix":10},"p":{"a":0,"k":[30.125,50.375,0],"ix":2},"a":{"a":0,"k":[-18.729,9.537,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"t":27,"s":[100,0,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-18.5,0.875],"ix":2},"a":{"a":0,"k":[0.125,0.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Right_Arrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[28.188,52.687,0],"ix":2},"a":{"a":0,"k":[-18.11,12.984,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"t":27,"s":[100,0,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,44],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-18.125,-8.875],"ix":2},"a":{"a":0,"k":[0.125,0.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Arrow","td":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38,38,0],"ix":2},"a":{"a":0,"k":[38,38,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":76,"h":76,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Circle_BG 2","tt":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[100]},{"t":38,"s":[0]}],"ix":11,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.5,41,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[67,67],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.592156887054,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-3.562,-3.062],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[113.244,113.244],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.125,40.875,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[72,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.631372570992,0.631372570992,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1.562,-3.188],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
--- /dev/null
+{"v":"5.6.6","fr":60,"ip":0,"op":26,"w":64,"h":64,"nm":"[Watch2018] RadioButtonVI_360_json_64x64","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"checkbox_center_circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":210.16,"s":[100]},{"t":222.2265625,"s":[0]}],"ix":11,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n var i = 0;\n for (; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.625,32.625,0],"ix":2},"a":{"a":0,"k":[126.125,0.875,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[40,40,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[40,40,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":210.16,"s":[100,100,100]},{"t":222.2265625,"s":[40,40,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n var i = 0;\n for (; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.301960796118,0.811764717102,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960796118,0.678431391716,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.125,0.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":459.535523150194,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Outline","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-94.625,30.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[58,58],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.501960813999,0.501960813999,0.501960813999,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0.301960796118,0.678431391716,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0.301960796118,0.678431391716,1,1]},{"t":25,"s":[0.501960813999,0.501960813999,0.501960813999,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.164090722799,0.164090722799,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126,2.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":459.535101979252,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
--- /dev/null
+{"v":"5.6.6","fr":60,"ip":0,"op":37,"w":86,"h":86,"nm":"Switch_onoff_json","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Switch_Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[18.5,44.25,0],"to":[4.979,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[48.375,44.25,0],"to":[0,0,0],"ti":[4.979,0,0]},{"t":36,"s":[18.5,44.25,0]}],"ix":2,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[52,52],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.75,-1.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Switch_RoundRect_BG","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43,43,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[115,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.631372570992,0.631372570992,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":4,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"t":36,"s":[0]}],"ix":5,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[161.453,161.453],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Switch_RoundRect_BG_Outline","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43,43,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[115,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[161.453,161.453],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using Tizen.NUI.Components.Extension;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// Describes Button Animation used in OneUI_Watch2.X
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class OverlayAnimationButtonStyle : ButtonStyle
+ {
+ /// <summary>
+ /// Constructor
+ /// </summary>
+ public OverlayAnimationButtonStyle() : base()
+ {
+ CornerRadius = 10;
+ BackgroundColor = new Color(0.3f, 0.3f, 0.3f, 0.5f);
+ // PositionUsesPivotPoint = true;
+ IconRelativeOrientation = Button.IconOrientation.Top;
+ Text = new TextLabelStyle
+ {
+ FontFamily = "SamsungOne 700",
+ PixelSize = 20,
+ TextColor = new Selector<Color>
+ {
+ Normal = new Color(1, 1, 1, 0.70f),
+ Pressed = new Color(1, 1, 1, 0.60f),
+ Disabled = new Color(1, 1, 1, 0.40f),
+ },
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+ Icon = new ImageViewStyle
+ {
+ WidthResizePolicy = ResizePolicyType.SizeRelativeToParent,
+ HeightResizePolicy = ResizePolicyType.SizeRelativeToParent,
+ SizeModeFactor = new Vector3(0.35f, 0.35f, 0.35f),
+ Opacity = new Selector<float?>
+ {
+ Normal = 0.7f,
+ Pressed = 0.5f
+ }
+ };
+ Opacity = new Selector<float?>
+ {
+ Disabled = 0.3f,
+ Other = 1.0f
+ };
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ButtonExtension CreateExtension()
+ {
+ return new OverlayAnimationButtonExtension();
+ }
+ }
+
+ /// <summary>
+ /// OverlayAnimationButtonExtension class is a extended ButtonExtension class that make the overlay image blinking on a Button pressed.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class OverlayAnimationButtonExtension : ButtonExtension
+ {
+ private Animation PressAnimation { get; set; }
+
+ /// <summary>
+ /// Creates a new instance of a OverlayAnimationButtonExtension.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public OverlayAnimationButtonExtension() : base()
+ {
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageView OnCreateOverlayImage(Button button, ImageView overlayImage)
+ {
+ overlayImage.Hide();
+
+ return overlayImage;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo)
+ {
+ if (button.ControlState != ControlStates.Pressed)
+ {
+ return;
+ }
+
+ var overlayImage = button.GetCurrentOverlayImage(this);
+
+ if (overlayImage == null)
+ {
+ return;
+ }
+
+ if (null == PressAnimation)
+ {
+ var keyFrames = new KeyFrames();
+ keyFrames.Add(0.0f, 0.0f);
+ keyFrames.Add(0.25f, 1.0f, new AlphaFunction(AlphaFunction.BuiltinFunctions.Linear));
+ keyFrames.Add(1.0f, 0.0f, new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOut));
+
+ PressAnimation = new Animation(400);
+ PressAnimation.EndAction = Animation.EndActions.StopFinal;
+ PressAnimation.AnimateBetween(overlayImage, "Opacity", keyFrames);
+ PressAnimation.AnimateTo(overlayImage, "Scale", new Vector3(1, 1, 1), 0, 300, new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOut));
+ }
+
+ if (PressAnimation.State == Animation.States.Playing)
+ {
+ PressAnimation.Stop();
+ overlayImage.Hide();
+ }
+
+ overlayImage.Opacity = 0.0f;
+ overlayImage.CornerRadius = button.CornerRadius;
+ overlayImage.Background = button.Background;
+ overlayImage.Size = button.Size;
+ overlayImage.Scale = new Vector3(0.86f, 0.86f, 1);
+ overlayImage.Show();
+
+ PressAnimation.Play();
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void OnDispose(Button button)
+ {
+ if (PressAnimation == null)
+ {
+ return;
+ }
+
+ if (PressAnimation.State == Animation.States.Playing)
+ {
+ PressAnimation.Stop();
+ }
+ PressAnimation.Dispose();
+ PressAnimation = null;
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// A predefined style class for Wearable buttons.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class WearableButtonStyle : ButtonStyle
+ {
+ /// <summary>
+ /// Creates a new class instance.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public WearableButtonStyle() : base()
+ {
+ Size = new Size(210, 72);
+ CornerRadius = 36;
+ BackgroundColor = new Selector<Color>
+ {
+ Normal = new Color(0, 42f/255f, 77f/255f, 0.85f),
+ Pressed = new Color(0, 70f/255f, 128f/255f, 0.70f),
+ Disabled = new Color(61f/255f, 61f/255f, 61f/255f, 0.85f),
+ };
+ Text = new TextLabelStyle
+ {
+ FontFamily = "SamsungOne 700",
+ PixelSize = 28,
+ TextColor = new Selector<Color>
+ {
+ Normal = new Color(56f/255f, 164f/255f, 252f/255f, 1),
+ Pressed = new Color(56f/255f, 164f/255f, 252f/255f, 1),
+ Disabled = new Color(1, 1, 1, 0.35f),
+ },
+ Padding = new Extents(20, 20, 0, 0),
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ };
+ Opacity = new Selector<float?>
+ {
+ Other = 1.0f,
+ Pressed = 0.6f,
+ Disabled = 0.3f,
+ };
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using Tizen.NUI.Components.Extension;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// A predefined style class for Wearable check boxes.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class WearableCheckBoxStyle : LottieButtonStyle
+ {
+ /// <summary>
+ /// Creates a new class instance.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public WearableCheckBoxStyle() : base()
+ {
+ LottieUrl = WearableStyle.GetResourcePath("nui_wearable_checkbox_icon.json");
+ LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+ {
+ OnSelect = (0, 18),
+ OnUnselect = (19, 36)
+ };
+ Opacity = new Selector<float?>
+ {
+ Other = 1.0f,
+ Pressed = 0.6f,
+ Disabled = 0.3f,
+ };
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using Tizen.NUI.Components.Extension;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// A predefined style class for Wearable radio buttons.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class WearableRadioButtonStyle : LottieButtonStyle
+ {
+ /// <summary>
+ /// Creates a new class instance.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public WearableRadioButtonStyle() : base()
+ {
+ LottieUrl = WearableStyle.GetResourcePath("nui_wearable_radiobutton_icon.json");
+ LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+ {
+ OnSelect = (0, 12),
+ OnUnselect = (13, 25)
+ };
+ Opacity = new Selector<float?>
+ {
+ Other = 1.0f,
+ Pressed = 0.6f,
+ Disabled = 0.3f,
+ };
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class WearableStyle
+ {
+ static internal string GetResourcePath(string filename)
+ {
+ return "/usr/share/dotnet.tizen/framework/res/" + filename;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using Tizen.NUI.Components.Extension;
+
+namespace Tizen.NUI.Wearable
+{
+ /// <summary>
+ /// A predefined style class for Wearable switches.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class WearableSwitchStyle : LottieSwitchStyle
+ {
+ /// <summary>
+ /// Creates a new class instance.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public WearableSwitchStyle() : base()
+ {
+ LottieUrl = WearableStyle.GetResourcePath("nui_wearable_switch_icon.json");
+ LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+ {
+ OnSelect = (0, 18),
+ OnUnselect = (19, 36)
+ };
+ Opacity = new Selector<float?>
+ {
+ Other = 1.0f,
+ Pressed = 0.6f,
+ Disabled = 0.3f,
+ };
+ }
+ }
+}
using Tizen.NUI;
[assembly: InternalsVisibleTo("Tizen.NUI.Design, Publickey=0024000004800000940000000602000000240000525341310004000001000100d115b1004248416b12d21b626cfb17149c9303fe394693fd3b32d7872e89559a4fa96c98110c2e62eea48aca693bddbe17094ca8ea2e2cd79970ca590fb672b9b371b5d7002076817321f62d6483ea50c56dbd1f37b185a4c24c47718876e6ae6d266508c551170d4cbdda3f82edaff9405ee3d7857282d8269e8e518d2f0fb2")]
+[assembly: InternalsVisibleTo("Tizen.NUI.Components, Publickey=0024000004800000940000000602000000240000525341310004000001000100d115b1004248416b12d21b626cfb17149c9303fe394693fd3b32d7872e89559a4fa96c98110c2e62eea48aca693bddbe17094ca8ea2e2cd79970ca590fb672b9b371b5d7002076817321f62d6483ea50c56dbd1f37b185a4c24c47718876e6ae6d266508c551170d4cbdda3f82edaff9405ee3d7857282d8269e8e518d2f0fb2")]
// Xamarin.Forms.Loader.dll Xamarin.Forms.Xaml.XamlLoader.Load(object, string), kzu@microsoft.com
[assembly: XmlnsDefinition("http://tizen.org/Tizen.NUI/2018/XAML", "Tizen.NUI")]
}
#endregion Private
}
+
+ /// <summary>
+ /// A class containing frame informations for a LottieAnimationView.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class LottieFrameInfo
+ {
+ /// <summary>
+ /// Creates a new instance with a playing range.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieFrameInfo(int startFrame, int endFrame)
+ {
+ StartFrame = startFrame;
+ EndFrame = endFrame;
+ }
+
+ /// <summary>
+ /// Creates a new instance with a still image frame.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public LottieFrameInfo(int stillImageFrame) : this(stillImageFrame, stillImageFrame)
+ {
+ }
+
+ /// <summary>
+ /// Create a new instance from a pair notation.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static implicit operator LottieFrameInfo((int, int) pair)
+ {
+ return new LottieFrameInfo(pair.Item1, pair.Item2);
+ }
+
+ /// <summary>
+ /// Create a new instance from an int value.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static implicit operator LottieFrameInfo(int stillImageFrame)
+ {
+ return new LottieFrameInfo(stillImageFrame);
+ }
+
+ /// <summary>
+ /// The start frame of the lottie animation.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int StartFrame { get; }
+
+ /// <summary>
+ /// The end frame of the lottie animation.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int EndFrame { get; }
+
+ /// <summary>
+ /// Create LottieFrameInfo struct with animation range information
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static LottieFrameInfo CreateAnimationRange(int startFrame, int endFrame)
+ {
+ return new LottieFrameInfo(startFrame, endFrame);
+ }
+
+ /// <summary>
+ /// Create LottieFrameInfo struct with still image information
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static LottieFrameInfo CreateStillImage(int stillImageFrame)
+ {
+ return new LottieFrameInfo(stillImageFrame, stillImageFrame);
+ }
+
+ internal bool IsStillImage()
+ {
+ return StartFrame == EndFrame;
+ }
+
+ internal void Show(LottieAnimationView lottieView, bool noPlay = false)
+ {
+ if (!BeReadyToShow(lottieView))
+ {
+ return;
+ }
+
+ lottieView.SetMinMaxFrame(StartFrame, Math.Min(EndFrame, lottieView.TotalFrame - 1));
+ lottieView.CurrentFrame = StartFrame;
+
+ if (!noPlay && !IsStillImage())
+ {
+ lottieView.Play();
+ }
+ }
+
+ private bool BeReadyToShow(LottieAnimationView lottieView)
+ {
+ // Validate input lottieView
+ if (null== lottieView || lottieView.PlayState == LottieAnimationView.PlayStateType.Invalid)
+ {
+ return false;
+ }
+
+ // Stop if it was playing
+ if (lottieView.PlayState == LottieAnimationView.PlayStateType.Playing)
+ {
+ lottieView.Stop();
+ }
+
+ return true;
+ }
+ }
}
\ No newline at end of file
case ControlStates.DisabledFocused:
return DisabledFocused != null? DisabledFocused : Other;
case ControlStates.DisabledSelected:
- return DisabledSelected != null? DisabledSelected : Other;
+ return DisabledSelected != null ? DisabledSelected : (Disabled != null ? Disabled : Other);
case ControlStates.SelectedFocused:
- return SelectedFocused != null ? SelectedFocused : Other;
+ return SelectedFocused != null ? SelectedFocused : (Selected != null ? Selected : Other);
default:
return Other;
}
set => SetValue(CornerRadiusProperty, value);
}
+ internal ViewStyle CreateInstance()
+ {
+ return (ViewStyle)Activator.CreateInstance(GetType());;
+ }
+
+ internal ViewStyle Clone()
+ {
+ var cloned = CreateInstance();
+ cloned.CopyFrom(this);
+
+ return cloned;
+ }
+
private void OnPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
{
Padding = new Extents(start, end, top, bottom);
internal View(global::System.IntPtr cPtr, bool cMemoryOwn, ViewStyle viewStyle, bool shown = true) : this(cPtr, cMemoryOwn, shown)
{
- this.ViewStyle.CopyFrom(viewStyle);
+ if (this.viewStyle == null)
+ {
+ ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle.Clone());
+ }
+ else
+ {
+ this.viewStyle.CopyFrom(viewStyle);
+ }
}
internal View(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.View.View_SWIGUpcast(cPtr), cMemoryOwn)
}
set
{
- if (controlStates != value)
- {
- controlStates = value;
+ SetControlState(value, null);
+ }
+ }
- ControlStateChangeEvent?.Invoke(this, value);
+ /// <summary>
+ /// Set ControlState with specified change environment
+ /// </summary>
+ /// <param name="state">New state value</param>
+ /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+ /// <return>True, if the state changed successfully.</return>
+ internal bool SetControlState(ControlStates state, Touch touchInfo)
+ {
+ if (controlStates == state)
+ {
+ return false;
+ }
- if (true == OnControlStateChanged(value))
- {
- foreach (View child in Children)
- {
- child.ControlState = value;
- }
- }
+ var prevState = controlStates;
+
+ controlStates = state;
+
+ ControlStateChangeEvent?.Invoke(this, state);
+
+ if (OnControlStateChanged(prevState, touchInfo))
+ {
+ foreach (View child in Children)
+ {
+ child.SetControlState(state, touchInfo);
}
}
+
+ return true;
}
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
return new ViewStyle();
}
- /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+ /// <summary>
+ /// Called after the View's ControlStates changed.
+ /// </summary>
+ /// <param name="previousState">The previous state value</param>
+ /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+ /// <return>True if it needs to apply the state to children recursively.</return>
[EditorBrowsable(EditorBrowsableState.Never)]
- protected virtual bool OnControlStateChanged(ControlStates currentState)
+ protected virtual bool OnControlStateChanged(ControlStates previousState, Touch touchInfo)
{
//If need to apply the state to all child, return true;
return true;
}
+
internal static readonly BindableProperty BackgroundImageSelectorProperty = BindableProperty.Create("BackgroundImageSelector", typeof(Selector<string>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
{
var view = (View)bindable;