public class AliHBaseMultiClusterConnection extends Object implements org.apache.hadoop.hbase.client.ClusterConnection, Closeable
| 限定符和类型 | 字段和说明 |
|---|---|
protected boolean |
aborted |
protected boolean |
cleanupPool |
protected boolean |
cleanupStandbyPool |
protected boolean |
closed |
protected org.apache.hadoop.conf.Configuration |
conf |
protected DualExecutor |
dualExecutor |
protected boolean |
dualServiceEnable |
protected org.apache.hadoop.conf.Configuration |
standbyConf |
protected long |
switchCount |
protected org.apache.hadoop.hbase.security.User |
user |
| 限定符 | 构造器和说明 |
|---|---|
protected |
AliHBaseMultiClusterConnection(org.apache.hadoop.conf.Configuration conf,
ExecutorService pool,
org.apache.hadoop.hbase.security.User user) |
| 限定符和类型 | 方法和说明 |
|---|---|
void |
abort(String why,
Throwable throwable) |
void |
cacheLocation(org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.RegionLocations regionLocations) |
void |
clearCaches(org.apache.hadoop.hbase.ServerName sn)
Clear any caches that pertain to server name
sn. |
void |
clearRegionCache()
Allows flushing the region cache.
|
void |
clearRegionCache(org.apache.hadoop.hbase.TableName tableName)
Allows flushing the region cache of all locations that pertain to
tableName |
void |
close() |
protected org.apache.hadoop.hbase.client.AsyncProcess |
createAsyncProcess() |
protected org.apache.hadoop.hbase.client.ClusterConnection |
createConnection(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.hbase.security.User user,
ExecutorService pool) |
void |
deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation location)
Deletes cached locations for the specific region.
|
org.apache.hadoop.hbase.client.Admin |
getAdmin()
Retrieve an Admin implementation to administer an HBase cluster.
|
org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.BlockingInterface |
getAdmin(org.apache.hadoop.hbase.ServerName serverName)
Establishes a connection to the region server at the specified address.
|
org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.BlockingInterface |
getAdminForMaster() |
org.apache.hadoop.hbase.client.AsyncProcess |
getAsyncProcess() |
org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicy |
getBackoffPolicy() |
org.apache.hadoop.hbase.client.BufferedMutator |
getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams params)
Retrieve a
BufferedMutator for performing client-side buffering of writes. |
org.apache.hadoop.hbase.client.BufferedMutator |
getBufferedMutator(org.apache.hadoop.hbase.TableName tableName)
Retrieve a
BufferedMutator for performing client-side buffering of writes. |
org.apache.hadoop.hbase.client.BufferedMutator |
getBufferedMutatorByType(org.apache.hadoop.hbase.client.BufferedMutatorParams params) |
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService.BlockingInterface |
getClient(org.apache.hadoop.hbase.ServerName serverName)
Establishes a connection to the region server at the specified address, and returns
a region client protocol.
|
org.apache.hadoop.conf.Configuration |
getConfiguration() |
org.apache.hadoop.hbase.client.ConnectionConfiguration |
getConnectionConfiguration() |
org.apache.hadoop.hbase.client.MetricsConnection |
getConnectionMetrics() |
int |
getCurrentNrHRS() |
DualExecutor |
getDualExecutor() |
org.apache.hadoop.hbase.client.HBaseAdmin |
getHBaseAdmin() |
org.apache.hadoop.hbase.client.Hbck |
getHbck() |
org.apache.hadoop.hbase.client.Hbck |
getHbck(org.apache.hadoop.hbase.ServerName serverName) |
org.apache.hadoop.hbase.client.HTable |
getHTable(org.apache.hadoop.hbase.TableName tableName) |
org.apache.hadoop.hbase.client.HTable |
getHTable(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool,
AliHBaseConstants.ClusterType clusterType,
org.apache.hadoop.hbase.client.ClusterConnection connection,
boolean isStandby) |
org.apache.hadoop.hbase.client.HTable |
getHTableWithStandbyConnection(org.apache.hadoop.hbase.TableName tableName) |
org.apache.hadoop.hbase.client.MasterKeepAliveConnection |
getMaster()
Returns a
MasterKeepAliveConnection to the active master |
org.apache.hadoop.hbase.client.RpcRetryingCallerFactory |
getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration conf)
Returns a new RpcRetryingCallerFactory from the given
Configuration. |
org.apache.hadoop.hbase.client.NonceGenerator |
getNonceGenerator() |
org.apache.hadoop.conf.Configuration |
getOriginalConf() |
org.apache.hadoop.hbase.HRegionLocation |
getRegionLocation(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean reload)
Find region location hosting passed row
|
org.apache.hadoop.hbase.client.RegionLocator |
getRegionLocator(org.apache.hadoop.hbase.TableName tableName)
Retrieve a RegionLocator implementation to inspect region information on a table.
|
org.apache.hadoop.hbase.ipc.RpcControllerFactory |
getRpcControllerFactory() |
org.apache.hadoop.hbase.client.RpcRetryingCallerFactory |
getRpcRetryingCallerFactory() |
org.apache.hadoop.hbase.client.ServerStatisticTracker |
getStatisticsTracker() |
long |
getSwitchCount() |
org.apache.hadoop.hbase.client.Table |
getTable(org.apache.hadoop.hbase.TableName tableName) |
org.apache.hadoop.hbase.client.Table |
getTable(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool)
Retrieve a Table implementation for accessing a table.
|
org.apache.hadoop.hbase.client.TableBuilder |
getTableBuilder(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool) |
org.apache.hadoop.hbase.client.TableState |
getTableState(org.apache.hadoop.hbase.TableName tableName) |
protected ExecutorService |
getThreadPool(int maxThreads,
int coreThreads,
String nameHint,
BlockingQueue<Runnable> passedWorkQueue) |
boolean |
hasCellBlockSupport() |
boolean |
isAborted() |
boolean |
isClosed() |
boolean |
isMasterRunning()
已过时。
this has been deprecated without a replacement
|
boolean |
isTableAvailable(org.apache.hadoop.hbase.TableName tableName,
byte[][] splitKeys)
Use this api to check if the table has been created with the specified number of
splitkeys which was used while creating the given table.
|
boolean |
isTableDisabled(org.apache.hadoop.hbase.TableName tableName) |
boolean |
isTableEnabled(org.apache.hadoop.hbase.TableName tableName)
A table that isTableEnabled == false and isTableDisabled == false
is possible.
|
org.apache.hadoop.hbase.HRegionLocation |
locateRegion(byte[] regionName)
Gets the location of the region of regionName.
|
org.apache.hadoop.hbase.HRegionLocation |
locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row)
Find the location of the region of tableName that row
lives in.
|
org.apache.hadoop.hbase.RegionLocations |
locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean useCache,
boolean retry) |
org.apache.hadoop.hbase.RegionLocations |
locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean useCache,
boolean retry,
int replicaId) |
List<org.apache.hadoop.hbase.HRegionLocation> |
locateRegions(org.apache.hadoop.hbase.TableName tableName)
Gets the locations of all regions in the specified table, tableName.
|
List<org.apache.hadoop.hbase.HRegionLocation> |
locateRegions(org.apache.hadoop.hbase.TableName tableName,
boolean useCache,
boolean offlined)
Gets the locations of all regions in the specified table, tableName.
|
protected void |
onChangeCluster(org.apache.hadoop.conf.Configuration activeConf,
org.apache.hadoop.conf.Configuration standbyConf) |
org.apache.hadoop.hbase.HRegionLocation |
relocateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row)
Find the location of the region of tableName that row
lives in, ignoring any value that might be in the cache.
|
org.apache.hadoop.hbase.RegionLocations |
relocateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
int replicaId)
Find the location of the region of tableName that row
lives in, ignoring any value that might be in the cache.
|
void |
updateCachedLocations(org.apache.hadoop.hbase.TableName tableName,
byte[] regionName,
byte[] rowkey,
Object exception,
org.apache.hadoop.hbase.ServerName source)
Update the location cache.
|
protected volatile long switchCount
protected volatile org.apache.hadoop.conf.Configuration conf
protected volatile org.apache.hadoop.conf.Configuration standbyConf
protected org.apache.hadoop.hbase.security.User user
protected volatile boolean closed
protected volatile boolean aborted
protected volatile boolean cleanupPool
protected volatile boolean cleanupStandbyPool
protected boolean dualServiceEnable
protected DualExecutor dualExecutor
protected AliHBaseMultiClusterConnection(org.apache.hadoop.conf.Configuration conf,
ExecutorService pool,
org.apache.hadoop.hbase.security.User user)
throws IOException
IOExceptionprotected org.apache.hadoop.hbase.client.ClusterConnection createConnection(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.hbase.security.User user,
ExecutorService pool)
throws IOException
IOExceptionprotected org.apache.hadoop.hbase.client.AsyncProcess createAsyncProcess()
protected ExecutorService getThreadPool(int maxThreads, int coreThreads, String nameHint, BlockingQueue<Runnable> passedWorkQueue)
protected void onChangeCluster(org.apache.hadoop.conf.Configuration activeConf,
org.apache.hadoop.conf.Configuration standbyConf)
throws IOException
IOExceptionpublic long getSwitchCount()
@Deprecated public boolean isMasterRunning() throws org.apache.hadoop.hbase.MasterNotRunningException, org.apache.hadoop.hbase.ZooKeeperConnectionException
isMasterRunning 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionorg.apache.hadoop.hbase.MasterNotRunningExceptionorg.apache.hadoop.hbase.ZooKeeperConnectionExceptionpublic boolean isTableAvailable(org.apache.hadoop.hbase.TableName tableName,
byte[][] splitKeys)
throws IOException
isTableAvailable 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - tableNamesplitKeys - splitKeys used while creating tableIOException - if a remote or network exception occurspublic org.apache.hadoop.hbase.HRegionLocation locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row)
throws IOException
locateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - name of the table row is inrow - row key you're trying to find the region ofIOException - if a remote or network exception occurspublic void clearRegionCache()
clearRegionCache 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic void cacheLocation(org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.RegionLocations regionLocations)
cacheLocation 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic void clearRegionCache(org.apache.hadoop.hbase.TableName tableName)
tableNameclearRegionCache 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - Name of the table whose regions we are to remove from
cache.public void deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation location)
deleteCachedRegionLocation 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionlocation - The location object for the region, to be purged from cache.public org.apache.hadoop.hbase.HRegionLocation relocateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row)
throws IOException
relocateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - name of the table row is inrow - row key you're trying to find the region ofIOException - if a remote or network exception occurspublic org.apache.hadoop.hbase.RegionLocations relocateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
int replicaId)
throws IOException
relocateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - name of the table row is inrow - row key you're trying to find the region ofreplicaId - the replicaId of the regionIOException - if a remote or network exception occurspublic void updateCachedLocations(org.apache.hadoop.hbase.TableName tableName,
byte[] regionName,
byte[] rowkey,
Object exception,
org.apache.hadoop.hbase.ServerName source)
updateCachedLocations 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - the table nameregionName - the region namerowkey - the rowexception - the exception if any. Can be null.source - the previous locationpublic org.apache.hadoop.hbase.HRegionLocation locateRegion(byte[] regionName)
throws IOException
locateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionregionName - name of the region to locateIOException - if a remote or network exception occurspublic List<org.apache.hadoop.hbase.HRegionLocation> locateRegions(org.apache.hadoop.hbase.TableName tableName) throws IOException
locateRegions 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table to get regions ofIOExceptionpublic List<org.apache.hadoop.hbase.HRegionLocation> locateRegions(org.apache.hadoop.hbase.TableName tableName, boolean useCache, boolean offlined) throws IOException
locateRegions 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table to get regions ofuseCache - Should we use the cache to retrieve the region information.offlined - True if we are to include offlined regions, false and we'll leave out offlined
regions from returned list.IOExceptionpublic org.apache.hadoop.hbase.RegionLocations locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean useCache,
boolean retry)
throws IOException
locateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table to get regions ofrow - the rowuseCache - Should we use the cache to retrieve the region information.retry - do we retryIOExceptionpublic org.apache.hadoop.hbase.RegionLocations locateRegion(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean useCache,
boolean retry,
int replicaId)
throws IOException
locateRegion 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table to get regions ofrow - the rowuseCache - Should we use the cache to retrieve the region information.retry - do we retryreplicaId - the replicaId for the regionIOExceptionpublic org.apache.hadoop.hbase.client.MasterKeepAliveConnection getMaster()
throws IOException
MasterKeepAliveConnection to the active mastergetMaster 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOExceptionpublic org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.BlockingInterface getAdmin(org.apache.hadoop.hbase.ServerName serverName)
throws IOException
getAdmin 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionserverName - IOException - if a remote or network exception occurspublic org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService.BlockingInterface getClient(org.apache.hadoop.hbase.ServerName serverName)
throws IOException
getClient 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionserverName - IOException - if a remote or network exception occurspublic org.apache.hadoop.hbase.HRegionLocation getRegionLocation(org.apache.hadoop.hbase.TableName tableName,
byte[] row,
boolean reload)
throws IOException
getRegionLocation 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table namerow - Row to find.reload - If true do not use cache, otherwise bypass.IOException - if a remote or network exception occurspublic void clearCaches(org.apache.hadoop.hbase.ServerName sn)
sn.clearCaches 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionsn - A server namepublic org.apache.hadoop.hbase.client.NonceGenerator getNonceGenerator()
getNonceGenerator 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.AsyncProcess getAsyncProcess()
getAsyncProcess 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.RpcRetryingCallerFactory getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration conf)
Configuration.
This RpcRetryingCallerFactory lets the users create RpcRetryingCallers which can be
intercepted with the configured RetryingCallerInterceptorgetNewRpcRetryingCallerFactory 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionconf - public org.apache.hadoop.hbase.client.RpcRetryingCallerFactory getRpcRetryingCallerFactory()
getRpcRetryingCallerFactory 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.ipc.RpcControllerFactory getRpcControllerFactory()
getRpcControllerFactory 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.ConnectionConfiguration getConnectionConfiguration()
getConnectionConfiguration 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.ServerStatisticTracker getStatisticsTracker()
getStatisticsTracker 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicy getBackoffPolicy()
getBackoffPolicy 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic org.apache.hadoop.hbase.client.MetricsConnection getConnectionMetrics()
getConnectionMetrics 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionpublic boolean hasCellBlockSupport()
hasCellBlockSupport 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionorg.apache.hadoop.hbase.codec.Codec and so
supports cell blocks.public org.apache.hadoop.conf.Configuration getConfiguration()
getConfiguration 在接口中 org.apache.hadoop.hbase.client.Connectionpublic org.apache.hadoop.hbase.client.Table getTable(org.apache.hadoop.hbase.TableName tableName)
throws IOException
getTable 在接口中 org.apache.hadoop.hbase.client.ConnectionIOExceptionpublic org.apache.hadoop.hbase.client.TableState getTableState(org.apache.hadoop.hbase.TableName tableName)
throws IOException
getTableState 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOExceptionpublic org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.BlockingInterface getAdminForMaster()
throws IOException
getAdminForMaster 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOExceptionpublic org.apache.hadoop.hbase.client.HTable getHTable(org.apache.hadoop.hbase.TableName tableName)
public org.apache.hadoop.hbase.client.HTable getHTableWithStandbyConnection(org.apache.hadoop.hbase.TableName tableName)
public org.apache.hadoop.hbase.client.HTable getHTable(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool,
AliHBaseConstants.ClusterType clusterType,
org.apache.hadoop.hbase.client.ClusterConnection connection,
boolean isStandby)
public org.apache.hadoop.hbase.client.TableBuilder getTableBuilder(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool)
getTableBuilder 在接口中 org.apache.hadoop.hbase.client.Connectionpublic org.apache.hadoop.hbase.client.Table getTable(org.apache.hadoop.hbase.TableName tableName,
ExecutorService pool)
throws IOException
The caller is responsible for calling Table.close() on the returned
table instance.
Since 0.98.1 this method no longer checks table existence. An exception will be thrown if the table does not exist only when the first operation is attempted.
getTable 在接口中 org.apache.hadoop.hbase.client.ConnectiontableName - the name of the tablepool - The thread pool to use for batch operations, null to use a default pool.IOExceptionpublic org.apache.hadoop.hbase.client.RegionLocator getRegionLocator(org.apache.hadoop.hbase.TableName tableName)
throws IOException
getRegionLocator 在接口中 org.apache.hadoop.hbase.client.ConnectiontableName - Name of the table who's region is to be examinedIOExceptionpublic org.apache.hadoop.hbase.client.Admin getAdmin()
throws IOException
getAdmin 在接口中 org.apache.hadoop.hbase.client.ConnectionIOExceptionpublic org.apache.hadoop.hbase.client.HBaseAdmin getHBaseAdmin()
throws IOException
IOExceptionpublic boolean isTableEnabled(org.apache.hadoop.hbase.TableName tableName)
throws IOException
isTableEnabled 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table nameIOException - if a remote or network exception occurspublic boolean isTableDisabled(org.apache.hadoop.hbase.TableName tableName)
throws IOException
isTableDisabled 在接口中 org.apache.hadoop.hbase.client.ClusterConnectiontableName - table nameIOException - if a remote or network exception occurspublic int getCurrentNrHRS()
throws IOException
getCurrentNrHRS 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOException - if a remote or network exception occurspublic org.apache.hadoop.hbase.client.BufferedMutator getBufferedMutator(org.apache.hadoop.hbase.TableName tableName)
throws IOException
Retrieve a BufferedMutator for performing client-side buffering of writes. The
BufferedMutator returned by this method is thread-safe. This BufferedMutator will
use the Connection's ExecutorService. This object can be used for long lived operations.
The caller is responsible for calling BufferedMutator.close() on
the returned BufferedMutator instance.
This accessor will use the connection's ExecutorService and will throw an exception in the main thread when an asynchronous exception occurs.
getBufferedMutator 在接口中 org.apache.hadoop.hbase.client.ConnectiontableName - the name of the tableBufferedMutator for the supplied tableName.IOExceptionpublic org.apache.hadoop.hbase.client.BufferedMutator getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams params)
throws IOException
BufferedMutator for performing client-side buffering of writes. The
BufferedMutator returned by this method is thread-safe. This object can be used for
long lived table operations. The caller is responsible for calling
BufferedMutator.close() on the returned BufferedMutator instance.getBufferedMutator 在接口中 org.apache.hadoop.hbase.client.Connectionparams - details on how to instantiate the BufferedMutator.BufferedMutator for the supplied tableName.IOExceptionpublic org.apache.hadoop.hbase.client.BufferedMutator getBufferedMutatorByType(org.apache.hadoop.hbase.client.BufferedMutatorParams params)
throws IOException
IOExceptionpublic org.apache.hadoop.hbase.client.Hbck getHbck()
throws IOException
getHbck 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOExceptionpublic org.apache.hadoop.hbase.client.Hbck getHbck(org.apache.hadoop.hbase.ServerName serverName)
throws IOException
getHbck 在接口中 org.apache.hadoop.hbase.client.ClusterConnectionIOExceptionpublic void close()
throws IOException
close 在接口中 Closeableclose 在接口中 AutoCloseableclose 在接口中 org.apache.hadoop.hbase.client.ConnectionIOExceptionpublic boolean isClosed()
isClosed 在接口中 org.apache.hadoop.hbase.client.Connectionpublic void abort(String why, Throwable throwable)
abort 在接口中 org.apache.hadoop.hbase.Abortablepublic boolean isAborted()
isAborted 在接口中 org.apache.hadoop.hbase.Abortablepublic org.apache.hadoop.conf.Configuration getOriginalConf()
public DualExecutor getDualExecutor()
Copyright © 2019. All rights reserved.