// Signature format: 4.0
package androidx.compose.ui {

  public final class AbsoluteAlignment {
    method public androidx.compose.ui.Alignment getBottomLeft();
    method public androidx.compose.ui.Alignment getBottomRight();
    method public androidx.compose.ui.Alignment getCenterLeft();
    method public androidx.compose.ui.Alignment getCenterRight();
    method public androidx.compose.ui.Alignment.Horizontal getLeft();
    method public androidx.compose.ui.Alignment.Horizontal getRight();
    method public androidx.compose.ui.Alignment getTopLeft();
    method public androidx.compose.ui.Alignment getTopRight();
    property public final androidx.compose.ui.Alignment BottomLeft;
    property public final androidx.compose.ui.Alignment BottomRight;
    property public final androidx.compose.ui.Alignment CenterLeft;
    property public final androidx.compose.ui.Alignment CenterRight;
    property public final androidx.compose.ui.Alignment.Horizontal Left;
    property public final androidx.compose.ui.Alignment.Horizontal Right;
    property public final androidx.compose.ui.Alignment TopLeft;
    property public final androidx.compose.ui.Alignment TopRight;
    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
  }

  public final class ActualKt {
  }

  @androidx.compose.runtime.Stable public fun interface Alignment {
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    field public static final androidx.compose.ui.Alignment.Companion Companion;
  }

  public static final class Alignment.Companion {
    method public androidx.compose.ui.Alignment.Vertical getBottom();
    method public androidx.compose.ui.Alignment getBottomCenter();
    method public androidx.compose.ui.Alignment getBottomEnd();
    method public androidx.compose.ui.Alignment getBottomStart();
    method public androidx.compose.ui.Alignment getCenter();
    method public androidx.compose.ui.Alignment getCenterEnd();
    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
    method public androidx.compose.ui.Alignment getCenterStart();
    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
    method public androidx.compose.ui.Alignment.Horizontal getEnd();
    method public androidx.compose.ui.Alignment.Horizontal getStart();
    method public androidx.compose.ui.Alignment.Vertical getTop();
    method public androidx.compose.ui.Alignment getTopCenter();
    method public androidx.compose.ui.Alignment getTopEnd();
    method public androidx.compose.ui.Alignment getTopStart();
    property public final androidx.compose.ui.Alignment.Vertical Bottom;
    property public final androidx.compose.ui.Alignment BottomCenter;
    property public final androidx.compose.ui.Alignment BottomEnd;
    property public final androidx.compose.ui.Alignment BottomStart;
    property public final androidx.compose.ui.Alignment Center;
    property public final androidx.compose.ui.Alignment CenterEnd;
    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
    property public final androidx.compose.ui.Alignment CenterStart;
    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
    property public final androidx.compose.ui.Alignment.Horizontal End;
    property public final androidx.compose.ui.Alignment.Horizontal Start;
    property public final androidx.compose.ui.Alignment.Vertical Top;
    property public final androidx.compose.ui.Alignment TopCenter;
    property public final androidx.compose.ui.Alignment TopEnd;
    property public final androidx.compose.ui.Alignment TopStart;
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
    method public int align(int size, int space);
  }

  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public float component1();
    method public float component2();
    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
    method public float getHorizontalBias();
    method public float getVerticalBias();
    property public final float horizontalBias;
    property public final float verticalBias;
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
    ctor public BiasAlignment.Vertical(float bias);
    method public int align(int size, int space);
    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
  }

  public final class CombinedModifier implements androidx.compose.ui.Modifier {
    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ComposedModifierKt {
    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
    field public static final androidx.compose.ui.Modifier.Companion Companion;
  }

  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Modifier.Element extends androidx.compose.ui.Modifier {
    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public float getScaleFactor();
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    property public abstract float scaleFactor;
    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
  }

  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
  }

  public final class TempListUtilsKt {
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
  }

  public final class ZIndexModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
  }

}

package androidx.compose.ui.autofill {

  public final class AndroidAutofillType_androidKt {
  }

  public final class AndroidAutofill_androidKt {
  }

}

package androidx.compose.ui.draw {

  public final class AlphaKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
  }

  public final class BlurKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
    method public androidx.compose.ui.graphics.Shape? getShape();
    property public final androidx.compose.ui.graphics.Shape? shape;
    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
  }

  public static final class BlurredEdgeTreatment.Companion {
    method public androidx.compose.ui.graphics.Shape getRectangle();
    method public androidx.compose.ui.graphics.Shape getUnbounded();
    property public final androidx.compose.ui.graphics.Shape Rectangle;
    property public final androidx.compose.ui.graphics.Shape Unbounded;
  }

  public interface BuildDrawCacheParams {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract long size;
  }

  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
    method public float getDensity();
    method public float getFontScale();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
    property public float density;
    property public float fontScale;
    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public final long size;
  }

  public final class ClipKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
  }

  public final class DrawModifierKt {
    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
  }

  public final class DrawResult {
  }

  public final class PainterModifierKt {
    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
  }

  public final class RotateKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
  }

  public final class ScaleKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
  }

  public final class ShadowKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
  }

}

package androidx.compose.ui.focus {

  public final class BeyondBoundsLayoutKt {
  }

  public final class FocusChangedModifierKt {
    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
  }

  @kotlin.jvm.JvmInline public final value class FocusDirection {
    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
  }

  public static final class FocusDirection.Companion {
    method public int getDown();
    method public int getIn();
    method public int getLeft();
    method public int getNext();
    method public int getOut();
    method public int getPrevious();
    method public int getRight();
    method public int getUp();
    property public final int Down;
    property public final int In;
    property public final int Left;
    property public final int Next;
    property public final int Out;
    property public final int Previous;
    property public final int Right;
    property public final int Up;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
  }

  public final class FocusEventModifierKt {
    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
    method public void clearFocus(optional boolean force);
    method public boolean moveFocus(int focusDirection);
  }

  public final class FocusManagerKt {
  }

  public final class FocusModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
  }

  @Deprecated public final class FocusOrder {
    ctor @Deprecated public FocusOrder();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
    property public final androidx.compose.ui.focus.FocusRequester down;
    property public final androidx.compose.ui.focus.FocusRequester end;
    property public final androidx.compose.ui.focus.FocusRequester left;
    property public final androidx.compose.ui.focus.FocusRequester next;
    property public final androidx.compose.ui.focus.FocusRequester previous;
    property public final androidx.compose.ui.focus.FocusRequester right;
    property public final androidx.compose.ui.focus.FocusRequester start;
    property public final androidx.compose.ui.focus.FocusRequester up;
  }

  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
  }

  public final class FocusOrderModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
  }

  public interface FocusProperties {
    method public boolean getCanFocus();
    method public default androidx.compose.ui.focus.FocusRequester getDown();
    method public default androidx.compose.ui.focus.FocusRequester getEnd();
    method public default androidx.compose.ui.focus.FocusRequester getLeft();
    method public default androidx.compose.ui.focus.FocusRequester getNext();
    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
    method public default androidx.compose.ui.focus.FocusRequester getRight();
    method public default androidx.compose.ui.focus.FocusRequester getStart();
    method public default androidx.compose.ui.focus.FocusRequester getUp();
    method public void setCanFocus(boolean);
    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
    property public abstract boolean canFocus;
    property public default androidx.compose.ui.focus.FocusRequester down;
    property public default androidx.compose.ui.focus.FocusRequester end;
    property public default androidx.compose.ui.focus.FocusRequester left;
    property public default androidx.compose.ui.focus.FocusRequester next;
    property public default androidx.compose.ui.focus.FocusRequester previous;
    property public default androidx.compose.ui.focus.FocusRequester right;
    property public default androidx.compose.ui.focus.FocusRequester start;
    property public default androidx.compose.ui.focus.FocusRequester up;
  }

  public final class FocusPropertiesKt {
    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
  }

  public final class FocusRequester {
    ctor public FocusRequester();
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public void requestFocus();
    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
  }

  public static final class FocusRequester.Companion {
    method public androidx.compose.ui.focus.FocusRequester getDefault();
    property public final androidx.compose.ui.focus.FocusRequester Default;
  }

  public final class FocusRequesterKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
  }

  public final class FocusRequesterModifierKt {
    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
  }

  public interface FocusState {
    method public boolean getHasFocus();
    method public boolean isCaptured();
    method public boolean isFocused();
    property public abstract boolean hasFocus;
    property public abstract boolean isCaptured;
    property public abstract boolean isFocused;
  }

  public final class FocusTransactionsKt {
  }

  public final class FocusTraversalKt {
  }

  public final class OneDimensionalFocusSearchKt {
  }

  public final class TwoDimensionalFocusSearchKt {
  }

}

