-keep class android.accounts.Account {
    <init>(java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String name;
    public java.lang.String type;
}

-keep class android.app.PendingIntent {

    public void cancel();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
    public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public android.content.IntentSender getIntentSender();
    public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
    public java.lang.String getTargetPackage();
    public int hashCode();
    public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
    public void send();
    public void send(int);
    public void send(android.content.Context, int, android.content.Intent);
    public void send(int, android.app.PendingIntent$OnFinished, android.os.Handler);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
    public java.lang.String toString();
    public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANCEL_CURRENT;
    public static int FLAG_IMMUTABLE;
    public static int FLAG_NO_CREATE;
    public static int FLAG_ONE_SHOT;
    public static int FLAG_UPDATE_CURRENT;
}

-keep class android.app.PendingIntent$CanceledException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.Exception);



}

-keep class android.app.PendingIntent$OnFinished {

    public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);


}

-keep class android.content.BroadcastReceiver {
    <init>();

    public void abortBroadcast();
    public void clearAbortBroadcast();
    public boolean getAbortBroadcast();
    public boolean getDebugUnregister();
    public int getResultCode();
    public java.lang.String getResultData();
    public android.os.Bundle getResultExtras(boolean);
    public android.content.BroadcastReceiver$PendingResult goAsync();
    public boolean isInitialStickyBroadcast();
    public boolean isOrderedBroadcast();
    public abstract void onReceive(android.content.Context, android.content.Intent);
    public android.os.IBinder peekService(android.content.Context, android.content.Intent);
    public void setDebugUnregister(boolean);
    public void setOrderedHint(boolean);
    public void setResult(int, java.lang.String, android.os.Bundle);
    public void setResultCode(int);
    public void setResultData(java.lang.String);
    public void setResultExtras(android.os.Bundle);


}

-keep class android.content.BroadcastReceiver$PendingResult {

    public void abortBroadcast();
    public void clearAbortBroadcast();
    public void finish();
    public boolean getAbortBroadcast();
    public int getResultCode();
    public java.lang.String getResultData();
    public android.os.Bundle getResultExtras(boolean);
    public void setResult(int, java.lang.String, android.os.Bundle);
    public void setResultCode(int);
    public void setResultData(java.lang.String);
    public void setResultExtras(android.os.Bundle);


}

-keep class android.content.ClipData {
    <init>(java.lang.CharSequence, java.lang.String[], android.content.ClipData$Item);
    <init>(android.content.ClipDescription, android.content.ClipData$Item);
    <init>(android.content.ClipData);

    public void addItem(android.content.ClipData$Item);
    public int describeContents();
    public android.content.ClipDescription getDescription();
    public android.content.ClipData$Item getItemAt(int);
    public int getItemCount();
    public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
    public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
    public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
    public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
    public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ClipData$Item {
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, java.lang.String);
    <init>(android.content.Intent);
    <init>(android.net.Uri);
    <init>(java.lang.CharSequence, android.content.Intent, android.net.Uri);
    <init>(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);

    public java.lang.String coerceToHtmlText(android.content.Context);
    public java.lang.CharSequence coerceToStyledText(android.content.Context);
    public java.lang.CharSequence coerceToText(android.content.Context);
    public java.lang.String getHtmlText();
    public android.content.Intent getIntent();
    public java.lang.CharSequence getText();
    public android.net.Uri getUri();
    public java.lang.String toString();


}

-keep class android.content.ClipDescription {
    <init>(java.lang.CharSequence, java.lang.String[]);
    <init>(android.content.ClipDescription);

    public static boolean compareMimeTypes(java.lang.String, java.lang.String);
    public int describeContents();
    public java.lang.String[] filterMimeTypes(java.lang.String);
    public java.lang.CharSequence getLabel();
    public java.lang.String getMimeType(int);
    public int getMimeTypeCount();
    public boolean hasMimeType(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String MIMETYPE_TEXT_HTML;
    public static java.lang.String MIMETYPE_TEXT_INTENT;
    public static java.lang.String MIMETYPE_TEXT_PLAIN;
    public static java.lang.String MIMETYPE_TEXT_URILIST;
}

-keep class android.content.ComponentCallbacks {

    public abstract void onConfigurationChanged(android.content.res.Configuration);
    public abstract void onLowMemory();


}

-keep class android.content.ComponentName {
    <init>(java.lang.String, java.lang.String);
    <init>(android.content.Context, java.lang.String);
    <init>(android.content.Context, java.lang.Class);
    <init>(android.os.Parcel);

    public android.content.ComponentName clone();
    public java.lang.Object clone();
    public int compareTo(android.content.ComponentName);
    public int compareTo(java.lang.Object);
    public static android.content.ComponentName createRelative(java.lang.String, java.lang.String);
    public static android.content.ComponentName createRelative(android.content.Context, java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String flattenToShortString();
    public java.lang.String flattenToString();
    public java.lang.String getClassName();
    public java.lang.String getPackageName();
    public java.lang.String getShortClassName();
    public int hashCode();
    public static android.content.ComponentName readFromParcel(android.os.Parcel);
    public java.lang.String toShortString();
    public java.lang.String toString();
    public static android.content.ComponentName unflattenFromString(java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public static void writeToParcel(android.content.ComponentName, android.os.Parcel);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ContentProvider {
    <init>();

    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
    public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    public android.net.Uri canonicalize(android.net.Uri);
    public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public java.lang.String getCallingPackage();
    public android.content.Context getContext();
    public android.content.pm.PathPermission[] getPathPermissions();
    public java.lang.String getReadPermission();
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public abstract java.lang.String getType(android.net.Uri);
    public java.lang.String getWritePermission();
    public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    protected boolean isTemporary();
    public void onConfigurationChanged(android.content.res.Configuration);
    public abstract boolean onCreate();
    public void onLowMemory();
    public void onTrimMemory(int);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    protected android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object, android.content.ContentProvider$PipeDataWriter);
    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    protected void setPathPermissions(android.content.pm.PathPermission[]);
    protected void setReadPermission(java.lang.String);
    protected void setWritePermission(java.lang.String);
    public void shutdown();
    public android.net.Uri uncanonicalize(android.net.Uri);
    public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);


}

-keep class android.content.ContentProvider$PipeDataWriter {

    public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object);


}

-keep class android.content.ContentProviderClient {

    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    public android.net.Uri canonicalize(android.net.Uri);
    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    protected void finalize();
    public android.content.ContentProvider getLocalContentProvider();
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public java.lang.String getType(android.net.Uri);
    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public boolean release();
    public android.net.Uri uncanonicalize(android.net.Uri);
    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);


}

-keep class android.content.ContentProviderOperation {

    public android.content.ContentProviderResult apply(android.content.ContentProvider, android.content.ContentProviderResult[], int);
    public int describeContents();
    public android.net.Uri getUri();
    public boolean isAssertQuery();
    public boolean isDelete();
    public boolean isInsert();
    public boolean isReadOperation();
    public boolean isUpdate();
    public boolean isWriteOperation();
    public boolean isYieldAllowed();
    public static android.content.ContentProviderOperation$Builder newAssertQuery(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newDelete(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newInsert(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newUpdate(android.net.Uri);
    public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
    public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ContentProviderOperation$Builder {

    public android.content.ContentProviderOperation build();
    public android.content.ContentProviderOperation$Builder withExpectedCount(int);
    public android.content.ContentProviderOperation$Builder withSelection(java.lang.String, java.lang.String[]);
    public android.content.ContentProviderOperation$Builder withSelectionBackReference(int, int);
    public android.content.ContentProviderOperation$Builder withValue(java.lang.String, java.lang.Object);
    public android.content.ContentProviderOperation$Builder withValueBackReference(java.lang.String, int);
    public android.content.ContentProviderOperation$Builder withValueBackReferences(android.content.ContentValues);
    public android.content.ContentProviderOperation$Builder withValues(android.content.ContentValues);
    public android.content.ContentProviderOperation$Builder withYieldAllowed(boolean);


}

-keep class android.content.ContentProviderResult {
    <init>(android.net.Uri);
    <init>(int);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.Integer count;
    public android.net.Uri uri;
}

-keep class android.content.ContentResolver {
    <init>(android.content.Context);

    public android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
    public android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
    public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
    public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
    public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
    public void cancelSync(android.net.Uri);
    public static void cancelSync(android.accounts.Account, java.lang.String);
    public static void cancelSync(android.content.SyncRequest);
    public android.net.Uri canonicalize(android.net.Uri);
    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    public static android.content.SyncInfo getCurrentSync();
    public static java.util.List getCurrentSyncs();
    public static int getIsSyncable(android.accounts.Account, java.lang.String);
    public static boolean getMasterSyncAutomatically();
    public java.util.List getOutgoingPersistedUriPermissions();
    public static java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String);
    public java.util.List getPersistedUriPermissions();
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public static android.content.SyncAdapterType[] getSyncAdapterTypes();
    public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
    public java.lang.String getType(android.net.Uri);
    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    public static boolean isSyncActive(android.accounts.Account, java.lang.String);
    public static boolean isSyncPending(android.accounts.Account, java.lang.String);
    public void notifyChange(android.net.Uri, android.database.ContentObserver);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public java.io.InputStream openInputStream(android.net.Uri);
    public java.io.OutputStream openOutputStream(android.net.Uri);
    public java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    public void releasePersistableUriPermission(android.net.Uri, int);
    public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public static void removeStatusChangeListener(java.lang.Object);
    public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public static void requestSync(android.content.SyncRequest);
    public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
    public static void setMasterSyncAutomatically(boolean);
    public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    public void startSync(android.net.Uri, android.os.Bundle);
    public void takePersistableUriPermission(android.net.Uri, int);
    public android.net.Uri uncanonicalize(android.net.Uri);
    public void unregisterContentObserver(android.database.ContentObserver);
    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public static void validateSyncExtrasBundle(android.os.Bundle);


    public static java.lang.String ANY_CURSOR_ITEM_TYPE;
    public static java.lang.String CURSOR_DIR_BASE_TYPE;
    public static java.lang.String CURSOR_ITEM_BASE_TYPE;
    public static java.lang.String EXTRA_SIZE;
    public static java.lang.String SCHEME_ANDROID_RESOURCE;
    public static java.lang.String SCHEME_CONTENT;
    public static java.lang.String SCHEME_FILE;
    public static java.lang.String SYNC_EXTRAS_ACCOUNT;
    public static java.lang.String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS;
    public static java.lang.String SYNC_EXTRAS_DO_NOT_RETRY;
    public static java.lang.String SYNC_EXTRAS_EXPEDITED;
    public static java.lang.String SYNC_EXTRAS_FORCE;
    public static java.lang.String SYNC_EXTRAS_IGNORE_BACKOFF;
    public static java.lang.String SYNC_EXTRAS_IGNORE_SETTINGS;
    public static java.lang.String SYNC_EXTRAS_INITIALIZE;
    public static java.lang.String SYNC_EXTRAS_MANUAL;
    public static java.lang.String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS;
    public static java.lang.String SYNC_EXTRAS_UPLOAD;
    public static int SYNC_OBSERVER_TYPE_ACTIVE;
    public static int SYNC_OBSERVER_TYPE_PENDING;
    public static int SYNC_OBSERVER_TYPE_SETTINGS;
}

-keep class android.content.ContentValues {
    <init>();
    <init>(int);
    <init>(android.content.ContentValues);

    public void clear();
    public boolean containsKey(java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.String);
    public java.lang.Boolean getAsBoolean(java.lang.String);
    public java.lang.Byte getAsByte(java.lang.String);
    public byte[] getAsByteArray(java.lang.String);
    public java.lang.Double getAsDouble(java.lang.String);
    public java.lang.Float getAsFloat(java.lang.String);
    public java.lang.Integer getAsInteger(java.lang.String);
    public java.lang.Long getAsLong(java.lang.String);
    public java.lang.Short getAsShort(java.lang.String);
    public java.lang.String getAsString(java.lang.String);
    public int hashCode();
    public java.util.Set keySet();
    public void put(java.lang.String, java.lang.String);
    public void put(java.lang.String, java.lang.Byte);
    public void put(java.lang.String, java.lang.Short);
    public void put(java.lang.String, java.lang.Integer);
    public void put(java.lang.String, java.lang.Long);
    public void put(java.lang.String, java.lang.Float);
    public void put(java.lang.String, java.lang.Double);
    public void put(java.lang.String, java.lang.Boolean);
    public void put(java.lang.String, byte[]);
    public void putAll(android.content.ContentValues);
    public void putNull(java.lang.String);
    public void remove(java.lang.String);
    public int size();
    public java.lang.String toString();
    public java.util.Set valueSet();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String TAG;
}

-keep class android.content.Context {
    <init>();

    public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public abstract int checkCallingOrSelfPermission(java.lang.String);
    public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public abstract int checkCallingPermission(java.lang.String);
    public abstract int checkCallingUriPermission(android.net.Uri, int);
    public abstract int checkPermission(java.lang.String, int, int);
    public abstract int checkSelfPermission(java.lang.String);
    public abstract int checkUriPermission(android.net.Uri, int, int, int);
    public abstract int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public abstract void clearWallpaper();
    public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
    public abstract android.content.Context createDisplayContext(android.view.Display);
    public abstract android.content.Context createPackageContext(java.lang.String, int);
    public abstract java.lang.String[] databaseList();
    public abstract boolean deleteDatabase(java.lang.String);
    public abstract boolean deleteFile(java.lang.String);
    public abstract void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public abstract void enforceCallingPermission(java.lang.String, java.lang.String);
    public abstract void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public abstract void enforcePermission(java.lang.String, int, int, java.lang.String);
    public abstract void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public abstract void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public abstract java.lang.String[] fileList();
    public abstract android.content.Context getApplicationContext();
    public abstract android.content.pm.ApplicationInfo getApplicationInfo();
    public abstract android.content.res.AssetManager getAssets();
    public abstract java.io.File getCacheDir();
    public abstract java.lang.ClassLoader getClassLoader();
    public abstract java.io.File getCodeCacheDir();
    public int getColor(int);
    public android.content.res.ColorStateList getColorStateList(int);
    public abstract android.content.ContentResolver getContentResolver();
    public abstract java.io.File getDatabasePath(java.lang.String);
    public abstract java.io.File getDir(java.lang.String, int);
    public android.graphics.drawable.Drawable getDrawable(int);
    public abstract java.io.File getExternalCacheDir();
    public abstract java.io.File[] getExternalCacheDirs();
    public abstract java.io.File getExternalFilesDir(java.lang.String);
    public abstract java.io.File[] getExternalFilesDirs(java.lang.String);
    public abstract java.io.File[] getExternalMediaDirs();
    public abstract java.io.File getFileStreamPath(java.lang.String);
    public abstract java.io.File getFilesDir();
    public abstract android.os.Looper getMainLooper();
    public abstract java.io.File getNoBackupFilesDir();
    public abstract java.io.File getObbDir();
    public abstract java.io.File[] getObbDirs();
    public abstract java.lang.String getPackageCodePath();
    public abstract android.content.pm.PackageManager getPackageManager();
    public abstract java.lang.String getPackageName();
    public abstract java.lang.String getPackageResourcePath();
    public abstract android.content.res.Resources getResources();
    public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public abstract java.lang.Object getSystemService(java.lang.String);
    public java.lang.Object getSystemService(java.lang.Class);
    public abstract java.lang.String getSystemServiceName(java.lang.Class);
    public java.lang.CharSequence getText(int);
    public abstract android.content.res.Resources$Theme getTheme();
    public abstract android.graphics.drawable.Drawable getWallpaper();
    public abstract int getWallpaperDesiredMinimumHeight();
    public abstract int getWallpaperDesiredMinimumWidth();
    public abstract void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isRestricted();
    public android.content.res.TypedArray obtainStyledAttributes(int[]);
    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    public abstract java.io.FileInputStream openFileInput(java.lang.String);
    public abstract java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public abstract android.graphics.drawable.Drawable peekWallpaper();
    public void registerComponentCallbacks(android.content.ComponentCallbacks);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public abstract void removeStickyBroadcast(android.content.Intent);
    public abstract void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void revokeUriPermission(android.net.Uri, int);
    public abstract void sendBroadcast(android.content.Intent);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendStickyBroadcast(android.content.Intent);
    public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void setTheme(int);
    public abstract void setWallpaper(android.graphics.Bitmap);
    public abstract void setWallpaper(java.io.InputStream);
    public abstract void startActivities(android.content.Intent[]);
    public abstract void startActivities(android.content.Intent[], android.os.Bundle);
    public abstract void startActivity(android.content.Intent);
    public abstract void startActivity(android.content.Intent, android.os.Bundle);
    public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public abstract android.content.ComponentName startService(android.content.Intent);
    public abstract boolean stopService(android.content.Intent);
    public abstract void unbindService(android.content.ServiceConnection);
    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
    public abstract void unregisterReceiver(android.content.BroadcastReceiver);


    public static java.lang.String ACCESSIBILITY_SERVICE;
    public static java.lang.String ACCOUNT_SERVICE;
    public static java.lang.String ACTIVITY_SERVICE;
    public static java.lang.String ALARM_SERVICE;
    public static java.lang.String APPWIDGET_SERVICE;
    public static java.lang.String APP_OPS_SERVICE;
    public static java.lang.String AUDIO_SERVICE;
    public static java.lang.String BATTERY_SERVICE;
    public static int BIND_ABOVE_CLIENT;
    public static int BIND_ADJUST_WITH_ACTIVITY;
    public static int BIND_ALLOW_OOM_MANAGEMENT;
    public static int BIND_AUTO_CREATE;
    public static int BIND_DEBUG_UNBIND;
    public static int BIND_IMPORTANT;
    public static int BIND_NOT_FOREGROUND;
    public static int BIND_WAIVE_PRIORITY;
    public static java.lang.String BLUETOOTH_SERVICE;
    public static java.lang.String CAMERA_SERVICE;
    public static java.lang.String CAPTIONING_SERVICE;
    public static java.lang.String CARRIER_CONFIG_SERVICE;
    public static java.lang.String CLIPBOARD_SERVICE;
    public static java.lang.String CONNECTIVITY_SERVICE;
    public static java.lang.String CONSUMER_IR_SERVICE;
    public static int CONTEXT_IGNORE_SECURITY;
    public static int CONTEXT_INCLUDE_CODE;
    public static int CONTEXT_RESTRICTED;
    public static java.lang.String DEVICE_POLICY_SERVICE;
    public static java.lang.String DISPLAY_SERVICE;
    public static java.lang.String DOWNLOAD_SERVICE;
    public static java.lang.String DROPBOX_SERVICE;
    public static java.lang.String FINGERPRINT_SERVICE;
    public static java.lang.String INPUT_METHOD_SERVICE;
    public static java.lang.String INPUT_SERVICE;
    public static java.lang.String JOB_SCHEDULER_SERVICE;
    public static java.lang.String KEYGUARD_SERVICE;
    public static java.lang.String LAUNCHER_APPS_SERVICE;
    public static java.lang.String LAYOUT_INFLATER_SERVICE;
    public static java.lang.String LOCATION_SERVICE;
    public static java.lang.String MEDIA_PROJECTION_SERVICE;
    public static java.lang.String MEDIA_ROUTER_SERVICE;
    public static java.lang.String MEDIA_SESSION_SERVICE;
    public static java.lang.String MIDI_SERVICE;
    public static int MODE_APPEND;
    public static int MODE_ENABLE_WRITE_AHEAD_LOGGING;
    public static int MODE_MULTI_PROCESS;
    public static int MODE_PRIVATE;
    public static int MODE_WORLD_READABLE;
    public static int MODE_WORLD_WRITEABLE;
    public static java.lang.String NETWORK_STATS_SERVICE;
    public static java.lang.String NFC_SERVICE;
    public static java.lang.String NOTIFICATION_SERVICE;
    public static java.lang.String NSD_SERVICE;
    public static java.lang.String POWER_SERVICE;
    public static java.lang.String PRINT_SERVICE;
    public static java.lang.String RESTRICTIONS_SERVICE;
    public static java.lang.String SEARCH_SERVICE;
    public static java.lang.String SENSOR_SERVICE;
    public static java.lang.String STORAGE_SERVICE;
    public static java.lang.String TELECOM_SERVICE;
    public static java.lang.String TELEPHONY_SERVICE;
    public static java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE;
    public static java.lang.String TEXT_SERVICES_MANAGER_SERVICE;
    public static java.lang.String TV_INPUT_SERVICE;
    public static java.lang.String UI_MODE_SERVICE;
    public static java.lang.String USAGE_STATS_SERVICE;
    public static java.lang.String USB_SERVICE;
    public static java.lang.String USER_SERVICE;
    public static java.lang.String VIBRATOR_SERVICE;
    public static java.lang.String WALLPAPER_SERVICE;
    public static java.lang.String WIFI_P2P_SERVICE;
    public static java.lang.String WIFI_SERVICE;
    public static java.lang.String WINDOW_SERVICE;
}

-keep class android.content.Intent {
    <init>();
    <init>(android.content.Intent);
    <init>(java.lang.String);
    <init>(java.lang.String, android.net.Uri);
    <init>(android.content.Context, java.lang.Class);
    <init>(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class);

    public android.content.Intent addCategory(java.lang.String);
    public android.content.Intent addFlags(int);
    public java.lang.Object clone();
    public android.content.Intent cloneFilter();
    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
    public int describeContents();
    public int fillIn(android.content.Intent, int);
    public boolean filterEquals(android.content.Intent);
    public int filterHashCode();
    public java.lang.String getAction();
    public boolean[] getBooleanArrayExtra(java.lang.String);
    public boolean getBooleanExtra(java.lang.String, boolean);
    public android.os.Bundle getBundleExtra(java.lang.String);
    public byte[] getByteArrayExtra(java.lang.String);
    public byte getByteExtra(java.lang.String, byte);
    public java.util.Set getCategories();
    public char[] getCharArrayExtra(java.lang.String);
    public char getCharExtra(java.lang.String, char);
    public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
    public java.util.ArrayList getCharSequenceArrayListExtra(java.lang.String);
    public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
    public android.content.ClipData getClipData();
    public android.content.ComponentName getComponent();
    public android.net.Uri getData();
    public java.lang.String getDataString();
    public double[] getDoubleArrayExtra(java.lang.String);
    public double getDoubleExtra(java.lang.String, double);
    public android.os.Bundle getExtras();
    public int getFlags();
    public float[] getFloatArrayExtra(java.lang.String);
    public float getFloatExtra(java.lang.String, float);
    public int[] getIntArrayExtra(java.lang.String);
    public int getIntExtra(java.lang.String, int);
    public java.util.ArrayList getIntegerArrayListExtra(java.lang.String);
    public static android.content.Intent getIntent(java.lang.String);
    public static android.content.Intent getIntentOld(java.lang.String);
    public long[] getLongArrayExtra(java.lang.String);
    public long getLongExtra(java.lang.String, long);
    public java.lang.String getPackage();
    public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
    public java.util.ArrayList getParcelableArrayListExtra(java.lang.String);
    public android.os.Parcelable getParcelableExtra(java.lang.String);
    public java.lang.String getScheme();
    public android.content.Intent getSelector();
    public java.io.Serializable getSerializableExtra(java.lang.String);
    public short[] getShortArrayExtra(java.lang.String);
    public short getShortExtra(java.lang.String, short);
    public android.graphics.Rect getSourceBounds();
    public java.lang.String[] getStringArrayExtra(java.lang.String);
    public java.util.ArrayList getStringArrayListExtra(java.lang.String);
    public java.lang.String getStringExtra(java.lang.String);
    public java.lang.String getType();
    public boolean hasCategory(java.lang.String);
    public boolean hasExtra(java.lang.String);
    public boolean hasFileDescriptors();
    public static android.content.Intent makeMainActivity(android.content.ComponentName);
    public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
    public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
    public static java.lang.String normalizeMimeType(java.lang.String);
    public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public static android.content.Intent parseUri(java.lang.String, int);
    public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putExtra(java.lang.String, boolean);
    public android.content.Intent putExtra(java.lang.String, byte);
    public android.content.Intent putExtra(java.lang.String, char);
    public android.content.Intent putExtra(java.lang.String, short);
    public android.content.Intent putExtra(java.lang.String, int);
    public android.content.Intent putExtra(java.lang.String, long);
    public android.content.Intent putExtra(java.lang.String, float);
    public android.content.Intent putExtra(java.lang.String, double);
    public android.content.Intent putExtra(java.lang.String, java.lang.String);
    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence);
    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable);
    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable[]);
    public android.content.Intent putExtra(java.lang.String, java.io.Serializable);
    public android.content.Intent putExtra(java.lang.String, boolean[]);
    public android.content.Intent putExtra(java.lang.String, byte[]);
    public android.content.Intent putExtra(java.lang.String, short[]);
    public android.content.Intent putExtra(java.lang.String, char[]);
    public android.content.Intent putExtra(java.lang.String, int[]);
    public android.content.Intent putExtra(java.lang.String, long[]);
    public android.content.Intent putExtra(java.lang.String, float[]);
    public android.content.Intent putExtra(java.lang.String, double[]);
    public android.content.Intent putExtra(java.lang.String, java.lang.String[]);
    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence[]);
    public android.content.Intent putExtra(java.lang.String, android.os.Bundle);
    public android.content.Intent putExtras(android.content.Intent);
    public android.content.Intent putExtras(android.os.Bundle);
    public android.content.Intent putIntegerArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putParcelableArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putStringArrayListExtra(java.lang.String, java.util.ArrayList);
    public void readFromParcel(android.os.Parcel);
    public void removeCategory(java.lang.String);
    public void removeExtra(java.lang.String);
    public android.content.Intent replaceExtras(android.content.Intent);
    public android.content.Intent replaceExtras(android.os.Bundle);
    public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
    public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
    public java.lang.String resolveType(android.content.Context);
    public java.lang.String resolveType(android.content.ContentResolver);
    public java.lang.String resolveTypeIfNeeded(android.content.ContentResolver);
    public android.content.Intent setAction(java.lang.String);
    public android.content.Intent setClass(android.content.Context, java.lang.Class);
    public android.content.Intent setClassName(android.content.Context, java.lang.String);
    public android.content.Intent setClassName(java.lang.String, java.lang.String);
    public void setClipData(android.content.ClipData);
    public android.content.Intent setComponent(android.content.ComponentName);
    public android.content.Intent setData(android.net.Uri);
    public android.content.Intent setDataAndNormalize(android.net.Uri);
    public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
    public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
    public void setExtrasClassLoader(java.lang.ClassLoader);
    public android.content.Intent setFlags(int);
    public android.content.Intent setPackage(java.lang.String);
    public void setSelector(android.content.Intent);
    public void setSourceBounds(android.graphics.Rect);
    public android.content.Intent setType(java.lang.String);
    public android.content.Intent setTypeAndNormalize(java.lang.String);
    public java.lang.String toString();
    public java.lang.String toURI();
    public java.lang.String toUri(int);
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ACTION_AIRPLANE_MODE_CHANGED;
    public static java.lang.String ACTION_ALL_APPS;
    public static java.lang.String ACTION_ANSWER;
    public static java.lang.String ACTION_APPLICATION_RESTRICTIONS_CHANGED;
    public static java.lang.String ACTION_APP_ERROR;
    public static java.lang.String ACTION_ASSIST;
    public static java.lang.String ACTION_ATTACH_DATA;
    public static java.lang.String ACTION_BATTERY_CHANGED;
    public static java.lang.String ACTION_BATTERY_LOW;
    public static java.lang.String ACTION_BATTERY_OKAY;
    public static java.lang.String ACTION_BOOT_COMPLETED;
    public static java.lang.String ACTION_BUG_REPORT;
    public static java.lang.String ACTION_CALL;
    public static java.lang.String ACTION_CALL_BUTTON;
    public static java.lang.String ACTION_CAMERA_BUTTON;
    public static java.lang.String ACTION_CHOOSER;
    public static java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS;
    public static java.lang.String ACTION_CONFIGURATION_CHANGED;
    public static java.lang.String ACTION_CREATE_DOCUMENT;
    public static java.lang.String ACTION_CREATE_SHORTCUT;
    public static java.lang.String ACTION_DATE_CHANGED;
    public static java.lang.String ACTION_DEFAULT;
    public static java.lang.String ACTION_DELETE;
    public static java.lang.String ACTION_DEVICE_STORAGE_LOW;
    public static java.lang.String ACTION_DEVICE_STORAGE_OK;
    public static java.lang.String ACTION_DIAL;
    public static java.lang.String ACTION_DOCK_EVENT;
    public static java.lang.String ACTION_DREAMING_STARTED;
    public static java.lang.String ACTION_DREAMING_STOPPED;
    public static java.lang.String ACTION_EDIT;
    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
    public static java.lang.String ACTION_FACTORY_TEST;
    public static java.lang.String ACTION_GET_CONTENT;
    public static java.lang.String ACTION_GET_RESTRICTION_ENTRIES;
    public static java.lang.String ACTION_GTALK_SERVICE_CONNECTED;
    public static java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED;
    public static java.lang.String ACTION_HEADSET_PLUG;
    public static java.lang.String ACTION_INPUT_METHOD_CHANGED;
    public static java.lang.String ACTION_INSERT;
    public static java.lang.String ACTION_INSERT_OR_EDIT;
    public static java.lang.String ACTION_INSTALL_PACKAGE;
    public static java.lang.String ACTION_LOCALE_CHANGED;
    public static java.lang.String ACTION_MAIN;
    public static java.lang.String ACTION_MANAGED_PROFILE_ADDED;
    public static java.lang.String ACTION_MANAGED_PROFILE_REMOVED;
    public static java.lang.String ACTION_MANAGE_NETWORK_USAGE;
    public static java.lang.String ACTION_MANAGE_PACKAGE_STORAGE;
    public static java.lang.String ACTION_MEDIA_BAD_REMOVAL;
    public static java.lang.String ACTION_MEDIA_BUTTON;
    public static java.lang.String ACTION_MEDIA_CHECKING;
    public static java.lang.String ACTION_MEDIA_EJECT;
    public static java.lang.String ACTION_MEDIA_MOUNTED;
    public static java.lang.String ACTION_MEDIA_NOFS;
    public static java.lang.String ACTION_MEDIA_REMOVED;
    public static java.lang.String ACTION_MEDIA_SCANNER_FINISHED;
    public static java.lang.String ACTION_MEDIA_SCANNER_SCAN_FILE;
    public static java.lang.String ACTION_MEDIA_SCANNER_STARTED;
    public static java.lang.String ACTION_MEDIA_SHARED;
    public static java.lang.String ACTION_MEDIA_UNMOUNTABLE;
    public static java.lang.String ACTION_MEDIA_UNMOUNTED;
    public static java.lang.String ACTION_MY_PACKAGE_REPLACED;
    public static java.lang.String ACTION_NEW_OUTGOING_CALL;
    public static java.lang.String ACTION_OPEN_DOCUMENT;
    public static java.lang.String ACTION_OPEN_DOCUMENT_TREE;
    public static java.lang.String ACTION_PACKAGE_ADDED;
    public static java.lang.String ACTION_PACKAGE_CHANGED;
    public static java.lang.String ACTION_PACKAGE_DATA_CLEARED;
    public static java.lang.String ACTION_PACKAGE_FIRST_LAUNCH;
    public static java.lang.String ACTION_PACKAGE_FULLY_REMOVED;
    public static java.lang.String ACTION_PACKAGE_INSTALL;
    public static java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION;
    public static java.lang.String ACTION_PACKAGE_REMOVED;
    public static java.lang.String ACTION_PACKAGE_REPLACED;
    public static java.lang.String ACTION_PACKAGE_RESTARTED;
    public static java.lang.String ACTION_PACKAGE_VERIFIED;
    public static java.lang.String ACTION_PASTE;
    public static java.lang.String ACTION_PICK;
    public static java.lang.String ACTION_PICK_ACTIVITY;
    public static java.lang.String ACTION_POWER_CONNECTED;
    public static java.lang.String ACTION_POWER_DISCONNECTED;
    public static java.lang.String ACTION_POWER_USAGE_SUMMARY;
    public static java.lang.String ACTION_PROCESS_TEXT;
    public static java.lang.String ACTION_PROVIDER_CHANGED;
    public static java.lang.String ACTION_QUICK_CLOCK;
    public static java.lang.String ACTION_REBOOT;
    public static java.lang.String ACTION_RUN;
    public static java.lang.String ACTION_SCREEN_OFF;
    public static java.lang.String ACTION_SCREEN_ON;
    public static java.lang.String ACTION_SEARCH;
    public static java.lang.String ACTION_SEARCH_LONG_PRESS;
    public static java.lang.String ACTION_SEND;
    public static java.lang.String ACTION_SENDTO;
    public static java.lang.String ACTION_SEND_MULTIPLE;
    public static java.lang.String ACTION_SET_WALLPAPER;
    public static java.lang.String ACTION_SHUTDOWN;
    public static java.lang.String ACTION_SYNC;
    public static java.lang.String ACTION_SYSTEM_TUTORIAL;
    public static java.lang.String ACTION_TIMEZONE_CHANGED;
    public static java.lang.String ACTION_TIME_CHANGED;
    public static java.lang.String ACTION_TIME_TICK;
    public static java.lang.String ACTION_UID_REMOVED;
    public static java.lang.String ACTION_UMS_CONNECTED;
    public static java.lang.String ACTION_UMS_DISCONNECTED;
    public static java.lang.String ACTION_UNINSTALL_PACKAGE;
    public static java.lang.String ACTION_USER_BACKGROUND;
    public static java.lang.String ACTION_USER_FOREGROUND;
    public static java.lang.String ACTION_USER_INITIALIZE;
    public static java.lang.String ACTION_USER_PRESENT;
    public static java.lang.String ACTION_VIEW;
    public static java.lang.String ACTION_VOICE_COMMAND;
    public static java.lang.String ACTION_WALLPAPER_CHANGED;
    public static java.lang.String ACTION_WEB_SEARCH;
    public static java.lang.String CATEGORY_ALTERNATIVE;
    public static java.lang.String CATEGORY_APP_BROWSER;
    public static java.lang.String CATEGORY_APP_CALCULATOR;
    public static java.lang.String CATEGORY_APP_CALENDAR;
    public static java.lang.String CATEGORY_APP_CONTACTS;
    public static java.lang.String CATEGORY_APP_EMAIL;
    public static java.lang.String CATEGORY_APP_GALLERY;
    public static java.lang.String CATEGORY_APP_MAPS;
    public static java.lang.String CATEGORY_APP_MARKET;
    public static java.lang.String CATEGORY_APP_MESSAGING;
    public static java.lang.String CATEGORY_APP_MUSIC;
    public static java.lang.String CATEGORY_BROWSABLE;
    public static java.lang.String CATEGORY_CAR_DOCK;
    public static java.lang.String CATEGORY_CAR_MODE;
    public static java.lang.String CATEGORY_DEFAULT;
    public static java.lang.String CATEGORY_DESK_DOCK;
    public static java.lang.String CATEGORY_DEVELOPMENT_PREFERENCE;
    public static java.lang.String CATEGORY_EMBED;
    public static java.lang.String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST;
    public static java.lang.String CATEGORY_HE_DESK_DOCK;
    public static java.lang.String CATEGORY_HOME;
    public static java.lang.String CATEGORY_INFO;
    public static java.lang.String CATEGORY_LAUNCHER;
    public static java.lang.String CATEGORY_LEANBACK_LAUNCHER;
    public static java.lang.String CATEGORY_LE_DESK_DOCK;
    public static java.lang.String CATEGORY_MONKEY;
    public static java.lang.String CATEGORY_OPENABLE;
    public static java.lang.String CATEGORY_PREFERENCE;
    public static java.lang.String CATEGORY_SAMPLE_CODE;
    public static java.lang.String CATEGORY_SELECTED_ALTERNATIVE;
    public static java.lang.String CATEGORY_TAB;
    public static java.lang.String CATEGORY_TEST;
    public static java.lang.String CATEGORY_UNIT_TEST;
    public static java.lang.String CATEGORY_VOICE;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_ALARM_COUNT;
    public static java.lang.String EXTRA_ALLOW_MULTIPLE;
    public static java.lang.String EXTRA_ALLOW_REPLACE;
    public static java.lang.String EXTRA_ALTERNATE_INTENTS;
    public static java.lang.String EXTRA_ASSIST_CONTEXT;
    public static java.lang.String EXTRA_ASSIST_INPUT_DEVICE_ID;
    public static java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD;
    public static java.lang.String EXTRA_ASSIST_PACKAGE;
    public static java.lang.String EXTRA_ASSIST_UID;
    public static java.lang.String EXTRA_BCC;
    public static java.lang.String EXTRA_BUG_REPORT;
    public static java.lang.String EXTRA_CC;
    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME;
    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST;
    public static java.lang.String EXTRA_CHANGED_PACKAGE_LIST;
    public static java.lang.String EXTRA_CHANGED_UID_LIST;
    public static java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER;
    public static java.lang.String EXTRA_DATA_REMOVED;
    public static java.lang.String EXTRA_DOCK_STATE;
    public static int EXTRA_DOCK_STATE_CAR;
    public static int EXTRA_DOCK_STATE_DESK;
    public static int EXTRA_DOCK_STATE_HE_DESK;
    public static int EXTRA_DOCK_STATE_LE_DESK;
    public static int EXTRA_DOCK_STATE_UNDOCKED;
    public static java.lang.String EXTRA_DONT_KILL_APP;
    public static java.lang.String EXTRA_EMAIL;
    public static java.lang.String EXTRA_HTML_TEXT;
    public static java.lang.String EXTRA_INITIAL_INTENTS;
    public static java.lang.String EXTRA_INSTALLER_PACKAGE_NAME;
    public static java.lang.String EXTRA_INTENT;
    public static java.lang.String EXTRA_KEY_EVENT;
    public static java.lang.String EXTRA_LOCAL_ONLY;
    public static java.lang.String EXTRA_MIME_TYPES;
    public static java.lang.String EXTRA_NOT_UNKNOWN_SOURCE;
    public static java.lang.String EXTRA_ORIGINATING_URI;
    public static java.lang.String EXTRA_PHONE_NUMBER;
    public static java.lang.String EXTRA_PROCESS_TEXT;
    public static java.lang.String EXTRA_PROCESS_TEXT_READONLY;
    public static java.lang.String EXTRA_REFERRER;
    public static java.lang.String EXTRA_REFERRER_NAME;
    public static java.lang.String EXTRA_REMOTE_INTENT_TOKEN;
    public static java.lang.String EXTRA_REPLACEMENT_EXTRAS;
    public static java.lang.String EXTRA_REPLACING;
    public static java.lang.String EXTRA_RESTRICTIONS_BUNDLE;
    public static java.lang.String EXTRA_RESTRICTIONS_INTENT;
    public static java.lang.String EXTRA_RESTRICTIONS_LIST;
    public static java.lang.String EXTRA_RESULT_RECEIVER;
    public static java.lang.String EXTRA_RETURN_RESULT;
    public static java.lang.String EXTRA_SHORTCUT_ICON;
    public static java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE;
    public static java.lang.String EXTRA_SHORTCUT_INTENT;
    public static java.lang.String EXTRA_SHORTCUT_NAME;
    public static java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY;
    public static java.lang.String EXTRA_STREAM;
    public static java.lang.String EXTRA_SUBJECT;
    public static java.lang.String EXTRA_TEMPLATE;
    public static java.lang.String EXTRA_TEXT;
    public static java.lang.String EXTRA_TITLE;
    public static java.lang.String EXTRA_UID;
    public static java.lang.String EXTRA_USER;
    public static int FILL_IN_ACTION;
    public static int FILL_IN_CATEGORIES;
    public static int FILL_IN_CLIP_DATA;
    public static int FILL_IN_COMPONENT;
    public static int FILL_IN_DATA;
    public static int FILL_IN_PACKAGE;
    public static int FILL_IN_SELECTOR;
    public static int FILL_IN_SOURCE_BOUNDS;
    public static int FLAG_ACTIVITY_BROUGHT_TO_FRONT;
    public static int FLAG_ACTIVITY_CLEAR_TASK;
    public static int FLAG_ACTIVITY_CLEAR_TOP;
    public static int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
    public static int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
    public static int FLAG_ACTIVITY_FORWARD_RESULT;
    public static int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
    public static int FLAG_ACTIVITY_MULTIPLE_TASK;
    public static int FLAG_ACTIVITY_NEW_DOCUMENT;
    public static int FLAG_ACTIVITY_NEW_TASK;
    public static int FLAG_ACTIVITY_NO_ANIMATION;
    public static int FLAG_ACTIVITY_NO_HISTORY;
    public static int FLAG_ACTIVITY_NO_USER_ACTION;
    public static int FLAG_ACTIVITY_PREVIOUS_IS_TOP;
    public static int FLAG_ACTIVITY_REORDER_TO_FRONT;
    public static int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
    public static int FLAG_ACTIVITY_RETAIN_IN_RECENTS;
    public static int FLAG_ACTIVITY_SINGLE_TOP;
    public static int FLAG_ACTIVITY_TASK_ON_HOME;
    public static int FLAG_DEBUG_LOG_RESOLUTION;
    public static int FLAG_EXCLUDE_STOPPED_PACKAGES;
    public static int FLAG_FROM_BACKGROUND;
    public static int FLAG_GRANT_PERSISTABLE_URI_PERMISSION;
    public static int FLAG_GRANT_PREFIX_URI_PERMISSION;
    public static int FLAG_GRANT_READ_URI_PERMISSION;
    public static int FLAG_GRANT_WRITE_URI_PERMISSION;
    public static int FLAG_INCLUDE_STOPPED_PACKAGES;
    public static int FLAG_RECEIVER_FOREGROUND;
    public static int FLAG_RECEIVER_NO_ABORT;
    public static int FLAG_RECEIVER_REGISTERED_ONLY;
    public static int FLAG_RECEIVER_REPLACE_PENDING;
    public static java.lang.String METADATA_DOCK_HOME;
    public static int URI_ALLOW_UNSAFE;
    public static int URI_ANDROID_APP_SCHEME;
    public static int URI_INTENT_SCHEME;
}

