- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
246 lines
7.0 KiB
Java
246 lines
7.0 KiB
Java
package okio;
|
|
|
|
import java.util.Arrays;
|
|
|
|
/* loaded from: classes5.dex */
|
|
public final class SegmentedByteString extends ByteString {
|
|
public final transient int[] directory;
|
|
public final transient byte[][] segments;
|
|
|
|
public SegmentedByteString(Buffer buffer, int i) {
|
|
super(null);
|
|
Util.checkOffsetAndCount(buffer.size, 0L, i);
|
|
Segment segment = buffer.head;
|
|
int i2 = 0;
|
|
int i3 = 0;
|
|
int i4 = 0;
|
|
while (i3 < i) {
|
|
int i5 = segment.limit;
|
|
int i6 = segment.pos;
|
|
if (i5 != i6) {
|
|
i3 += i5 - i6;
|
|
i4++;
|
|
segment = segment.next;
|
|
} else {
|
|
throw new AssertionError("s.limit == s.pos");
|
|
}
|
|
}
|
|
this.segments = new byte[i4][];
|
|
this.directory = new int[i4 * 2];
|
|
Segment segment2 = buffer.head;
|
|
int i7 = 0;
|
|
while (i2 < i) {
|
|
byte[][] bArr = this.segments;
|
|
bArr[i7] = segment2.data;
|
|
int i8 = segment2.limit;
|
|
int i9 = segment2.pos;
|
|
i2 += i8 - i9;
|
|
if (i2 > i) {
|
|
i2 = i;
|
|
}
|
|
int[] iArr = this.directory;
|
|
iArr[i7] = i2;
|
|
iArr[bArr.length + i7] = i9;
|
|
segment2.shared = true;
|
|
i7++;
|
|
segment2 = segment2.next;
|
|
}
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String utf8() {
|
|
return toByteString().utf8();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String base64() {
|
|
return toByteString().base64();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String hex() {
|
|
return toByteString().hex();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString toAsciiLowercase() {
|
|
return toByteString().toAsciiLowercase();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString md5() {
|
|
return toByteString().md5();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString sha256() {
|
|
return toByteString().sha256();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString substring(int i, int i2) {
|
|
return toByteString().substring(i, i2);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public byte getByte(int i) {
|
|
Util.checkOffsetAndCount(this.directory[this.segments.length - 1], i, 1L);
|
|
int segment = segment(i);
|
|
int i2 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
return bArr[segment][(i - i2) + iArr[bArr.length + segment]];
|
|
}
|
|
|
|
public final int segment(int i) {
|
|
int binarySearch = Arrays.binarySearch(this.directory, 0, this.segments.length, i + 1);
|
|
return binarySearch >= 0 ? binarySearch : ~binarySearch;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int size() {
|
|
return this.directory[this.segments.length - 1];
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public byte[] toByteArray() {
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
byte[] bArr2 = new byte[iArr[bArr.length - 1]];
|
|
int length = bArr.length;
|
|
int i = 0;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
int[] iArr2 = this.directory;
|
|
int i3 = iArr2[length + i];
|
|
int i4 = iArr2[i];
|
|
System.arraycopy(this.segments[i], i3, bArr2, i2, i4 - i2);
|
|
i++;
|
|
i2 = i4;
|
|
}
|
|
return bArr2;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public void write(Buffer buffer) {
|
|
int length = this.segments.length;
|
|
int i = 0;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
int[] iArr = this.directory;
|
|
int i3 = iArr[length + i];
|
|
int i4 = iArr[i];
|
|
Segment segment = new Segment(this.segments[i], i3, (i3 + i4) - i2, true, false);
|
|
Segment segment2 = buffer.head;
|
|
if (segment2 == null) {
|
|
segment.prev = segment;
|
|
segment.next = segment;
|
|
buffer.head = segment;
|
|
} else {
|
|
segment2.prev.push(segment);
|
|
}
|
|
i++;
|
|
i2 = i4;
|
|
}
|
|
buffer.size += i2;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean rangeEquals(int i, ByteString byteString, int i2, int i3) {
|
|
if (i < 0 || i > size() - i3) {
|
|
return false;
|
|
}
|
|
int segment = segment(i);
|
|
while (i3 > 0) {
|
|
int i4 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int min = Math.min(i3, ((this.directory[segment] - i4) + i4) - i);
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
if (!byteString.rangeEquals(i2, bArr[segment], (i - i4) + iArr[bArr.length + segment], min)) {
|
|
return false;
|
|
}
|
|
i += min;
|
|
i2 += min;
|
|
i3 -= min;
|
|
segment++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean rangeEquals(int i, byte[] bArr, int i2, int i3) {
|
|
if (i < 0 || i > size() - i3 || i2 < 0 || i2 > bArr.length - i3) {
|
|
return false;
|
|
}
|
|
int segment = segment(i);
|
|
while (i3 > 0) {
|
|
int i4 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int min = Math.min(i3, ((this.directory[segment] - i4) + i4) - i);
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr2 = this.segments;
|
|
if (!Util.arrayRangeEquals(bArr2[segment], (i - i4) + iArr[bArr2.length + segment], bArr, i2, min)) {
|
|
return false;
|
|
}
|
|
i += min;
|
|
i2 += min;
|
|
i3 -= min;
|
|
segment++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public final ByteString toByteString() {
|
|
return new ByteString(toByteArray());
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean equals(Object obj) {
|
|
if (obj == this) {
|
|
return true;
|
|
}
|
|
if (obj instanceof ByteString) {
|
|
ByteString byteString = (ByteString) obj;
|
|
if (byteString.size() == size() && rangeEquals(0, byteString, 0, size())) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int hashCode() {
|
|
int i = this.hashCode;
|
|
if (i != 0) {
|
|
return i;
|
|
}
|
|
int length = this.segments.length;
|
|
int i2 = 0;
|
|
int i3 = 1;
|
|
int i4 = 0;
|
|
while (i2 < length) {
|
|
byte[] bArr = this.segments[i2];
|
|
int[] iArr = this.directory;
|
|
int i5 = iArr[length + i2];
|
|
int i6 = iArr[i2];
|
|
int i7 = (i6 - i4) + i5;
|
|
while (i5 < i7) {
|
|
i3 = (i3 * 31) + bArr[i5];
|
|
i5++;
|
|
}
|
|
i2++;
|
|
i4 = i6;
|
|
}
|
|
this.hashCode = i3;
|
|
return i3;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String toString() {
|
|
return toByteString().toString();
|
|
}
|
|
|
|
private Object writeReplace() {
|
|
return toByteString();
|
|
}
|
|
}
|