// Signature format: 3.0
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.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.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.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.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.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.ui.unit.IntOffset align(androidx.ui.unit.IntSize size, androidx.ui.core.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.ui.core.LayoutDirection layoutDirection);
    method @androidx.compose.Immutable public androidx.ui.core.AbsoluteAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.Immutable public interface Alignment {
    method public androidx.ui.unit.IntOffset align(androidx.ui.unit.IntSize size, androidx.ui.core.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.ui.core.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.animation.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.ui.unit.Density> getDensityAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.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 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.ui.core.LayoutDirection getLocaleLayoutDirection(android.content.res.Configuration);
  }

  public interface AndroidOwner extends androidx.ui.core.Owner {
    method 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;
  }

  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 ClipKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier clip(androidx.ui.core.Modifier, androidx.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 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.ui.geometry.Offset positionChange, boolean downChange);
    ctor public ConsumedData();
    method public androidx.ui.geometry.Offset component1();
    method public boolean component2();
    method @androidx.compose.Immutable public androidx.ui.core.ConsumedData copy(androidx.ui.geometry.Offset positionChange, boolean downChange);
    method public boolean getDownChange();
    method public androidx.ui.geometry.Offset getPositionChange();
  }

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

  @androidx.compose.Stable public interface ContentScale {
    method public float scale(androidx.ui.geometry.Size srcSize, androidx.ui.geometry.Size 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 {
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String simpleIdentityToString(Object obj, String? name = null);
  }

  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) public default float getShadowElevation();
    method public default androidx.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) public default float shadowElevation;
    property public default androidx.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-RgGWxk0(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.ui.graphics.Shape shape = androidx.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.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-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
  }

  public enum DropDownAlignment {
    method public static androidx.ui.core.DropDownAlignment valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.DropDownAlignment[] values();
    enum_constant public static final androidx.ui.core.DropDownAlignment End;
    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
  }

  @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(androidx.ui.geometry.Size srcSize, androidx.ui.geometry.Size 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 IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    property public abstract Object? parentData;
  }

  public final class IntrinsicMeasurableKt {
  }

  public abstract class IntrinsicMeasureScope implements androidx.ui.unit.Density {
    ctor public IntrinsicMeasureScope();
    method public abstract androidx.ui.core.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.ui.core.LayoutDirection layoutDirection;
  }

  public interface LayoutCoordinates {
    method public androidx.ui.unit.PxBounds childBoundingBox(androidx.ui.core.LayoutCoordinates child);
    method public androidx.ui.geometry.Offset childToLocal(androidx.ui.core.LayoutCoordinates child, androidx.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.ui.unit.IntSize getSize();
    method public androidx.ui.geometry.Offset globalToLocal(androidx.ui.geometry.Offset global);
    method public boolean isAttached();
    method public androidx.ui.geometry.Offset localToGlobal(androidx.ui.geometry.Offset local);
    method public androidx.ui.geometry.Offset localToRoot(androidx.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.ui.unit.IntSize size;
  }

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

  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.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.ui.core.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.ui.core.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.ui.core.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.ui.core.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.ui.core.Constraints,? super androidx.ui.core.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.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method 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.ui.core.Constraints,? super androidx.ui.core.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.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? 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);
  }

  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.ui.core.LayoutDirection layoutDirection);
    method public default int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope, androidx.ui.core.Measurable measurable, androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public final class LayoutNode implements androidx.ui.core.Measurable {
    ctor public LayoutNode();
    method public void attach(androidx.ui.core.Owner owner);
    method public void detach();
    method public void draw(androidx.ui.graphics.Canvas canvas);
    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.LayoutState getLayoutState();
    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 androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? getRef();
    method public int getWidth();
    method public void hitTest(androidx.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.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.ui.core.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 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);
    method public void setRef(androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? value);
    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.LayoutState layoutState;
    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 androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? ref;
    property public final int width;
  }

  public enum LayoutNode.LayoutState {
    method public static androidx.ui.core.LayoutNode.LayoutState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.LayoutNode.LayoutState[] values();
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState LayingOut;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState Measuring;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState NeedsRelayout;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState NeedsRemeasure;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState Ready;
  }

  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.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.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.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.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.ui.core.LayoutDirection layoutDirection);
    method public Void maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.LayoutDirection layoutDirection);
    method public Void minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public Void minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.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.ui.core.Constraints constraints, androidx.ui.core.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.ui.core.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.ui.core.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);
  }

  public final class ModelObserver {
    ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
    method public void clear(Object target);
    method public void enableModelUpdatesObserving(boolean enabled);
    method public <T> void observeReads(T target, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onCommit, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method 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 public default operator androidx.ui.core.Modifier plus(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.ui.graphics.Canvas canvas);
    method public long getLayerId();
    method public android.graphics.Matrix getMatrix();
    method public void invalidate();
    method public void move(androidx.ui.unit.IntOffset position);
    method public void resize(androidx.ui.unit.IntSize size);
    method public void updateDisplayList();
    method public void updateLayerProperties();
    property public abstract long layerId;
  }

  public interface Owner {
    method public androidx.ui.unit.IntOffset calculatePosition();
    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.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.ui.unit.Density getDensity();
    method public androidx.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.ui.savedinstancestate.UiSavedStateRegistry? getSavedStateRegistry();
    method public androidx.ui.core.semantics.SemanticsOwner getSemanticsOwner();
    method public boolean getShowLayoutBounds();
    method public androidx.ui.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 public boolean sendKeyEvent(androidx.ui.core.keyinput.KeyEvent keyEvent);
    method public void setOnSavedStateRegistryAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.savedinstancestate.UiSavedStateRegistry,kotlin.Unit> callback);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @org.jetbrains.annotations.TestOnly 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.ui.unit.Density density;
    property public abstract androidx.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.ui.savedinstancestate.UiSavedStateRegistry? savedStateRegistry;
    property public abstract androidx.ui.core.semantics.SemanticsOwner semanticsOwner;
    property public abstract boolean showLayoutBounds;
    property public abstract androidx.ui.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.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.ui.graphics.ColorFilter? colorFilter = null);
  }

  public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
    method public Object? modifyParentData(androidx.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.ui.unit.IntOffset getApparentToRealOffset();
    method public final int getHeight();
    method protected final androidx.ui.unit.IntSize getMeasuredSize();
    method protected final androidx.ui.core.Constraints getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void place(androidx.ui.unit.IntOffset position);
    method protected final void setMeasuredSize(androidx.ui.unit.IntSize value);
    method protected final void setMeasurementConstraints(androidx.ui.core.Constraints p);
    property protected final androidx.ui.unit.IntOffset apparentToRealOffset;
    property public final int height;
    property protected final androidx.ui.unit.IntSize measuredSize;
    property protected final androidx.ui.core.Constraints measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method public abstract androidx.ui.core.LayoutDirection getParentLayoutDirection();
    method public abstract int getParentWidth();
    method public final void place(androidx.ui.core.Placeable, androidx.ui.unit.IntOffset position);
    method public final void place(androidx.ui.core.Placeable, androidx.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.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.ui.unit.IntOffset position);
    property public abstract androidx.ui.core.LayoutDirection parentLayoutDirection;
    property public abstract int parentWidth;
  }

  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.ui.unit.Uptime? uptime, androidx.ui.geometry.Offset? position, boolean down);
    ctor public PointerInputData();
    method public androidx.ui.unit.Uptime? component1();
    method public androidx.ui.geometry.Offset? component2();
    method public boolean component3();
    method @androidx.compose.Immutable public androidx.ui.core.PointerInputData copy(androidx.ui.unit.Uptime? uptime, androidx.ui.geometry.Offset? position, boolean down);
    method public boolean getDown();
    method public androidx.ui.geometry.Offset? getPosition();
    method public androidx.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.ui.geometry.Offset positionChange(androidx.ui.core.PointerInputChange);
    method public static androidx.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 DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.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.Alignment alignment = Alignment.TopStart, androidx.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);
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, String? testTag = null);
  }

  @androidx.compose.Immutable public interface PopupPositionProvider {
    method public androidx.ui.unit.IntOffset calculatePosition(androidx.ui.unit.IntOffset parentLayoutPosition, androidx.ui.unit.IntSize parentLayoutSize, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.unit.IntSize popupSize);
  }

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

  public final class SavedStateDelegateKt {
  }

  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 @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.ui.core.Constraints getConstraints();
    method public androidx.ui.core.LayoutDirection getLayoutDirection();
    method public float getMaxHeight();
    method public float getMaxWidth();
    method public float getMinHeight();
    method public float getMinWidth();
    property public abstract androidx.ui.core.Constraints constraints;
    property public abstract androidx.ui.core.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, 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 @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);
    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.ui.text.AnnotatedString? getText();
    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
  }

}

