// Signature format: 3.0
package androidx.compose.ui.graphics.vector {

  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.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
    method public void insert(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);
  }

  public final class VectorAsset {
    method public String component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public float component5();
    method public androidx.compose.ui.graphics.vector.VectorGroup component6();
    method public androidx.compose.ui.graphics.vector.VectorAsset copy-pRTh4Qo(String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, androidx.compose.ui.graphics.vector.VectorGroup root);
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
    method public float getViewportHeight();
    method public float getViewportWidth();
  }

  public final class VectorAssetBuilder {
    method public androidx.compose.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, String name = "", androidx.compose.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.compose.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.compose.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.compose.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
    method public androidx.compose.ui.graphics.vector.VectorAsset build();
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public float getViewportHeight();
    method public float getViewportWidth();
    method public androidx.compose.ui.graphics.vector.VectorAssetBuilder popGroup();
    method public androidx.compose.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
  }

  public final class VectorAssetBuilderKt {
    method public static androidx.compose.ui.graphics.vector.VectorAssetBuilder group(androidx.compose.ui.graphics.vector.VectorAssetBuilder, String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.VectorAssetBuilder,kotlin.Unit> block);
    method public static androidx.compose.ui.graphics.vector.VectorAssetBuilder path(androidx.compose.ui.graphics.vector.VectorAssetBuilder, String name = "", androidx.compose.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.compose.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.compose.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.compose.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
  }

  public final class VectorComposeKt {
    method @androidx.compose.Composable public static void Group(String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, String name = "", androidx.compose.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.compose.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.compose.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.compose.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
  }

  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 {
    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
    ctor public VectorGroup();
    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 int size;
  }

  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 androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
    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;
  }

  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.Composable public static androidx.compose.ui.graphics.vector.VectorPainter VectorPainter(androidx.compose.ui.graphics.vector.VectorAsset asset);
    method @androidx.compose.Composable public static androidx.compose.ui.graphics.vector.VectorPainter VectorPainter-RKTc9UI(float defaultWidth, float defaultHeight, float viewportWidth = (0.0f/0.0f), float viewportHeight = (0.0f/0.0f), String name = "VectorRootGroup", kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
    field public static final String RootGroupName = "VectorRootGroup";
  }

  public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
    ctor public VectorPath(String name, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, androidx.compose.ui.graphics.Brush? fill, float fillAlpha, androidx.compose.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.compose.ui.graphics.StrokeCap strokeLineCap, androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public String component1();
    method public float component10();
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> component2();
    method public androidx.compose.ui.graphics.Brush? component3();
    method public float component4();
    method public androidx.compose.ui.graphics.Brush? component5();
    method public float component6();
    method public float component7();
    method public androidx.compose.ui.graphics.StrokeCap component8();
    method public androidx.compose.ui.graphics.StrokeJoin component9();
    method public androidx.compose.ui.graphics.vector.VectorPath copy(String name, java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, androidx.compose.ui.graphics.Brush? fill, float fillAlpha, androidx.compose.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.compose.ui.graphics.StrokeCap strokeLineCap, androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    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 androidx.compose.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
  }

}

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

  public final class XmlVectorParserKt {
  }

}

package androidx.compose.ui.text.input {

  public final class InputStateKt {
  }

  public final class RecordingInputConnectionKt {
  }

}