-keep class android.content.IntentFilter {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(android.content.IntentFilter);

    public java.util.Iterator actionsIterator();
    public void addAction(java.lang.String);
    public void addCategory(java.lang.String);
    public void addDataAuthority(java.lang.String, java.lang.String);
    public void addDataPath(java.lang.String, int);
    public void addDataScheme(java.lang.String);
    public void addDataSchemeSpecificPart(java.lang.String, int);
    public void addDataType(java.lang.String);
    public java.util.Iterator authoritiesIterator();
    public java.util.Iterator categoriesIterator();
    public int countActions();
    public int countCategories();
    public int countDataAuthorities();
    public int countDataPaths();
    public int countDataSchemeSpecificParts();
    public int countDataSchemes();
    public int countDataTypes();
    public static android.content.IntentFilter create(java.lang.String, java.lang.String);
    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String getAction(int);
    public java.lang.String getCategory(int);
    public android.content.IntentFilter$AuthorityEntry getDataAuthority(int);
    public android.os.PatternMatcher getDataPath(int);
    public java.lang.String getDataScheme(int);
    public android.os.PatternMatcher getDataSchemeSpecificPart(int);
    public java.lang.String getDataType(int);
    public int getPriority();
    public boolean hasAction(java.lang.String);
    public boolean hasCategory(java.lang.String);
    public boolean hasDataAuthority(android.net.Uri);
    public boolean hasDataPath(java.lang.String);
    public boolean hasDataScheme(java.lang.String);
    public boolean hasDataSchemeSpecificPart(java.lang.String);
    public boolean hasDataType(java.lang.String);
    public int match(android.content.ContentResolver, android.content.Intent, boolean, java.lang.String);
    public int match(java.lang.String, java.lang.String, java.lang.String, android.net.Uri, java.util.Set, java.lang.String);
    public boolean matchAction(java.lang.String);
    public java.lang.String matchCategories(java.util.Set);
    public int matchData(java.lang.String, java.lang.String, android.net.Uri);
    public int matchDataAuthority(android.net.Uri);
    public java.util.Iterator pathsIterator();
    public void readFromXml(org.xmlpull.v1.XmlPullParser);
    public java.util.Iterator schemeSpecificPartsIterator();
    public java.util.Iterator schemesIterator();
    public void setPriority(int);
    public java.util.Iterator typesIterator();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToXml(org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MATCH_ADJUSTMENT_MASK;
    public static int MATCH_ADJUSTMENT_NORMAL;
    public static int MATCH_CATEGORY_EMPTY;
    public static int MATCH_CATEGORY_HOST;
    public static int MATCH_CATEGORY_MASK;
    public static int MATCH_CATEGORY_PATH;
    public static int MATCH_CATEGORY_PORT;
    public static int MATCH_CATEGORY_SCHEME;
    public static int MATCH_CATEGORY_SCHEME_SPECIFIC_PART;
    public static int MATCH_CATEGORY_TYPE;
    public static int NO_MATCH_ACTION;
    public static int NO_MATCH_CATEGORY;
    public static int NO_MATCH_DATA;
    public static int NO_MATCH_TYPE;
    public static int SYSTEM_HIGH_PRIORITY;
    public static int SYSTEM_LOW_PRIORITY;
}

-keep class android.content.IntentFilter$AuthorityEntry {
    <init>(java.lang.String, java.lang.String);

    public java.lang.String getHost();
    public int getPort();
    public int match(android.net.Uri);


}

-keep class android.content.IntentFilter$MalformedMimeTypeException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.IntentSender {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public java.lang.String getTargetPackage();
    public int hashCode();
    public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler);
    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler, java.lang.String);
    public java.lang.String toString();
    public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.IntentSender$OnFinished {

    public abstract void onSendFinished(android.content.IntentSender, android.content.Intent, int, java.lang.String, android.os.Bundle);


}

-keep class android.content.IntentSender$SendIntentException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.Exception);



}

-keep class android.content.OperationApplicationException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(int);
    <init>(java.lang.String, int);

    public int getNumSuccessfulYieldPoints();


}

-keep class android.content.PeriodicSync {
    <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.accounts.Account account;
    public java.lang.String authority;
    public android.os.Bundle extras;
    public long period;
}

-keep class android.content.ServiceConnection {

    public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
    public abstract void onServiceDisconnected(android.content.ComponentName);


}

-keep class android.content.SharedPreferences {

    public abstract boolean contains(java.lang.String);
    public abstract android.content.SharedPreferences$Editor edit();
    public abstract java.util.Map getAll();
    public abstract boolean getBoolean(java.lang.String, boolean);
    public abstract float getFloat(java.lang.String, float);
    public abstract int getInt(java.lang.String, int);
    public abstract long getLong(java.lang.String, long);
    public abstract java.lang.String getString(java.lang.String, java.lang.String);
    public abstract java.util.Set getStringSet(java.lang.String, java.util.Set);
    public abstract void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
    public abstract void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);


}

-keep class android.content.SharedPreferences$Editor {

    public abstract void apply();
    public abstract android.content.SharedPreferences$Editor clear();
    public abstract boolean commit();
    public abstract android.content.SharedPreferences$Editor putBoolean(java.lang.String, boolean);
    public abstract android.content.SharedPreferences$Editor putFloat(java.lang.String, float);
    public abstract android.content.SharedPreferences$Editor putInt(java.lang.String, int);
    public abstract android.content.SharedPreferences$Editor putLong(java.lang.String, long);
    public abstract android.content.SharedPreferences$Editor putString(java.lang.String, java.lang.String);
    public abstract android.content.SharedPreferences$Editor putStringSet(java.lang.String, java.util.Set);
    public abstract android.content.SharedPreferences$Editor remove(java.lang.String);


}

-keep class android.content.SharedPreferences$OnSharedPreferenceChangeListener {

    public abstract void onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String);


}

-keep class android.content.SyncAdapterType {
    <init>(java.lang.String, java.lang.String, boolean, boolean);
    <init>(android.os.Parcel);

    public boolean allowParallelSyncs();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getSettingsActivity();
    public int hashCode();
    public boolean isAlwaysSyncable();
    public boolean isUserVisible();
    public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
    public boolean supportsUploading();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String accountType;
    public java.lang.String authority;
    public boolean isKey;
}

-keep class android.content.SyncInfo {

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public android.accounts.Account account;
    public java.lang.String authority;
    public long startTime;
}

-keep class android.content.SyncRequest {

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.SyncStatusObserver {

    public abstract void onStatusChanged(int);


}

-keep class android.content.UriPermission {

    public int describeContents();
    public long getPersistedTime();
    public android.net.Uri getUri();
    public boolean isReadPermission();
    public boolean isWritePermission();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static long INVALID_TIME;
}

-keep class android.content.pm.ActivityInfo {
    <init>();
    <init>(android.content.pm.ActivityInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public int getThemeResource();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int CONFIG_DENSITY;
    public static int CONFIG_FONT_SCALE;
    public static int CONFIG_KEYBOARD;
    public static int CONFIG_KEYBOARD_HIDDEN;
    public static int CONFIG_LAYOUT_DIRECTION;
    public static int CONFIG_LOCALE;
    public static int CONFIG_MCC;
    public static int CONFIG_MNC;
    public static int CONFIG_NAVIGATION;
    public static int CONFIG_ORIENTATION;
    public static int CONFIG_SCREEN_LAYOUT;
    public static int CONFIG_SCREEN_SIZE;
    public static int CONFIG_SMALLEST_SCREEN_SIZE;
    public static int CONFIG_TOUCHSCREEN;
    public static int CONFIG_UI_MODE;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DOCUMENT_LAUNCH_ALWAYS;
    public static int DOCUMENT_LAUNCH_INTO_EXISTING;
    public static int DOCUMENT_LAUNCH_NEVER;
    public static int DOCUMENT_LAUNCH_NONE;
    public static int FLAG_ALLOW_TASK_REPARENTING;
    public static int FLAG_ALWAYS_RETAIN_TASK_STATE;
    public static int FLAG_AUTO_REMOVE_FROM_RECENTS;
    public static int FLAG_CLEAR_TASK_ON_LAUNCH;
    public static int FLAG_EXCLUDE_FROM_RECENTS;
    public static int FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
    public static int FLAG_FINISH_ON_TASK_LAUNCH;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_IMMERSIVE;
    public static int FLAG_MULTIPROCESS;
    public static int FLAG_NO_HISTORY;
    public static int FLAG_RELINQUISH_TASK_IDENTITY;
    public static int FLAG_RESUME_WHILE_PAUSING;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STATE_NOT_NEEDED;
    public static int LAUNCH_MULTIPLE;
    public static int LAUNCH_SINGLE_INSTANCE;
    public static int LAUNCH_SINGLE_TASK;
    public static int LAUNCH_SINGLE_TOP;
    public static int PERSIST_ACROSS_REBOOTS;
    public static int PERSIST_NEVER;
    public static int PERSIST_ROOT_ONLY;
    public static int SCREEN_ORIENTATION_BEHIND;
    public static int SCREEN_ORIENTATION_FULL_SENSOR;
    public static int SCREEN_ORIENTATION_FULL_USER;
    public static int SCREEN_ORIENTATION_LANDSCAPE;
    public static int SCREEN_ORIENTATION_LOCKED;
    public static int SCREEN_ORIENTATION_NOSENSOR;
    public static int SCREEN_ORIENTATION_PORTRAIT;
    public static int SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
    public static int SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    public static int SCREEN_ORIENTATION_SENSOR;
    public static int SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
    public static int SCREEN_ORIENTATION_SENSOR_PORTRAIT;
    public static int SCREEN_ORIENTATION_UNSPECIFIED;
    public static int SCREEN_ORIENTATION_USER;
    public static int SCREEN_ORIENTATION_USER_LANDSCAPE;
    public static int SCREEN_ORIENTATION_USER_PORTRAIT;
    public static int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW;
    public int configChanges;
    public int documentLaunchMode;
    public int flags;
    public int launchMode;
    public int maxRecents;
    public java.lang.String parentActivityName;
    public java.lang.String permission;
    public int persistableMode;
    public int screenOrientation;
    public int softInputMode;
    public java.lang.String targetActivity;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
}

-keep class android.content.pm.ApplicationInfo {
    <init>();
    <init>(android.content.pm.ApplicationInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_ALLOW_BACKUP;
    public static int FLAG_ALLOW_CLEAR_USER_DATA;
    public static int FLAG_ALLOW_TASK_REPARENTING;
    public static int FLAG_DEBUGGABLE;
    public static int FLAG_EXTERNAL_STORAGE;
    public static int FLAG_EXTRACT_NATIVE_LIBS;
    public static int FLAG_FACTORY_TEST;
    public static int FLAG_FULL_BACKUP_ONLY;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_HAS_CODE;
    public static int FLAG_INSTALLED;
    public static int FLAG_IS_DATA_ONLY;
    public static int FLAG_IS_GAME;
    public static int FLAG_KILL_AFTER_RESTORE;
    public static int FLAG_LARGE_HEAP;
    public static int FLAG_MULTIARCH;
    public static int FLAG_PERSISTENT;
    public static int FLAG_RESIZEABLE_FOR_SCREENS;
    public static int FLAG_RESTORE_ANY_VERSION;
    public static int FLAG_STOPPED;
    public static int FLAG_SUPPORTS_LARGE_SCREENS;
    public static int FLAG_SUPPORTS_NORMAL_SCREENS;
    public static int FLAG_SUPPORTS_RTL;
    public static int FLAG_SUPPORTS_SCREEN_DENSITIES;
    public static int FLAG_SUPPORTS_SMALL_SCREENS;
    public static int FLAG_SUPPORTS_XLARGE_SCREENS;
    public static int FLAG_SYSTEM;
    public static int FLAG_TEST_ONLY;
    public static int FLAG_UPDATED_SYSTEM_APP;
    public static int FLAG_USES_CLEARTEXT_TRAFFIC;
    public static int FLAG_VM_SAFE_MODE;
    public java.lang.String backupAgentName;
    public java.lang.String className;
    public int compatibleWidthLimitDp;
    public java.lang.String dataDir;
    public int descriptionRes;
    public boolean enabled;
    public int flags;
    public int largestWidthLimitDp;
    public java.lang.String manageSpaceActivityName;
    public java.lang.String nativeLibraryDir;
    public java.lang.String permission;
    public java.lang.String processName;
    public java.lang.String publicSourceDir;
    public int requiresSmallestWidthDp;
    public java.lang.String[] sharedLibraryFiles;
    public java.lang.String sourceDir;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public int targetSdkVersion;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
    public int uid;
}

-keep class android.content.pm.ComponentInfo {
    <init>();
    <init>(android.content.pm.ComponentInfo);
    <init>(android.os.Parcel);

    protected void dumpBack(android.util.Printer, java.lang.String);
    protected void dumpFront(android.util.Printer, java.lang.String);
    public int getBannerResource();
    public int getIconResource();
    public int getLogoResource();
    public boolean isEnabled();
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public void writeToParcel(android.os.Parcel, int);


    public android.content.pm.ApplicationInfo applicationInfo;
    public int descriptionRes;
    public boolean enabled;
    public boolean exported;
    public java.lang.String processName;
}

-keep class android.content.pm.ConfigurationInfo {
    <init>();
    <init>(android.content.pm.ConfigurationInfo);

    public int describeContents();
    public java.lang.String getGlEsVersion();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int GL_ES_VERSION_UNDEFINED;
    public static int INPUT_FEATURE_FIVE_WAY_NAV;
    public static int INPUT_FEATURE_HARD_KEYBOARD;
    public int reqGlEsVersion;
    public int reqInputFeatures;
    public int reqKeyboardType;
    public int reqNavigation;
    public int reqTouchScreen;
}

-keep class android.content.pm.FeatureGroupInfo {
    <init>();
    <init>(android.content.pm.FeatureGroupInfo);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.FeatureInfo[] features;
}

-keep class android.content.pm.FeatureInfo {
    <init>();
    <init>(android.content.pm.FeatureInfo);

    public int describeContents();
    public java.lang.String getGlEsVersion();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_REQUIRED;
    public static int GL_ES_VERSION_UNDEFINED;
    public int flags;
    public java.lang.String name;
    public int reqGlEsVersion;
}

-keep class android.content.pm.InstrumentationInfo {
    <init>();
    <init>(android.content.pm.InstrumentationInfo);

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String dataDir;
    public boolean functionalTest;
    public boolean handleProfiling;
    public java.lang.String publicSourceDir;
    public java.lang.String sourceDir;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public java.lang.String targetPackage;
}

-keep class android.content.pm.PackageInfo {
    <init>();

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int INSTALL_LOCATION_AUTO;
    public static int INSTALL_LOCATION_INTERNAL_ONLY;
    public static int INSTALL_LOCATION_PREFER_EXTERNAL;
    public static int REQUESTED_PERMISSION_GRANTED;
    public android.content.pm.ActivityInfo[] activities;
    public android.content.pm.ApplicationInfo applicationInfo;
    public int baseRevisionCode;
    public android.content.pm.ConfigurationInfo[] configPreferences;
    public android.content.pm.FeatureGroupInfo[] featureGroups;
    public long firstInstallTime;
    public int[] gids;
    public int installLocation;
    public android.content.pm.InstrumentationInfo[] instrumentation;
    public long lastUpdateTime;
    public java.lang.String packageName;
    public android.content.pm.PermissionInfo[] permissions;
    public android.content.pm.ProviderInfo[] providers;
    public android.content.pm.ActivityInfo[] receivers;
    public android.content.pm.FeatureInfo[] reqFeatures;
    public java.lang.String[] requestedPermissions;
    public int[] requestedPermissionsFlags;
    public android.content.pm.ServiceInfo[] services;
    public java.lang.String sharedUserId;
    public int sharedUserLabel;
    public android.content.pm.Signature[] signatures;
    public java.lang.String[] splitNames;
    public int[] splitRevisionCodes;
    public int versionCode;
    public java.lang.String versionName;
}

-keep class android.content.pm.PackageInstaller {

    public void abandonSession(int);
    public int createSession(android.content.pm.PackageInstaller$SessionParams);
    public java.util.List getAllSessions();
    public java.util.List getMySessions();
    public android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
    public android.content.pm.PackageInstaller$Session openSession(int);
    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
    public void uninstall(java.lang.String, android.content.IntentSender);
    public void unregisterSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void updateSessionAppIcon(int, android.graphics.Bitmap);
    public void updateSessionAppLabel(int, java.lang.CharSequence);


    public static java.lang.String ACTION_SESSION_DETAILS;
    public static java.lang.String EXTRA_OTHER_PACKAGE_NAME;
    public static java.lang.String EXTRA_PACKAGE_NAME;
    public static java.lang.String EXTRA_SESSION_ID;
    public static java.lang.String EXTRA_STATUS;
    public static java.lang.String EXTRA_STATUS_MESSAGE;
    public static java.lang.String EXTRA_STORAGE_PATH;
    public static int STATUS_FAILURE;
    public static int STATUS_FAILURE_ABORTED;
    public static int STATUS_FAILURE_BLOCKED;
    public static int STATUS_FAILURE_CONFLICT;
    public static int STATUS_FAILURE_INCOMPATIBLE;
    public static int STATUS_FAILURE_INVALID;
    public static int STATUS_FAILURE_STORAGE;
    public static int STATUS_PENDING_USER_ACTION;
    public static int STATUS_SUCCESS;
}

-keep class android.content.pm.PackageInstaller$Session {

    public void abandon();
    public void close();
    public void commit(android.content.IntentSender);
    public void fsync(java.io.OutputStream);
    public java.lang.String[] getNames();
    public java.io.InputStream openRead(java.lang.String);
    public java.io.OutputStream openWrite(java.lang.String, long, long);
    public void setStagingProgress(float);


}

-keep class android.content.pm.PackageInstaller$SessionCallback {
    <init>();

    public abstract void onActiveChanged(int, boolean);
    public abstract void onBadgingChanged(int);
    public abstract void onCreated(int);
    public abstract void onFinished(int, boolean);
    public abstract void onProgressChanged(int, float);


}

-keep class android.content.pm.PackageInstaller$SessionInfo {

    public android.content.Intent createDetailsIntent();
    public int describeContents();
    public android.graphics.Bitmap getAppIcon();
    public java.lang.CharSequence getAppLabel();
    public java.lang.String getAppPackageName();
    public java.lang.String getInstallerPackageName();
    public float getProgress();
    public int getSessionId();
    public boolean isActive();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.PackageInstaller$SessionParams {
    <init>(int);

    public int describeContents();
    public void setAppIcon(android.graphics.Bitmap);
    public void setAppLabel(java.lang.CharSequence);
    public void setAppPackageName(java.lang.String);
    public void setInstallLocation(int);
    public void setOriginatingUri(android.net.Uri);
    public void setReferrerUri(android.net.Uri);
    public void setSize(long);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_FULL_INSTALL;
    public static int MODE_INHERIT_EXISTING;
}

-keep class android.content.pm.PackageItemInfo {
    <init>();
    <init>(android.content.pm.PackageItemInfo);
    <init>(android.os.Parcel);

    protected void dumpBack(android.util.Printer, java.lang.String);
    protected void dumpFront(android.util.Printer, java.lang.String);
    public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
    public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public int banner;
    public int icon;
    public int labelRes;
    public int logo;
    public android.os.Bundle metaData;
    public java.lang.String name;
    public java.lang.CharSequence nonLocalizedLabel;
    public java.lang.String packageName;
}

-keep class android.content.pm.PackageManager {
    <init>();

    public abstract void addPackageToPreferred(java.lang.String);
    public abstract boolean addPermission(android.content.pm.PermissionInfo);
    public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
    public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
    public abstract int checkPermission(java.lang.String, java.lang.String);
    public abstract int checkSignatures(java.lang.String, java.lang.String);
    public abstract int checkSignatures(int, int);
    public abstract void clearPackagePreferredActivities(java.lang.String);
    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
    public abstract void extendVerificationTimeout(int, int, long);
    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.Intent);
    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.Intent);
    public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int);
    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.Intent);
    public abstract java.util.List getAllPermissionGroups(int);
    public abstract android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationBanner(java.lang.String);
    public abstract int getApplicationEnabledSetting(java.lang.String);
    public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationIcon(java.lang.String);
    public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int);
    public abstract java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationLogo(java.lang.String);
    public abstract int getComponentEnabledSetting(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
    public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract java.util.List getInstalledApplications(int);
    public abstract java.util.List getInstalledPackages(int);
    public abstract java.lang.String getInstallerPackageName(java.lang.String);
    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
    public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
    public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
    public abstract java.lang.String getNameForUid(int);
    public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
    public abstract int[] getPackageGids(java.lang.String);
    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int);
    public abstract android.content.pm.PackageInstaller getPackageInstaller();
    public abstract java.lang.String[] getPackagesForUid(int);
    public abstract java.util.List getPackagesHoldingPermissions(java.lang.String[], int);
    public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
    public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int);
    public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
    public abstract java.util.List getPreferredPackages(int);
    public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int);
    public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int);
    public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName);
    public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
    public abstract android.content.res.Resources getResourcesForApplication(java.lang.String);
    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int);
    public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
    public abstract java.lang.String[] getSystemSharedLibraryNames();
    public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
    public abstract android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
    public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
    public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract boolean hasSystemFeature(java.lang.String);
    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
    public abstract boolean isSafeMode();
    public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int);
    public abstract java.util.List queryContentProviders(java.lang.String, int, int);
    public abstract java.util.List queryInstrumentation(java.lang.String, int);
    public abstract java.util.List queryIntentActivities(android.content.Intent, int);
    public abstract java.util.List queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
    public abstract java.util.List queryIntentContentProviders(android.content.Intent, int);
    public abstract java.util.List queryIntentServices(android.content.Intent, int);
    public abstract java.util.List queryPermissionsByGroup(java.lang.String, int);
    public abstract void removePackageFromPreferred(java.lang.String);
    public abstract void removePermission(java.lang.String);
    public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
    public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
    public abstract void verifyPendingInstall(int, int);


    public static int COMPONENT_ENABLED_STATE_DEFAULT;
    public static int COMPONENT_ENABLED_STATE_DISABLED;
    public static int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
    public static int COMPONENT_ENABLED_STATE_DISABLED_USER;
    public static int COMPONENT_ENABLED_STATE_ENABLED;
    public static int DONT_KILL_APP;
    public static java.lang.String EXTRA_VERIFICATION_ID;
    public static java.lang.String EXTRA_VERIFICATION_RESULT;
    public static java.lang.String FEATURE_APP_WIDGETS;
    public static java.lang.String FEATURE_AUDIO_LOW_LATENCY;
    public static java.lang.String FEATURE_AUDIO_OUTPUT;
    public static java.lang.String FEATURE_AUDIO_PRO;
    public static java.lang.String FEATURE_AUTOMOTIVE;
    public static java.lang.String FEATURE_BACKUP;
    public static java.lang.String FEATURE_BLUETOOTH;
    public static java.lang.String FEATURE_BLUETOOTH_LE;
    public static java.lang.String FEATURE_CAMERA;
    public static java.lang.String FEATURE_CAMERA_ANY;
    public static java.lang.String FEATURE_CAMERA_AUTOFOCUS;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_RAW;
    public static java.lang.String FEATURE_CAMERA_EXTERNAL;
    public static java.lang.String FEATURE_CAMERA_FLASH;
    public static java.lang.String FEATURE_CAMERA_FRONT;
    public static java.lang.String FEATURE_CAMERA_LEVEL_FULL;
    public static java.lang.String FEATURE_CONNECTION_SERVICE;
    public static java.lang.String FEATURE_CONSUMER_IR;
    public static java.lang.String FEATURE_DEVICE_ADMIN;
    public static java.lang.String FEATURE_FAKETOUCH;
    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT;
    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND;
    public static java.lang.String FEATURE_FINGERPRINT;
    public static java.lang.String FEATURE_GAMEPAD;
    public static java.lang.String FEATURE_HIFI_SENSORS;
    public static java.lang.String FEATURE_HOME_SCREEN;
    public static java.lang.String FEATURE_INPUT_METHODS;
    public static java.lang.String FEATURE_LEANBACK;
    public static java.lang.String FEATURE_LIVE_TV;
    public static java.lang.String FEATURE_LIVE_WALLPAPER;
    public static java.lang.String FEATURE_LOCATION;
    public static java.lang.String FEATURE_LOCATION_GPS;
    public static java.lang.String FEATURE_LOCATION_NETWORK;
    public static java.lang.String FEATURE_MANAGED_USERS;
    public static java.lang.String FEATURE_MICROPHONE;
    public static java.lang.String FEATURE_MIDI;
    public static java.lang.String FEATURE_NFC;
    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION;
    public static java.lang.String FEATURE_OPENGLES_EXTENSION_PACK;
    public static java.lang.String FEATURE_PRINTING;
    public static java.lang.String FEATURE_SCREEN_LANDSCAPE;
    public static java.lang.String FEATURE_SCREEN_PORTRAIT;
    public static java.lang.String FEATURE_SECURELY_REMOVES_USERS;
    public static java.lang.String FEATURE_SENSOR_ACCELEROMETER;
    public static java.lang.String FEATURE_SENSOR_AMBIENT_TEMPERATURE;
    public static java.lang.String FEATURE_SENSOR_BAROMETER;
    public static java.lang.String FEATURE_SENSOR_COMPASS;
    public static java.lang.String FEATURE_SENSOR_GYROSCOPE;
    public static java.lang.String FEATURE_SENSOR_HEART_RATE;
    public static java.lang.String FEATURE_SENSOR_HEART_RATE_ECG;
    public static java.lang.String FEATURE_SENSOR_LIGHT;
    public static java.lang.String FEATURE_SENSOR_PROXIMITY;
    public static java.lang.String FEATURE_SENSOR_RELATIVE_HUMIDITY;
    public static java.lang.String FEATURE_SENSOR_STEP_COUNTER;
    public static java.lang.String FEATURE_SENSOR_STEP_DETECTOR;
    public static java.lang.String FEATURE_SIP;
    public static java.lang.String FEATURE_SIP_VOIP;
    public static java.lang.String FEATURE_TELEPHONY;
    public static java.lang.String FEATURE_TELEPHONY_CDMA;
    public static java.lang.String FEATURE_TELEPHONY_GSM;
    public static java.lang.String FEATURE_TELEVISION;
    public static java.lang.String FEATURE_TOUCHSCREEN;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND;
    public static java.lang.String FEATURE_USB_ACCESSORY;
    public static java.lang.String FEATURE_USB_HOST;
    public static java.lang.String FEATURE_VERIFIED_BOOT;
    public static java.lang.String FEATURE_WATCH;
    public static java.lang.String FEATURE_WEBVIEW;
    public static java.lang.String FEATURE_WIFI;
    public static java.lang.String FEATURE_WIFI_DIRECT;
    public static int GET_ACTIVITIES;
    public static int GET_CONFIGURATIONS;
    public static int GET_DISABLED_COMPONENTS;
    public static int GET_DISABLED_UNTIL_USED_COMPONENTS;
    public static int GET_GIDS;
    public static int GET_INSTRUMENTATION;
    public static int GET_INTENT_FILTERS;
    public static int GET_META_DATA;
    public static int GET_PERMISSIONS;
    public static int GET_PROVIDERS;
    public static int GET_RECEIVERS;
    public static int GET_RESOLVED_FILTER;
    public static int GET_SERVICES;
    public static int GET_SHARED_LIBRARY_FILES;
    public static int GET_SIGNATURES;
    public static int GET_UNINSTALLED_PACKAGES;
    public static int GET_URI_PERMISSION_PATTERNS;
    public static int MATCH_ALL;
    public static int MATCH_DEFAULT_ONLY;
    public static long MAXIMUM_VERIFICATION_TIMEOUT;
    public static int PERMISSION_DENIED;
    public static int PERMISSION_GRANTED;
    public static int SIGNATURE_FIRST_NOT_SIGNED;
    public static int SIGNATURE_MATCH;
    public static int SIGNATURE_NEITHER_SIGNED;
    public static int SIGNATURE_NO_MATCH;
    public static int SIGNATURE_SECOND_NOT_SIGNED;
    public static int SIGNATURE_UNKNOWN_PACKAGE;
    public static int VERIFICATION_ALLOW;
    public static int VERIFICATION_REJECT;
}

-keep class android.content.pm.PackageManager$NameNotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.pm.PathPermission {
    <init>(java.lang.String, int, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public java.lang.String getReadPermission();
    public java.lang.String getWritePermission();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.PermissionGroupInfo {
    <init>();
    <init>(android.content.pm.PermissionGroupInfo);

    public int describeContents();
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_PERSONAL_INFO;
    public int descriptionRes;
    public int flags;
    public java.lang.CharSequence nonLocalizedDescription;
    public int priority;
}

-keep class android.content.pm.PermissionInfo {
    <init>();
    <init>(android.content.pm.PermissionInfo);

    public int describeContents();
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_COSTS_MONEY;
    public static int FLAG_INSTALLED;
    public static int PROTECTION_DANGEROUS;
    public static int PROTECTION_FLAG_APPOP;
    public static int PROTECTION_FLAG_DEVELOPMENT;
    public static int PROTECTION_FLAG_INSTALLER;
    public static int PROTECTION_FLAG_PRE23;
    public static int PROTECTION_FLAG_PREINSTALLED;
    public static int PROTECTION_FLAG_PRIVILEGED;
    public static int PROTECTION_FLAG_SYSTEM;
    public static int PROTECTION_FLAG_VERIFIER;
    public static int PROTECTION_MASK_BASE;
    public static int PROTECTION_MASK_FLAGS;
    public static int PROTECTION_NORMAL;
    public static int PROTECTION_SIGNATURE;
    public static int PROTECTION_SIGNATURE_OR_SYSTEM;
    public int descriptionRes;
    public int flags;
    public java.lang.String group;
    public java.lang.CharSequence nonLocalizedDescription;
    public int protectionLevel;
}

-keep class android.content.pm.ProviderInfo {
    <init>();
    <init>(android.content.pm.ProviderInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_SINGLE_USER;
    public java.lang.String authority;
    public int flags;
    public boolean grantUriPermissions;
    public int initOrder;
    public boolean isSyncable;
    public boolean multiprocess;
    public android.content.pm.PathPermission[] pathPermissions;
    public java.lang.String readPermission;
    public android.os.PatternMatcher[] uriPermissionPatterns;
    public java.lang.String writePermission;
}

-keep class android.content.pm.ResolveInfo {
    <init>();
    <init>(android.content.pm.ResolveInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public int getIconResource();
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ActivityInfo activityInfo;
    public android.content.IntentFilter filter;
    public int icon;
    public boolean isDefault;
    public int labelRes;
    public int match;
    public java.lang.CharSequence nonLocalizedLabel;
    public int preferredOrder;
    public int priority;
    public android.content.pm.ProviderInfo providerInfo;
    public java.lang.String resolvePackageName;
    public android.content.pm.ServiceInfo serviceInfo;
    public int specificIndex;
}

-keep class android.content.pm.ServiceInfo {
    <init>();
    <init>(android.content.pm.ServiceInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_ISOLATED_PROCESS;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STOP_WITH_TASK;
    public int flags;
    public java.lang.String permission;
}

-keep class android.content.pm.Signature {
    <init>(byte[]);
    <init>(java.lang.String);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public byte[] toByteArray();
    public char[] toChars();
    public char[] toChars(char[], int[]);
    public java.lang.String toCharsString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.res.AssetFileDescriptor {
    <init>(android.os.ParcelFileDescriptor, long, long);
    <init>(android.os.ParcelFileDescriptor, long, long, android.os.Bundle);

    public void close();
    public java.io.FileInputStream createInputStream();
    public java.io.FileOutputStream createOutputStream();
    public int describeContents();
    public long getDeclaredLength();
    public android.os.Bundle getExtras();
    public java.io.FileDescriptor getFileDescriptor();
    public long getLength();
    public android.os.ParcelFileDescriptor getParcelFileDescriptor();
    public long getStartOffset();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static long UNKNOWN_LENGTH;
}

-keep class android.content.res.AssetManager {

    public void close();
    protected void finalize();
    public java.lang.String[] getLocales();
    public java.lang.String[] list(java.lang.String);
    public java.io.InputStream open(java.lang.String);
    public java.io.InputStream open(java.lang.String, int);
    public android.content.res.AssetFileDescriptor openFd(java.lang.String);
    public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String);
    public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String);
    public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String);
    public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String);


    public static int ACCESS_BUFFER;
    public static int ACCESS_RANDOM;
    public static int ACCESS_STREAMING;
    public static int ACCESS_UNKNOWN;
}

-keep class android.content.res.ColorStateList {
    <init>(int[][], int[]);

    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
    public int describeContents();
    public int getChangingConfigurations();
    public int getColorForState(int[], int);
    public int getDefaultColor();
    public boolean isOpaque();
    public boolean isStateful();
    public java.lang.String toString();
    public static android.content.res.ColorStateList valueOf(int);
    public android.content.res.ColorStateList withAlpha(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.res.Configuration {
    <init>();
    <init>(android.content.res.Configuration);

    public int compareTo(android.content.res.Configuration);
    public int compareTo(java.lang.Object);
    public int describeContents();
    public int diff(android.content.res.Configuration);
    public boolean equals(android.content.res.Configuration);
    public boolean equals(java.lang.Object);
    public int getLayoutDirection();
    public int hashCode();
    public boolean isLayoutSizeAtLeast(int);
    public boolean isScreenRound();
    public static boolean needNewResources(int, int);
    public void readFromParcel(android.os.Parcel);
    public void setLayoutDirection(java.util.Locale);
    public void setLocale(java.util.Locale);
    public void setTo(android.content.res.Configuration);
    public void setToDefaults();
    public java.lang.String toString();
    public int updateFrom(android.content.res.Configuration);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int DENSITY_DPI_UNDEFINED;
    public static int HARDKEYBOARDHIDDEN_NO;
    public static int HARDKEYBOARDHIDDEN_UNDEFINED;
    public static int HARDKEYBOARDHIDDEN_YES;
    public static int KEYBOARDHIDDEN_NO;
    public static int KEYBOARDHIDDEN_UNDEFINED;
    public static int KEYBOARDHIDDEN_YES;
    public static int KEYBOARD_12KEY;
    public static int KEYBOARD_NOKEYS;
    public static int KEYBOARD_QWERTY;
    public static int KEYBOARD_UNDEFINED;
    public static int MNC_ZERO;
    public static int NAVIGATIONHIDDEN_NO;
    public static int NAVIGATIONHIDDEN_UNDEFINED;
    public static int NAVIGATIONHIDDEN_YES;
    public static int NAVIGATION_DPAD;
    public static int NAVIGATION_NONAV;
    public static int NAVIGATION_TRACKBALL;
    public static int NAVIGATION_UNDEFINED;
    public static int NAVIGATION_WHEEL;
    public static int ORIENTATION_LANDSCAPE;
    public static int ORIENTATION_PORTRAIT;
    public static int ORIENTATION_SQUARE;
    public static int ORIENTATION_UNDEFINED;
    public static int SCREENLAYOUT_LAYOUTDIR_LTR;
    public static int SCREENLAYOUT_LAYOUTDIR_MASK;
    public static int SCREENLAYOUT_LAYOUTDIR_RTL;
    public static int SCREENLAYOUT_LAYOUTDIR_SHIFT;
    public static int SCREENLAYOUT_LAYOUTDIR_UNDEFINED;
    public static int SCREENLAYOUT_LONG_MASK;
    public static int SCREENLAYOUT_LONG_NO;
    public static int SCREENLAYOUT_LONG_UNDEFINED;
    public static int SCREENLAYOUT_LONG_YES;
    public static int SCREENLAYOUT_ROUND_MASK;
    public static int SCREENLAYOUT_ROUND_NO;
    public static int SCREENLAYOUT_ROUND_UNDEFINED;
    public static int SCREENLAYOUT_ROUND_YES;
    public static int SCREENLAYOUT_SIZE_LARGE;
    public static int SCREENLAYOUT_SIZE_MASK;
    public static int SCREENLAYOUT_SIZE_NORMAL;
    public static int SCREENLAYOUT_SIZE_SMALL;
    public static int SCREENLAYOUT_SIZE_UNDEFINED;
    public static int SCREENLAYOUT_SIZE_XLARGE;
    public static int SCREENLAYOUT_UNDEFINED;
    public static int SCREEN_HEIGHT_DP_UNDEFINED;
    public static int SCREEN_WIDTH_DP_UNDEFINED;
    public static int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
    public static int TOUCHSCREEN_FINGER;
    public static int TOUCHSCREEN_NOTOUCH;
    public static int TOUCHSCREEN_STYLUS;
    public static int TOUCHSCREEN_UNDEFINED;
    public static int UI_MODE_NIGHT_MASK;
    public static int UI_MODE_NIGHT_NO;
    public static int UI_MODE_NIGHT_UNDEFINED;
    public static int UI_MODE_NIGHT_YES;
    public static int UI_MODE_TYPE_APPLIANCE;
    public static int UI_MODE_TYPE_CAR;
    public static int UI_MODE_TYPE_DESK;
    public static int UI_MODE_TYPE_MASK;
    public static int UI_MODE_TYPE_NORMAL;
    public static int UI_MODE_TYPE_TELEVISION;
    public static int UI_MODE_TYPE_UNDEFINED;
    public static int UI_MODE_TYPE_WATCH;
    public int densityDpi;
    public float fontScale;
    public int hardKeyboardHidden;
    public int keyboard;
    public int keyboardHidden;
    public java.util.Locale locale;
    public int mcc;
    public int mnc;
    public int navigation;
    public int navigationHidden;
    public int orientation;
    public int screenHeightDp;
    public int screenLayout;
    public int screenWidthDp;
    public int smallestScreenWidthDp;
    public int touchscreen;
    public int uiMode;
}

-keep class android.content.res.Resources {
    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);

    public void finishPreloading();
    public void flushLayoutCache();
    public android.content.res.XmlResourceParser getAnimation(int);
    public android.content.res.AssetManager getAssets();
    public boolean getBoolean(int);
    public int getColor(int);
    public int getColor(int, android.content.res.Resources$Theme);
    public android.content.res.ColorStateList getColorStateList(int);
    public android.content.res.ColorStateList getColorStateList(int, android.content.res.Resources$Theme);
    public android.content.res.Configuration getConfiguration();
    public float getDimension(int);
    public int getDimensionPixelOffset(int);
    public int getDimensionPixelSize(int);
    public android.util.DisplayMetrics getDisplayMetrics();
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.graphics.drawable.Drawable getDrawable(int, android.content.res.Resources$Theme);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int, android.content.res.Resources$Theme);
    public float getFraction(int, int, int);
    public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
    public int[] getIntArray(int);
    public int getInteger(int);
    public android.content.res.XmlResourceParser getLayout(int);
    public android.graphics.Movie getMovie(int);
    public java.lang.String getQuantityString(int, int, java.lang.Object[]);
    public java.lang.String getQuantityString(int, int);
    public java.lang.CharSequence getQuantityText(int, int);
    public java.lang.String getResourceEntryName(int);
    public java.lang.String getResourceName(int);
    public java.lang.String getResourcePackageName(int);
    public java.lang.String getResourceTypeName(int);
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public java.lang.String[] getStringArray(int);
    public static android.content.res.Resources getSystem();
    public java.lang.CharSequence getText(int);
    public java.lang.CharSequence getText(int, java.lang.CharSequence);
    public java.lang.CharSequence[] getTextArray(int);
    public void getValue(int, android.util.TypedValue, boolean);
    public void getValue(java.lang.String, android.util.TypedValue, boolean);
    public void getValueForDensity(int, int, android.util.TypedValue, boolean);
    public android.content.res.XmlResourceParser getXml(int);
    public android.content.res.Resources$Theme newTheme();
    public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
    public android.content.res.TypedArray obtainTypedArray(int);
    public java.io.InputStream openRawResource(int);
    public java.io.InputStream openRawResource(int, android.util.TypedValue);
    public android.content.res.AssetFileDescriptor openRawResourceFd(int);
    public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle);
    public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle);
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);


}