package androidx.compose.ui.graphics {

  public final class GraphicsLayerModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
    method public float getAlpha();
    method public default long getAmbientShadowColor();
    method public float getCameraDistance();
    method public boolean getClip();
    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
    method public float getRotationX();
    method public float getRotationY();
    method public float getRotationZ();
    method public float getScaleX();
    method public float getScaleY();
    method public float getShadowElevation();
    method public androidx.compose.ui.graphics.Shape getShape();
    method public default long getSpotShadowColor();
    method public long getTransformOrigin();
    method public float getTranslationX();
    method public float getTranslationY();
    method public void setAlpha(float);
    method public default void setAmbientShadowColor(long);
    method public void setCameraDistance(float);
    method public void setClip(boolean);
    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
    method public void setRotationX(float);
    method public void setRotationY(float);
    method public void setRotationZ(float);
    method public void setScaleX(float);
    method public void setScaleY(float);
    method public void setShadowElevation(float);
    method public void setShape(androidx.compose.ui.graphics.Shape);
    method public default void setSpotShadowColor(long);
    method public void setTransformOrigin(long);
    method public void setTranslationX(float);
    method public void setTranslationY(float);
    property public abstract float alpha;
    property public default long ambientShadowColor;
    property public abstract float cameraDistance;
    property public abstract boolean clip;
    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
    property public abstract float rotationX;
    property public abstract float rotationY;
    property public abstract float rotationZ;
    property public abstract float scaleX;
    property public abstract float scaleY;
    property public abstract float shadowElevation;
    property public abstract androidx.compose.ui.graphics.Shape shape;
    property public default long spotShadowColor;
    property public abstract long transformOrigin;
    property public abstract float translationX;
    property public abstract float translationY;
  }

  public final class GraphicsLayerScopeKt {
    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
    method public static long getDefaultShadowColor();
    property public static final long DefaultShadowColor;
    field public static final float DefaultCameraDistance = 8.0f;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
    method public float getPivotFractionX();
    method public float getPivotFractionY();
    property public final float pivotFractionX;
    property public final float pivotFractionY;
    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
  }

  public static final class TransformOrigin.Companion {
    method public long getCenter();
    property public final long Center;
  }

  public final class TransformOriginKt {
    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
  }

}

package androidx.compose.ui.graphics.vector {

  @androidx.compose.runtime.Immutable public final class ImageVector {
    method public boolean getAutoMirror();
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
    method public int getTintBlendMode();
    method public long getTintColor();
    method public float getViewportHeight();
    method public float getViewportWidth();
    property public final boolean autoMirror;
    property public final float defaultHeight;
    property public final float defaultWidth;
    property public final String name;
    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
    property public final int tintBlendMode;
    property public final long tintColor;
    property public final float viewportHeight;
    property public final float viewportWidth;
    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
  }

  public static final class ImageVector.Builder {
    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
    method public androidx.compose.ui.graphics.vector.ImageVector build();
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
  }

  public static final class ImageVector.Companion {
  }

  public final class ImageVectorKt {
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
  }

  public abstract sealed class VNode {
    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
    method public final void invalidate();
  }

  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void move(int from, int to, int count);
    method protected void onClear();
    method public void remove(int index, int count);
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
  }

  public final class VectorComposeKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
  }

  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
    method public String getName();
    method public float getPivotX();
    method public float getPivotY();
    method public float getRotation();
    method public float getScaleX();
    method public float getScaleY();
    method public int getSize();
    method public float getTranslationX();
    method public float getTranslationY();
    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
    property public final String name;
    property public final float pivotX;
    property public final float pivotY;
    property public final float rotation;
    property public final float scaleX;
    property public final float scaleY;
    property public final int size;
    property public final float translationX;
    property public final float translationY;
  }

  public final class VectorKt {
    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
    method public static int getDefaultFillType();
    method public static int getDefaultStrokeLineCap();
    method public static int getDefaultStrokeLineJoin();
    method public static int getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
    property public static final int DefaultFillType;
    property public static final int DefaultStrokeLineCap;
    property public static final int DefaultStrokeLineJoin;
    property public static final int DefaultTintBlendMode;
    property public static final long DefaultTintColor;
    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
    field public static final String DefaultGroupName = "";
    field public static final String DefaultPathName = "";
    field public static final float DefaultPivotX = 0.0f;
    field public static final float DefaultPivotY = 0.0f;
    field public static final float DefaultRotation = 0.0f;
    field public static final float DefaultScaleX = 1.0f;
    field public static final float DefaultScaleY = 1.0f;
    field public static final float DefaultStrokeLineMiter = 4.0f;
    field public static final float DefaultStrokeLineWidth = 0.0f;
    field public static final float DefaultTranslationX = 0.0f;
    field public static final float DefaultTranslationY = 0.0f;
    field public static final float DefaultTrimPathEnd = 1.0f;
    field public static final float DefaultTrimPathOffset = 0.0f;
    field public static final float DefaultTrimPathStart = 0.0f;
  }

  public abstract sealed class VectorNode {
  }

  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
    method public long getIntrinsicSize();
    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
    property public long intrinsicSize;
  }

  public final class VectorPainterKt {
    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
    field public static final String RootGroupName = "VectorRootGroup";
  }

  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
    method public androidx.compose.ui.graphics.Brush? getFill();
    method public float getFillAlpha();
    method public String getName();
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
    method public int getPathFillType();
    method public androidx.compose.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public int getStrokeLineCap();
    method public int getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
    method public float getTrimPathEnd();
    method public float getTrimPathOffset();
    method public float getTrimPathStart();
    property public final androidx.compose.ui.graphics.Brush? fill;
    property public final float fillAlpha;
    property public final String name;
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
    property public final int pathFillType;
    property public final androidx.compose.ui.graphics.Brush? stroke;
    property public final float strokeAlpha;
    property public final int strokeLineCap;
    property public final int strokeLineJoin;
    property public final float strokeLineMiter;
    property public final float strokeLineWidth;
    property public final float trimPathEnd;
    property public final float trimPathOffset;
    property public final float trimPathStart;
  }

  public abstract sealed class VectorProperty<T> {
  }

  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
  }

  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
  }

  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
  }

  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
  }

  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
  }

  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
  }

  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
  }

  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
  }

  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
  }

  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
  }

  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
  }

  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
  }

  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
  }

  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
  }

  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
  }

  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
  }

}