package androidx.ui.autofill {

  public final class AndroidAutofillDebugUtilsKt {
  }

  public final class AndroidAutofillKt {
  }

  public final class AndroidAutofillTypeKt {
  }

  public interface Autofill {
    method public void cancelAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
    method public void requestAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
  }

  public final class AutofillNode {
    ctor public AutofillNode(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, androidx.compose.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> component1();
    method public androidx.compose.ui.geometry.Rect? component2();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? component3();
    method public androidx.ui.autofill.AutofillNode copy(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, androidx.compose.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> getAutofillTypes();
    method public androidx.compose.ui.geometry.Rect? getBoundingBox();
    method public int getId();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
    method public void setBoundingBox(androidx.compose.ui.geometry.Rect? p);
    property public final int id;
  }

  public final class AutofillTree {
    ctor public AutofillTree();
    method public java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> getChildren();
    method public kotlin.Unit? performAutofill(int id, String value);
    method public operator void plusAssign(androidx.ui.autofill.AutofillNode autofillNode);
    property public final java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> children;
  }

  public enum AutofillType {
    method public static androidx.ui.autofill.AutofillType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.autofill.AutofillType[] values();
    enum_constant public static final androidx.ui.autofill.AutofillType AddressAuxiliaryDetails;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressCountry;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressLocality;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressRegion;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressStreet;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateDay;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateFull;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDate;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDay;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardSecurityCode;
    enum_constant public static final androidx.ui.autofill.AutofillType EmailAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType Gender;
    enum_constant @Deprecated public static final androidx.ui.autofill.AutofillType Name;
    enum_constant public static final androidx.ui.autofill.AutofillType NewPassword;
    enum_constant public static final androidx.ui.autofill.AutofillType NewUsername;
    enum_constant public static final androidx.ui.autofill.AutofillType Password;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFirstName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFullName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonLastName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleInitial;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNamePrefix;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNameSuffix;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneCountryCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberDevice;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberNational;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCodeExtended;
    enum_constant public static final androidx.ui.autofill.AutofillType SmsOtpCode;
    enum_constant public static final androidx.ui.autofill.AutofillType Username;
  }

}

package androidx.ui.core {

  @androidx.compose.Immutable public final class AbsoluteAlignment implements androidx.ui.core.Alignment {
    method public androidx.compose.ui.unit.IntOffset align(androidx.compose.ui.unit.IntSize size, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method @androidx.compose.Immutable public androidx.ui.core.AbsoluteAlignment copy(float verticalBias, float horizontalBias);
    field public static final androidx.ui.core.AbsoluteAlignment.Companion Companion;
  }

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

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

  public abstract class AbstractComposeView extends android.view.ViewGroup {
    ctor public AbstractComposeView(android.content.Context context, android.util.AttributeSet? attrs, int defStyleAttr);
    ctor public AbstractComposeView(android.content.Context context, android.util.AttributeSet? attrs);
    ctor public AbstractComposeView(android.content.Context context);
    method @androidx.compose.Composable public abstract void Content();
    method public final void createComposition();
    method public final void disposeComposition();
    method public final boolean isDisposed();
    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
    property public final boolean isDisposed;
  }

  @androidx.compose.Immutable public interface Alignment {
    method public androidx.compose.ui.unit.IntOffset align(androidx.compose.ui.unit.IntSize size, androidx.compose.ui.unit.LayoutDirection layoutDirection = LayoutDirection.Ltr);
    field public static final androidx.ui.core.Alignment.Companion Companion;
  }

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

  @androidx.compose.Immutable public static interface Alignment.Horizontal {
    method public int align(int size, androidx.compose.ui.unit.LayoutDirection layoutDirection = LayoutDirection.Ltr);
  }

  @androidx.compose.Immutable public static interface Alignment.Vertical {
    method public int align(int size);
  }

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

  public static final class AlignmentLine.Companion {
  }

  public final class AlignmentLineKt {
    method public static int merge(androidx.ui.core.AlignmentLine, int position1, int position2);
  }

  public final class AmbientsKt {
    method public static androidx.compose.ProvidableAmbient<androidx.compose.animation.core.AnimationClockObservable> getAnimationClockAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.compose.ui.unit.Density> getDensityAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.compose.ui.text.input.TextInputService> getTextInputServiceAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.texttoolbar.TextToolbar> getTextToolbarAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
  }

  public final class AndroidActualsKt {
  }

  public final class AndroidAmbientsKt {
    method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
    method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.lifecycle.LifecycleOwner> getLifecycleOwnerAmbient();
    method public static androidx.compose.ProvidableAmbient<android.view.View> getViewAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.lifecycle.ViewModelStoreOwner> getViewModelStoreOwnerAmbient();
  }

  public final class AndroidComposeViewKt {
    method public static androidx.ui.core.AndroidOwner AndroidOwner(android.content.Context context, androidx.lifecycle.LifecycleOwner? lifecycleOwner = null, androidx.lifecycle.ViewModelStoreOwner? viewModelStoreOwner = null);
    method public static androidx.compose.ui.unit.LayoutDirection getLocaleLayoutDirection(android.content.res.Configuration);
  }

  public interface AndroidOwner extends androidx.ui.core.Owner {
    method @androidx.ui.core.ExperimentalLayoutNodeApi public void addAndroidView(android.view.View view, androidx.ui.core.LayoutNode layoutNode);
    method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
    method public android.view.View getView();
    method public androidx.ui.core.AndroidOwner.ViewTreeOwners? getViewTreeOwners();
    method public void removeAndroidView(android.view.View view);
    method public void setConfigurationChangeObserver(kotlin.jvm.functions.Function0<kotlin.Unit> p);
    method public void setOnViewTreeOwnersAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner.ViewTreeOwners,kotlin.Unit> callback);
    property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
    property public abstract android.view.View view;
    property public abstract androidx.ui.core.AndroidOwner.ViewTreeOwners? viewTreeOwners;
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class AndroidOwner.Companion {
    method public kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? getOnAndroidOwnerCreatedCallback();
    method @org.jetbrains.annotations.TestOnly public void setOnAndroidOwnerCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner,kotlin.Unit>? p);
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? onAndroidOwnerCreatedCallback;
  }

  public static final class AndroidOwner.ViewTreeOwners {
    ctor public AndroidOwner.ViewTreeOwners(androidx.lifecycle.LifecycleOwner lifecycleOwner, androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
    method public androidx.lifecycle.LifecycleOwner getLifecycleOwner();
    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner();
  }

  public final class AndroidPopupKt {
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, String? testTag = null);
  }

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

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

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

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

  @androidx.compose.Immutable public final class ConsumedData {
    ctor public ConsumedData(androidx.compose.ui.geometry.Offset positionChange, boolean downChange);
    ctor public ConsumedData();
    method public androidx.compose.ui.geometry.Offset component1();
    method public boolean component2();
    method @androidx.compose.Immutable public androidx.ui.core.ConsumedData copy(androidx.compose.ui.geometry.Offset positionChange, boolean downChange);
    method public boolean getDownChange();
    method public androidx.compose.ui.geometry.Offset getPositionChange();
  }

  public abstract class ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
    ctor public ContentDrawScope();
    method public abstract void drawContent();
  }

  @androidx.compose.Stable public interface ContentScale {
    method public float scale-AhF4CD4(long srcSize, long dstSize);
    field public static final androidx.ui.core.ContentScale.Companion Companion;
  }

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

  public final class ContentScaleKt {
  }

  public interface CustomEvent {
  }

  public interface CustomEventDispatcher {
    method public void dispatchCustomEvent(androidx.ui.core.CustomEvent event);
    method public void releaseHitPaths(java.util.Set<androidx.ui.core.PointerId> pointerIds);
    method public void retainHitPaths(java.util.Set<androidx.ui.core.PointerId> pointerIds);
  }

  public final class DebugUtilsKt {
  }

  @kotlin.PublishedApi internal final class DefaultIntrinsicMeasurable implements androidx.ui.core.Measurable {
    ctor public DefaultIntrinsicMeasurable(androidx.ui.core.IntrinsicMeasurable measurable, androidx.ui.core.IntrinsicMinMax minMax, androidx.ui.core.IntrinsicWidthHeight widthHeight);
    method public androidx.ui.core.IntrinsicMeasurable getMeasurable();
    method public androidx.ui.core.IntrinsicMinMax getMinMax();
    method public Object? getParentData();
    method public androidx.ui.core.IntrinsicWidthHeight getWidthHeight();
    method public int maxIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.ui.core.Placeable measure(androidx.compose.ui.unit.Constraints constraints, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    property public Object? parentData;
  }

  public enum Direction {
    method public static androidx.ui.core.Direction valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.Direction[] values();
    enum_constant public static final androidx.ui.core.Direction DOWN;
    enum_constant public static final androidx.ui.core.Direction LEFT;
    enum_constant public static final androidx.ui.core.Direction RIGHT;
    enum_constant public static final androidx.ui.core.Direction UP;
  }

  public interface DrawLayerModifier extends androidx.ui.core.Modifier.Element {
    method @FloatRange(from=0.0, to=1.0) public default float getAlpha();
    method public default boolean getClip();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationX();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationY();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationZ();
    method public default float getScaleX();
    method public default float getScaleY();
    method @FloatRange(from=0.0, to=3.4E38) public default float getShadowElevation();
    method public default androidx.compose.ui.graphics.Shape getShape();
    method public default long getTransformOrigin();
    method public default float getTranslationX();
    method public default float getTranslationY();
    property @FloatRange(from=0.0, to=1.0) public default float alpha;
    property public default boolean clip;
    property @FloatRange(from=0.0, to=360.0) public default float rotationX;
    property @FloatRange(from=0.0, to=360.0) public default float rotationY;
    property @FloatRange(from=0.0, to=360.0) public default float rotationZ;
    property public default float scaleX;
    property public default float scaleY;
    property @FloatRange(from=0.0, to=3.4E38) public default float shadowElevation;
    property public default androidx.compose.ui.graphics.Shape shape;
    property public default long transformOrigin;
    property public default float translationX;
    property public default float translationY;
  }

  public final class DrawLayerModifierKt {
    method public static inline long TransformOrigin(float pivotFractionX, float pivotFractionY);
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawLayer-EwV0HsI(androidx.ui.core.Modifier, float scaleX = 1f, float scaleY = 1f, float alpha = 1f, float translationX = 0f, float translationY = 0f, float shadowElevation = 0f, float rotationX = 0f, float rotationY = 0f, float rotationZ = 0f, long transformOrigin = TransformOrigin.Center, androidx.compose.ui.graphics.Shape shape = androidx.compose.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = false);
  }

  public interface DrawModifier extends androidx.ui.core.Modifier.Element {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

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

  public final class DrawShadowKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawShadow-VShsm3I(androidx.ui.core.Modifier, float elevation, androidx.compose.ui.graphics.Shape shape = androidx.compose.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
  }

  @kotlin.RequiresOptIn(level=RequiresOptIn.Level.ERROR, message="This is an experimental API for Compose UI LayoutNode and is likely to change " + "before becoming stable.") @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY}) public @interface ExperimentalLayoutNodeApi {
  }

  @kotlin.RequiresOptIn(message="This is an experimental API for being able to perform subcomposition during the " + "measuring. API is likely to change before becoming stable.") public @interface ExperimentalSubcomposeLayoutApi {
  }

  @androidx.compose.Immutable public final class FixedScale implements androidx.ui.core.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method @androidx.compose.Immutable public androidx.ui.core.FixedScale copy(float value);
    method public float getValue();
    method public float scale-AhF4CD4(long srcSize, long dstSize);
  }

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

  public interface InspectableParameter {
    method public kotlin.sequences.Sequence<androidx.ui.core.ParameterElement> getInspectableElements();
    method public default String? getNameFallback();
    method public default Object? getValueOverride();
    property public abstract kotlin.sequences.Sequence<androidx.ui.core.ParameterElement> inspectableElements;
    property public default String? nameFallback;
    property public default Object? valueOverride;
  }

  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) public @interface InternalCoreApi {
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    property public abstract Object? parentData;
  }

  public final class IntrinsicMeasurableKt {
  }

  public abstract class IntrinsicMeasureScope implements androidx.compose.ui.unit.Density {
    ctor public IntrinsicMeasureScope();
    method public abstract androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public final int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasurable, int height);
    method public final int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasurable, int height);
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
  }

  @kotlin.PublishedApi internal enum IntrinsicMinMax {
    method public static androidx.ui.core.IntrinsicMinMax valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.IntrinsicMinMax[] values();
    enum_constant public static final androidx.ui.core.IntrinsicMinMax Max;
    enum_constant public static final androidx.ui.core.IntrinsicMinMax Min;
  }

  @kotlin.PublishedApi internal enum IntrinsicWidthHeight {
    method public static androidx.ui.core.IntrinsicWidthHeight valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.IntrinsicWidthHeight[] values();
    enum_constant public static final androidx.ui.core.IntrinsicWidthHeight Height;
    enum_constant public static final androidx.ui.core.IntrinsicWidthHeight Width;
  }

  @kotlin.PublishedApi internal final class IntrinsicsMeasureScope extends androidx.ui.core.MeasureScope implements androidx.compose.ui.unit.Density {
    ctor public IntrinsicsMeasureScope(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public float getDensity();
    method public float getFontScale();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method @androidx.compose.Stable public float toDp(float);
    method @androidx.compose.Stable public float toDp(int);
    method @androidx.compose.Stable public float toDp--R2X_6o(long);
    method @androidx.compose.Stable public int toIntPx--R2X_6o(long);
    method @androidx.compose.Stable public int toIntPx-0680j_4(float);
    method @androidx.compose.Stable public float toPx--R2X_6o(long);
    method @androidx.compose.Stable public float toPx-0680j_4(float);
    method @androidx.compose.Stable public androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.Bounds);
    method @androidx.compose.Stable public long toSp(float);
    method @androidx.compose.Stable public long toSp(int);
    method @androidx.compose.Stable public long toSp-0680j_4(float);
  }

  public interface LayoutCoordinates {
    method public androidx.compose.ui.unit.PxBounds childBoundingBox(androidx.ui.core.LayoutCoordinates child);
    method public androidx.compose.ui.geometry.Offset childToLocal(androidx.ui.core.LayoutCoordinates child, androidx.compose.ui.geometry.Offset childLocal);
    method public operator int get(androidx.ui.core.AlignmentLine line);
    method public androidx.ui.core.LayoutCoordinates? getParentCoordinates();
    method public java.util.Set<androidx.ui.core.AlignmentLine> getProvidedAlignmentLines();
    method public androidx.compose.ui.unit.IntSize getSize();
    method public androidx.compose.ui.geometry.Offset globalToLocal(androidx.compose.ui.geometry.Offset global);
    method public boolean isAttached();
    method public androidx.compose.ui.geometry.Offset localToGlobal(androidx.compose.ui.geometry.Offset local);
    method public androidx.compose.ui.geometry.Offset localToRoot(androidx.compose.ui.geometry.Offset local);
    property public abstract boolean isAttached;
    property public abstract androidx.ui.core.LayoutCoordinates? parentCoordinates;
    property public abstract java.util.Set<androidx.ui.core.AlignmentLine> providedAlignmentLines;
    property public abstract androidx.compose.ui.unit.IntSize size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.compose.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
    method public static androidx.compose.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
    method public static androidx.compose.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.compose.ui.geometry.Offset getGlobalPosition(androidx.ui.core.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Offset getPositionInParent(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.compose.ui.geometry.Offset getPositionInRoot(androidx.ui.core.LayoutCoordinates);
  }

  @kotlin.PublishedApi internal final class LayoutEmitHelper {
    method public kotlin.jvm.functions.Function0<androidx.ui.core.LayoutNode> getConstructor();
    method public kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.LayoutNode.MeasureBlocks,kotlin.Unit> getSetMeasureBlocks();
    method public kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.Modifier,kotlin.Unit> getSetModifier();
    method public kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.Ref<androidx.ui.core.LayoutNode>,kotlin.Unit> getSetRef();
    property public final kotlin.jvm.functions.Function0<androidx.ui.core.LayoutNode> constructor;
    property public final kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.LayoutNode.MeasureBlocks,kotlin.Unit> setMeasureBlocks;
    property public final kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.Modifier,kotlin.Unit> setModifier;
    property public final kotlin.jvm.functions.Function2<androidx.ui.core.LayoutNode,androidx.ui.core.Ref<androidx.ui.core.LayoutNode>,kotlin.Unit> setRef;
  }

  public final class LayoutIdKt {
    method public static Object? getId(androidx.ui.core.Measurable);
    method @Deprecated public static Object? getTag(androidx.ui.core.Measurable);
    method @androidx.compose.Stable public static androidx.ui.core.Modifier layoutId(androidx.ui.core.Modifier, Object id);
    method @Deprecated @androidx.compose.Stable public static androidx.ui.core.Modifier tag(androidx.ui.core.Modifier, Object tag);
  }

  public interface LayoutIdParentData {
    method public Object getId();
    property public abstract Object id;
  }

  public final class LayoutKt {
    method @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @Deprecated @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.compose.ui.unit.LayoutDirection,java.lang.Integer> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.compose.ui.unit.LayoutDirection,java.lang.Integer> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.compose.ui.unit.LayoutDirection,java.lang.Integer> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.compose.ui.unit.LayoutDirection,java.lang.Integer> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? super androidx.compose.ui.unit.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @Deprecated @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? super androidx.compose.ui.unit.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @androidx.compose.Composable @androidx.ui.core.ExperimentalLayoutNodeApi public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.LayoutNode.MeasureBlocks measureBlocks, androidx.ui.core.Modifier modifier = Modifier);
    method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @Deprecated public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? super androidx.compose.ui.unit.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @Deprecated @androidx.compose.Composable public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @androidx.compose.Composable public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.WithConstraintsScope,kotlin.Unit> children);
    method @androidx.ui.core.ExperimentalLayoutNodeApi public static androidx.ui.core.LayoutNode.MeasureBlocks measureBlocksOf(kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,java.lang.Integer> maxIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
  }

  public interface LayoutModifier extends androidx.ui.core.Modifier.Element {
    method public default int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public default int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope, androidx.ui.core.Measurable measurable, androidx.compose.ui.unit.Constraints constraints, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public default int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public default int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  @androidx.ui.core.ExperimentalLayoutNodeApi public final class LayoutNode implements androidx.ui.core.Measurable androidx.ui.core.Remeasurement {
    ctor public LayoutNode();
    method public void attach(androidx.ui.core.Owner owner);
    method public void detach();
    method public void draw(androidx.compose.ui.graphics.Canvas canvas);
    method public void forceRemeasure();
    method public Integer? getAlignmentLine(androidx.ui.core.AlignmentLine line);
    method @Deprecated public boolean getCanMultiMeasure();
    method public java.util.List<androidx.ui.core.LayoutNode> getChildren();
    method public androidx.ui.core.LayoutCoordinates getCoordinates();
    method public int getDepth();
    method public int getHeight();
    method public androidx.ui.core.LayoutNode.MeasureBlocks getMeasureBlocks();
    method public androidx.ui.core.MeasureScope getMeasureScope();
    method public androidx.ui.core.Modifier getModifier();
    method public java.util.List<androidx.ui.core.ModifierInfo> getModifierInfo();
    method public kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? getOnAttach();
    method public kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? getOnDetach();
    method public androidx.ui.core.Owner? getOwner();
    method public androidx.ui.core.LayoutNode? getParent();
    method public Object? getParentData();
    method public int getWidth();
    method public void hitTest(androidx.compose.ui.geometry.Offset pointerPositionRelativeToScreen, java.util.List<androidx.ui.core.pointerinput.PointerInputFilter> hitPointerInputFilters);
    method public void ignoreModelReads(kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void insertAt(int index, androidx.ui.core.LayoutNode instance);
    method public boolean isPlaced();
    method public int maxIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.ui.core.Placeable measure(androidx.compose.ui.unit.Constraints constraints, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public void move(int from, int to, int count);
    method public void onInvalidate();
    method public void place(int x, int y);
    method public void removeAll();
    method public void removeAt(int index, int count);
    method public void requestRelayout();
    method public void requestRemeasure();
    method @Deprecated public void setCanMultiMeasure(boolean p);
    method public void setDepth(int p);
    method public void setMeasureBlocks(androidx.ui.core.LayoutNode.MeasureBlocks value);
    method public void setModifier(androidx.ui.core.Modifier value);
    method public void setOnAttach(kotlin.jvm.functions.Function1<? super androidx.ui.core.Owner,kotlin.Unit>? p);
    method public void setOnDetach(kotlin.jvm.functions.Function1<? super androidx.ui.core.Owner,kotlin.Unit>? p);
    property @Deprecated public final boolean canMultiMeasure;
    property public final java.util.List<androidx.ui.core.LayoutNode> children;
    property public final androidx.ui.core.LayoutCoordinates coordinates;
    property public final int depth;
    property public final int height;
    property public final boolean isPlaced;
    property public final androidx.ui.core.LayoutNode.MeasureBlocks measureBlocks;
    property public final androidx.ui.core.MeasureScope measureScope;
    property public final androidx.ui.core.Modifier modifier;
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? onAttach;
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? onDetach;
    property public final androidx.ui.core.Owner? owner;
    property public final androidx.ui.core.LayoutNode? parent;
    property public Object? parentData;
    property public final int width;
  }

  public static interface LayoutNode.MeasureBlocks {
    method public int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope measureScope, java.util.List<? extends androidx.ui.core.Measurable> measurables, androidx.compose.ui.unit.Constraints constraints, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  public abstract static class LayoutNode.NoIntrinsicsMeasureBlocks implements androidx.ui.core.LayoutNode.MeasureBlocks {
    ctor public LayoutNode.NoIntrinsicsMeasureBlocks(String error);
    method public Void maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public Void maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public Void minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public Void minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  public final class LayoutNodeKt {
    method public static androidx.ui.core.LayoutNode? findClosestParentNode(androidx.ui.core.LayoutNode, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutNode,java.lang.Boolean> selector);
  }

  @Deprecated public interface LayoutTagParentData {
    method @Deprecated public Object getTag();
    property public abstract Object tag;
  }

  public interface Measurable extends androidx.ui.core.IntrinsicMeasurable {
    method public androidx.ui.core.Placeable measure(androidx.compose.ui.unit.Constraints constraints, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  public abstract class MeasureScope extends androidx.ui.core.IntrinsicMeasureScope {
    ctor public MeasureScope();
    method public final androidx.ui.core.MeasureScope.MeasureResult layout(int width, int height, java.util.Map<androidx.ui.core.AlignmentLine,java.lang.Integer> alignmentLines = emptyMap(), kotlin.jvm.functions.Function1<? super androidx.ui.core.Placeable.PlacementScope,kotlin.Unit> placementBlock);
    method public final androidx.ui.core.Placeable measure(androidx.ui.core.Measurable, androidx.compose.ui.unit.Constraints constraints);
  }

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

  public final class MeasureScopeKt {
  }

  public final inline class Measured {
    ctor public Measured();
    method public static androidx.ui.core.Placeable! constructor-impl(internal androidx.ui.core.Placeable placeable);
    method public static inline boolean equals-impl(androidx.ui.core.Placeable! p, Object? p1);
    method public static boolean equals-impl0(androidx.ui.core.Placeable p1, androidx.ui.core.Placeable p2);
    method public static operator int get-impl(androidx.ui.core.Placeable $this, androidx.ui.core.AlignmentLine alignmentLine);
    method public static int getHeight-impl(androidx.ui.core.Placeable! $this);
    method public static int getWidth-impl(androidx.ui.core.Placeable! $this);
    method public static inline int hashCode-impl(androidx.ui.core.Placeable! p);
    method public static inline String! toString-impl(androidx.ui.core.Placeable! p);
  }

  @Deprecated public final class ModelObserver {
    ctor @Deprecated public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
    method @Deprecated public void clear(Object target);
    method @Deprecated public void enableModelUpdatesObserving(boolean enabled);
    method @Deprecated public <T> void observeReads(T target, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onCommit, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method @Deprecated public void pauseObservingReads(kotlin.jvm.functions.Function0<kotlin.Unit> block);
  }

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

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

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

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

  public interface OnChildPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onChildPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public interface OnPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public final class OnPositionedModifierKt {
    method public static androidx.ui.core.Modifier onChildPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onChildPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method public static androidx.ui.core.Modifier onPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
  }

  public final class OpacityKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawOpacity(androidx.ui.core.Modifier, @FloatRange(from=0.0, to=1.0) float opacity);
  }

  public interface OwnedLayer {
    method public void destroy();
    method public void drawLayer(androidx.compose.ui.graphics.Canvas canvas);
    method public long getLayerId();
    method public android.graphics.Matrix getMatrix();
    method public androidx.ui.core.DrawLayerModifier getModifier();
    method public void invalidate();
    method public void move(androidx.compose.ui.unit.IntOffset position);
    method public void resize(androidx.compose.ui.unit.IntSize size);
    method public void setModifier(androidx.ui.core.DrawLayerModifier p);
    method public void updateDisplayList();
    method public void updateLayerProperties();
    property public abstract long layerId;
    property public abstract androidx.ui.core.DrawLayerModifier modifier;
  }

  public interface Owner {
    method public androidx.compose.ui.unit.IntOffset calculatePosition();
    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
    method public androidx.ui.autofill.Autofill? getAutofill();
    method public androidx.ui.autofill.AutofillTree getAutofillTree();
    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.text.font.Font.ResourceLoader getFontLoader();
    method public androidx.ui.core.hapticfeedback.HapticFeedback getHapticFeedBack();
    method public long getMeasureIteration();
    method public androidx.ui.core.LayoutNode getRoot();
    method public androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry? getSavedStateRegistry();
    method public androidx.ui.core.semantics.SemanticsOwner getSemanticsOwner();
    method public boolean getShowLayoutBounds();
    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
    method public androidx.ui.core.texttoolbar.TextToolbar getTextToolbar();
    method public void measureAndLayout();
    method public void observeLayoutModelReads(androidx.ui.core.LayoutNode node, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void observeMeasureModelReads(androidx.ui.core.LayoutNode node, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void onAttach(androidx.ui.core.LayoutNode node);
    method public void onDetach(androidx.ui.core.LayoutNode node);
    method public void onInvalidate(androidx.ui.core.LayoutNode layoutNode);
    method public void onRequestMeasure(androidx.ui.core.LayoutNode layoutNode);
    method public void onRequestRelayout(androidx.ui.core.LayoutNode layoutNode);
    method public void onSemanticsChange();
    method public void pauseModelReadObserveration(kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public boolean requestFocus();
    method @androidx.ui.core.keyinput.ExperimentalKeyInput public boolean sendKeyEvent(androidx.ui.core.keyinput.KeyEvent2 keyEvent);
    method public void setOnSavedStateRegistryAvailable(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry,kotlin.Unit> callback);
    method @androidx.ui.core.InternalCoreApi public void setShowLayoutBounds(boolean p);
    property public abstract androidx.ui.autofill.Autofill? autofill;
    property public abstract androidx.ui.autofill.AutofillTree autofillTree;
    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.text.font.Font.ResourceLoader fontLoader;
    property public abstract androidx.ui.core.hapticfeedback.HapticFeedback hapticFeedBack;
    property public abstract long measureIteration;
    property public abstract androidx.ui.core.LayoutNode root;
    property public abstract androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry? savedStateRegistry;
    property public abstract androidx.ui.core.semantics.SemanticsOwner semanticsOwner;
    property public abstract boolean showLayoutBounds;
    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
    property public abstract androidx.ui.core.texttoolbar.TextToolbar textToolbar;
    field public static final androidx.ui.core.Owner.Companion Companion;
  }

  public static final class Owner.Companion {
    method public boolean getEnableExtraAssertions();
    method public void setEnableExtraAssertions(boolean p);
    property public final boolean enableExtraAssertions;
  }

  public final class PainterModifierKt {
    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.compose.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.compose.ui.graphics.ColorFilter? colorFilter = null);
  }

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

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

  public abstract class Placeable {
    ctor public Placeable();
    method public abstract operator int get(androidx.ui.core.AlignmentLine line);
    method protected final androidx.compose.ui.unit.IntOffset getApparentToRealOffset();
    method public final int getHeight();
    method protected final androidx.compose.ui.unit.IntSize getMeasuredSize();
    method protected final androidx.compose.ui.unit.Constraints getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void place(androidx.compose.ui.unit.IntOffset position);
    method protected final void setMeasuredSize(androidx.compose.ui.unit.IntSize value);
    method protected final void setMeasurementConstraints(androidx.compose.ui.unit.Constraints p);
    property protected final androidx.compose.ui.unit.IntOffset apparentToRealOffset;
    property public final int height;
    property protected final androidx.compose.ui.unit.IntSize measuredSize;
    property protected final androidx.compose.ui.unit.Constraints measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method public abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
    method public abstract int getParentWidth();
    method public final void place(androidx.ui.core.Placeable, androidx.compose.ui.unit.IntOffset position);
    method public final void place(androidx.ui.core.Placeable, androidx.compose.ui.geometry.Offset position);
    method public final void place(androidx.ui.core.Placeable, int x, int y);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.compose.ui.geometry.Offset position);
    method public final void placeAbsolute(androidx.ui.core.Placeable, int x, int y);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.compose.ui.unit.IntOffset position);
    property public abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
    property public abstract int parentWidth;
  }

  public final class PointerEvent {
    ctor public PointerEvent(java.util.List<androidx.ui.core.PointerInputChange> changes);
    method public java.util.List<androidx.ui.core.PointerInputChange> getChanges();
  }

  public enum PointerEventPass {
    method public static androidx.ui.core.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.PointerEventPass[] values();
    enum_constant public static final androidx.ui.core.PointerEventPass InitialDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostUp;
    enum_constant public static final androidx.ui.core.PointerEventPass PreDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PreUp;
  }

  public final inline class PointerId {
    ctor public PointerId();
    method public static long constructor-impl(long value);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getValue();
    method public static inline int hashCode-impl(long p);
    method public static inline String! toString-impl(long p);
  }

  @androidx.compose.Immutable public final class PointerInputChange {
    method public long component1();
    method public androidx.ui.core.PointerInputData component2();
    method public androidx.ui.core.PointerInputData component3();
    method public androidx.ui.core.ConsumedData component4();
    method @androidx.compose.Immutable public androidx.ui.core.PointerInputChange copy-jh1A5Og(long id, androidx.ui.core.PointerInputData current, androidx.ui.core.PointerInputData previous, androidx.ui.core.ConsumedData consumed);
    method public androidx.ui.core.ConsumedData getConsumed();
    method public androidx.ui.core.PointerInputData getCurrent();
    method public long getId();
    method public androidx.ui.core.PointerInputData getPrevious();
  }

  @androidx.compose.Immutable public final class PointerInputData {
    ctor public PointerInputData(androidx.compose.ui.unit.Uptime? uptime, androidx.compose.ui.geometry.Offset? position, boolean down);
    ctor public PointerInputData();
    method public androidx.compose.ui.unit.Uptime? component1();
    method public androidx.compose.ui.geometry.Offset? component2();
    method public boolean component3();
    method @androidx.compose.Immutable public androidx.ui.core.PointerInputData copy(androidx.compose.ui.unit.Uptime? uptime, androidx.compose.ui.geometry.Offset? position, boolean down);
    method public boolean getDown();
    method public androidx.compose.ui.geometry.Offset? getPosition();
    method public androidx.compose.ui.unit.Uptime? getUptime();
  }

  public final class PointerInputKt {
    method public static boolean anyChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean anyPositionChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDown(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUp(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeAllChanges(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeDownChange(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumePositionChange(androidx.ui.core.PointerInputChange, float consumedDx, float consumedDy);
    method public static androidx.compose.ui.geometry.Offset positionChange(androidx.ui.core.PointerInputChange);
    method public static androidx.compose.ui.geometry.Offset positionChangeIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean positionChanged(androidx.ui.core.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
  }

  public final class PopupKt {
    method @androidx.compose.Composable public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.compose.ui.unit.IntOffset offset = IntOffset(0, 0), boolean isFocusable = false, kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Popup(androidx.ui.core.PopupPositionProvider popupPositionProvider, boolean isFocusable = false, kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  @androidx.compose.Immutable public interface PopupPositionProvider {
    method public androidx.compose.ui.unit.IntOffset calculatePosition(androidx.compose.ui.unit.IntBounds parentGlobalBounds, androidx.compose.ui.unit.IntBounds windowGlobalBounds, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.IntSize popupContentSize);
  }

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

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

  public interface RemeasurementModifier extends androidx.ui.core.Modifier.Element {
    method public void onRemeasurementAvailable(androidx.ui.core.Remeasurement remeasurement);
  }

  public final class SavedStateDelegateKt {
  }

  public final class SubcomposeLayoutKt {
    method @androidx.compose.Composable @androidx.ui.core.ExperimentalSubcomposeLayoutApi public static <T> void SubcomposeLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.SubcomposeMeasureScope<T>,? super androidx.compose.ui.unit.Constraints,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
  }

  @androidx.ui.core.ExperimentalSubcomposeLayoutApi public abstract class SubcomposeMeasureScope<T> extends androidx.ui.core.MeasureScope {
    ctor public SubcomposeMeasureScope();
    method public abstract java.util.List<androidx.ui.core.Measurable> subcompose(T? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class SubcompositionKt {
    method @MainThread public static androidx.compose.Composition subcomposeInto(androidx.ui.core.LayoutNode container, androidx.compose.Recomposer recomposer, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
  }

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

  @androidx.compose.Immutable public final inline class TransformOrigin {
    ctor public TransformOrigin();
    method public static long constructor-impl(internal long packedValue);
    method public static long copy-impl(long $this, float pivotFractionX = this.pivotFractionX, float pivotFractionY = this.pivotFractionY);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getPivotFractionX-impl(long $this);
    method public static float getPivotFractionY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method @androidx.compose.Immutable public static inline String! toString-impl(long p);
    field public static final androidx.ui.core.TransformOrigin.Companion Companion;
  }

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

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

  @androidx.compose.Stable public interface WithConstraintsScope {
    method public androidx.compose.ui.unit.Constraints getConstraints();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public float getMaxHeight();
    method public float getMaxWidth();
    method public float getMinHeight();
    method public float getMinWidth();
    property public abstract androidx.compose.ui.unit.Constraints constraints;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract float maxHeight;
    property public abstract float maxWidth;
    property public abstract float minHeight;
    property public abstract float minWidth;
  }

  public final class WrapperKt {
    method public static androidx.compose.Composition setContent(androidx.activity.ComponentActivity, androidx.compose.Recomposer recomposer = Recomposer.current(), kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.Composition setContent(android.view.ViewGroup, androidx.compose.Recomposer recomposer, androidx.compose.CompositionReference? parentComposition = null, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @Deprecated public static androidx.compose.Composition setContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.Composition setViewContent(android.view.ViewGroup, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    method public static androidx.compose.Composition setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    method @Deprecated @MainThread public static androidx.compose.Composition subcomposeInto(androidx.ui.core.LayoutNode container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
  }

  public interface ZIndexModifier extends androidx.ui.core.Modifier.Element {
    method public float getZIndex();
    property public abstract float zIndex;
  }

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

}

package androidx.ui.core.clipboard {

  public final class AndroidClipboardManagerKt {
  }

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

}

package androidx.ui.core.focus {

  @kotlin.RequiresOptIn(message="The Focus API is experimental and is likely to change in the future.") public @interface ExperimentalFocus {
  }

  @Deprecated public enum FocusDetailedState {
    method @Deprecated public static androidx.ui.core.focus.FocusDetailedState valueOf(String name) throws java.lang.IllegalArgumentException;
    method @Deprecated public static androidx.ui.core.focus.FocusDetailedState[] values();
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusDetailedState Active;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusDetailedState ActiveParent;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusDetailedState Captured;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusDetailedState Disabled;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusDetailedState Inactive;
  }

  @Deprecated public interface FocusModifier extends androidx.ui.core.Modifier.Element {
    method @Deprecated public boolean captureFocus();
    method @Deprecated public boolean freeFocus();
    method @Deprecated public androidx.ui.core.focus.FocusDetailedState getFocusDetailedState();
    method @Deprecated public void requestFocus();
    property public abstract androidx.ui.core.focus.FocusDetailedState focusDetailedState;
  }

  public final class FocusModifier2Kt {
    method @androidx.compose.Composable @androidx.ui.core.focus.ExperimentalFocus public static androidx.ui.core.Modifier focus(androidx.ui.core.Modifier);
  }

  public final class FocusModifierKt {
    method @Deprecated @androidx.compose.Composable public static androidx.ui.core.focus.FocusModifier FocusModifier();
    method @Deprecated public static androidx.ui.core.focus.FocusState getFocusState(androidx.ui.core.focus.FocusModifier);
  }

  public final class FocusNodeUtilsKt {
  }

  @androidx.ui.core.focus.ExperimentalFocus public interface FocusObserverModifier extends androidx.ui.core.Modifier.Element {
    method public kotlin.jvm.functions.Function1<androidx.ui.core.focus.FocusState2,kotlin.Unit> getOnFocusChange();
    property public abstract kotlin.jvm.functions.Function1<androidx.ui.core.focus.FocusState2,kotlin.Unit> onFocusChange;
  }

  public final class FocusObserverModifierKt {
    method @androidx.ui.core.focus.ExperimentalFocus public static androidx.ui.core.Modifier focusObserver(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.focus.FocusState2,kotlin.Unit> onFocusChange);
  }

  @androidx.ui.core.focus.ExperimentalFocus public final class FocusRequester {
    ctor public FocusRequester();
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public void requestFocus();
  }

  public final class FocusRequesterKt {
  }

  @androidx.ui.core.focus.ExperimentalFocus public interface FocusRequesterModifier extends androidx.ui.core.Modifier.Element {
    method public androidx.ui.core.focus.FocusRequester getFocusRequester();
    property public abstract androidx.ui.core.focus.FocusRequester focusRequester;
  }

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

  @Deprecated public enum FocusState {
    method @Deprecated public static androidx.ui.core.focus.FocusState valueOf(String name) throws java.lang.IllegalArgumentException;
    method @Deprecated public static androidx.ui.core.focus.FocusState[] values();
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusState Focused;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusState NotFocusable;
    enum_constant @Deprecated public static final androidx.ui.core.focus.FocusState NotFocused;
  }

  @androidx.ui.core.focus.ExperimentalFocus public enum FocusState2 {
    method public static androidx.ui.core.focus.FocusState2 valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.focus.FocusState2[] values();
    enum_constant public static final androidx.ui.core.focus.FocusState2 Active;
    enum_constant public static final androidx.ui.core.focus.FocusState2 ActiveParent;
    enum_constant public static final androidx.ui.core.focus.FocusState2 Captured;
    enum_constant public static final androidx.ui.core.focus.FocusState2 Disabled;
    enum_constant public static final androidx.ui.core.focus.FocusState2 Inactive;
  }

  public final class FocusStateKt {
    method @Deprecated public static androidx.ui.core.focus.FocusState focusState(androidx.ui.core.focus.FocusDetailedState);
    method public static boolean isFocused(androidx.ui.core.focus.FocusState2);
  }

}

package androidx.ui.core.gesture {

  public final class ConstantsKt {
    method public static androidx.compose.ui.unit.Duration getDoubleTapMinTime();
    method public static float getDoubleTapSlop();
    method public static androidx.compose.ui.unit.Duration getDoubleTapTimeout();
    method public static float getDoubleTapTouchSlop();
    method public static float getHoverTapSlop();
    method public static androidx.compose.ui.unit.Duration getHoverTapTimeout();
    method public static androidx.compose.ui.unit.Duration getJumpTapTimeout();
    method public static androidx.compose.ui.unit.Duration getLongPressTimeout();
    method public static float getMaxFlingVelocity();
    method public static float getMinFlingVelocity();
    method public static float getPagingTouchSlop();
    method public static float getPanSlop();
    method public static androidx.compose.ui.unit.Duration getPressTimeout();
    method public static float getScaleSlop();
    method public static float getTouchSlop();
    method public static float getWindowTouchSlop();
    method public static androidx.compose.ui.unit.Duration getZoomControlsTimeout();
  }

  public final class DoubleTapGestureFilterKt {
    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDoubleTap);
  }

  public final class DragGestureFilterKt {
    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
  }

  public interface DragObserver {
    method public default void onCancel();
    method public default androidx.compose.ui.geometry.Offset onDrag(androidx.compose.ui.geometry.Offset dragDistance);
    method public default void onStart(androidx.compose.ui.geometry.Offset downPosition);
    method public default void onStop(androidx.compose.ui.geometry.Offset velocity);
  }

  public final class DragSlopExceededGestureFilterKt {
    method public static androidx.ui.core.Modifier dragSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, androidx.ui.core.gesture.scrollorientationlocking.Orientation? orientation = null);
  }

  @kotlin.RequiresOptIn(message="This pointer input API is experimental and is likely to change before becoming " + "stable.") public @interface ExperimentalPointerInput {
  }

  public final class GestureUtilsKt {
    method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.compose.ui.unit.IntSize bounds);
  }

  public final class LongPressDragGestureFilterKt {
    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
  }

  public interface LongPressDragObserver {
    method public default void onCancel();
    method public default androidx.compose.ui.geometry.Offset onDrag(androidx.compose.ui.geometry.Offset dragDistance);
    method public default void onDragStart();
    method public default void onLongPress(androidx.compose.ui.geometry.Offset pxPosition);
    method public default void onStop(androidx.compose.ui.geometry.Offset velocity);
  }

  public final class LongPressGestureFilterKt {
    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onLongPress);
  }

  public final class PressIndicatorGestureFilterKt {
    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
  }

  public final class RawDragGestureFilterKt {
    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null, androidx.ui.core.gesture.scrollorientationlocking.Orientation? orientation = null);
  }

  public final class RawPressStartGestureFilterKt {
    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = androidx.ui.core.PointerEventPass.PostUp);
  }

  public final class RawScaleGestureFilterKt {
    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
  }

  public interface RawScaleObserver {
    method public default void onCancel();
    method public default float onScale(float scaleFactor);
    method public default void onStart();
    method public default void onStop();
  }

  public final class ScaleGestureFilterKt {
    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
  }

  public interface ScaleObserver {
    method public default void onCancel();
    method public void onScale(float scaleFactor);
    method public default void onStart();
    method public default void onStop();
  }

  public final class ScaleSlopExceededGestureFilterKt {
    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
  }

  public final class ScaleUtilKt {
  }

  public interface ScrollCallback {
    method public default void onCancel();
    method public default float onScroll(float scrollDistance);
    method public default void onStart(androidx.compose.ui.geometry.Offset downPosition);
    method public default void onStop(float velocity);
  }

  public final class ScrollGestureFilterKt {
    method public static androidx.ui.core.Modifier scrollGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScrollCallback scrollCallback, androidx.ui.core.gesture.scrollorientationlocking.Orientation orientation, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
  }

  public final class TapGestureFilterKt {
    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTap);
  }

}

package androidx.ui.core.gesture.customevents {

  public final class DelayUpEvent implements androidx.ui.core.CustomEvent {
    ctor public DelayUpEvent(androidx.ui.core.gesture.customevents.DelayUpMessage message, java.util.Set<androidx.ui.core.PointerId> pointers);
    method public androidx.ui.core.gesture.customevents.DelayUpMessage component1();
    method public java.util.Set<androidx.ui.core.PointerId> component2();
    method public androidx.ui.core.gesture.customevents.DelayUpEvent copy(androidx.ui.core.gesture.customevents.DelayUpMessage message, java.util.Set<androidx.ui.core.PointerId> pointers);
    method public androidx.ui.core.gesture.customevents.DelayUpMessage getMessage();
    method public java.util.Set<androidx.ui.core.PointerId> getPointers();
    method public void setMessage(androidx.ui.core.gesture.customevents.DelayUpMessage p);
  }

  public enum DelayUpMessage {
    method public static androidx.ui.core.gesture.customevents.DelayUpMessage valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.gesture.customevents.DelayUpMessage[] values();
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayUp;
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayedUpConsumed;
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayedUpNotConsumed;
  }

  public final class LongPressFiredEvent implements androidx.ui.core.CustomEvent {
    field public static final androidx.ui.core.gesture.customevents.LongPressFiredEvent INSTANCE;
  }

}

package androidx.ui.core.gesture.scrollorientationlocking {

  public enum Orientation {
    method public static androidx.ui.core.gesture.scrollorientationlocking.Orientation valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.gesture.scrollorientationlocking.Orientation[] values();
    enum_constant public static final androidx.ui.core.gesture.scrollorientationlocking.Orientation Horizontal;
    enum_constant public static final androidx.ui.core.gesture.scrollorientationlocking.Orientation Vertical;
  }

  @androidx.ui.core.gesture.ExperimentalPointerInput public final class ScrollOrientationLocker {
    ctor public ScrollOrientationLocker(androidx.ui.core.CustomEventDispatcher customEventDispatcher);
    method public void attemptToLockPointers(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.gesture.scrollorientationlocking.Orientation orientation);
    method public java.util.List<androidx.ui.core.PointerInputChange> getPointersFor(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.gesture.scrollorientationlocking.Orientation orientation);
    method public void onCancel();
    method public void onCustomEvent(androidx.ui.core.CustomEvent customEvent, androidx.ui.core.PointerEventPass pass);
    method public void onPointerInputSetup(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.PointerEventPass pass);
    method public void onPointerInputTearDown(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.PointerEventPass pass);
  }

}

package androidx.ui.core.gesture.util {

  public final class PolyFitLeastSquaresKt {
  }

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(androidx.compose.ui.unit.Uptime uptime, androidx.compose.ui.geometry.Offset position);
    method public androidx.compose.ui.unit.Velocity calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTrackerKt {
  }

}

package androidx.ui.core.hapticfeedback {

  public interface HapticFeedback {
    method public void performHapticFeedback(androidx.ui.core.hapticfeedback.HapticFeedbackType hapticFeedbackType);
  }

  public enum HapticFeedbackType {
    method public static androidx.ui.core.hapticfeedback.HapticFeedbackType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.hapticfeedback.HapticFeedbackType[] values();
    enum_constant public static final androidx.ui.core.hapticfeedback.HapticFeedbackType LongPress;
    enum_constant public static final androidx.ui.core.hapticfeedback.HapticFeedbackType TextHandleMove;
  }

}

package androidx.ui.core.input {

  public interface FocusManager {
    method public void blur(androidx.ui.core.input.FocusNode client);
    method public void registerObserver(androidx.ui.core.input.FocusNode node, kotlin.jvm.functions.Function2<? super androidx.ui.core.input.FocusNode,? super androidx.ui.core.input.FocusNode,kotlin.Unit> observer);
    method public void requestFocus(androidx.ui.core.input.FocusNode client);
  }

  public final class FocusManagerKt {
  }

  public final class FocusNode {
    ctor public FocusNode();
  }

}

package androidx.ui.core.keyinput {

  @kotlin.RequiresOptIn(message="The Key Input API is experimental and is likely to change in the future.") public @interface ExperimentalKeyInput {
  }

  public final inline class Key {
    ctor public Key();
    method public static int constructor-impl(int keyCode);
    method public static inline boolean equals-impl(int p, Object? p1);
    method public static boolean equals-impl0(int p1, int p2);
    method public int getKeyCode();
    method public static inline int hashCode-impl(int p);
    method public static String toString-impl(int $this);
    field public static final androidx.ui.core.keyinput.Key.Companion Companion;
  }

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

  @Deprecated public final class KeyEvent {
    method @Deprecated public int component1();
    method @Deprecated public androidx.ui.core.keyinput.KeyEventType component2();
    method @Deprecated public androidx.ui.core.keyinput.KeyEvent copy-x3VrOOY(int key, androidx.ui.core.keyinput.KeyEventType type);
    method @Deprecated public int getKey();
    method @Deprecated public androidx.ui.core.keyinput.KeyEventType getType();
  }

  @androidx.ui.core.keyinput.ExperimentalKeyInput public interface KeyEvent2 {
    method public int getKey();
    method public androidx.ui.core.keyinput.KeyEventType getType();
    property public abstract int key;
    property public abstract androidx.ui.core.keyinput.KeyEventType type;
  }

  @androidx.ui.core.keyinput.ExperimentalKeyInput public enum KeyEventType {
    method public static androidx.ui.core.keyinput.KeyEventType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.keyinput.KeyEventType[] values();
    enum_constant public static final androidx.ui.core.keyinput.KeyEventType KeyDown;
    enum_constant public static final androidx.ui.core.keyinput.KeyEventType KeyUp;
    enum_constant public static final androidx.ui.core.keyinput.KeyEventType Unknown;
  }

  public final class KeyInputModifierKt {
    method @androidx.ui.core.keyinput.ExperimentalKeyInput public static androidx.ui.core.Modifier keyInputFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.keyinput.KeyEvent2,java.lang.Boolean> onKeyEvent);
    method @androidx.ui.core.keyinput.ExperimentalKeyInput public static androidx.ui.core.Modifier previewKeyInputFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.keyinput.KeyEvent2,java.lang.Boolean> onPreviewKeyEvent);
  }

}

package androidx.ui.core.pointerinput {

  public final class HitPathTrackerKt {
  }

  public final class MotionEventAdapterKt {
  }

  public final class PointerInputEventProcessorKt {
  }

  public abstract class PointerInputFilter {
    ctor public PointerInputFilter();
    method public abstract void onCancel();
    method public void onCustomEvent(androidx.ui.core.CustomEvent customEvent, androidx.ui.core.PointerEventPass pass);
    method public void onInit(androidx.ui.core.CustomEventDispatcher customEventDispatcher);
    method public java.util.List<androidx.ui.core.PointerInputChange> onPointerEvent(androidx.ui.core.PointerEvent pointerEvent, androidx.ui.core.PointerEventPass pass, androidx.compose.ui.unit.IntSize bounds);
    method public abstract java.util.List<androidx.ui.core.PointerInputChange> onPointerInput(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.PointerEventPass pass, androidx.compose.ui.unit.IntSize bounds);
  }

  public interface PointerInputModifier extends androidx.ui.core.Modifier.Element {
    method public androidx.ui.core.pointerinput.PointerInputFilter getPointerInputFilter();
    property public abstract androidx.ui.core.pointerinput.PointerInputFilter pointerInputFilter;
  }

}

package androidx.ui.core.selection {

  public interface Selectable {
    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.compose.ui.geometry.Offset getHandlePosition(androidx.ui.core.selection.Selection selection, boolean isStartHandle);
    method public androidx.ui.core.LayoutCoordinates? getLayoutCoordinates();
    method public androidx.ui.core.selection.Selection? getSelection(androidx.compose.ui.geometry.Offset startPosition, androidx.compose.ui.geometry.Offset endPosition, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, boolean longPress, androidx.ui.core.selection.Selection? previousSelection = null, boolean isStartHandle = true);
    method public androidx.compose.ui.text.AnnotatedString getText();
  }

  @androidx.compose.Immutable public final class Selection {
    ctor public Selection(androidx.ui.core.selection.Selection.AnchorInfo start, androidx.ui.core.selection.Selection.AnchorInfo end, boolean handlesCrossed);
    method public androidx.ui.core.selection.Selection.AnchorInfo component1();
    method public androidx.ui.core.selection.Selection.AnchorInfo component2();
    method public boolean component3();
    method @androidx.compose.Immutable public androidx.ui.core.selection.Selection copy(androidx.ui.core.selection.Selection.AnchorInfo start, androidx.ui.core.selection.Selection.AnchorInfo end, boolean handlesCrossed);
    method public androidx.ui.core.selection.Selection.AnchorInfo getEnd();
    method public boolean getHandlesCrossed();
    method public androidx.ui.core.selection.Selection.AnchorInfo getStart();
    method public androidx.ui.core.selection.Selection merge(androidx.ui.core.selection.Selection? other);
    method public androidx.compose.ui.text.TextRange toTextRange();
  }

  @androidx.compose.Immutable public static final class Selection.AnchorInfo {
    ctor public Selection.AnchorInfo(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.compose.ui.text.style.ResolvedTextDirection component1();
    method public int component2();
    method public androidx.ui.core.selection.Selectable component3();
    method @androidx.compose.Immutable public androidx.ui.core.selection.Selection.AnchorInfo copy(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getDirection();
    method public int getOffset();
    method public androidx.ui.core.selection.Selectable getSelectable();
  }

  public final class SelectionContainerKt {
    method @androidx.compose.Composable public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class SelectionHandlesKt {
  }

  public final class SelectionLayoutKt {
  }

  public final class SelectionManagerKt {
  }

  public interface SelectionRegistrar {
    method public void onPositionChange();
    method public androidx.ui.core.selection.Selectable subscribe(androidx.ui.core.selection.Selectable selectable);
    method public void unsubscribe(androidx.ui.core.selection.Selectable selectable);
  }

  public final class SelectionRegistrarKt {
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
  }

}

package androidx.ui.core.semantics {

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

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

  public interface SemanticsModifier extends androidx.ui.core.Modifier.Element {
    method public int getId();
    method public androidx.ui.core.semantics.SemanticsConfiguration getSemanticsConfiguration();
    property public abstract int id;
    property public abstract androidx.ui.core.semantics.SemanticsConfiguration semanticsConfiguration;
  }

  public final class SemanticsModifierKt {
    method public static androidx.ui.core.Modifier semantics(androidx.ui.core.Modifier, boolean mergeAllDescendants = false, kotlin.jvm.functions.Function1<? super androidx.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.ui.core.AlignmentLine line);
    method public androidx.compose.ui.unit.PxBounds getBoundsInRoot();
    method public java.util.List<androidx.ui.core.semantics.SemanticsNode> getChildren();
    method public androidx.ui.core.LayoutNode getComponentNode();
    method public androidx.ui.core.semantics.SemanticsConfiguration getConfig();
    method public androidx.compose.ui.unit.PxBounds getGlobalBounds();
    method public androidx.compose.ui.geometry.Offset getGlobalPosition();
    method public int getId();
    method public boolean getMergingEnabled();
    method public androidx.ui.core.semantics.SemanticsNode? getParent();
    method public androidx.compose.ui.geometry.Offset getPositionInRoot();
    method public androidx.compose.ui.unit.IntSize getSize();
    method public boolean isRoot();
    property public final androidx.compose.ui.unit.PxBounds boundsInRoot;
    property public final java.util.List<androidx.ui.core.semantics.SemanticsNode> children;
    property public final androidx.ui.core.LayoutNode componentNode;
    property public final androidx.ui.core.semantics.SemanticsConfiguration config;
    property public final androidx.compose.ui.unit.PxBounds globalBounds;
    property public final androidx.compose.ui.geometry.Offset globalPosition;
    property public final int id;
    property public final boolean isRoot;
    property public final androidx.ui.core.semantics.SemanticsNode? parent;
    property public final androidx.compose.ui.geometry.Offset positionInRoot;
    property public final androidx.compose.ui.unit.IntSize size;
  }

  public final class SemanticsNodeKt {
    method public static androidx.ui.core.semantics.SemanticsNode? findClosestParentNode(androidx.ui.core.semantics.SemanticsNode, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsNode,java.lang.Boolean> selector);
  }

  public final class SemanticsOwner {
    ctor public SemanticsOwner(androidx.ui.core.LayoutNode rootNode);
    method public androidx.ui.core.LayoutNode getRootNode();
    method public androidx.ui.core.semantics.SemanticsNode getRootSemanticsNode();
    method public androidx.ui.core.semantics.SemanticsNode getUnmergedRootSemanticsNode();
    property public final androidx.ui.core.semantics.SemanticsNode rootSemanticsNode;
    property public final androidx.ui.core.semantics.SemanticsNode unmergedRootSemanticsNode;
  }

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

}

package androidx.ui.core.texttoolbar {

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

  public final class TextToolbarKt {
  }

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

}

package androidx.ui.core.texttoolbar.actionmodecallback {

  public final class TextActionModeCallbackKt {
  }

}

package androidx.ui.node {

  public final class PointerInteropFilterKt {
  }

  public final class PointerInteropUtilsKt {
  }

  public final class UiApplier implements androidx.compose.Applier<java.lang.Object> {
    ctor public UiApplier(Object root);
    method public void clear();
    method public void down(Object node);
    method public Object getCurrent();
    method public void insert(int index, Object instance);
    method public void move(int from, int to, int count);
    method public void remove(int index, int count);
    method public void up();
    property public Object current;
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ViewAdapter {
    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
    method public int getId();
    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
    property public abstract int id;
  }

  public final class ViewInteropKt {
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static <T extends androidx.ui.node.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
  }

}

package androidx.ui.platform {

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

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

}

package androidx.ui.res {

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

  @androidx.compose.Stable public final class DeferredResource<T> {
    method public androidx.ui.res.Resource<T> getResource();
    property public final androidx.ui.res.Resource<T> resource;
  }

  public final class FailedResource<T> extends androidx.ui.res.Resource<T> {
    ctor public FailedResource(T? resource, Throwable? throwable);
    method public Throwable? getThrowable();
  }

  public final class FontResourcesKt {
    method @androidx.compose.Composable public static androidx.compose.ui.text.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.compose.ui.text.Typeface> loadFontResource(androidx.compose.ui.text.font.FontFamily fontFamily, androidx.compose.ui.text.font.FontFamily? pendingFontFamily = null, androidx.compose.ui.text.font.FontFamily? failedFontFamily = null);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.compose.ui.text.Typeface> loadFontResource(androidx.compose.ui.text.font.FontFamily fontFamily, androidx.compose.ui.text.Typeface? pendingTypeface = null, androidx.compose.ui.text.Typeface? failedTypeface = null);
  }

  public final class ImageResourcesKt {
    method @androidx.compose.Composable public static androidx.compose.ui.graphics.ImageAsset imageResource(@DrawableRes int id);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.compose.ui.graphics.ImageAsset> loadImageResource(int id, androidx.compose.ui.graphics.ImageAsset? pendingImage = null, androidx.compose.ui.graphics.ImageAsset? failedImage = null);
  }

  public final class LoadedResource<T> extends androidx.ui.res.Resource<T> {
    ctor public LoadedResource(T! resource);
  }

  public final class PendingResource<T> extends androidx.ui.res.Resource<T> {
    ctor public PendingResource(T? resource);
  }

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

  public abstract sealed class Resource<T> {
    method public final T? getResource();
  }

  public final class ResourcesKt {
  }

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

  public final class VectorResourcesKt {
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.compose.ui.graphics.vector.VectorAsset> loadVectorResource(int id, androidx.compose.ui.graphics.vector.VectorAsset? pendingResource = null, androidx.compose.ui.graphics.vector.VectorAsset? failedResource = null);
    method @androidx.compose.Composable public static androidx.compose.ui.graphics.vector.VectorAsset vectorResource(@DrawableRes int id);
  }

}

package androidx.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
    ctor public AccessibilityAction(CharSequence? label, T action);
    method public CharSequence? component1();
    method public T component2();
    method public androidx.ui.semantics.AccessibilityAction<T> copy(CharSequence? label, T action);
    method public T getAction();
    method public CharSequence? getLabel();
  }

  public final class AccessibilityRangeInfo {
    ctor public AccessibilityRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float component1();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> component2();
    method public androidx.ui.semantics.AccessibilityRangeInfo copy(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public CharSequence component1();
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> component2();
    method public androidx.ui.semantics.CustomAccessibilityAction copy(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public CharSequence getLabel();
  }

  public final class SemanticsActions {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
    method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
    method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollForward();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
    property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
    property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollForward;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
    field public static final androidx.ui.semantics.SemanticsActions INSTANCE;
  }

  public final class SemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityLabel();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> getAccessibilityRangeInfo();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityValue();
    method public androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
    method public androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHidden();
    method public androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityLabel;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> AccessibilityRangeInfo;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityValue;
    property public final androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
    property public final androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Hidden;
    property public final androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
    field public static final androidx.ui.semantics.SemanticsProperties INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void disabled(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityRangeInfo getAccessibilityValueRange(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean> action);
    method public static androidx.compose.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public static void popup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static void scrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public static void scrollBy(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean> action);
    method @Deprecated public static void scrollForward(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public static void setAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setAccessibilityValueRange(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityRangeInfo p);
    method public static void setCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.ui.semantics.CustomAccessibilityAction> p);
    method public static void setFocused(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setProgress(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean> action);
    method public static void setSelection(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean> action);
    method public static void setTestTag(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setText(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
    method public static void setText(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean> action);
    method public static void setTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.TextRange p);
  }

  public final class SemanticsPropertyKey<T> {
    ctor public SemanticsPropertyKey(String name);
    method public String getName();
    method public operator T! getValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public operator void setValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
  }

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

}

package androidx.ui.testutils {

  public final class PointerInputTestUtilKt {
    method public static androidx.ui.core.PointerInputChange consume(androidx.ui.core.PointerInputChange, float dx = 0f, float dy = 0f, boolean downChange = false);
    method public static androidx.ui.core.PointerInputChange down(long id, androidx.compose.ui.unit.Duration duration = Duration.Zero, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChanges, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static void invokeOverAllPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event);
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass pointerEventPass, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.core.PointerEventPass pointerEventPass, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass![] pointerEventPasses, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.compose.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, java.util.List<androidx.ui.core.PointerInputChange> pointerInputChanges, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses, androidx.compose.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static void invokeOverPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses);
    method public static androidx.ui.core.PointerInputChange moveBy(androidx.ui.core.PointerInputChange, androidx.compose.ui.unit.Duration duration, float dx = 0f, float dy = 0f);
    method public static androidx.ui.core.PointerInputChange moveTo(androidx.ui.core.PointerInputChange, androidx.compose.ui.unit.Duration duration, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange up(androidx.ui.core.PointerInputChange, androidx.compose.ui.unit.Duration duration);
  }

}

package androidx.ui.tooling {

  public final class InspectionModeKt {
    method public static androidx.compose.ProvidableAmbient<java.lang.Boolean> getInspectionMode();
  }

}

package androidx.ui.viewinterop {

  public final class AndroidViewKt {
    method @androidx.compose.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> viewBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update = NoOpUpdate);
    method @Deprecated @androidx.compose.Composable public static void AndroidView(@LayoutRes int resId, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
    method @Deprecated @androidx.compose.Composable public static void AndroidView(android.view.View view, androidx.ui.core.Modifier modifier = Modifier);
    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
  }

  public final class EmitViewKt {
    method @androidx.compose.Composable public static <T extends android.view.View> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method @androidx.compose.Composable public static <T extends android.view.ViewGroup> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

}

package androidx.ui.viewmodel {

  public final class ViewModelKt {
    method @androidx.compose.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, String? key = null, androidx.lifecycle.ViewModelProvider.Factory? factory = null);
    method @androidx.compose.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! viewModel(String key = null, androidx.lifecycle.ViewModelProvider.Factory? factory = null);
  }

}

