public interface ImageInputStream extends DataInput, Closeable
ImageReader
s。不同的输入源,如
InputStream
s和
File
s,以及未来的快速I/O的来源可能是“包装”的一个合适的接口使用的图像实现I/O API。
Modifier and Type | Method and Description |
---|---|
void |
close()
关闭流。
|
void |
flush()
弃流的初始位置到当前流的位置之前。
|
void |
flushBefore(long pos)
其流的初始部分所指示的位置之前。
|
int |
getBitOffset()
返回当前位偏移量,作为一个介于0和7之间的整数,包括。
|
ByteOrder |
getByteOrder()
返回的字节顺序的数据值将被读取该流的
java.nio.ByteOrder 枚举实例。
|
long |
getFlushedPosition()
返回在流中寻找可能执行的最早的位置。
|
long |
getStreamPosition()
返回流的当前字节位置。
|
boolean |
isCached()
返回
true 如果这
ImageInputStream 缓存数据本身为了让寻求向后。
|
boolean |
isCachedFile()
返回
true 如果这
ImageInputStream 缓存数据本身为了让寻求倒退,和缓存保存在一个临时文件。
|
boolean |
isCachedMemory()
返回
true 如果这
ImageInputStream 缓存数据本身为了让寻求倒退,并被保存在内存中的缓存。
|
long |
length()
返回流的总长度,如果已知的。
|
void |
mark()
是在流的位置被返回的后续调用
reset 。
|
int |
read()
从流中读取一个单个字节,并将其作为一个介于0和255之间的整数。
|
int |
read(byte[] b)
从流中读取到
b.length 字节,并将它们存储到
b 从指数0。
|
int |
read(byte[] b, int off, int len)
读到
len 字节流,并将它们存储到
b 从指数
off 。
|
int |
readBit()
从流中读取一个点并将其作为与价值
0 或
1 一
int 。
|
long |
readBits(int numBits)
从流中读取一个位串并将其作为
long ,与第一位读成为输出最重要的位。
|
boolean |
readBoolean()
从流中读取一个字节,如果是非零返回一个
true
boolean 价值,
false 如果是零。
|
byte |
readByte()
从流中读取一个字节,并将其作为
byte 价值。
|
void |
readBytes(IIOByteBuffer buf, int len)
读到
len 字节流,并对所提供的
IIOByteBuffer 表示字节数组,偏移,和长度的数据可以发现。
|
char |
readChar()
相当于
readUnsignedShort ,除了返回的结果是使用
char 数据类型。
|
double |
readDouble()
从流读取8字节,和(概念)将根据当前的字节顺序和作为一个
double 返回结果。
|
float |
readFloat()
从流读取4字节,和(概念)将根据当前的字节顺序和作为一个
float 返回结果。
|
void |
readFully(byte[] b)
读
b.length 字节流,并将它们存储到
b 从指数
0 。
|
void |
readFully(byte[] b, int off, int len)
读
len 字节流,并将它们存储到
b 从指数
off 。
|
void |
readFully(char[] c, int off, int len)
读
len 字符(16位无符号整数)从流根据当前字节顺序,并将它们存储到
c 从指数
off 。
|
void |
readFully(double[] d, int off, int len)
读
len 双打(64位IEEE双精度浮点数)从流根据当前字节顺序,并将它们存储到
d 从指数
off 。
|
void |
readFully(float[] f, int off, int len)
读
len 花车(32位IEEE单精度浮)从流根据当前字节顺序,并将它们存储到
f 从指数
off 。
|
void |
readFully(int[] i, int off, int len)
读
len 整型(签署从流32位整数)根据当前的字节顺序,并将它们存储到
i 从指数
off 。
|
void |
readFully(long[] l, int off, int len)
读
len 多头(符号的64位整数)从流根据当前字节顺序,并将它们存储到
l 从指数
off 。
|
void |
readFully(short[] s, int off, int len)
读
len 短裤(有符号的16位整数)从流根据当前字节顺序,并将它们存储到
s 从指数
off 。
|
int |
readInt()
从流读取4字节,和(概念)将根据当前的字节顺序和作为一个
int 返回结果。
|
String |
readLine()
从输入流读取下一行文本。
|
long |
readLong()
从流读取8字节,和(概念)将根据当前的字节顺序和作为一个
long 返回结果。
|
short |
readShort()
从流中读取两个字节,和(概念)将根据当前的字节顺序,和作为一个
short 值返回结果。
|
int |
readUnsignedByte()
从流中读取一个字节,和(概念)将其转换为int,面具与
0xff 为了脱掉任何符号扩展位,并将其作为
byte 价值。
|
long |
readUnsignedInt()
从流读取4字节,和(概念)将根据当前的字节顺序,把结果转换为长,面具与
0xffffffffL 为了脱掉任何符号扩展位,作为一个符号
long 值返回结果。
|
int |
readUnsignedShort()
从流中读取两个字节,和(概念)将根据当前的字节顺序,将得到的值的
int ,面具与
0xffff 为了脱掉任何符号扩展,但是,作为一个符号
int 值返回结果。
|
String |
readUTF()
读取一个字符串,一直采用
modified UTF-8编码格式。
|
void |
reset()
返回到以前的位置流指针,包括位偏移,在最近的时间
mark 无与伦比的电话。
|
void |
seek(long pos)
将当前流位置设置为所需的位置。
|
void |
setBitOffset(int bitOffset)
将位偏移量设置为7和0之间的整数,包括。
|
void |
setByteOrder(ByteOrder byteOrder)
为未来从该流读取数据值设置所需的字节顺序。
|
int |
skipBytes(int n)
用给定的字节数移动流位置。
|
long |
skipBytes(long n)
用给定的字节数移动流位置。
|
void setByteOrder(ByteOrder byteOrder)
枚举类java.nio.ByteOrder
用于指定的字节顺序。一个价值ByteOrder.BIG_ENDIAN
指定所谓的大端或网络字节顺序,即高字节优先。该格式的摩托罗拉和SPARC处理器存储数据,而英特尔处理器的数据存储在反向ByteOrder.LITTLE_ENDIAN
秩序。
字节顺序对结果没有影响的readBits
方法返回(或价值由ImageOutputStream.writeBits
)。
byteOrder
-一个
ByteOrder.BIG_ENDIAN
或
java.nio.ByteOrder.LITTLE_ENDIAN
,指示网络字节顺序或反向将用于未来的阅读。
ByteOrder
,
getByteOrder()
,
readBits(int)
ByteOrder getByteOrder()
java.nio.ByteOrder
枚举实例。
ByteOrder.BIG_ENDIAN
或
ByteOrder.LITTLE_ENDIAN
,说明其中的字节顺序是。
ByteOrder
,
setByteOrder(java.nio.ByteOrder)
int read() throws IOException
在流中的位偏移量在读取发生之前重置为零。
IOException
如果I/O错误发生。
int read(byte[] b) throws IOException
b.length
字节流,并将它们存储到
b
从指数0。读取的字节数返回。如果没有字节可以读取,因为流的结束已达到,- 1返回。
在流中的位偏移量在读取发生之前重置为零。
b
-字节被写入到数组。
-1
指示EOF。
null
b
NullPointerException
。
IOException
如果I/O错误发生。
int read(byte[] b, int off, int len) throws IOException
len
字节流,并将它们存储到
b
从指数
off
。读取的字节数返回。如果没有字节可以读取因为已到达流的末尾,则返回
-1
。
在流中的位偏移量在读取发生之前重置为零。
b
-字节被写入到数组。
off
-起始位置在
b
写。
len
-
byte
s最大数读。
-1
指示EOF。
null
b
NullPointerException
。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
b.length
。
IOException
如果I/O错误发生。
void readBytes(IIOByteBuffer buf, int len) throws IOException
len
字节,并修改所提供的
IIOByteBuffer
表示字节数组,偏移,和长度的数据可以发现。打电话的人不应该试图修改数据的
IIOByteBuffer
发现。
在流中的位偏移量在读取发生之前重置为零。
buf
- iiobytebuffer对象被修改。
len
-
byte
s最大数读。
IndexOutOfBoundsException
-如果
len
是负的。
null
buf
NullPointerException
。
IOException
如果I/O错误发生。
boolean readBoolean() throws IOException
boolean
true
,
false
如果是零。
在流中的位偏移量在读取发生之前重置为零。
readBoolean
接口
DataInput
EOFException
如果到达流的末尾。
IOException
如果I/O错误发生。
byte readByte() throws IOException
byte
价值。
0x00
和
0x7f
之间的字节值代表
0
和
127
之间的整数的值。
0x80
和
0xff
之间的值代表
/1
从
-128
负值。
在流中的位偏移量在读取发生之前重置为零。
readByte
接口
DataInput
EOFException
如果到达流的末尾。
IOException
如果I/O错误发生。
int readUnsignedByte() throws IOException
0xff
为了脱掉任何符号扩展位,并将其作为
byte
价值。
因此,0x00
和0x7f
之间的字节值只是返回0
和127
之间的整数的值。0x80
和0xff
之间的值,通常是负面的byte
values,将映射到128
和255
之间的正整数。
在流中的位偏移量在读取发生之前重置为零。
readUnsignedByte
接口
DataInput
EOFException
如果到达流的末尾。
IOException
如果I/O错误发生。
short readShort() throws IOException
short
值返回结果。
在流中的位偏移量在读取发生之前重置为零。
readShort
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
int readUnsignedShort() throws IOException
int
,面具与
0xffff
为了脱掉任何符号扩展,但是,作为一个符号
int
值返回结果。
在流中的位偏移量在读取发生之前重置为零。
readUnsignedShort
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
char readChar() throws IOException
readUnsignedShort
,除了返回的结果是使用
char
数据类型。
在流中的位偏移量在读取发生之前重置为零。
readChar
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
readUnsignedShort()
int readInt() throws IOException
int
返回结果。
流中的位偏移量被忽略,并处理过,好像它是零。
readInt
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
long readUnsignedInt() throws IOException
0xffffffffL
为了脱掉任何符号扩展位,作为一个符号
long
值返回结果。
在流中的位偏移量在读取发生之前重置为零。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
long readLong() throws IOException
long
返回结果。
在流中的位偏移量在读取发生之前重置为零。
readLong
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
float readFloat() throws IOException
float
返回结果。
在流中的位偏移量在读取发生之前重置为零。
readFloat
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
double readDouble() throws IOException
double
返回结果。
在流中的位偏移量在读取发生之前重置为零。
readDouble
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
getByteOrder()
String readLine() throws IOException
String
然后返回。请注意,因为此方法处理字节,它不支持完整的Unicode字符集的输入。
如果文件结束之前遇到甚至一个字节可以读取,然后null
返回。否则,每个字节读取由零扩展转换为类型char
。如果遇到的是性格'\n'
,它是被丢弃的,阅读时。如果遇到的是性格'\r'
,就丢弃,如果下面的字节转换为字符'\n'
,然后被丢弃的也;阅读然后停止。如果文件结束之前遇到的人物'\n'
和'\r'
时,停止阅读。一旦阅读已经停止,一个String
返回包含所有字符读不丢弃,以。请注意,此字符串中的每个字符都有一个值小于\u0100
,即(char)256
。
在流中的位偏移量在读取发生之前重置为零。
readLine
接口
DataInput
IOException
如果I/O错误发生。
String readUTF() throws IOException
readUTF
一般合同,它读取Unicode字符串在改进后的UTF-8编码格式的表示;这个字符串是作为
String
返回。
首先,两字节读取和使用的方式readUnsignedShort
方法构建一个16位无符号整数,使用网络字节顺序(无论当前字节顺序设置)。这个整数的值称为utf长度和指定要读取额外的字节数。这些字节,然后转换为字符,考虑他们在组。每个组的长度是从组的第一个字节的值计算的。一组下面的字节,如果有的话,是下一组的第一个字节。
如果一个组的第一个字节和位模式0xxxxxxx
(其中x
意味着“可能0
或1
”),然后组只包括字节。字节为零扩展到形成字符。
如果一个组的第一个字节和位模式110xxxxx
,然后小组组成的字节a
和第二字节b
。如果没有字节b
(因为字节a
是最后一个字节被读取),或如果字节b
不匹配的位模式10xxxxxx
,然后UTFDataFormatException
抛出。否则,将该组转换为字符:
(char)(((a& 0x1F) << 6) | (b & 0x3F))
如果一组的第一个字节和位模式
1110xxxx
,然后小组组成的字节
a
和两个字节
b
和
c
。如果没有字节
c
(因为
a
是一个字节的字节的最后两读入),或
b
字节或字节
c
不匹配B它的模式
10xxxxxx
,然后
UTFDataFormatException
抛出。否则,该组转换为字符:
(char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F))
如果一组的第一个字节匹配模式
1111xxxx
或模式
10xxxxxx
,然后
UTFDataFormatException
抛出。
如果文件结束时在任何时间,在这个过程中,然后java.io.EOFException
抛出。
在每一组已转化为这一过程的一个人物,人物都聚集在一起,在同一顺序中相应组从输入流中读取,以形成一个String
,返回的。
当前字节顺序设置被忽略。
在流中的位偏移量在读取发生之前重置为零。
注:此方法不能用于图像格式,使用标准的UTF-8的实施,因为修改UTF-8用在这里是标准的UTF-8不相容。
readUTF
接口
DataInput
EOFException
如果流到达终点之前阅读所有字节。
UTFDataFormatException
如果字节没有表示一个有效的修改一个字符串编码UTF-8。
IOException
如果I/O错误发生。
void readFully(byte[] b, int off, int len) throws IOException
len
字节流,并将它们存储到
b
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
readFully
接口
DataInput
b
-字节被写入到数组。
off
-起始位置在
b
写。
len
-
byte
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
b.length
。
null
b
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(byte[] b) throws IOException
b.length
字节流,并将它们存储到
b
从指数
0
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
readFully
接口
DataInput
b
-
byte
s数组。
null
b
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(short[] s, int off, int len) throws IOException
len
短裤(有符号的16位整数)从流根据当前字节顺序,并将它们存储到
s
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
s
-短裤被写入数组。
off
-起始位置在
s
写。
len
-
short
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
s.length
。
null
s
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(char[] c, int off, int len) throws IOException
len
字符(16位无符号整数)从流根据当前字节顺序,并将它们存储到
c
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
c
-字符被写入数组。
off
-起始位置在
c
写。
len
-
char
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
c.length
。
null
c
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(int[] i, int off, int len) throws IOException
len
整型(签署从流32位整数)根据当前的字节顺序,并将它们存储到
i
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
i
-整数写入数组。
off
-起始位置在
i
写。
len
-
int
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
i.length
。
null
i
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(long[] l, int off, int len) throws IOException
len
多头(符号的64位整数)从流根据当前字节顺序,并将它们存储到
l
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
l
-一系列的渴望被写入。
off
-起始位置在
l
写。
len
-
long
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
l.length
。
null
l
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(float[] f, int off, int len) throws IOException
len
花车(32位IEEE单精度浮)从流根据当前字节顺序,并将它们存储到
f
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
f
-彩车要写入数组。
off
-起始位置在
f
写。
len
-
float
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
f.length
。
null
f
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
void readFully(double[] d, int off, int len) throws IOException
len
双打(64位IEEE双精度浮点数)从流根据当前字节顺序,并将它们存储到
d
从指数
off
。如果到达流的末尾,一个
java.io.EOFException
将抛出。
在流中的位偏移量在读取发生之前重置为零。
d
-双打被写入数组。
off
-起始位置在
d
写。
len
-
double
s最大数读。
IndexOutOfBoundsException
-如果
off
是负的,
len
是负的,或
off + len
大于
d.length
。
null
d
NullPointerException
。
EOFException
如果流到达终点之前阅读所有字节。
IOException
如果I/O错误发生。
long getStreamPosition() throws IOException
IOException
如果I/O错误发生。
int getBitOffset() throws IOException
readBits
更新方法。一个值为0表示最重要的位,和一个值为7表示最不显着的位,被读取的字节。
位偏移设置为0流时先打开,并设置为0的电话seek
,skipBytes
,或任何read
或readFully
方法。
int
含0和7之间的偏位,包容。
IOException
如果I/O错误发生。
setBitOffset(int)
void setBitOffset(int bitOffset) throws IOException
getStreamPosition
,保持不变。一个值为0表示最重要的位,和一个值为7表示最不显着的位,被读取的字节。
bitOffset
-所需的偏移量,在0和7之间的
int
,包容。
IllegalArgumentException
-如果
bitOffset
不是0和7之间,包容。
IOException
如果I/O错误发生。
getBitOffset()
int readBit() throws IOException
0
或
1
一
int
。位偏移是先进一降低模8。
int
含有值的
0
或
1
。
EOFException
如果流到达终点之前阅读所有位。
IOException
如果I/O错误发生。
long readBits(int numBits) throws IOException
long
,与第一位读成为输出最重要的位。开始读的字节表示的
getStreamPosition
,在给定的
getBitOffset
钻头。位偏移是先进的
numBits
降低模8。
流的字节顺序对这个方法没有影响。该方法的返回值被构造成一个在一个时间点上读取一个位,并将其转换为返回值的右边,如下面的伪代码所示:
long accum = 0L;
for (int i = 0; i < numBits; i++) {
accum <<= 1; // Shift left one bit to make room
accum |= readBit();
}
注意
readBits(32)
结果可能不会如反网络字节顺序是相同,
readInt()
(即
getByteOrder() == false
)。
如果流的结束之前遇到的所有碎片已被阅读,一个java.io.EOFException
抛出。
numBits
-读取的字节数,如0和64之间的一个
int
,包容。
long
读取存储在最低有效位。
IllegalArgumentException
-如果
numBits
不是0和64之间,包容。
EOFException
如果流到达终点之前阅读所有位。
IOException
如果I/O错误发生。
long length() throws IOException
-1
返回。
long
含流,如果已知的长度,否则
-1
。
IOException
如果I/O错误发生。
int skipBytes(int n) throws IOException
skipBytes
接口
DataInput
n
-
int
包含的字节数被跳过。
int
跳过的字节数。
IOException
如果I/O错误发生。
long skipBytes(long n) throws IOException
skipBytes(int)
除外,它允许一个更大的跳跃距离。
n
-
long
包含的字节数被跳过。
long
表示字节数跳过。
IOException
如果I/O错误发生。
void seek(long pos) throws IOException
如果将一个IndexOutOfBoundsException
pos
小于冲洗位置抛出(返回的getflushedPosition
)。
它寻找过去的文件是合法的;一个java.io.EOFException
才可以执行读扔。
pos
-
long
含有所需的文件指针的位置。
IndexOutOfBoundsException
-如果
pos
小于刷新位置。
IOException
-如果任何其他发生I/O错误。
void mark()
reset
。不同于标准
InputStream
,所有
ImageInputStream
s支持标记。此外,电话
mark
和
reset
可以任意嵌套。
不像mark
方法宣布由Reader
和InputStream
接口,没有readLimit
参数使用。任意数量的数据可以被读取后,打电话mark
。
由readBits
方法使用的位的位置被保存并由每对电话mark
和reset
恢复。
注意一个ImageReader
叫flushBefore
作为读操作的一部分,它是有效的。因此,如果应用程序调用mark
过往,流到ImageReader
之前,应用程序不应该假定标记的位置将读操作完成后仍然有效。
void reset() throws IOException
mark
无与伦比的时间。
电话reset
没有相应的调用mark
没有影响。
一个IOException
将如果先前标记的位置位于废弃的流部分抛出。
IOException
如果I/O错误发生。
void flushBefore(long pos) throws IOException
IndexOutOfBoundsException
。
打电话flushBefore
允许实现了这个接口的类来释放资源如内存或磁盘空间被用来存储数据流。
pos
-
long
含流前缀可能冲长度。
IndexOutOfBoundsException
-如果
pos
在于通红的流部分或过去的当前流的位置。
IOException
如果I/O错误发生。
void flush() throws IOException
flushBefore(getStreamPosition())
。
IOException
如果I/O错误发生。
long getFlushedPosition()
flushBefore
最大。
long
。
boolean isCached()
true
如果这
ImageInputStream
缓存数据本身为了让寻求向后。应用程序可以协商这个,以决定如何频繁,或是否,以刷新以节省缓存资源。
true
ImageInputStream
缓存数据。
isCachedMemory()
,
isCachedFile()
boolean isCachedMemory()
true
如果这
ImageInputStream
缓存数据本身为了让寻求倒退,并被保存在内存中的缓存。应用程序可以协商这个,以决定如何频繁,或是否,以刷新以节省缓存资源。
true
ImageInputStream
缓存在内存中的数据。
isCached()
,
isCachedFile()
boolean isCachedFile()
true
如果这
ImageInputStream
缓存数据本身为了让寻求倒退,和缓存保存在一个临时文件。应用程序可以协商这个,以决定如何频繁,或是否,以刷新以节省缓存资源。
true
ImageInputStream
缓存数据在一个临时文件。
isCached()
,
isCachedMemory()
void close() throws IOException
IOException
s或不正确的行为。调用此方法可允许类实现此接口,以释放与流关联的资源,如内存、磁盘空间或文件描述符。
close
接口
AutoCloseable
close
接口
Closeable
IOException
如果I/O错误发生。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.