package androidx.compose.ui.graphics.vector.compat {

  public final class XmlVectorParser_androidKt {
  }

}

package androidx.compose.ui.hapticfeedback {

  public interface HapticFeedback {
    method public void performHapticFeedback(int hapticFeedbackType);
  }

  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
    ctor public HapticFeedbackType(int value);
    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
  }

  public static final class HapticFeedbackType.Companion {
    method public int getLongPress();
    method public int getTextHandleMove();
    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
    property public final int LongPress;
    property public final int TextHandleMove;
  }

}

package androidx.compose.ui.input {

  @kotlin.jvm.JvmInline public final value class InputMode {
    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
  }

  public static final class InputMode.Companion {
    method public int getKeyboard();
    method public int getTouch();
    property public final int Keyboard;
    property public final int Touch;
  }

  public interface InputModeManager {
    method public int getInputMode();
    property public abstract int inputMode;
  }

}

package androidx.compose.ui.input.key {

  @kotlin.jvm.JvmInline public final value class Key {
    ctor public Key(long keyCode);
    method public long getKeyCode();
    property public final long keyCode;
    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
  }

  public static final class Key.Companion {
    method public long getA();
    method public long getAllApps();
    method public long getAltLeft();
    method public long getAltRight();
    method public long getApostrophe();
    method public long getAppSwitch();
    method public long getAssist();
    method public long getAt();
    method public long getAvReceiverInput();
    method public long getAvReceiverPower();
    method public long getB();
    method public long getBack();
    method public long getBackslash();
    method public long getBackspace();
    method public long getBookmark();
    method public long getBreak();
    method public long getBrightnessDown();
    method public long getBrightnessUp();
    method public long getBrowser();
    method public long getButton1();
    method public long getButton10();
    method public long getButton11();
    method public long getButton12();
    method public long getButton13();
    method public long getButton14();
    method public long getButton15();
    method public long getButton16();
    method public long getButton2();
    method public long getButton3();
    method public long getButton4();
    method public long getButton5();
    method public long getButton6();
    method public long getButton7();
    method public long getButton8();
    method public long getButton9();
    method public long getButtonA();
    method public long getButtonB();
    method public long getButtonC();
    method public long getButtonL1();
    method public long getButtonL2();
    method public long getButtonMode();
    method public long getButtonR1();
    method public long getButtonR2();
    method public long getButtonSelect();
    method public long getButtonStart();
    method public long getButtonThumbLeft();
    method public long getButtonThumbRight();
    method public long getButtonX();
    method public long getButtonY();
    method public long getButtonZ();
    method public long getC();
    method public long getCalculator();
    method public long getCalendar();
    method public long getCall();
    method public long getCamera();
    method public long getCapsLock();
    method public long getCaptions();
    method public long getChannelDown();
    method public long getChannelUp();
    method public long getClear();
    method public long getComma();
    method public long getContacts();
    method public long getCopy();
    method public long getCtrlLeft();
    method public long getCtrlRight();
    method public long getCut();
    method public long getD();
    method public long getDelete();
    method public long getDirectionCenter();
    method public long getDirectionDown();
    method public long getDirectionDownLeft();
    method public long getDirectionDownRight();
    method public long getDirectionLeft();
    method public long getDirectionRight();
    method public long getDirectionUp();
    method public long getDirectionUpLeft();
    method public long getDirectionUpRight();
    method public long getDvr();
    method public long getE();
    method public long getEight();
    method public long getEisu();
    method public long getEndCall();
    method public long getEnter();
    method public long getEnvelope();
    method public long getEquals();
    method public long getEscape();
    method public long getF();
    method public long getF1();
    method public long getF10();
    method public long getF11();
    method public long getF12();
    method public long getF2();
    method public long getF3();
    method public long getF4();
    method public long getF5();
    method public long getF6();
    method public long getF7();
    method public long getF8();
    method public long getF9();
    method public long getFive();
    method public long getFocus();
    method public long getForward();
    method public long getFour();
    method public long getFunction();
    method public long getG();
    method public long getGrave();
    method public long getGuide();
    method public long getH();
    method public long getHeadsetHook();
    method public long getHelp();
    method public long getHenkan();
    method public long getHome();
    method public long getI();
    method public long getInfo();
    method public long getInsert();
    method public long getJ();
    method public long getK();
    method public long getKana();
    method public long getKatakanaHiragana();
    method public long getL();
    method public long getLanguageSwitch();
    method public long getLastChannel();
    method public long getLeftBracket();
    method public long getM();
    method public long getMannerMode();
    method public long getMediaAudioTrack();
    method public long getMediaClose();
    method public long getMediaEject();
    method public long getMediaFastForward();
    method public long getMediaNext();
    method public long getMediaPause();
    method public long getMediaPlay();
    method public long getMediaPlayPause();
    method public long getMediaPrevious();
    method public long getMediaRecord();
    method public long getMediaRewind();
    method public long getMediaSkipBackward();
    method public long getMediaSkipForward();
    method public long getMediaStepBackward();
    method public long getMediaStepForward();
    method public long getMediaStop();
    method public long getMediaTopMenu();
    method public long getMenu();
    method public long getMetaLeft();
    method public long getMetaRight();
    method public long getMicrophoneMute();
    method public long getMinus();
    method public long getMoveEnd();
    method public long getMoveHome();
    method public long getMuhenkan();
    method public long getMultiply();
    method public long getMusic();
    method public long getN();
    method public long getNavigateIn();
    method public long getNavigateNext();
    method public long getNavigateOut();
    method public long getNavigatePrevious();
    method public long getNine();
    method public long getNotification();
    method public long getNumLock();
    method public long getNumPad0();
    method public long getNumPad1();
    method public long getNumPad2();
    method public long getNumPad3();
    method public long getNumPad4();
    method public long getNumPad5();
    method public long getNumPad6();
    method public long getNumPad7();
    method public long getNumPad8();
    method public long getNumPad9();
    method public long getNumPadAdd();
    method public long getNumPadComma();
    method public long getNumPadDivide();
    method public long getNumPadDot();
    method public long getNumPadEnter();
    method public long getNumPadEquals();
    method public long getNumPadLeftParenthesis();
    method public long getNumPadMultiply();
    method public long getNumPadRightParenthesis();
    method public long getNumPadSubtract();
    method public long getNumber();
    method public long getO();
    method public long getOne();
    method public long getP();
    method public long getPageDown();
    method public long getPageUp();
    method public long getPairing();
    method public long getPaste();
    method public long getPeriod();
    method public long getPictureSymbols();
    method public long getPlus();
    method public long getPound();
    method public long getPower();
    method public long getPrintScreen();
    method public long getProfileSwitch();
    method public long getProgramBlue();
    method public long getProgramGreen();
    method public long getProgramRed();
    method public long getProgramYellow();
    method public long getQ();
    method public long getR();
    method public long getRefresh();
    method public long getRightBracket();
    method public long getRo();
    method public long getS();
    method public long getScrollLock();
    method public long getSearch();
    method public long getSemicolon();
    method public long getSetTopBoxInput();
    method public long getSetTopBoxPower();
    method public long getSettings();
    method public long getSeven();
    method public long getShiftLeft();
    method public long getShiftRight();
    method public long getSix();
    method public long getSlash();
    method public long getSleep();
    method public long getSoftLeft();
    method public long getSoftRight();
    method public long getSoftSleep();
    method public long getSpacebar();
    method public long getStem1();
    method public long getStem2();
    method public long getStem3();
    method public long getStemPrimary();
    method public long getSwitchCharset();
    method public long getSymbol();
    method public long getSystemNavigationDown();
    method public long getSystemNavigationLeft();
    method public long getSystemNavigationRight();
    method public long getSystemNavigationUp();
    method public long getT();
    method public long getTab();
    method public long getThree();
    method public long getThumbsDown();
    method public long getThumbsUp();
    method public long getToggle2D3D();
    method public long getTv();
    method public long getTvAntennaCable();
    method public long getTvAudioDescription();
    method public long getTvAudioDescriptionMixingVolumeDown();
    method public long getTvAudioDescriptionMixingVolumeUp();
    method public long getTvContentsMenu();
    method public long getTvDataService();
    method public long getTvInput();
    method public long getTvInputComponent1();
    method public long getTvInputComponent2();
    method public long getTvInputComposite1();
    method public long getTvInputComposite2();
    method public long getTvInputHdmi1();
    method public long getTvInputHdmi2();
    method public long getTvInputHdmi3();
    method public long getTvInputHdmi4();
    method public long getTvInputVga1();
    method public long getTvMediaContextMenu();
    method public long getTvNetwork();
    method public long getTvNumberEntry();
    method public long getTvPower();
    method public long getTvRadioService();
    method public long getTvSatellite();
    method public long getTvSatelliteBs();
    method public long getTvSatelliteCs();
    method public long getTvSatelliteService();
    method public long getTvTeletext();
    method public long getTvTerrestrialAnalog();
    method public long getTvTerrestrialDigital();
    method public long getTvTimerProgramming();
    method public long getTvZoomMode();
    method public long getTwo();
    method public long getU();
    method public long getUnknown();
    method public long getV();
    method public long getVoiceAssist();
    method public long getVolumeDown();
    method public long getVolumeMute();
    method public long getVolumeUp();
    method public long getW();
    method public long getWakeUp();
    method public long getWindow();
    method public long getX();
    method public long getY();
    method public long getYen();
    method public long getZ();
    method public long getZenkakuHankaru();
    method public long getZero();
    method public long getZoomIn();
    method public long getZoomOut();
    property public final long A;
    property public final long AllApps;
    property public final long AltLeft;
    property public final long AltRight;
    property public final long Apostrophe;
    property public final long AppSwitch;
    property public final long Assist;
    property public final long At;
    property public final long AvReceiverInput;
    property public final long AvReceiverPower;
    property public final long B;
    property public final long Back;
    property public final long Backslash;
    property public final long Backspace;
    property public final long Bookmark;
    property public final long Break;
    property public final long BrightnessDown;
    property public final long BrightnessUp;
    property public final long Browser;
    property public final long Button1;
    property public final long Button10;
    property public final long Button11;
    property public final long Button12;
    property public final long Button13;
    property public final long Button14;
    property public final long Button15;
    property public final long Button16;
    property public final long Button2;
    property public final long Button3;
    property public final long Button4;
    property public final long Button5;
    property public final long Button6;
    property public final long Button7;
    property public final long Button8;
    property public final long Button9;
    property public final long ButtonA;
    property public final long ButtonB;
    property public final long ButtonC;
    property public final long ButtonL1;
    property public final long ButtonL2;
    property public final long ButtonMode;
    property public final long ButtonR1;
    property public final long ButtonR2;
    property public final long ButtonSelect;
    property public final long ButtonStart;
    property public final long ButtonThumbLeft;
    property public final long ButtonThumbRight;
    property public final long ButtonX;
    property public final long ButtonY;
    property public final long ButtonZ;
    property public final long C;
    property public final long Calculator;
    property public final long Calendar;
    property public final long Call;
    property public final long Camera;
    property public final long CapsLock;
    property public final long Captions;
    property public final long ChannelDown;
    property public final long ChannelUp;
    property public final long Clear;
    property public final long Comma;
    property public final long Contacts;
    property public final long Copy;
    property public final long CtrlLeft;
    property public final long CtrlRight;
    property public final long Cut;
    property public final long D;
    property public final long Delete;
    property public final long DirectionCenter;
    property public final long DirectionDown;
    property public final long DirectionDownLeft;
    property public final long DirectionDownRight;
    property public final long DirectionLeft;
    property public final long DirectionRight;
    property public final long DirectionUp;
    property public final long DirectionUpLeft;
    property public final long DirectionUpRight;
    property public final long Dvr;
    property public final long E;
    property public final long Eight;
    property public final long Eisu;
    property public final long EndCall;
    property public final long Enter;
    property public final long Envelope;
    property public final long Equals;
    property public final long Escape;
    property public final long F;
    property public final long F1;
    property public final long F10;
    property public final long F11;
    property public final long F12;
    property public final long F2;
    property public final long F3;
    property public final long F4;
    property public final long F5;
    property public final long F6;
    property public final long F7;
    property public final long F8;
    property public final long F9;
    property public final long Five;
    property public final long Focus;
    property public final long Forward;
    property public final long Four;
    property public final long Function;
    property public final long G;
    property public final long Grave;
    property public final long Guide;
    property public final long H;
    property public final long HeadsetHook;
    property public final long Help;
    property public final long Henkan;
    property public final long Home;
    property public final long I;
    property public final long Info;
    property public final long Insert;
    property public final long J;
    property public final long K;
    property public final long Kana;
    property public final long KatakanaHiragana;
    property public final long L;
    property public final long LanguageSwitch;
    property public final long LastChannel;
    property public final long LeftBracket;
    property public final long M;
    property public final long MannerMode;
    property public final long MediaAudioTrack;
    property public final long MediaClose;
    property public final long MediaEject;
    property public final long MediaFastForward;
    property public final long MediaNext;
    property public final long MediaPause;
    property public final long MediaPlay;
    property public final long MediaPlayPause;
    property public final long MediaPrevious;
    property public final long MediaRecord;
    property public final long MediaRewind;
    property public final long MediaSkipBackward;
    property public final long MediaSkipForward;
    property public final long MediaStepBackward;
    property public final long MediaStepForward;
    property public final long MediaStop;
    property public final long MediaTopMenu;
    property public final long Menu;
    property public final long MetaLeft;
    property public final long MetaRight;
    property public final long MicrophoneMute;
    property public final long Minus;
    property public final long MoveEnd;
    property public final long MoveHome;
    property public final long Muhenkan;
    property public final long Multiply;
    property public final long Music;
    property public final long N;
    property public final long NavigateIn;
    property public final long NavigateNext;
    property public final long NavigateOut;
    property public final long NavigatePrevious;
    property public final long Nine;
    property public final long Notification;
    property public final long NumLock;
    property public final long NumPad0;
    property public final long NumPad1;
    property public final long NumPad2;
    property public final long NumPad3;
    property public final long NumPad4;
    property public final long NumPad5;
    property public final long NumPad6;
    property public final long NumPad7;
    property public final long NumPad8;
    property public final long NumPad9;
    property public final long NumPadAdd;
    property public final long NumPadComma;
    property public final long NumPadDivide;
    property public final long NumPadDot;
    property public final long NumPadEnter;
    property public final long NumPadEquals;
    property public final long NumPadLeftParenthesis;
    property public final long NumPadMultiply;
    property public final long NumPadRightParenthesis;
    property public final long NumPadSubtract;
    property public final long Number;
    property public final long O;
    property public final long One;
    property public final long P;
    property public final long PageDown;
    property public final long PageUp;
    property public final long Pairing;
    property public final long Paste;
    property public final long Period;
    property public final long PictureSymbols;
    property public final long Plus;
    property public final long Pound;
    property public final long Power;
    property public final long PrintScreen;
    property public final long ProfileSwitch;
    property public final long ProgramBlue;
    property public final long ProgramGreen;
    property public final long ProgramRed;
    property public final long ProgramYellow;
    property public final long Q;
    property public final long R;
    property public final long Refresh;
    property public final long RightBracket;
    property public final long Ro;
    property public final long S;
    property public final long ScrollLock;
    property public final long Search;
    property public final long Semicolon;
    property public final long SetTopBoxInput;
    property public final long SetTopBoxPower;
    property public final long Settings;
    property public final long Seven;
    property public final long ShiftLeft;
    property public final long ShiftRight;
    property public final long Six;
    property public final long Slash;
    property public final long Sleep;
    property public final long SoftLeft;
    property public final long SoftRight;
    property public final long SoftSleep;
    property public final long Spacebar;
    property public final long Stem1;
    property public final long Stem2;
    property public final long Stem3;
    property public final long StemPrimary;
    property public final long SwitchCharset;
    property public final long Symbol;
    property public final long SystemNavigationDown;
    property public final long SystemNavigationLeft;
    property public final long SystemNavigationRight;
    property public final long SystemNavigationUp;
    property public final long T;
    property public final long Tab;
    property public final long Three;
    property public final long ThumbsDown;
    property public final long ThumbsUp;
    property public final long Toggle2D3D;
    property public final long Tv;
    property public final long TvAntennaCable;
    property public final long TvAudioDescription;
    property public final long TvAudioDescriptionMixingVolumeDown;
    property public final long TvAudioDescriptionMixingVolumeUp;
    property public final long TvContentsMenu;
    property public final long TvDataService;
    property public final long TvInput;
    property public final long TvInputComponent1;
    property public final long TvInputComponent2;
    property public final long TvInputComposite1;
    property public final long TvInputComposite2;
    property public final long TvInputHdmi1;
    property public final long TvInputHdmi2;
    property public final long TvInputHdmi3;
    property public final long TvInputHdmi4;
    property public final long TvInputVga1;
    property public final long TvMediaContextMenu;
    property public final long TvNetwork;
    property public final long TvNumberEntry;
    property public final long TvPower;
    property public final long TvRadioService;
    property public final long TvSatellite;
    property public final long TvSatelliteBs;
    property public final long TvSatelliteCs;
    property public final long TvSatelliteService;
    property public final long TvTeletext;
    property public final long TvTerrestrialAnalog;
    property public final long TvTerrestrialDigital;
    property public final long TvTimerProgramming;
    property public final long TvZoomMode;
    property public final long Two;
    property public final long U;
    property public final long Unknown;
    property public final long V;
    property public final long VoiceAssist;
    property public final long VolumeDown;
    property public final long VolumeMute;
    property public final long VolumeUp;
    property public final long W;
    property public final long WakeUp;
    property public final long Window;
    property public final long X;
    property public final long Y;
    property public final long Yen;
    property public final long Z;
    property public final long ZenkakuHankaru;
    property public final long Zero;
    property public final long ZoomIn;
    property public final long ZoomOut;
  }

  @kotlin.jvm.JvmInline public final value class KeyEvent {
    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
    method public android.view.KeyEvent getNativeKeyEvent();
    property public final android.view.KeyEvent nativeKeyEvent;
  }

  @kotlin.jvm.JvmInline public final value class KeyEventType {
    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
  }

  public static final class KeyEventType.Companion {
    method public int getKeyDown();
    method public int getKeyUp();
    method public int getUnknown();
    property public final int KeyDown;
    property public final int KeyUp;
    property public final int Unknown;
  }

  public final class KeyEvent_androidKt {
    method public static long getKey(android.view.KeyEvent);
    method public static int getType(android.view.KeyEvent);
    method public static int getUtf16CodePoint(android.view.KeyEvent);
    method public static boolean isAltPressed(android.view.KeyEvent);
    method public static boolean isCtrlPressed(android.view.KeyEvent);
    method public static boolean isMetaPressed(android.view.KeyEvent);
    method public static boolean isShiftPressed(android.view.KeyEvent);
  }

  public final class KeyInputModifierKt {
    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
  }

  public final class Key_androidKt {
    method public static long Key(int nativeKeyCode);
    method public static int getNativeKeyCode(long);
  }

}

