/**
* Asks the user to add an account of a specified type. The authenticator
* for this account type processes this request with the appropriate user
* interface. If the user does elect to create a new account, the account
* name is returned.
* <p>
* <p>This method may be called from any thread, but the returned
* {@link AccountManagerFuture} must not be used on the main thread.
* <p>
*
*/
public AccountManagerFuture<Bundle> addAccount(final int userId, final String accountType,
final String authTokenType, final String[] requiredFeatures,
final Bundle addAccountOptions,
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (accountType == null) throw new IllegalArgumentException("accountType is null");
final Bundle optionsIn = new Bundle();
if (addAccountOptions != null) {
optionsIn.putAll(addAccountOptions);
}
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, "android");
return new AmsTask(activity, handler, callback) {
@Override
public void doWork() throws RemoteException {
addAccount(userId, mResponse, accountType, authTokenType,
requiredFeatures, activity != null, optionsIn);
}
}.start();
}
java类android.accounts.AccountManagerCallback的实例源码
VAccountManager.java 文件源码
项目:TPlayer
阅读 24
收藏 0
点赞 0
评论 0
MyAccountActivity.java 文件源码
项目:aptoide-client
阅读 27
收藏 0
点赞 0
评论 0
private void removeAccount(final Account account) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.edit().remove("queueName").apply();
ContentResolver.setIsSyncable(account, WEBINSTALL_SYNC_AUTHORITY, 0);
ContentResolver.setSyncAutomatically(account, MyAccountActivity.WEBINSTALL_SYNC_AUTHORITY, false);
if(Build.VERSION.SDK_INT>=8){
ContentResolver.removePeriodicSync(account, MyAccountActivity.WEBINSTALL_SYNC_AUTHORITY, new Bundle());
}
mAccountManager.removeAccount(account, new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
addAccount();
finish();
}
}, null);
}
MyAccountActivity.java 文件源码
项目:aptoide-client
阅读 25
收藏 0
点赞 0
评论 0
private void addAccount() {
mAccountManager.addAccount(Aptoide.getConfiguration().getAccountType(), AptoideConfiguration.AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, null, null, this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bnd = future.getResult();
if (bnd.containsKey(AccountManager.KEY_AUTHTOKEN)) {
setContentView(R.layout.form_logout);
} else {
finish();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
}
RecordListing.java 文件源码
项目:enlightns-android
阅读 27
收藏 0
点赞 0
评论 0
private void addNewAccount() {
mAccountManager.addAccount(EnlightnsAccountAuthenticator.ACCOUNT_TYPE,
EnlightnsAccountAuthenticator.AUTH_TOKEN_TYPE, null, null, this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bnd = future.getResult();
showMessage(getString(R.string.successful_login_toast));
new GetUserRecordsTask().execute();
Log.d(TAG, "AddNewAccount Bundle is " + bnd);
} catch (OperationCanceledException oce) {
Log.d(TAG, "Operation cancelled, no account available, exiting...", oce);
finish();
} catch (Exception e) {
Log.w(TAG, "Exception", e);
showMessage(getString(R.string.login_error));
}
}
}, null);
}
AuthenticatorManager.java 文件源码
项目:account-authenticator
阅读 17
收藏 0
点赞 0
评论 0
public void getAccessToken(String accountName, String authTokenType, Bundle options) {
if (accountName == null || accountName.trim().isEmpty()) {
Toast.makeText(context, context.getString(R.string.auth_msg_account_name_is_null), Toast.LENGTH_SHORT).show();
return;
}
Account account;
if (options == null) {
options = new Bundle();
}
Handler handler = null;
if (authTokenType == null) {
authTokenType = authTokenTypes[0];
} else {
if (!isAuthTokenValid(authTokenType, authTokenTypes))
throw new IllegalArgumentException("Authentication token type is not valid.");
}
if (isCallbackRunInBackgroundThread) handler = setHandler(CALLBACK_THREAD_NAME);
account = new Account(accountName, accountType);
AccountManagerCallback accountManagerCallback = null;
boolean isAddingNewAccount = options.getBoolean(AuthenticatorManager.KEY_IS_ADDING_NEW_ACCOUNT, false);
if (!isAddingNewAccount) {
accountManagerCallback = getAccessTokenCallBack(authTokenType, options, account);
}
getAccessTokenFromAccountManager(account, authTokenType, options, accountManagerCallback, handler);
}
MainPresenter.java 文件源码
项目:Pioneer
阅读 41
收藏 0
点赞 0
评论 0
private void fetchPioneerAccount() {
String ACCOUNT_TYPE = "com.github.baoti";
String AUTH_TOKEN_TYPE = "pioneer";
accountManager.getAuthTokenByFeatures(ACCOUNT_TYPE, AUTH_TOKEN_TYPE, null,
getView().getActivity(), null, null,
new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle result = future.getResult();
String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
String type = result.getString(AccountManager.KEY_ACCOUNT_TYPE);
String token = result.getString(AccountManager.KEY_AUTHTOKEN);
toaster.show(
String.format("Auth result - name: %s, type: %s, token: %s",
name, type, token));
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
}
MainActivity.java 文件源码
项目:unicap
阅读 23
收藏 0
点赞 0
评论 0
private void logout() {
final Student currentStudent = UnicapApplication.getCurrentStudent();
if (currentStudent == null) {
restartActivity();
} else {
Account account = new Account(currentStudent.registration, AccountGeneral.ACCOUNT_TYPE);
accountManager.removeAccount(account, new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
UnicapDataManager.cleanUserData(currentStudent.registration);
UnicapApplication.setCurrentAccount(null);
UnicapApplication.setCurrentStudent(null);
restartActivity();
}
}, null);
}
}
UserManager.java 文件源码
项目:moment-for-android-wear
阅读 32
收藏 0
点赞 0
评论 0
/**
* Removes current account
*/
private void removeAccount() {
Timber.d("Removing account");
Account account = getAccount();
if (account != null) {
isDeletingCredentials = true;
accountManager.removeAccount(account, new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
isDeletingCredentials = false;
currentAccount = null;
}
}, null);
}
preferences.removeAllUserDetails();
friendsTable.deleteAll();
momentTable.deleteAll();
}
AuthenticationManager.java 文件源码
项目:csci578
阅读 30
收藏 0
点赞 0
评论 0
public String getToken() {
// Get Account
AccountManager manager = AccountManager.get(HomeScreenActivity.getAppContext());
Account account = manager.getAccountsByType("us.grahn.trojanow")[0];
// Get the auth token
Bundle options = null;
Activity activity = null;
AccountManagerCallback<Bundle> callback = null;
Handler handler = null;
AccountManagerFuture<Bundle> future = manager.getAuthToken(
account, AuthenticationService.AUTH_TYPE, options, activity, callback, handler);
try {
return future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
ToolbarActivity.java 文件源码
项目:decider-android
阅读 27
收藏 0
点赞 0
评论 0
@Override
public AccountManagerFuture<Bundle> getAuthToken(final AccountManagerCallback<Bundle> cb) {
if (authInProgress.get()) {
return new CanceledAccountManagerFuture<>();
} else {
authInProgress.set(true);
return AuthTokenGetHelper.getAuthTokenByFeatures(this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
if (cb != null) {
cb.run(future);
}
authInProgress.set(false);
}
});
}
}
AuthenticationManager.java 文件源码
项目:android-auth-manager
阅读 27
收藏 0
点赞 0
评论 0
/**
* Logs out the account, keeping it on the device
* @param account - the logged in {@link android.accounts.Account}. Must NOT be null
* @param authTokenType - the auth token type. Must NOT be null or empty
*/
public void logout(@NonNull final Account account, @NonNull String authTokenType) {
validateAccount(account);
validateAccountName(account.name);
validateAccountType(account.type);
validateAuthTokenType(authTokenType);
final String authToken = mAccountManager.peekAuthToken(account, authTokenType);
final String accountType = account.type;
mAccountManager.removeAccount(account, new AccountManagerCallback<Boolean>() {
@Override public void run(AccountManagerFuture<Boolean> future) {
if (!TextUtils.isEmpty(authToken)) {
if (DEBUG) {
Log.d(String.format(DEBUG_TAG, TAG), "Removing account with name " + account.name + " and type " + accountType
+ " from AccountManager and invalidating auth token " + authToken);
}
notifyCallbacksAuthenticationInvalidated(authToken);
mAccountManager.invalidateAuthToken(accountType, authToken);
}
}
}, new Handler(Looper.getMainLooper()));
}
MainPresenter.java 文件源码
项目:Pioneer
阅读 29
收藏 0
点赞 0
评论 0
private void fetchPioneerAccount() {
String ACCOUNT_TYPE = "com.github.baoti";
String AUTH_TOKEN_TYPE = "pioneer";
accountManager.getAuthTokenByFeatures(ACCOUNT_TYPE, AUTH_TOKEN_TYPE, null,
getView().getActivity(), null, null,
new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle result = future.getResult();
String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
String type = result.getString(AccountManager.KEY_ACCOUNT_TYPE);
String token = result.getString(AccountManager.KEY_AUTHTOKEN);
toaster.show(
String.format("Auth result - name: %s, type: %s, token: %s",
name, type, token));
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
}
AccountsActivity.java 文件源码
项目:pimatic-android
阅读 30
收藏 0
点赞 0
评论 0
/**
* Add new account to the account manager
*/
private void addNewAccount() {
org.pimatic.model.AccountManager.getInstance(getActivity()).addNewAccount(this.getActivity(), new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bnd = future.getResult();
showMessage("Account was created");
Log.d("udinic", "AddNewAccount Bundle is " + bnd);
} catch (Exception e) {
e.printStackTrace();
showMessage(e.getMessage());
}
}
});
}
IodineAuthUtils.java 文件源码
项目:thyroxine
阅读 22
收藏 0
点赞 0
评论 0
/**
* Attempts to log out by removing the current Iodine account.
* This method does not change state on the server.
* After finishing, this method will call finish() on the passed activity.
* @param activity The activity used as a context.
*/
public static void attemptLogout(@NonNull final Activity activity) {
final AccountManager am = AccountManager.get(activity);
final Account account = getIodineAccount(activity);
final AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
try {
Boolean result = future.getResult();
if (!result) {
throw new Exception("Result is false");
}
} catch (Exception e) {
Log.e(TAG, "Error trying to remove account", e);
String message = activity.getString(R.string.error_removing_account, e.toString());
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
return;
}
Log.i(TAG, "Successfully removed account.");
Toast.makeText(activity, R.string.sign_out_success, Toast.LENGTH_LONG).show();
}
};
am.removeAccount(account, callback, null);
activity.finish();
}
ContentManager.java 文件源码
项目:retrowatch
阅读 28
收藏 0
点赞 0
评论 0
public synchronized void queryGmailLabels() {
// Get the account list, and pick the user specified address
AccountManager.get(mContext).getAccountsByTypeAndFeatures(ACCOUNT_TYPE_GOOGLE, FEATURES_MAIL,
new AccountManagerCallback<Account[]>() {
@Override
public void run(AccountManagerFuture<Account[]> future) {
Account[] accounts = null;
try {
accounts = future.getResult();
} catch (OperationCanceledException oce) {
Logs.e(TAG, "Got OperationCanceledException: "+oce.toString());
} catch (IOException ioe) {
Logs.e(TAG, "Got OperationCanceledException: "+ioe.toString());
} catch (AuthenticatorException ae) {
Logs.e(TAG, "Got OperationCanceledException: "+ae.toString());
}
mGmailUnreadCount = onAccountResults(accounts);
addGmailToContentList(mGmailUnreadCount);
Logs.d(TAG, "# Gmail unread count = "+ mGmailUnreadCount);
}
}, null /* handler */);
}
ContentManager.java 文件源码
项目:retrowatch
阅读 31
收藏 0
点赞 0
评论 0
public synchronized void queryGmailLabels() {
// Get the account list, and pick the user specified address
AccountManager.get(mContext).getAccountsByTypeAndFeatures(ACCOUNT_TYPE_GOOGLE, FEATURES_MAIL,
new AccountManagerCallback<Account[]>() {
@Override
public void run(AccountManagerFuture<Account[]> future) {
Account[] accounts = null;
try {
accounts = future.getResult();
} catch (OperationCanceledException oce) {
Logs.e(TAG, "Got OperationCanceledException: "+oce.toString());
} catch (IOException ioe) {
Logs.e(TAG, "Got OperationCanceledException: "+ioe.toString());
} catch (AuthenticatorException ae) {
Logs.e(TAG, "Got OperationCanceledException: "+ae.toString());
}
mGmailUnreadCount = onAccountResults(accounts);
addGmailToContentList(mGmailUnreadCount);
Logs.d(TAG, "# Gmail unread count = "+ mGmailUnreadCount);
}
}, null /* handler */);
}
SmackPlusSetup.java 文件源码
项目:SmackPlus
阅读 18
收藏 0
点赞 0
评论 0
private void getToken(final Account account, final int position) {
AccountManager am = AccountManager.get(this);
if (am == null)
return;
am.getAuthToken(account, "grandcentral", null, this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
settings.edit()
.putString("account", account.name)
.apply();
Intent intent = new Intent(SmackPlusSetup.this, SmackPlusService.class);
intent.setAction(SmackPlusService.ACCOUNT_CHANGED);
startService(intent);
lv.setItemChecked(position, true);
lv.requestLayout();
Log.i(LOGTAG, "Token retrieved.");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}, new Handler());
}
AmsTask.java 文件源码
项目:TPlayer
阅读 23
收藏 0
点赞 0
评论 0
public AmsTask(Activity activity, Handler handler, AccountManagerCallback<Bundle> callback) {
super(new Callable<Bundle>() {
@Override
public Bundle call() throws Exception {
throw new IllegalStateException("this should never be called");
}
});
mHandler = handler;
mCallback = callback;
mActivity = activity;
mResponse = new Response();
}
AmsTask.java 文件源码
项目:TPlayer
阅读 22
收藏 0
点赞 0
评论 0
private void postToHandler(Handler handler, final AccountManagerCallback<Bundle> callback,
final AccountManagerFuture<Bundle> future) {
handler = handler == null ? VirtualRuntime.getUIHandler() : handler;
handler.post(new Runnable() {
@Override
public void run() {
callback.run(future);
}
});
}
AuthUtils.java 文件源码
项目:AOSP-Kayboard-7.1.2
阅读 33
收藏 0
点赞 0
评论 0
/**
* @see AccountManager#getAuthToken(
* Account, String, Bundle, boolean, AccountManagerCallback, Handler)
*/
public AccountManagerFuture<Bundle> getAuthToken(final Account account,
final String authTokenType, final Bundle options, final boolean notifyAuthFailure,
final AccountManagerCallback<Bundle> callback, final Handler handler) {
return mAccountManager.getAuthToken(account, authTokenType, options, notifyAuthFailure,
callback, handler);
}
APIUtility.java 文件源码
项目:defect-party
阅读 25
收藏 0
点赞 0
评论 0
@Override
protected void onPreExecute() {
mCallback = new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> futureManager) {
// Unless the account creation was cancelled, try logging in again
// after the account has been created.
Log.i("ToFlux", "sent to flux");
}
};
}
APIUtility.java 文件源码
项目:defect-party
阅读 25
收藏 0
点赞 0
评论 0
/**
* Makes a GET request and parses the received JSON string as a Map.
*/
public static Map getJson(OIDCAccountManager accountManager, String url, Account account,
AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
String jsonString = makeRequest(accountManager, HttpRequest.METHOD_GET, url, account, callback);
Log.i("APIUtility", jsonString);
return new Gson().fromJson(jsonString, Map.class);
}
APIUtility.java 文件源码
项目:defect-party
阅读 22
收藏 0
点赞 0
评论 0
public static List<JSONObject> getJsonList(OIDCAccountManager accountManager, String url, Account account,
AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
String jsonString = makeRequest(accountManager, HttpRequest.METHOD_GET, url, account, callback);
Log.i("APIUtility", jsonString);
return new Gson().fromJson(jsonString, List.class);
}
APIUtility.java 文件源码
项目:defect-party
阅读 18
收藏 0
点赞 0
评论 0
/**
* Makes an arbitrary HTTP request using the provided account.
*
* If the request doesn't execute successfully on the first try, the tokens will be refreshed
* and the request will be retried. If the second try fails, an exception will be raised.
*/
public static String makeRequest(OIDCAccountManager accountManager, String method, String url, Account account,
AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
return makeRequest(accountManager, method, url, "", account, true, callback);
}
APIUtility.java 文件源码
项目:defect-party
阅读 19
收藏 0
点赞 0
评论 0
private static String makeRequest(OIDCAccountManager accountManager, String method, String url, String body, Account account,
boolean doRetry, AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
String accessToken = accountManager.getAccessToken(account, callback);
String cookies = accountManager.getCookies(account, callback);
// Prepare an API request using the accessToken
HttpRequest request = new HttpRequest(url, method);
request = prepareApiRequest(request, accessToken, cookies);
if (body != "") {
request.send(body);
}
if (request.ok()) {
return request.body();
} else {
int code = request.code();
String requestContent = "empty body";
try {
requestContent = request.body();
} catch (HttpRequest.HttpRequestException e) {
//Nothing to do, the response has no body or couldn't fetch it
e.printStackTrace();
}
if (doRetry && (code == HTTP_UNAUTHORIZED || code == HTTP_FORBIDDEN ||
(code == HTTP_BAD_REQUEST && (requestContent.contains("invalid_grant") || requestContent.contains("Access Token not valid"))))) {
// We're being denied access on the first try, let's renew the token and retry
accountManager.invalidateAuthTokens(account);
return makeRequest(accountManager, method, url, body, account, false, callback);
} else {
// An unrecoverable error or the renewed token didn't work either
throw new IOException(request.code() + " " + request.message() + " " + requestContent);
}
}
}
FragmentSignIn.java 文件源码
项目:aptoide-client
阅读 21
收藏 0
点赞 0
评论 0
private void finishLogin(Intent intent) {
String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountPassword = intent.getStringExtra(AccountManager.KEY_PASSWORD);
String token = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
String accountType = Aptoide.getConfiguration().getAccountType();
String authTokenType = AptoideConfiguration.AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS;
final Activity activity = getActivity();
AccountManager.get(getActivity()).addAccount(accountType, authTokenType, new String[]{"timelineLogin"}, intent.getExtras(), getActivity(), new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
if (activity != null) {
activity.startService(new Intent(activity, RabbitMqService.class));
}
ContentResolver.setSyncAutomatically(account, Aptoide.getConfiguration().getUpdatesSyncAdapterAuthority(), true);
ContentResolver.addPeriodicSync(account, Aptoide.getConfiguration().getUpdatesSyncAdapterAuthority(), new Bundle(), 43200);
ContentResolver.setSyncAutomatically(account, Aptoide.getConfiguration(). getAutoUpdatesSyncAdapterAuthority(), true);
callback = (SignInCallback) getParentFragment();
if (callback != null) callback.loginEnded();
}
}, new Handler(Looper.getMainLooper()));
}
MainActivity.java 文件源码
项目:jogging-app
阅读 20
收藏 0
点赞 0
评论 0
@Override
protected void onPostExecute(final HttpUtil response) {
if (response != null) {
if (response.code() == 200) {
Gson gson = new Gson();
User user = gson.fromJson(response.body().string(), User.class);
Util.setUser(user);
} else if (response.code() == 204) {
Util.logout(MainActivity.this, new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
new AlertDialog.Builder(MainActivity.this)
.setTitle("Logout")
.setMessage("Your account has been deleted")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(MainActivity.this, WelcomeActivity.class));
finish();
}
})
.show();
}
});
}
} else {
Toast.makeText(MainActivity.this, "Can't reach server", Toast.LENGTH_LONG).show();
}
refreshNavView(); // in All cases
}
LoggedActivity.java 文件源码
项目:BeAuthentic
阅读 25
收藏 0
点赞 0
评论 0
@OnClick(R.id.bt_logout)
public void onLoggingOut() {
am.removeAccount(Sessions.getAccount(am), new AccountManagerCallback<Boolean>() {
@Override
public void run(AccountManagerFuture<Boolean> future) {
logout();
}
}, null);
}
APIUtility.java 文件源码
项目:OIDCAndroidLib
阅读 21
收藏 0
点赞 0
评论 0
/**
* Makes a GET request and parses the received JSON string as a Map.
*/
public static Map getJson(OIDCAccountManager accountManager, String url, Account account,
AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
String jsonString = makeRequest(accountManager, HttpRequest.METHOD_GET, url, account, callback);
return new Gson().fromJson(jsonString, Map.class);
}
APIUtility.java 文件源码
项目:OIDCAndroidLib
阅读 27
收藏 0
点赞 0
评论 0
/**
* Makes an arbitrary HTTP request using the provided account.
*
* If the request doesn't execute successfully on the first try, the tokens will be refreshed
* and the request will be retried. If the second try fails, an exception will be raised.
*/
public static String makeRequest(OIDCAccountManager accountManager, String method, String url, Account account,
AccountManagerCallback<Bundle> callback)
throws IOException, UserNotAuthenticatedWrapperException, AuthenticatorException, OperationCanceledException {
return makeRequest(accountManager, method, url, account, true, callback);
}