@secrecy/lib 1.0.0-dev.8 → 1.0.0-dev.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/BaseClient.d.ts +104 -0
- package/dist/BaseClient.js +430 -0
- package/{lib → dist}/PopupTools.d.ts +1 -1
- package/dist/PopupTools.js +196 -0
- package/{lib → dist}/ZeusThunder.d.ts +0 -0
- package/dist/ZeusThunder.js +65 -0
- package/dist/cache.d.ts +6 -0
- package/dist/cache.js +4 -0
- package/dist/client/SecrecyAppClient.d.ts +17 -0
- package/dist/client/SecrecyAppClient.js +227 -0
- package/dist/client/SecrecyCloudClient.d.ts +89 -0
- package/dist/client/SecrecyCloudClient.js +1411 -0
- package/dist/client/SecrecyDbClient.d.ts +21 -0
- package/dist/client/SecrecyDbClient.js +177 -0
- package/dist/client/SecrecyMailClient.d.ts +42 -0
- package/dist/client/SecrecyMailClient.js +1022 -0
- package/dist/client/SecrecyPayClient.d.ts +28 -0
- package/dist/client/SecrecyPayClient.js +68 -0
- package/dist/client/SecrecyWalletClient.d.ts +30 -0
- package/dist/client/SecrecyWalletClient.js +73 -0
- package/{lib → dist}/client/convert/file.d.ts +3 -3
- package/dist/client/convert/file.js +33 -0
- package/dist/client/convert/mail.d.ts +3 -0
- package/dist/client/convert/mail.js +43 -0
- package/dist/client/convert/node.d.ts +9 -0
- package/dist/client/convert/node.js +88 -0
- package/{lib → dist}/client/helpers.d.ts +6 -1
- package/dist/client/helpers.js +119 -0
- package/dist/client/index.d.ts +34 -0
- package/dist/client/index.js +46 -0
- package/{lib → dist}/client/storage.d.ts +0 -0
- package/dist/client/storage.js +12 -0
- package/dist/client/types/File.d.ts +14 -0
- package/dist/client/types/File.js +3 -0
- package/{lib → dist}/client/types/Inputs.d.ts +2 -7
- package/dist/client/types/Inputs.js +3 -0
- package/dist/client/types/Node.d.ts +56 -0
- package/dist/client/types/Node.js +3 -0
- package/{lib → dist}/client/types/UserAppNotifications.d.ts +1 -1
- package/dist/client/types/UserAppNotifications.js +3 -0
- package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
- package/dist/client/types/UserAppSettings.js +3 -0
- package/{lib → dist}/client/types/index.d.ts +9 -43
- package/dist/client/types/index.js +8 -0
- package/dist/client/types/selectors.d.ts +400 -0
- package/dist/client/types/selectors.js +135 -0
- package/{lib → dist}/crypto/file.d.ts +0 -0
- package/dist/crypto/file.js +195 -0
- package/{lib → dist}/crypto/index.d.ts +0 -0
- package/dist/crypto/index.js +45 -0
- package/dist/error.d.ts +33 -0
- package/dist/error.js +3 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +10 -0
- package/{lib → dist}/minify/index.d.ts +0 -0
- package/dist/minify/index.js +23 -0
- package/{lib → dist}/minify/lz4.d.ts +0 -0
- package/dist/minify/lz4.js +539 -0
- package/{lib → dist}/sodium.d.ts +0 -0
- package/dist/sodium.js +6 -0
- package/{lib → dist}/utils/store-buddy.d.ts +0 -0
- package/dist/utils/store-buddy.js +58 -0
- package/{lib → dist}/utils/time.d.ts +0 -0
- package/dist/utils/time.js +12 -0
- package/{lib → dist/utils}/utils.d.ts +0 -0
- package/dist/utils/utils.js +47 -0
- package/{lib → dist}/worker/md5.d.ts +0 -0
- package/dist/worker/md5.js +24 -0
- package/{lib → dist}/worker/sodium.d.ts +0 -0
- package/dist/worker/sodium.js +118 -0
- package/{lib → dist}/worker/workerCodes.d.ts +0 -0
- package/dist/worker/workerCodes.js +255 -0
- package/{lib → dist}/zeus/const.d.ts +5 -0
- package/dist/zeus/const.js +1670 -0
- package/dist/zeus/index.d.ts +7896 -0
- package/dist/zeus/index.js +602 -0
- package/package.json +64 -54
- package/lib/BaseClient.d.ts +0 -266
- package/lib/BaseClient.js +0 -1332
- package/lib/PopupTools.js +0 -213
- package/lib/ZeusThunder.js +0 -112
- package/lib/cache.d.ts +0 -7
- package/lib/cache.js +0 -5
- package/lib/client/convert/file.js +0 -39
- package/lib/client/convert/folder.d.ts +0 -8
- package/lib/client/convert/folder.js +0 -264
- package/lib/client/convert/mail.d.ts +0 -3
- package/lib/client/convert/mail.js +0 -46
- package/lib/client/convert/vFile.d.ts +0 -5
- package/lib/client/convert/vFile.js +0 -164
- package/lib/client/helpers.js +0 -116
- package/lib/client/index.d.ts +0 -168
- package/lib/client/index.js +0 -3795
- package/lib/client/storage.js +0 -12
- package/lib/client/types/File.d.ts +0 -21
- package/lib/client/types/File.js +0 -2
- package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
- package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
- package/lib/client/types/Folder.d.ts +0 -68
- package/lib/client/types/Folder.js +0 -7
- package/lib/client/types/Inputs.js +0 -2
- package/lib/client/types/UserAppNotifications.js +0 -2
- package/lib/client/types/UserAppSettings.js +0 -2
- package/lib/client/types/VFile.d.ts +0 -62
- package/lib/client/types/VFile.js +0 -4
- package/lib/client/types/index.js +0 -9
- package/lib/client/types/queries.d.ts +0 -535
- package/lib/client/types/queries.js +0 -192
- package/lib/crypto/file.js +0 -291
- package/lib/crypto/index.js +0 -37
- package/lib/index.d.ts +0 -11
- package/lib/index.js +0 -40
- package/lib/minify/index.js +0 -28
- package/lib/minify/lz4.js +0 -633
- package/lib/sodium.js +0 -28
- package/lib/utils/store-buddy.js +0 -69
- package/lib/utils/time.js +0 -22
- package/lib/utils.js +0 -188
- package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
- package/lib/worker/__mock__/sodium.worker.js +0 -57
- package/lib/worker/md5.js +0 -43
- package/lib/worker/sodium.js +0 -155
- package/lib/worker/workerCodes.js +0 -3
- package/lib/zeus/const.js +0 -1644
- package/lib/zeus/index.d.ts +0 -26279
- package/lib/zeus/index.js +0 -552
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
// lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2015, Pierre Curto
|
|
4
|
+
* Copyright (c) 2016, oov
|
|
5
|
+
* All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
|
9
|
+
*
|
|
10
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
11
|
+
* list of conditions and the following disclaimer.
|
|
12
|
+
*
|
|
13
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
14
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
15
|
+
* and/or other materials provided with the distribution.
|
|
16
|
+
*
|
|
17
|
+
* * Neither the name of xxHash nor the names of its
|
|
18
|
+
* contributors may be used to endorse or promote products derived from
|
|
19
|
+
* this software without specific prior written permission.
|
|
20
|
+
*
|
|
21
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
22
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
23
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
24
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
25
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
26
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
27
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
28
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
29
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const errInvalidSource = new Error("invalid source");
|
|
34
|
+
const errShortBuffer = new Error("short buffer");
|
|
35
|
+
|
|
36
|
+
// The following constants are used to setup the compression algorithm.
|
|
37
|
+
const minMatch = 4; // the minimum size of the match sequence size (4 bytes)
|
|
38
|
+
const winSizeLog = 16; // LZ4 64Kb window size limit
|
|
39
|
+
const winSize = 1 << winSizeLog;
|
|
40
|
+
const winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
|
|
41
|
+
|
|
42
|
+
// hashSizeLog determines the size of the hash table used to quickly find a previous match position.
|
|
43
|
+
// Its value influences the compression speed and memory usage, the lower the faster,
|
|
44
|
+
// but at the expense of the compression ratio.
|
|
45
|
+
// 16 seems to be the best compromise.
|
|
46
|
+
const hashSizeLog = 16;
|
|
47
|
+
const hashSize = 1 << hashSizeLog;
|
|
48
|
+
const hashShift = minMatch * 8 - hashSizeLog;
|
|
49
|
+
const mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
|
|
50
|
+
const skipStrength = 6; // variable step for fast scan
|
|
51
|
+
|
|
52
|
+
const hasher = 2654435761 | 0; // prime number used to hash minMatch
|
|
53
|
+
|
|
54
|
+
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
|
|
55
|
+
function imulPolyfill(a, b) {
|
|
56
|
+
const ah = a >>> 16 & 0xffff;
|
|
57
|
+
const al = a & 0xffff;
|
|
58
|
+
const bh = b >>> 16 & 0xffff;
|
|
59
|
+
const bl = b & 0xffff;
|
|
60
|
+
// the shift by 0 fixes the sign on the high part
|
|
61
|
+
// the final |0 converts the unsigned value into a signed value
|
|
62
|
+
return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
|
|
63
|
+
}
|
|
64
|
+
const imul = Math.imul ? Math.imul : imulPolyfill;
|
|
65
|
+
function getUint32(a, i) {
|
|
66
|
+
return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
|
|
67
|
+
}
|
|
68
|
+
function copy(dest, src, di, si, len) {
|
|
69
|
+
for (let i = 0; i < len; ++i) {
|
|
70
|
+
dest[di++] = src[si++];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function calcUncompressedLen(src) {
|
|
74
|
+
const sn = src.length;
|
|
75
|
+
if (sn === 0) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
let si = 0;
|
|
79
|
+
let di = 0;
|
|
80
|
+
while (true) {
|
|
81
|
+
// literals and match lengths (token)
|
|
82
|
+
let lLen = src[si] >> 4;
|
|
83
|
+
let mLen = src[si] & 0xf;
|
|
84
|
+
if (++si === sn) {
|
|
85
|
+
throw errInvalidSource;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// literals
|
|
89
|
+
if (lLen > 0) {
|
|
90
|
+
if (lLen === 0xf) {
|
|
91
|
+
while (src[si] === 0xff) {
|
|
92
|
+
lLen += 0xff;
|
|
93
|
+
if (++si === sn) {
|
|
94
|
+
throw errInvalidSource;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
lLen += src[si];
|
|
98
|
+
if (++si === sn) {
|
|
99
|
+
throw errInvalidSource;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
di += lLen;
|
|
103
|
+
si += lLen;
|
|
104
|
+
if (si >= sn) {
|
|
105
|
+
return di;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
si += 2;
|
|
109
|
+
if (si >= sn) {
|
|
110
|
+
throw errInvalidSource;
|
|
111
|
+
}
|
|
112
|
+
const offset = src[si - 2] | src[si - 1] << 8;
|
|
113
|
+
if (di - offset < 0 || offset === 0) {
|
|
114
|
+
throw errInvalidSource;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// match
|
|
118
|
+
if (mLen === 0xf) {
|
|
119
|
+
while (src[si] === 0xff) {
|
|
120
|
+
mLen += 0xff;
|
|
121
|
+
if (++si === sn) {
|
|
122
|
+
throw errInvalidSource;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
mLen += src[si];
|
|
126
|
+
if (++si === sn) {
|
|
127
|
+
throw errInvalidSource;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// minimum match length is 4
|
|
131
|
+
mLen += 4;
|
|
132
|
+
|
|
133
|
+
// copy the match (NB. match is at least 4 bytes long)
|
|
134
|
+
for (; mLen >= offset; mLen -= offset) {
|
|
135
|
+
di += offset;
|
|
136
|
+
}
|
|
137
|
+
di += mLen;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export function uncompressBlock(src, dest) {
|
|
141
|
+
const sn = src.length;
|
|
142
|
+
const dn = dest.length;
|
|
143
|
+
if (sn === 0) {
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
let si = 0;
|
|
147
|
+
let di = 0;
|
|
148
|
+
while (true) {
|
|
149
|
+
// literals and match lengths (token)
|
|
150
|
+
let lLen = src[si] >> 4;
|
|
151
|
+
let mLen = src[si] & 0xf;
|
|
152
|
+
if (++si === sn) {
|
|
153
|
+
throw errInvalidSource;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// literals
|
|
157
|
+
if (lLen > 0) {
|
|
158
|
+
if (lLen === 0xf) {
|
|
159
|
+
while (src[si] === 0xff) {
|
|
160
|
+
lLen += 0xff;
|
|
161
|
+
if (++si === sn) {
|
|
162
|
+
throw errInvalidSource;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
lLen += src[si];
|
|
166
|
+
if (++si === sn) {
|
|
167
|
+
throw errInvalidSource;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (dn - di < lLen || si + lLen > sn) {
|
|
171
|
+
throw errShortBuffer;
|
|
172
|
+
}
|
|
173
|
+
copy(dest, src, di, si, lLen);
|
|
174
|
+
di += lLen;
|
|
175
|
+
si += lLen;
|
|
176
|
+
if (si >= sn) {
|
|
177
|
+
return di;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
si += 2;
|
|
181
|
+
if (si >= sn) {
|
|
182
|
+
throw errInvalidSource;
|
|
183
|
+
}
|
|
184
|
+
const offset = src[si - 2] | src[si - 1] << 8;
|
|
185
|
+
if (di - offset < 0 || offset === 0) {
|
|
186
|
+
throw errInvalidSource;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// match
|
|
190
|
+
if (mLen === 0xf) {
|
|
191
|
+
while (src[si] === 0xff) {
|
|
192
|
+
mLen += 0xff;
|
|
193
|
+
if (++si === sn) {
|
|
194
|
+
throw errInvalidSource;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
mLen += src[si];
|
|
198
|
+
if (++si === sn) {
|
|
199
|
+
throw errInvalidSource;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// minimum match length is 4
|
|
203
|
+
mLen += 4;
|
|
204
|
+
if (dn - di <= mLen) {
|
|
205
|
+
throw errShortBuffer;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// copy the match (NB. match is at least 4 bytes long)
|
|
209
|
+
for (; mLen >= offset; mLen -= offset) {
|
|
210
|
+
copy(dest, dest, di, di - offset, offset);
|
|
211
|
+
di += offset;
|
|
212
|
+
}
|
|
213
|
+
copy(dest, dest, di, di - offset, mLen);
|
|
214
|
+
di += mLen;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export function compressBlockBound(n) {
|
|
218
|
+
return n + (n / 255 | 0) + 16;
|
|
219
|
+
}
|
|
220
|
+
export function compressBlock(src, dest, soffset) {
|
|
221
|
+
const sn = src.length - mfLimit;
|
|
222
|
+
const dn = dest.length;
|
|
223
|
+
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
let si = 0,
|
|
227
|
+
di = 0;
|
|
228
|
+
|
|
229
|
+
// fast scan strategy:
|
|
230
|
+
// we only need a hash table to store the last sequences (4 bytes)
|
|
231
|
+
const hashTable = new Uint32Array(hashSize);
|
|
232
|
+
|
|
233
|
+
// Initialise the hash table with the first 64Kb of the input buffer
|
|
234
|
+
// (used when compressing dependent blocks)
|
|
235
|
+
while (si < soffset) {
|
|
236
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
237
|
+
hashTable[h] = ++si;
|
|
238
|
+
}
|
|
239
|
+
let anchor = si;
|
|
240
|
+
let fma = 1 << skipStrength;
|
|
241
|
+
while (si < sn - minMatch) {
|
|
242
|
+
// hash the next 4 bytes (sequence)...
|
|
243
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
244
|
+
// -1 to separate existing entries from new ones
|
|
245
|
+
const ref = hashTable[h] - 1;
|
|
246
|
+
// ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
|
|
247
|
+
hashTable[h] = si + 1;
|
|
248
|
+
// no need to check the last 3 bytes in the first literal 4 bytes as
|
|
249
|
+
// this guarantees that the next match, if any, is compressed with
|
|
250
|
+
// a lower size, since to have some compression we must have:
|
|
251
|
+
// ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
|
|
252
|
+
// => ll+ml>3+2*overlap => ll+ml>= 4+2*overlap
|
|
253
|
+
// and by definition we do have:
|
|
254
|
+
// ll >= 1, ml >= 4
|
|
255
|
+
// => ll+ml >= 5
|
|
256
|
+
// => so overlap must be 0
|
|
257
|
+
|
|
258
|
+
// the sequence is new, out of bound (64kb) or not valid: try next sequence
|
|
259
|
+
if (ref < 0 ||
|
|
260
|
+
//(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
|
|
261
|
+
si - ref >> winSizeLog > 0 || src[ref] !== src[si] || src[ref + 1] !== src[si + 1] || src[ref + 2] !== src[si + 2] || src[ref + 3] !== src[si + 3]) {
|
|
262
|
+
// variable step: improves performance on non-compressible data
|
|
263
|
+
si += fma >> skipStrength;
|
|
264
|
+
++fma;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
// match found
|
|
268
|
+
fma = 1 << skipStrength;
|
|
269
|
+
const lLen = si - anchor;
|
|
270
|
+
const offset = si - ref;
|
|
271
|
+
|
|
272
|
+
// encode match length part 1
|
|
273
|
+
si += minMatch;
|
|
274
|
+
let mLen = si; // match length has minMatch already
|
|
275
|
+
while (si <= sn && src[si] === src[si - offset]) {
|
|
276
|
+
si++;
|
|
277
|
+
}
|
|
278
|
+
mLen = si - mLen;
|
|
279
|
+
if (mLen < 0xf) {
|
|
280
|
+
dest[di] = mLen;
|
|
281
|
+
} else {
|
|
282
|
+
dest[di] = 0xf;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// encode literals length
|
|
286
|
+
if (lLen < 0xf) {
|
|
287
|
+
dest[di] |= lLen << 4;
|
|
288
|
+
} else {
|
|
289
|
+
dest[di] |= 0xf0;
|
|
290
|
+
if (++di === dn) {
|
|
291
|
+
throw errShortBuffer;
|
|
292
|
+
}
|
|
293
|
+
let l = lLen - 0xf;
|
|
294
|
+
for (; l >= 0xff; l -= 0xff) {
|
|
295
|
+
dest[di] = 0xff;
|
|
296
|
+
if (++di === dn) {
|
|
297
|
+
throw errShortBuffer;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
dest[di] = l & 0xff;
|
|
301
|
+
}
|
|
302
|
+
if (++di === dn) {
|
|
303
|
+
throw errShortBuffer;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// literals
|
|
307
|
+
if (di + lLen >= dn) {
|
|
308
|
+
throw errShortBuffer;
|
|
309
|
+
}
|
|
310
|
+
copy(dest, src, di, anchor, lLen);
|
|
311
|
+
di += lLen;
|
|
312
|
+
anchor = si;
|
|
313
|
+
|
|
314
|
+
// encode offset
|
|
315
|
+
di += 2;
|
|
316
|
+
if (di >= dn) {
|
|
317
|
+
throw errShortBuffer;
|
|
318
|
+
}
|
|
319
|
+
dest[di - 2] = offset;
|
|
320
|
+
dest[di - 1] = offset >> 8;
|
|
321
|
+
|
|
322
|
+
// encode match length part 2
|
|
323
|
+
if (mLen >= 0xf) {
|
|
324
|
+
for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
|
|
325
|
+
dest[di] = 0xff;
|
|
326
|
+
if (++di === dn) {
|
|
327
|
+
throw errShortBuffer;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
dest[di] = mLen;
|
|
331
|
+
if (++di === dn) {
|
|
332
|
+
throw errShortBuffer;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (anchor === 0) {
|
|
337
|
+
// incompressible
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// last literals
|
|
342
|
+
let lLen = src.length - anchor;
|
|
343
|
+
if (lLen < 0xf) {
|
|
344
|
+
dest[di] = lLen << 4;
|
|
345
|
+
} else {
|
|
346
|
+
dest[di] = 0xf0;
|
|
347
|
+
if (++di === dn) {
|
|
348
|
+
throw errShortBuffer;
|
|
349
|
+
}
|
|
350
|
+
for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
|
|
351
|
+
dest[di] = 0xff;
|
|
352
|
+
if (++di === dn) {
|
|
353
|
+
throw errShortBuffer;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
dest[di] = lLen;
|
|
357
|
+
}
|
|
358
|
+
if (++di === dn) {
|
|
359
|
+
throw errShortBuffer;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// write literals
|
|
363
|
+
const lastLen = src.length - anchor;
|
|
364
|
+
const n = di + lastLen;
|
|
365
|
+
if (n > dn) {
|
|
366
|
+
throw errShortBuffer;
|
|
367
|
+
} else if (n >= sn) {
|
|
368
|
+
// incompressible
|
|
369
|
+
return 0;
|
|
370
|
+
}
|
|
371
|
+
copy(dest, src, di, anchor, lastLen);
|
|
372
|
+
di += lastLen;
|
|
373
|
+
return di;
|
|
374
|
+
}
|
|
375
|
+
export function compressBlockHC(src, dest, soffset) {
|
|
376
|
+
const sn = src.length - mfLimit;
|
|
377
|
+
const dn = dest.length;
|
|
378
|
+
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
let si = 0;
|
|
382
|
+
let di = 0;
|
|
383
|
+
|
|
384
|
+
// Hash Chain strategy:
|
|
385
|
+
// we need a hash table and a chain table
|
|
386
|
+
// the chain table cannot contain more entries than the window size (64Kb entries)
|
|
387
|
+
const hashTable = new Uint32Array(hashSize);
|
|
388
|
+
const chainTable = new Uint32Array(winSize);
|
|
389
|
+
|
|
390
|
+
// Initialise the hash table with the first 64Kb of the input buffer
|
|
391
|
+
// (used when compressing dependent blocks)
|
|
392
|
+
while (si < soffset) {
|
|
393
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
394
|
+
chainTable[si & winMask] = hashTable[h];
|
|
395
|
+
hashTable[h] = ++si;
|
|
396
|
+
}
|
|
397
|
+
let anchor = si;
|
|
398
|
+
while (si < sn - minMatch) {
|
|
399
|
+
// hash the next 4 bytes (sequence)...
|
|
400
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
401
|
+
|
|
402
|
+
// follow the chain until out of window and give the longest match
|
|
403
|
+
let mLen = 0;
|
|
404
|
+
let offset = 0;
|
|
405
|
+
for (let next = hashTable[h] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
|
|
406
|
+
// the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
|
|
407
|
+
if (src[next + mLen] === src[si + mLen]) {
|
|
408
|
+
for (let ml = 0;; ++ml) {
|
|
409
|
+
if (src[next + ml] !== src[si + ml] || si + ml > sn) {
|
|
410
|
+
// found a longer match, keep its position and length
|
|
411
|
+
if (mLen < ml && ml >= minMatch) {
|
|
412
|
+
mLen = ml;
|
|
413
|
+
offset = si - next;
|
|
414
|
+
}
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
chainTable[si & winMask] = hashTable[h];
|
|
421
|
+
hashTable[h] = si + 1;
|
|
422
|
+
|
|
423
|
+
// no match found
|
|
424
|
+
if (mLen === 0) {
|
|
425
|
+
++si;
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
let si2 = si + 1;
|
|
429
|
+
const ml = si + mLen;
|
|
430
|
+
|
|
431
|
+
// match found
|
|
432
|
+
// update hash/chain tables with overlaping bytes:
|
|
433
|
+
// si already hashed, add everything from si+1 up to the match length
|
|
434
|
+
while (si2 < ml) {
|
|
435
|
+
const h = imul(getUint32(src, si2), hasher) >>> hashShift;
|
|
436
|
+
chainTable[si2 & winMask] = hashTable[h];
|
|
437
|
+
hashTable[h] = ++si2;
|
|
438
|
+
}
|
|
439
|
+
const lLen = si - anchor;
|
|
440
|
+
si += mLen;
|
|
441
|
+
mLen -= minMatch; // match length does not include minMatch
|
|
442
|
+
|
|
443
|
+
if (mLen < 0xf) {
|
|
444
|
+
dest[di] = mLen;
|
|
445
|
+
} else {
|
|
446
|
+
dest[di] = 0xf;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// encode literals length
|
|
450
|
+
if (lLen < 0xf) {
|
|
451
|
+
dest[di] |= lLen << 4;
|
|
452
|
+
} else {
|
|
453
|
+
dest[di] |= 0xf0;
|
|
454
|
+
if (++di === dn) {
|
|
455
|
+
throw errShortBuffer;
|
|
456
|
+
}
|
|
457
|
+
let l = lLen - 0xf;
|
|
458
|
+
for (; l >= 0xff; l -= 0xff) {
|
|
459
|
+
dest[di] = 0xff;
|
|
460
|
+
if (++di === dn) {
|
|
461
|
+
throw errShortBuffer;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
dest[di] = l & 0xff;
|
|
465
|
+
}
|
|
466
|
+
if (++di === dn) {
|
|
467
|
+
throw errShortBuffer;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// literals
|
|
471
|
+
if (di + lLen >= dn) {
|
|
472
|
+
throw errShortBuffer;
|
|
473
|
+
}
|
|
474
|
+
copy(dest, src, di, anchor, lLen);
|
|
475
|
+
di += lLen;
|
|
476
|
+
anchor = si;
|
|
477
|
+
|
|
478
|
+
// encode offset
|
|
479
|
+
di += 2;
|
|
480
|
+
if (di >= dn) {
|
|
481
|
+
throw errShortBuffer;
|
|
482
|
+
}
|
|
483
|
+
dest[di - 2] = offset;
|
|
484
|
+
dest[di - 1] = offset >> 8;
|
|
485
|
+
|
|
486
|
+
// encode match length part 2
|
|
487
|
+
if (mLen >= 0xf) {
|
|
488
|
+
for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
|
|
489
|
+
dest[di] = 0xff;
|
|
490
|
+
if (++di === dn) {
|
|
491
|
+
throw errShortBuffer;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
dest[di] = mLen;
|
|
495
|
+
if (++di === dn) {
|
|
496
|
+
throw errShortBuffer;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (anchor === 0) {
|
|
501
|
+
// incompressible
|
|
502
|
+
return 0;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// last literals
|
|
506
|
+
let lLen = src.length - anchor;
|
|
507
|
+
if (lLen < 0xf) {
|
|
508
|
+
dest[di] = lLen << 4;
|
|
509
|
+
} else {
|
|
510
|
+
dest[di] = 0xf0;
|
|
511
|
+
if (++di === dn) {
|
|
512
|
+
throw errShortBuffer;
|
|
513
|
+
}
|
|
514
|
+
for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
|
|
515
|
+
dest[di] = 0xff;
|
|
516
|
+
if (++di === dn) {
|
|
517
|
+
throw errShortBuffer;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
dest[di] = lLen;
|
|
521
|
+
}
|
|
522
|
+
if (++di === dn) {
|
|
523
|
+
throw errShortBuffer;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// write literals
|
|
527
|
+
const lastLen = src.length - anchor;
|
|
528
|
+
const n = di + lastLen;
|
|
529
|
+
if (n > dn) {
|
|
530
|
+
throw errShortBuffer;
|
|
531
|
+
} else if (n >= sn) {
|
|
532
|
+
// incompressible
|
|
533
|
+
return 0;
|
|
534
|
+
}
|
|
535
|
+
copy(dest, src, di, anchor, lastLen);
|
|
536
|
+
di += lastLen;
|
|
537
|
+
return di;
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJJbnZhbGlkU291cmNlIiwiRXJyb3IiLCJlcnJTaG9ydEJ1ZmZlciIsIm1pbk1hdGNoIiwid2luU2l6ZUxvZyIsIndpblNpemUiLCJ3aW5NYXNrIiwiaGFzaFNpemVMb2ciLCJoYXNoU2l6ZSIsImhhc2hTaGlmdCIsIm1mTGltaXQiLCJza2lwU3RyZW5ndGgiLCJoYXNoZXIiLCJpbXVsUG9seWZpbGwiLCJhIiwiYiIsImFoIiwiYWwiLCJiaCIsImJsIiwiaW11bCIsIk1hdGgiLCJnZXRVaW50MzIiLCJpIiwiY29weSIsImRlc3QiLCJzcmMiLCJkaSIsInNpIiwibGVuIiwiY2FsY1VuY29tcHJlc3NlZExlbiIsInNuIiwibGVuZ3RoIiwibExlbiIsIm1MZW4iLCJvZmZzZXQiLCJ1bmNvbXByZXNzQmxvY2siLCJkbiIsImNvbXByZXNzQmxvY2tCb3VuZCIsIm4iLCJjb21wcmVzc0Jsb2NrIiwic29mZnNldCIsImhhc2hUYWJsZSIsIlVpbnQzMkFycmF5IiwiaCIsImFuY2hvciIsImZtYSIsInJlZiIsImwiLCJsYXN0TGVuIiwiY29tcHJlc3NCbG9ja0hDIiwiY2hhaW5UYWJsZSIsIm5leHQiLCJtbCIsInNpMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGx6NC10cyBAbGljZW5zZSBCU0QtMy1DbGF1c2UgLyBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0byAvIDIwMTYsIG9vdi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBQaWVycmUgQ3VydG9cbiAqIENvcHlyaWdodCAoYykgMjAxNiwgb292XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHh4SGFzaCBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBlcnJJbnZhbGlkU291cmNlID0gbmV3IEVycm9yKFwiaW52YWxpZCBzb3VyY2VcIik7XG5jb25zdCBlcnJTaG9ydEJ1ZmZlciA9IG5ldyBFcnJvcihcInNob3J0IGJ1ZmZlclwiKTtcblxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbmNvbnN0IG1pbk1hdGNoID0gNDsgLy8gdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggc2VxdWVuY2Ugc2l6ZSAoNCBieXRlcylcbmNvbnN0IHdpblNpemVMb2cgPSAxNjsgLy8gTFo0IDY0S2Igd2luZG93IHNpemUgbGltaXRcbmNvbnN0IHdpblNpemUgPSAxIDw8IHdpblNpemVMb2c7XG5jb25zdCB3aW5NYXNrID0gd2luU2l6ZSAtIDE7IC8vIDY0S2Igd2luZG93IG9mIHByZXZpb3VzIGRhdGEgZm9yIGRlcGVuZGVudCBibG9ja3NcblxuLy8gaGFzaFNpemVMb2cgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIHRvIHF1aWNrbHkgZmluZCBhIHByZXZpb3VzIG1hdGNoIHBvc2l0aW9uLlxuLy8gSXRzIHZhbHVlIGluZmx1ZW5jZXMgdGhlIGNvbXByZXNzaW9uIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UsIHRoZSBsb3dlciB0aGUgZmFzdGVyLFxuLy8gYnV0IGF0IHRoZSBleHBlbnNlIG9mIHRoZSBjb21wcmVzc2lvbiByYXRpby5cbi8vIDE2IHNlZW1zIHRvIGJlIHRoZSBiZXN0IGNvbXByb21pc2UuXG5jb25zdCBoYXNoU2l6ZUxvZyA9IDE2O1xuY29uc3QgaGFzaFNpemUgPSAxIDw8IGhhc2hTaXplTG9nO1xuY29uc3QgaGFzaFNoaWZ0ID0gbWluTWF0Y2ggKiA4IC0gaGFzaFNpemVMb2c7XG5cbmNvbnN0IG1mTGltaXQgPSA4ICsgbWluTWF0Y2g7IC8vIFRoZSBsYXN0IG1hdGNoIGNhbm5vdCBzdGFydCB3aXRoaW4gdGhlIGxhc3QgMTIgYnl0ZXMuXG5jb25zdCBza2lwU3RyZW5ndGggPSA2OyAvLyB2YXJpYWJsZSBzdGVwIGZvciBmYXN0IHNjYW5cblxuY29uc3QgaGFzaGVyID0gMjY1NDQzNTc2MSB8IDA7IC8vIHByaW1lIG51bWJlciB1c2VkIHRvIGhhc2ggbWluTWF0Y2hcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsI1BvbHlmaWxsXG5mdW5jdGlvbiBpbXVsUG9seWZpbGwoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gIHJldHVybiAoYWwgKiBibCArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApKSB8IDA7XG59XG5jb25zdCBpbXVsID0gTWF0aC5pbXVsID8gTWF0aC5pbXVsIDogaW11bFBvbHlmaWxsO1xuXG5mdW5jdGlvbiBnZXRVaW50MzIoYTogVWludDhBcnJheSwgaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGFbaSArIDNdIHwgKGFbaSArIDJdIDw8IDgpIHwgKGFbaSArIDFdIDw8IDE2KSB8IChhW2ldIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gY29weShcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkaTogbnVtYmVyLFxuICBzaTogbnVtYmVyLFxuICBsZW46IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBkZXN0W2RpKytdID0gc3JjW3NpKytdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVW5jb21wcmVzc2VkTGVuKHNyYzogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aDtcbiAgaWYgKHNuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gbGl0ZXJhbHMgYW5kIG1hdGNoIGxlbmd0aHMgKHRva2VuKVxuICAgIGxldCBsTGVuID0gc3JjW3NpXSA+PiA0O1xuICAgIGxldCBtTGVuID0gc3JjW3NpXSAmIDB4ZjtcbiAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAobExlbiA+IDApIHtcbiAgICAgIGlmIChsTGVuID09PSAweGYpIHtcbiAgICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgICBsTGVuICs9IDB4ZmY7XG4gICAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsTGVuICs9IHNyY1tzaV07XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuXG4gICAgLy8gY29weSB0aGUgbWF0Y2ggKE5CLiBtYXRjaCBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcpXG4gICAgZm9yICg7IG1MZW4gPj0gb2Zmc2V0OyBtTGVuIC09IG9mZnNldCkge1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBkaSArPSBtTGVuO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbXByZXNzQmxvY2soc3JjOiBVaW50OEFycmF5LCBkZXN0OiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRuIC0gZGkgPCBsTGVuIHx8IHNpICsgbExlbiA+IHNuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgY29weShkZXN0LCBzcmMsIGRpLCBzaSwgbExlbik7XG4gICAgICBkaSArPSBsTGVuO1xuICAgICAgc2kgKz0gbExlbjtcbiAgICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgICByZXR1cm4gZGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2kgKz0gMjtcbiAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHNyY1tzaSAtIDJdIHwgKHNyY1tzaSAtIDFdIDw8IDgpO1xuICAgIGlmIChkaSAtIG9mZnNldCA8IDAgfHwgb2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIG1hdGNoXG4gICAgaWYgKG1MZW4gPT09IDB4Zikge1xuICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgbUxlbiArPSAweGZmO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtTGVuICs9IHNyY1tzaV07XG4gICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWluaW11bSBtYXRjaCBsZW5ndGggaXMgNFxuICAgIG1MZW4gKz0gNDtcbiAgICBpZiAoZG4gLSBkaSA8PSBtTGVuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgIGRpICs9IG9mZnNldDtcbiAgICB9XG4gICAgY29weShkZXN0LCBkZXN0LCBkaSwgZGkgLSBvZmZzZXQsIG1MZW4pO1xuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tCb3VuZChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbiArICgobiAvIDI1NSkgfCAwKSArIDE2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9jayhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwLFxuICAgIGRpID0gMDtcblxuICAvLyBmYXN0IHNjYW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG9ubHkgbmVlZCBhIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIGxhc3Qgc2VxdWVuY2VzICg0IGJ5dGVzKVxuICBjb25zdCBoYXNoVGFibGUgPSBuZXcgVWludDMyQXJyYXkoaGFzaFNpemUpO1xuXG4gIC8vIEluaXRpYWxpc2UgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgZmlyc3QgNjRLYiBvZiB0aGUgaW5wdXQgYnVmZmVyXG4gIC8vICh1c2VkIHdoZW4gY29tcHJlc3NpbmcgZGVwZW5kZW50IGJsb2NrcylcbiAgd2hpbGUgKHNpIDwgc29mZnNldCkge1xuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIGxldCBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgLy8gLTEgdG8gc2VwYXJhdGUgZXhpc3RpbmcgZW50cmllcyBmcm9tIG5ldyBvbmVzXG4gICAgY29uc3QgcmVmID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAvLyAuLi5hbmQgc3RvcmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBoYXNoIHRhYmxlICgrMSB0byBjb21wZW5zYXRlIHRoZSAtMSB1cG9uIHNhdmluZylcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGUgbGFzdCAzIGJ5dGVzIGluIHRoZSBmaXJzdCBsaXRlcmFsIDQgYnl0ZXMgYXNcbiAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbmV4dCBtYXRjaCwgaWYgYW55LCBpcyBjb21wcmVzc2VkIHdpdGhcbiAgICAvLyBhIGxvd2VyIHNpemUsIHNpbmNlIHRvIGhhdmUgc29tZSBjb21wcmVzc2lvbiB3ZSBtdXN0IGhhdmU6XG4gICAgLy8gbGwrbWwtb3ZlcmxhcCA+IDEgKyAobGwtMTUpLzI1NSArIChtbC00LTE1KS8yNTUgKyAyICh1bmNvbXByZXNzZWQgc2l6ZT5jb21wcmVzc2VkIHNpemUpXG4gICAgLy8gPT4gbGwrbWw+MysyKm92ZXJsYXAgPT4gbGwrbWw+PSA0KzIqb3ZlcmxhcFxuICAgIC8vIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvIGhhdmU6XG4gICAgLy8gbGwgPj0gMSwgbWwgPj0gNFxuICAgIC8vID0+IGxsK21sID49IDVcbiAgICAvLyA9PiBzbyBvdmVybGFwIG11c3QgYmUgMFxuXG4gICAgLy8gdGhlIHNlcXVlbmNlIGlzIG5ldywgb3V0IG9mIGJvdW5kICg2NGtiKSBvciBub3QgdmFsaWQ6IHRyeSBuZXh0IHNlcXVlbmNlXG4gICAgaWYgKFxuICAgICAgcmVmIDwgMCB8fCAvLyhmbWEgJiAoKDEgPDwgc2tpcFN0cmVuZ3RoKSAtIDEpKSA8IDQgfHwgLy8gdGhpcyBjb2RlIHNlZW1zIGhhcyBhIGJpZyBwZW5hbHR5IGZvciBzaXplLi4uXG4gICAgICAoc2kgLSByZWYpID4+IHdpblNpemVMb2cgPiAwIHx8XG4gICAgICBzcmNbcmVmXSAhPT0gc3JjW3NpXSB8fFxuICAgICAgc3JjW3JlZiArIDFdICE9PSBzcmNbc2kgKyAxXSB8fFxuICAgICAgc3JjW3JlZiArIDJdICE9PSBzcmNbc2kgKyAyXSB8fFxuICAgICAgc3JjW3JlZiArIDNdICE9PSBzcmNbc2kgKyAzXVxuICAgICkge1xuICAgICAgLy8gdmFyaWFibGUgc3RlcDogaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbm9uLWNvbXByZXNzaWJsZSBkYXRhXG4gICAgICBzaSArPSBmbWEgPj4gc2tpcFN0cmVuZ3RoO1xuICAgICAgKytmbWE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gbWF0Y2ggZm91bmRcbiAgICBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc2kgLSByZWY7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMVxuICAgIHNpICs9IG1pbk1hdGNoO1xuICAgIGxldCBtTGVuID0gc2k7IC8vIG1hdGNoIGxlbmd0aCBoYXMgbWluTWF0Y2ggYWxyZWFkeVxuICAgIHdoaWxlIChzaSA8PSBzbiAmJiBzcmNbc2ldID09PSBzcmNbc2kgLSBvZmZzZXRdKSB7XG4gICAgICBzaSsrO1xuICAgIH1cbiAgICBtTGVuID0gc2kgLSBtTGVuO1xuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrSEMoXG4gIHNyYzogVWludDhBcnJheSxcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc29mZnNldDogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGggLSBtZkxpbWl0O1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPD0gMCB8fCBkbiA9PT0gMCB8fCBzb2Zmc2V0ID49IHNuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICAvLyBIYXNoIENoYWluIHN0cmF0ZWd5OlxuICAvLyB3ZSBuZWVkIGEgaGFzaCB0YWJsZSBhbmQgYSBjaGFpbiB0YWJsZVxuICAvLyB0aGUgY2hhaW4gdGFibGUgY2Fubm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYW4gdGhlIHdpbmRvdyBzaXplICg2NEtiIGVudHJpZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG4gIGNvbnN0IGNoYWluVGFibGUgPSBuZXcgVWludDMyQXJyYXkod2luU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgY2hhaW5UYWJsZVtzaSAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIHdoaWxlIChzaSA8IHNuIC0gbWluTWF0Y2gpIHtcbiAgICAvLyBoYXNoIHRoZSBuZXh0IDQgYnl0ZXMgKHNlcXVlbmNlKS4uLlxuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuXG4gICAgLy8gZm9sbG93IHRoZSBjaGFpbiB1bnRpbCBvdXQgb2Ygd2luZG93IGFuZCBnaXZlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAgbGV0IG1MZW4gPSAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoXG4gICAgICBsZXQgbmV4dCA9IGhhc2hUYWJsZVtoXSAtIDE7XG4gICAgICBuZXh0ID4gMCAmJiBuZXh0ID4gc2kgLSB3aW5TaXplO1xuICAgICAgbmV4dCA9IGNoYWluVGFibGVbbmV4dCAmIHdpbk1hc2tdIC0gMVxuICAgICkge1xuICAgICAgLy8gdGhlIGZpcnN0IChtTGVuPT0wKSBvciBuZXh0IGJ5dGUgKG1MZW4+PW1pbk1hdGNoKSBhdCBjdXJyZW50IG1hdGNoIGxlbmd0aCBtdXN0IG1hdGNoIHRvIGltcHJvdmUgb24gdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgaWYgKHNyY1tuZXh0ICsgbUxlbl0gPT09IHNyY1tzaSArIG1MZW5dKSB7XG4gICAgICAgIGZvciAobGV0IG1sID0gMDsgOyArK21sKSB7XG4gICAgICAgICAgaWYgKHNyY1tuZXh0ICsgbWxdICE9PSBzcmNbc2kgKyBtbF0gfHwgc2kgKyBtbCA+IHNuKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIGxvbmdlciBtYXRjaCwga2VlcCBpdHMgcG9zaXRpb24gYW5kIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG1MZW4gPCBtbCAmJiBtbCA+PSBtaW5NYXRjaCkge1xuICAgICAgICAgICAgICBtTGVuID0gbWw7XG4gICAgICAgICAgICAgIG9mZnNldCA9IHNpIC0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gc2kgKyAxO1xuXG4gICAgLy8gbm8gbWF0Y2ggZm91bmRcbiAgICBpZiAobUxlbiA9PT0gMCkge1xuICAgICAgKytzaTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBzaTIgPSBzaSArIDE7XG4gICAgY29uc3QgbWwgPSBzaSArIG1MZW47XG5cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIC8vIHVwZGF0ZSBoYXNoL2NoYWluIHRhYmxlcyB3aXRoIG92ZXJsYXBpbmcgYnl0ZXM6XG4gICAgLy8gc2kgYWxyZWFkeSBoYXNoZWQsIGFkZCBldmVyeXRoaW5nIGZyb20gc2krMSB1cCB0byB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgd2hpbGUgKHNpMiA8IG1sKSB7XG4gICAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaTIpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgICBjaGFpblRhYmxlW3NpMiAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgICAgaGFzaFRhYmxlW2hdID0gKytzaTI7XG4gICAgfVxuXG4gICAgY29uc3QgbExlbiA9IHNpIC0gYW5jaG9yO1xuICAgIHNpICs9IG1MZW47XG4gICAgbUxlbiAtPSBtaW5NYXRjaDsgLy8gbWF0Y2ggbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgbWluTWF0Y2hcblxuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztBQUNwRCxNQUFNQyxjQUFjLEdBQUcsSUFBSUQsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7QUFFaEQ7QUFDQSxNQUFNRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU1DLE9BQU8sR0FBRyxDQUFDLElBQUlELFVBQVU7QUFDL0IsTUFBTUUsT0FBTyxHQUFHRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUUsV0FBVyxHQUFHLEVBQUU7QUFDdEIsTUFBTUMsUUFBUSxHQUFHLENBQUMsSUFBSUQsV0FBVztBQUNqQyxNQUFNRSxTQUFTLEdBQUdOLFFBQVEsR0FBRyxDQUFDLEdBQUdJLFdBQVc7QUFFNUMsTUFBTUcsT0FBTyxHQUFHLENBQUMsR0FBR1AsUUFBUSxDQUFDLENBQUM7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUV4QixNQUFNQyxNQUFNLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUUvQjtBQUNBLFNBQVNDLFlBQVksQ0FBQ0MsQ0FBUyxFQUFFQyxDQUFTLEVBQVU7RUFDbEQsTUFBTUMsRUFBRSxHQUFJRixDQUFD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
|
package/{lib → dist}/sodium.d.ts
RENAMED
|
File without changes
|
package/dist/sodium.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import sodium from "libsodium-wrappers";
|
|
2
|
+
export async function setup() {
|
|
3
|
+
await sodium.ready;
|
|
4
|
+
}
|
|
5
|
+
export { sodium };
|
|
6
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzb2RpdW0iLCJzZXR1cCIsInJlYWR5Il0sInNvdXJjZXMiOlsiLi4vc3JjL3NvZGl1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc29kaXVtIGZyb20gXCJsaWJzb2RpdW0td3JhcHBlcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzb2RpdW0ucmVhZHk7XG59XG5cbmV4cG9ydCB7IHNvZGl1bSB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sb0JBQW9CO0FBRXZDLE9BQU8sZUFBZUMsS0FBSyxHQUFrQjtFQUMzQyxNQUFNRCxNQUFNLENBQUNFLEtBQUs7QUFDcEI7QUFFQSxTQUFTRixNQUFNIn0=
|
|
File without changes
|