-keep class android.content.res.Resources$NotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.res.Resources$Theme {

    public void applyStyle(int, boolean);
    public void dump(int, java.lang.String, java.lang.String);
    protected void finalize();
    public int getChangingConfigurations();
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.content.res.Resources getResources();
    public android.content.res.TypedArray obtainStyledAttributes(int[]);
    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    public boolean resolveAttribute(int, android.util.TypedValue, boolean);
    public void setTo(android.content.res.Resources$Theme);


}

-keep class android.content.res.TypedArray {

    public boolean getBoolean(int, boolean);
    public int getChangingConfigurations();
    public int getColor(int, int);
    public android.content.res.ColorStateList getColorStateList(int);
    public float getDimension(int, float);
    public int getDimensionPixelOffset(int, int);
    public int getDimensionPixelSize(int, int);
    public android.graphics.drawable.Drawable getDrawable(int);
    public float getFloat(int, float);
    public float getFraction(int, int, int, float);
    public int getIndex(int);
    public int getIndexCount();
    public int getInt(int, int);
    public int getInteger(int, int);
    public int getLayoutDimension(int, java.lang.String);
    public int getLayoutDimension(int, int);
    public java.lang.String getNonResourceString(int);
    public java.lang.String getPositionDescription();
    public int getResourceId(int, int);
    public android.content.res.Resources getResources();
    public java.lang.String getString(int);
    public java.lang.CharSequence getText(int);
    public java.lang.CharSequence[] getTextArray(int);
    public int getType(int);
    public boolean getValue(int, android.util.TypedValue);
    public boolean hasValue(int);
    public boolean hasValueOrEmpty(int);
    public int length();
    public android.util.TypedValue peekValue(int);
    public void recycle();
    public java.lang.String toString();


}

-keep class android.content.res.XmlResourceParser {

    public abstract void close();


}

-keep class android.database.CharArrayBuffer {
    <init>(int);
    <init>(char[]);



    public char[] data;
    public int sizeCopied;
}

-keep class android.database.ContentObserver {
    <init>(android.os.Handler);

    public boolean deliverSelfNotifications();
    public void dispatchChange(boolean);
    public void dispatchChange(boolean, android.net.Uri);
    public void onChange(boolean);
    public void onChange(boolean, android.net.Uri);


}

-keep class android.database.Cursor {

    public abstract void close();
    public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
    public abstract void deactivate();
    public abstract byte[] getBlob(int);
    public abstract int getColumnCount();
    public abstract int getColumnIndex(java.lang.String);
    public abstract int getColumnIndexOrThrow(java.lang.String);
    public abstract java.lang.String getColumnName(int);
    public abstract java.lang.String[] getColumnNames();
    public abstract int getCount();
    public abstract double getDouble(int);
    public abstract android.os.Bundle getExtras();
    public abstract float getFloat(int);
    public abstract int getInt(int);
    public abstract long getLong(int);
    public abstract android.net.Uri getNotificationUri();
    public abstract int getPosition();
    public abstract short getShort(int);
    public abstract java.lang.String getString(int);
    public abstract int getType(int);
    public abstract boolean getWantsAllOnMoveCalls();
    public abstract boolean isAfterLast();
    public abstract boolean isBeforeFirst();
    public abstract boolean isClosed();
    public abstract boolean isFirst();
    public abstract boolean isLast();
    public abstract boolean isNull(int);
    public abstract boolean move(int);
    public abstract boolean moveToFirst();
    public abstract boolean moveToLast();
    public abstract boolean moveToNext();
    public abstract boolean moveToPosition(int);
    public abstract boolean moveToPrevious();
    public abstract void registerContentObserver(android.database.ContentObserver);
    public abstract void registerDataSetObserver(android.database.DataSetObserver);
    public abstract boolean requery();
    public abstract android.os.Bundle respond(android.os.Bundle);
    public abstract void setExtras(android.os.Bundle);
    public abstract void setNotificationUri(android.content.ContentResolver, android.net.Uri);
    public abstract void unregisterContentObserver(android.database.ContentObserver);
    public abstract void unregisterDataSetObserver(android.database.DataSetObserver);


    public static int FIELD_TYPE_BLOB;
    public static int FIELD_TYPE_FLOAT;
    public static int FIELD_TYPE_INTEGER;
    public static int FIELD_TYPE_NULL;
    public static int FIELD_TYPE_STRING;
}

-keep class android.database.DataSetObserver {
    <init>();

    public void onChanged();
    public void onInvalidated();


}

-keep class android.database.DatabaseErrorHandler {

    public abstract void onCorruption(android.database.sqlite.SQLiteDatabase);


}

-keep class android.database.SQLException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class android.database.sqlite.SQLiteClosable {
    <init>();

    public void acquireReference();
    public void close();
    protected abstract void onAllReferencesReleased();
    protected void onAllReferencesReleasedFromContainer();
    public void releaseReference();
    public void releaseReferenceFromContainer();


}

-keep class android.database.sqlite.SQLiteCursorDriver {

    public abstract void cursorClosed();
    public abstract void cursorDeactivated();
    public abstract void cursorRequeried(android.database.Cursor);
    public abstract android.database.Cursor query(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String[]);
    public abstract void setBindArguments(java.lang.String[]);


}

-keep class android.database.sqlite.SQLiteDatabase {

    public void beginTransaction();
    public void beginTransactionNonExclusive();
    public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
    public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
    public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String);
    public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase$CursorFactory);
    public int delete(java.lang.String, java.lang.String, java.lang.String[]);
    public static boolean deleteDatabase(java.io.File);
    public void disableWriteAheadLogging();
    public boolean enableWriteAheadLogging();
    public void endTransaction();
    public void execSQL(java.lang.String);
    public void execSQL(java.lang.String, java.lang.Object[]);
    protected void finalize();
    public static java.lang.String findEditTable(java.lang.String);
    public java.util.List getAttachedDbs();
    public long getMaximumSize();
    public long getPageSize();
    public java.lang.String getPath();
    public java.util.Map getSyncedTables();
    public int getVersion();
    public boolean inTransaction();
    public long insert(java.lang.String, java.lang.String, android.content.ContentValues);
    public long insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
    public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
    public boolean isDatabaseIntegrityOk();
    public boolean isDbLockedByCurrentThread();
    public boolean isDbLockedByOtherThreads();
    public boolean isOpen();
    public boolean isReadOnly();
    public boolean isWriteAheadLoggingEnabled();
    public void markTableSyncable(java.lang.String, java.lang.String);
    public void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
    public boolean needUpgrade(int);
    protected void onAllReferencesReleased();
    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int);
    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int, android.database.DatabaseErrorHandler);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public static int releaseMemory();
    public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
    public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
    public void setForeignKeyConstraintsEnabled(boolean);
    public void setLocale(java.util.Locale);
    public void setLockingEnabled(boolean);
    public void setMaxSqlCacheSize(int);
    public long setMaximumSize(long);
    public void setPageSize(long);
    public void setTransactionSuccessful();
    public void setVersion(int);
    public java.lang.String toString();
    public int update(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public int updateWithOnConflict(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[], int);
    public boolean yieldIfContended();
    public boolean yieldIfContendedSafely();
    public boolean yieldIfContendedSafely(long);


    public static int CONFLICT_ABORT;
    public static int CONFLICT_FAIL;
    public static int CONFLICT_IGNORE;
    public static int CONFLICT_NONE;
    public static int CONFLICT_REPLACE;
    public static int CONFLICT_ROLLBACK;
    public static int CREATE_IF_NECESSARY;
    public static int ENABLE_WRITE_AHEAD_LOGGING;
    public static int MAX_SQL_CACHE_SIZE;
    public static int NO_LOCALIZED_COLLATORS;
    public static int OPEN_READONLY;
    public static int OPEN_READWRITE;
    public static int SQLITE_MAX_LIKE_PATTERN_LENGTH;
}

-keep class android.database.sqlite.SQLiteDatabase$CursorFactory {

    public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);


}

-keep class android.database.sqlite.SQLiteProgram {

    public void bindAllArgsAsStrings(java.lang.String[]);
    public void bindBlob(int, byte[]);
    public void bindDouble(int, double);
    public void bindLong(int, long);
    public void bindNull(int);
    public void bindString(int, java.lang.String);
    public void clearBindings();
    public int getUniqueId();
    protected void onAllReferencesReleased();


}

-keep class android.database.sqlite.SQLiteQuery {

    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteStatement {

    public void execute();
    public long executeInsert();
    public int executeUpdateDelete();
    public android.os.ParcelFileDescriptor simpleQueryForBlobFileDescriptor();
    public long simpleQueryForLong();
    public java.lang.String simpleQueryForString();
    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteTransactionListener {

    public abstract void onBegin();
    public abstract void onCommit();
    public abstract void onRollback();


}

-keep class android.graphics.Bitmap {

    public boolean compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream);
    public android.graphics.Bitmap copy(android.graphics.Bitmap$Config, boolean);
    public void copyPixelsFromBuffer(java.nio.Buffer);
    public void copyPixelsToBuffer(java.nio.Buffer);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
    public int describeContents();
    public void eraseColor(int);
    public android.graphics.Bitmap extractAlpha();
    public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
    public int getAllocationByteCount();
    public int getByteCount();
    public android.graphics.Bitmap$Config getConfig();
    public int getDensity();
    public int getGenerationId();
    public int getHeight();
    public byte[] getNinePatchChunk();
    public int getPixel(int, int);
    public void getPixels(int[], int, int, int, int, int, int);
    public int getRowBytes();
    public int getScaledHeight(android.graphics.Canvas);
    public int getScaledHeight(android.util.DisplayMetrics);
    public int getScaledHeight(int);
    public int getScaledWidth(android.graphics.Canvas);
    public int getScaledWidth(android.util.DisplayMetrics);
    public int getScaledWidth(int);
    public int getWidth();
    public boolean hasAlpha();
    public boolean hasMipMap();
    public boolean isMutable();
    public boolean isPremultiplied();
    public boolean isRecycled();
    public void prepareToDraw();
    public void reconfigure(int, int, android.graphics.Bitmap$Config);
    public void recycle();
    public boolean sameAs(android.graphics.Bitmap);
    public void setConfig(android.graphics.Bitmap$Config);
    public void setDensity(int);
    public void setHasAlpha(boolean);
    public void setHasMipMap(boolean);
    public void setHeight(int);
    public void setPixel(int, int, int);
    public void setPixels(int[], int, int, int, int, int, int);
    public void setPremultiplied(boolean);
    public void setWidth(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int DENSITY_NONE;
}

-keep class android.graphics.Bitmap$CompressFormat {

    public static android.graphics.Bitmap$CompressFormat valueOf(java.lang.String);
    public static android.graphics.Bitmap$CompressFormat[] values();

    public static android.graphics.Bitmap$CompressFormat JPEG;
    public static android.graphics.Bitmap$CompressFormat PNG;
    public static android.graphics.Bitmap$CompressFormat WEBP;

}

-keep class android.graphics.Bitmap$Config {

    public static android.graphics.Bitmap$Config valueOf(java.lang.String);
    public static android.graphics.Bitmap$Config[] values();

    public static android.graphics.Bitmap$Config ALPHA_8;
    public static android.graphics.Bitmap$Config ARGB_4444;
    public static android.graphics.Bitmap$Config ARGB_8888;
    public static android.graphics.Bitmap$Config RGB_565;

}

-keep class android.graphics.BitmapFactory {
    <init>();

    public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
    public static android.graphics.Bitmap decodeFile(java.lang.String, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeFile(java.lang.String);
    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
    public static android.graphics.Bitmap decodeResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeStream(java.io.InputStream);


}

-keep class android.graphics.BitmapFactory$Options {
    <init>();

    public void requestCancelDecode();


    public android.graphics.Bitmap inBitmap;
    public int inDensity;
    public boolean inDither;
    public boolean inInputShareable;
    public boolean inJustDecodeBounds;
    public boolean inMutable;
    public boolean inPreferQualityOverSpeed;
    public android.graphics.Bitmap$Config inPreferredConfig;
    public boolean inPremultiplied;
    public boolean inPurgeable;
    public int inSampleSize;
    public boolean inScaled;
    public int inScreenDensity;
    public int inTargetDensity;
    public byte[] inTempStorage;
    public boolean mCancel;
    public int outHeight;
    public java.lang.String outMimeType;
    public int outWidth;
}

-keep class android.graphics.Canvas {
    <init>();
    <init>(android.graphics.Bitmap);

    public boolean clipPath(android.graphics.Path, android.graphics.Region$Op);
    public boolean clipPath(android.graphics.Path);
    public boolean clipRect(android.graphics.RectF, android.graphics.Region$Op);
    public boolean clipRect(android.graphics.Rect, android.graphics.Region$Op);
    public boolean clipRect(android.graphics.RectF);
    public boolean clipRect(android.graphics.Rect);
    public boolean clipRect(float, float, float, float, android.graphics.Region$Op);
    public boolean clipRect(float, float, float, float);
    public boolean clipRect(int, int, int, int);
    public boolean clipRegion(android.graphics.Region, android.graphics.Region$Op);
    public boolean clipRegion(android.graphics.Region);
    public void concat(android.graphics.Matrix);
    public void drawARGB(int, int, int, int);
    public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
    public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
    public void drawCircle(float, float, float, android.graphics.Paint);
    public void drawColor(int);
    public void drawColor(int, android.graphics.PorterDuff$Mode);
    public void drawLine(float, float, float, float, android.graphics.Paint);
    public void drawLines(float[], int, int, android.graphics.Paint);
    public void drawLines(float[], android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawOval(float, float, float, float, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPath(android.graphics.Path, android.graphics.Paint);
    public void drawPicture(android.graphics.Picture);
    public void drawPicture(android.graphics.Picture, android.graphics.RectF);
    public void drawPicture(android.graphics.Picture, android.graphics.Rect);
    public void drawPoint(float, float, android.graphics.Paint);
    public void drawPoints(float[], int, int, android.graphics.Paint);
    public void drawPoints(float[], android.graphics.Paint);
    public void drawPosText(char[], int, int, float[], android.graphics.Paint);
    public void drawPosText(java.lang.String, float[], android.graphics.Paint);
    public void drawRGB(int, int, int);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
    public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
    public boolean getClipBounds(android.graphics.Rect);
    public android.graphics.Rect getClipBounds();
    public int getDensity();
    public android.graphics.DrawFilter getDrawFilter();
    public int getHeight();
    public void getMatrix(android.graphics.Matrix);
    public android.graphics.Matrix getMatrix();
    public int getMaximumBitmapHeight();
    public int getMaximumBitmapWidth();
    public int getSaveCount();
    public int getWidth();
    public boolean isHardwareAccelerated();
    public boolean isOpaque();
    public boolean quickReject(android.graphics.RectF, android.graphics.Canvas$EdgeType);
    public boolean quickReject(android.graphics.Path, android.graphics.Canvas$EdgeType);
    public boolean quickReject(float, float, float, float, android.graphics.Canvas$EdgeType);
    public void restore();
    public void restoreToCount(int);
    public void rotate(float);
    public void rotate(float, float, float);
    public int save();
    public int save(int);
    public int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
    public int saveLayer(android.graphics.RectF, android.graphics.Paint);
    public int saveLayer(float, float, float, float, android.graphics.Paint, int);
    public int saveLayer(float, float, float, float, android.graphics.Paint);
    public int saveLayerAlpha(android.graphics.RectF, int, int);
    public int saveLayerAlpha(android.graphics.RectF, int);
    public int saveLayerAlpha(float, float, float, float, int, int);
    public int saveLayerAlpha(float, float, float, float, int);
    public void scale(float, float);
    public void scale(float, float, float, float);
    public void setBitmap(android.graphics.Bitmap);
    public void setDensity(int);
    public void setDrawFilter(android.graphics.DrawFilter);
    public void setMatrix(android.graphics.Matrix);
    public void skew(float, float);
    public void translate(float, float);


    public static int ALL_SAVE_FLAG;
    public static int CLIP_SAVE_FLAG;
    public static int CLIP_TO_LAYER_SAVE_FLAG;
    public static int FULL_COLOR_LAYER_SAVE_FLAG;
    public static int HAS_ALPHA_LAYER_SAVE_FLAG;
    public static int MATRIX_SAVE_FLAG;
}

-keep class android.graphics.Canvas$EdgeType {

    public static android.graphics.Canvas$EdgeType valueOf(java.lang.String);
    public static android.graphics.Canvas$EdgeType[] values();

    public static android.graphics.Canvas$EdgeType AA;
    public static android.graphics.Canvas$EdgeType BW;

}

-keep class android.graphics.Canvas$VertexMode {

    public static android.graphics.Canvas$VertexMode valueOf(java.lang.String);
    public static android.graphics.Canvas$VertexMode[] values();

    public static android.graphics.Canvas$VertexMode TRIANGLES;
    public static android.graphics.Canvas$VertexMode TRIANGLE_FAN;
    public static android.graphics.Canvas$VertexMode TRIANGLE_STRIP;

}

-keep class android.graphics.ColorFilter {
    <init>();

    protected void finalize();


}

-keep class android.graphics.DrawFilter {
    <init>();

    protected void finalize();


}

-keep class android.graphics.MaskFilter {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Matrix {
    <init>();
    <init>(android.graphics.Matrix);

    public boolean equals(java.lang.Object);
    protected void finalize();
    public void getValues(float[]);
    public int hashCode();
    public boolean invert(android.graphics.Matrix);
    public boolean isAffine();
    public boolean isIdentity();
    public void mapPoints(float[], int, float[], int, int);
    public void mapPoints(float[], float[]);
    public void mapPoints(float[]);
    public float mapRadius(float);
    public boolean mapRect(android.graphics.RectF, android.graphics.RectF);
    public boolean mapRect(android.graphics.RectF);
    public void mapVectors(float[], int, float[], int, int);
    public void mapVectors(float[], float[]);
    public void mapVectors(float[]);
    public boolean postConcat(android.graphics.Matrix);
    public boolean postRotate(float, float, float);
    public boolean postRotate(float);
    public boolean postScale(float, float, float, float);
    public boolean postScale(float, float);
    public boolean postSkew(float, float, float, float);
    public boolean postSkew(float, float);
    public boolean postTranslate(float, float);
    public boolean preConcat(android.graphics.Matrix);
    public boolean preRotate(float, float, float);
    public boolean preRotate(float);
    public boolean preScale(float, float, float, float);
    public boolean preScale(float, float);
    public boolean preSkew(float, float, float, float);
    public boolean preSkew(float, float);
    public boolean preTranslate(float, float);
    public boolean rectStaysRect();
    public void reset();
    public void set(android.graphics.Matrix);
    public boolean setConcat(android.graphics.Matrix, android.graphics.Matrix);
    public boolean setPolyToPoly(float[], int, float[], int, int);
    public boolean setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix$ScaleToFit);
    public void setRotate(float, float, float);
    public void setRotate(float);
    public void setScale(float, float, float, float);
    public void setScale(float, float);
    public void setSinCos(float, float, float, float);
    public void setSinCos(float, float);
    public void setSkew(float, float, float, float);
    public void setSkew(float, float);
    public void setTranslate(float, float);
    public void setValues(float[]);
    public java.lang.String toShortString();
    public java.lang.String toString();


    public static int MPERSP_0;
    public static int MPERSP_1;
    public static int MPERSP_2;
    public static int MSCALE_X;
    public static int MSCALE_Y;
    public static int MSKEW_X;
    public static int MSKEW_Y;
    public static int MTRANS_X;
    public static int MTRANS_Y;
}

-keep class android.graphics.Matrix$ScaleToFit {

    public static android.graphics.Matrix$ScaleToFit valueOf(java.lang.String);
    public static android.graphics.Matrix$ScaleToFit[] values();

    public static android.graphics.Matrix$ScaleToFit CENTER;
    public static android.graphics.Matrix$ScaleToFit END;
    public static android.graphics.Matrix$ScaleToFit FILL;
    public static android.graphics.Matrix$ScaleToFit START;

}

-keep class android.graphics.Movie {

    public static android.graphics.Movie decodeByteArray(byte[], int, int);
    public static android.graphics.Movie decodeFile(java.lang.String);
    public static android.graphics.Movie decodeStream(java.io.InputStream);
    public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
    public void draw(android.graphics.Canvas, float, float);
    public int duration();
    protected void finalize();
    public int height();
    public boolean isOpaque();
    public boolean setTime(int);
    public int width();


}

-keep class android.graphics.Outline {
    <init>();
    <init>(android.graphics.Outline);

    public boolean canClip();
    public float getAlpha();
    public boolean isEmpty();
    public void offset(int, int);
    public void set(android.graphics.Outline);
    public void setAlpha(float);
    public void setConvexPath(android.graphics.Path);
    public void setEmpty();
    public void setOval(int, int, int, int);
    public void setOval(android.graphics.Rect);
    public void setRect(int, int, int, int);
    public void setRect(android.graphics.Rect);
    public void setRoundRect(int, int, int, int, float);
    public void setRoundRect(android.graphics.Rect, float);


}

-keep class android.graphics.Paint {
    <init>();
    <init>(int);
    <init>(android.graphics.Paint);

    public float ascent();
    public int breakText(char[], int, int, float, float[]);
    public int breakText(java.lang.CharSequence, int, int, boolean, float, float[]);
    public int breakText(java.lang.String, boolean, float, float[]);
    public void clearShadowLayer();
    public float descent();
    protected void finalize();
    public int getAlpha();
    public int getColor();
    public android.graphics.ColorFilter getColorFilter();
    public boolean getFillPath(android.graphics.Path, android.graphics.Path);
    public int getFlags();
    public java.lang.String getFontFeatureSettings();
    public float getFontMetrics(android.graphics.Paint$FontMetrics);
    public android.graphics.Paint$FontMetrics getFontMetrics();
    public int getFontMetricsInt(android.graphics.Paint$FontMetricsInt);
    public android.graphics.Paint$FontMetricsInt getFontMetricsInt();
    public float getFontSpacing();
    public int getHinting();
    public float getLetterSpacing();
    public android.graphics.MaskFilter getMaskFilter();
    public int getOffsetForAdvance(char[], int, int, int, int, boolean, float);
    public int getOffsetForAdvance(java.lang.CharSequence, int, int, int, int, boolean, float);
    public android.graphics.PathEffect getPathEffect();
    public android.graphics.Rasterizer getRasterizer();
    public float getRunAdvance(char[], int, int, int, int, boolean, int);
    public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int);
    public android.graphics.Shader getShader();
    public android.graphics.Paint$Cap getStrokeCap();
    public android.graphics.Paint$Join getStrokeJoin();
    public float getStrokeMiter();
    public float getStrokeWidth();
    public android.graphics.Paint$Style getStyle();
    public android.graphics.Paint$Align getTextAlign();
    public void getTextBounds(java.lang.String, int, int, android.graphics.Rect);
    public void getTextBounds(char[], int, int, android.graphics.Rect);
    public java.util.Locale getTextLocale();
    public void getTextPath(char[], int, int, float, float, android.graphics.Path);
    public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path);
    public float getTextScaleX();
    public float getTextSize();
    public float getTextSkewX();
    public int getTextWidths(char[], int, int, float[]);
    public int getTextWidths(java.lang.CharSequence, int, int, float[]);
    public int getTextWidths(java.lang.String, int, int, float[]);
    public int getTextWidths(java.lang.String, float[]);
    public android.graphics.Typeface getTypeface();
    public android.graphics.Xfermode getXfermode();
    public boolean hasGlyph(java.lang.String);
    public boolean isAntiAlias();
    public boolean isDither();
    public boolean isElegantTextHeight();
    public boolean isFakeBoldText();
    public boolean isFilterBitmap();
    public boolean isLinearText();
    public boolean isStrikeThruText();
    public boolean isSubpixelText();
    public boolean isUnderlineText();
    public float measureText(char[], int, int);
    public float measureText(java.lang.String, int, int);
    public float measureText(java.lang.String);
    public float measureText(java.lang.CharSequence, int, int);
    public void reset();
    public void set(android.graphics.Paint);
    public void setARGB(int, int, int, int);
    public void setAlpha(int);
    public void setAntiAlias(boolean);
    public void setColor(int);
    public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
    public void setDither(boolean);
    public void setElegantTextHeight(boolean);
    public void setFakeBoldText(boolean);
    public void setFilterBitmap(boolean);
    public void setFlags(int);
    public void setFontFeatureSettings(java.lang.String);
    public void setHinting(int);
    public void setLetterSpacing(float);
    public void setLinearText(boolean);
    public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
    public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
    public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
    public android.graphics.Shader setShader(android.graphics.Shader);
    public void setShadowLayer(float, float, float, int);
    public void setStrikeThruText(boolean);
    public void setStrokeCap(android.graphics.Paint$Cap);
    public void setStrokeJoin(android.graphics.Paint$Join);
    public void setStrokeMiter(float);
    public void setStrokeWidth(float);
    public void setStyle(android.graphics.Paint$Style);
    public void setSubpixelText(boolean);
    public void setTextAlign(android.graphics.Paint$Align);
    public void setTextLocale(java.util.Locale);
    public void setTextScaleX(float);
    public void setTextSize(float);
    public void setTextSkewX(float);
    public android.graphics.Typeface setTypeface(android.graphics.Typeface);
    public void setUnderlineText(boolean);
    public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);


    public static int ANTI_ALIAS_FLAG;
    public static int DEV_KERN_TEXT_FLAG;
    public static int DITHER_FLAG;
    public static int EMBEDDED_BITMAP_TEXT_FLAG;
    public static int FAKE_BOLD_TEXT_FLAG;
    public static int FILTER_BITMAP_FLAG;
    public static int HINTING_OFF;
    public static int HINTING_ON;
    public static int LINEAR_TEXT_FLAG;
    public static int STRIKE_THRU_TEXT_FLAG;
    public static int SUBPIXEL_TEXT_FLAG;
    public static int UNDERLINE_TEXT_FLAG;
}

-keep class android.graphics.Paint$Align {

    public static android.graphics.Paint$Align valueOf(java.lang.String);
    public static android.graphics.Paint$Align[] values();

    public static android.graphics.Paint$Align CENTER;
    public static android.graphics.Paint$Align LEFT;
    public static android.graphics.Paint$Align RIGHT;

}

-keep class android.graphics.Paint$Cap {

    public static android.graphics.Paint$Cap valueOf(java.lang.String);
    public static android.graphics.Paint$Cap[] values();

    public static android.graphics.Paint$Cap BUTT;
    public static android.graphics.Paint$Cap ROUND;
    public static android.graphics.Paint$Cap SQUARE;

}

-keep class android.graphics.Paint$FontMetrics {
    <init>();



    public float ascent;
    public float bottom;
    public float descent;
    public float leading;
    public float top;
}

-keep class android.graphics.Paint$FontMetricsInt {
    <init>();

    public java.lang.String toString();


    public int ascent;
    public int bottom;
    public int descent;
    public int leading;
    public int top;
}

-keep class android.graphics.Paint$Join {

    public static android.graphics.Paint$Join valueOf(java.lang.String);
    public static android.graphics.Paint$Join[] values();

    public static android.graphics.Paint$Join BEVEL;
    public static android.graphics.Paint$Join MITER;
    public static android.graphics.Paint$Join ROUND;

}

-keep class android.graphics.Paint$Style {

    public static android.graphics.Paint$Style valueOf(java.lang.String);
    public static android.graphics.Paint$Style[] values();

    public static android.graphics.Paint$Style FILL;
    public static android.graphics.Paint$Style FILL_AND_STROKE;
    public static android.graphics.Paint$Style STROKE;

}

-keep class android.graphics.Path {
    <init>();
    <init>(android.graphics.Path);

    public void addArc(android.graphics.RectF, float, float);
    public void addArc(float, float, float, float, float, float);
    public void addCircle(float, float, float, android.graphics.Path$Direction);
    public void addOval(android.graphics.RectF, android.graphics.Path$Direction);
    public void addOval(float, float, float, float, android.graphics.Path$Direction);
    public void addPath(android.graphics.Path, float, float);
    public void addPath(android.graphics.Path);
    public void addPath(android.graphics.Path, android.graphics.Matrix);
    public void addRect(android.graphics.RectF, android.graphics.Path$Direction);
    public void addRect(float, float, float, float, android.graphics.Path$Direction);
    public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path$Direction);
    public void addRoundRect(float, float, float, float, float, float, android.graphics.Path$Direction);
    public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path$Direction);
    public void addRoundRect(float, float, float, float, float[], android.graphics.Path$Direction);
    public void arcTo(android.graphics.RectF, float, float, boolean);
    public void arcTo(android.graphics.RectF, float, float);
    public void arcTo(float, float, float, float, float, float, boolean);
    public void close();
    public void computeBounds(android.graphics.RectF, boolean);
    public void cubicTo(float, float, float, float, float, float);
    protected void finalize();
    public android.graphics.Path$FillType getFillType();
    public void incReserve(int);
    public boolean isConvex();
    public boolean isEmpty();
    public boolean isInverseFillType();
    public boolean isRect(android.graphics.RectF);
    public void lineTo(float, float);
    public void moveTo(float, float);
    public void offset(float, float, android.graphics.Path);
    public void offset(float, float);
    public boolean op(android.graphics.Path, android.graphics.Path$Op);
    public boolean op(android.graphics.Path, android.graphics.Path, android.graphics.Path$Op);
    public void quadTo(float, float, float, float);
    public void rCubicTo(float, float, float, float, float, float);
    public void rLineTo(float, float);
    public void rMoveTo(float, float);
    public void rQuadTo(float, float, float, float);
    public void reset();
    public void rewind();
    public void set(android.graphics.Path);
    public void setFillType(android.graphics.Path$FillType);
    public void setLastPoint(float, float);
    public void toggleInverseFillType();
    public void transform(android.graphics.Matrix, android.graphics.Path);
    public void transform(android.graphics.Matrix);


}

-keep class android.graphics.Path$Direction {

    public static android.graphics.Path$Direction valueOf(java.lang.String);
    public static android.graphics.Path$Direction[] values();

    public static android.graphics.Path$Direction CCW;
    public static android.graphics.Path$Direction CW;

}

-keep class android.graphics.Path$FillType {

    public static android.graphics.Path$FillType valueOf(java.lang.String);
    public static android.graphics.Path$FillType[] values();

    public static android.graphics.Path$FillType EVEN_ODD;
    public static android.graphics.Path$FillType INVERSE_EVEN_ODD;
    public static android.graphics.Path$FillType INVERSE_WINDING;
    public static android.graphics.Path$FillType WINDING;

}

-keep class android.graphics.Path$Op {

    public static android.graphics.Path$Op valueOf(java.lang.String);
    public static android.graphics.Path$Op[] values();

    public static android.graphics.Path$Op DIFFERENCE;
    public static android.graphics.Path$Op INTERSECT;
    public static android.graphics.Path$Op REVERSE_DIFFERENCE;
    public static android.graphics.Path$Op UNION;
    public static android.graphics.Path$Op XOR;

}

