Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index c423d09..6ffcb9b 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -211,6 +211,7 @@
<item name="android:enforceNavigationBarContrast">false</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowShowWallpaper">false</item>
</style>
<!--
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
index c0e921e..ea6d82b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
@@ -23,7 +23,6 @@
import android.graphics.Path
import android.graphics.RectF
import com.android.app.animation.Interpolators
-import com.android.internal.policy.ScreenDecorationsUtils
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.Utilities.mapRange
@@ -98,12 +97,9 @@
shadowAlpha = LIGHT_THEME_SHADOW_ALPHA
}
- if (context.areDesktopTasksVisible()) {
- fullCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
- cornerRadius = fullCornerRadius
- } else {
- fullCornerRadius = context.cornerRadius.toFloat()
- cornerRadius = fullCornerRadius
+ fullCornerRadius = context.cornerRadius.toFloat()
+ cornerRadius = fullCornerRadius
+ if (!context.areDesktopTasksVisible()) {
setCornerRoundness(MAX_ROUNDNESS)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 0807ee9..7ab9ef3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -749,4 +749,9 @@
private final DeviceProfile.OnDeviceProfileChangeListener mDebugActivityDeviceProfileChanged =
dp -> debugWhyTaskbarNotDestroyed("mActivity onDeviceProfileChanged");
+
+ @VisibleForTesting
+ public Context getWindowContext() {
+ return mContext;
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index d842138..d13e0c4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -997,10 +997,9 @@
}
}
- /** Marks as should show education and shows the bubble bar in a collapsed state */
+ /** Marks as should show education. */
public void prepareToShowEducation() {
mShouldShowEducation = true;
- mBubbleStashController.showBubbleBar(false /* expand the bubbles */);
}
/**
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 34d9a68..1baba74 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -304,7 +304,7 @@
mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
mDepthController = new DepthController(this);
- if (DesktopModeStatus.canEnterDesktopMode(this)) {
+ if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(this)) {
mSplitSelectStateController.initSplitFromDesktopController(this,
overviewComponentObserver);
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
index 096f879..cd4e78b 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
@@ -37,6 +37,7 @@
import com.android.quickstep.AllAppsActionManager
import java.lang.reflect.Field
import java.lang.reflect.ParameterizedType
+import java.util.Locale
import java.util.Optional
import org.junit.Assume.assumeTrue
import org.junit.rules.TestRule
@@ -119,6 +120,15 @@
}
}
+ if (description.getAnnotation(ForceRtl::class.java) != null) {
+ // Needs to be set on window context instead of sandbox context, because it does
+ // does not propagate between them. However, this change will impact created
+ // TaskbarActivityContext instances, since they wrap the window context.
+ taskbarManager.windowContext.resources.configuration.setLayoutDirection(
+ RTL_LOCALE
+ )
+ }
+
try {
TaskbarViewController.enableModelLoadingForTests(false)
@@ -191,4 +201,11 @@
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
annotation class NavBarKidsMode
+
+ /** Forces RTL UI for tests. */
+ @Retention(AnnotationRetention.RUNTIME)
+ @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+ annotation class ForceRtl
}
+
+private val RTL_LOCALE = Locale.of("ar", "XB")
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
index 7daa142..b8b0b5d 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
@@ -19,11 +19,13 @@
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Utilities
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarKeyguardController
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarStashController
import com.android.launcher3.taskbar.bubbles.BubbleBarController
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.NavBarKidsMode
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
@@ -197,6 +199,14 @@
}
}
+ @Test
+ fun testForceRtlAnnotation_setsActivityContextLayoutDirection() {
+ @ForceRtl class Rtl
+ onSetup(description = Description.createSuiteDescription(Rtl::class.java)) {
+ assertThat(Utilities.isRtl(activityContext.resources)).isTrue()
+ }
+ }
+
/**
* Executes [runTest] after the [testRule] setup phase completes.
*
diff --git a/res/drawable/all_apps_tabs_background_selected.xml b/res/drawable/all_apps_tabs_background_selected.xml
index 47f95dd..6560632 100644
--- a/res/drawable/all_apps_tabs_background_selected.xml
+++ b/res/drawable/all_apps_tabs_background_selected.xml
@@ -15,10 +15,10 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:bottom="@dimen/all_apps_tabs_focus_width"
- android:end="@dimen/all_apps_tabs_focus_width"
- android:start="@dimen/all_apps_tabs_focus_width"
- android:top="@dimen/all_apps_tabs_focus_width">
+ android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+ android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:top="@dimen/all_apps_tabs_focus_vertical_inset">
<shape android:shape="rectangle">
<corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
<solid android:color="?attr/materialColorPrimary" />
diff --git a/res/drawable/all_apps_tabs_background_unselected.xml b/res/drawable/all_apps_tabs_background_unselected.xml
index ab592a8..ce7b334 100644
--- a/res/drawable/all_apps_tabs_background_unselected.xml
+++ b/res/drawable/all_apps_tabs_background_unselected.xml
@@ -15,10 +15,10 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:bottom="@dimen/all_apps_tabs_focus_width"
- android:end="@dimen/all_apps_tabs_focus_width"
- android:start="@dimen/all_apps_tabs_focus_width"
- android:top="@dimen/all_apps_tabs_focus_width">
+ android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+ android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:top="@dimen/all_apps_tabs_focus_vertical_inset">
<shape android:shape="rectangle">
<corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
<solid android:color="?attr/materialColorSurfaceBright" />
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index ecc5a14..b6a8ed8 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -21,8 +21,6 @@
android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
android:layout_gravity="center_horizontal"
- android:paddingTop="@dimen/all_apps_tabs_vertical_padding_focus"
- android:paddingBottom="@dimen/all_apps_tabs_vertical_padding_focus"
android:layout_marginTop="@dimen/all_apps_tabs_margin_top"
android:orientation="horizontal"
style="@style/TextHeadline"
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 8bd25dd..535d61f 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -210,10 +210,10 @@
<attr name="layout_sticky" format="boolean" />
</declare-styleable>
- <declare-styleable name="NumRows">
+ <declare-styleable name="GridDimension">
<attr name="minDeviceWidthPx" format="float"/>
<attr name="minDeviceHeightPx" format="float"/>
- <attr name="numRowsNew" format="integer"/>
+ <attr name="numGridDimension" format="integer"/>
<attr name="dbFile" />
<attr name="defaultLayoutId"/>
<attr name="demoModeLayoutId"/>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 61d99d7..0d4e79b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -125,9 +125,8 @@
<dimen name="all_apps_work_profile_tab_footer_top_padding">16dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_bottom_padding">20dp</dimen>
<dimen name="all_apps_tabs_button_horizontal_padding">4dp</dimen>
- <dimen name="all_apps_tabs_vertical_padding">6dp</dimen>
- <dimen name="all_apps_tabs_vertical_padding_focus">1dp</dimen>
- <dimen name="all_apps_tabs_focus_width">5dp</dimen>
+ <dimen name="all_apps_tabs_focus_horizontal_inset">5dp</dimen>
+ <dimen name="all_apps_tabs_focus_vertical_inset">6dp</dimen>
<dimen name="all_apps_tabs_focus_border">3dp</dimen>
<dimen name="all_apps_tabs_focus_padding">2dp</dimen>
<dimen name="all_apps_tabs_margin_top">8dp</dimen>
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 3d715e5..867bf98 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -41,8 +41,11 @@
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.dragndrop.DragView;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.views.ActivityContext;
+import com.google.android.msdl.data.model.MSDLToken;
+
/**
* Implements a DropTarget.
*/
@@ -62,6 +65,7 @@
protected final ActivityContext mActivityContext;
protected final DropTargetHandler mDropTargetHandler;
protected DropTargetBar mDropTargetBar;
+ private final MSDLPlayerWrapper mMSDLPlayerWrapper;
/** Whether this drop target is active for the current drag */
protected boolean mActive;
@@ -94,6 +98,7 @@
super(context, attrs, defStyle);
mActivityContext = ActivityContext.lookupContext(context);
mDropTargetHandler = mActivityContext.getDropTargetHandler();
+ mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context);
Resources resources = getResources();
mDragDistanceThreshold = resources.getDimensionPixelSize(R.dimen.drag_distanceThreshold);
@@ -142,6 +147,10 @@
@Override
public final void onDragEnter(DragObject d) {
+ // Perform Haptic feedback
+ if (Flags.msdlFeedback()) {
+ mMSDLPlayerWrapper.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR);
+ }
if (!mAccessibleDrag && !mTextVisible) {
// Show tooltip
hideTooltip();
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index e18862a..e1d84be 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -651,14 +651,14 @@
}
/**
- * Parses through the xml to find NumRows specs. Then calls findBestRowCount to get the correct
- * row count for this GridOption.
+ * Parses through the xml to find GridDimension specs. Then calls findBestRowCount to get the
+ * correct row count for this GridOption.
*
* @return the result of {@link #findBestRowCount(List, Info)}.
*/
- public static NumRows getRowCount(ResourceHelper resourceHelper, Context context,
+ public static GridDimension getRowCount(ResourceHelper resourceHelper, Context context,
Info displayInfo) {
- ArrayList<NumRows> rowCounts = new ArrayList<>();
+ ArrayList<GridDimension> rowCounts = new ArrayList<>();
try (XmlResourceParser parser = resourceHelper.getXml()) {
final int depth = parser.getDepth();
@@ -666,8 +666,8 @@
while (((type = parser.next()) != XmlPullParser.END_TAG
|| parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
if ((type == XmlPullParser.START_TAG)
- && "NumRows".equals(parser.getName())) {
- rowCounts.add(new NumRows(context, Xml.asAttributeSet(parser)));
+ && "GridDimension".equals(parser.getName())) {
+ rowCounts.add(new GridDimension(context, Xml.asAttributeSet(parser)));
}
}
} catch (IOException | XmlPullParserException e) {
@@ -678,10 +678,10 @@
}
/**
- * @return the biggest row count that fits the display dimensions spec using NumRows to
+ * @return the biggest row count that fits the display dimensions spec using GridDimension to
* determine that. If no best row count is found, return -1.
*/
- public static NumRows findBestRowCount(List<NumRows> list, Info displayInfo) {
+ public static GridDimension findBestRowCount(List<GridDimension> list, Info displayInfo) {
int minWidthPx = Integer.MAX_VALUE;
int minHeightPx = Integer.MAX_VALUE;
for (WindowBounds bounds : displayInfo.supportedBounds) {
@@ -700,10 +700,10 @@
}
}
- NumRows selectedRow = null;
- for (NumRows item: list) {
+ GridDimension selectedRow = null;
+ for (GridDimension item: list) {
if (minWidthPx >= item.mMinDeviceWidthPx && minHeightPx >= item.mMinDeviceHeightPx) {
- if (selectedRow == null || selectedRow.mNumRowsNew < item.mNumRowsNew) {
+ if (selectedRow == null || selectedRow.mNumGridDimension < item.mNumGridDimension) {
selectedRow = item;
}
}
@@ -1045,8 +1045,8 @@
mIsDualGrid = a.getBoolean(R.styleable.GridDisplayOption_isDualGrid, false);
if (mRowCountSpecsId != INVALID_RESOURCE_HANDLE) {
ResourceHelper resourceHelper = new ResourceHelper(context, mRowCountSpecsId);
- NumRows numR = getRowCount(resourceHelper, context, displayInfo);
- numRows = numR.mNumRowsNew;
+ GridDimension numR = getRowCount(resourceHelper, context, displayInfo);
+ numRows = numR.mNumGridDimension;
dbFile = numR.mDbFile;
defaultLayoutId = numR.mDefaultLayoutId;
demoModeLayoutId = numR.mDemoModeLayoutId;
@@ -1235,8 +1235,8 @@
}
}
- public static final class NumRows {
- final int mNumRowsNew;
+ public static final class GridDimension {
+ final int mNumGridDimension;
final float mMinDeviceWidthPx;
final float mMinDeviceHeightPx;
final String mDbFile;
@@ -1244,17 +1244,17 @@
final int mDemoModeLayoutId;
- NumRows(Context context, AttributeSet attrs) {
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumRows);
+ GridDimension(Context context, AttributeSet attrs) {
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridDimension);
- mNumRowsNew = (int) a.getFloat(R.styleable.NumRows_numRowsNew, 0);
- mMinDeviceWidthPx = a.getFloat(R.styleable.NumRows_minDeviceWidthPx, 0);
- mMinDeviceHeightPx = a.getFloat(R.styleable.NumRows_minDeviceHeightPx, 0);
- mDbFile = a.getString(R.styleable.NumRows_dbFile);
+ mNumGridDimension = (int) a.getFloat(R.styleable.GridDimension_numGridDimension, 0);
+ mMinDeviceWidthPx = a.getFloat(R.styleable.GridDimension_minDeviceWidthPx, 0);
+ mMinDeviceHeightPx = a.getFloat(R.styleable.GridDimension_minDeviceHeightPx, 0);
+ mDbFile = a.getString(R.styleable.GridDimension_dbFile);
mDefaultLayoutId = a.getResourceId(
- R.styleable.NumRows_defaultLayoutId, 0);
+ R.styleable.GridDimension_defaultLayoutId, 0);
mDemoModeLayoutId = a.getResourceId(
- R.styleable.NumRows_demoModeLayoutId, mDefaultLayoutId);
+ R.styleable.GridDimension_demoModeLayoutId, mDefaultLayoutId);
a.recycle();
}
diff --git a/src/com/android/launcher3/util/MSDLPlayerWrapper.java b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
index 1e53ac1..aab7009 100644
--- a/src/com/android/launcher3/util/MSDLPlayerWrapper.java
+++ b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
@@ -28,6 +28,9 @@
import com.google.android.msdl.data.model.MSDLToken;
import com.google.android.msdl.domain.InteractionProperties;
import com.google.android.msdl.domain.MSDLPlayer;
+import com.google.android.msdl.logging.MSDLEvent;
+
+import java.util.List;
import javax.inject.Inject;
@@ -58,4 +61,8 @@
public void playToken(MSDLToken token) {
mMSDLPlayer.playToken(token, null);
}
+
+ public List<MSDLEvent> getHistory() {
+ return mMSDLPlayer.getHistory();
+ }
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index f8794f8..c4519eb 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -168,7 +168,6 @@
isLandscape: Boolean = false,
isGestureMode: Boolean = true,
isFolded: Boolean = false,
- isFixedLandscape: Boolean = false,
) {
val (unfoldedNaturalX, unfoldedNaturalY) = deviceSpecUnfolded.naturalSize
val unfoldedWindowsBounds =
@@ -195,7 +194,6 @@
rotation = if (isLandscape) Surface.ROTATION_90 else Surface.ROTATION_0,
isGestureMode = isGestureMode,
densityDpi = deviceSpecFolded.densityDpi,
- isFixedLandscape = isFixedLandscape,
)
} else {
initializeCommonVars(
@@ -204,7 +202,6 @@
rotation = if (isLandscape) Surface.ROTATION_0 else Surface.ROTATION_90,
isGestureMode = isGestureMode,
densityDpi = deviceSpecUnfolded.densityDpi,
- isFixedLandscape = isFixedLandscape,
)
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
index 46e66e4..42374a5 100644
--- a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
@@ -1,20 +1,29 @@
package com.android.launcher3
import android.content.Context
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.Utilities.*
+import com.android.launcher3.dragndrop.DragView
import com.android.launcher3.util.ActivityContextWrapper
+import com.android.launcher3.util.MSDLPlayerWrapper
+import com.google.android.msdl.data.model.MSDLToken
import com.google.common.truth.Truth.assertThat
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeleteDropTargetTest {
+ @get:Rule val mSetFlagsRule = SetFlagsRule()
+
private var mContext: Context = ActivityContextWrapper(getApplicationContext())
// Use a non-abstract class implementation
@@ -37,4 +46,17 @@
// A lot of space for text so the text should not be clipped
assertThat(buttonDropTarget.isTextClippedVertically(1000)).isFalse()
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+ fun onDragEnter_performsMSDLSwipeThresholdFeedback() {
+ val target = DropTarget.DragObject(mContext)
+ target.dragView = mock<DragView<*>>()
+ buttonDropTarget.onDragEnter(target)
+ val wrapper = MSDLPlayerWrapper.INSTANCE.get(mContext)
+
+ val history = wrapper.history
+ assertThat(history.size).isEqualTo(1)
+ assertThat(history[0].tokenName).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR.name)
+ }
}