package androidx.compose.ui.input.nestedscroll {

  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPostScroll(long consumed, long available, int source);
    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPreScroll(long available, int source);
  }

  public final class NestedScrollDispatcher {
    ctor public NestedScrollDispatcher();
    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPostScroll(long consumed, long available, int source);
    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPreScroll(long available, int source);
    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
  }

  public final class NestedScrollModifierKt {
    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
  }

  public final class NestedScrollModifierLocalKt {
  }

  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
  }

  public static final class NestedScrollSource.Companion {
    method public int getDrag();
    method public int getFling();
    method @Deprecated public int getRelocate();
    property public final int Drag;
    property public final int Fling;
    property @Deprecated public final int Relocate;
  }

}

package androidx.compose.ui.input.pointer {

  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent>);
    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
    method public default long getExtendedTouchPadding();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
    property public default long extendedTouchPadding;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  @Deprecated public final class ConsumedData {
    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
    method @Deprecated public boolean getDownChange();
    method @Deprecated public boolean getPositionChange();
    method @Deprecated public void setDownChange(boolean);
    method @Deprecated public void setPositionChange(boolean);
    property @Deprecated public final boolean downChange;
    property @Deprecated public final boolean positionChange;
  }

  @kotlin.jvm.JvmInline public final value class PointerButtons {
    ctor public PointerButtons(int packedValue);
  }

  public final class PointerEvent {
    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
    method public int getButtons();
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
    method public int getKeyboardModifiers();
    method public int getType();
    property public final int buttons;
    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
    property public final int keyboardModifiers;
    property public final int type;
  }

  public final class PointerEventKt {
    method @Deprecated public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
    method public static boolean isPressed(int, int buttonIndex);
    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
  }

  public enum PointerEventPass {
    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
  }

  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
    ctor public PointerEventTimeoutCancellationException(long time);
  }

  @kotlin.jvm.JvmInline public final value class PointerEventType {
    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
  }

  public static final class PointerEventType.Companion {
    method public int getEnter();
    method public int getExit();
    method public int getMove();
    method public int getPress();
    method public int getRelease();
    method public int getScroll();
    method public int getUnknown();
    property public final int Enter;
    property public final int Exit;
    property public final int Move;
    property public final int Press;
    property public final int Release;
    property public final int Scroll;
    property public final int Unknown;
  }

  public final class PointerEvent_androidKt {
    method public static boolean getAreAnyPressed(int);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method public static boolean isAltGraphPressed(int);
    method public static boolean isAltPressed(int);
    method public static boolean isBackPressed(int);
    method public static boolean isCapsLockOn(int);
    method public static boolean isCtrlPressed(int);
    method public static boolean isForwardPressed(int);
    method public static boolean isFunctionPressed(int);
    method public static boolean isMetaPressed(int);
    method public static boolean isNumLockOn(int);
    method public static boolean isPressed(int, int buttonIndex);
    method public static boolean isPrimaryPressed(int);
    method public static boolean isScrollLockOn(int);
    method public static boolean isSecondaryPressed(int);
    method public static boolean isShiftPressed(int);
    method public static boolean isSymPressed(int);
    method public static boolean isTertiaryPressed(int);
  }

  @androidx.compose.runtime.Stable public interface PointerIcon {
  }

  public final class PointerIconKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
  }

  public final class PointerIcon_androidKt {
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
  }

  @kotlin.jvm.JvmInline public final value class PointerId {
    ctor public PointerId(long value);
    method public long getValue();
    property public final long value;
  }

  @androidx.compose.runtime.Immutable public final class PointerInputChange {
    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method public void consume();
    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange! copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
    method public long getId();
    method public long getPosition();
    method public boolean getPressed();
    method public long getPreviousPosition();
    method public boolean getPreviousPressed();
    method public long getPreviousUptimeMillis();
    method public long getScrollDelta();
    method public int getType();
    method public long getUptimeMillis();
    method public boolean isConsumed();
    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
    property public final long id;
    property public final boolean isConsumed;
    property public final long position;
    property public final boolean pressed;
    property public final long previousPosition;
    property public final boolean previousPressed;
    property public final long previousUptimeMillis;
    property public final long scrollDelta;
    property public final int type;
    property public final long uptimeMillis;
  }

  public final class PointerInputEventProcessorKt {
  }

  public abstract class PointerInputFilter {
    ctor public PointerInputFilter();
    method public boolean getInterceptOutOfBoundsChildEvents();
    method public final long getSize();
    method public abstract void onCancel();
    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
    property public boolean interceptOutOfBoundsChildEvents;
    property public final long size;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputScope extends androidx.compose.ui.unit.Density {
    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    method public default long getExtendedTouchPadding();
    method public default boolean getInterceptOutOfBoundsChildEvents();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default void setInterceptOutOfBoundsChildEvents(boolean);
    property public default long extendedTouchPadding;
    property public default boolean interceptOutOfBoundsChildEvents;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  public final class PointerInputTestUtilKt {
  }

  public final class PointerInteropFilter_androidKt {
  }

  public final class PointerInteropUtils_androidKt {
  }

  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
    ctor public PointerKeyboardModifiers(int packedValue);
  }

  @kotlin.jvm.JvmInline public final value class PointerType {
    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
  }

  public static final class PointerType.Companion {
    method public int getEraser();
    method public int getMouse();
    method public int getStylus();
    method public int getTouch();
    method public int getUnknown();
    property public final int Eraser;
    property public final int Mouse;
    property public final int Stylus;
    property public final int Touch;
    property public final int Unknown;
  }

  public final class SuspendingPointerInputFilterKt {
    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
  }

}