-keep class android.graphics.PathEffect {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Picture {
    <init>();
    <init>(android.graphics.Picture);

    public android.graphics.Canvas beginRecording(int, int);
    public static android.graphics.Picture createFromStream(java.io.InputStream);
    public void draw(android.graphics.Canvas);
    public void endRecording();
    protected void finalize();
    public int getHeight();
    public int getWidth();
    public void writeToStream(java.io.OutputStream);


}

-keep class android.graphics.Point {
    <init>();
    <init>(int, int);
    <init>(android.graphics.Point);

    public int describeContents();
    public boolean equals(int, int);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void negate();
    public void offset(int, int);
    public void readFromParcel(android.os.Parcel);
    public void set(int, int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int x;
    public int y;
}

-keep class android.graphics.PorterDuff {
    <init>();



}

-keep class android.graphics.PorterDuff$Mode {

    public static android.graphics.PorterDuff$Mode valueOf(java.lang.String);
    public static android.graphics.PorterDuff$Mode[] values();

    public static android.graphics.PorterDuff$Mode ADD;
    public static android.graphics.PorterDuff$Mode CLEAR;
    public static android.graphics.PorterDuff$Mode DARKEN;
    public static android.graphics.PorterDuff$Mode DST;
    public static android.graphics.PorterDuff$Mode DST_ATOP;
    public static android.graphics.PorterDuff$Mode DST_IN;
    public static android.graphics.PorterDuff$Mode DST_OUT;
    public static android.graphics.PorterDuff$Mode DST_OVER;
    public static android.graphics.PorterDuff$Mode LIGHTEN;
    public static android.graphics.PorterDuff$Mode MULTIPLY;
    public static android.graphics.PorterDuff$Mode OVERLAY;
    public static android.graphics.PorterDuff$Mode SCREEN;
    public static android.graphics.PorterDuff$Mode SRC;
    public static android.graphics.PorterDuff$Mode SRC_ATOP;
    public static android.graphics.PorterDuff$Mode SRC_IN;
    public static android.graphics.PorterDuff$Mode SRC_OUT;
    public static android.graphics.PorterDuff$Mode SRC_OVER;
    public static android.graphics.PorterDuff$Mode XOR;

}

-keep class android.graphics.Rasterizer {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Rect {
    <init>();
    <init>(int, int, int, int);
    <init>(android.graphics.Rect);

    public int centerX();
    public int centerY();
    public boolean contains(int, int);
    public boolean contains(int, int, int, int);
    public boolean contains(android.graphics.Rect);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public float exactCenterX();
    public float exactCenterY();
    public java.lang.String flattenToString();
    public int hashCode();
    public int height();
    public void inset(int, int);
    public boolean intersect(int, int, int, int);
    public boolean intersect(android.graphics.Rect);
    public boolean intersects(int, int, int, int);
    public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
    public boolean isEmpty();
    public void offset(int, int);
    public void offsetTo(int, int);
    public void readFromParcel(android.os.Parcel);
    public void set(int, int, int, int);
    public void set(android.graphics.Rect);
    public void setEmpty();
    public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
    public void sort();
    public java.lang.String toShortString();
    public java.lang.String toString();
    public static android.graphics.Rect unflattenFromString(java.lang.String);
    public void union(int, int, int, int);
    public void union(android.graphics.Rect);
    public void union(int, int);
    public int width();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int bottom;
    public int left;
    public int right;
    public int top;
}

-keep class android.graphics.RectF {
    <init>();
    <init>(float, float, float, float);
    <init>(android.graphics.RectF);
    <init>(android.graphics.Rect);

    public float centerX();
    public float centerY();
    public boolean contains(float, float);
    public boolean contains(float, float, float, float);
    public boolean contains(android.graphics.RectF);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public float height();
    public void inset(float, float);
    public boolean intersect(float, float, float, float);
    public boolean intersect(android.graphics.RectF);
    public boolean intersects(float, float, float, float);
    public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
    public boolean isEmpty();
    public void offset(float, float);
    public void offsetTo(float, float);
    public void readFromParcel(android.os.Parcel);
    public void round(android.graphics.Rect);
    public void roundOut(android.graphics.Rect);
    public void set(float, float, float, float);
    public void set(android.graphics.RectF);
    public void set(android.graphics.Rect);
    public void setEmpty();
    public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
    public void sort();
    public java.lang.String toShortString();
    public java.lang.String toString();
    public void union(float, float, float, float);
    public void union(android.graphics.RectF);
    public void union(float, float);
    public float width();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float bottom;
    public float left;
    public float right;
    public float top;
}

-keep class android.graphics.Region {
    <init>();
    <init>(android.graphics.Region);
    <init>(android.graphics.Rect);
    <init>(int, int, int, int);

    public boolean contains(int, int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    protected void finalize();
    public android.graphics.Path getBoundaryPath();
    public boolean getBoundaryPath(android.graphics.Path);
    public android.graphics.Rect getBounds();
    public boolean getBounds(android.graphics.Rect);
    public boolean isComplex();
    public boolean isEmpty();
    public boolean isRect();
    public boolean op(android.graphics.Rect, android.graphics.Region$Op);
    public boolean op(int, int, int, int, android.graphics.Region$Op);
    public boolean op(android.graphics.Region, android.graphics.Region$Op);
    public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region$Op);
    public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region$Op);
    public boolean quickContains(android.graphics.Rect);
    public boolean quickContains(int, int, int, int);
    public boolean quickReject(android.graphics.Rect);
    public boolean quickReject(int, int, int, int);
    public boolean quickReject(android.graphics.Region);
    public boolean set(android.graphics.Region);
    public boolean set(android.graphics.Rect);
    public boolean set(int, int, int, int);
    public void setEmpty();
    public boolean setPath(android.graphics.Path, android.graphics.Region);
    public java.lang.String toString();
    public void translate(int, int);
    public void translate(int, int, android.graphics.Region);
    public boolean union(android.graphics.Rect);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.graphics.Region$Op {

    public static android.graphics.Region$Op valueOf(java.lang.String);
    public static android.graphics.Region$Op[] values();

    public static android.graphics.Region$Op DIFFERENCE;
    public static android.graphics.Region$Op INTERSECT;
    public static android.graphics.Region$Op REPLACE;
    public static android.graphics.Region$Op REVERSE_DIFFERENCE;
    public static android.graphics.Region$Op UNION;
    public static android.graphics.Region$Op XOR;

}

-keep class android.graphics.Shader {
    <init>();

    protected void finalize();
    public boolean getLocalMatrix(android.graphics.Matrix);
    public void setLocalMatrix(android.graphics.Matrix);


}

-keep class android.graphics.Typeface {

    public static android.graphics.Typeface create(java.lang.String, int);
    public static android.graphics.Typeface create(android.graphics.Typeface, int);
    public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
    public static android.graphics.Typeface createFromFile(java.io.File);
    public static android.graphics.Typeface createFromFile(java.lang.String);
    public static android.graphics.Typeface defaultFromStyle(int);
    public boolean equals(java.lang.Object);
    protected void finalize();
    public int getStyle();
    public int hashCode();
    public boolean isBold();
    public boolean isItalic();


    public static int BOLD;
    public static int BOLD_ITALIC;
    public static android.graphics.Typeface DEFAULT;
    public static android.graphics.Typeface DEFAULT_BOLD;
    public static int ITALIC;
    public static android.graphics.Typeface MONOSPACE;
    public static int NORMAL;
    public static android.graphics.Typeface SANS_SERIF;
    public static android.graphics.Typeface SERIF;
}

-keep class android.graphics.Xfermode {
    <init>();

    protected void finalize();


}

-keep class android.graphics.drawable.Drawable {
    <init>();

    public void applyTheme(android.content.res.Resources$Theme);
    public boolean canApplyTheme();
    public void clearColorFilter();
    public void copyBounds(android.graphics.Rect);
    public android.graphics.Rect copyBounds();
    public static android.graphics.drawable.Drawable createFromPath(java.lang.String);
    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String);
    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String, android.graphics.BitmapFactory$Options);
    public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, java.lang.String);
    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public abstract void draw(android.graphics.Canvas);
    public int getAlpha();
    public android.graphics.Rect getBounds();
    public android.graphics.drawable.Drawable$Callback getCallback();
    public int getChangingConfigurations();
    public android.graphics.ColorFilter getColorFilter();
    public android.graphics.drawable.Drawable$ConstantState getConstantState();
    public android.graphics.drawable.Drawable getCurrent();
    public android.graphics.Rect getDirtyBounds();
    public void getHotspotBounds(android.graphics.Rect);
    public int getIntrinsicHeight();
    public int getIntrinsicWidth();
    public int getLayoutDirection();
    public int getLevel();
    public int getMinimumHeight();
    public int getMinimumWidth();
    public abstract int getOpacity();
    public void getOutline(android.graphics.Outline);
    public boolean getPadding(android.graphics.Rect);
    public int[] getState();
    public android.graphics.Region getTransparentRegion();
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public void invalidateSelf();
    public boolean isAutoMirrored();
    public boolean isFilterBitmap();
    public boolean isStateful();
    public boolean isVisible();
    public void jumpToCurrentState();
    public android.graphics.drawable.Drawable mutate();
    protected void onBoundsChange(android.graphics.Rect);
    public boolean onLayoutDirectionChanged(int);
    protected boolean onLevelChange(int);
    protected boolean onStateChange(int[]);
    public static int resolveOpacity(int, int);
    public void scheduleSelf(java.lang.Runnable, long);
    public abstract void setAlpha(int);
    public void setAutoMirrored(boolean);
    public void setBounds(int, int, int, int);
    public void setBounds(android.graphics.Rect);
    public void setCallback(android.graphics.drawable.Drawable$Callback);
    public void setChangingConfigurations(int);
    public abstract void setColorFilter(android.graphics.ColorFilter);
    public void setColorFilter(int, android.graphics.PorterDuff$Mode);
    public void setDither(boolean);
    public void setFilterBitmap(boolean);
    public void setHotspot(float, float);
    public void setHotspotBounds(int, int, int, int);
    public boolean setLayoutDirection(int);
    public boolean setLevel(int);
    public boolean setState(int[]);
    public void setTint(int);
    public void setTintList(android.content.res.ColorStateList);
    public void setTintMode(android.graphics.PorterDuff$Mode);
    public boolean setVisible(boolean, boolean);
    public void unscheduleSelf(java.lang.Runnable);


}

-keep class android.graphics.drawable.Drawable$Callback {

    public abstract void invalidateDrawable(android.graphics.drawable.Drawable);
    public abstract void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
    public abstract void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);


}

-keep class android.graphics.drawable.Drawable$ConstantState {
    <init>();

    public boolean canApplyTheme();
    public abstract int getChangingConfigurations();
    public abstract android.graphics.drawable.Drawable newDrawable();
    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources);
    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources, android.content.res.Resources$Theme);


}

-keep class android.media.AudioAttributes {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getContentType();
    public int getFlags();
    public int getUsage();
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int CONTENT_TYPE_MOVIE;
    public static int CONTENT_TYPE_MUSIC;
    public static int CONTENT_TYPE_SONIFICATION;
    public static int CONTENT_TYPE_SPEECH;
    public static int CONTENT_TYPE_UNKNOWN;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_AUDIBILITY_ENFORCED;
    public static int FLAG_HW_AV_SYNC;
    public static int USAGE_ALARM;
    public static int USAGE_ASSISTANCE_ACCESSIBILITY;
    public static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
    public static int USAGE_ASSISTANCE_SONIFICATION;
    public static int USAGE_GAME;
    public static int USAGE_MEDIA;
    public static int USAGE_NOTIFICATION;
    public static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
    public static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
    public static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
    public static int USAGE_NOTIFICATION_EVENT;
    public static int USAGE_NOTIFICATION_RINGTONE;
    public static int USAGE_UNKNOWN;
    public static int USAGE_VOICE_COMMUNICATION;
    public static int USAGE_VOICE_COMMUNICATION_SIGNALLING;
}

-keep class android.media.AudioDeviceCallback {
    <init>();

    public void onAudioDevicesAdded(android.media.AudioDeviceInfo[]);
    public void onAudioDevicesRemoved(android.media.AudioDeviceInfo[]);


}

-keep class android.media.AudioDeviceInfo {

    public int[] getChannelCounts();
    public int[] getChannelIndexMasks();
    public int[] getChannelMasks();
    public int[] getEncodings();
    public int getId();
    public java.lang.CharSequence getProductName();
    public int[] getSampleRates();
    public int getType();
    public boolean isSink();
    public boolean isSource();


    public static int TYPE_AUX_LINE;
    public static int TYPE_BLUETOOTH_A2DP;
    public static int TYPE_BLUETOOTH_SCO;
    public static int TYPE_BUILTIN_EARPIECE;
    public static int TYPE_BUILTIN_MIC;
    public static int TYPE_BUILTIN_SPEAKER;
    public static int TYPE_DOCK;
    public static int TYPE_FM;
    public static int TYPE_FM_TUNER;
    public static int TYPE_HDMI;
    public static int TYPE_HDMI_ARC;
    public static int TYPE_IP;
    public static int TYPE_LINE_ANALOG;
    public static int TYPE_LINE_DIGITAL;
    public static int TYPE_TELEPHONY;
    public static int TYPE_TV_TUNER;
    public static int TYPE_UNKNOWN;
    public static int TYPE_USB_ACCESSORY;
    public static int TYPE_USB_DEVICE;
    public static int TYPE_WIRED_HEADPHONES;
    public static int TYPE_WIRED_HEADSET;
}

-keep class android.media.AudioFormat {

    public int getChannelCount();
    public int getChannelIndexMask();
    public int getChannelMask();
    public int getEncoding();
    public int getSampleRate();
    public java.lang.String toString();


    public static int CHANNEL_CONFIGURATION_DEFAULT;
    public static int CHANNEL_CONFIGURATION_INVALID;
    public static int CHANNEL_CONFIGURATION_MONO;
    public static int CHANNEL_CONFIGURATION_STEREO;
    public static int CHANNEL_INVALID;
    public static int CHANNEL_IN_BACK;
    public static int CHANNEL_IN_BACK_PROCESSED;
    public static int CHANNEL_IN_DEFAULT;
    public static int CHANNEL_IN_FRONT;
    public static int CHANNEL_IN_FRONT_PROCESSED;
    public static int CHANNEL_IN_LEFT;
    public static int CHANNEL_IN_LEFT_PROCESSED;
    public static int CHANNEL_IN_MONO;
    public static int CHANNEL_IN_PRESSURE;
    public static int CHANNEL_IN_RIGHT;
    public static int CHANNEL_IN_RIGHT_PROCESSED;
    public static int CHANNEL_IN_STEREO;
    public static int CHANNEL_IN_VOICE_DNLINK;
    public static int CHANNEL_IN_VOICE_UPLINK;
    public static int CHANNEL_IN_X_AXIS;
    public static int CHANNEL_IN_Y_AXIS;
    public static int CHANNEL_IN_Z_AXIS;
    public static int CHANNEL_OUT_5POINT1;
    public static int CHANNEL_OUT_7POINT1;
    public static int CHANNEL_OUT_7POINT1_SURROUND;
    public static int CHANNEL_OUT_BACK_CENTER;
    public static int CHANNEL_OUT_BACK_LEFT;
    public static int CHANNEL_OUT_BACK_RIGHT;
    public static int CHANNEL_OUT_DEFAULT;
    public static int CHANNEL_OUT_FRONT_CENTER;
    public static int CHANNEL_OUT_FRONT_LEFT;
    public static int CHANNEL_OUT_FRONT_LEFT_OF_CENTER;
    public static int CHANNEL_OUT_FRONT_RIGHT;
    public static int CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
    public static int CHANNEL_OUT_LOW_FREQUENCY;
    public static int CHANNEL_OUT_MONO;
    public static int CHANNEL_OUT_QUAD;
    public static int CHANNEL_OUT_SIDE_LEFT;
    public static int CHANNEL_OUT_SIDE_RIGHT;
    public static int CHANNEL_OUT_STEREO;
    public static int CHANNEL_OUT_SURROUND;
    public static int ENCODING_AC3;
    public static int ENCODING_DEFAULT;
    public static int ENCODING_DTS;
    public static int ENCODING_DTS_HD;
    public static int ENCODING_E_AC3;
    public static int ENCODING_INVALID;
    public static int ENCODING_PCM_16BIT;
    public static int ENCODING_PCM_8BIT;
    public static int ENCODING_PCM_FLOAT;
}

-keep class android.media.AudioManager {

    public int abandonAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener);
    public void adjustStreamVolume(int, int, int);
    public void adjustSuggestedStreamVolume(int, int, int);
    public void adjustVolume(int, int);
    public void dispatchMediaKeyEvent(android.view.KeyEvent);
    public int generateAudioSessionId();
    public android.media.AudioDeviceInfo[] getDevices(int);
    public int getMode();
    public java.lang.String getParameters(java.lang.String);
    public java.lang.String getProperty(java.lang.String);
    public int getRingerMode();
    public int getRouting(int);
    public int getStreamMaxVolume(int);
    public int getStreamVolume(int);
    public int getVibrateSetting(int);
    public boolean isBluetoothA2dpOn();
    public boolean isBluetoothScoAvailableOffCall();
    public boolean isBluetoothScoOn();
    public boolean isMicrophoneMute();
    public boolean isMusicActive();
    public boolean isSpeakerphoneOn();
    public boolean isStreamMute(int);
    public boolean isVolumeFixed();
    public boolean isWiredHeadsetOn();
    public void loadSoundEffects();
    public void playSoundEffect(int);
    public void playSoundEffect(int, float);
    public void registerAudioDeviceCallback(android.media.AudioDeviceCallback, android.os.Handler);
    public void registerMediaButtonEventReceiver(android.content.ComponentName);
    public void registerMediaButtonEventReceiver(android.app.PendingIntent);
    public void registerRemoteControlClient(android.media.RemoteControlClient);
    public boolean registerRemoteController(android.media.RemoteController);
    public int requestAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, int, int);
    public void setBluetoothA2dpOn(boolean);
    public void setBluetoothScoOn(boolean);
    public void setMicrophoneMute(boolean);
    public void setMode(int);
    public void setParameters(java.lang.String);
    public void setRingerMode(int);
    public void setRouting(int, int, int);
    public void setSpeakerphoneOn(boolean);
    public void setStreamMute(int, boolean);
    public void setStreamSolo(int, boolean);
    public void setStreamVolume(int, int, int);
    public void setVibrateSetting(int, int);
    public void setWiredHeadsetOn(boolean);
    public boolean shouldVibrate(int);
    public void startBluetoothSco();
    public void stopBluetoothSco();
    public void unloadSoundEffects();
    public void unregisterAudioDeviceCallback(android.media.AudioDeviceCallback);
    public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
    public void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
    public void unregisterRemoteControlClient(android.media.RemoteControlClient);
    public void unregisterRemoteController(android.media.RemoteController);


    public static java.lang.String ACTION_AUDIO_BECOMING_NOISY;
    public static java.lang.String ACTION_HDMI_AUDIO_PLUG;
    public static java.lang.String ACTION_HEADSET_PLUG;
    public static java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED;
    public static java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED;
    public static int ADJUST_LOWER;
    public static int ADJUST_MUTE;
    public static int ADJUST_RAISE;
    public static int ADJUST_SAME;
    public static int ADJUST_TOGGLE_MUTE;
    public static int ADJUST_UNMUTE;
    public static int AUDIOFOCUS_GAIN;
    public static int AUDIOFOCUS_GAIN_TRANSIENT;
    public static int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
    public static int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
    public static int AUDIOFOCUS_LOSS;
    public static int AUDIOFOCUS_LOSS_TRANSIENT;
    public static int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK;
    public static int AUDIOFOCUS_REQUEST_FAILED;
    public static int AUDIOFOCUS_REQUEST_GRANTED;
    public static int AUDIO_SESSION_ID_GENERATE;
    public static int ERROR;
    public static int ERROR_DEAD_OBJECT;
    public static java.lang.String EXTRA_AUDIO_PLUG_STATE;
    public static java.lang.String EXTRA_ENCODINGS;
    public static java.lang.String EXTRA_MAX_CHANNEL_COUNT;
    public static java.lang.String EXTRA_RINGER_MODE;
    public static java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE;
    public static java.lang.String EXTRA_SCO_AUDIO_STATE;
    public static java.lang.String EXTRA_VIBRATE_SETTING;
    public static java.lang.String EXTRA_VIBRATE_TYPE;
    public static int FLAG_ALLOW_RINGER_MODES;
    public static int FLAG_PLAY_SOUND;
    public static int FLAG_REMOVE_SOUND_AND_VIBRATE;
    public static int FLAG_SHOW_UI;
    public static int FLAG_VIBRATE;
    public static int FX_FOCUS_NAVIGATION_DOWN;
    public static int FX_FOCUS_NAVIGATION_LEFT;
    public static int FX_FOCUS_NAVIGATION_RIGHT;
    public static int FX_FOCUS_NAVIGATION_UP;
    public static int FX_KEYPRESS_DELETE;
    public static int FX_KEYPRESS_INVALID;
    public static int FX_KEYPRESS_RETURN;
    public static int FX_KEYPRESS_SPACEBAR;
    public static int FX_KEYPRESS_STANDARD;
    public static int FX_KEY_CLICK;
    public static int GET_DEVICES_ALL;
    public static int GET_DEVICES_INPUTS;
    public static int GET_DEVICES_OUTPUTS;
    public static int MODE_CURRENT;
    public static int MODE_INVALID;
    public static int MODE_IN_CALL;
    public static int MODE_IN_COMMUNICATION;
    public static int MODE_NORMAL;
    public static int MODE_RINGTONE;
    public static int NUM_STREAMS;
    public static java.lang.String PROPERTY_OUTPUT_FRAMES_PER_BUFFER;
    public static java.lang.String PROPERTY_OUTPUT_SAMPLE_RATE;
    public static java.lang.String PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND;
    public static java.lang.String PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND;
    public static java.lang.String RINGER_MODE_CHANGED_ACTION;
    public static int RINGER_MODE_NORMAL;
    public static int RINGER_MODE_SILENT;
    public static int RINGER_MODE_VIBRATE;
    public static int ROUTE_ALL;
    public static int ROUTE_BLUETOOTH;
    public static int ROUTE_BLUETOOTH_A2DP;
    public static int ROUTE_BLUETOOTH_SCO;
    public static int ROUTE_EARPIECE;
    public static int ROUTE_HEADSET;
    public static int ROUTE_SPEAKER;
    public static int SCO_AUDIO_STATE_CONNECTED;
    public static int SCO_AUDIO_STATE_CONNECTING;
    public static int SCO_AUDIO_STATE_DISCONNECTED;
    public static int SCO_AUDIO_STATE_ERROR;
    public static int STREAM_ALARM;
    public static int STREAM_DTMF;
    public static int STREAM_MUSIC;
    public static int STREAM_NOTIFICATION;
    public static int STREAM_RING;
    public static int STREAM_SYSTEM;
    public static int STREAM_VOICE_CALL;
    public static int USE_DEFAULT_STREAM_TYPE;
    public static java.lang.String VIBRATE_SETTING_CHANGED_ACTION;
    public static int VIBRATE_SETTING_OFF;
    public static int VIBRATE_SETTING_ON;
    public static int VIBRATE_SETTING_ONLY_SILENT;
    public static int VIBRATE_TYPE_NOTIFICATION;
    public static int VIBRATE_TYPE_RINGER;
}

-keep class android.media.AudioManager$OnAudioFocusChangeListener {

    public abstract void onAudioFocusChange(int);


}

-keep class android.media.MediaDescription {

    public int describeContents();
    public java.lang.CharSequence getDescription();
    public android.os.Bundle getExtras();
    public android.graphics.Bitmap getIconBitmap();
    public android.net.Uri getIconUri();
    public java.lang.String getMediaId();
    public android.net.Uri getMediaUri();
    public java.lang.CharSequence getSubtitle();
    public java.lang.CharSequence getTitle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.MediaMetadata {

    public boolean containsKey(java.lang.String);
    public int describeContents();
    public android.graphics.Bitmap getBitmap(java.lang.String);
    public android.media.MediaDescription getDescription();
    public long getLong(java.lang.String);
    public android.media.Rating getRating(java.lang.String);
    public java.lang.String getString(java.lang.String);
    public java.lang.CharSequence getText(java.lang.String);
    public java.util.Set keySet();
    public int size();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String METADATA_KEY_ALBUM;
    public static java.lang.String METADATA_KEY_ALBUM_ART;
    public static java.lang.String METADATA_KEY_ALBUM_ARTIST;
    public static java.lang.String METADATA_KEY_ALBUM_ART_URI;
    public static java.lang.String METADATA_KEY_ART;
    public static java.lang.String METADATA_KEY_ARTIST;
    public static java.lang.String METADATA_KEY_ART_URI;
    public static java.lang.String METADATA_KEY_AUTHOR;
    public static java.lang.String METADATA_KEY_COMPILATION;
    public static java.lang.String METADATA_KEY_COMPOSER;
    public static java.lang.String METADATA_KEY_DATE;
    public static java.lang.String METADATA_KEY_DISC_NUMBER;
    public static java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION;
    public static java.lang.String METADATA_KEY_DISPLAY_ICON;
    public static java.lang.String METADATA_KEY_DISPLAY_ICON_URI;
    public static java.lang.String METADATA_KEY_DISPLAY_SUBTITLE;
    public static java.lang.String METADATA_KEY_DISPLAY_TITLE;
    public static java.lang.String METADATA_KEY_DURATION;
    public static java.lang.String METADATA_KEY_GENRE;
    public static java.lang.String METADATA_KEY_MEDIA_ID;
    public static java.lang.String METADATA_KEY_NUM_TRACKS;
    public static java.lang.String METADATA_KEY_RATING;
    public static java.lang.String METADATA_KEY_TITLE;
    public static java.lang.String METADATA_KEY_TRACK_NUMBER;
    public static java.lang.String METADATA_KEY_USER_RATING;
    public static java.lang.String METADATA_KEY_WRITER;
    public static java.lang.String METADATA_KEY_YEAR;
}

-keep class android.media.MediaMetadataEditor {

    public synchronized void addEditableKey(int);
    public abstract void apply();
    public synchronized void clear();
    public synchronized android.graphics.Bitmap getBitmap(int, android.graphics.Bitmap);
    public synchronized int[] getEditableKeys();
    public synchronized long getLong(int, long);
    public synchronized java.lang.Object getObject(int, java.lang.Object);
    public synchronized java.lang.String getString(int, java.lang.String);
    public synchronized android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap);
    public synchronized android.media.MediaMetadataEditor putLong(int, long);
    public synchronized android.media.MediaMetadataEditor putObject(int, java.lang.Object);
    public synchronized android.media.MediaMetadataEditor putString(int, java.lang.String);
    public synchronized void removeEditableKeys();


    public static int BITMAP_KEY_ARTWORK;
    public static int RATING_KEY_BY_OTHERS;
    public static int RATING_KEY_BY_USER;
}

-keep class android.media.Rating {

    public int describeContents();
    public float getPercentRating();
    public int getRatingStyle();
    public float getStarRating();
    public boolean hasHeart();
    public boolean isRated();
    public boolean isThumbUp();
    public static android.media.Rating newHeartRating(boolean);
    public static android.media.Rating newPercentageRating(float);
    public static android.media.Rating newStarRating(int, float);
    public static android.media.Rating newThumbRating(boolean);
    public static android.media.Rating newUnratedRating(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int RATING_3_STARS;
    public static int RATING_4_STARS;
    public static int RATING_5_STARS;
    public static int RATING_HEART;
    public static int RATING_NONE;
    public static int RATING_PERCENTAGE;
    public static int RATING_THUMB_UP_DOWN;
}

-keep class android.media.RemoteControlClient {
    <init>(android.app.PendingIntent);
    <init>(android.app.PendingIntent, android.os.Looper);

    public android.media.RemoteControlClient$MetadataEditor editMetadata(boolean);
    public android.media.session.MediaSession getMediaSession();
    public void setMetadataUpdateListener(android.media.RemoteControlClient$OnMetadataUpdateListener);
    public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient$OnGetPlaybackPositionListener);
    public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient$OnPlaybackPositionUpdateListener);
    public void setPlaybackState(int);
    public void setPlaybackState(int, long, float);
    public void setTransportControlFlags(int);


    public static int FLAG_KEY_MEDIA_FAST_FORWARD;
    public static int FLAG_KEY_MEDIA_NEXT;
    public static int FLAG_KEY_MEDIA_PAUSE;
    public static int FLAG_KEY_MEDIA_PLAY;
    public static int FLAG_KEY_MEDIA_PLAY_PAUSE;
    public static int FLAG_KEY_MEDIA_POSITION_UPDATE;
    public static int FLAG_KEY_MEDIA_PREVIOUS;
    public static int FLAG_KEY_MEDIA_RATING;
    public static int FLAG_KEY_MEDIA_REWIND;
    public static int FLAG_KEY_MEDIA_STOP;
    public static int PLAYSTATE_BUFFERING;
    public static int PLAYSTATE_ERROR;
    public static int PLAYSTATE_FAST_FORWARDING;
    public static int PLAYSTATE_PAUSED;
    public static int PLAYSTATE_PLAYING;
    public static int PLAYSTATE_REWINDING;
    public static int PLAYSTATE_SKIPPING_BACKWARDS;
    public static int PLAYSTATE_SKIPPING_FORWARDS;
    public static int PLAYSTATE_STOPPED;
}

-keep class android.media.RemoteControlClient$MetadataEditor {

    public synchronized void apply();
    public synchronized void clear();
    public synchronized android.media.RemoteControlClient$MetadataEditor putBitmap(int, android.graphics.Bitmap);
    public android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap);
    public synchronized android.media.RemoteControlClient$MetadataEditor putLong(int, long);
    public android.media.MediaMetadataEditor putLong(int, long);
    public synchronized android.media.RemoteControlClient$MetadataEditor putObject(int, java.lang.Object);
    public android.media.MediaMetadataEditor putObject(int, java.lang.Object);
    public synchronized android.media.RemoteControlClient$MetadataEditor putString(int, java.lang.String);
    public android.media.MediaMetadataEditor putString(int, java.lang.String);


    public static int BITMAP_KEY_ARTWORK;
}

-keep class android.media.RemoteControlClient$OnGetPlaybackPositionListener {

    public abstract long onGetPlaybackPosition();


}

-keep class android.media.RemoteControlClient$OnMetadataUpdateListener {

    public abstract void onMetadataUpdate(int, java.lang.Object);


}

-keep class android.media.RemoteControlClient$OnPlaybackPositionUpdateListener {

    public abstract void onPlaybackPositionUpdate(long);


}

-keep class android.media.RemoteController {
    <init>(android.content.Context, android.media.RemoteController$OnClientUpdateListener);
    <init>(android.content.Context, android.media.RemoteController$OnClientUpdateListener, android.os.Looper);

    public boolean clearArtworkConfiguration();
    public android.media.RemoteController$MetadataEditor editMetadata();
    public long getEstimatedMediaPosition();
    public boolean seekTo(long);
    public boolean sendMediaKeyEvent(android.view.KeyEvent);
    public boolean setArtworkConfiguration(int, int);
    public boolean setSynchronizationMode(int);


    public static int POSITION_SYNCHRONIZATION_CHECK;
    public static int POSITION_SYNCHRONIZATION_NONE;
}

-keep class android.media.RemoteController$MetadataEditor {

    public synchronized void apply();


}

-keep class android.media.RemoteController$OnClientUpdateListener {

    public abstract void onClientChange(boolean);
    public abstract void onClientMetadataUpdate(android.media.RemoteController$MetadataEditor);
    public abstract void onClientPlaybackStateUpdate(int);
    public abstract void onClientPlaybackStateUpdate(int, long, long, float);
    public abstract void onClientTransportControlUpdate(int);


}

-keep class android.media.VolumeProvider {
    <init>(int, int, int);

    public int getCurrentVolume();
    public int getMaxVolume();
    public int getVolumeControl();
    public void onAdjustVolume(int);
    public void onSetVolumeTo(int);
    public void setCurrentVolume(int);


    public static int VOLUME_CONTROL_ABSOLUTE;
    public static int VOLUME_CONTROL_FIXED;
    public static int VOLUME_CONTROL_RELATIVE;
}

-keep class android.media.session.MediaController {
    <init>(android.content.Context, android.media.session.MediaSession$Token);

    public void adjustVolume(int, int);
    public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
    public android.os.Bundle getExtras();
    public long getFlags();
    public android.media.MediaMetadata getMetadata();
    public java.lang.String getPackageName();
    public android.media.session.MediaController$PlaybackInfo getPlaybackInfo();
    public android.media.session.PlaybackState getPlaybackState();
    public java.util.List getQueue();
    public java.lang.CharSequence getQueueTitle();
    public int getRatingType();
    public android.app.PendingIntent getSessionActivity();
    public android.media.session.MediaSession$Token getSessionToken();
    public android.media.session.MediaController$TransportControls getTransportControls();
    public void registerCallback(android.media.session.MediaController$Callback);
    public void registerCallback(android.media.session.MediaController$Callback, android.os.Handler);
    public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void setVolumeTo(int, int);
    public void unregisterCallback(android.media.session.MediaController$Callback);


}

-keep class android.media.session.MediaController$Callback {
    <init>();

    public void onAudioInfoChanged(android.media.session.MediaController$PlaybackInfo);
    public void onExtrasChanged(android.os.Bundle);
    public void onMetadataChanged(android.media.MediaMetadata);
    public void onPlaybackStateChanged(android.media.session.PlaybackState);
    public void onQueueChanged(java.util.List);
    public void onQueueTitleChanged(java.lang.CharSequence);
    public void onSessionDestroyed();
    public void onSessionEvent(java.lang.String, android.os.Bundle);


}

-keep class android.media.session.MediaController$PlaybackInfo {

    public android.media.AudioAttributes getAudioAttributes();
    public int getCurrentVolume();
    public int getMaxVolume();
    public int getPlaybackType();
    public int getVolumeControl();


    public static int PLAYBACK_TYPE_LOCAL;
    public static int PLAYBACK_TYPE_REMOTE;
}

-keep class android.media.session.MediaController$TransportControls {

    public void fastForward();
    public void pause();
    public void play();
    public void playFromMediaId(java.lang.String, android.os.Bundle);
    public void playFromSearch(java.lang.String, android.os.Bundle);
    public void playFromUri(android.net.Uri, android.os.Bundle);
    public void rewind();
    public void seekTo(long);
    public void sendCustomAction(android.media.session.PlaybackState$CustomAction, android.os.Bundle);
    public void sendCustomAction(java.lang.String, android.os.Bundle);
    public void setRating(android.media.Rating);
    public void skipToNext();
    public void skipToPrevious();
    public void skipToQueueItem(long);
    public void stop();


}

-keep class android.media.session.MediaSession {
    <init>(android.content.Context, java.lang.String);

    public android.media.session.MediaController getController();
    public android.media.session.MediaSession$Token getSessionToken();
    public boolean isActive();
    public void release();
    public void sendSessionEvent(java.lang.String, android.os.Bundle);
    public void setActive(boolean);
    public void setCallback(android.media.session.MediaSession$Callback);
    public void setCallback(android.media.session.MediaSession$Callback, android.os.Handler);
    public void setExtras(android.os.Bundle);
    public void setFlags(int);
    public void setMediaButtonReceiver(android.app.PendingIntent);
    public void setMetadata(android.media.MediaMetadata);
    public void setPlaybackState(android.media.session.PlaybackState);
    public void setPlaybackToLocal(android.media.AudioAttributes);
    public void setPlaybackToRemote(android.media.VolumeProvider);
    public void setQueue(java.util.List);
    public void setQueueTitle(java.lang.CharSequence);
    public void setRatingType(int);
    public void setSessionActivity(android.app.PendingIntent);


    public static int FLAG_HANDLES_MEDIA_BUTTONS;
    public static int FLAG_HANDLES_TRANSPORT_CONTROLS;
}

-keep class android.media.session.MediaSession$Callback {
    <init>();

    public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void onCustomAction(java.lang.String, android.os.Bundle);
    public void onFastForward();
    public boolean onMediaButtonEvent(android.content.Intent);
    public void onPause();
    public void onPlay();
    public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
    public void onPlayFromSearch(java.lang.String, android.os.Bundle);
    public void onPlayFromUri(android.net.Uri, android.os.Bundle);
    public void onRewind();
    public void onSeekTo(long);
    public void onSetRating(android.media.Rating);
    public void onSkipToNext();
    public void onSkipToPrevious();
    public void onSkipToQueueItem(long);
    public void onStop();


}

-keep class android.media.session.MediaSession$QueueItem {
    <init>(android.media.MediaDescription, long);

    public int describeContents();
    public android.media.MediaDescription getDescription();
    public long getQueueId();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int UNKNOWN_ID;
}