package androidx.ui.core.focus {

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

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

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

  public final class FocusNodeUtilsKt {
  }

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

  public final class FocusStateKt {
    method public static androidx.ui.core.focus.FocusState focusState(androidx.ui.core.focus.FocusDetailedState);
  }

}

package androidx.ui.core.gesture {

  public final class ConstantsKt {
    method public static androidx.ui.unit.Duration getDoubleTapMinTime();
    method public static float getDoubleTapSlop();
    method public static androidx.ui.unit.Duration getDoubleTapTimeout();
    method public static float getDoubleTapTouchSlop();
    method public static float getHoverTapSlop();
    method public static androidx.ui.unit.Duration getHoverTapTimeout();
    method public static androidx.ui.unit.Duration getJumpTapTimeout();
    method public static androidx.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.ui.unit.Duration getPressTimeout();
    method public static float getScaleSlop();
    method public static float getTouchSlop();
    method public static float getWindowTouchSlop();
    method public static androidx.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.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.ui.geometry.Offset onDrag(androidx.ui.geometry.Offset dragDistance);
    method public default void onStart(androidx.ui.geometry.Offset downPosition);
    method public default void onStop(androidx.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);
  }

  public final class GestureUtilsKt {
    method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.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.ui.geometry.Offset onDrag(androidx.ui.geometry.Offset dragDistance);
    method public default void onDragStart();
    method public default void onLongPress(androidx.ui.geometry.Offset pxPosition);
    method public default void onStop(androidx.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.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.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);
  }

  public final class RawPressStartGestureFilterKt {
    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.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 final class TapGestureFilterKt {
    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.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.util {

  public final class PolyFitLeastSquaresKt {
  }

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(androidx.ui.unit.Uptime uptime, androidx.ui.geometry.Offset position);
    method public androidx.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 {

  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;
  }

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

  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;
  }

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

}

package androidx.ui.core.pointerinput {

  public final class HitPathTrackerKt {
  }

  public final class PointerInputEventData {
    method public long component1();
    method public androidx.ui.core.PointerInputData component2();
    method public androidx.ui.core.pointerinput.PointerInputEventData copy-tII9_pY(long id, androidx.ui.core.PointerInputData pointerInputData);
    method public long getId();
    method public androidx.ui.core.PointerInputData getPointerInputData();
  }

  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 abstract java.util.List<androidx.ui.core.PointerInputChange> onPointerInput(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.PointerEventPass pass, androidx.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.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.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.ui.geometry.Offset startPosition, androidx.ui.geometry.Offset endPosition, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, boolean longPress, androidx.ui.core.selection.Selection? previousSelection = null, boolean isStartHandle = true);
    method public androidx.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.ui.text.TextRange toTextRange();
  }

  @androidx.compose.Immutable public static final class Selection.AnchorInfo {
    ctor public Selection.AnchorInfo(androidx.ui.text.style.TextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.ui.text.style.TextDirection 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.ui.text.style.TextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.ui.text.style.TextDirection 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 final class SemanticsHintOverrides {
    ctor public SemanticsHintOverrides(String? onTapHint, String? onLongPressHint);
    method public String? component1();
    method public String? component2();
    method public androidx.ui.core.semantics.SemanticsHintOverrides copy(String? onTapHint, String? onLongPressHint);
    method public String? getOnLongPressHint();
    method public String? getOnTapHint();
    method public boolean isNotEmpty();
    property public final boolean isNotEmpty;
  }

  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 = null);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.ui.core.AlignmentLine line);
    method public androidx.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.ui.unit.PxBounds getGlobalBounds();
    method public androidx.ui.geometry.Offset getGlobalPosition();
    method public boolean getHasChildren();
    method public int getId();
    method public androidx.ui.core.semantics.SemanticsNode? getParent();
    method public androidx.ui.unit.IntSize getSize();
    method public androidx.ui.core.semantics.SemanticsConfiguration getUnmergedConfig();
    method public boolean isRoot();
    method public void setComponentNode(androidx.ui.core.LayoutNode p);
    property public final androidx.ui.unit.PxBounds boundsInRoot;
    property public final java.util.List<androidx.ui.core.semantics.SemanticsNode> children;
    property public final androidx.ui.core.semantics.SemanticsConfiguration config;
    property public final androidx.ui.unit.PxBounds globalBounds;
    property public final androidx.ui.geometry.Offset globalPosition;
    property public final boolean hasChildren;
    property public final boolean isRoot;
    property public final androidx.ui.core.semantics.SemanticsNode? parent;
    property public final androidx.ui.unit.IntSize size;
    field public static final androidx.ui.core.semantics.SemanticsNode.Companion Companion;
  }

  public static final class SemanticsNode.Companion {
    method public int generateNewId();
  }

  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();
    property public final androidx.ui.core.semantics.SemanticsNode rootSemanticsNode;
  }

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

}