package androidx.compose.ui.input.pointer.util {

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(long timeMillis, long position);
    method public long calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTrackerKt {
    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
  }

}

package androidx.compose.ui.input.rotary {

  public final class RotaryInputModifierKt {
  }

}

package androidx.compose.ui.internal {

  public final class JvmDefaultWithCompatibility_jvmKt {
  }

}

package androidx.compose.ui.layout {

  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
    field public static final int Unspecified = -2147483648; // 0x80000000
  }

  public static final class AlignmentLine.Companion {
  }

  public final class AlignmentLineKt {
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
  }

  public interface BeyondBoundsLayout {
    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
  }

  public static interface BeyondBoundsLayout.BeyondBoundsScope {
    method public boolean getHasMoreContent();
    property public abstract boolean hasMoreContent;
  }

  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
  }

  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
    method public int getAbove();
    method public int getAfter();
    method public int getBefore();
    method public int getBelow();
    method public int getLeft();
    method public int getRight();
    property public final int Above;
    property public final int After;
    property public final int Before;
    property public final int Below;
    property public final int Left;
    property public final int Right;
  }

  public final class BeyondBoundsLayoutKt {
    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
  }

  @androidx.compose.runtime.Stable public interface ContentScale {
    method public long computeScaleFactor(long srcSize, long dstSize);
    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
  }

  public static final class ContentScale.Companion {
    method public androidx.compose.ui.layout.ContentScale getCrop();
    method public androidx.compose.ui.layout.ContentScale getFillBounds();
    method public androidx.compose.ui.layout.ContentScale getFillHeight();
    method public androidx.compose.ui.layout.ContentScale getFillWidth();
    method public androidx.compose.ui.layout.ContentScale getFit();
    method public androidx.compose.ui.layout.ContentScale getInside();
    method public androidx.compose.ui.layout.FixedScale getNone();
    property public final androidx.compose.ui.layout.ContentScale Crop;
    property public final androidx.compose.ui.layout.ContentScale FillBounds;
    property public final androidx.compose.ui.layout.ContentScale FillHeight;
    property public final androidx.compose.ui.layout.ContentScale FillWidth;
    property public final androidx.compose.ui.layout.ContentScale Fit;
    property public final androidx.compose.ui.layout.ContentScale Inside;
    property public final androidx.compose.ui.layout.FixedScale None;
  }

  public final class ContentScaleKt {
  }

  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method public long computeScaleFactor(long srcSize, long dstSize);
    method public androidx.compose.ui.layout.FixedScale copy(float value);
    method public float getValue();
    property public final float value;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
    method public long getLayerId();
    method public default long getOwnerViewId();
    property public abstract long layerId;
    property public default long ownerViewId;
  }

  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width);
    method public int maxIntrinsicWidth(int height);
    method public int minIntrinsicHeight(int width);
    method public int minIntrinsicWidth(int height);
    property public abstract Object? parentData;
  }

  public final class IntrinsicMeasurableKt {
  }

  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
    method public long getSize();
    method public boolean isAttached();
    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
    method public long localToRoot(long relativeToLocal);
    method public long localToWindow(long relativeToLocal);
    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
    method public long windowToLocal(long relativeToWindow);
    property public abstract boolean isAttached;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
    property public abstract long size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
  }

  public final class LayoutIdKt {
    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
  }

  public interface LayoutIdParentData {
    method public Object getLayoutId();
    property public abstract Object layoutId;
  }

  public interface LayoutInfo {
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public androidx.compose.ui.unit.Density getDensity();
    method public int getHeight();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
    method public int getSemanticsId();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public int getWidth();
    method public boolean isAttached();
    method public boolean isPlaced();
    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract int height;
    property public abstract boolean isAttached;
    property public abstract boolean isPlaced;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
    property public abstract int semanticsId;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
    property public abstract int width;
  }

  public final class LayoutKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function1<androidx.compose.runtime.SkippableUpdater<androidx.compose.ui.node.ComposeUiNode>,kotlin.Unit> materializerOf(androidx.compose.ui.Modifier modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
  }

  public final class LayoutModifierKt {
    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
  }

  public final class LookaheadLayoutCoordinatesKt {
  }

  public final class LookaheadLayoutKt {
  }

  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
    method public androidx.compose.ui.layout.Placeable measure(long constraints);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
  }

  public interface MeasureResult {
    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
    method public int getHeight();
    method public int getWidth();
    method public void placeChildren();
    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
    property public abstract int height;
    property public abstract int width;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
  }

  public final class MeasureScopeKt {
  }

  public interface Measured {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public int getMeasuredHeight();
    method public int getMeasuredWidth();
    method public default Object? getParentData();
    property public abstract int measuredHeight;
    property public abstract int measuredWidth;
    property public default Object? parentData;
  }

  public final class ModifierInfo {
    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public Object? getExtra();
    method public androidx.compose.ui.Modifier getModifier();
    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public final Object? extra;
    property public final androidx.compose.ui.Modifier modifier;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnGloballyPositionedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnPlacedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasured(long size);
  }

  public final class OnRemeasuredModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
  }

  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
    ctor public Placeable();
    method protected final long getApparentToRealOffset();
    method public final int getHeight();
    method public int getMeasuredHeight();
    method protected final long getMeasuredSize();
    method public int getMeasuredWidth();
    method protected final long getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
    method protected final void setMeasuredSize(long);
    method protected final void setMeasurementConstraints(long);
    property protected final long apparentToRealOffset;
    property public final int height;
    property public int measuredHeight;
    property protected final long measuredSize;
    property public int measuredWidth;
    property protected final long measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
    method protected abstract int getParentWidth();
    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
    property protected abstract int parentWidth;
  }

  public final class PlaceableKt {
  }

  public final class RelocationModifierKt {
  }

  public final class RelocationRequesterModifierKt {
  }

  public interface Remeasurement {
    method public void forceRemeasure();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float scaleX, optional float scaleY);
    method @androidx.compose.runtime.Stable public operator long div(float operand);
    method public float getScaleX();
    method public float getScaleY();
    method @androidx.compose.runtime.Stable public operator long times(float operand);
    property public final float scaleX;
    property public final float scaleY;
    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
  }

  public static final class ScaleFactor.Companion {
    method public long getUnspecified();
    property public final long Unspecified;
  }

  public final class ScaleFactorKt {
    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
    method public static inline boolean isSpecified(long);
    method public static inline boolean isUnspecified(long);
    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
  }

  public final class SubcomposeLayoutKt {
    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
  }

  public final class SubcomposeLayoutState {
    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
    ctor public SubcomposeLayoutState();
    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
    method public void dispose();
    method public default int getPlaceablesCount();
    method public default void premeasure(int index, long constraints);
    property public default int placeablesCount;
  }

  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public interface SubcomposeSlotReusePolicy {
    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
  }

  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
    method public void clear();
    method public java.util.Iterator<java.lang.Object> iterator();
    method public boolean remove(Object? slotId);
    method public boolean removeAll(java.util.Collection<?> slotIds);
    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
    method public boolean retainAll(java.util.Collection<?> slotIds);
    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
  }

  public final class TestModifierUpdaterKt {
  }

  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

}