-keep class android.media.session.MediaSession$Token {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.session.PlaybackState {

    public int describeContents();
    public long getActions();
    public long getActiveQueueItemId();
    public long getBufferedPosition();
    public java.util.List getCustomActions();
    public java.lang.CharSequence getErrorMessage();
    public android.os.Bundle getExtras();
    public long getLastPositionUpdateTime();
    public float getPlaybackSpeed();
    public long getPosition();
    public int getState();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static long ACTION_FAST_FORWARD;
    public static long ACTION_PAUSE;
    public static long ACTION_PLAY;
    public static long ACTION_PLAY_FROM_MEDIA_ID;
    public static long ACTION_PLAY_FROM_SEARCH;
    public static long ACTION_PLAY_FROM_URI;
    public static long ACTION_PLAY_PAUSE;
    public static long ACTION_REWIND;
    public static long ACTION_SEEK_TO;
    public static long ACTION_SET_RATING;
    public static long ACTION_SKIP_TO_NEXT;
    public static long ACTION_SKIP_TO_PREVIOUS;
    public static long ACTION_SKIP_TO_QUEUE_ITEM;
    public static long ACTION_STOP;
    public static android.os.Parcelable$Creator CREATOR;
    public static long PLAYBACK_POSITION_UNKNOWN;
    public static int STATE_BUFFERING;
    public static int STATE_CONNECTING;
    public static int STATE_ERROR;
    public static int STATE_FAST_FORWARDING;
    public static int STATE_NONE;
    public static int STATE_PAUSED;
    public static int STATE_PLAYING;
    public static int STATE_REWINDING;
    public static int STATE_SKIPPING_TO_NEXT;
    public static int STATE_SKIPPING_TO_PREVIOUS;
    public static int STATE_SKIPPING_TO_QUEUE_ITEM;
    public static int STATE_STOPPED;
}

-keep class android.media.session.PlaybackState$CustomAction {

    public int describeContents();
    public java.lang.String getAction();
    public android.os.Bundle getExtras();
    public int getIcon();
    public java.lang.CharSequence getName();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.net.Uri {

    public abstract android.net.Uri$Builder buildUpon();
    public int compareTo(android.net.Uri);
    public int compareTo(java.lang.Object);
    public static java.lang.String decode(java.lang.String);
    public static java.lang.String encode(java.lang.String);
    public static java.lang.String encode(java.lang.String, java.lang.String);
    public boolean equals(java.lang.Object);
    public static android.net.Uri fromFile(java.io.File);
    public static android.net.Uri fromParts(java.lang.String, java.lang.String, java.lang.String);
    public abstract java.lang.String getAuthority();
    public boolean getBooleanQueryParameter(java.lang.String, boolean);
    public abstract java.lang.String getEncodedAuthority();
    public abstract java.lang.String getEncodedFragment();
    public abstract java.lang.String getEncodedPath();
    public abstract java.lang.String getEncodedQuery();
    public abstract java.lang.String getEncodedSchemeSpecificPart();
    public abstract java.lang.String getEncodedUserInfo();
    public abstract java.lang.String getFragment();
    public abstract java.lang.String getHost();
    public abstract java.lang.String getLastPathSegment();
    public abstract java.lang.String getPath();
    public abstract java.util.List getPathSegments();
    public abstract int getPort();
    public abstract java.lang.String getQuery();
    public java.lang.String getQueryParameter(java.lang.String);
    public java.util.Set getQueryParameterNames();
    public java.util.List getQueryParameters(java.lang.String);
    public abstract java.lang.String getScheme();
    public abstract java.lang.String getSchemeSpecificPart();
    public abstract java.lang.String getUserInfo();
    public int hashCode();
    public boolean isAbsolute();
    public abstract boolean isHierarchical();
    public boolean isOpaque();
    public abstract boolean isRelative();
    public android.net.Uri normalizeScheme();
    public static android.net.Uri parse(java.lang.String);
    public abstract java.lang.String toString();
    public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
    public static void writeToParcel(android.os.Parcel, android.net.Uri);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.net.Uri EMPTY;
}

-keep class android.net.Uri$Builder {
    <init>();

    public android.net.Uri$Builder appendEncodedPath(java.lang.String);
    public android.net.Uri$Builder appendPath(java.lang.String);
    public android.net.Uri$Builder appendQueryParameter(java.lang.String, java.lang.String);
    public android.net.Uri$Builder authority(java.lang.String);
    public android.net.Uri build();
    public android.net.Uri$Builder clearQuery();
    public android.net.Uri$Builder encodedAuthority(java.lang.String);
    public android.net.Uri$Builder encodedFragment(java.lang.String);
    public android.net.Uri$Builder encodedOpaquePart(java.lang.String);
    public android.net.Uri$Builder encodedPath(java.lang.String);
    public android.net.Uri$Builder encodedQuery(java.lang.String);
    public android.net.Uri$Builder fragment(java.lang.String);
    public android.net.Uri$Builder opaquePart(java.lang.String);
    public android.net.Uri$Builder path(java.lang.String);
    public android.net.Uri$Builder query(java.lang.String);
    public android.net.Uri$Builder scheme(java.lang.String);
    public java.lang.String toString();


}

-keep class android.os.BaseBundle {

    public void clear();
    public boolean containsKey(java.lang.String);
    public java.lang.Object get(java.lang.String);
    public boolean getBoolean(java.lang.String);
    public boolean getBoolean(java.lang.String, boolean);
    public boolean[] getBooleanArray(java.lang.String);
    public double getDouble(java.lang.String);
    public double getDouble(java.lang.String, double);
    public double[] getDoubleArray(java.lang.String);
    public int getInt(java.lang.String);
    public int getInt(java.lang.String, int);
    public int[] getIntArray(java.lang.String);
    public long getLong(java.lang.String);
    public long getLong(java.lang.String, long);
    public long[] getLongArray(java.lang.String);
    public java.lang.String getString(java.lang.String);
    public java.lang.String getString(java.lang.String, java.lang.String);
    public java.lang.String[] getStringArray(java.lang.String);
    public boolean isEmpty();
    public java.util.Set keySet();
    public void putAll(android.os.PersistableBundle);
    public void putBoolean(java.lang.String, boolean);
    public void putBooleanArray(java.lang.String, boolean[]);
    public void putDouble(java.lang.String, double);
    public void putDoubleArray(java.lang.String, double[]);
    public void putInt(java.lang.String, int);
    public void putIntArray(java.lang.String, int[]);
    public void putLong(java.lang.String, long);
    public void putLongArray(java.lang.String, long[]);
    public void putString(java.lang.String, java.lang.String);
    public void putStringArray(java.lang.String, java.lang.String[]);
    public void remove(java.lang.String);
    public int size();


}

-keep class android.os.Bundle {
    <init>();
    <init>(java.lang.ClassLoader);
    <init>(int);
    <init>(android.os.Bundle);
    <init>(android.os.PersistableBundle);

    public void clear();
    public java.lang.Object clone();
    public int describeContents();
    public android.os.IBinder getBinder(java.lang.String);
    public android.os.Bundle getBundle(java.lang.String);
    public byte getByte(java.lang.String);
    public java.lang.Byte getByte(java.lang.String, byte);
    public byte[] getByteArray(java.lang.String);
    public char getChar(java.lang.String);
    public char getChar(java.lang.String, char);
    public char[] getCharArray(java.lang.String);
    public java.lang.CharSequence getCharSequence(java.lang.String);
    public java.lang.CharSequence getCharSequence(java.lang.String, java.lang.CharSequence);
    public java.lang.CharSequence[] getCharSequenceArray(java.lang.String);
    public java.util.ArrayList getCharSequenceArrayList(java.lang.String);
    public java.lang.ClassLoader getClassLoader();
    public float getFloat(java.lang.String);
    public float getFloat(java.lang.String, float);
    public float[] getFloatArray(java.lang.String);
    public java.util.ArrayList getIntegerArrayList(java.lang.String);
    public android.os.Parcelable getParcelable(java.lang.String);
    public android.os.Parcelable[] getParcelableArray(java.lang.String);
    public java.util.ArrayList getParcelableArrayList(java.lang.String);
    public java.io.Serializable getSerializable(java.lang.String);
    public short getShort(java.lang.String);
    public short getShort(java.lang.String, short);
    public short[] getShortArray(java.lang.String);
    public android.util.Size getSize(java.lang.String);
    public android.util.SizeF getSizeF(java.lang.String);
    public android.util.SparseArray getSparseParcelableArray(java.lang.String);
    public java.util.ArrayList getStringArrayList(java.lang.String);
    public boolean hasFileDescriptors();
    public void putAll(android.os.Bundle);
    public void putBinder(java.lang.String, android.os.IBinder);
    public void putBundle(java.lang.String, android.os.Bundle);
    public void putByte(java.lang.String, byte);
    public void putByteArray(java.lang.String, byte[]);
    public void putChar(java.lang.String, char);
    public void putCharArray(java.lang.String, char[]);
    public void putCharSequence(java.lang.String, java.lang.CharSequence);
    public void putCharSequenceArray(java.lang.String, java.lang.CharSequence[]);
    public void putCharSequenceArrayList(java.lang.String, java.util.ArrayList);
    public void putFloat(java.lang.String, float);
    public void putFloatArray(java.lang.String, float[]);
    public void putIntegerArrayList(java.lang.String, java.util.ArrayList);
    public void putParcelable(java.lang.String, android.os.Parcelable);
    public void putParcelableArray(java.lang.String, android.os.Parcelable[]);
    public void putParcelableArrayList(java.lang.String, java.util.ArrayList);
    public void putSerializable(java.lang.String, java.io.Serializable);
    public void putShort(java.lang.String, short);
    public void putShortArray(java.lang.String, short[]);
    public void putSize(java.lang.String, android.util.Size);
    public void putSizeF(java.lang.String, android.util.SizeF);
    public void putSparseParcelableArray(java.lang.String, android.util.SparseArray);
    public void putStringArrayList(java.lang.String, java.util.ArrayList);
    public void readFromParcel(android.os.Parcel);
    public void setClassLoader(java.lang.ClassLoader);
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.Bundle EMPTY;
}

-keep class android.os.CancellationSignal {
    <init>();

    public void cancel();
    public boolean isCanceled();
    public void setOnCancelListener(android.os.CancellationSignal$OnCancelListener);
    public void throwIfCanceled();


}

-keep class android.os.CancellationSignal$OnCancelListener {

    public abstract void onCancel();


}

-keep class android.os.Handler {
    <init>();
    <init>(android.os.Handler$Callback);
    <init>(android.os.Looper);
    <init>(android.os.Looper, android.os.Handler$Callback);

    public void dispatchMessage(android.os.Message);
    public void dump(android.util.Printer, java.lang.String);
    public android.os.Looper getLooper();
    public java.lang.String getMessageName(android.os.Message);
    public void handleMessage(android.os.Message);
    public boolean hasMessages(int);
    public boolean hasMessages(int, java.lang.Object);
    public android.os.Message obtainMessage();
    public android.os.Message obtainMessage(int);
    public android.os.Message obtainMessage(int, java.lang.Object);
    public android.os.Message obtainMessage(int, int, int);
    public android.os.Message obtainMessage(int, int, int, java.lang.Object);
    public boolean post(java.lang.Runnable);
    public boolean postAtFrontOfQueue(java.lang.Runnable);
    public boolean postAtTime(java.lang.Runnable, long);
    public boolean postAtTime(java.lang.Runnable, java.lang.Object, long);
    public boolean postDelayed(java.lang.Runnable, long);
    public void removeCallbacks(java.lang.Runnable);
    public void removeCallbacks(java.lang.Runnable, java.lang.Object);
    public void removeCallbacksAndMessages(java.lang.Object);
    public void removeMessages(int);
    public void removeMessages(int, java.lang.Object);
    public boolean sendEmptyMessage(int);
    public boolean sendEmptyMessageAtTime(int, long);
    public boolean sendEmptyMessageDelayed(int, long);
    public boolean sendMessage(android.os.Message);
    public boolean sendMessageAtFrontOfQueue(android.os.Message);
    public boolean sendMessageAtTime(android.os.Message, long);
    public boolean sendMessageDelayed(android.os.Message, long);
    public java.lang.String toString();


}

-keep class android.os.Handler$Callback {

    public abstract boolean handleMessage(android.os.Message);


}

-keep class android.os.IBinder {

    public abstract void dump(java.io.FileDescriptor, java.lang.String[]);
    public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
    public abstract java.lang.String getInterfaceDescriptor();
    public abstract boolean isBinderAlive();
    public abstract void linkToDeath(android.os.IBinder$DeathRecipient, int);
    public abstract boolean pingBinder();
    public abstract android.os.IInterface queryLocalInterface(java.lang.String);
    public abstract boolean transact(int, android.os.Parcel, android.os.Parcel, int);
    public abstract boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);


    public static int DUMP_TRANSACTION;
    public static int FIRST_CALL_TRANSACTION;
    public static int FLAG_ONEWAY;
    public static int INTERFACE_TRANSACTION;
    public static int LAST_CALL_TRANSACTION;
    public static int LIKE_TRANSACTION;
    public static int PING_TRANSACTION;
    public static int TWEET_TRANSACTION;
}

-keep class android.os.IBinder$DeathRecipient {

    public abstract void binderDied();


}

-keep class android.os.IInterface {

    public abstract android.os.IBinder asBinder();


}

-keep class android.os.Looper {

    public void dump(android.util.Printer, java.lang.String);
    public static android.os.Looper getMainLooper();
    public android.os.MessageQueue getQueue();
    public java.lang.Thread getThread();
    public boolean isCurrentThread();
    public static void loop();
    public static android.os.Looper myLooper();
    public static android.os.MessageQueue myQueue();
    public static void prepare();
    public static void prepareMainLooper();
    public void quit();
    public void quitSafely();
    public void setMessageLogging(android.util.Printer);
    public java.lang.String toString();


}

-keep class android.os.Message {
    <init>();

    public void copyFrom(android.os.Message);
    public int describeContents();
    public java.lang.Runnable getCallback();
    public android.os.Bundle getData();
    public android.os.Handler getTarget();
    public long getWhen();
    public boolean isAsynchronous();
    public static android.os.Message obtain();
    public static android.os.Message obtain(android.os.Message);
    public static android.os.Message obtain(android.os.Handler);
    public static android.os.Message obtain(android.os.Handler, java.lang.Runnable);
    public static android.os.Message obtain(android.os.Handler, int);
    public static android.os.Message obtain(android.os.Handler, int, java.lang.Object);
    public static android.os.Message obtain(android.os.Handler, int, int, int);
    public static android.os.Message obtain(android.os.Handler, int, int, int, java.lang.Object);
    public android.os.Bundle peekData();
    public void recycle();
    public void sendToTarget();
    public void setAsynchronous(boolean);
    public void setData(android.os.Bundle);
    public void setTarget(android.os.Handler);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int arg1;
    public int arg2;
    public java.lang.Object obj;
    public android.os.Messenger replyTo;
    public int sendingUid;
    public int what;
}

-keep class android.os.MessageQueue {

    public void addIdleHandler(android.os.MessageQueue$IdleHandler);
    public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue$OnFileDescriptorEventListener);
    protected void finalize();
    public boolean isIdle();
    public void removeIdleHandler(android.os.MessageQueue$IdleHandler);
    public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);


}

-keep class android.os.MessageQueue$IdleHandler {

    public abstract boolean queueIdle();


}

-keep class android.os.MessageQueue$OnFileDescriptorEventListener {

    public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int);


    public static int EVENT_ERROR;
    public static int EVENT_INPUT;
    public static int EVENT_OUTPUT;
}

-keep class android.os.Messenger {
    <init>(android.os.Handler);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getBinder();
    public int hashCode();
    public static android.os.Messenger readMessengerOrNullFromParcel(android.os.Parcel);
    public void send(android.os.Message);
    public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.Parcel {

    public void appendFrom(android.os.Parcel, int, int);
    public android.os.IBinder[] createBinderArray();
    public java.util.ArrayList createBinderArrayList();
    public boolean[] createBooleanArray();
    public byte[] createByteArray();
    public char[] createCharArray();
    public double[] createDoubleArray();
    public float[] createFloatArray();
    public int[] createIntArray();
    public long[] createLongArray();
    public java.lang.String[] createStringArray();
    public java.util.ArrayList createStringArrayList();
    public java.lang.Object[] createTypedArray(android.os.Parcelable$Creator);
    public java.util.ArrayList createTypedArrayList(android.os.Parcelable$Creator);
    public int dataAvail();
    public int dataCapacity();
    public int dataPosition();
    public int dataSize();
    public void enforceInterface(java.lang.String);
    protected void finalize();
    public boolean hasFileDescriptors();
    public byte[] marshall();
    public static android.os.Parcel obtain();
    public java.lang.Object[] readArray(java.lang.ClassLoader);
    public java.util.ArrayList readArrayList(java.lang.ClassLoader);
    public void readBinderArray(android.os.IBinder[]);
    public void readBinderList(java.util.List);
    public void readBooleanArray(boolean[]);
    public android.os.Bundle readBundle();
    public android.os.Bundle readBundle(java.lang.ClassLoader);
    public byte readByte();
    public void readByteArray(byte[]);
    public void readCharArray(char[]);
    public double readDouble();
    public void readDoubleArray(double[]);
    public void readException();
    public void readException(int, java.lang.String);
    public android.os.ParcelFileDescriptor readFileDescriptor();
    public float readFloat();
    public void readFloatArray(float[]);
    public java.util.HashMap readHashMap(java.lang.ClassLoader);
    public int readInt();
    public void readIntArray(int[]);
    public void readList(java.util.List, java.lang.ClassLoader);
    public long readLong();
    public void readLongArray(long[]);
    public void readMap(java.util.Map, java.lang.ClassLoader);
    public android.os.Parcelable readParcelable(java.lang.ClassLoader);
    public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
    public android.os.PersistableBundle readPersistableBundle();
    public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
    public java.io.Serializable readSerializable();
    public android.util.Size readSize();
    public android.util.SizeF readSizeF();
    public android.util.SparseArray readSparseArray(java.lang.ClassLoader);
    public android.util.SparseBooleanArray readSparseBooleanArray();
    public java.lang.String readString();
    public void readStringArray(java.lang.String[]);
    public void readStringList(java.util.List);
    public android.os.IBinder readStrongBinder();
    public void readTypedArray(java.lang.Object[], android.os.Parcelable$Creator);
    public void readTypedList(java.util.List, android.os.Parcelable$Creator);
    public java.lang.Object readTypedObject(android.os.Parcelable$Creator);
    public java.lang.Object readValue(java.lang.ClassLoader);
    public void recycle();
    public void setDataCapacity(int);
    public void setDataPosition(int);
    public void setDataSize(int);
    public void unmarshall(byte[], int, int);
    public void writeArray(java.lang.Object[]);
    public void writeBinderArray(android.os.IBinder[]);
    public void writeBinderList(java.util.List);
    public void writeBooleanArray(boolean[]);
    public void writeBundle(android.os.Bundle);
    public void writeByte(byte);
    public void writeByteArray(byte[]);
    public void writeByteArray(byte[], int, int);
    public void writeCharArray(char[]);
    public void writeDouble(double);
    public void writeDoubleArray(double[]);
    public void writeException(java.lang.Exception);
    public void writeFileDescriptor(java.io.FileDescriptor);
    public void writeFloat(float);
    public void writeFloatArray(float[]);
    public void writeInt(int);
    public void writeIntArray(int[]);
    public void writeInterfaceToken(java.lang.String);
    public void writeList(java.util.List);
    public void writeLong(long);
    public void writeLongArray(long[]);
    public void writeMap(java.util.Map);
    public void writeNoException();
    public void writeParcelable(android.os.Parcelable, int);
    public void writeParcelableArray(android.os.Parcelable[], int);
    public void writePersistableBundle(android.os.PersistableBundle);
    public void writeSerializable(java.io.Serializable);
    public void writeSize(android.util.Size);
    public void writeSizeF(android.util.SizeF);
    public void writeSparseArray(android.util.SparseArray);
    public void writeSparseBooleanArray(android.util.SparseBooleanArray);
    public void writeString(java.lang.String);
    public void writeStringArray(java.lang.String[]);
    public void writeStringList(java.util.List);
    public void writeStrongBinder(android.os.IBinder);
    public void writeStrongInterface(android.os.IInterface);
    public void writeTypedArray(android.os.Parcelable[], int);
    public void writeTypedList(java.util.List);
    public void writeTypedObject(android.os.Parcelable, int);
    public void writeValue(java.lang.Object);


    public static android.os.Parcelable$Creator STRING_CREATOR;
}

-keep class android.os.ParcelFileDescriptor {
    <init>(android.os.ParcelFileDescriptor);

    public static android.os.ParcelFileDescriptor adoptFd(int);
    public boolean canDetectErrors();
    public void checkError();
    public void close();
    public void closeWithError(java.lang.String);
    public static android.os.ParcelFileDescriptor[] createPipe();
    public static android.os.ParcelFileDescriptor[] createReliablePipe();
    public static android.os.ParcelFileDescriptor[] createReliableSocketPair();
    public static android.os.ParcelFileDescriptor[] createSocketPair();
    public int describeContents();
    public int detachFd();
    public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor);
    public android.os.ParcelFileDescriptor dup();
    protected void finalize();
    public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
    public static android.os.ParcelFileDescriptor fromFd(int);
    public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
    public int getFd();
    public java.io.FileDescriptor getFileDescriptor();
    public long getStatSize();
    public static android.os.ParcelFileDescriptor open(java.io.File, int);
    public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
    public static int parseMode(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_APPEND;
    public static int MODE_CREATE;
    public static int MODE_READ_ONLY;
    public static int MODE_READ_WRITE;
    public static int MODE_TRUNCATE;
    public static int MODE_WORLD_READABLE;
    public static int MODE_WORLD_WRITEABLE;
    public static int MODE_WRITE_ONLY;
}

-keep class android.os.ParcelFileDescriptor$OnCloseListener {

    public abstract void onClose(java.io.IOException);


}

-keep class android.os.Parcelable {

    public abstract int describeContents();
    public abstract void writeToParcel(android.os.Parcel, int);


    public static int CONTENTS_FILE_DESCRIPTOR;
    public static int PARCELABLE_WRITE_RETURN_VALUE;
}

-keep class android.os.Parcelable$Creator {

    public abstract java.lang.Object createFromParcel(android.os.Parcel);
    public abstract java.lang.Object[] newArray(int);


}

-keep class android.os.PatternMatcher {
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.lang.String getPath();
    public int getType();
    public boolean match(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int PATTERN_LITERAL;
    public static int PATTERN_PREFIX;
    public static int PATTERN_SIMPLE_GLOB;
}

-keep class android.os.PersistableBundle {
    <init>();
    <init>(int);
    <init>(android.os.PersistableBundle);

    public java.lang.Object clone();
    public int describeContents();
    public android.os.PersistableBundle getPersistableBundle(java.lang.String);
    public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.PersistableBundle EMPTY;
}

-keep class android.os.RemoteException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.os.ResultReceiver {
    <init>(android.os.Handler);

    public int describeContents();
    protected void onReceiveResult(int, android.os.Bundle);
    public void send(int, android.os.Bundle);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.UserHandle {
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public static android.os.UserHandle readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public static void writeToParcel(android.os.UserHandle, android.os.Parcel);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.Vibrator {

    public abstract void cancel();
    public abstract boolean hasVibrator();
    public void vibrate(long);
    public void vibrate(long, android.media.AudioAttributes);
    public void vibrate(long[], int);
    public void vibrate(long[], int, android.media.AudioAttributes);


}

-keep class android.support.car.Car {

    public void connect();
    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback, android.os.Handler);
    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback);
    public void disconnect();
    public java.lang.Object getCarManager(java.lang.String);
    public java.lang.Object getCarManager(java.lang.Class);
    public boolean isConnected();
    public boolean isConnecting();


    public static java.lang.String APP_FOCUS_SERVICE;
    public static java.lang.String AUDIO_SERVICE;
    public static java.lang.String INFO_SERVICE;
    public static java.lang.String NAVIGATION_STATUS_SERVICE;
    public static java.lang.String PERMISSION_CAR_NAVIGATION_MANAGER;
    public static java.lang.String PERMISSION_VENDOR_EXTENSION;
    public static java.lang.String SENSOR_SERVICE;
}

-keep class android.support.car.CarAppFocusManager {
    <init>();

    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback, int);
    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
    public abstract void addFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
    public abstract boolean isOwningFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener);
    public abstract int requestAppFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);


    public static int APP_FOCUS_REQUEST_FAILED;
    public static int APP_FOCUS_REQUEST_SUCCEEDED;
    public static int APP_FOCUS_TYPE_NAVIGATION;
}

-keep class android.support.car.CarAppFocusManager$OnAppFocusChangedListener {

    public abstract void onAppFocusChanged(android.support.car.CarAppFocusManager, int, boolean);


}

-keep class android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback {

    public abstract void onAppFocusOwnershipGranted(android.support.car.CarAppFocusManager, int);
    public abstract void onAppFocusOwnershipLost(android.support.car.CarAppFocusManager, int);


}

-keep class android.support.car.CarConnectionCallback {
    <init>();

    public abstract void onConnected(android.support.car.Car);
    public abstract void onDisconnected(android.support.car.Car);


}

-keep class android.support.car.CarInfoManager {
    <init>();

    public abstract int getDriverPosition();
    public abstract java.lang.String getHeadunitManufacturer();
    public abstract java.lang.String getHeadunitModel();
    public abstract java.lang.String getHeadunitSoftwareBuild();
    public abstract java.lang.String getHeadunitSoftwareVersion();
    public abstract java.lang.String getManufacturer();
    public abstract java.lang.String getModel();
    public abstract java.lang.String getModelYear();
    public abstract java.lang.String getVehicleId();


    public static int DRIVER_SIDE_CENTER;
    public static int DRIVER_SIDE_LEFT;
    public static int DRIVER_SIDE_RIGHT;
    public static int DRIVER_SIDE_UNKNOWN;
}

-keep class android.support.car.CarNotConnectedException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Exception);



}

-keep class android.support.car.annotation.ValueTypeDef {



}

-keep class android.support.car.annotation.VersionDef {



}

-keep class android.support.car.hardware.CarSensorEvent {

    public android.support.car.hardware.CarSensorEvent$CompassData getCompassData();
    public android.support.car.hardware.CarSensorEvent$DrivingStatusData getDrivingStatusData();
    public android.support.car.hardware.CarSensorEvent$NightData getNightData();
    public android.support.car.hardware.CarSensorEvent$ParkingBrakeData getParkingBrakeData();


    public static int DRIVE_STATUS_FULLY_RESTRICTED;
    public static int DRIVE_STATUS_LIMIT_MESSAGE_LEN;
    public static int DRIVE_STATUS_NO_CONFIG;
    public static int DRIVE_STATUS_NO_KEYBOARD_INPUT;
    public static int DRIVE_STATUS_NO_VIDEO;
    public static int DRIVE_STATUS_NO_VOICE_INPUT;
    public static int DRIVE_STATUS_UNRESTRICTED;
    public static int INDEX_COMPASS_BEARING;
    public static int INDEX_COMPASS_PITCH;
    public static int INDEX_COMPASS_ROLL;
    public static int INDEX_WHEEL_DISTANCE_FRONT_LEFT;
    public static int INDEX_WHEEL_DISTANCE_FRONT_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_REAR_LEFT;
    public static int INDEX_WHEEL_DISTANCE_REAR_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_RESET_COUNT;
    public float[] floatValues;
    public int[] intValues;
    public long[] longValues;
    public int sensorType;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$CompassData {



    public float bearing;
    public float pitch;
    public float roll;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$DrivingStatusData {

    public boolean isConfigurationRestricted();
    public boolean isFullyRestricted();
    public boolean isKeyboardRestricted();
    public boolean isMessageLengthRestricted();
    public boolean isVideoRestricted();
    public boolean isVoiceRestricted();


    public int status;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$NightData {



    public boolean isNightMode;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$ParkingBrakeData {



    public boolean isEngaged;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorManager {
    <init>();

    public abstract boolean addListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int, int);
    public abstract android.support.car.hardware.CarSensorEvent getLatestSensorEvent(int);
    public abstract int[] getSupportedSensors();
    public abstract boolean isSensorSupported(int);
    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener);
    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int);


    public static int SENSOR_RATE_FASTEST;
    public static int SENSOR_RATE_NORMAL;
    public static int SENSOR_TYPE_ABS_ACTIVE;
    public static int SENSOR_TYPE_COMPASS;
    public static int SENSOR_TYPE_DRIVING_STATUS;
    public static int SENSOR_TYPE_NIGHT;
    public static int SENSOR_TYPE_PARKING_BRAKE;
    public static int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE;
    public static int SENSOR_TYPE_WHEEL_TICK_DISTANCE;
}

-keep class android.support.car.hardware.CarSensorManager$OnSensorChangedListener {

    public abstract void onSensorChanged(android.support.car.hardware.CarSensorManager, android.support.car.hardware.CarSensorEvent);


}

-keep class android.support.car.media.CarAudioManager {
    <init>();

    public abstract void abandonAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, android.media.AudioAttributes);
    public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int);
    public abstract android.media.AudioAttributes getAudioAttributesForCarUsage(int);
    public abstract android.media.AudioFormat getAudioRecordAudioFormat();
    public abstract int getAudioRecordMaxBufferSize();
    public abstract int getAudioRecordMinBufferSize();
    public abstract boolean isAudioRecordSupported();
    public abstract boolean isMediaMuted();
    public abstract int requestAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, android.media.AudioAttributes, int);


    public static int CAR_AUDIO_USAGE_ALARM;
    public static int CAR_AUDIO_USAGE_DEFAULT;
    public static int CAR_AUDIO_USAGE_MUSIC;
    public static int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
    public static int CAR_AUDIO_USAGE_NOTIFICATION;
    public static int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
    public static int CAR_AUDIO_USAGE_SYSTEM_SOUND;
    public static int CAR_AUDIO_USAGE_VOICE_CALL;
    public static int CAR_AUDIO_USAGE_VOICE_COMMAND;
}

-keep class android.support.car.media.CarAudioRecord {
    <init>();

    public abstract int getAudioSessionId();
    public abstract int getBufferSize();
    public abstract int getRecordingState();
    public abstract int getState();
    public abstract int read(byte[], int, int);
    public abstract void release();
    public abstract void startRecording();
    public abstract void stop();


}

-keep class android.support.car.navigation.CarNavigationInstrumentCluster {

    public int getImageColorDepthBits();
    public int getImageHeight();
    public int getImageWidth();
    public int getMinIntervalMillis();
    public int getType();
    public boolean supportsCustomImages();
    public java.lang.String toString();


    public static int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED;
    public static int CLUSTER_TYPE_IMAGE_CODES_ONLY;
}

-keep class android.support.car.navigation.CarNavigationStatusManager {
    <init>();

    public abstract void addListener(android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback);
    public abstract void removeListener();
    public abstract void sendNavigationStatus(int);
    public abstract void sendNavigationTurnDistanceEvent(int, int, int, int);
    public abstract void sendNavigationTurnEvent(int, java.lang.CharSequence, int, int, int);


    public static int DISTANCE_FEET;
    public static int DISTANCE_KILOMETERS;
    public static int DISTANCE_METERS;
    public static int DISTANCE_MILES;
    public static int DISTANCE_YARDS;
    public static int STATUS_ACTIVE;
    public static int STATUS_INACTIVE;
    public static int STATUS_UNAVAILABLE;
    public static int TURN_DEPART;
    public static int TURN_DESTINATION;
    public static int TURN_FERRY_BOAT;
    public static int TURN_FERRY_TRAIN;
    public static int TURN_FORK;
    public static int TURN_MERGE;
    public static int TURN_NAME_CHANGE;
    public static int TURN_OFF_RAMP;
    public static int TURN_ON_RAMP;
    public static int TURN_ROUNDABOUT_ENTER;
    public static int TURN_ROUNDABOUT_ENTER_AND_EXIT;
    public static int TURN_ROUNDABOUT_EXIT;
    public static int TURN_SHARP_TURN;
    public static int TURN_SIDE_LEFT;
    public static int TURN_SIDE_RIGHT;
    public static int TURN_SIDE_UNSPECIFIED;
    public static int TURN_SLIGHT_TURN;
    public static int TURN_STRAIGHT;
    public static int TURN_TURN;
    public static int TURN_UNKNOWN;
    public static int TURN_U_TURN;
}

-keep class android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback {

    public abstract void onInstrumentClusterStarted(android.support.car.navigation.CarNavigationStatusManager, android.support.car.navigation.CarNavigationInstrumentCluster);
    public abstract void onInstrumentClusterStopped(android.support.car.navigation.CarNavigationStatusManager);


}

-keep class android.util.AndroidException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Exception);



}

-keep class android.util.AttributeSet {

    public abstract boolean getAttributeBooleanValue(java.lang.String, java.lang.String, boolean);
    public abstract boolean getAttributeBooleanValue(int, boolean);
    public abstract int getAttributeCount();
    public abstract float getAttributeFloatValue(java.lang.String, java.lang.String, float);
    public abstract float getAttributeFloatValue(int, float);
    public abstract int getAttributeIntValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeIntValue(int, int);
    public abstract int getAttributeListValue(java.lang.String, java.lang.String, java.lang.String[], int);
    public abstract int getAttributeListValue(int, java.lang.String[], int);
    public abstract java.lang.String getAttributeName(int);
    public abstract int getAttributeNameResource(int);
    public abstract int getAttributeResourceValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeResourceValue(int, int);
    public abstract int getAttributeUnsignedIntValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeUnsignedIntValue(int, int);
    public abstract java.lang.String getAttributeValue(int);
    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
    public abstract java.lang.String getClassAttribute();
    public abstract java.lang.String getIdAttribute();
    public abstract int getIdAttributeResourceValue(int);
    public abstract java.lang.String getPositionDescription();
    public abstract int getStyleAttribute();


}

-keep class android.util.DisplayMetrics {
    <init>();

    public boolean equals(java.lang.Object);
    public boolean equals(android.util.DisplayMetrics);
    public int hashCode();
    public void setTo(android.util.DisplayMetrics);
    public void setToDefaults();
    public java.lang.String toString();


    public static int DENSITY_280;
    public static int DENSITY_360;
    public static int DENSITY_400;
    public static int DENSITY_420;
    public static int DENSITY_560;
    public static int DENSITY_DEFAULT;
    public static int DENSITY_HIGH;
    public static int DENSITY_LOW;
    public static int DENSITY_MEDIUM;
    public static int DENSITY_TV;
    public static int DENSITY_XHIGH;
    public static int DENSITY_XXHIGH;
    public static int DENSITY_XXXHIGH;
    public float density;
    public int densityDpi;
    public int heightPixels;
    public float scaledDensity;
    public int widthPixels;
    public float xdpi;
    public float ydpi;
}

-keep class android.util.Pair {
    <init>(java.lang.Object, java.lang.Object);

    public static android.util.Pair create(java.lang.Object, java.lang.Object);
    public boolean equals(java.lang.Object);
    public int hashCode();


    public java.lang.Object first;
    public java.lang.Object second;
}

-keep class android.util.Printer {

    public abstract void println(java.lang.String);


}

-keep class android.util.Size {
    <init>(int, int);

    public boolean equals(java.lang.Object);
    public int getHeight();
    public int getWidth();
    public int hashCode();
    public static android.util.Size parseSize(java.lang.String);
    public java.lang.String toString();


}

-keep class android.util.SizeF {
    <init>(float, float);

    public boolean equals(java.lang.Object);
    public float getHeight();
    public float getWidth();
    public int hashCode();
    public static android.util.SizeF parseSizeF(java.lang.String);
    public java.lang.String toString();


}

-keep class android.util.SparseArray {
    <init>();
    <init>(int);

    public void append(int, java.lang.Object);
    public void clear();
    public android.util.SparseArray clone();
    public java.lang.Object clone();
    public void delete(int);
    public java.lang.Object get(int);
    public java.lang.Object get(int, java.lang.Object);
    public int indexOfKey(int);
    public int indexOfValue(java.lang.Object);
    public int keyAt(int);
    public void put(int, java.lang.Object);
    public void remove(int);
    public void removeAt(int);
    public void removeAtRange(int, int);
    public void setValueAt(int, java.lang.Object);
    public int size();
    public java.lang.String toString();
    public java.lang.Object valueAt(int);


}

-keep class android.util.SparseBooleanArray {
    <init>();
    <init>(int);

    public void append(int, boolean);
    public void clear();
    public android.util.SparseBooleanArray clone();
    public java.lang.Object clone();
    public void delete(int);
    public boolean get(int);
    public boolean get(int, boolean);
    public int indexOfKey(int);
    public int indexOfValue(boolean);
    public int keyAt(int);
    public void put(int, boolean);
    public int size();
    public java.lang.String toString();
    public boolean valueAt(int);


}

-keep class android.util.TypedValue {
    <init>();

    public static float applyDimension(int, float, android.util.DisplayMetrics);
    public java.lang.CharSequence coerceToString();
    public static java.lang.String coerceToString(int, int);
    public static float complexToDimension(int, android.util.DisplayMetrics);
    public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
    public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
    public static float complexToFloat(int);
    public static float complexToFraction(int, float, float);
    public int getComplexUnit();
    public float getDimension(android.util.DisplayMetrics);
    public float getFloat();
    public float getFraction(float, float);
    public void setTo(android.util.TypedValue);
    public java.lang.String toString();


    public static int COMPLEX_MANTISSA_MASK;
    public static int COMPLEX_MANTISSA_SHIFT;
    public static int COMPLEX_RADIX_0p23;
    public static int COMPLEX_RADIX_16p7;
    public static int COMPLEX_RADIX_23p0;
    public static int COMPLEX_RADIX_8p15;
    public static int COMPLEX_RADIX_MASK;
    public static int COMPLEX_RADIX_SHIFT;
    public static int COMPLEX_UNIT_DIP;
    public static int COMPLEX_UNIT_FRACTION;
    public static int COMPLEX_UNIT_FRACTION_PARENT;
    public static int COMPLEX_UNIT_IN;
    public static int COMPLEX_UNIT_MASK;
    public static int COMPLEX_UNIT_MM;
    public static int COMPLEX_UNIT_PT;
    public static int COMPLEX_UNIT_PX;
    public static int COMPLEX_UNIT_SHIFT;
    public static int COMPLEX_UNIT_SP;
    public static int DATA_NULL_EMPTY;
    public static int DATA_NULL_UNDEFINED;
    public static int DENSITY_DEFAULT;
    public static int DENSITY_NONE;
    public static int TYPE_ATTRIBUTE;
    public static int TYPE_DIMENSION;
    public static int TYPE_FIRST_COLOR_INT;
    public static int TYPE_FIRST_INT;
    public static int TYPE_FLOAT;
    public static int TYPE_FRACTION;
    public static int TYPE_INT_BOOLEAN;
    public static int TYPE_INT_COLOR_ARGB4;
    public static int TYPE_INT_COLOR_ARGB8;
    public static int TYPE_INT_COLOR_RGB4;
    public static int TYPE_INT_COLOR_RGB8;
    public static int TYPE_INT_DEC;
    public static int TYPE_INT_HEX;
    public static int TYPE_LAST_COLOR_INT;
    public static int TYPE_LAST_INT;
    public static int TYPE_NULL;
    public static int TYPE_REFERENCE;
    public static int TYPE_STRING;
    public int assetCookie;
    public int changingConfigurations;
    public int data;
    public int density;
    public int resourceId;
    public java.lang.CharSequence string;
    public int type;
}

-keep class android.view.Display {

    public long getAppVsyncOffsetNanos();
    public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
    public int getDisplayId();
    public int getFlags();
    public int getHeight();
    public void getMetrics(android.util.DisplayMetrics);
    public android.view.Display$Mode getMode();
    public java.lang.String getName();
    public int getOrientation();
    public int getPixelFormat();
    public long getPresentationDeadlineNanos();
    public void getRealMetrics(android.util.DisplayMetrics);
    public void getRealSize(android.graphics.Point);
    public void getRectSize(android.graphics.Rect);
    public float getRefreshRate();
    public int getRotation();
    public void getSize(android.graphics.Point);
    public int getState();
    public android.view.Display$Mode[] getSupportedModes();
    public float[] getSupportedRefreshRates();
    public int getWidth();
    public boolean isValid();
    public java.lang.String toString();


    public static int DEFAULT_DISPLAY;
    public static int FLAG_PRESENTATION;
    public static int FLAG_PRIVATE;
    public static int FLAG_ROUND;
    public static int FLAG_SECURE;
    public static int FLAG_SUPPORTS_PROTECTED_BUFFERS;
    public static int INVALID_DISPLAY;
    public static int STATE_DOZE;
    public static int STATE_DOZE_SUSPEND;
    public static int STATE_OFF;
    public static int STATE_ON;
    public static int STATE_UNKNOWN;
}

