-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 float getEvBatteryCapacity();
    public abstract int[] getEvConnectorTypes();
    public abstract float getFuelCapacity();
    public abstract int[] getFuelTypes();
    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_ENGINE_ON;
    public static int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE;
    public static int SENSOR_TYPE_EV_BATTERY_LEVEL;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_OPEN;
    public static int SENSOR_TYPE_FUEL_DOOR_OPEN;
    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);


}