package androidx.compose.ui.modifier {

  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
  }

  public final class ModifierLocalConsumerKt {
  }

  public final class ModifierLocalKt {
    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

  public final class ModifierLocalNodeKt {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
    method public T! getValue();
    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
    property public abstract T! value;
  }

  public final class ModifierLocalProviderKt {
  }

  public interface ModifierLocalReadScope {
    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
  }

  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

}

package androidx.compose.ui.node {

  public final class BackwardsCompatNodeKt {
  }

  @kotlin.PublishedApi internal interface ComposeUiNode {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public androidx.compose.ui.layout.MeasurePolicy getMeasurePolicy();
    method public androidx.compose.ui.Modifier getModifier();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public void setDensity(androidx.compose.ui.unit.Density);
    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection);
    method public void setMeasurePolicy(androidx.compose.ui.layout.MeasurePolicy);
    method public void setModifier(androidx.compose.ui.Modifier);
    method public void setViewConfiguration(androidx.compose.ui.platform.ViewConfiguration);
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract androidx.compose.ui.layout.MeasurePolicy measurePolicy;
    property public abstract androidx.compose.ui.Modifier modifier;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
    field public static final androidx.compose.ui.node.ComposeUiNode.Companion Companion;
  }

  public static final class ComposeUiNode.Companion {
    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getConstructor();
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> getSetDensity();
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> getSetLayoutDirection();
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> getSetModifier();
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> getSetViewConfiguration();
    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
  }

  public final class DelegatableNodeKt {
  }

  public final class DrawModifierNodeKt {
  }

  public final class HitTestResultKt {
  }

  public final class LayoutModifierNodeCoordinatorKt {
  }

  public final class LayoutModifierNodeKt {
  }

  public final class LayoutNodeDrawScopeKt {
  }

  public final class LayoutNodeKt {
  }

  public final class LayoutNodeLayoutDelegateKt {
  }

  public final class ModifierNodeElementKt {
  }

  public final class MyersDiffKt {
  }

  public final class NodeChainKt {
  }

  public final class NodeCoordinatorKt {
  }

  public final class NodeKindKt {
  }

  public final class PointerInputModifierNodeKt {
  }

  public final class Ref<T> {
    ctor public Ref();
    method public T? getValue();
    method public void setValue(T?);
    property public final T? value;
  }

  public interface RootForTest {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
  }

  public final class SemanticsModifierNodeKt {
  }

  public final class ViewInterop_androidKt {
  }

}