-keep class android.view.Display$Mode {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getModeId();
    public int getPhysicalHeight();
    public int getPhysicalWidth();
    public float getRefreshRate();
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.InputDevice {

    public int describeContents();
    public int getControllerNumber();
    public java.lang.String getDescriptor();
    public static android.view.InputDevice getDevice(int);
    public static int[] getDeviceIds();
    public int getId();
    public android.view.KeyCharacterMap getKeyCharacterMap();
    public int getKeyboardType();
    public android.view.InputDevice$MotionRange getMotionRange(int);
    public android.view.InputDevice$MotionRange getMotionRange(int, int);
    public java.util.List getMotionRanges();
    public java.lang.String getName();
    public int getProductId();
    public int getSources();
    public int getVendorId();
    public android.os.Vibrator getVibrator();
    public boolean[] hasKeys(int[]);
    public boolean hasMicrophone();
    public boolean isVirtual();
    public boolean supportsSource(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int KEYBOARD_TYPE_ALPHABETIC;
    public static int KEYBOARD_TYPE_NONE;
    public static int KEYBOARD_TYPE_NON_ALPHABETIC;
    public static int MOTION_RANGE_ORIENTATION;
    public static int MOTION_RANGE_PRESSURE;
    public static int MOTION_RANGE_SIZE;
    public static int MOTION_RANGE_TOOL_MAJOR;
    public static int MOTION_RANGE_TOOL_MINOR;
    public static int MOTION_RANGE_TOUCH_MAJOR;
    public static int MOTION_RANGE_TOUCH_MINOR;
    public static int MOTION_RANGE_X;
    public static int MOTION_RANGE_Y;
    public static int SOURCE_ANY;
    public static int SOURCE_BLUETOOTH_STYLUS;
    public static int SOURCE_CLASS_BUTTON;
    public static int SOURCE_CLASS_JOYSTICK;
    public static int SOURCE_CLASS_MASK;
    public static int SOURCE_CLASS_NONE;
    public static int SOURCE_CLASS_POINTER;
    public static int SOURCE_CLASS_POSITION;
    public static int SOURCE_CLASS_TRACKBALL;
    public static int SOURCE_DPAD;
    public static int SOURCE_GAMEPAD;
    public static int SOURCE_HDMI;
    public static int SOURCE_JOYSTICK;
    public static int SOURCE_KEYBOARD;
    public static int SOURCE_MOUSE;
    public static int SOURCE_STYLUS;
    public static int SOURCE_TOUCHPAD;
    public static int SOURCE_TOUCHSCREEN;
    public static int SOURCE_TOUCH_NAVIGATION;
    public static int SOURCE_TRACKBALL;
    public static int SOURCE_UNKNOWN;
}

-keep class android.view.InputDevice$MotionRange {

    public int getAxis();
    public float getFlat();
    public float getFuzz();
    public float getMax();
    public float getMin();
    public float getRange();
    public float getResolution();
    public int getSource();
    public boolean isFromSource(int);


}

-keep class android.view.InputEvent {

    public int describeContents();
    public android.view.InputDevice getDevice();
    public abstract int getDeviceId();
    public abstract long getEventTime();
    public abstract int getSource();
    public boolean isFromSource(int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.KeyCharacterMap {

    public int describeContents();
    public static boolean deviceHasKey(int);
    public static boolean[] deviceHasKeys(int[]);
    protected void finalize();
    public int get(int, int);
    public static int getDeadChar(int, int);
    public char getDisplayLabel(int);
    public android.view.KeyEvent[] getEvents(char[]);
    public boolean getKeyData(int, android.view.KeyCharacterMap$KeyData);
    public int getKeyboardType();
    public char getMatch(int, char[]);
    public char getMatch(int, char[], int);
    public int getModifierBehavior();
    public char getNumber(int);
    public boolean isPrintingKey(int);
    public static android.view.KeyCharacterMap load(int);
    public void writeToParcel(android.os.Parcel, int);


    public static int ALPHA;
    public static int BUILT_IN_KEYBOARD;
    public static int COMBINING_ACCENT;
    public static int COMBINING_ACCENT_MASK;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FULL;
    public static char HEX_INPUT;
    public static int MODIFIER_BEHAVIOR_CHORDED;
    public static int MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED;
    public static int NUMERIC;
    public static char PICKER_DIALOG_INPUT;
    public static int PREDICTIVE;
    public static int SPECIAL_FUNCTION;
    public static int VIRTUAL_KEYBOARD;
}

-keep class android.view.KeyCharacterMap$KeyData {
    <init>();



    public static int META_LENGTH;
    public char displayLabel;
    public char[] meta;
    public char number;
}

-keep class android.view.KeyEvent {
    <init>(int, int);
    <init>(long, long, int, int, int);
    <init>(long, long, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int, int, int);
    <init>(long, java.lang.String, int, int);
    <init>(android.view.KeyEvent);
    <init>(android.view.KeyEvent, long, int);

    public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
    public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int, int);
    public boolean dispatch(android.view.KeyEvent$Callback);
    public boolean dispatch(android.view.KeyEvent$Callback, android.view.KeyEvent$DispatcherState, java.lang.Object);
    public int getAction();
    public java.lang.String getCharacters();
    public static int getDeadChar(int, int);
    public int getDeviceId();
    public char getDisplayLabel();
    public long getDownTime();
    public long getEventTime();
    public int getFlags();
    public android.view.KeyCharacterMap getKeyCharacterMap();
    public int getKeyCode();
    public boolean getKeyData(android.view.KeyCharacterMap$KeyData);
    public char getMatch(char[]);
    public char getMatch(char[], int);
    public static int getMaxKeyCode();
    public int getMetaState();
    public static int getModifierMetaStateMask();
    public int getModifiers();
    public char getNumber();
    public int getRepeatCount();
    public int getScanCode();
    public int getSource();
    public int getUnicodeChar();
    public int getUnicodeChar(int);
    public boolean hasModifiers(int);
    public boolean hasNoModifiers();
    public boolean isAltPressed();
    public boolean isCanceled();
    public boolean isCapsLockOn();
    public boolean isCtrlPressed();
    public boolean isFunctionPressed();
    public static boolean isGamepadButton(int);
    public boolean isLongPress();
    public boolean isMetaPressed();
    public static boolean isModifierKey(int);
    public boolean isNumLockOn();
    public boolean isPrintingKey();
    public boolean isScrollLockOn();
    public boolean isShiftPressed();
    public boolean isSymPressed();
    public boolean isSystem();
    public boolean isTracking();
    public static int keyCodeFromString(java.lang.String);
    public static java.lang.String keyCodeToString(int);
    public static boolean metaStateHasModifiers(int, int);
    public static boolean metaStateHasNoModifiers(int);
    public static int normalizeMetaState(int);
    public void setSource(int);
    public void startTracking();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_DOWN;
    public static int ACTION_MULTIPLE;
    public static int ACTION_UP;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANCELED;
    public static int FLAG_CANCELED_LONG_PRESS;
    public static int FLAG_EDITOR_ACTION;
    public static int FLAG_FALLBACK;
    public static int FLAG_FROM_SYSTEM;
    public static int FLAG_KEEP_TOUCH_MODE;
    public static int FLAG_LONG_PRESS;
    public static int FLAG_SOFT_KEYBOARD;
    public static int FLAG_TRACKING;
    public static int FLAG_VIRTUAL_HARD_KEY;
    public static int FLAG_WOKE_HERE;
    public static int KEYCODE_0;
    public static int KEYCODE_1;
    public static int KEYCODE_11;
    public static int KEYCODE_12;
    public static int KEYCODE_2;
    public static int KEYCODE_3;
    public static int KEYCODE_3D_MODE;
    public static int KEYCODE_4;
    public static int KEYCODE_5;
    public static int KEYCODE_6;
    public static int KEYCODE_7;
    public static int KEYCODE_8;
    public static int KEYCODE_9;
    public static int KEYCODE_A;
    public static int KEYCODE_ALT_LEFT;
    public static int KEYCODE_ALT_RIGHT;
    public static int KEYCODE_APOSTROPHE;
    public static int KEYCODE_APP_SWITCH;
    public static int KEYCODE_ASSIST;
    public static int KEYCODE_AT;
    public static int KEYCODE_AVR_INPUT;
    public static int KEYCODE_AVR_POWER;
    public static int KEYCODE_B;
    public static int KEYCODE_BACK;
    public static int KEYCODE_BACKSLASH;
    public static int KEYCODE_BOOKMARK;
    public static int KEYCODE_BREAK;
    public static int KEYCODE_BRIGHTNESS_DOWN;
    public static int KEYCODE_BRIGHTNESS_UP;
    public static int KEYCODE_BUTTON_1;
    public static int KEYCODE_BUTTON_10;
    public static int KEYCODE_BUTTON_11;
    public static int KEYCODE_BUTTON_12;
    public static int KEYCODE_BUTTON_13;
    public static int KEYCODE_BUTTON_14;
    public static int KEYCODE_BUTTON_15;
    public static int KEYCODE_BUTTON_16;
    public static int KEYCODE_BUTTON_2;
    public static int KEYCODE_BUTTON_3;
    public static int KEYCODE_BUTTON_4;
    public static int KEYCODE_BUTTON_5;
    public static int KEYCODE_BUTTON_6;
    public static int KEYCODE_BUTTON_7;
    public static int KEYCODE_BUTTON_8;
    public static int KEYCODE_BUTTON_9;
    public static int KEYCODE_BUTTON_A;
    public static int KEYCODE_BUTTON_B;
    public static int KEYCODE_BUTTON_C;
    public static int KEYCODE_BUTTON_L1;
    public static int KEYCODE_BUTTON_L2;
    public static int KEYCODE_BUTTON_MODE;
    public static int KEYCODE_BUTTON_R1;
    public static int KEYCODE_BUTTON_R2;
    public static int KEYCODE_BUTTON_SELECT;
    public static int KEYCODE_BUTTON_START;
    public static int KEYCODE_BUTTON_THUMBL;
    public static int KEYCODE_BUTTON_THUMBR;
    public static int KEYCODE_BUTTON_X;
    public static int KEYCODE_BUTTON_Y;
    public static int KEYCODE_BUTTON_Z;
    public static int KEYCODE_C;
    public static int KEYCODE_CALCULATOR;
    public static int KEYCODE_CALENDAR;
    public static int KEYCODE_CALL;
    public static int KEYCODE_CAMERA;
    public static int KEYCODE_CAPS_LOCK;
    public static int KEYCODE_CAPTIONS;
    public static int KEYCODE_CHANNEL_DOWN;
    public static int KEYCODE_CHANNEL_UP;
    public static int KEYCODE_CLEAR;
    public static int KEYCODE_COMMA;
    public static int KEYCODE_CONTACTS;
    public static int KEYCODE_CTRL_LEFT;
    public static int KEYCODE_CTRL_RIGHT;
    public static int KEYCODE_D;
    public static int KEYCODE_DEL;
    public static int KEYCODE_DPAD_CENTER;
    public static int KEYCODE_DPAD_DOWN;
    public static int KEYCODE_DPAD_LEFT;
    public static int KEYCODE_DPAD_RIGHT;
    public static int KEYCODE_DPAD_UP;
    public static int KEYCODE_DVR;
    public static int KEYCODE_E;
    public static int KEYCODE_EISU;
    public static int KEYCODE_ENDCALL;
    public static int KEYCODE_ENTER;
    public static int KEYCODE_ENVELOPE;
    public static int KEYCODE_EQUALS;
    public static int KEYCODE_ESCAPE;
    public static int KEYCODE_EXPLORER;
    public static int KEYCODE_F;
    public static int KEYCODE_F1;
    public static int KEYCODE_F10;
    public static int KEYCODE_F11;
    public static int KEYCODE_F12;
    public static int KEYCODE_F2;
    public static int KEYCODE_F3;
    public static int KEYCODE_F4;
    public static int KEYCODE_F5;
    public static int KEYCODE_F6;
    public static int KEYCODE_F7;
    public static int KEYCODE_F8;
    public static int KEYCODE_F9;
    public static int KEYCODE_FOCUS;
    public static int KEYCODE_FORWARD;
    public static int KEYCODE_FORWARD_DEL;
    public static int KEYCODE_FUNCTION;
    public static int KEYCODE_G;
    public static int KEYCODE_GRAVE;
    public static int KEYCODE_GUIDE;
    public static int KEYCODE_H;
    public static int KEYCODE_HEADSETHOOK;
    public static int KEYCODE_HELP;
    public static int KEYCODE_HENKAN;
    public static int KEYCODE_HOME;
    public static int KEYCODE_I;
    public static int KEYCODE_INFO;
    public static int KEYCODE_INSERT;
    public static int KEYCODE_J;
    public static int KEYCODE_K;
    public static int KEYCODE_KANA;
    public static int KEYCODE_KATAKANA_HIRAGANA;
    public static int KEYCODE_L;
    public static int KEYCODE_LANGUAGE_SWITCH;
    public static int KEYCODE_LAST_CHANNEL;
    public static int KEYCODE_LEFT_BRACKET;
    public static int KEYCODE_M;
    public static int KEYCODE_MANNER_MODE;
    public static int KEYCODE_MEDIA_AUDIO_TRACK;
    public static int KEYCODE_MEDIA_CLOSE;
    public static int KEYCODE_MEDIA_EJECT;
    public static int KEYCODE_MEDIA_FAST_FORWARD;
    public static int KEYCODE_MEDIA_NEXT;
    public static int KEYCODE_MEDIA_PAUSE;
    public static int KEYCODE_MEDIA_PLAY;
    public static int KEYCODE_MEDIA_PLAY_PAUSE;
    public static int KEYCODE_MEDIA_PREVIOUS;
    public static int KEYCODE_MEDIA_RECORD;
    public static int KEYCODE_MEDIA_REWIND;
    public static int KEYCODE_MEDIA_SKIP_BACKWARD;
    public static int KEYCODE_MEDIA_SKIP_FORWARD;
    public static int KEYCODE_MEDIA_STEP_BACKWARD;
    public static int KEYCODE_MEDIA_STEP_FORWARD;
    public static int KEYCODE_MEDIA_STOP;
    public static int KEYCODE_MEDIA_TOP_MENU;
    public static int KEYCODE_MENU;
    public static int KEYCODE_META_LEFT;
    public static int KEYCODE_META_RIGHT;
    public static int KEYCODE_MINUS;
    public static int KEYCODE_MOVE_END;
    public static int KEYCODE_MOVE_HOME;
    public static int KEYCODE_MUHENKAN;
    public static int KEYCODE_MUSIC;
    public static int KEYCODE_MUTE;
    public static int KEYCODE_N;
    public static int KEYCODE_NAVIGATE_IN;
    public static int KEYCODE_NAVIGATE_NEXT;
    public static int KEYCODE_NAVIGATE_OUT;
    public static int KEYCODE_NAVIGATE_PREVIOUS;
    public static int KEYCODE_NOTIFICATION;
    public static int KEYCODE_NUM;
    public static int KEYCODE_NUMPAD_0;
    public static int KEYCODE_NUMPAD_1;
    public static int KEYCODE_NUMPAD_2;
    public static int KEYCODE_NUMPAD_3;
    public static int KEYCODE_NUMPAD_4;
    public static int KEYCODE_NUMPAD_5;
    public static int KEYCODE_NUMPAD_6;
    public static int KEYCODE_NUMPAD_7;
    public static int KEYCODE_NUMPAD_8;
    public static int KEYCODE_NUMPAD_9;
    public static int KEYCODE_NUMPAD_ADD;
    public static int KEYCODE_NUMPAD_COMMA;
    public static int KEYCODE_NUMPAD_DIVIDE;
    public static int KEYCODE_NUMPAD_DOT;
    public static int KEYCODE_NUMPAD_ENTER;
    public static int KEYCODE_NUMPAD_EQUALS;
    public static int KEYCODE_NUMPAD_LEFT_PAREN;
    public static int KEYCODE_NUMPAD_MULTIPLY;
    public static int KEYCODE_NUMPAD_RIGHT_PAREN;
    public static int KEYCODE_NUMPAD_SUBTRACT;
    public static int KEYCODE_NUM_LOCK;
    public static int KEYCODE_O;
    public static int KEYCODE_P;
    public static int KEYCODE_PAGE_DOWN;
    public static int KEYCODE_PAGE_UP;
    public static int KEYCODE_PAIRING;
    public static int KEYCODE_PERIOD;
    public static int KEYCODE_PICTSYMBOLS;
    public static int KEYCODE_PLUS;
    public static int KEYCODE_POUND;
    public static int KEYCODE_POWER;
    public static int KEYCODE_PROG_BLUE;
    public static int KEYCODE_PROG_GREEN;
    public static int KEYCODE_PROG_RED;
    public static int KEYCODE_PROG_YELLOW;
    public static int KEYCODE_Q;
    public static int KEYCODE_R;
    public static int KEYCODE_RIGHT_BRACKET;
    public static int KEYCODE_RO;
    public static int KEYCODE_S;
    public static int KEYCODE_SCROLL_LOCK;
    public static int KEYCODE_SEARCH;
    public static int KEYCODE_SEMICOLON;
    public static int KEYCODE_SETTINGS;
    public static int KEYCODE_SHIFT_LEFT;
    public static int KEYCODE_SHIFT_RIGHT;
    public static int KEYCODE_SLASH;
    public static int KEYCODE_SLEEP;
    public static int KEYCODE_SOFT_LEFT;
    public static int KEYCODE_SOFT_RIGHT;
    public static int KEYCODE_SPACE;
    public static int KEYCODE_STAR;
    public static int KEYCODE_STB_INPUT;
    public static int KEYCODE_STB_POWER;
    public static int KEYCODE_SWITCH_CHARSET;
    public static int KEYCODE_SYM;
    public static int KEYCODE_SYSRQ;
    public static int KEYCODE_T;
    public static int KEYCODE_TAB;
    public static int KEYCODE_TV;
    public static int KEYCODE_TV_ANTENNA_CABLE;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP;
    public static int KEYCODE_TV_CONTENTS_MENU;
    public static int KEYCODE_TV_DATA_SERVICE;
    public static int KEYCODE_TV_INPUT;
    public static int KEYCODE_TV_INPUT_COMPONENT_1;
    public static int KEYCODE_TV_INPUT_COMPONENT_2;
    public static int KEYCODE_TV_INPUT_COMPOSITE_1;
    public static int KEYCODE_TV_INPUT_COMPOSITE_2;
    public static int KEYCODE_TV_INPUT_HDMI_1;
    public static int KEYCODE_TV_INPUT_HDMI_2;
    public static int KEYCODE_TV_INPUT_HDMI_3;
    public static int KEYCODE_TV_INPUT_HDMI_4;
    public static int KEYCODE_TV_INPUT_VGA_1;
    public static int KEYCODE_TV_MEDIA_CONTEXT_MENU;
    public static int KEYCODE_TV_NETWORK;
    public static int KEYCODE_TV_NUMBER_ENTRY;
    public static int KEYCODE_TV_POWER;
    public static int KEYCODE_TV_RADIO_SERVICE;
    public static int KEYCODE_TV_SATELLITE;
    public static int KEYCODE_TV_SATELLITE_BS;
    public static int KEYCODE_TV_SATELLITE_CS;
    public static int KEYCODE_TV_SATELLITE_SERVICE;
    public static int KEYCODE_TV_TELETEXT;
    public static int KEYCODE_TV_TERRESTRIAL_ANALOG;
    public static int KEYCODE_TV_TERRESTRIAL_DIGITAL;
    public static int KEYCODE_TV_TIMER_PROGRAMMING;
    public static int KEYCODE_TV_ZOOM_MODE;
    public static int KEYCODE_U;
    public static int KEYCODE_UNKNOWN;
    public static int KEYCODE_V;
    public static int KEYCODE_VOICE_ASSIST;
    public static int KEYCODE_VOLUME_DOWN;
    public static int KEYCODE_VOLUME_MUTE;
    public static int KEYCODE_VOLUME_UP;
    public static int KEYCODE_W;
    public static int KEYCODE_WAKEUP;
    public static int KEYCODE_WINDOW;
    public static int KEYCODE_X;
    public static int KEYCODE_Y;
    public static int KEYCODE_YEN;
    public static int KEYCODE_Z;
    public static int KEYCODE_ZENKAKU_HANKAKU;
    public static int KEYCODE_ZOOM_IN;
    public static int KEYCODE_ZOOM_OUT;
    public static int MAX_KEYCODE;
    public static int META_ALT_LEFT_ON;
    public static int META_ALT_MASK;
    public static int META_ALT_ON;
    public static int META_ALT_RIGHT_ON;
    public static int META_CAPS_LOCK_ON;
    public static int META_CTRL_LEFT_ON;
    public static int META_CTRL_MASK;
    public static int META_CTRL_ON;
    public static int META_CTRL_RIGHT_ON;
    public static int META_FUNCTION_ON;
    public static int META_META_LEFT_ON;
    public static int META_META_MASK;
    public static int META_META_ON;
    public static int META_META_RIGHT_ON;
    public static int META_NUM_LOCK_ON;
    public static int META_SCROLL_LOCK_ON;
    public static int META_SHIFT_LEFT_ON;
    public static int META_SHIFT_MASK;
    public static int META_SHIFT_ON;
    public static int META_SHIFT_RIGHT_ON;
    public static int META_SYM_ON;
}

-keep class android.view.KeyEvent$Callback {

    public abstract boolean onKeyDown(int, android.view.KeyEvent);
    public abstract boolean onKeyLongPress(int, android.view.KeyEvent);
    public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public abstract boolean onKeyUp(int, android.view.KeyEvent);


}

-keep class android.view.KeyEvent$DispatcherState {
    <init>();

    public void handleUpEvent(android.view.KeyEvent);
    public boolean isTracking(android.view.KeyEvent);
    public void performedLongPress(android.view.KeyEvent);
    public void reset();
    public void reset(java.lang.Object);
    public void startTracking(android.view.KeyEvent, java.lang.Object);


}

-keep class java.io.File {
    <init>(java.io.File, java.lang.String);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.net.URI);

    public boolean canExecute();
    public boolean canRead();
    public boolean canWrite();
    public int compareTo(java.io.File);
    public int compareTo(java.lang.Object);
    public boolean createNewFile();
    public static java.io.File createTempFile(java.lang.String, java.lang.String);
    public static java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File);
    public boolean delete();
    public void deleteOnExit();
    public boolean equals(java.lang.Object);
    public boolean exists();
    public java.io.File getAbsoluteFile();
    public java.lang.String getAbsolutePath();
    public java.io.File getCanonicalFile();
    public java.lang.String getCanonicalPath();
    public long getFreeSpace();
    public java.lang.String getName();
    public java.lang.String getParent();
    public java.io.File getParentFile();
    public java.lang.String getPath();
    public long getTotalSpace();
    public long getUsableSpace();
    public int hashCode();
    public boolean isAbsolute();
    public boolean isDirectory();
    public boolean isFile();
    public boolean isHidden();
    public long lastModified();
    public long length();
    public java.lang.String[] list();
    public java.lang.String[] list(java.io.FilenameFilter);
    public java.io.File[] listFiles();
    public java.io.File[] listFiles(java.io.FilenameFilter);
    public java.io.File[] listFiles(java.io.FileFilter);
    public static java.io.File[] listRoots();
    public boolean mkdir();
    public boolean mkdirs();
    public boolean renameTo(java.io.File);
    public boolean setExecutable(boolean, boolean);
    public boolean setExecutable(boolean);
    public boolean setLastModified(long);
    public boolean setReadOnly();
    public boolean setReadable(boolean, boolean);
    public boolean setReadable(boolean);
    public boolean setWritable(boolean, boolean);
    public boolean setWritable(boolean);
    public java.lang.String toString();
    public java.net.URI toURI();
    public java.net.URL toURL();


    public static java.lang.String pathSeparator;
    public static char pathSeparatorChar;
    public static java.lang.String separator;
    public static char separatorChar;
}

-keep class java.io.FileDescriptor {
    <init>();

    public void sync();
    public java.lang.String toString();
    public boolean valid();


    public static java.io.FileDescriptor err;
    public static java.io.FileDescriptor in;
    public static java.io.FileDescriptor out;
}

-keep class java.io.FileFilter {

    public abstract boolean accept(java.io.File);


}

-keep class java.io.FileInputStream {
    <init>(java.io.File);
    <init>(java.io.FileDescriptor);
    <init>(java.lang.String);

    public int available();
    public void close();
    protected void finalize();
    public java.nio.channels.FileChannel getChannel();
    public java.io.FileDescriptor getFD();
    public int read();
    public int read(byte[], int, int);
    public long skip(long);


}

-keep class java.io.FileNotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.io.FileOutputStream {
    <init>(java.io.File);
    <init>(java.io.File, boolean);
    <init>(java.io.FileDescriptor);
    <init>(java.lang.String);
    <init>(java.lang.String, boolean);

    public void close();
    protected void finalize();
    public java.nio.channels.FileChannel getChannel();
    public java.io.FileDescriptor getFD();
    public void write(byte[], int, int);
    public void write(int);


}

-keep class java.io.FilenameFilter {

    public abstract boolean accept(java.io.File, java.lang.String);


}

-keep class java.io.FilterOutputStream {
    <init>(java.io.OutputStream);

    public void close();
    public void flush();
    public void write(byte[], int, int);
    public void write(int);


    protected java.io.OutputStream out;
}

-keep class java.io.IOException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.io.InputStream {
    <init>();

    public int available();
    public void close();
    public void mark(int);
    public boolean markSupported();
    public abstract int read();
    public int read(byte[]);
    public int read(byte[], int, int);
    public synchronized void reset();
    public long skip(long);


}

-keep class java.io.ObjectStreamException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.io.OutputStream {
    <init>();

    public void close();
    public void flush();
    public void write(byte[]);
    public void write(byte[], int, int);
    public abstract void write(int);


}

-keep class java.io.PrintStream {
    <init>(java.io.OutputStream);
    <init>(java.io.OutputStream, boolean);
    <init>(java.io.OutputStream, boolean, java.lang.String);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);

    public java.io.PrintStream append(char);
    public java.io.PrintStream append(java.lang.CharSequence);
    public java.io.PrintStream append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public boolean checkError();
    protected void clearError();
    public synchronized void close();
    public synchronized void flush();
    public java.io.PrintStream format(java.lang.String, java.lang.Object[]);
    public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void print(char[]);
    public void print(char);
    public void print(double);
    public void print(float);
    public void print(int);
    public void print(long);
    public void print(java.lang.Object);
    public synchronized void print(java.lang.String);
    public void print(boolean);
    public java.io.PrintStream printf(java.lang.String, java.lang.Object[]);
    public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void println();
    public void println(char[]);
    public void println(char);
    public void println(double);
    public void println(float);
    public void println(int);
    public void println(long);
    public void println(java.lang.Object);
    public synchronized void println(java.lang.String);
    public void println(boolean);
    protected void setError();
    public void write(byte[], int, int);
    public synchronized void write(int);


}

-keep class java.io.PrintWriter {
    <init>(java.io.OutputStream);
    <init>(java.io.OutputStream, boolean);
    <init>(java.io.Writer);
    <init>(java.io.Writer, boolean);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);

    public java.io.PrintWriter append(char);
    public java.io.PrintWriter append(java.lang.CharSequence);
    public java.io.PrintWriter append(java.lang.CharSequence, int, int);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.io.Writer append(java.lang.CharSequence);
    public java.io.Writer append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public boolean checkError();
    protected void clearError();
    public void close();
    public void flush();
    public java.io.PrintWriter format(java.lang.String, java.lang.Object[]);
    public java.io.PrintWriter format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void print(char[]);
    public void print(char);
    public void print(double);
    public void print(float);
    public void print(int);
    public void print(long);
    public void print(java.lang.Object);
    public void print(java.lang.String);
    public void print(boolean);
    public java.io.PrintWriter printf(java.lang.String, java.lang.Object[]);
    public java.io.PrintWriter printf(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void println();
    public void println(char[]);
    public void println(char);
    public void println(double);
    public void println(float);
    public void println(int);
    public void println(long);
    public void println(java.lang.Object);
    public void println(java.lang.String);
    public void println(boolean);
    protected void setError();
    public void write(char[]);
    public void write(char[], int, int);
    public void write(int);
    public void write(java.lang.String);
    public void write(java.lang.String, int, int);


    protected java.io.Writer out;
}

-keep class java.io.Reader {
    <init>();
    <init>(java.lang.Object);

    public abstract void close();
    public void mark(int);
    public boolean markSupported();
    public int read();
    public int read(char[]);
    public abstract int read(char[], int, int);
    public int read(java.nio.CharBuffer);
    public boolean ready();
    public void reset();
    public long skip(long);


    protected java.lang.Object lock;
}

-keep class java.io.Serializable {



}

-keep class java.io.SyncFailedException {
    <init>(java.lang.String);



}

-keep class java.io.UnsupportedEncodingException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.io.Writer {
    <init>();
    <init>(java.lang.Object);

    public java.io.Writer append(char);
    public java.io.Writer append(java.lang.CharSequence);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public abstract void close();
    public abstract void flush();
    public void write(char[]);
    public abstract void write(char[], int, int);
    public void write(int);
    public void write(java.lang.String);
    public void write(java.lang.String, int, int);


    protected java.lang.Object lock;
}

-keep class java.lang.AbstractStringBuilder {

    public int capacity();
    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public void ensureCapacity(int);
    public void getChars(int, int, char[], int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String, int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public int offsetByCodePoints(int, int);
    public void setCharAt(int, char);
    public void setLength(int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int);
    public java.lang.String substring(int, int);
    public java.lang.String toString();
    public void trimToSize();


}

-keep class java.lang.Appendable {

    public abstract java.lang.Appendable append(char);
    public abstract java.lang.Appendable append(java.lang.CharSequence);
    public abstract java.lang.Appendable append(java.lang.CharSequence, int, int);


}

-keep class java.lang.Boolean {
    <init>(java.lang.String);
    <init>(boolean);

    public boolean booleanValue();
    public static int compare(boolean, boolean);
    public int compareTo(java.lang.Boolean);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static boolean getBoolean(java.lang.String);
    public int hashCode();
    public static boolean parseBoolean(java.lang.String);
    public java.lang.String toString();
    public static java.lang.String toString(boolean);
    public static java.lang.Boolean valueOf(java.lang.String);
    public static java.lang.Boolean valueOf(boolean);


    public static java.lang.Boolean FALSE;
    public static java.lang.Boolean TRUE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.Byte {
    <init>(byte);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(byte, byte);
    public int compareTo(java.lang.Byte);
    public int compareTo(java.lang.Object);
    public static java.lang.Byte decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public int intValue();
    public long longValue();
    public static byte parseByte(java.lang.String);
    public static byte parseByte(java.lang.String, int);
    public short shortValue();
    public java.lang.String toString();
    public static java.lang.String toString(byte);
    public static java.lang.Byte valueOf(java.lang.String);
    public static java.lang.Byte valueOf(java.lang.String, int);
    public static java.lang.Byte valueOf(byte);


    public static byte MAX_VALUE;
    public static byte MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.CharSequence {

    public abstract char charAt(int);
    public abstract int length();
    public abstract java.lang.CharSequence subSequence(int, int);
    public abstract java.lang.String toString();


}

-keep class java.lang.Character {
    <init>(char);

    public static int charCount(int);
    public char charValue();
    public static int codePointAt(java.lang.CharSequence, int);
    public static int codePointAt(char[], int);
    public static int codePointAt(char[], int, int);
    public static int codePointBefore(java.lang.CharSequence, int);
    public static int codePointBefore(char[], int);
    public static int codePointBefore(char[], int, int);
    public static int codePointCount(java.lang.CharSequence, int, int);
    public static int codePointCount(char[], int, int);
    public static int compare(char, char);
    public int compareTo(java.lang.Character);
    public int compareTo(java.lang.Object);
    public static int digit(char, int);
    public static int digit(int, int);
    public boolean equals(java.lang.Object);
    public static char forDigit(int, int);
    public static byte getDirectionality(char);
    public static byte getDirectionality(int);
    public static java.lang.String getName(int);
    public static int getNumericValue(char);
    public static int getNumericValue(int);
    public static int getType(char);
    public static int getType(int);
    public int hashCode();
    public static char highSurrogate(int);
    public static boolean isAlphabetic(int);
    public static boolean isBmpCodePoint(int);
    public static boolean isDefined(char);
    public static boolean isDefined(int);
    public static boolean isDigit(char);
    public static boolean isDigit(int);
    public static boolean isHighSurrogate(char);
    public static boolean isISOControl(char);
    public static boolean isISOControl(int);
    public static boolean isIdentifierIgnorable(char);
    public static boolean isIdentifierIgnorable(int);
    public static boolean isIdeographic(int);
    public static boolean isJavaIdentifierPart(char);
    public static boolean isJavaIdentifierPart(int);
    public static boolean isJavaIdentifierStart(char);
    public static boolean isJavaIdentifierStart(int);
    public static boolean isJavaLetter(char);
    public static boolean isJavaLetterOrDigit(char);
    public static boolean isLetter(char);
    public static boolean isLetter(int);
    public static boolean isLetterOrDigit(char);
    public static boolean isLetterOrDigit(int);
    public static boolean isLowSurrogate(char);
    public static boolean isLowerCase(char);
    public static boolean isLowerCase(int);
    public static boolean isMirrored(char);
    public static boolean isMirrored(int);
    public static boolean isSpace(char);
    public static boolean isSpaceChar(char);
    public static boolean isSpaceChar(int);
    public static boolean isSupplementaryCodePoint(int);
    public static boolean isSurrogate(char);
    public static boolean isSurrogatePair(char, char);
    public static boolean isTitleCase(char);
    public static boolean isTitleCase(int);
    public static boolean isUnicodeIdentifierPart(char);
    public static boolean isUnicodeIdentifierPart(int);
    public static boolean isUnicodeIdentifierStart(char);
    public static boolean isUnicodeIdentifierStart(int);
    public static boolean isUpperCase(char);
    public static boolean isUpperCase(int);
    public static boolean isValidCodePoint(int);
    public static boolean isWhitespace(char);
    public static boolean isWhitespace(int);
    public static char lowSurrogate(int);
    public static int offsetByCodePoints(java.lang.CharSequence, int, int);
    public static int offsetByCodePoints(char[], int, int, int, int);
    public static char reverseBytes(char);
    public static int toChars(int, char[], int);
    public static char[] toChars(int);
    public static int toCodePoint(char, char);
    public static char toLowerCase(char);
    public static int toLowerCase(int);
    public java.lang.String toString();
    public static java.lang.String toString(char);
    public static char toTitleCase(char);
    public static int toTitleCase(int);
    public static char toUpperCase(char);
    public static int toUpperCase(int);
    public static java.lang.Character valueOf(char);


    public static byte COMBINING_SPACING_MARK;
    public static byte CONNECTOR_PUNCTUATION;
    public static byte CONTROL;
    public static byte CURRENCY_SYMBOL;
    public static byte DASH_PUNCTUATION;
    public static byte DECIMAL_DIGIT_NUMBER;
    public static byte DIRECTIONALITY_ARABIC_NUMBER;
    public static byte DIRECTIONALITY_BOUNDARY_NEUTRAL;
    public static byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE;
    public static byte DIRECTIONALITY_NONSPACING_MARK;
    public static byte DIRECTIONALITY_OTHER_NEUTRALS;
    public static byte DIRECTIONALITY_PARAGRAPH_SEPARATOR;
    public static byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE;
    public static byte DIRECTIONALITY_SEGMENT_SEPARATOR;
    public static byte DIRECTIONALITY_UNDEFINED;
    public static byte DIRECTIONALITY_WHITESPACE;
    public static byte ENCLOSING_MARK;
    public static byte END_PUNCTUATION;
    public static byte FINAL_QUOTE_PUNCTUATION;
    public static byte FORMAT;
    public static byte INITIAL_QUOTE_PUNCTUATION;
    public static byte LETTER_NUMBER;
    public static byte LINE_SEPARATOR;
    public static byte LOWERCASE_LETTER;
    public static byte MATH_SYMBOL;
    public static int MAX_CODE_POINT;
    public static char MAX_HIGH_SURROGATE;
    public static char MAX_LOW_SURROGATE;
    public static int MAX_RADIX;
    public static char MAX_SURROGATE;
    public static char MAX_VALUE;
    public static int MIN_CODE_POINT;
    public static char MIN_HIGH_SURROGATE;
    public static char MIN_LOW_SURROGATE;
    public static int MIN_RADIX;
    public static int MIN_SUPPLEMENTARY_CODE_POINT;
    public static char MIN_SURROGATE;
    public static char MIN_VALUE;
    public static byte MODIFIER_LETTER;
    public static byte MODIFIER_SYMBOL;
    public static byte NON_SPACING_MARK;
    public static byte OTHER_LETTER;
    public static byte OTHER_NUMBER;
    public static byte OTHER_PUNCTUATION;
    public static byte OTHER_SYMBOL;
    public static byte PARAGRAPH_SEPARATOR;
    public static byte PRIVATE_USE;
    public static int SIZE;
    public static byte SPACE_SEPARATOR;
    public static byte START_PUNCTUATION;
    public static byte SURROGATE;
    public static byte TITLECASE_LETTER;
    public static java.lang.Class TYPE;
    public static byte UNASSIGNED;
    public static byte UPPERCASE_LETTER;
}

-keep class java.lang.Class {

    public java.lang.Class asSubclass(java.lang.Class);
    public java.lang.Object cast(java.lang.Object);
    public boolean desiredAssertionStatus();
    public static java.lang.Class forName(java.lang.String);
    public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.String getCanonicalName();
    public java.lang.ClassLoader getClassLoader();
    public java.lang.Class[] getClasses();
    public java.lang.Class getComponentType();
    public java.lang.reflect.Constructor getConstructor(java.lang.Class[]);
    public java.lang.reflect.Constructor[] getConstructors();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class[] getDeclaredClasses();
    public java.lang.reflect.Constructor getDeclaredConstructor(java.lang.Class[]);
    public java.lang.reflect.Constructor[] getDeclaredConstructors();
    public java.lang.reflect.Field getDeclaredField(java.lang.String);
    public java.lang.reflect.Field[] getDeclaredFields();
    public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class[]);
    public java.lang.reflect.Method[] getDeclaredMethods();
    public java.lang.Class getDeclaringClass();
    public java.lang.Class getEnclosingClass();
    public java.lang.reflect.Constructor getEnclosingConstructor();
    public java.lang.reflect.Method getEnclosingMethod();
    public java.lang.Object[] getEnumConstants();
    public java.lang.reflect.Field getField(java.lang.String);
    public java.lang.reflect.Field[] getFields();
    public java.lang.reflect.Type[] getGenericInterfaces();
    public java.lang.reflect.Type getGenericSuperclass();
    public java.lang.Class[] getInterfaces();
    public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class[]);
    public java.lang.reflect.Method[] getMethods();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.Package getPackage();
    public java.security.ProtectionDomain getProtectionDomain();
    public java.net.URL getResource(java.lang.String);
    public java.io.InputStream getResourceAsStream(java.lang.String);
    public java.lang.Object[] getSigners();
    public java.lang.String getSimpleName();
    public java.lang.Class getSuperclass();
    public synchronized java.lang.reflect.TypeVariable[] getTypeParameters();
    public boolean isAnnotation();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isAnonymousClass();
    public boolean isArray();
    public boolean isAssignableFrom(java.lang.Class);
    public boolean isEnum();
    public boolean isInstance(java.lang.Object);
    public boolean isInterface();
    public boolean isLocalClass();
    public boolean isMemberClass();
    public boolean isPrimitive();
    public boolean isSynthetic();
    public java.lang.Object newInstance();
    public java.lang.String toString();


}

-keep class java.lang.ClassFormatError {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.ClassLoader {
    <init>();
    <init>(java.lang.ClassLoader);

    public void clearAssertionStatus();
    protected java.lang.Class defineClass(byte[], int, int);
    protected java.lang.Class defineClass(java.lang.String, byte[], int, int);
    protected java.lang.Class defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain);
    protected java.lang.Class defineClass(java.lang.String, java.nio.ByteBuffer, java.security.ProtectionDomain);
    protected java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL);
    protected java.lang.Class findClass(java.lang.String);
    protected java.lang.String findLibrary(java.lang.String);
    protected java.lang.Class findLoadedClass(java.lang.String);
    protected java.net.URL findResource(java.lang.String);
    protected java.util.Enumeration findResources(java.lang.String);
    protected java.lang.Class findSystemClass(java.lang.String);
    protected java.lang.Package getPackage(java.lang.String);
    protected java.lang.Package[] getPackages();
    public java.lang.ClassLoader getParent();
    public java.net.URL getResource(java.lang.String);
    public java.io.InputStream getResourceAsStream(java.lang.String);
    public java.util.Enumeration getResources(java.lang.String);
    public static java.lang.ClassLoader getSystemClassLoader();
    public static java.net.URL getSystemResource(java.lang.String);
    public static java.io.InputStream getSystemResourceAsStream(java.lang.String);
    public static java.util.Enumeration getSystemResources(java.lang.String);
    public java.lang.Class loadClass(java.lang.String);
    protected java.lang.Class loadClass(java.lang.String, boolean);
    protected void resolveClass(java.lang.Class);
    public void setClassAssertionStatus(java.lang.String, boolean);
    public void setDefaultAssertionStatus(boolean);
    public void setPackageAssertionStatus(java.lang.String, boolean);
    protected void setSigners(java.lang.Class, java.lang.Object[]);


}