package androidx.ui.core.texttoolbar {

  public interface TextToolbar {
    method public androidx.ui.core.texttoolbar.TextToolbarStatus getStatus();
    method public void hide();
    method public void showCopyMenu(androidx.ui.geometry.Rect rect, kotlin.jvm.functions.Function0<kotlin.Unit> onDeselectRequested, kotlin.jvm.functions.Function0<kotlin.Unit> onCopyRequested);
    property public abstract androidx.ui.core.texttoolbar.TextToolbarStatus status;
  }

  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.graphics.vector {

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

  public final class VectorApplier extends androidx.compose.AbstractApplier<androidx.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.ui.graphics.vector.VNode root);
    method public void insert(int index, androidx.ui.graphics.vector.VNode instance);
    method public void move(int from, int to, int count);
    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.ui.graphics.vector.VectorGroup component6();
    method public androidx.ui.graphics.vector.VectorAsset copy-rmhd70c(String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, androidx.ui.graphics.vector.VectorGroup root);
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.ui.graphics.vector.VectorGroup getRoot();
    method public float getViewportHeight();
    method public float getViewportWidth();
  }

  public final class VectorAssetBuilder {
    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
    method public androidx.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.ui.graphics.vector.VectorAssetBuilder popGroup();
    method public androidx.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.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
  }

  public final class VectorAssetBuilderKt {
    method public static androidx.ui.graphics.vector.VectorAssetBuilder group(androidx.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.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorAssetBuilder,kotlin.Unit> block);
    method public static androidx.ui.graphics.vector.VectorAssetBuilder path(androidx.ui.graphics.vector.VectorAssetBuilder, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f, kotlin.jvm.functions.Function1<? super androidx.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.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.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
  }

  public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.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.ui.graphics.vector.PathNode> clipPathData);
    ctor public VectorGroup();
    method public operator androidx.ui.graphics.vector.VectorNode get(int index);
    method public java.util.List<androidx.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.ui.graphics.vector.VectorNode> iterator();
    property public final int size;
  }

  public final class VectorKt {
    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
    method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
    method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
    method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.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.ui.graphics.painter.Painter {
    method public androidx.ui.geometry.Size getIntrinsicSize();
    method protected void onDraw(androidx.ui.graphics.drawscope.DrawScope);
    property public androidx.ui.geometry.Size intrinsicSize;
  }

  public final class VectorPainterKt {
    method @androidx.compose.Composable public static androidx.ui.graphics.vector.VectorPainter VectorPainter(androidx.ui.graphics.vector.VectorAsset asset);
    method @androidx.compose.Composable public static androidx.ui.graphics.vector.VectorPainter VectorPainter-CZQlTzY(float defaultWidth, float defaultHeight, float viewportWidth = Float.NaN, float viewportHeight = Float.NaN, 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.ui.graphics.vector.VectorNode {
    ctor public VectorPath(String name, java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public String component1();
    method public float component10();
    method public java.util.List<androidx.ui.graphics.vector.PathNode> component2();
    method public androidx.ui.graphics.Brush? component3();
    method public float component4();
    method public androidx.ui.graphics.Brush? component5();
    method public float component6();
    method public float component7();
    method public androidx.ui.graphics.StrokeCap component8();
    method public androidx.ui.graphics.StrokeJoin component9();
    method public androidx.ui.graphics.vector.VectorPath copy(String name, java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public androidx.ui.graphics.Brush? getFill();
    method public float getFillAlpha();
    method public String getName();
    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
    method public androidx.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
    method public androidx.ui.graphics.StrokeJoin getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
  }

}

package androidx.ui.graphics.vector.compat {

  public final class XmlVectorParserKt {
  }

}

package androidx.ui.input {

  public final class InputStateKt {
  }

  public final class RecordingInputConnectionKt {
  }

}

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 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 reset();
    method public void up();
    property public Object current;
  }

  public final class ViewInteropKt {
  }

}

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.ui.text.Typeface fontResource(androidx.ui.text.font.FontFamily fontFamily);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.text.Typeface> loadFontResource(androidx.ui.text.font.FontFamily fontFamily, androidx.ui.text.font.FontFamily? pendingFontFamily = null, androidx.ui.text.font.FontFamily? failedFontFamily = null);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.text.Typeface> loadFontResource(androidx.ui.text.font.FontFamily fontFamily, androidx.ui.text.Typeface? pendingTypeface = null, androidx.ui.text.Typeface? failedTypeface = null);
  }

  public final class ImageResourcesKt {
    method @androidx.compose.Composable public static androidx.ui.graphics.ImageAsset imageResource(@DrawableRes int id);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.graphics.ImageAsset> loadImageResource(int id, androidx.ui.graphics.ImageAsset? pendingImage = null, androidx.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.ui.graphics.vector.VectorAsset> loadVectorResource(int id, androidx.ui.graphics.vector.VectorAsset? pendingResource = null, androidx.ui.graphics.vector.VectorAsset? failedResource = null);
    method @androidx.compose.Composable public static androidx.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.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 @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.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollTo();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    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.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 @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.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollTo;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    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<java.lang.Boolean> getEnabled();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getHidden();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsPopup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.AnnotatedString> getText();
    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<java.lang.Boolean> Enabled;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Hidden;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsPopup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.AnnotatedString> Text;
    field public static final androidx.ui.semantics.SemanticsProperties INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void ScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean> action);
    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 getEnabled(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getHidden(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getOnClick(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getPopup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getScrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getScrollForward(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>> getScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>> getSetProgress(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.text.AnnotatedString getText(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 @Deprecated public static void scrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<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 setEnabled(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setHidden(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setOnClick(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method public static void setPopup(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 @Deprecated public static void setScrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method @Deprecated public static void setScrollForward(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method public static void setScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>> p);
    method public static void setSetProgress(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>> p);
    method public static void setTestTag(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setText(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.text.AnnotatedString p);
  }

  public class SemanticsPropertyKey<T> implements kotlin.properties.ReadWriteProperty<androidx.ui.semantics.SemanticsPropertyReceiver,T> {
    ctor public SemanticsPropertyKey(String name);
    method public final String getName();
    method public final T! getValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T! merge(T? existingValue, T? newValue);
    method public final 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.temputils {

  public final class CoroutineUtilsKt {
    method public static kotlinx.coroutines.Job delay(androidx.ui.unit.Duration duration, kotlin.coroutines.CoroutineContext context, kotlin.jvm.functions.Function0<kotlin.Unit> block);
  }

}

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.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.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChanges, androidx.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.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.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.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass pointerEventPass, androidx.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.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.core.PointerEventPass pointerEventPass, androidx.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.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass![] pointerEventPasses, androidx.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.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.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.ui.unit.Duration duration, float dx = 0f, float dy = 0f);
    method public static androidx.ui.core.PointerInputChange moveTo(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange up(androidx.ui.core.PointerInputChange, androidx.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 ComposedViewKt {
    method @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 @androidx.compose.Composable public static void AndroidView(android.view.View view, androidx.ui.core.Modifier modifier = Modifier);
  }

  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);
  }

}