package androidx.compose.ui.platform {

  public abstract class AbstractComposeView extends android.view.ViewGroup {
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public AbstractComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public abstract void Content();
    method public final void createComposition();
    method public final void disposeComposition();
    method public final boolean getHasComposition();
    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
    method public final boolean getShowLayoutBounds();
    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
    method public final void setShowLayoutBounds(boolean);
    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
    property public final boolean hasComposition;
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
    property public final boolean showLayoutBounds;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
  }

  public final class AndroidClipboardManager_androidKt {
  }

  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
  }

  public final class AndroidComposeView_androidKt {
  }

  public final class AndroidCompositionLocals_androidKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
  }

  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
    method public android.view.Choreographer getChoreographer();
    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
    property public final android.view.Choreographer choreographer;
    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
  }

  public static final class AndroidUiDispatcher.Companion {
    method public kotlin.coroutines.CoroutineContext getCurrentThread();
    method public kotlin.coroutines.CoroutineContext getMain();
    property public final kotlin.coroutines.CoroutineContext CurrentThread;
    property public final kotlin.coroutines.CoroutineContext Main;
  }

  public final class AndroidUiDispatcher_androidKt {
  }

  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
    method public android.view.Choreographer getChoreographer();
    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
    property public final android.view.Choreographer choreographer;
  }

  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
    ctor public AndroidUriHandler(android.content.Context context);
    method public void openUri(String uri);
  }

  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public float getTouchSlop();
    property public long doubleTapMinTimeMillis;
    property public long doubleTapTimeoutMillis;
    property public long longPressTimeoutMillis;
    property public float touchSlop;
  }

  public interface ClipboardManager {
    method public androidx.compose.ui.text.AnnotatedString? getText();
    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
  }

  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public ComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable public void Content();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
  }

  public final class CompositionLocalsKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
  }

  public final class DebugUtilsKt {
  }

  public final class DisposableSaveableStateRegistry_androidKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
  }

  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
  }

  public final class InfiniteAnimationPolicyKt {
  }

  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
    property public final androidx.compose.ui.platform.InspectableModifier.End end;
  }

  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier.End();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
    method public default String? getNameFallback();
    method public default Object? getValueOverride();
    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public default String? nameFallback;
    property public default Object? valueOverride;
  }

  public final class InspectableValueKt {
    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @kotlin.PublishedApi internal static androidx.compose.ui.Modifier inspectableWrapper(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, androidx.compose.ui.Modifier wrapped);
    method public static boolean isDebugInspectorInfoEnabled();
    method public static void setDebugInspectorInfoEnabled(boolean);
    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
    property public static final boolean isDebugInspectorInfoEnabled;
  }

  public final class InspectionModeKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
  }

  public final class InspectorInfo {
    ctor public InspectorInfo();
    method public String? getName();
    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
    method public Object? getValue();
    method public void setName(String?);
    method public void setValue(Object?);
    property public final String? name;
    property public final androidx.compose.ui.platform.ValueElementSequence properties;
    property public final Object? value;
  }

  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public String? nameFallback;
    property public Object? valueOverride;
  }

  public final class InvertMatrixKt {
  }

  public final class JvmActuals_jvmKt {
  }

  public final class NestedScrollInteropConnectionKt {
  }

  public final class ShapeContainingUtilKt {
  }

  public final class TestTagKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface TextToolbar {
    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
    method public void hide();
    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
  }

  public enum TextToolbarStatus {
    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
  }

  public interface UriHandler {
    method public void openUri(String uri);
  }

  public final class ValueElement {
    ctor public ValueElement(String name, Object? value);
    method public String component1();
    method public Object? component2();
    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
    method public String getName();
    method public Object? getValue();
    property public final String name;
    property public final Object? value;
  }

  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
    ctor public ValueElementSequence();
    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
    method public operator void set(String name, Object? value);
  }

  public interface ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
  }

  public static final class ViewCompositionStrategy.Companion {
    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
  }

  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
  }

  public final class ViewCompositionStrategy_androidKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public default long getMinimumTouchTargetSize();
    method public float getTouchSlop();
    property public abstract long doubleTapMinTimeMillis;
    property public abstract long doubleTapTimeoutMillis;
    property public abstract long longPressTimeoutMillis;
    property public default long minimumTouchTargetSize;
    property public abstract float touchSlop;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
    method public default android.view.View? getViewRoot();
    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
    property public default android.view.View? viewRoot;
  }

  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
    method public boolean getHasPendingMeasureOrLayout();
    method public android.view.View getView();
    method public void invalidateDescendants();
    method public boolean isLifecycleInResumedState();
    property public abstract boolean hasPendingMeasureOrLayout;
    property public abstract boolean isLifecycleInResumedState;
    property public abstract android.view.View view;
    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
  }

  public static final class ViewRootForTest.Companion {
    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
  }

  @androidx.compose.runtime.Stable public interface WindowInfo {
    method public boolean isWindowFocused();
    property public abstract boolean isWindowFocused;
  }

  public final class WindowInfoKt {
  }

  public final class WindowRecomposer_androidKt {
    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext?);
  }

  public final class Wrapper_androidKt {
  }

}