-keep class java.lang.ClassNotFoundException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);

    public java.lang.Throwable getCause();
    public java.lang.Throwable getException();


}

-keep class java.lang.CloneNotSupportedException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Double {
    <init>(double);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(double, double);
    public int compareTo(java.lang.Double);
    public int compareTo(java.lang.Object);
    public static long doubleToLongBits(double);
    public static long doubleToRawLongBits(double);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public int intValue();
    public boolean isInfinite();
    public static boolean isInfinite(double);
    public boolean isNaN();
    public static boolean isNaN(double);
    public static double longBitsToDouble(long);
    public long longValue();
    public static double parseDouble(java.lang.String);
    public short shortValue();
    public static java.lang.String toHexString(double);
    public java.lang.String toString();
    public static java.lang.String toString(double);
    public static java.lang.Double valueOf(java.lang.String);
    public static java.lang.Double valueOf(double);


    public static int MAX_EXPONENT;
    public static double MAX_VALUE;
    public static int MIN_EXPONENT;
    public static double MIN_NORMAL;
    public static double MIN_VALUE;
    public static double NEGATIVE_INFINITY;
    public static double NaN;
    public static double POSITIVE_INFINITY;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.Enum {
    <init>(java.lang.String, int);

    protected java.lang.Object clone();
    public int compareTo(java.lang.Enum);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    protected void finalize();
    public java.lang.Class getDeclaringClass();
    public int hashCode();
    public java.lang.String name();
    public int ordinal();
    public java.lang.String toString();
    public static java.lang.Enum valueOf(java.lang.Class, java.lang.String);


}

-keep class java.lang.Error {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.Exception {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.Float {
    <init>(float);
    <init>(double);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(float, float);
    public int compareTo(java.lang.Float);
    public int compareTo(java.lang.Object);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public static int floatToIntBits(float);
    public static int floatToRawIntBits(float);
    public float floatValue();
    public int hashCode();
    public static float intBitsToFloat(int);
    public int intValue();
    public boolean isInfinite();
    public static boolean isInfinite(float);
    public boolean isNaN();
    public static boolean isNaN(float);
    public long longValue();
    public static float parseFloat(java.lang.String);
    public short shortValue();
    public static java.lang.String toHexString(float);
    public java.lang.String toString();
    public static java.lang.String toString(float);
    public static java.lang.Float valueOf(java.lang.String);
    public static java.lang.Float valueOf(float);


    public static int MAX_EXPONENT;
    public static float MAX_VALUE;
    public static int MIN_EXPONENT;
    public static float MIN_NORMAL;
    public static float MIN_VALUE;
    public static float NEGATIVE_INFINITY;
    public static float NaN;
    public static float POSITIVE_INFINITY;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.IllegalAccessException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.IllegalArgumentException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.IllegalStateException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.InstantiationException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Integer {
    <init>(int);
    <init>(java.lang.String);

    public static int bitCount(int);
    public byte byteValue();
    public static int compare(int, int);
    public int compareTo(java.lang.Integer);
    public int compareTo(java.lang.Object);
    public static java.lang.Integer decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static java.lang.Integer getInteger(java.lang.String);
    public static java.lang.Integer getInteger(java.lang.String, int);
    public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
    public int hashCode();
    public static int highestOneBit(int);
    public int intValue();
    public long longValue();
    public static int lowestOneBit(int);
    public static int numberOfLeadingZeros(int);
    public static int numberOfTrailingZeros(int);
    public static int parseInt(java.lang.String);
    public static int parseInt(java.lang.String, int);
    public static int reverse(int);
    public static int reverseBytes(int);
    public static int rotateLeft(int, int);
    public static int rotateRight(int, int);
    public short shortValue();
    public static int signum(int);
    public static java.lang.String toBinaryString(int);
    public static java.lang.String toHexString(int);
    public static java.lang.String toOctalString(int);
    public java.lang.String toString();
    public static java.lang.String toString(int);
    public static java.lang.String toString(int, int);
    public static java.lang.Integer valueOf(java.lang.String);
    public static java.lang.Integer valueOf(java.lang.String, int);
    public static java.lang.Integer valueOf(int);


    public static int MAX_VALUE;
    public static int MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.InterruptedException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.LinkageError {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class java.lang.Long {
    <init>(long);
    <init>(java.lang.String);

    public static int bitCount(long);
    public byte byteValue();
    public static int compare(long, long);
    public int compareTo(java.lang.Long);
    public int compareTo(java.lang.Object);
    public static java.lang.Long decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static java.lang.Long getLong(java.lang.String);
    public static java.lang.Long getLong(java.lang.String, long);
    public static java.lang.Long getLong(java.lang.String, java.lang.Long);
    public int hashCode();
    public static long highestOneBit(long);
    public int intValue();
    public long longValue();
    public static long lowestOneBit(long);
    public static int numberOfLeadingZeros(long);
    public static int numberOfTrailingZeros(long);
    public static long parseLong(java.lang.String);
    public static long parseLong(java.lang.String, int);
    public static long reverse(long);
    public static long reverseBytes(long);
    public static long rotateLeft(long, int);
    public static long rotateRight(long, int);
    public short shortValue();
    public static int signum(long);
    public static java.lang.String toBinaryString(long);
    public static java.lang.String toHexString(long);
    public static java.lang.String toOctalString(long);
    public java.lang.String toString();
    public static java.lang.String toString(long);
    public static java.lang.String toString(long, int);
    public static java.lang.Long valueOf(java.lang.String);
    public static java.lang.Long valueOf(java.lang.String, int);
    public static java.lang.Long valueOf(long);


    public static long MAX_VALUE;
    public static long MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.NoSuchFieldException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.NoSuchMethodException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Number {
    <init>();

    public byte byteValue();
    public abstract double doubleValue();
    public abstract float floatValue();
    public abstract int intValue();
    public abstract long longValue();
    public short shortValue();


}

-keep class java.lang.NumberFormatException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Object {
    <init>();

    protected java.lang.Object clone();
    public boolean equals(java.lang.Object);
    protected void finalize();
    public java.lang.Class getClass();
    public int hashCode();
    public void notify();
    public void notifyAll();
    public java.lang.String toString();
    public void wait();
    public void wait(long);
    public void wait(long, int);


}

-keep class java.lang.Package {

    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.String getImplementationTitle();
    public java.lang.String getImplementationVendor();
    public java.lang.String getImplementationVersion();
    public java.lang.String getName();
    public static java.lang.Package getPackage(java.lang.String);
    public static java.lang.Package[] getPackages();
    public java.lang.String getSpecificationTitle();
    public java.lang.String getSpecificationVendor();
    public java.lang.String getSpecificationVersion();
    public int hashCode();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isCompatibleWith(java.lang.String);
    public boolean isSealed();
    public boolean isSealed(java.net.URL);
    public java.lang.String toString();


}

-keep class java.lang.ReflectiveOperationException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class java.lang.Runnable {

    public abstract void run();


}

-keep class java.lang.RuntimeException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.SecurityException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.Short {
    <init>(java.lang.String);
    <init>(short);

    public byte byteValue();
    public static int compare(short, short);
    public int compareTo(java.lang.Short);
    public int compareTo(java.lang.Object);
    public static java.lang.Short decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public int intValue();
    public long longValue();
    public static short parseShort(java.lang.String);
    public static short parseShort(java.lang.String, int);
    public static short reverseBytes(short);
    public short shortValue();
    public java.lang.String toString();
    public static java.lang.String toString(short);
    public static java.lang.Short valueOf(java.lang.String);
    public static java.lang.Short valueOf(java.lang.String, int);
    public static java.lang.Short valueOf(short);


    public static short MAX_VALUE;
    public static short MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.StackTraceElement {
    <init>(java.lang.String, java.lang.String, java.lang.String, int);

    public boolean equals(java.lang.Object);
    public java.lang.String getClassName();
    public java.lang.String getFileName();
    public int getLineNumber();
    public java.lang.String getMethodName();
    public int hashCode();
    public boolean isNativeMethod();
    public java.lang.String toString();


}

-keep class java.lang.String {
    <init>();
    <init>(byte[]);
    <init>(byte[], int);
    <init>(byte[], int, int);
    <init>(byte[], int, int, int);
    <init>(byte[], int, int, java.lang.String);
    <init>(byte[], java.lang.String);
    <init>(byte[], int, int, java.nio.charset.Charset);
    <init>(byte[], java.nio.charset.Charset);
    <init>(char[]);
    <init>(char[], int, int);
    <init>(java.lang.String);
    <init>(java.lang.StringBuffer);
    <init>(int[], int, int);
    <init>(java.lang.StringBuilder);

    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public int compareTo(java.lang.String);
    public int compareTo(java.lang.Object);
    public int compareToIgnoreCase(java.lang.String);
    public java.lang.String concat(java.lang.String);
    public boolean contains(java.lang.CharSequence);
    public boolean contentEquals(java.lang.StringBuffer);
    public boolean contentEquals(java.lang.CharSequence);
    public static java.lang.String copyValueOf(char[]);
    public static java.lang.String copyValueOf(char[], int, int);
    public boolean endsWith(java.lang.String);
    public boolean equals(java.lang.Object);
    public boolean equalsIgnoreCase(java.lang.String);
    public static java.lang.String format(java.lang.String, java.lang.Object[]);
    public static java.lang.String format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void getBytes(int, int, byte[], int);
    public byte[] getBytes();
    public byte[] getBytes(java.lang.String);
    public byte[] getBytes(java.nio.charset.Charset);
    public void getChars(int, int, char[], int);
    public int hashCode();
    public int indexOf(int);
    public int indexOf(int, int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String, int);
    public java.lang.String intern();
    public boolean isEmpty();
    public int lastIndexOf(int);
    public int lastIndexOf(int, int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public boolean matches(java.lang.String);
    public int offsetByCodePoints(int, int);
    public boolean regionMatches(int, java.lang.String, int, int);
    public boolean regionMatches(boolean, int, java.lang.String, int, int);
    public java.lang.String replace(char, char);
    public java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence);
    public java.lang.String replaceAll(java.lang.String, java.lang.String);
    public java.lang.String replaceFirst(java.lang.String, java.lang.String);
    public java.lang.String[] split(java.lang.String);
    public java.lang.String[] split(java.lang.String, int);
    public boolean startsWith(java.lang.String);
    public boolean startsWith(java.lang.String, int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int);
    public java.lang.String substring(int, int);
    public char[] toCharArray();
    public java.lang.String toLowerCase();
    public java.lang.String toLowerCase(java.util.Locale);
    public java.lang.String toString();
    public java.lang.String toUpperCase();
    public java.lang.String toUpperCase(java.util.Locale);
    public java.lang.String trim();
    public static java.lang.String valueOf(char[]);
    public static java.lang.String valueOf(char[], int, int);
    public static java.lang.String valueOf(char);
    public static java.lang.String valueOf(double);
    public static java.lang.String valueOf(float);
    public static java.lang.String valueOf(int);
    public static java.lang.String valueOf(long);
    public static java.lang.String valueOf(java.lang.Object);
    public static java.lang.String valueOf(boolean);


    public static java.util.Comparator CASE_INSENSITIVE_ORDER;
}

-keep class java.lang.StringBuffer {
    <init>();
    <init>(int);
    <init>(java.lang.String);
    <init>(java.lang.CharSequence);

    public java.lang.StringBuffer append(boolean);
    public synchronized java.lang.StringBuffer append(char);
    public java.lang.StringBuffer append(double);
    public java.lang.StringBuffer append(float);
    public java.lang.StringBuffer append(int);
    public java.lang.StringBuffer append(long);
    public synchronized java.lang.StringBuffer append(java.lang.Object);
    public synchronized java.lang.StringBuffer append(java.lang.String);
    public synchronized java.lang.StringBuffer append(java.lang.StringBuffer);
    public synchronized java.lang.StringBuffer append(char[]);
    public synchronized java.lang.StringBuffer append(char[], int, int);
    public synchronized java.lang.StringBuffer append(java.lang.CharSequence);
    public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public java.lang.StringBuffer appendCodePoint(int);
    public int capacity();
    public synchronized char charAt(int);
    public synchronized int codePointAt(int);
    public synchronized int codePointBefore(int);
    public synchronized int codePointCount(int, int);
    public synchronized java.lang.StringBuffer delete(int, int);
    public synchronized java.lang.StringBuffer deleteCharAt(int);
    public synchronized void ensureCapacity(int);
    public synchronized void getChars(int, int, char[], int);
    public synchronized int indexOf(java.lang.String, int);
    public int indexOf(java.lang.String);
    public synchronized java.lang.StringBuffer insert(int, char);
    public java.lang.StringBuffer insert(int, boolean);
    public java.lang.StringBuffer insert(int, int);
    public java.lang.StringBuffer insert(int, long);
    public java.lang.StringBuffer insert(int, double);
    public java.lang.StringBuffer insert(int, float);
    public java.lang.StringBuffer insert(int, java.lang.Object);
    public synchronized java.lang.StringBuffer insert(int, java.lang.String);
    public synchronized java.lang.StringBuffer insert(int, char[]);
    public synchronized java.lang.StringBuffer insert(int, char[], int, int);
    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence);
    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
    public synchronized int lastIndexOf(java.lang.String, int);
    public int lastIndexOf(java.lang.String);
    public int length();
    public synchronized int offsetByCodePoints(int, int);
    public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
    public synchronized java.lang.StringBuffer reverse();
    public synchronized void setCharAt(int, char);
    public synchronized void setLength(int);
    public synchronized java.lang.CharSequence subSequence(int, int);
    public synchronized java.lang.String substring(int);
    public synchronized java.lang.String substring(int, int);
    public synchronized java.lang.String toString();
    public synchronized void trimToSize();


}

-keep class java.lang.StringBuilder {
    <init>();
    <init>(int);
    <init>(java.lang.CharSequence);
    <init>(java.lang.String);

    public java.lang.StringBuilder append(boolean);
    public java.lang.StringBuilder append(char);
    public java.lang.StringBuilder append(int);
    public java.lang.StringBuilder append(long);
    public java.lang.StringBuilder append(float);
    public java.lang.StringBuilder append(double);
    public java.lang.StringBuilder append(java.lang.Object);
    public java.lang.StringBuilder append(java.lang.String);
    public java.lang.StringBuilder append(java.lang.StringBuffer);
    public java.lang.StringBuilder append(char[]);
    public java.lang.StringBuilder append(char[], int, int);
    public java.lang.StringBuilder append(java.lang.CharSequence);
    public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public java.lang.StringBuilder appendCodePoint(int);
    public int capacity();
    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public java.lang.StringBuilder delete(int, int);
    public java.lang.StringBuilder deleteCharAt(int);
    public void ensureCapacity(int);
    public void getChars(int, int, char[], int);
    public int indexOf(java.lang.String, int);
    public int indexOf(java.lang.String);
    public java.lang.StringBuilder insert(int, boolean);
    public java.lang.StringBuilder insert(int, char);
    public java.lang.StringBuilder insert(int, int);
    public java.lang.StringBuilder insert(int, long);
    public java.lang.StringBuilder insert(int, float);
    public java.lang.StringBuilder insert(int, double);
    public java.lang.StringBuilder insert(int, java.lang.Object);
    public java.lang.StringBuilder insert(int, java.lang.String);
    public java.lang.StringBuilder insert(int, char[]);
    public java.lang.StringBuilder insert(int, char[], int, int);
    public java.lang.StringBuilder insert(int, java.lang.CharSequence);
    public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
    public int lastIndexOf(java.lang.String, int);
    public int lastIndexOf(java.lang.String);
    public int length();
    public int offsetByCodePoints(int, int);
    public java.lang.StringBuilder replace(int, int, java.lang.String);
    public java.lang.StringBuilder reverse();
    public void setCharAt(int, char);
    public void setLength(int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int, int);
    public java.lang.String substring(int);
    public java.lang.String toString();
    public void trimToSize();


}

-keep class java.lang.Thread {
    <init>();
    <init>(java.lang.Runnable);
    <init>(java.lang.Runnable, java.lang.String);
    <init>(java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);

    public static int activeCount();
    public void checkAccess();
    public int countStackFrames();
    public static java.lang.Thread currentThread();
    public void destroy();
    public static void dumpStack();
    public static int enumerate(java.lang.Thread[]);
    public static java.util.Map getAllStackTraces();
    public java.lang.ClassLoader getContextClassLoader();
    public static java.lang.Thread$UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
    public long getId();
    public java.lang.String getName();
    public int getPriority();
    public java.lang.StackTraceElement[] getStackTrace();
    public java.lang.Thread$State getState();
    public java.lang.ThreadGroup getThreadGroup();
    public java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionHandler();
    public static boolean holdsLock(java.lang.Object);
    public void interrupt();
    public static boolean interrupted();
    public boolean isAlive();
    public boolean isDaemon();
    public boolean isInterrupted();
    public void join();
    public void join(long);
    public void join(long, int);
    public void resume();
    public void run();
    public void setContextClassLoader(java.lang.ClassLoader);
    public void setDaemon(boolean);
    public static void setDefaultUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
    public void setName(java.lang.String);
    public void setPriority(int);
    public void setUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
    public static void sleep(long);
    public static void sleep(long, int);
    public synchronized void start();
    public void stop();
    public synchronized void stop(java.lang.Throwable);
    public void suspend();
    public java.lang.String toString();
    public static void yield();


    public static int MAX_PRIORITY;
    public static int MIN_PRIORITY;
    public static int NORM_PRIORITY;
}

-keep class java.lang.Thread$State {

    public static java.lang.Thread$State valueOf(java.lang.String);
    public static java.lang.Thread$State[] values();

    public static java.lang.Thread$State BLOCKED;
    public static java.lang.Thread$State NEW;
    public static java.lang.Thread$State RUNNABLE;
    public static java.lang.Thread$State TERMINATED;
    public static java.lang.Thread$State TIMED_WAITING;
    public static java.lang.Thread$State WAITING;

}

-keep class java.lang.Thread$UncaughtExceptionHandler {

    public abstract void uncaughtException(java.lang.Thread, java.lang.Throwable);


}

-keep class java.lang.ThreadGroup {
    <init>(java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.String);

    public int activeCount();
    public int activeGroupCount();
    public boolean allowThreadSuspension(boolean);
    public void checkAccess();
    public void destroy();
    public int enumerate(java.lang.Thread[]);
    public int enumerate(java.lang.Thread[], boolean);
    public int enumerate(java.lang.ThreadGroup[]);
    public int enumerate(java.lang.ThreadGroup[], boolean);
    public int getMaxPriority();
    public java.lang.String getName();
    public java.lang.ThreadGroup getParent();
    public void interrupt();
    public boolean isDaemon();
    public synchronized boolean isDestroyed();
    public void list();
    public boolean parentOf(java.lang.ThreadGroup);
    public void resume();
    public void setDaemon(boolean);
    public void setMaxPriority(int);
    public void stop();
    public void suspend();
    public java.lang.String toString();
    public void uncaughtException(java.lang.Thread, java.lang.Throwable);


}

-keep class java.lang.Throwable {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);

    public void addSuppressed(java.lang.Throwable);
    public java.lang.Throwable fillInStackTrace();
    public java.lang.Throwable getCause();
    public java.lang.String getLocalizedMessage();
    public java.lang.String getMessage();
    public java.lang.StackTraceElement[] getStackTrace();
    public java.lang.Throwable[] getSuppressed();
    public java.lang.Throwable initCause(java.lang.Throwable);
    public void printStackTrace();
    public void printStackTrace(java.io.PrintStream);
    public void printStackTrace(java.io.PrintWriter);
    public void setStackTrace(java.lang.StackTraceElement[]);
    public java.lang.String toString();


}

-keep class java.lang.UnsupportedOperationException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.annotation.Annotation {

    public abstract java.lang.Class annotationType();
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract java.lang.String toString();


}

-keep class java.lang.reflect.AccessibleObject {
    <init>();

    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public boolean isAccessible();
    public boolean isAnnotationPresent(java.lang.Class);
    public void setAccessible(boolean);
    public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);


}

-keep class java.lang.reflect.Constructor {

    public boolean equals(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.annotation.Annotation[][] getParameterAnnotations();
    public java.lang.Class[] getParameterTypes();
    public java.lang.reflect.TypeVariable[] getTypeParameters();
    public int hashCode();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.Object newInstance(java.lang.Object[]);
    public void setAccessible(boolean);
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Field {

    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public boolean getBoolean(java.lang.Object);
    public byte getByte(java.lang.Object);
    public char getChar(java.lang.Object);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public double getDouble(java.lang.Object);
    public float getFloat(java.lang.Object);
    public java.lang.reflect.Type getGenericType();
    public int getInt(java.lang.Object);
    public long getLong(java.lang.Object);
    public int getModifiers();
    public java.lang.String getName();
    public short getShort(java.lang.Object);
    public java.lang.Class getType();
    public int hashCode();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isEnumConstant();
    public boolean isSynthetic();
    public void set(java.lang.Object, java.lang.Object);
    public void setBoolean(java.lang.Object, boolean);
    public void setByte(java.lang.Object, byte);
    public void setChar(java.lang.Object, char);
    public void setDouble(java.lang.Object, double);
    public void setFloat(java.lang.Object, float);
    public void setInt(java.lang.Object, int);
    public void setLong(java.lang.Object, long);
    public void setShort(java.lang.Object, short);
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.GenericDeclaration {

    public abstract java.lang.reflect.TypeVariable[] getTypeParameters();


}

-keep class java.lang.reflect.InvocationTargetException {
    <init>();
    <init>(java.lang.Throwable);
    <init>(java.lang.Throwable, java.lang.String);

    public java.lang.Throwable getCause();
    public java.lang.Throwable getTargetException();


}

-keep class java.lang.reflect.Method {

    public boolean equals(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public java.lang.Object getDefaultValue();
    public java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public java.lang.reflect.Type getGenericReturnType();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.annotation.Annotation[][] getParameterAnnotations();
    public java.lang.Class[] getParameterTypes();
    public java.lang.Class getReturnType();
    public java.lang.reflect.TypeVariable[] getTypeParameters();
    public int hashCode();
    public java.lang.Object invoke(java.lang.Object, java.lang.Object[]);
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isBridge();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Type {



}

-keep class java.lang.reflect.TypeVariable {

    public abstract java.lang.reflect.Type[] getBounds();
    public abstract java.lang.reflect.GenericDeclaration getGenericDeclaration();
    public abstract java.lang.String getName();


}

-keep class java.net.ContentHandler {
    <init>();

    public abstract java.lang.Object getContent(java.net.URLConnection);
    public java.lang.Object getContent(java.net.URLConnection, java.lang.Class[]);


}

-keep class java.net.ContentHandlerFactory {

    public abstract java.net.ContentHandler createContentHandler(java.lang.String);


}

-keep class java.net.DatagramPacket {
    <init>(byte[], int);
    <init>(byte[], int, int);
    <init>(byte[], int, int, java.net.InetAddress, int);
    <init>(byte[], int, java.net.InetAddress, int);
    <init>(byte[], int, java.net.SocketAddress);
    <init>(byte[], int, int, java.net.SocketAddress);

    public synchronized java.net.InetAddress getAddress();
    public synchronized byte[] getData();
    public synchronized int getLength();
    public synchronized int getOffset();
    public synchronized int getPort();
    public synchronized java.net.SocketAddress getSocketAddress();
    public synchronized void setAddress(java.net.InetAddress);
    public synchronized void setData(byte[], int, int);
    public synchronized void setData(byte[]);
    public synchronized void setLength(int);
    public synchronized void setPort(int);
    public synchronized void setSocketAddress(java.net.SocketAddress);


}

-keep class java.net.DatagramSocket {
    <init>();
    <init>(int);
    <init>(int, java.net.InetAddress);
    <init>(java.net.DatagramSocketImpl);
    <init>(java.net.SocketAddress);

    public void bind(java.net.SocketAddress);
    public void close();
    public void connect(java.net.SocketAddress);
    public void connect(java.net.InetAddress, int);
    public void disconnect();
    public boolean getBroadcast();
    public java.nio.channels.DatagramChannel getChannel();
    public java.net.InetAddress getInetAddress();
    public java.net.InetAddress getLocalAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public int getPort();
    public synchronized int getReceiveBufferSize();
    public java.net.SocketAddress getRemoteSocketAddress();
    public boolean getReuseAddress();
    public synchronized int getSendBufferSize();
    public synchronized int getSoTimeout();
    public int getTrafficClass();
    public boolean isBound();
    public boolean isClosed();
    public boolean isConnected();
    public synchronized void receive(java.net.DatagramPacket);
    public void send(java.net.DatagramPacket);
    public void setBroadcast(boolean);
    public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory);
    public synchronized void setReceiveBufferSize(int);
    public void setReuseAddress(boolean);
    public synchronized void setSendBufferSize(int);
    public synchronized void setSoTimeout(int);
    public void setTrafficClass(int);


}

-keep class java.net.DatagramSocketImpl {
    <init>();

    protected abstract void bind(int, java.net.InetAddress);
    protected abstract void close();
    protected void connect(java.net.InetAddress, int);
    protected abstract void create();
    protected void disconnect();
    protected java.io.FileDescriptor getFileDescriptor();
    protected int getLocalPort();
    protected abstract byte getTTL();
    protected abstract int getTimeToLive();
    protected abstract void join(java.net.InetAddress);
    protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface);
    protected abstract void leave(java.net.InetAddress);
    protected abstract void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface);
    protected abstract int peek(java.net.InetAddress);
    protected abstract int peekData(java.net.DatagramPacket);
    protected abstract void receive(java.net.DatagramPacket);
    protected abstract void send(java.net.DatagramPacket);
    protected abstract void setTTL(byte);
    protected abstract void setTimeToLive(int);


    protected java.io.FileDescriptor fd;
    protected int localPort;
}

-keep class java.net.DatagramSocketImplFactory {

    public abstract java.net.DatagramSocketImpl createDatagramSocketImpl();


}

-keep class java.net.FileNameMap {

    public abstract java.lang.String getContentTypeFor(java.lang.String);


}

-keep class java.net.InetAddress {

    public boolean equals(java.lang.Object);
    public byte[] getAddress();
    public static java.net.InetAddress[] getAllByName(java.lang.String);
    public static java.net.InetAddress getByAddress(byte[]);
    public static java.net.InetAddress getByAddress(java.lang.String, byte[]);
    public static java.net.InetAddress getByName(java.lang.String);
    public java.lang.String getCanonicalHostName();
    public java.lang.String getHostAddress();
    public java.lang.String getHostName();
    public static java.net.InetAddress getLocalHost();
    public static java.net.InetAddress getLoopbackAddress();
    public int hashCode();
    public boolean isAnyLocalAddress();
    public boolean isLinkLocalAddress();
    public boolean isLoopbackAddress();
    public boolean isMCGlobal();
    public boolean isMCLinkLocal();
    public boolean isMCNodeLocal();
    public boolean isMCOrgLocal();
    public boolean isMCSiteLocal();
    public boolean isMulticastAddress();
    public boolean isReachable(int);
    public boolean isReachable(java.net.NetworkInterface, int, int);
    public boolean isSiteLocalAddress();
    public java.lang.String toString();


}

-keep class java.net.InterfaceAddress {

    public boolean equals(java.lang.Object);
    public java.net.InetAddress getAddress();
    public java.net.InetAddress getBroadcast();
    public short getNetworkPrefixLength();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.net.MalformedURLException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.net.NetworkInterface {

    public boolean equals(java.lang.Object);
    public static java.net.NetworkInterface getByIndex(int);
    public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress);
    public static java.net.NetworkInterface getByName(java.lang.String);
    public java.lang.String getDisplayName();
    public byte[] getHardwareAddress();
    public int getIndex();
    public java.util.Enumeration getInetAddresses();
    public java.util.List getInterfaceAddresses();
    public int getMTU();
    public java.lang.String getName();
    public static java.util.Enumeration getNetworkInterfaces();
    public java.net.NetworkInterface getParent();
    public java.util.Enumeration getSubInterfaces();
    public int hashCode();
    public boolean isLoopback();
    public boolean isPointToPoint();
    public boolean isUp();
    public boolean isVirtual();
    public boolean supportsMulticast();
    public java.lang.String toString();


}

-keep class java.net.Proxy {
    <init>(java.net.Proxy$Type, java.net.SocketAddress);

    public java.net.SocketAddress address();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    public java.net.Proxy$Type type();


    public static java.net.Proxy NO_PROXY;
}

-keep class java.net.Proxy$Type {

    public static java.net.Proxy$Type valueOf(java.lang.String);
    public static java.net.Proxy$Type[] values();

    public static java.net.Proxy$Type DIRECT;
    public static java.net.Proxy$Type HTTP;
    public static java.net.Proxy$Type SOCKS;

}

-keep class java.net.ServerSocket {
    <init>();
    <init>(int);
    <init>(int, int);
    <init>(int, int, java.net.InetAddress);

    public java.net.Socket accept();
    public void bind(java.net.SocketAddress);
    public void bind(java.net.SocketAddress, int);
    public void close();
    public java.nio.channels.ServerSocketChannel getChannel();
    public java.net.InetAddress getInetAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public int getReceiveBufferSize();
    public boolean getReuseAddress();
    public synchronized int getSoTimeout();
    protected void implAccept(java.net.Socket);
    public boolean isBound();
    public boolean isClosed();
    public void setPerformancePreferences(int, int, int);
    public void setReceiveBufferSize(int);
    public void setReuseAddress(boolean);
    public synchronized void setSoTimeout(int);
    public static synchronized void setSocketFactory(java.net.SocketImplFactory);
    public java.lang.String toString();


}

-keep class java.net.Socket {
    <init>();
    <init>(java.net.Proxy);
    <init>(java.lang.String, int);
    <init>(java.lang.String, int, java.net.InetAddress, int);
    <init>(java.lang.String, int, boolean);
    <init>(java.net.InetAddress, int);
    <init>(java.net.InetAddress, int, java.net.InetAddress, int);
    <init>(java.net.InetAddress, int, boolean);
    <init>(java.net.SocketImpl);

    public void bind(java.net.SocketAddress);
    public synchronized void close();
    public void connect(java.net.SocketAddress);
    public void connect(java.net.SocketAddress, int);
    public java.nio.channels.SocketChannel getChannel();
    public java.net.InetAddress getInetAddress();
    public java.io.InputStream getInputStream();
    public boolean getKeepAlive();
    public java.net.InetAddress getLocalAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public boolean getOOBInline();
    public java.io.OutputStream getOutputStream();
    public int getPort();
    public synchronized int getReceiveBufferSize();
    public java.net.SocketAddress getRemoteSocketAddress();
    public boolean getReuseAddress();
    public synchronized int getSendBufferSize();
    public int getSoLinger();
    public synchronized int getSoTimeout();
    public boolean getTcpNoDelay();
    public int getTrafficClass();
    public boolean isBound();
    public boolean isClosed();
    public boolean isConnected();
    public boolean isInputShutdown();
    public boolean isOutputShutdown();
    public void sendUrgentData(int);
    public void setKeepAlive(boolean);
    public void setOOBInline(boolean);
    public void setPerformancePreferences(int, int, int);
    public synchronized void setReceiveBufferSize(int);
    public void setReuseAddress(boolean);
    public synchronized void setSendBufferSize(int);
    public void setSoLinger(boolean, int);
    public synchronized void setSoTimeout(int);
    public static synchronized void setSocketImplFactory(java.net.SocketImplFactory);
    public void setTcpNoDelay(boolean);
    public void setTrafficClass(int);
    public void shutdownInput();
    public void shutdownOutput();
    public java.lang.String toString();


}

-keep class java.net.SocketAddress {
    <init>();



}

-keep class java.net.SocketException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.net.SocketImpl {
    <init>();

    protected abstract void accept(java.net.SocketImpl);
    protected abstract int available();
    protected abstract void bind(java.net.InetAddress, int);
    protected abstract void close();
    protected abstract void connect(java.lang.String, int);
    protected abstract void connect(java.net.InetAddress, int);
    protected abstract void connect(java.net.SocketAddress, int);
    protected abstract void create(boolean);
    protected java.io.FileDescriptor getFileDescriptor();
    protected java.net.InetAddress getInetAddress();
    protected abstract java.io.InputStream getInputStream();
    protected int getLocalPort();
    protected abstract java.io.OutputStream getOutputStream();
    protected int getPort();
    protected abstract void listen(int);
    protected abstract void sendUrgentData(int);
    protected void setPerformancePreferences(int, int, int);
    protected void shutdownInput();
    protected void shutdownOutput();
    protected boolean supportsUrgentData();
    public java.lang.String toString();


    protected java.net.InetAddress address;
    protected java.io.FileDescriptor fd;
    protected int localport;
    protected int port;
}

-keep class java.net.SocketImplFactory {

    public abstract java.net.SocketImpl createSocketImpl();


}

-keep class java.net.URI {
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);

    public int compareTo(java.net.URI);
    public int compareTo(java.lang.Object);
    public static java.net.URI create(java.lang.String);
    public boolean equals(java.lang.Object);
    public java.lang.String getAuthority();
    public java.lang.String getFragment();
    public java.lang.String getHost();
    public java.lang.String getPath();
    public int getPort();
    public java.lang.String getQuery();
    public java.lang.String getRawAuthority();
    public java.lang.String getRawFragment();
    public java.lang.String getRawPath();
    public java.lang.String getRawQuery();
    public java.lang.String getRawSchemeSpecificPart();
    public java.lang.String getRawUserInfo();
    public java.lang.String getScheme();
    public java.lang.String getSchemeSpecificPart();
    public java.lang.String getUserInfo();
    public int hashCode();
    public boolean isAbsolute();
    public boolean isOpaque();
    public java.net.URI normalize();
    public java.net.URI parseServerAuthority();
    public java.net.URI relativize(java.net.URI);
    public java.net.URI resolve(java.net.URI);
    public java.net.URI resolve(java.lang.String);
    public java.lang.String toASCIIString();
    public java.lang.String toString();
    public java.net.URL toURL();


}

-keep class java.net.URISyntaxException {
    <init>(java.lang.String, java.lang.String, int);
    <init>(java.lang.String, java.lang.String);

    public int getIndex();
    public java.lang.String getInput();
    public java.lang.String getMessage();
    public java.lang.String getReason();


}

-keep class java.net.URL {
    <init>(java.lang.String);
    <init>(java.net.URL, java.lang.String);
    <init>(java.net.URL, java.lang.String, java.net.URLStreamHandler);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, int, java.lang.String);
    <init>(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler);

    public boolean equals(java.lang.Object);
    public java.lang.String getAuthority();
    public java.lang.Object getContent();
    public java.lang.Object getContent(java.lang.Class[]);
    public int getDefaultPort();
    public java.lang.String getFile();
    public java.lang.String getHost();
    public java.lang.String getPath();
    public int getPort();
    public java.lang.String getProtocol();
    public java.lang.String getQuery();
    public java.lang.String getRef();
    public java.lang.String getUserInfo();
    public int hashCode();
    public java.net.URLConnection openConnection();
    public java.net.URLConnection openConnection(java.net.Proxy);
    public java.io.InputStream openStream();
    public boolean sameFile(java.net.URL);
    protected void set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
    protected void set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public static synchronized void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
    public java.lang.String toExternalForm();
    public java.lang.String toString();
    public java.net.URI toURI();


}

-keep class java.net.URLConnection {
    <init>(java.net.URL);

    public void addRequestProperty(java.lang.String, java.lang.String);
    public abstract void connect();
    public boolean getAllowUserInteraction();
    public int getConnectTimeout();
    public java.lang.Object getContent();
    public java.lang.Object getContent(java.lang.Class[]);
    public java.lang.String getContentEncoding();
    public int getContentLength();
    public java.lang.String getContentType();
    public long getDate();
    public static boolean getDefaultAllowUserInteraction();
    public static java.lang.String getDefaultRequestProperty(java.lang.String);
    public boolean getDefaultUseCaches();
    public boolean getDoInput();
    public boolean getDoOutput();
    public long getExpiration();
    public static java.net.FileNameMap getFileNameMap();
    public java.lang.String getHeaderField(int);
    public java.lang.String getHeaderField(java.lang.String);
    public long getHeaderFieldDate(java.lang.String, long);
    public int getHeaderFieldInt(java.lang.String, int);
    public java.lang.String getHeaderFieldKey(int);
    public java.util.Map getHeaderFields();
    public long getIfModifiedSince();
    public java.io.InputStream getInputStream();
    public long getLastModified();
    public java.io.OutputStream getOutputStream();
    public java.security.Permission getPermission();
    public int getReadTimeout();
    public java.util.Map getRequestProperties();
    public java.lang.String getRequestProperty(java.lang.String);
    public java.net.URL getURL();
    public boolean getUseCaches();
    public static java.lang.String guessContentTypeFromName(java.lang.String);
    public static java.lang.String guessContentTypeFromStream(java.io.InputStream);
    public void setAllowUserInteraction(boolean);
    public void setConnectTimeout(int);
    public static synchronized void setContentHandlerFactory(java.net.ContentHandlerFactory);
    public static void setDefaultAllowUserInteraction(boolean);
    public static void setDefaultRequestProperty(java.lang.String, java.lang.String);
    public void setDefaultUseCaches(boolean);
    public void setDoInput(boolean);
    public void setDoOutput(boolean);
    public static void setFileNameMap(java.net.FileNameMap);
    public void setIfModifiedSince(long);
    public void setReadTimeout(int);
    public void setRequestProperty(java.lang.String, java.lang.String);
    public void setUseCaches(boolean);
    public java.lang.String toString();


    protected boolean allowUserInteraction;
    protected boolean connected;
    protected boolean doInput;
    protected boolean doOutput;
    protected long ifModifiedSince;
    protected java.net.URL url;
    protected boolean useCaches;
}

-keep class java.net.URLStreamHandler {
    <init>();

    protected boolean equals(java.net.URL, java.net.URL);
    protected int getDefaultPort();
    protected java.net.InetAddress getHostAddress(java.net.URL);
    protected int hashCode(java.net.URL);
    protected boolean hostsEqual(java.net.URL, java.net.URL);
    protected abstract java.net.URLConnection openConnection(java.net.URL);
    protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy);
    protected void parseURL(java.net.URL, java.lang.String, int, int);
    protected boolean sameFile(java.net.URL, java.net.URL);
    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    protected java.lang.String toExternalForm(java.net.URL);


}

-keep class java.net.URLStreamHandlerFactory {

    public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String);


}

-keep class java.net.UnknownHostException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.nio.Buffer {

    public abstract java.lang.Object array();
    public abstract int arrayOffset();
    public int capacity();
    public java.nio.Buffer clear();
    public java.nio.Buffer flip();
    public abstract boolean hasArray();
    public boolean hasRemaining();
    public abstract boolean isDirect();
    public abstract boolean isReadOnly();
    public int limit();
    public java.nio.Buffer limit(int);
    public java.nio.Buffer mark();
    public int position();
    public java.nio.Buffer position(int);
    public int remaining();
    public java.nio.Buffer reset();
    public java.nio.Buffer rewind();
    public java.lang.String toString();


}

-keep class java.nio.BufferOverflowException {
    <init>();



}

-keep class java.nio.BufferUnderflowException {
    <init>();



}

-keep class java.nio.ByteBuffer {

    public static java.nio.ByteBuffer allocate(int);
    public static java.nio.ByteBuffer allocateDirect(int);
    public byte[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.CharBuffer asCharBuffer();
    public abstract java.nio.DoubleBuffer asDoubleBuffer();
    public abstract java.nio.FloatBuffer asFloatBuffer();
    public abstract java.nio.IntBuffer asIntBuffer();
    public abstract java.nio.LongBuffer asLongBuffer();
    public abstract java.nio.ByteBuffer asReadOnlyBuffer();
    public abstract java.nio.ShortBuffer asShortBuffer();
    public abstract java.nio.ByteBuffer compact();
    public int compareTo(java.nio.ByteBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.ByteBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract byte get();
    public java.nio.ByteBuffer get(byte[]);
    public java.nio.ByteBuffer get(byte[], int, int);
    public abstract byte get(int);
    public abstract char getChar();
    public abstract char getChar(int);
    public abstract double getDouble();
    public abstract double getDouble(int);
    public abstract float getFloat();
    public abstract float getFloat(int);
    public abstract int getInt();
    public abstract int getInt(int);
    public abstract long getLong();
    public abstract long getLong(int);
    public abstract short getShort();
    public abstract short getShort(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public java.nio.ByteOrder order();
    public java.nio.ByteBuffer order(java.nio.ByteOrder);
    public abstract java.nio.ByteBuffer put(byte);
    public java.nio.ByteBuffer put(byte[]);
    public java.nio.ByteBuffer put(byte[], int, int);
    public java.nio.ByteBuffer put(java.nio.ByteBuffer);
    public abstract java.nio.ByteBuffer put(int, byte);
    public abstract java.nio.ByteBuffer putChar(char);
    public abstract java.nio.ByteBuffer putChar(int, char);
    public abstract java.nio.ByteBuffer putDouble(double);
    public abstract java.nio.ByteBuffer putDouble(int, double);
    public abstract java.nio.ByteBuffer putFloat(float);
    public abstract java.nio.ByteBuffer putFloat(int, float);
    public abstract java.nio.ByteBuffer putInt(int);
    public abstract java.nio.ByteBuffer putInt(int, int);
    public abstract java.nio.ByteBuffer putLong(long);
    public abstract java.nio.ByteBuffer putLong(int, long);
    public abstract java.nio.ByteBuffer putShort(short);
    public abstract java.nio.ByteBuffer putShort(int, short);
    public abstract java.nio.ByteBuffer slice();
    public static java.nio.ByteBuffer wrap(byte[]);
    public static java.nio.ByteBuffer wrap(byte[], int, int);


}

-keep class java.nio.ByteOrder {

    public static java.nio.ByteOrder nativeOrder();
    public java.lang.String toString();


    public static java.nio.ByteOrder BIG_ENDIAN;
    public static java.nio.ByteOrder LITTLE_ENDIAN;
}

-keep class java.nio.CharBuffer {

    public static java.nio.CharBuffer allocate(int);
    public java.nio.CharBuffer append(char);
    public java.nio.CharBuffer append(java.lang.CharSequence);
    public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public char[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.CharBuffer asReadOnlyBuffer();
    public char charAt(int);
    public abstract java.nio.CharBuffer compact();
    public int compareTo(java.nio.CharBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.CharBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract char get();
    public java.nio.CharBuffer get(char[]);
    public java.nio.CharBuffer get(char[], int, int);
    public abstract char get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public int length();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.CharBuffer put(char);
    public java.nio.CharBuffer put(char[]);
    public java.nio.CharBuffer put(char[], int, int);
    public java.nio.CharBuffer put(java.nio.CharBuffer);
    public abstract java.nio.CharBuffer put(int, char);
    public java.nio.CharBuffer put(java.lang.String);
    public java.nio.CharBuffer put(java.lang.String, int, int);
    public int read(java.nio.CharBuffer);
    public abstract java.nio.CharBuffer slice();
    public abstract java.nio.CharBuffer subSequence(int, int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String toString();
    public static java.nio.CharBuffer wrap(char[]);
    public static java.nio.CharBuffer wrap(char[], int, int);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);


}

-keep class java.nio.DoubleBuffer {

    public static java.nio.DoubleBuffer allocate(int);
    public double[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.DoubleBuffer asReadOnlyBuffer();
    public abstract java.nio.DoubleBuffer compact();
    public int compareTo(java.nio.DoubleBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.DoubleBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract double get();
    public java.nio.DoubleBuffer get(double[]);
    public java.nio.DoubleBuffer get(double[], int, int);
    public abstract double get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.DoubleBuffer put(double);
    public java.nio.DoubleBuffer put(double[]);
    public java.nio.DoubleBuffer put(double[], int, int);
    public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
    public abstract java.nio.DoubleBuffer put(int, double);
    public abstract java.nio.DoubleBuffer slice();
    public static java.nio.DoubleBuffer wrap(double[]);
    public static java.nio.DoubleBuffer wrap(double[], int, int);


}

-keep class java.nio.FloatBuffer {

    public static java.nio.FloatBuffer allocate(int);
    public float[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.FloatBuffer asReadOnlyBuffer();
    public abstract java.nio.FloatBuffer compact();
    public int compareTo(java.nio.FloatBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.FloatBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract float get();
    public java.nio.FloatBuffer get(float[]);
    public java.nio.FloatBuffer get(float[], int, int);
    public abstract float get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.FloatBuffer put(float);
    public java.nio.FloatBuffer put(float[]);
    public java.nio.FloatBuffer put(float[], int, int);
    public java.nio.FloatBuffer put(java.nio.FloatBuffer);
    public abstract java.nio.FloatBuffer put(int, float);
    public abstract java.nio.FloatBuffer slice();
    public static java.nio.FloatBuffer wrap(float[]);
    public static java.nio.FloatBuffer wrap(float[], int, int);


}

-keep class java.nio.IntBuffer {

    public static java.nio.IntBuffer allocate(int);
    public int[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.IntBuffer asReadOnlyBuffer();
    public abstract java.nio.IntBuffer compact();
    public int compareTo(java.nio.IntBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.IntBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract int get();
    public java.nio.IntBuffer get(int[]);
    public java.nio.IntBuffer get(int[], int, int);
    public abstract int get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.IntBuffer put(int);
    public java.nio.IntBuffer put(int[]);
    public java.nio.IntBuffer put(int[], int, int);
    public java.nio.IntBuffer put(java.nio.IntBuffer);
    public abstract java.nio.IntBuffer put(int, int);
    public abstract java.nio.IntBuffer slice();
    public static java.nio.IntBuffer wrap(int[]);
    public static java.nio.IntBuffer wrap(int[], int, int);


}

-keep class java.nio.LongBuffer {

    public static java.nio.LongBuffer allocate(int);
    public long[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.LongBuffer asReadOnlyBuffer();
    public abstract java.nio.LongBuffer compact();
    public int compareTo(java.nio.LongBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.LongBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract long get();
    public java.nio.LongBuffer get(long[]);
    public java.nio.LongBuffer get(long[], int, int);
    public abstract long get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.LongBuffer put(long);
    public java.nio.LongBuffer put(long[]);
    public java.nio.LongBuffer put(long[], int, int);
    public java.nio.LongBuffer put(java.nio.LongBuffer);
    public abstract java.nio.LongBuffer put(int, long);
    public abstract java.nio.LongBuffer slice();
    public static java.nio.LongBuffer wrap(long[]);
    public static java.nio.LongBuffer wrap(long[], int, int);


}

-keep class java.nio.MappedByteBuffer {

    public java.nio.MappedByteBuffer force();
    public boolean isLoaded();
    public java.nio.MappedByteBuffer load();


}

-keep class java.nio.ShortBuffer {

    public static java.nio.ShortBuffer allocate(int);
    public short[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.ShortBuffer asReadOnlyBuffer();
    public abstract java.nio.ShortBuffer compact();
    public int compareTo(java.nio.ShortBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.ShortBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract short get();
    public java.nio.ShortBuffer get(short[]);
    public java.nio.ShortBuffer get(short[], int, int);
    public abstract short get(int);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.ShortBuffer put(short);
    public java.nio.ShortBuffer put(short[]);
    public java.nio.ShortBuffer put(short[], int, int);
    public java.nio.ShortBuffer put(java.nio.ShortBuffer);
    public abstract java.nio.ShortBuffer put(int, short);
    public abstract java.nio.ShortBuffer slice();
    public static java.nio.ShortBuffer wrap(short[]);
    public static java.nio.ShortBuffer wrap(short[], int, int);


}

-keep class java.nio.channels.AsynchronousCloseException {
    <init>();



}

-keep class java.nio.channels.Channel {

    public abstract void close();
    public abstract boolean isOpen();


}

-keep class java.nio.channels.ClosedChannelException {
    <init>();



}

-keep class java.nio.channels.DatagramChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel disconnect();
    public abstract boolean isConnected();
    public static java.nio.channels.DatagramChannel open();
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public synchronized long read(java.nio.ByteBuffer[]);
    public abstract java.net.SocketAddress receive(java.nio.ByteBuffer);
    public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress);
    public abstract java.net.DatagramSocket socket();
    public int validOps();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public synchronized long write(java.nio.ByteBuffer[]);


}

-keep class java.nio.channels.FileChannel {
    <init>();

    public abstract void force(boolean);
    public java.nio.channels.FileLock lock();
    public abstract java.nio.channels.FileLock lock(long, long, boolean);
    public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel$MapMode, long, long);
    public abstract long position();
    public abstract java.nio.channels.FileChannel position(long);
    public abstract int read(java.nio.ByteBuffer);
    public abstract int read(java.nio.ByteBuffer, long);
    public long read(java.nio.ByteBuffer[]);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public abstract long size();
    public abstract long transferFrom(java.nio.channels.ReadableByteChannel, long, long);
    public abstract long transferTo(long, long, java.nio.channels.WritableByteChannel);
    public abstract java.nio.channels.FileChannel truncate(long);
    public java.nio.channels.FileLock tryLock();
    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
    public abstract int write(java.nio.ByteBuffer);
    public abstract int write(java.nio.ByteBuffer, long);
    public long write(java.nio.ByteBuffer[]);
    public abstract long write(java.nio.ByteBuffer[], int, int);


}

-keep class java.nio.channels.FileChannel$MapMode {

    public java.lang.String toString();


    public static java.nio.channels.FileChannel$MapMode PRIVATE;
    public static java.nio.channels.FileChannel$MapMode READ_ONLY;
    public static java.nio.channels.FileChannel$MapMode READ_WRITE;
}

-keep class java.nio.channels.FileLock {
    <init>(java.nio.channels.FileChannel, long, long, boolean);

    public java.nio.channels.FileChannel channel();
    public void close();
    public boolean isShared();
    public abstract boolean isValid();
    public boolean overlaps(long, long);
    public long position();
    public abstract void release();
    public long size();
    public java.lang.String toString();


}

-keep class java.nio.channels.Pipe {
    <init>();

    public static java.nio.channels.Pipe open();
    public abstract java.nio.channels.Pipe$SinkChannel sink();
    public abstract java.nio.channels.Pipe$SourceChannel source();


}

-keep class java.nio.channels.Pipe$SinkChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public int validOps();


}

-keep class java.nio.channels.Pipe$SourceChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public int validOps();


}

-keep class java.nio.channels.ReadableByteChannel {

    public abstract int read(java.nio.ByteBuffer);


}

-keep class java.nio.channels.SelectableChannel {
    <init>();

    public abstract java.lang.Object blockingLock();
    public abstract java.nio.channels.SelectableChannel configureBlocking(boolean);
    public abstract boolean isBlocking();
    public abstract boolean isRegistered();
    public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    public abstract java.nio.channels.spi.SelectorProvider provider();
    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int);
    public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
    public abstract int validOps();


}

-keep class java.nio.channels.SelectionKey {
    <init>();

    public java.lang.Object attach(java.lang.Object);
    public java.lang.Object attachment();
    public abstract void cancel();
    public abstract java.nio.channels.SelectableChannel channel();
    public abstract int interestOps();
    public abstract java.nio.channels.SelectionKey interestOps(int);
    public boolean isAcceptable();
    public boolean isConnectable();
    public boolean isReadable();
    public abstract boolean isValid();
    public boolean isWritable();
    public abstract int readyOps();
    public abstract java.nio.channels.Selector selector();


    public static int OP_ACCEPT;
    public static int OP_CONNECT;
    public static int OP_READ;
    public static int OP_WRITE;
}

-keep class java.nio.channels.Selector {
    <init>();

    public abstract void close();
    public abstract boolean isOpen();
    public abstract java.util.Set keys();
    public static java.nio.channels.Selector open();
    public abstract java.nio.channels.spi.SelectorProvider provider();
    public abstract int select();
    public abstract int select(long);
    public abstract int selectNow();
    public abstract java.util.Set selectedKeys();
    public abstract java.nio.channels.Selector wakeup();


}

-keep class java.nio.channels.ServerSocketChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.SocketChannel accept();
    public static java.nio.channels.ServerSocketChannel open();
    public abstract java.net.ServerSocket socket();
    public int validOps();


}

-keep class java.nio.channels.SocketChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract boolean connect(java.net.SocketAddress);
    public abstract boolean finishConnect();
    public abstract boolean isConnected();
    public abstract boolean isConnectionPending();
    public static java.nio.channels.SocketChannel open();
    public static java.nio.channels.SocketChannel open(java.net.SocketAddress);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public synchronized long read(java.nio.ByteBuffer[]);
    public abstract java.net.Socket socket();
    public int validOps();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public synchronized long write(java.nio.ByteBuffer[]);


}

-keep class java.nio.channels.WritableByteChannel {

    public abstract int write(java.nio.ByteBuffer);


}

-keep class java.nio.channels.spi.AbstractInterruptibleChannel {
    <init>();

    protected void begin();
    public void close();
    protected void end(boolean);
    protected abstract void implCloseChannel();
    public synchronized boolean isOpen();


}

-keep class java.nio.channels.spi.AbstractSelectableChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public java.lang.Object blockingLock();
    public java.nio.channels.SelectableChannel configureBlocking(boolean);
    protected synchronized void implCloseChannel();
    protected abstract void implCloseSelectableChannel();
    protected abstract void implConfigureBlocking(boolean);
    public boolean isBlocking();
    public synchronized boolean isRegistered();
    public synchronized java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    public java.nio.channels.spi.SelectorProvider provider();
    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);


}

-keep class java.nio.channels.spi.AbstractSelectionKey {
    <init>();

    public void cancel();
    public boolean isValid();


}

-keep class java.nio.channels.spi.AbstractSelector {
    <init>(java.nio.channels.spi.SelectorProvider);

    protected void begin();
    protected java.util.Set cancelledKeys();
    public void close();
    protected void deregister(java.nio.channels.spi.AbstractSelectionKey);
    protected void end();
    protected abstract void implCloseSelector();
    public boolean isOpen();
    public java.nio.channels.spi.SelectorProvider provider();
    protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, java.lang.Object);


}

-keep class java.nio.channels.spi.SelectorProvider {
    <init>();

    public java.nio.channels.Channel inheritedChannel();
    public abstract java.nio.channels.DatagramChannel openDatagramChannel();
    public abstract java.nio.channels.Pipe openPipe();
    public abstract java.nio.channels.spi.AbstractSelector openSelector();
    public abstract java.nio.channels.ServerSocketChannel openServerSocketChannel();
    public abstract java.nio.channels.SocketChannel openSocketChannel();
    public static synchronized java.nio.channels.spi.SelectorProvider provider();


}

-keep class java.nio.charset.CharacterCodingException {
    <init>();



}

-keep class java.nio.charset.Charset {
    <init>(java.lang.String, java.lang.String[]);

    public java.util.Set aliases();
    public static java.util.SortedMap availableCharsets();
    public boolean canEncode();
    public int compareTo(java.nio.charset.Charset);
    public int compareTo(java.lang.Object);
    public abstract boolean contains(java.nio.charset.Charset);
    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
    public static java.nio.charset.Charset defaultCharset();
    public java.lang.String displayName();
    public java.lang.String displayName(java.util.Locale);
    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
    public java.nio.ByteBuffer encode(java.lang.String);
    public boolean equals(java.lang.Object);
    public static java.nio.charset.Charset forName(java.lang.String);
    public int hashCode();
    public boolean isRegistered();
    public static boolean isSupported(java.lang.String);
    public java.lang.String name();
    public abstract java.nio.charset.CharsetDecoder newDecoder();
    public abstract java.nio.charset.CharsetEncoder newEncoder();
    public java.lang.String toString();


}

-keep class java.nio.charset.CharsetDecoder {
    <init>(java.nio.charset.Charset, float, float);

    public float averageCharsPerByte();
    public java.nio.charset.Charset charset();
    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
    public java.nio.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
    protected abstract java.nio.charset.CoderResult decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer);
    public java.nio.charset.Charset detectedCharset();
    public java.nio.charset.CoderResult flush(java.nio.CharBuffer);
    protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    protected void implReplaceWith(java.lang.String);
    protected void implReset();
    public boolean isAutoDetecting();
    public boolean isCharsetDetected();
    public java.nio.charset.CodingErrorAction malformedInputAction();
    public float maxCharsPerByte();
    public java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetDecoder replaceWith(java.lang.String);
    public java.lang.String replacement();
    public java.nio.charset.CharsetDecoder reset();
    public java.nio.charset.CodingErrorAction unmappableCharacterAction();


}

-keep class java.nio.charset.CharsetEncoder {
    <init>(java.nio.charset.Charset, float, float);
    <init>(java.nio.charset.Charset, float, float, byte[]);

    public float averageBytesPerChar();
    public boolean canEncode(char);
    public boolean canEncode(java.lang.CharSequence);
    public java.nio.charset.Charset charset();
    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
    public java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
    protected abstract java.nio.charset.CoderResult encodeLoop(java.nio.CharBuffer, java.nio.ByteBuffer);
    public java.nio.charset.CoderResult flush(java.nio.ByteBuffer);
    protected java.nio.charset.CoderResult implFlush(java.nio.ByteBuffer);
    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    protected void implReplaceWith(byte[]);
    protected void implReset();
    public boolean isLegalReplacement(byte[]);
    public java.nio.charset.CodingErrorAction malformedInputAction();
    public float maxBytesPerChar();
    public java.nio.charset.CharsetEncoder onMalformedInput(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetEncoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetEncoder replaceWith(byte[]);
    public byte[] replacement();
    public java.nio.charset.CharsetEncoder reset();
    public java.nio.charset.CodingErrorAction unmappableCharacterAction();


}

-keep class java.nio.charset.CoderResult {

    public boolean isError();
    public boolean isMalformed();
    public boolean isOverflow();
    public boolean isUnderflow();
    public boolean isUnmappable();
    public int length();
    public static synchronized java.nio.charset.CoderResult malformedForLength(int);
    public void throwException();
    public java.lang.String toString();
    public static synchronized java.nio.charset.CoderResult unmappableForLength(int);


    public static java.nio.charset.CoderResult OVERFLOW;
    public static java.nio.charset.CoderResult UNDERFLOW;
}

-keep class java.nio.charset.CodingErrorAction {

    public java.lang.String toString();


    public static java.nio.charset.CodingErrorAction IGNORE;
    public static java.nio.charset.CodingErrorAction REPLACE;
    public static java.nio.charset.CodingErrorAction REPORT;
}

-keep class java.nio.charset.MalformedInputException {
    <init>(int);

    public int getInputLength();
    public java.lang.String getMessage();


}

-keep class java.nio.charset.UnmappableCharacterException {
    <init>(int);

    public int getInputLength();
    public java.lang.String getMessage();


}

-keep class java.security.CodeSigner {
    <init>(java.security.cert.CertPath, java.security.Timestamp);

    public boolean equals(java.lang.Object);
    public java.security.cert.CertPath getSignerCertPath();
    public java.security.Timestamp getTimestamp();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.security.CodeSource {
    <init>(java.net.URL, java.security.cert.Certificate[]);
    <init>(java.net.URL, java.security.CodeSigner[]);

    public java.security.cert.Certificate[] getCertificates();
    public java.security.CodeSigner[] getCodeSigners();
    public java.net.URL getLocation();
    public boolean implies(java.security.CodeSource);


}

-keep class java.security.GeneralSecurityException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.InvalidKeyException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.KeyException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchAlgorithmException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchProviderException {
    <init>(java.lang.String);
    <init>();



}

-keep class java.security.Permission {
    <init>(java.lang.String);

    public void checkGuard(java.lang.Object);
    public abstract java.lang.String getActions();
    public java.lang.String getName();
    public abstract boolean implies(java.security.Permission);
    public java.security.PermissionCollection newPermissionCollection();


}

-keep class java.security.PermissionCollection {
    <init>();

    public abstract void add(java.security.Permission);
    public abstract java.util.Enumeration elements();
    public abstract boolean implies(java.security.Permission);
    public boolean isReadOnly();
    public void setReadOnly();


}

-keep class java.security.Principal {

    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.String getName();
    public abstract int hashCode();
    public abstract java.lang.String toString();


}

-keep class java.security.ProtectionDomain {
    <init>(java.security.CodeSource, java.security.PermissionCollection);
    <init>(java.security.CodeSource, java.security.PermissionCollection, java.lang.ClassLoader, java.security.Principal[]);

    public java.lang.ClassLoader getClassLoader();
    public java.security.CodeSource getCodeSource();
    public java.security.PermissionCollection getPermissions();
    public java.security.Principal[] getPrincipals();
    public boolean implies(java.security.Permission);


}

-keep class java.security.PublicKey {



    public static long serialVersionUID;
}

-keep class java.security.SignatureException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.Timestamp {
    <init>(java.util.Date, java.security.cert.CertPath);

    public boolean equals(java.lang.Object);
    public java.security.cert.CertPath getSignerCertPath();
    public java.util.Date getTimestamp();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.security.cert.CertPath {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    public abstract java.util.List getCertificates();
    public abstract byte[] getEncoded();
    public abstract byte[] getEncoded(java.lang.String);
    public abstract java.util.Iterator getEncodings();
    public java.lang.String getType();
    public int hashCode();
    public java.lang.String toString();
    protected java.lang.Object writeReplace();


}

-keep class java.security.cert.Certificate {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    public abstract byte[] getEncoded();
    public abstract java.security.PublicKey getPublicKey();
    public java.lang.String getType();
    public int hashCode();
    public abstract java.lang.String toString();
    public abstract void verify(java.security.PublicKey);
    public abstract void verify(java.security.PublicKey, java.lang.String);
    protected java.lang.Object writeReplace();


}

-keep class java.security.cert.CertificateEncodingException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertificateException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.util.AbstractCollection {
    <init>();

    public boolean add(java.lang.Object);
    public boolean addAll(java.util.Collection);
    public void clear();
    public boolean contains(java.lang.Object);
    public boolean containsAll(java.util.Collection);
    public boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public boolean remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public boolean retainAll(java.util.Collection);
    public abstract int size();
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public java.lang.String toString();


}

-keep class java.util.AbstractList {
    <init>();

    public void add(int, java.lang.Object);
    public boolean add(java.lang.Object);
    public boolean addAll(int, java.util.Collection);
    public void clear();
    public boolean equals(java.lang.Object);
    public abstract java.lang.Object get(int);
    public int hashCode();
    public int indexOf(java.lang.Object);
    public java.util.Iterator iterator();
    public int lastIndexOf(java.lang.Object);
    public java.util.ListIterator listIterator();
    public java.util.ListIterator listIterator(int);
    public java.lang.Object remove(int);
    protected void removeRange(int, int);
    public java.lang.Object set(int, java.lang.Object);
    public java.util.List subList(int, int);


    protected transient int modCount;
}

-keep class java.util.AbstractMap {
    <init>();

    public void clear();
    protected java.lang.Object clone();
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public abstract java.util.Set entrySet();
    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.Object);
    public int hashCode();
    public boolean isEmpty();
    public java.util.Set keySet();
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(java.util.Map);
    public java.lang.Object remove(java.lang.Object);
    public int size();
    public java.lang.String toString();
    public java.util.Collection values();


}

-keep class java.util.ArrayList {
    <init>(int);
    <init>();
    <init>(java.util.Collection);

    public boolean add(java.lang.Object);
    public void add(int, java.lang.Object);
    public boolean addAll(java.util.Collection);
    public boolean addAll(int, java.util.Collection);
    public void clear();
    public java.lang.Object clone();
    public boolean contains(java.lang.Object);
    public void ensureCapacity(int);
    public boolean equals(java.lang.Object);
    public java.lang.Object get(int);
    public int hashCode();
    public int indexOf(java.lang.Object);
    public boolean isEmpty();
    public java.util.Iterator iterator();
    public int lastIndexOf(java.lang.Object);
    public java.lang.Object remove(int);
    public boolean remove(java.lang.Object);
    protected void removeRange(int, int);
    public java.lang.Object set(int, java.lang.Object);
    public int size();
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public void trimToSize();


}

-keep class java.util.Collection {

    public abstract boolean add(java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public abstract boolean retainAll(java.util.Collection);
    public abstract int size();
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.Comparator {

    public abstract int compare(java.lang.Object, java.lang.Object);
    public abstract boolean equals(java.lang.Object);


}

-keep class java.util.Date {
    <init>();
    <init>(int, int, int);
    <init>(int, int, int, int, int);
    <init>(int, int, int, int, int, int);
    <init>(long);
    <init>(java.lang.String);

    public static long UTC(int, int, int, int, int, int);
    public boolean after(java.util.Date);
    public boolean before(java.util.Date);
    public java.lang.Object clone();
    public int compareTo(java.util.Date);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public int getDate();
    public int getDay();
    public int getHours();
    public int getMinutes();
    public int getMonth();
    public int getSeconds();
    public long getTime();
    public int getTimezoneOffset();
    public int getYear();
    public int hashCode();
    public static long parse(java.lang.String);
    public void setDate(int);
    public void setHours(int);
    public void setMinutes(int);
    public void setMonth(int);
    public void setSeconds(int);
    public void setTime(long);
    public void setYear(int);
    public java.lang.String toGMTString();
    public java.lang.String toLocaleString();
    public java.lang.String toString();


}

-keep class java.util.Enumeration {

    public abstract boolean hasMoreElements();
    public abstract java.lang.Object nextElement();


}

-keep class java.util.HashMap {
    <init>();
    <init>(int);
    <init>(int, float);
    <init>(java.util.Map);

    public void clear();
    public java.lang.Object clone();
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public java.util.Set entrySet();
    public java.lang.Object get(java.lang.Object);
    public boolean isEmpty();
    public java.util.Set keySet();
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(java.util.Map);
    public java.lang.Object remove(java.lang.Object);
    public int size();
    public java.util.Collection values();


}

-keep class java.util.Iterator {

    public abstract boolean hasNext();
    public abstract java.lang.Object next();
    public abstract void remove();


}

-keep class java.util.List {

    public abstract void add(int, java.lang.Object);
    public abstract boolean add(java.lang.Object);
    public abstract boolean addAll(int, java.util.Collection);
    public abstract boolean addAll(java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.Object get(int);
    public abstract int hashCode();
    public abstract int indexOf(java.lang.Object);
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public abstract int lastIndexOf(java.lang.Object);
    public abstract java.util.ListIterator listIterator();
    public abstract java.util.ListIterator listIterator(int);
    public abstract java.lang.Object remove(int);
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public abstract boolean retainAll(java.util.Collection);
    public abstract java.lang.Object set(int, java.lang.Object);
    public abstract int size();
    public abstract java.util.List subList(int, int);
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.ListIterator {

    public abstract void add(java.lang.Object);
    public abstract boolean hasNext();
    public abstract boolean hasPrevious();
    public abstract java.lang.Object next();
    public abstract int nextIndex();
    public abstract java.lang.Object previous();
    public abstract int previousIndex();
    public abstract void remove();
    public abstract void set(java.lang.Object);


}

-keep class java.util.Locale {
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);

    public java.lang.Object clone();
    public boolean equals(java.lang.Object);
    public static java.util.Locale forLanguageTag(java.lang.String);
    public static java.util.Locale[] getAvailableLocales();
    public java.lang.String getCountry();
    public static java.util.Locale getDefault();
    public java.lang.String getDisplayCountry();
    public java.lang.String getDisplayCountry(java.util.Locale);
    public java.lang.String getDisplayLanguage();
    public java.lang.String getDisplayLanguage(java.util.Locale);
    public java.lang.String getDisplayName();
    public java.lang.String getDisplayName(java.util.Locale);
    public java.lang.String getDisplayScript();
    public java.lang.String getDisplayScript(java.util.Locale);
    public java.lang.String getDisplayVariant();
    public java.lang.String getDisplayVariant(java.util.Locale);
    public java.lang.String getExtension(char);
    public java.util.Set getExtensionKeys();
    public java.lang.String getISO3Country();
    public java.lang.String getISO3Language();
    public static java.lang.String[] getISOCountries();
    public static java.lang.String[] getISOLanguages();
    public java.lang.String getLanguage();
    public java.lang.String getScript();
    public java.util.Set getUnicodeLocaleAttributes();
    public java.util.Set getUnicodeLocaleKeys();
    public java.lang.String getUnicodeLocaleType(java.lang.String);
    public java.lang.String getVariant();
    public synchronized int hashCode();
    public static synchronized void setDefault(java.util.Locale);
    public java.lang.String toLanguageTag();
    public java.lang.String toString();


    public static java.util.Locale CANADA;
    public static java.util.Locale CANADA_FRENCH;
    public static java.util.Locale CHINA;
    public static java.util.Locale CHINESE;
    public static java.util.Locale ENGLISH;
    public static java.util.Locale FRANCE;
    public static java.util.Locale FRENCH;
    public static java.util.Locale GERMAN;
    public static java.util.Locale GERMANY;
    public static java.util.Locale ITALIAN;
    public static java.util.Locale ITALY;
    public static java.util.Locale JAPAN;
    public static java.util.Locale JAPANESE;
    public static java.util.Locale KOREA;
    public static java.util.Locale KOREAN;
    public static java.util.Locale PRC;
    public static char PRIVATE_USE_EXTENSION;
    public static java.util.Locale ROOT;
    public static java.util.Locale SIMPLIFIED_CHINESE;
    public static java.util.Locale TAIWAN;
    public static java.util.Locale TRADITIONAL_CHINESE;
    public static java.util.Locale UK;
    public static char UNICODE_LOCALE_EXTENSION;
    public static java.util.Locale US;
}

-keep class java.util.Map {

    public abstract void clear();
    public abstract boolean containsKey(java.lang.Object);
    public abstract boolean containsValue(java.lang.Object);
    public abstract java.util.Set entrySet();
    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.Object get(java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Set keySet();
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract void putAll(java.util.Map);
    public abstract java.lang.Object remove(java.lang.Object);
    public abstract int size();
    public abstract java.util.Collection values();


}

-keep class java.util.Map$Entry {

    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.Object getKey();
    public abstract java.lang.Object getValue();
    public abstract int hashCode();
    public abstract java.lang.Object setValue(java.lang.Object);


}

-keep class java.util.Set {

    public abstract boolean add(java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public abstract boolean retainAll(java.util.Collection);
    public abstract int size();
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.SortedMap {

    public abstract java.util.Comparator comparator();
    public abstract java.lang.Object firstKey();
    public abstract java.util.SortedMap headMap(java.lang.Object);
    public abstract java.lang.Object lastKey();
    public abstract java.util.SortedMap subMap(java.lang.Object, java.lang.Object);
    public abstract java.util.SortedMap tailMap(java.lang.Object);


}

-keep class org.xmlpull.v1.XmlPullParser {

    public abstract void defineEntityReplacementText(java.lang.String, java.lang.String);
    public abstract int getAttributeCount();
    public abstract java.lang.String getAttributeName(int);
    public abstract java.lang.String getAttributeNamespace(int);
    public abstract java.lang.String getAttributePrefix(int);
    public abstract java.lang.String getAttributeType(int);
    public abstract java.lang.String getAttributeValue(int);
    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
    public abstract int getColumnNumber();
    public abstract int getDepth();
    public abstract int getEventType();
    public abstract boolean getFeature(java.lang.String);
    public abstract java.lang.String getInputEncoding();
    public abstract int getLineNumber();
    public abstract java.lang.String getName();
    public abstract java.lang.String getNamespace(java.lang.String);
    public abstract java.lang.String getNamespace();
    public abstract int getNamespaceCount(int);
    public abstract java.lang.String getNamespacePrefix(int);
    public abstract java.lang.String getNamespaceUri(int);
    public abstract java.lang.String getPositionDescription();
    public abstract java.lang.String getPrefix();
    public abstract java.lang.Object getProperty(java.lang.String);
    public abstract java.lang.String getText();
    public abstract char[] getTextCharacters(int[]);
    public abstract boolean isAttributeDefault(int);
    public abstract boolean isEmptyElementTag();
    public abstract boolean isWhitespace();
    public abstract int next();
    public abstract int nextTag();
    public abstract java.lang.String nextText();
    public abstract int nextToken();
    public abstract void require(int, java.lang.String, java.lang.String);
    public abstract void setFeature(java.lang.String, boolean);
    public abstract void setInput(java.io.Reader);
    public abstract void setInput(java.io.InputStream, java.lang.String);
    public abstract void setProperty(java.lang.String, java.lang.Object);


    public static int CDSECT;
    public static int COMMENT;
    public static int DOCDECL;
    public static int END_DOCUMENT;
    public static int END_TAG;
    public static int ENTITY_REF;
    public static java.lang.String FEATURE_PROCESS_DOCDECL;
    public static java.lang.String FEATURE_PROCESS_NAMESPACES;
    public static java.lang.String FEATURE_REPORT_NAMESPACE_ATTRIBUTES;
    public static java.lang.String FEATURE_VALIDATION;
    public static int IGNORABLE_WHITESPACE;
    public static java.lang.String NO_NAMESPACE;
    public static int PROCESSING_INSTRUCTION;
    public static int START_DOCUMENT;
    public static int START_TAG;
    public static int TEXT;
    public static java.lang.String[] TYPES;
}

-keep class org.xmlpull.v1.XmlPullParserException {
    <init>(java.lang.String);
    <init>(java.lang.String, org.xmlpull.v1.XmlPullParser, java.lang.Throwable);

    public int getColumnNumber();
    public java.lang.Throwable getDetail();
    public int getLineNumber();
    public void printStackTrace();


    protected int column;
    protected java.lang.Throwable detail;
    protected int row;
}

-keep class org.xmlpull.v1.XmlSerializer {

    public abstract org.xmlpull.v1.XmlSerializer attribute(java.lang.String, java.lang.String, java.lang.String);
    public abstract void cdsect(java.lang.String);
    public abstract void comment(java.lang.String);
    public abstract void docdecl(java.lang.String);
    public abstract void endDocument();
    public abstract org.xmlpull.v1.XmlSerializer endTag(java.lang.String, java.lang.String);
    public abstract void entityRef(java.lang.String);
    public abstract void flush();
    public abstract int getDepth();
    public abstract boolean getFeature(java.lang.String);
    public abstract java.lang.String getName();
    public abstract java.lang.String getNamespace();
    public abstract java.lang.String getPrefix(java.lang.String, boolean);
    public abstract java.lang.Object getProperty(java.lang.String);
    public abstract void ignorableWhitespace(java.lang.String);
    public abstract void processingInstruction(java.lang.String);
    public abstract void setFeature(java.lang.String, boolean);
    public abstract void setOutput(java.io.OutputStream, java.lang.String);
    public abstract void setOutput(java.io.Writer);
    public abstract void setPrefix(java.lang.String, java.lang.String);
    public abstract void setProperty(java.lang.String, java.lang.Object);
    public abstract void startDocument(java.lang.String, java.lang.Boolean);
    public abstract org.xmlpull.v1.XmlSerializer startTag(java.lang.String, java.lang.String);
    public abstract org.xmlpull.v1.XmlSerializer text(java.lang.String);
    public abstract org.xmlpull.v1.XmlSerializer text(char[], int, int);


}

