// Signature format: 3.0
package androidx.core.animation {

  public final class AnimatorKt {
    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
  }

}

package androidx.core.content {

  public final class ContentValuesKt {
    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class ContextKt {
    method public static inline <reified T> T! getSystemService(android.content.Context);
    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
  }

  public final class SharedPreferencesKt {
    method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
  }

}

package androidx.core.content.res {

  public final class TypedArrayKt {
    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
  }

}

package androidx.core.database {

  public final class CursorKt {
    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
    method public static inline String? getStringOrNull(android.database.Cursor, int index);
  }

}

package androidx.core.database.sqlite {

  public final class SQLiteDatabaseKt {
    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
  }

}

package androidx.core.graphics {

  public final class BitmapKt {
    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
    method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
  }

  public final class CanvasKt {
    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
  }

  public final class ColorKt {
    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
    method public static inline operator int component1(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
    method public static inline operator int component2(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
    method public static inline operator int component3(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
    method public static inline operator int component4(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
    method public static inline int getAlpha(@ColorInt int);
    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
    method public static inline int getBlue(@ColorInt int);
    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
    method public static inline int getGreen(@ColorInt int);
    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
    method public static inline int getRed(@ColorInt int);
    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
    method @ColorInt public static inline int toColorInt(String);
    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
  }

  public final class ImageDecoderKt {
    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
  }

  public final class MatrixKt {
    method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
    method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
    method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
    method public static inline float[] values(android.graphics.Matrix);
  }

  public final class PaintKt {
    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
    method public static inline boolean setBlendModeColorFilter(android.graphics.Paint, @ColorInt int color, androidx.core.graphics.BlendModeCompat? blendModeCompat);
  }

  public final class PathKt {
    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
  }

  public final class PictureKt {
    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
  }

  public final class PointKt {
    method public static inline operator int component1(android.graphics.Point);
    method public static inline operator float component1(android.graphics.PointF);
    method public static inline operator int component2(android.graphics.Point);
    method public static inline operator float component2(android.graphics.PointF);
    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
  }

  public final class PorterDuffKt {
    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
  }

  public final class RectKt {
    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator int component1(android.graphics.Rect);
    method public static inline operator float component1(android.graphics.RectF);
    method public static inline operator int component2(android.graphics.Rect);
    method public static inline operator float component2(android.graphics.RectF);
    method public static inline operator int component3(android.graphics.Rect);
    method public static inline operator float component3(android.graphics.RectF);
    method public static inline operator int component4(android.graphics.Rect);
    method public static inline operator float component4(android.graphics.RectF);
    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
  }

  public final class RegionKt {
    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region not(android.graphics.Region);
    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
  }

  public final class ShaderKt {
    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
  }

}

package androidx.core.graphics.drawable {

  public final class BitmapDrawableKt {
    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
  }

  public final class ColorDrawableKt {
    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
  }

  public final class DrawableKt {
    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
  }

  public final class IconKt {
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
  }

}

package androidx.core.location {

  public final class LocationKt {
    method public static inline operator double component1(android.location.Location);
    method public static inline operator double component2(android.location.Location);
  }

}

package androidx.core.net {

  public final class UriKt {
    method public static java.io.File toFile(android.net.Uri);
    method public static inline android.net.Uri toUri(String);
    method public static inline android.net.Uri toUri(java.io.File);
  }

}

package androidx.core.os {

  public final class BundleKt {
    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class HandlerKt {
    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
  }

  public final class PersistableBundleKt {
    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class TraceKt {
    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
  }

}

package androidx.core.text {

  public final class CharSequenceKt {
    method public static inline boolean isDigitsOnly(CharSequence);
    method public static inline int trimmedLength(CharSequence);
  }

  public final class HtmlKt {
    method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
    method public static inline String toHtml(android.text.Spanned, int option = 0);
  }

  public final class LocaleKt {
    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
  }

  public final class SpannableStringBuilderKt {
    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
  }

  public final class SpannableStringKt {
    method public static inline void clearSpans(android.text.Spannable);
    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
    method public static inline android.text.Spannable toSpannable(CharSequence);
  }

  public final class SpannedStringKt {
    method public static inline <reified T> T![] getSpans(android.text.Spanned, int start = 0, int end = length);
    method public static inline android.text.Spanned toSpanned(CharSequence);
  }

  public final class StringKt {
    method public static inline String htmlEncode(String);
  }

}

package androidx.core.transition {

  public final class TransitionKt {
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
  }

}

package androidx.core.util {

  public final class AtomicFileKt {
    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
  }

  public final class HalfKt {
    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
  }

  public final class LongSparseArrayKt {
    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
  }

  public final class LruCacheKt {
    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ ->  });
  }

  public final class PairKt {
    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
  }

  public final class RangeKt {
    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
  }

  public final class SizeKt {
    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
  }

  public final class SparseArrayKt {
    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public static inline <T> int getSize(android.util.SparseArray<T>);
    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
  }

  public final class SparseBooleanArrayKt {
    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
    method public static inline int getSize(android.util.SparseBooleanArray);
    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
  }

  public final class SparseIntArrayKt {
    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
    method public static inline int getSize(android.util.SparseIntArray);
    method public static inline boolean isEmpty(android.util.SparseIntArray);
    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
    method public static boolean remove(android.util.SparseIntArray, int key, int value);
    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
  }

  public final class SparseLongArrayKt {
    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
  }

}

package androidx.core.view {

  public final class MenuKt {
    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
    method public static inline int getSize(android.view.Menu);
    method public static inline boolean isEmpty(android.view.Menu);
    method public static inline boolean isNotEmpty(android.view.Menu);
    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
  }

  public final class ViewGroupKt {
    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
    method public static operator android.view.View get(android.view.ViewGroup, int index);
    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
    method public static inline int getSize(android.view.ViewGroup);
    method public static inline boolean isEmpty(android.view.ViewGroup);
    method public static inline boolean isNotEmpty(android.view.ViewGroup);
    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
  }

  public final class ViewKt {
    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
    method public static inline int getMarginBottom(android.view.View);
    method public static inline int getMarginEnd(android.view.View);
    method public static inline int getMarginLeft(android.view.View);
    method public static inline int getMarginRight(android.view.View);
    method public static inline int getMarginStart(android.view.View);
    method public static inline int getMarginTop(android.view.View);
    method public static inline boolean isGone(android.view.View);
    method public static inline boolean isInvisible(android.view.View);
    method public static inline boolean isVisible(android.view.View);
    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public static inline void setGone(android.view.View, boolean value);
    method public static inline void setInvisible(android.view.View, boolean value);
    method public static inline void setPadding(android.view.View, @Px int size);
    method public static inline void setVisible(android.view.View, boolean value);
    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
    method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
  }

}

package androidx.core.widget {

  public final class TextViewKt {
    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
  }

}