package androidx.compose.ui.platform.accessibility {

  public final class CollectionInfoKt {
  }

}

package androidx.compose.ui.res {

  public final class ColorResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
  }

  public final class FontResources_androidKt {
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
  }

  public final class ImageResources_androidKt {
    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
  }

  public final class PainterResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
  }

  public final class PrimitiveResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
  }

  public final class Resources_androidKt {
  }

  public final class StringResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
  }

  public final class VectorResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
  }

}

package androidx.compose.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
    ctor public AccessibilityAction(String? label, T? action);
    method public T? getAction();
    method public String? getLabel();
    property public final T? action;
    property public final String? label;
  }

  public final class CollectionInfo {
    ctor public CollectionInfo(int rowCount, int columnCount);
    method public int getColumnCount();
    method public int getRowCount();
    property public final int columnCount;
    property public final int rowCount;
  }

  public final class CollectionItemInfo {
    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
    method public int getColumnIndex();
    method public int getColumnSpan();
    method public int getRowIndex();
    method public int getRowSpan();
    property public final int columnIndex;
    property public final int columnSpan;
    property public final int rowIndex;
    property public final int rowSpan;
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public String getLabel();
    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
    property public final String label;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
  }

  public static final class LiveRegionMode.Companion {
    method public int getAssertive();
    method public int getPolite();
    property public final int Assertive;
    property public final int Polite;
  }

  public final class ProgressBarRangeInfo {
    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
    method public int getSteps();
    property public final float current;
    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
    property public final int steps;
    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
  }

  public static final class ProgressBarRangeInfo.Companion {
    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
  }

  public static final class Role.Companion {
    method public int getButton();
    method public int getCheckbox();
    method public int getImage();
    method public int getRadioButton();
    method public int getSwitch();
    method public int getTab();
    property public final int Button;
    property public final int Checkbox;
    property public final int Image;
    property public final int RadioButton;
    property public final int Switch;
    property public final int Tab;
  }

  public final class ScrollAxisRange {
    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
    method public boolean getReverseScrolling();
    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
    property public final boolean reverseScrolling;
    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
  }

  public final class SemanticsActions {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getRequestFocus();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> RequestFocus;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
  }

  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
    ctor public SemanticsConfiguration();
    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
    method public operator <T> T! get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public <T> T! getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public boolean isClearingSemantics();
    method public boolean isMergingSemanticsOfDescendants();
    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
    method public void setClearingSemantics(boolean);
    method public void setMergingSemanticsOfDescendants(boolean);
    property public final boolean isClearingSemantics;
    property public final boolean isMergingSemanticsOfDescendants;
  }

  public final class SemanticsConfigurationKt {
    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public default int getId();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
    property @Deprecated public default int id;
    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
  }

  public final class SemanticsModifierKt {
    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
    method public int getId();
    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
    method public boolean getMergingEnabled();
    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
    method public long getPositionInRoot();
    method public long getPositionInWindow();
    method public androidx.compose.ui.node.RootForTest? getRoot();
    method public long getSize();
    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
    method public boolean isRoot();
    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
    property public final int id;
    property public final boolean isRoot;
    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
    property public final boolean mergingEnabled;
    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
    property public final long positionInRoot;
    property public final long positionInWindow;
    property public final androidx.compose.ui.node.RootForTest? root;
    property public final long size;
    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
  }

  public final class SemanticsNodeKt {
  }

  public final class SemanticsOwner {
    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
  }

  public final class SemanticsOwnerKt {
    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
  }

  public final class SemanticsProperties {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo);
    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo);
    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
  }

  public final class SemanticsProperties_androidKt {
  }

  public final class SemanticsPropertyKey<T> {
    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
    method public String getName();
    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T? merge(T? parentValue, T? childValue);
    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
    property public final String name;
  }

  public interface SemanticsPropertyReceiver {
    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
  }

  public final class SemanticsSortKt {
  }

}

package androidx.compose.ui.state {

  public enum ToggleableState {
    method public static androidx.compose.ui.state.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.state.ToggleableState[] values();
    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
  }

  public final class ToggleableStateKt {
    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
  }

}

package androidx.compose.ui.text {

  public final class TextMeasurerHelperKt {
  }

}

package androidx.compose.ui.text.input {

  public final class CursorAnchorInfoBuilderKt {
  }

  public final class InputState_androidKt {
  }

  public final class RecordingInputConnection_androidKt {
  }

  public final class TextInputServiceAndroid_androidKt {
  }

}

package androidx.compose.ui.viewinterop {

  public final class AndroidViewHolder_androidKt {
  }

  public final class AndroidView_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
  }

}

package androidx.compose.ui.window {

  public final class AndroidDialog_androidKt {
    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class AndroidPopup_androidKt {
    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
  }

  @androidx.compose.runtime.Immutable public final class DialogProperties {
    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public interface DialogWindowProvider {
    method public android.view.Window getWindow();
    property public abstract android.view.Window window;
  }

  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
  }

  @androidx.compose.runtime.Immutable public final class PopupProperties {
    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
    method public boolean getClippingEnabled();
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public boolean getExcludeFromSystemGesture();
    method public boolean getFocusable();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean clippingEnabled;
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final boolean excludeFromSystemGesture;
    property public final boolean focusable;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public enum SecureFlagPolicy {
    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
  }

  public final class SecureFlagPolicy_androidKt {
  }

}

