@onekeyfe/hd-core 1.2.0-alpha.101 → 1.2.0-alpha.103
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/__tests__/base64Data.test.ts +70 -0
- package/__tests__/check-all-firmware-release-protocol-v2.test.ts +2 -0
- package/__tests__/device-pool-state.test.ts +29 -0
- package/__tests__/deviceUploadNft.test.ts +33 -4
- package/__tests__/get-device-state.test.ts +102 -13
- package/__tests__/protocol-v2-legacy-recovery.test.ts +29 -0
- package/__tests__/protocol-v2.test.ts +309 -17
- package/__tests__/refresh-device-state.test.ts +4 -1
- package/__tests__/resourceBase64Boundary.test.ts +48 -0
- package/__tests__/search-devices.test.ts +2 -0
- package/__tests__/ton-sign-message.test.ts +84 -0
- package/dist/api/FirmwareUpdateV4.d.ts +3 -0
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/GetDeviceState.d.ts.map +1 -1
- package/dist/api/SearchDevices.d.ts.map +1 -1
- package/dist/api/UploadPortfolio.d.ts +1 -1
- package/dist/api/UploadPortfolio.d.ts.map +1 -1
- package/dist/api/firmware/protocolV2Release.d.ts.map +1 -1
- package/dist/api/helpers/base64Data.d.ts +16 -0
- package/dist/api/helpers/base64Data.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceUploadNft.d.ts +2 -3
- package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +2 -3
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -1
- package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/protocolV2LegacyRecovery.d.ts +5 -0
- package/dist/core/protocolV2LegacyRecovery.d.ts.map +1 -0
- package/dist/device/Device.d.ts +9 -2
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/device/DevicePool.d.ts +1 -1
- package/dist/device/DevicePool.d.ts.map +1 -1
- package/dist/index.d.ts +16 -14
- package/dist/index.js +266 -86
- package/dist/protocols/protocol-v2/features.d.ts +8 -0
- package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/index.d.ts +2 -2
- package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
- package/dist/types/api/getDeviceState.d.ts +1 -0
- package/dist/types/api/getDeviceState.d.ts.map +1 -1
- package/dist/types/api/protocolV2.d.ts +1 -1
- package/dist/types/api/protocolV2.d.ts.map +1 -1
- package/dist/utils/pro2Nft.d.ts +7 -0
- package/dist/utils/pro2Nft.d.ts.map +1 -1
- package/package.json +6 -4
- package/src/api/FirmwareUpdateV4.ts +70 -23
- package/src/api/GetDeviceState.ts +1 -0
- package/src/api/SearchDevices.ts +2 -0
- package/src/api/UploadPortfolio.ts +9 -2
- package/src/api/firmware/protocolV2Release.ts +1 -0
- package/src/api/helpers/base64Data.ts +85 -0
- package/src/api/protocol-v2/DeviceUploadNft.ts +56 -8
- package/src/api/protocol-v2/DeviceUploadWallpaper.ts +37 -18
- package/src/api/ton/TonSignMessage.ts +5 -3
- package/src/core/index.ts +4 -0
- package/src/core/protocolV2LegacyRecovery.ts +12 -0
- package/src/device/Device.ts +78 -20
- package/src/device/DevicePool.ts +17 -5
- package/src/protocols/protocol-v2/features.ts +10 -0
- package/src/protocols/protocol-v2/index.ts +2 -0
- package/src/types/api/getDeviceState.ts +2 -0
- package/src/types/api/protocolV2.ts +1 -1
- package/src/utils/pro2Nft.ts +31 -8
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
|
|
1
3
|
import { EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
|
|
2
4
|
import { sha256 } from '@noble/hashes/sha256';
|
|
3
5
|
import { bytesToHex } from '@noble/hashes/utils';
|
|
4
6
|
import JSZip from 'jszip';
|
|
7
|
+
import { encode as encodeJpeg } from 'jpeg-js';
|
|
5
8
|
import {
|
|
6
9
|
DeviceRebootType,
|
|
7
10
|
DeviceSessionPinType,
|
|
@@ -123,6 +126,18 @@ jest.mock('../src/data/config', () => ({
|
|
|
123
126
|
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
|
|
124
127
|
}));
|
|
125
128
|
|
|
129
|
+
const jpegBase64Cache = new Map<string, string>();
|
|
130
|
+
|
|
131
|
+
const createJpegBase64 = (width: number, height: number) => {
|
|
132
|
+
const key = `${width}x${height}`;
|
|
133
|
+
const cached = jpegBase64Cache.get(key);
|
|
134
|
+
if (cached) return cached;
|
|
135
|
+
const rgba = new Uint8Array(width * height * 4).fill(0xff);
|
|
136
|
+
const value = encodeJpeg({ width, height, data: rgba }, 80).data.toString('base64');
|
|
137
|
+
jpegBase64Cache.set(key, value);
|
|
138
|
+
return value;
|
|
139
|
+
};
|
|
140
|
+
|
|
126
141
|
const createProtocolV2OkppBinary = ({
|
|
127
142
|
version = [1, 2, 3],
|
|
128
143
|
payloadHashByte = 0x11,
|
|
@@ -160,8 +175,18 @@ const createWalletSessionTypedCall = (
|
|
|
160
175
|
});
|
|
161
176
|
|
|
162
177
|
describe('DeviceUploadWallpaper', () => {
|
|
178
|
+
const wallpaperProtocolInfo = {
|
|
179
|
+
version: 2,
|
|
180
|
+
supported_messages: [60412, 60805, 60809],
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const stubWallpaperDevice = <T extends Record<string, any>>(device: T) =>
|
|
184
|
+
stubDevice({
|
|
185
|
+
...device,
|
|
186
|
+
ensureProtocolV2RuntimeContext: jest.fn().mockResolvedValue(wallpaperProtocolInfo),
|
|
187
|
+
});
|
|
188
|
+
|
|
163
189
|
test('encodes, uploads and applies a Pro2 wallpaper', async () => {
|
|
164
|
-
const rgba = new Uint8Array(604 * 1024 * 4).fill(255);
|
|
165
190
|
const typedCall = jest.fn().mockImplementation((request, _response, params) => {
|
|
166
191
|
if (request === 'FilesystemDirMake') return { message: { message: 'directory ready' } };
|
|
167
192
|
if (request === 'FilesystemFileWrite') {
|
|
@@ -175,9 +200,12 @@ describe('DeviceUploadWallpaper', () => {
|
|
|
175
200
|
});
|
|
176
201
|
const method = new DeviceUploadWallpaper({
|
|
177
202
|
id: 1,
|
|
178
|
-
payload: {
|
|
203
|
+
payload: {
|
|
204
|
+
method: 'deviceUploadWallpaper',
|
|
205
|
+
jpegBase64: createJpegBase64(604, 1024),
|
|
206
|
+
},
|
|
179
207
|
});
|
|
180
|
-
(method as any).device =
|
|
208
|
+
(method as any).device = stubWallpaperDevice({ commands: { typedCall } });
|
|
181
209
|
method.postMessage = jest.fn();
|
|
182
210
|
|
|
183
211
|
method.init();
|
|
@@ -225,12 +253,10 @@ describe('DeviceUploadWallpaper', () => {
|
|
|
225
253
|
id: 1,
|
|
226
254
|
payload: {
|
|
227
255
|
method: 'deviceUploadWallpaper',
|
|
228
|
-
|
|
229
|
-
height: 1024,
|
|
230
|
-
rgba: new Uint8Array(604 * 1024 * 4),
|
|
256
|
+
jpegBase64: createJpegBase64(604, 1024),
|
|
231
257
|
},
|
|
232
258
|
});
|
|
233
|
-
(method as any).device =
|
|
259
|
+
(method as any).device = stubWallpaperDevice({ commands: { typedCall } });
|
|
234
260
|
method.init();
|
|
235
261
|
|
|
236
262
|
await expect(method.run()).rejects.toThrow('write failed');
|
|
@@ -242,15 +268,37 @@ describe('DeviceUploadWallpaper', () => {
|
|
|
242
268
|
id: 1,
|
|
243
269
|
payload: {
|
|
244
270
|
method: 'deviceUploadWallpaper',
|
|
245
|
-
|
|
246
|
-
height: 1024,
|
|
247
|
-
rgba: new Uint8Array(604 * 1024 * 4),
|
|
271
|
+
jpegBase64: createJpegBase64(604, 1024),
|
|
248
272
|
fileName: '../wallpaper.bin',
|
|
249
273
|
},
|
|
250
274
|
});
|
|
251
275
|
|
|
252
276
|
expect(() => method.init()).toThrow('fileName');
|
|
253
277
|
});
|
|
278
|
+
|
|
279
|
+
test('rejects unsupported firmware before creating or writing files', async () => {
|
|
280
|
+
const typedCall = jest.fn();
|
|
281
|
+
const method = new DeviceUploadWallpaper({
|
|
282
|
+
id: 1,
|
|
283
|
+
payload: {
|
|
284
|
+
method: 'deviceUploadWallpaper',
|
|
285
|
+
jpegBase64: createJpegBase64(604, 1024),
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
(method as any).device = stubDevice({
|
|
289
|
+
commands: { typedCall },
|
|
290
|
+
ensureProtocolV2RuntimeContext: jest.fn().mockResolvedValue({
|
|
291
|
+
version: 2,
|
|
292
|
+
supported_messages: [60805, 60809],
|
|
293
|
+
}),
|
|
294
|
+
});
|
|
295
|
+
method.init();
|
|
296
|
+
|
|
297
|
+
await expect(method.run()).rejects.toMatchObject({
|
|
298
|
+
errorCode: HardwareErrorCode.DeviceNotSupportMethod,
|
|
299
|
+
});
|
|
300
|
+
expect(typedCall).not.toHaveBeenCalled();
|
|
301
|
+
});
|
|
254
302
|
});
|
|
255
303
|
|
|
256
304
|
describe('UploadPortfolio', () => {
|
|
@@ -266,7 +314,6 @@ describe('UploadPortfolio', () => {
|
|
|
266
314
|
});
|
|
267
315
|
|
|
268
316
|
test('writes and applies the portfolio while the device is locked without unlocking', async () => {
|
|
269
|
-
const packageBytes = new Uint8Array([1, 2, 3]);
|
|
270
317
|
const typedCall = jest
|
|
271
318
|
.fn()
|
|
272
319
|
.mockResolvedValueOnce({ message: { processed_byte: 3 } })
|
|
@@ -282,7 +329,7 @@ describe('UploadPortfolio', () => {
|
|
|
282
329
|
id: 1,
|
|
283
330
|
payload: {
|
|
284
331
|
method: 'uploadPortfolio',
|
|
285
|
-
|
|
332
|
+
packageBase64: 'AQID',
|
|
286
333
|
},
|
|
287
334
|
});
|
|
288
335
|
(method as any).device = device;
|
|
@@ -314,7 +361,7 @@ describe('UploadPortfolio', () => {
|
|
|
314
361
|
id: 1,
|
|
315
362
|
payload: {
|
|
316
363
|
method: 'uploadPortfolio',
|
|
317
|
-
|
|
364
|
+
packageBase64: 'AQID',
|
|
318
365
|
},
|
|
319
366
|
});
|
|
320
367
|
(method as any).device = stubPortfolioDevice({ commands: { typedCall } });
|
|
@@ -362,7 +409,7 @@ describe('UploadPortfolio', () => {
|
|
|
362
409
|
id: 1,
|
|
363
410
|
payload: {
|
|
364
411
|
method: 'uploadPortfolio',
|
|
365
|
-
|
|
412
|
+
packageBase64: 'AQ==',
|
|
366
413
|
},
|
|
367
414
|
});
|
|
368
415
|
(method as any).device = stubPortfolioDevice({ commands: { typedCall } });
|
|
@@ -384,7 +431,7 @@ describe('UploadPortfolio', () => {
|
|
|
384
431
|
id: 1,
|
|
385
432
|
payload: {
|
|
386
433
|
method: 'uploadPortfolio',
|
|
387
|
-
packageBytes,
|
|
434
|
+
packageBase64: Buffer.from(packageBytes).toString('base64'),
|
|
388
435
|
},
|
|
389
436
|
});
|
|
390
437
|
method.abortSignal = abortController.signal;
|
|
@@ -405,7 +452,7 @@ describe('UploadPortfolio', () => {
|
|
|
405
452
|
id: 1,
|
|
406
453
|
payload: {
|
|
407
454
|
method: 'uploadPortfolio',
|
|
408
|
-
|
|
455
|
+
packageBase64: 'AQ==',
|
|
409
456
|
},
|
|
410
457
|
});
|
|
411
458
|
(method as any).device = stubDevice({
|
|
@@ -423,6 +470,18 @@ describe('UploadPortfolio', () => {
|
|
|
423
470
|
});
|
|
424
471
|
expect(typedCall).not.toHaveBeenCalled();
|
|
425
472
|
});
|
|
473
|
+
|
|
474
|
+
test('rejects non-canonical Base64 before device communication', () => {
|
|
475
|
+
const method = new UploadPortfolio({
|
|
476
|
+
id: 1,
|
|
477
|
+
payload: {
|
|
478
|
+
method: 'uploadPortfolio',
|
|
479
|
+
packageBase64: 'data:application/octet-stream;base64,AQID',
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
expect(() => method.init()).toThrow('canonical Base64');
|
|
484
|
+
});
|
|
426
485
|
});
|
|
427
486
|
|
|
428
487
|
const descriptor = {
|
|
@@ -3194,6 +3253,125 @@ describe('Protocol V2 feature adapter', () => {
|
|
|
3194
3253
|
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
3195
3254
|
});
|
|
3196
3255
|
|
|
3256
|
+
test('rejects a cached legacy ProtocolInfo outside discovery and firmware recovery', async () => {
|
|
3257
|
+
const device = Device.fromDescriptor({
|
|
3258
|
+
path: 'usb-path',
|
|
3259
|
+
protocolType: 'V2',
|
|
3260
|
+
} as any);
|
|
3261
|
+
const typedCall = jest.fn().mockResolvedValue({
|
|
3262
|
+
type: 'ProtocolInfo',
|
|
3263
|
+
message: {
|
|
3264
|
+
version: 1,
|
|
3265
|
+
build_fingerprint: '',
|
|
3266
|
+
supported_messages: [],
|
|
3267
|
+
protobuf_definition: null,
|
|
3268
|
+
},
|
|
3269
|
+
});
|
|
3270
|
+
(device as any).commands = { typedCall };
|
|
3271
|
+
|
|
3272
|
+
await expect(
|
|
3273
|
+
device.probeProtocolV2RuntimeState({
|
|
3274
|
+
hw: { Device_type: DeviceType.PRO2, serial_no: 'PR2SERIAL' },
|
|
3275
|
+
fw: { application: { version: '1.2.3' } },
|
|
3276
|
+
})
|
|
3277
|
+
).rejects.toMatchObject({ errorCode: HardwareErrorCode.DeviceInitializeFailed });
|
|
3278
|
+
|
|
3279
|
+
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
3280
|
+
});
|
|
3281
|
+
|
|
3282
|
+
test('uses DeviceStatusGet to identify App mode for an allowed legacy ProtocolInfo', async () => {
|
|
3283
|
+
const device = Device.fromDescriptor({
|
|
3284
|
+
path: 'usb-path',
|
|
3285
|
+
protocolType: 'V2',
|
|
3286
|
+
} as any);
|
|
3287
|
+
const typedCall = jest
|
|
3288
|
+
.fn()
|
|
3289
|
+
.mockResolvedValueOnce({
|
|
3290
|
+
type: 'ProtocolInfo',
|
|
3291
|
+
message: {
|
|
3292
|
+
version: 1,
|
|
3293
|
+
build_fingerprint: '',
|
|
3294
|
+
supported_messages: [],
|
|
3295
|
+
protobuf_definition: null,
|
|
3296
|
+
},
|
|
3297
|
+
})
|
|
3298
|
+
.mockResolvedValueOnce({
|
|
3299
|
+
type: 'DeviceStatus',
|
|
3300
|
+
message: { init_states: true, unlocked: true },
|
|
3301
|
+
});
|
|
3302
|
+
(device as any).commands = { typedCall };
|
|
3303
|
+
|
|
3304
|
+
await device.probeProtocolV2RuntimeState(
|
|
3305
|
+
{
|
|
3306
|
+
hw: { Device_type: DeviceType.PRO2, serial_no: 'PR2SERIAL' },
|
|
3307
|
+
fw: { application: { version: '1.2.3' } },
|
|
3308
|
+
},
|
|
3309
|
+
5000,
|
|
3310
|
+
{ allowLegacyProtocolV2ProtocolInfo: true }
|
|
3311
|
+
);
|
|
3312
|
+
|
|
3313
|
+
expect(typedCall).toHaveBeenNthCalledWith(
|
|
3314
|
+
1,
|
|
3315
|
+
'ProtocolInfoRequest',
|
|
3316
|
+
'ProtocolInfo',
|
|
3317
|
+
{ eventless_wallet_session: true },
|
|
3318
|
+
{ timeoutMs: 5000 }
|
|
3319
|
+
);
|
|
3320
|
+
expect(typedCall).toHaveBeenNthCalledWith(
|
|
3321
|
+
2,
|
|
3322
|
+
'DeviceStatusGet',
|
|
3323
|
+
'DeviceStatus',
|
|
3324
|
+
{},
|
|
3325
|
+
{ timeoutMs: 5000 }
|
|
3326
|
+
);
|
|
3327
|
+
expect(device.features).toMatchObject({
|
|
3328
|
+
mode: 'normal',
|
|
3329
|
+
bootloaderMode: false,
|
|
3330
|
+
initialized: true,
|
|
3331
|
+
unlocked: true,
|
|
3332
|
+
});
|
|
3333
|
+
});
|
|
3334
|
+
|
|
3335
|
+
test('maps an allowed legacy loader to bootloader only after an explicit unsupported status', async () => {
|
|
3336
|
+
const device = Device.fromDescriptor({
|
|
3337
|
+
path: 'usb-path',
|
|
3338
|
+
protocolType: 'V2',
|
|
3339
|
+
} as any);
|
|
3340
|
+
const typedCall = jest
|
|
3341
|
+
.fn()
|
|
3342
|
+
.mockResolvedValueOnce({
|
|
3343
|
+
type: 'ProtocolInfo',
|
|
3344
|
+
message: {
|
|
3345
|
+
version: 1,
|
|
3346
|
+
build_fingerprint: '',
|
|
3347
|
+
supported_messages: [],
|
|
3348
|
+
protobuf_definition: null,
|
|
3349
|
+
},
|
|
3350
|
+
})
|
|
3351
|
+
.mockRejectedValueOnce(new Error('Failure_UnexpectedMessage,Unknown message'));
|
|
3352
|
+
(device as any).commands = { typedCall };
|
|
3353
|
+
|
|
3354
|
+
await device.probeProtocolV2RuntimeState(
|
|
3355
|
+
{
|
|
3356
|
+
hw: { Device_type: DeviceType.NEO, serial_no: 'NEOSERIAL' },
|
|
3357
|
+
fw: { bootloader: { version: '0.2.0' } },
|
|
3358
|
+
},
|
|
3359
|
+
undefined,
|
|
3360
|
+
{ allowLegacyProtocolV2ProtocolInfo: true }
|
|
3361
|
+
);
|
|
3362
|
+
|
|
3363
|
+
expect(typedCall).toHaveBeenNthCalledWith(1, 'ProtocolInfoRequest', 'ProtocolInfo', {
|
|
3364
|
+
eventless_wallet_session: true,
|
|
3365
|
+
});
|
|
3366
|
+
expect(typedCall).toHaveBeenNthCalledWith(2, 'DeviceStatusGet', 'DeviceStatus', {});
|
|
3367
|
+
expect(device.features).toMatchObject({
|
|
3368
|
+
deviceType: 'neo',
|
|
3369
|
+
mode: 'bootloader',
|
|
3370
|
+
bootloaderMode: true,
|
|
3371
|
+
initialized: null,
|
|
3372
|
+
});
|
|
3373
|
+
});
|
|
3374
|
+
|
|
3197
3375
|
test('does not reinterpret a state update error as runtime detection failure', async () => {
|
|
3198
3376
|
const device = Device.fromDescriptor({
|
|
3199
3377
|
path: 'usb-path',
|
|
@@ -4249,6 +4427,43 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
4249
4427
|
expect(method.postTipMessage).toHaveBeenCalledWith('GoToBootloaderSuccess');
|
|
4250
4428
|
});
|
|
4251
4429
|
|
|
4430
|
+
test('keeps an ambiguous legacy runtime on the direct loader update path', async () => {
|
|
4431
|
+
const method = new FirmwareUpdateV4({
|
|
4432
|
+
id: 1,
|
|
4433
|
+
payload: {
|
|
4434
|
+
method: 'firmwareUpdateV4',
|
|
4435
|
+
},
|
|
4436
|
+
});
|
|
4437
|
+
(method as any).device = stubDevice({
|
|
4438
|
+
originalDescriptor: { id: 'usb-id', path: 'legacy-path', protocolType: 'V2' },
|
|
4439
|
+
state: {
|
|
4440
|
+
raw: {
|
|
4441
|
+
protocolV2ProtocolInfo: {
|
|
4442
|
+
version: 1,
|
|
4443
|
+
build_fingerprint: '',
|
|
4444
|
+
supported_messages: [],
|
|
4445
|
+
protobuf_definition: null,
|
|
4446
|
+
},
|
|
4447
|
+
},
|
|
4448
|
+
},
|
|
4449
|
+
features: {
|
|
4450
|
+
deviceType: 'pro2',
|
|
4451
|
+
mode: 'bootloader',
|
|
4452
|
+
bootloaderMode: true,
|
|
4453
|
+
capabilities: [],
|
|
4454
|
+
},
|
|
4455
|
+
isBootloader: () => true,
|
|
4456
|
+
isRomloader: () => false,
|
|
4457
|
+
});
|
|
4458
|
+
(method as any).protocolV2Reboot = jest.fn();
|
|
4459
|
+
method.postTipMessage = jest.fn();
|
|
4460
|
+
|
|
4461
|
+
await expect((method as any).enterProtocolV2BootloaderMode()).resolves.toBe(false);
|
|
4462
|
+
|
|
4463
|
+
expect((method as any).protocolV2LegacyDirectUpdate).toBe(true);
|
|
4464
|
+
expect((method as any).protocolV2Reboot).not.toHaveBeenCalled();
|
|
4465
|
+
});
|
|
4466
|
+
|
|
4252
4467
|
test('keeps Protocol V2 romloader active before firmware transfer', async () => {
|
|
4253
4468
|
const method = new FirmwareUpdateV4({
|
|
4254
4469
|
id: 1,
|
|
@@ -4881,6 +5096,81 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
4881
5096
|
expect(method.postProgressMessage).not.toHaveBeenCalled();
|
|
4882
5097
|
});
|
|
4883
5098
|
|
|
5099
|
+
test('reboots a legacy App only after the direct update endpoint is explicitly unavailable', async () => {
|
|
5100
|
+
const method = new FirmwareUpdateV4({
|
|
5101
|
+
id: 1,
|
|
5102
|
+
payload: {
|
|
5103
|
+
method: 'firmwareUpdateV4',
|
|
5104
|
+
},
|
|
5105
|
+
});
|
|
5106
|
+
const targets = [{ target_id: 4, path: 'vol0:/application_p1.bin' }];
|
|
5107
|
+
const typedCall = jest
|
|
5108
|
+
.fn()
|
|
5109
|
+
.mockRejectedValueOnce(new Error('Failure_InvalidMessage,Handler not registered'))
|
|
5110
|
+
.mockResolvedValueOnce({ type: 'Success', message: { message: '' } });
|
|
5111
|
+
|
|
5112
|
+
(method as any).device = stubDevice({
|
|
5113
|
+
getCommands: () => ({ typedCall }),
|
|
5114
|
+
});
|
|
5115
|
+
(method as any).protocolV2LegacyDirectUpdate = true;
|
|
5116
|
+
(method as any).rebootProtocolV2ToBootloader = jest.fn().mockResolvedValue(true);
|
|
5117
|
+
method.postTipMessage = jest.fn();
|
|
5118
|
+
method.postProgressMessage = jest.fn();
|
|
5119
|
+
|
|
5120
|
+
await expect((method as any).protocolV2StartFirmwareUpdate({ targets })).resolves.toEqual({
|
|
5121
|
+
type: 'Success',
|
|
5122
|
+
message: { message: '' },
|
|
5123
|
+
});
|
|
5124
|
+
|
|
5125
|
+
expect(typedCall).toHaveBeenCalledTimes(2);
|
|
5126
|
+
expect(typedCall).toHaveBeenNthCalledWith(
|
|
5127
|
+
1,
|
|
5128
|
+
'DeviceFirmwareUpdateRequest',
|
|
5129
|
+
'Success',
|
|
5130
|
+
{ targets },
|
|
5131
|
+
{ timeoutMs: 180000 }
|
|
5132
|
+
);
|
|
5133
|
+
expect(typedCall).toHaveBeenNthCalledWith(
|
|
5134
|
+
2,
|
|
5135
|
+
'DeviceFirmwareUpdateRequest',
|
|
5136
|
+
'Success',
|
|
5137
|
+
{ targets },
|
|
5138
|
+
{ timeoutMs: 180000 }
|
|
5139
|
+
);
|
|
5140
|
+
expect((method as any).rebootProtocolV2ToBootloader).toHaveBeenCalledTimes(1);
|
|
5141
|
+
expect(method.postTipMessage).toHaveBeenCalledWith('FirmwareUpdating');
|
|
5142
|
+
expect(method.postProgressMessage).toHaveBeenCalledWith(0, 'installingFirmware');
|
|
5143
|
+
});
|
|
5144
|
+
|
|
5145
|
+
test('does not replay a legacy direct update after a link failure', async () => {
|
|
5146
|
+
const method = new FirmwareUpdateV4({
|
|
5147
|
+
id: 1,
|
|
5148
|
+
payload: {
|
|
5149
|
+
method: 'firmwareUpdateV4',
|
|
5150
|
+
},
|
|
5151
|
+
});
|
|
5152
|
+
const typedCall = jest.fn().mockRejectedValue(new Error('LIBUSB_TRANSFER_TIMED_OUT'));
|
|
5153
|
+
|
|
5154
|
+
(method as any).device = stubDevice({
|
|
5155
|
+
getCommands: () => ({ typedCall }),
|
|
5156
|
+
});
|
|
5157
|
+
(method as any).protocolV2LegacyDirectUpdate = true;
|
|
5158
|
+
(method as any).rebootProtocolV2ToBootloader = jest.fn();
|
|
5159
|
+
method.postTipMessage = jest.fn();
|
|
5160
|
+
method.postProgressMessage = jest.fn();
|
|
5161
|
+
|
|
5162
|
+
await expect(
|
|
5163
|
+
(method as any).protocolV2StartFirmwareUpdate({
|
|
5164
|
+
targets: [{ target_id: 4, path: 'vol0:/application_p1.bin' }],
|
|
5165
|
+
})
|
|
5166
|
+
).rejects.toThrow('LIBUSB_TRANSFER_TIMED_OUT');
|
|
5167
|
+
|
|
5168
|
+
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
5169
|
+
expect((method as any).rebootProtocolV2ToBootloader).not.toHaveBeenCalled();
|
|
5170
|
+
expect(method.postTipMessage).not.toHaveBeenCalled();
|
|
5171
|
+
expect(method.postProgressMessage).not.toHaveBeenCalled();
|
|
5172
|
+
});
|
|
5173
|
+
|
|
4884
5174
|
test('polls only firmware status while Protocol V2 bootloader is installing', async () => {
|
|
4885
5175
|
const method = new FirmwareUpdateV4({
|
|
4886
5176
|
id: 1,
|
|
@@ -5009,7 +5299,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5009
5299
|
(method as any).device = stubDevice({ probeProtocolV2RuntimeState });
|
|
5010
5300
|
|
|
5011
5301
|
await expect((method as any).probeProtocolV2NormalMode(deviceInfo)).resolves.toBe(expected);
|
|
5012
|
-
expect(probeProtocolV2RuntimeState).toHaveBeenCalledWith(deviceInfo, 5000
|
|
5302
|
+
expect(probeProtocolV2RuntimeState).toHaveBeenCalledWith(deviceInfo, 5000, {
|
|
5303
|
+
allowLegacyProtocolV2ProtocolInfo: true,
|
|
5304
|
+
});
|
|
5013
5305
|
});
|
|
5014
5306
|
|
|
5015
5307
|
test('keeps polling when the firmware status handler is missing in loader mode', async () => {
|
|
@@ -48,7 +48,10 @@ describe('live device state reads', () => {
|
|
|
48
48
|
|
|
49
49
|
await method.run();
|
|
50
50
|
|
|
51
|
-
expect(getDeviceState).toHaveBeenCalledWith({
|
|
51
|
+
expect(getDeviceState).toHaveBeenCalledWith({
|
|
52
|
+
refreshSections: [...refreshSections],
|
|
53
|
+
...(scope === 'firmware' ? { allowLegacyProtocolV2ProtocolInfo: true } : {}),
|
|
54
|
+
});
|
|
52
55
|
});
|
|
53
56
|
|
|
54
57
|
test.each(['bootloader', 'romloader'] as const)(
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HardwareTopLevelSdk } from '../src';
|
|
2
|
+
import { findMethod } from '../src/api/utils';
|
|
3
|
+
|
|
4
|
+
import type { LowLevelCoreApi } from '../src';
|
|
5
|
+
|
|
6
|
+
jest.mock('../src/data/config', () => ({
|
|
7
|
+
DEFAULT_DOMAIN: 'https://example.com/',
|
|
8
|
+
getSDKVersion: () => '0.0.0-test',
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
const crossJsonOnlyBridge = (value: unknown): unknown => JSON.parse(JSON.stringify(value));
|
|
12
|
+
|
|
13
|
+
describe('Base64 resource boundary', () => {
|
|
14
|
+
test('keeps Portfolio, wallpaper and NFT payloads JSON-safe across TopLevel and LowLevel', async () => {
|
|
15
|
+
const restoredPayloads: Array<Record<string, any>> = [];
|
|
16
|
+
const lowLevelApi = {
|
|
17
|
+
call: jest.fn(params => {
|
|
18
|
+
const method = findMethod({ id: 1, payload: crossJsonOnlyBridge(params) } as any);
|
|
19
|
+
restoredPayloads.push(method.payload);
|
|
20
|
+
return Promise.resolve({ success: true, payload: {} });
|
|
21
|
+
}),
|
|
22
|
+
init: jest.fn(() => Promise.resolve(true)),
|
|
23
|
+
} as unknown as LowLevelCoreApi;
|
|
24
|
+
const sdk = HardwareTopLevelSdk();
|
|
25
|
+
await sdk.init({}, lowLevelApi);
|
|
26
|
+
|
|
27
|
+
await sdk.uploadPortfolio('connect-id', { packageBase64: 'AQID' });
|
|
28
|
+
await sdk.deviceUploadWallpaper('connect-id', { jpegBase64: '/9j/' });
|
|
29
|
+
await sdk.deviceUploadNft('connect-id', {
|
|
30
|
+
imageJpegBase64: '/9j/',
|
|
31
|
+
thumbnailJpegBase64: '/9j/',
|
|
32
|
+
title: 'NFT',
|
|
33
|
+
subtitle: '',
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
expect(restoredPayloads.map(payload => payload.method)).toEqual([
|
|
37
|
+
'uploadPortfolio',
|
|
38
|
+
'deviceUploadWallpaper',
|
|
39
|
+
'deviceUploadNft',
|
|
40
|
+
]);
|
|
41
|
+
expect(restoredPayloads[0].packageBase64).toBe('AQID');
|
|
42
|
+
expect(restoredPayloads[1].jpegBase64).toBe('/9j/');
|
|
43
|
+
expect(restoredPayloads[2]).toMatchObject({
|
|
44
|
+
imageJpegBase64: '/9j/',
|
|
45
|
+
thumbnailJpegBase64: '/9j/',
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -94,6 +94,7 @@ describe('SearchDevices', () => {
|
|
|
94
94
|
connectProtocol: undefined,
|
|
95
95
|
forceProtocolDetection: true,
|
|
96
96
|
refreshRuntimeState: true,
|
|
97
|
+
allowLegacyProtocolV2ProtocolInfo: true,
|
|
97
98
|
}
|
|
98
99
|
);
|
|
99
100
|
expect(mockGetDevices).toHaveBeenNthCalledWith(
|
|
@@ -104,6 +105,7 @@ describe('SearchDevices', () => {
|
|
|
104
105
|
connectProtocol: undefined,
|
|
105
106
|
forceProtocolDetection: true,
|
|
106
107
|
refreshRuntimeState: true,
|
|
108
|
+
allowLegacyProtocolV2ProtocolInfo: true,
|
|
107
109
|
}
|
|
108
110
|
);
|
|
109
111
|
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { EDeviceType } from '@onekeyfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import TonSignMessage from '../src/api/ton/TonSignMessage';
|
|
4
|
+
|
|
5
|
+
jest.mock('../src/data/config', () => ({
|
|
6
|
+
getSDKVersion: jest.fn(() => '1.0.0'),
|
|
7
|
+
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
const createMethod = (deviceType: EDeviceType) => {
|
|
11
|
+
const method = new TonSignMessage({
|
|
12
|
+
id: 1,
|
|
13
|
+
payload: {
|
|
14
|
+
method: 'tonSignMessage',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
Object.defineProperty(method, 'device', {
|
|
19
|
+
value: {
|
|
20
|
+
getCurrentDeviceType: () => deviceType,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return method;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
describe('TonSignMessage response compatibility', () => {
|
|
28
|
+
test.each([EDeviceType.Pro2, EDeviceType.Neo])(
|
|
29
|
+
'uses the corrected signing_message field for %s',
|
|
30
|
+
async deviceType => {
|
|
31
|
+
const method = createMethod(deviceType);
|
|
32
|
+
|
|
33
|
+
await expect(
|
|
34
|
+
method.processTxRequest(
|
|
35
|
+
{
|
|
36
|
+
signature: 'signature',
|
|
37
|
+
signing_message: 'serialized-message',
|
|
38
|
+
},
|
|
39
|
+
''
|
|
40
|
+
)
|
|
41
|
+
).resolves.toEqual({
|
|
42
|
+
signature: 'signature',
|
|
43
|
+
signing_message: 'serialized-message',
|
|
44
|
+
skip_validate: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
test('normalizes the legacy Protocol V1 field without removing it', async () => {
|
|
50
|
+
const method = createMethod(EDeviceType.Classic1s);
|
|
51
|
+
|
|
52
|
+
await expect(
|
|
53
|
+
method.processTxRequest(
|
|
54
|
+
{
|
|
55
|
+
signature: 'signature',
|
|
56
|
+
signning_message: 'message-hash',
|
|
57
|
+
},
|
|
58
|
+
''
|
|
59
|
+
)
|
|
60
|
+
).resolves.toEqual({
|
|
61
|
+
signature: 'signature',
|
|
62
|
+
signning_message: 'message-hash',
|
|
63
|
+
signing_message: 'message-hash',
|
|
64
|
+
skip_validate: true,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('skips validation when blind signing omits the signing message', async () => {
|
|
69
|
+
const method = createMethod(EDeviceType.Pro2);
|
|
70
|
+
|
|
71
|
+
await expect(
|
|
72
|
+
method.processTxRequest(
|
|
73
|
+
{
|
|
74
|
+
signature: 'signature',
|
|
75
|
+
},
|
|
76
|
+
''
|
|
77
|
+
)
|
|
78
|
+
).resolves.toEqual({
|
|
79
|
+
signature: 'signature',
|
|
80
|
+
signing_message: undefined,
|
|
81
|
+
skip_validate: true,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -11,6 +11,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
11
11
|
getSupportedProtocols(): readonly ["V2"];
|
|
12
12
|
private protocolV2PreparedSources;
|
|
13
13
|
private protocolV2ExecutionInLoader;
|
|
14
|
+
private protocolV2LegacyDirectUpdate;
|
|
14
15
|
private protocolV2BootResourceStagingSafe;
|
|
15
16
|
private protocolV2CompletedTargetVersions;
|
|
16
17
|
private protocolV2LatestFinalFeatures?;
|
|
@@ -58,6 +59,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
58
59
|
private isProtocolV2ResourceBundleUpToDate;
|
|
59
60
|
private isProtocolV2BootloaderMode;
|
|
60
61
|
private isProtocolV2RomloaderMode;
|
|
62
|
+
private isLegacyProtocolV2Runtime;
|
|
63
|
+
private rebootProtocolV2ToBootloader;
|
|
61
64
|
enterProtocolV2BootloaderMode(): Promise<boolean>;
|
|
62
65
|
private waitForProtocolV2BootloaderMode;
|
|
63
66
|
private collectExplicitTargetBinaries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDeviceState.d.ts","sourceRoot":"","sources":["../../src/api/GetDeviceState.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAU1F,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CACpD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAC9C;IACC,qBAAqB;IAIrB,IAAI;IAmBE,GAAG;
|
|
1
|
+
{"version":3,"file":"GetDeviceState.d.ts","sourceRoot":"","sources":["../../src/api/GetDeviceState.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAU1F,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CACpD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAC9C;IACC,qBAAqB;IAIrB,IAAI;IAmBE,GAAG;CAiBV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchDevices.d.ts","sourceRoot":"","sources":["../../src/api/SearchDevices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAC;AAI7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;IACnD,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B,IAAI;IAME,GAAG;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SearchDevices.d.ts","sourceRoot":"","sources":["../../src/api/SearchDevices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAC;AAI7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;IACnD,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B,IAAI;IAME,GAAG;;;;;;;;;;;;;;;CAgEV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B,CAAC;AAQF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IACpD,IAAI;IAwBE,GAAG;;;;;;;;CAsBV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocolV2Release.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/protocolV2Release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kCAAkC,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,eAAO,MAAM,iCAAiC,EAAE,SAAS,kCAAkC,EAO1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,kCAAkC,EAEhF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EAEvF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;QACrC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,GAAG;YACtD,UAAU,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;SAChD,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,EACzD,MAAM,EACN,YAAY,EAAE,iBAAiB,EAC/B,iBAAyB,EACzB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gCAAgC,CAAC,
|
|
1
|
+
{"version":3,"file":"protocolV2Release.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/protocolV2Release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kCAAkC,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,eAAO,MAAM,iCAAiC,EAAE,SAAS,kCAAkC,EAO1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,kCAAkC,EAEhF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EAEvF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;QACrC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,GAAG;YACtD,UAAU,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;SAChD,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,EACzD,MAAM,EACN,YAAY,EAAE,iBAAiB,EAC/B,iBAAyB,EACzB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA6B5C;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,EACnC,gBAAgB,EAAE,SAAS,kCAAkC,EAAE,GAC9D,6BAA6B,CAiC/B;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;CAChD,GAAG,0BAA0B,CAU7B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,6BAA6B,EACnC,eAAe,EAAE,kCAAkC,GAClD,8BAA8B,GAAG,SAAS,CAmB5C"}
|