@yume-chan/scrcpy 0.0.16 → 0.0.17
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/CHANGELOG.json +15 -0
- package/CHANGELOG.md +9 -1
- package/README.md +275 -38
- package/esm/adb/client.d.ts +40 -0
- package/esm/adb/client.d.ts.map +1 -0
- package/esm/adb/client.js +218 -0
- package/esm/adb/client.js.map +1 -0
- package/esm/adb/connection.d.ts +38 -0
- package/esm/adb/connection.d.ts.map +1 -0
- package/esm/{connection.js → adb/connection.js} +20 -24
- package/esm/adb/connection.js.map +1 -0
- package/esm/adb/index.d.ts +4 -0
- package/esm/adb/index.d.ts.map +1 -0
- package/esm/adb/index.js +4 -0
- package/esm/adb/index.js.map +1 -0
- package/esm/adb/options/1_16.d.ts +8 -0
- package/esm/adb/options/1_16.d.ts.map +1 -0
- package/esm/adb/options/1_16.js +20 -0
- package/esm/adb/options/1_16.js.map +1 -0
- package/esm/adb/options/1_22.d.ts +8 -0
- package/esm/adb/options/1_22.d.ts.map +1 -0
- package/esm/adb/options/1_22.js +17 -0
- package/esm/adb/options/1_22.js.map +1 -0
- package/esm/adb/options/index.d.ts +4 -0
- package/esm/adb/options/index.d.ts.map +1 -0
- package/esm/adb/options/index.js +4 -0
- package/esm/adb/options/index.js.map +1 -0
- package/esm/adb/options/types.d.ts +23 -0
- package/esm/adb/options/types.d.ts.map +1 -0
- package/esm/adb/options/types.js +30 -0
- package/esm/adb/options/types.js.map +1 -0
- package/esm/codec.js +2 -2
- package/esm/codec.js.map +1 -1
- package/esm/control/index.d.ts +8 -0
- package/esm/control/index.d.ts.map +1 -0
- package/esm/control/index.js +8 -0
- package/esm/control/index.js.map +1 -0
- package/esm/control/inject-keycode.d.ts +53 -0
- package/esm/control/inject-keycode.d.ts.map +1 -0
- package/esm/control/inject-keycode.js +54 -0
- package/esm/control/inject-keycode.js.map +1 -0
- package/esm/control/inject-text.d.ts +9 -0
- package/esm/control/inject-text.d.ts.map +1 -0
- package/esm/control/inject-text.js +7 -0
- package/esm/control/inject-text.js.map +1 -0
- package/esm/control/inject-touch.d.ts +30 -0
- package/esm/control/inject-touch.d.ts.map +1 -0
- package/esm/control/inject-touch.js +30 -0
- package/esm/control/inject-touch.js.map +1 -0
- package/esm/control/rotate-device.d.ts +7 -0
- package/esm/control/rotate-device.d.ts.map +1 -0
- package/esm/control/rotate-device.js +5 -0
- package/esm/control/rotate-device.js.map +1 -0
- package/esm/control/serializer.d.ts +23 -0
- package/esm/control/serializer.d.ts.map +1 -0
- package/esm/control/serializer.js +73 -0
- package/esm/control/serializer.js.map +1 -0
- package/esm/control/set-screen-power-mode.d.ts +12 -0
- package/esm/control/set-screen-power-mode.d.ts.map +1 -0
- package/esm/control/set-screen-power-mode.js +12 -0
- package/esm/control/set-screen-power-mode.js.map +1 -0
- package/esm/control/type.d.ts +15 -0
- package/esm/control/type.d.ts.map +1 -0
- package/esm/control/type.js +19 -0
- package/esm/control/type.js.map +1 -0
- package/esm/decoder/index.d.ts +27 -3
- package/esm/decoder/index.d.ts.map +1 -1
- package/esm/decoder/index.js +1 -3
- package/esm/decoder/index.js.map +1 -1
- package/esm/decoder/tinyh264/index.d.ts +5 -5
- package/esm/decoder/tinyh264/index.d.ts.map +1 -1
- package/esm/decoder/tinyh264/index.js +4 -4
- package/esm/decoder/tinyh264/index.js.map +1 -1
- package/esm/decoder/tinyh264/worker.js.map +1 -1
- package/esm/decoder/tinyh264/wrapper.d.ts.map +1 -1
- package/esm/decoder/tinyh264/wrapper.js +14 -8
- package/esm/decoder/tinyh264/wrapper.js.map +1 -1
- package/esm/decoder/types.d.ts +1 -27
- package/esm/decoder/types.d.ts.map +1 -1
- package/esm/decoder/web-codecs/index.d.ts +4 -4
- package/esm/decoder/web-codecs/index.d.ts.map +1 -1
- package/esm/decoder/web-codecs/index.js +1 -1
- package/esm/decoder/web-codecs/index.js.map +1 -1
- package/esm/device-message/clipboard.d.ts +10 -0
- package/esm/device-message/clipboard.d.ts.map +1 -0
- package/esm/device-message/clipboard.js +7 -0
- package/esm/device-message/clipboard.js.map +1 -0
- package/esm/device-message/index.d.ts +4 -0
- package/esm/device-message/index.d.ts.map +1 -0
- package/esm/device-message/index.js +4 -0
- package/esm/device-message/index.js.map +1 -0
- package/esm/device-message/stream.d.ts +7 -0
- package/esm/device-message/stream.d.ts.map +1 -0
- package/esm/device-message/stream.js +16 -0
- package/esm/device-message/stream.js.map +1 -0
- package/esm/device-message/type.d.ts +5 -0
- package/esm/device-message/type.d.ts.map +1 -0
- package/esm/device-message/type.js +7 -0
- package/esm/device-message/type.js.map +1 -0
- package/esm/index.d.ts +3 -6
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -6
- package/esm/index.js.map +1 -1
- package/esm/options/1_16/codec-options.d.ts +19 -0
- package/esm/options/1_16/codec-options.d.ts.map +1 -0
- package/esm/options/1_16/codec-options.js +27 -0
- package/esm/options/1_16/codec-options.js.map +1 -0
- package/esm/options/1_16/index.d.ts +3 -110
- package/esm/options/1_16/index.d.ts.map +1 -1
- package/esm/options/1_16/index.js +3 -226
- package/esm/options/1_16/index.js.map +1 -1
- package/esm/options/1_16/options.d.ts +97 -0
- package/esm/options/1_16/options.d.ts.map +1 -0
- package/esm/options/1_16/options.js +188 -0
- package/esm/options/1_16/options.js.map +1 -0
- package/esm/options/1_18.d.ts +8 -8
- package/esm/options/1_18.d.ts.map +1 -1
- package/esm/options/1_18.js +6 -6
- package/esm/options/1_18.js.map +1 -1
- package/esm/options/1_21.d.ts +1 -1
- package/esm/options/1_21.d.ts.map +1 -1
- package/esm/options/1_21.js +1 -1
- package/esm/options/1_21.js.map +1 -1
- package/esm/options/1_22.d.ts +5 -8
- package/esm/options/1_22.d.ts.map +1 -1
- package/esm/options/1_22.js +4 -17
- package/esm/options/1_22.js.map +1 -1
- package/esm/options/1_23.d.ts +4 -4
- package/esm/options/1_23.d.ts.map +1 -1
- package/esm/options/1_23.js +1 -1
- package/esm/options/1_23.js.map +1 -1
- package/esm/options/1_24.d.ts +1 -1
- package/esm/options/1_24.d.ts.map +1 -1
- package/esm/options/1_24.js.map +1 -1
- package/esm/options/index.d.ts +1 -1
- package/esm/options/index.d.ts.map +1 -1
- package/esm/options/index.js +1 -1
- package/esm/options/index.js.map +1 -1
- package/esm/options/types.d.ts +45 -0
- package/esm/options/types.d.ts.map +1 -0
- package/esm/options/{common.js → types.js} +1 -1
- package/esm/options/types.js.map +1 -0
- package/package.json +24 -24
- package/src/adb/client.ts +292 -0
- package/src/{connection.ts → adb/connection.ts} +35 -38
- package/src/adb/index.ts +3 -0
- package/src/adb/options/1_16.ts +23 -0
- package/src/adb/options/1_22.ts +20 -0
- package/src/adb/options/index.ts +3 -0
- package/src/adb/options/types.ts +55 -0
- package/src/control/index.ts +7 -0
- package/src/control/inject-keycode.ts +59 -0
- package/src/control/inject-text.ts +12 -0
- package/src/control/inject-touch.ts +34 -0
- package/src/control/rotate-device.ts +10 -0
- package/src/control/serializer.ts +86 -0
- package/src/control/set-screen-power-mode.ts +17 -0
- package/src/control/type.ts +17 -0
- package/src/device-message/clipboard.ts +11 -0
- package/src/device-message/index.ts +3 -0
- package/src/device-message/stream.ts +19 -0
- package/src/device-message/type.ts +5 -0
- package/src/index.ts +3 -6
- package/src/options/1_16/codec-options.ts +48 -0
- package/src/options/1_16/index.ts +3 -345
- package/src/options/1_16/options.ts +294 -0
- package/src/options/1_18.ts +12 -10
- package/src/options/1_21.ts +16 -6
- package/src/options/1_22.ts +10 -21
- package/src/options/1_23.ts +7 -5
- package/src/options/1_24.ts +3 -2
- package/src/options/index.ts +1 -1
- package/src/options/{common.ts → types.ts} +32 -13
- package/tsconfig.build.json +3 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.test.tsbuildinfo +1 -0
- package/esm/client.d.ts +0 -48
- package/esm/client.d.ts.map +0 -1
- package/esm/client.js +0 -341
- package/esm/client.js.map +0 -1
- package/esm/connection.d.ts +0 -37
- package/esm/connection.d.ts.map +0 -1
- package/esm/connection.js.map +0 -1
- package/esm/message.d.ts +0 -98
- package/esm/message.d.ts.map +0 -1
- package/esm/message.js +0 -98
- package/esm/message.js.map +0 -1
- package/esm/options/common.d.ts +0 -34
- package/esm/options/common.d.ts.map +0 -1
- package/esm/options/common.js.map +0 -1
- package/esm/push-server.d.ts +0 -6
- package/esm/push-server.d.ts.map +0 -1
- package/esm/push-server.js +0 -16
- package/esm/push-server.js.map +0 -1
- package/esm/utils.d.ts +0 -2
- package/esm/utils.d.ts.map +0 -1
- package/esm/utils.js +0 -6
- package/esm/utils.js.map +0 -1
- package/src/client.ts +0 -435
- package/src/decoder/index.ts +0 -3
- package/src/decoder/tinyh264/index.ts +0 -112
- package/src/decoder/tinyh264/types.d.ts +0 -137
- package/src/decoder/tinyh264/worker.ts +0 -2
- package/src/decoder/tinyh264/wrapper.ts +0 -89
- package/src/decoder/types.ts +0 -35
- package/src/decoder/web-codecs/index.ts +0 -99
- package/src/message.ts +0 -113
- package/src/push-server.ts +0 -24
- package/src/utils.ts +0 -5
package/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
package/esm/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './adb/index.js';
|
|
2
2
|
export * from './codec.js';
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './message.js';
|
|
3
|
+
export * from './control/index.js';
|
|
4
|
+
export * from './device-message/index.js';
|
|
6
5
|
export * from './options/index.js';
|
|
7
|
-
export * from './push-server.js';
|
|
8
|
-
export * from './utils.js';
|
|
9
6
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AndroidCodecLevel, AndroidCodecProfile } from '../../codec.js';
|
|
2
|
+
import type { ScrcpyOptionValue } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* If the option you need is not in this type,
|
|
5
|
+
* please file an issue on GitHub.
|
|
6
|
+
*/
|
|
7
|
+
export interface CodecOptionsInit {
|
|
8
|
+
profile: AndroidCodecProfile;
|
|
9
|
+
level: AndroidCodecLevel;
|
|
10
|
+
iFrameInterval: number;
|
|
11
|
+
repeatPreviousFrameAfter: number;
|
|
12
|
+
maxPtsGapToEncoder: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class CodecOptions implements ScrcpyOptionValue {
|
|
15
|
+
value: Partial<CodecOptionsInit>;
|
|
16
|
+
constructor(value: Partial<CodecOptionsInit>);
|
|
17
|
+
toOptionValue(): string | undefined;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=codec-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-options.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAWD,qBAAa,YAAa,YAAW,iBAAiB;IAC3C,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAErB,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI5C,aAAa,IAAI,MAAM,GAAG,SAAS;CAe7C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function toDashCase(input) {
|
|
2
|
+
return input.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
3
|
+
}
|
|
4
|
+
const CODEC_OPTION_TYPES = {
|
|
5
|
+
repeatPreviousFrameAfter: 'long',
|
|
6
|
+
maxPtsGapToEncoder: 'long',
|
|
7
|
+
};
|
|
8
|
+
export class CodecOptions {
|
|
9
|
+
value;
|
|
10
|
+
constructor(value) {
|
|
11
|
+
this.value = value;
|
|
12
|
+
}
|
|
13
|
+
toOptionValue() {
|
|
14
|
+
const entries = Object.entries(this.value)
|
|
15
|
+
.filter(([key, value]) => value !== undefined);
|
|
16
|
+
if (entries.length === 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return entries
|
|
20
|
+
.map(([key, value]) => {
|
|
21
|
+
const type = CODEC_OPTION_TYPES[key];
|
|
22
|
+
return `${toDashCase(key)}${type ? `:${type}` : ''}=${value}`;
|
|
23
|
+
})
|
|
24
|
+
.join(',');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=codec-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-options.js","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAgBA,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,kBAAkB,GAAyE;IAC7F,wBAAwB,EAAE,MAAM;IAChC,kBAAkB,EAAE,MAAM;CAC7B,CAAC;AAEF,MAAM,OAAO,YAAY;IACd,KAAK,CAA4B;IAExC,YAAmB,KAAgC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,aAAa;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,OAAO;aACT,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAA6B,CAAC,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;QAClE,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ"}
|
|
@@ -1,111 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { ScrcpyClientConnection } from "../../connection.js";
|
|
5
|
-
import { ScrcpyControlMessageType } from "../../message.js";
|
|
6
|
-
import type { ScrcpyBackOrScreenOnEvent1_18 } from "../1_18.js";
|
|
7
|
-
import type { ScrcpyInjectScrollControlMessage1_22 } from "../1_22.js";
|
|
8
|
-
import { type ScrcpyOptions, type ScrcpyOptionValue, type VideoStreamPacket } from "../common.js";
|
|
9
|
-
export declare enum ScrcpyLogLevel {
|
|
10
|
-
Verbose = "verbose",
|
|
11
|
-
Debug = "debug",
|
|
12
|
-
Info = "info",
|
|
13
|
-
Warn = "warn",
|
|
14
|
-
Error = "error"
|
|
15
|
-
}
|
|
16
|
-
export declare enum ScrcpyVideoOrientation {
|
|
17
|
-
Initial = -2,
|
|
18
|
-
Unlocked = -1,
|
|
19
|
-
Portrait = 0,
|
|
20
|
-
Landscape = 1,
|
|
21
|
-
PortraitFlipped = 2,
|
|
22
|
-
LandscapeFlipped = 3
|
|
23
|
-
}
|
|
24
|
-
export interface CodecOptionsInit {
|
|
25
|
-
profile: AndroidCodecProfile;
|
|
26
|
-
level: AndroidCodecLevel;
|
|
27
|
-
iFrameInterval: number;
|
|
28
|
-
repeatPreviousFrameAfter: number;
|
|
29
|
-
maxPtsGapToEncoder: number;
|
|
30
|
-
}
|
|
31
|
-
export declare class CodecOptions implements ScrcpyOptionValue {
|
|
32
|
-
value: Partial<CodecOptionsInit>;
|
|
33
|
-
constructor(value: Partial<CodecOptionsInit>);
|
|
34
|
-
toOptionValue(): string | undefined;
|
|
35
|
-
}
|
|
36
|
-
export interface ScrcpyOptionsInit1_16 {
|
|
37
|
-
logLevel: ScrcpyLogLevel;
|
|
38
|
-
/**
|
|
39
|
-
* The maximum value of both width and height.
|
|
40
|
-
*/
|
|
41
|
-
maxSize: number;
|
|
42
|
-
bitRate: number;
|
|
43
|
-
/**
|
|
44
|
-
* 0 for unlimited.
|
|
45
|
-
*
|
|
46
|
-
* @default 0
|
|
47
|
-
*/
|
|
48
|
-
maxFps: number;
|
|
49
|
-
/**
|
|
50
|
-
* The orientation of the video stream.
|
|
51
|
-
*
|
|
52
|
-
* It will not keep the device screen in specific orientation,
|
|
53
|
-
* only the captured video will in this orientation.
|
|
54
|
-
*/
|
|
55
|
-
lockVideoOrientation: ScrcpyVideoOrientation;
|
|
56
|
-
tunnelForward: boolean;
|
|
57
|
-
crop: string;
|
|
58
|
-
/**
|
|
59
|
-
* Send PTS so that the client may record properly
|
|
60
|
-
*
|
|
61
|
-
* Note: When `sendFrameMeta: false` is specified,
|
|
62
|
-
* `onChangeEncoding` event won't fire and `onVideoData` event doesn't
|
|
63
|
-
* merge sps/pps frame and first video frame. Which means you can't use
|
|
64
|
-
* the shipped decoders to render the video
|
|
65
|
-
* (You can still record the stream into a file).
|
|
66
|
-
*
|
|
67
|
-
* @default true
|
|
68
|
-
*/
|
|
69
|
-
sendFrameMeta: boolean;
|
|
70
|
-
/**
|
|
71
|
-
* @default true
|
|
72
|
-
*/
|
|
73
|
-
control: boolean;
|
|
74
|
-
displayId: number;
|
|
75
|
-
showTouches: boolean;
|
|
76
|
-
stayAwake: boolean;
|
|
77
|
-
codecOptions: CodecOptions;
|
|
78
|
-
encoderName: string;
|
|
79
|
-
}
|
|
80
|
-
export declare const VideoPacket: Struct<{
|
|
81
|
-
pts: bigint;
|
|
82
|
-
size: number;
|
|
83
|
-
data: Uint8Array;
|
|
84
|
-
}, "size", {}, undefined>;
|
|
85
|
-
export declare const NO_PTS: bigint;
|
|
86
|
-
export declare const ScrcpyBackOrScreenOnEvent1_16: Struct<{
|
|
87
|
-
type: number;
|
|
88
|
-
}, never, {}, undefined>;
|
|
89
|
-
export declare const ScrcpyInjectScrollControlMessage1_16: Struct<{
|
|
90
|
-
type: number;
|
|
91
|
-
pointerX: number;
|
|
92
|
-
pointerY: number;
|
|
93
|
-
screenWidth: number;
|
|
94
|
-
screenHeight: number;
|
|
95
|
-
scrollX: number;
|
|
96
|
-
scrollY: number;
|
|
97
|
-
}, never, {}, undefined>;
|
|
98
|
-
export declare class ScrcpyOptions1_16<T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16> implements ScrcpyOptions<T> {
|
|
99
|
-
value: Partial<T>;
|
|
100
|
-
constructor(value: Partial<ScrcpyOptionsInit1_16>);
|
|
101
|
-
protected getArgumentOrder(): (keyof T)[];
|
|
102
|
-
protected getDefaultValue(): T;
|
|
103
|
-
formatServerArguments(): string[];
|
|
104
|
-
createConnection(adb: Adb): ScrcpyClientConnection;
|
|
105
|
-
getOutputEncoderNameRegex(): RegExp;
|
|
106
|
-
createVideoStreamTransformer(): TransformStream<Uint8Array, VideoStreamPacket>;
|
|
107
|
-
getControlMessageTypes(): ScrcpyControlMessageType[];
|
|
108
|
-
serializeBackOrScreenOnControlMessage(message: ScrcpyBackOrScreenOnEvent1_18): Uint8Array | undefined;
|
|
109
|
-
serializeInjectScrollControlMessage(message: ScrcpyInjectScrollControlMessage1_22): Uint8Array;
|
|
110
|
-
}
|
|
1
|
+
export * from './codec-options.js';
|
|
2
|
+
export * from './options.js';
|
|
3
|
+
export * from './sps.js';
|
|
111
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
|
@@ -1,227 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { AndroidKeyEventAction, ScrcpyControlMessageType, ScrcpySimpleControlMessage } from "../../message.js";
|
|
5
|
-
import { toScrcpyOptionValue } from "../common.js";
|
|
6
|
-
import { parse_sequence_parameter_set } from "./sps.js";
|
|
7
|
-
export var ScrcpyLogLevel;
|
|
8
|
-
(function (ScrcpyLogLevel) {
|
|
9
|
-
ScrcpyLogLevel["Verbose"] = "verbose";
|
|
10
|
-
ScrcpyLogLevel["Debug"] = "debug";
|
|
11
|
-
ScrcpyLogLevel["Info"] = "info";
|
|
12
|
-
ScrcpyLogLevel["Warn"] = "warn";
|
|
13
|
-
ScrcpyLogLevel["Error"] = "error";
|
|
14
|
-
})(ScrcpyLogLevel || (ScrcpyLogLevel = {}));
|
|
15
|
-
export var ScrcpyVideoOrientation;
|
|
16
|
-
(function (ScrcpyVideoOrientation) {
|
|
17
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["Initial"] = -2] = "Initial";
|
|
18
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["Unlocked"] = -1] = "Unlocked";
|
|
19
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["Portrait"] = 0] = "Portrait";
|
|
20
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["Landscape"] = 1] = "Landscape";
|
|
21
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["PortraitFlipped"] = 2] = "PortraitFlipped";
|
|
22
|
-
ScrcpyVideoOrientation[ScrcpyVideoOrientation["LandscapeFlipped"] = 3] = "LandscapeFlipped";
|
|
23
|
-
})(ScrcpyVideoOrientation || (ScrcpyVideoOrientation = {}));
|
|
24
|
-
function toDashCase(input) {
|
|
25
|
-
return input.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
26
|
-
}
|
|
27
|
-
const CODEC_OPTION_TYPES = {
|
|
28
|
-
repeatPreviousFrameAfter: 'long',
|
|
29
|
-
maxPtsGapToEncoder: 'long',
|
|
30
|
-
};
|
|
31
|
-
export class CodecOptions {
|
|
32
|
-
value;
|
|
33
|
-
constructor(value) {
|
|
34
|
-
this.value = value;
|
|
35
|
-
}
|
|
36
|
-
toOptionValue() {
|
|
37
|
-
const entries = Object.entries(this.value)
|
|
38
|
-
.filter(([key, value]) => value !== undefined);
|
|
39
|
-
if (entries.length === 0) {
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
return entries
|
|
43
|
-
.map(([key, value]) => {
|
|
44
|
-
const type = CODEC_OPTION_TYPES[key];
|
|
45
|
-
return `${toDashCase(key)}${type ? `:${type}` : ''}=${value}`;
|
|
46
|
-
})
|
|
47
|
-
.join(',');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
export const VideoPacket = new Struct()
|
|
51
|
-
.uint64('pts')
|
|
52
|
-
.uint32('size')
|
|
53
|
-
.uint8Array('data', { lengthField: 'size' });
|
|
54
|
-
export const NO_PTS = BigInt(1) << BigInt(63);
|
|
55
|
-
export const ScrcpyBackOrScreenOnEvent1_16 = ScrcpySimpleControlMessage;
|
|
56
|
-
export const ScrcpyInjectScrollControlMessage1_16 = new Struct()
|
|
57
|
-
.fields(ScrcpySimpleControlMessage)
|
|
58
|
-
.uint32('pointerX')
|
|
59
|
-
.uint32('pointerY')
|
|
60
|
-
.uint16('screenWidth')
|
|
61
|
-
.uint16('screenHeight')
|
|
62
|
-
.int32('scrollX')
|
|
63
|
-
.int32('scrollY');
|
|
64
|
-
export class ScrcpyOptions1_16 {
|
|
65
|
-
value;
|
|
66
|
-
constructor(value) {
|
|
67
|
-
if (new.target === ScrcpyOptions1_16 &&
|
|
68
|
-
value.logLevel === ScrcpyLogLevel.Verbose) {
|
|
69
|
-
value.logLevel = ScrcpyLogLevel.Debug;
|
|
70
|
-
}
|
|
71
|
-
if (new.target === ScrcpyOptions1_16 &&
|
|
72
|
-
value.lockVideoOrientation === ScrcpyVideoOrientation.Initial) {
|
|
73
|
-
value.lockVideoOrientation = ScrcpyVideoOrientation.Unlocked;
|
|
74
|
-
}
|
|
75
|
-
this.value = value;
|
|
76
|
-
}
|
|
77
|
-
getArgumentOrder() {
|
|
78
|
-
return [
|
|
79
|
-
'logLevel',
|
|
80
|
-
'maxSize',
|
|
81
|
-
'bitRate',
|
|
82
|
-
'maxFps',
|
|
83
|
-
'lockVideoOrientation',
|
|
84
|
-
'tunnelForward',
|
|
85
|
-
'crop',
|
|
86
|
-
'sendFrameMeta',
|
|
87
|
-
'control',
|
|
88
|
-
'displayId',
|
|
89
|
-
'showTouches',
|
|
90
|
-
'stayAwake',
|
|
91
|
-
'codecOptions',
|
|
92
|
-
'encoderName',
|
|
93
|
-
];
|
|
94
|
-
}
|
|
95
|
-
getDefaultValue() {
|
|
96
|
-
return {
|
|
97
|
-
logLevel: ScrcpyLogLevel.Debug,
|
|
98
|
-
maxSize: 0,
|
|
99
|
-
bitRate: 8000000,
|
|
100
|
-
maxFps: 0,
|
|
101
|
-
lockVideoOrientation: ScrcpyVideoOrientation.Unlocked,
|
|
102
|
-
tunnelForward: false,
|
|
103
|
-
crop: '-',
|
|
104
|
-
sendFrameMeta: true,
|
|
105
|
-
control: true,
|
|
106
|
-
displayId: 0,
|
|
107
|
-
showTouches: false,
|
|
108
|
-
stayAwake: false,
|
|
109
|
-
codecOptions: new CodecOptions({}),
|
|
110
|
-
encoderName: '-',
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
formatServerArguments() {
|
|
114
|
-
const defaults = this.getDefaultValue();
|
|
115
|
-
return this.getArgumentOrder()
|
|
116
|
-
.map(key => toScrcpyOptionValue(this.value[key] || defaults[key], '-'));
|
|
117
|
-
}
|
|
118
|
-
createConnection(adb) {
|
|
119
|
-
const options = {
|
|
120
|
-
// Old scrcpy connection always have control stream no matter what the option is
|
|
121
|
-
control: true,
|
|
122
|
-
sendDummyByte: true,
|
|
123
|
-
sendDeviceMeta: true,
|
|
124
|
-
};
|
|
125
|
-
if (this.value.tunnelForward) {
|
|
126
|
-
return new ScrcpyClientForwardConnection(adb, options);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
return new ScrcpyClientReverseConnection(adb, options);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
getOutputEncoderNameRegex() {
|
|
133
|
-
return /\s+scrcpy --encoder-name '(.*?)'/;
|
|
134
|
-
}
|
|
135
|
-
createVideoStreamTransformer() {
|
|
136
|
-
// Optimized path for video frames only
|
|
137
|
-
if (this.value.sendFrameMeta === false) {
|
|
138
|
-
return new TransformStream({
|
|
139
|
-
transform(chunk, controller) {
|
|
140
|
-
controller.enqueue({
|
|
141
|
-
type: 'frame',
|
|
142
|
-
data: chunk,
|
|
143
|
-
});
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
let header;
|
|
148
|
-
let deserializeStream = new StructDeserializeStream(VideoPacket);
|
|
149
|
-
return {
|
|
150
|
-
writable: deserializeStream.writable,
|
|
151
|
-
readable: deserializeStream.readable.pipeThrough(new TransformStream({
|
|
152
|
-
transform(packet, controller) {
|
|
153
|
-
if (packet.pts === NO_PTS) {
|
|
154
|
-
const sequenceParameterSet = parse_sequence_parameter_set(packet.data.slice().buffer);
|
|
155
|
-
const { profile_idc: profileIndex, constraint_set: constraintSet, level_idc: levelIndex, pic_width_in_mbs_minus1, pic_height_in_map_units_minus1, frame_mbs_only_flag, frame_crop_left_offset, frame_crop_right_offset, frame_crop_top_offset, frame_crop_bottom_offset, } = sequenceParameterSet;
|
|
156
|
-
const encodedWidth = (pic_width_in_mbs_minus1 + 1) * 16;
|
|
157
|
-
const encodedHeight = (pic_height_in_map_units_minus1 + 1) * (2 - frame_mbs_only_flag) * 16;
|
|
158
|
-
const cropLeft = frame_crop_left_offset * 2;
|
|
159
|
-
const cropRight = frame_crop_right_offset * 2;
|
|
160
|
-
const cropTop = frame_crop_top_offset * 2;
|
|
161
|
-
const cropBottom = frame_crop_bottom_offset * 2;
|
|
162
|
-
const croppedWidth = encodedWidth - cropLeft - cropRight;
|
|
163
|
-
const croppedHeight = encodedHeight - cropTop - cropBottom;
|
|
164
|
-
header = packet.data;
|
|
165
|
-
controller.enqueue({
|
|
166
|
-
type: 'configuration',
|
|
167
|
-
data: {
|
|
168
|
-
profileIndex,
|
|
169
|
-
constraintSet,
|
|
170
|
-
levelIndex,
|
|
171
|
-
encodedWidth,
|
|
172
|
-
encodedHeight,
|
|
173
|
-
cropLeft,
|
|
174
|
-
cropRight,
|
|
175
|
-
cropTop,
|
|
176
|
-
cropBottom,
|
|
177
|
-
croppedWidth,
|
|
178
|
-
croppedHeight,
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
let frameData;
|
|
184
|
-
if (header) {
|
|
185
|
-
frameData = new Uint8Array(header.byteLength + packet.data.byteLength);
|
|
186
|
-
frameData.set(header);
|
|
187
|
-
frameData.set(packet.data, header.byteLength);
|
|
188
|
-
header = undefined;
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
frameData = packet.data;
|
|
192
|
-
}
|
|
193
|
-
controller.enqueue({
|
|
194
|
-
type: 'frame',
|
|
195
|
-
pts: packet.pts,
|
|
196
|
-
data: frameData,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
}))
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
getControlMessageTypes() {
|
|
203
|
-
return [
|
|
204
|
-
/* 0 */ ScrcpyControlMessageType.InjectKeycode,
|
|
205
|
-
/* 1 */ ScrcpyControlMessageType.InjectText,
|
|
206
|
-
/* 2 */ ScrcpyControlMessageType.InjectTouch,
|
|
207
|
-
/* 3 */ ScrcpyControlMessageType.InjectScroll,
|
|
208
|
-
/* 4 */ ScrcpyControlMessageType.BackOrScreenOn,
|
|
209
|
-
/* 5 */ ScrcpyControlMessageType.ExpandNotificationPanel,
|
|
210
|
-
/* 6 */ ScrcpyControlMessageType.CollapseNotificationPanel,
|
|
211
|
-
/* 7 */ ScrcpyControlMessageType.GetClipboard,
|
|
212
|
-
/* 8 */ ScrcpyControlMessageType.SetClipboard,
|
|
213
|
-
/* 9 */ ScrcpyControlMessageType.SetScreenPowerMode,
|
|
214
|
-
/* 10 */ ScrcpyControlMessageType.RotateDevice,
|
|
215
|
-
];
|
|
216
|
-
}
|
|
217
|
-
serializeBackOrScreenOnControlMessage(message) {
|
|
218
|
-
if (message.action === AndroidKeyEventAction.Down) {
|
|
219
|
-
return ScrcpyBackOrScreenOnEvent1_16.serialize(message);
|
|
220
|
-
}
|
|
221
|
-
return undefined;
|
|
222
|
-
}
|
|
223
|
-
serializeInjectScrollControlMessage(message) {
|
|
224
|
-
return ScrcpyInjectScrollControlMessage1_16.serialize(message);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
1
|
+
export * from './codec-options.js';
|
|
2
|
+
export * from './options.js';
|
|
3
|
+
export * from './sps.js';
|
|
227
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/options/1_16/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/options/1_16/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { TransformStream } from '@yume-chan/stream-extra';
|
|
2
|
+
import Struct from '@yume-chan/struct';
|
|
3
|
+
import { ScrcpyControlMessageType } from '../../control/index.js';
|
|
4
|
+
import type { ScrcpyBackOrScreenOnControlMessage1_18 } from '../1_18.js';
|
|
5
|
+
import type { ScrcpyInjectScrollControlMessage1_22 } from '../1_22.js';
|
|
6
|
+
import { type ScrcpyOptions, type ScrcpyVideoStreamPacket } from '../types.js';
|
|
7
|
+
import { CodecOptions } from './codec-options.js';
|
|
8
|
+
export declare enum ScrcpyLogLevel {
|
|
9
|
+
Verbose = "verbose",
|
|
10
|
+
Debug = "debug",
|
|
11
|
+
Info = "info",
|
|
12
|
+
Warn = "warn",
|
|
13
|
+
Error = "error"
|
|
14
|
+
}
|
|
15
|
+
export declare enum ScrcpyVideoOrientation {
|
|
16
|
+
Initial = -2,
|
|
17
|
+
Unlocked = -1,
|
|
18
|
+
Portrait = 0,
|
|
19
|
+
Landscape = 1,
|
|
20
|
+
PortraitFlipped = 2,
|
|
21
|
+
LandscapeFlipped = 3
|
|
22
|
+
}
|
|
23
|
+
export interface ScrcpyOptionsInit1_16 {
|
|
24
|
+
logLevel: ScrcpyLogLevel;
|
|
25
|
+
/**
|
|
26
|
+
* The maximum value of both width and height.
|
|
27
|
+
*/
|
|
28
|
+
maxSize: number;
|
|
29
|
+
bitRate: number;
|
|
30
|
+
/**
|
|
31
|
+
* 0 for unlimited.
|
|
32
|
+
*
|
|
33
|
+
* @default 0
|
|
34
|
+
*/
|
|
35
|
+
maxFps: number;
|
|
36
|
+
/**
|
|
37
|
+
* The orientation of the video stream.
|
|
38
|
+
*
|
|
39
|
+
* It will not keep the device screen in specific orientation,
|
|
40
|
+
* only the captured video will in this orientation.
|
|
41
|
+
*/
|
|
42
|
+
lockVideoOrientation: ScrcpyVideoOrientation;
|
|
43
|
+
tunnelForward: boolean;
|
|
44
|
+
crop: string;
|
|
45
|
+
/**
|
|
46
|
+
* Send PTS so that the client may record properly
|
|
47
|
+
*
|
|
48
|
+
* Note: When `sendFrameMeta: false` is specified,
|
|
49
|
+
* `onChangeEncoding` event won't fire and `onVideoData` event doesn't
|
|
50
|
+
* merge sps/pps frame and first video frame. Which means you can't use
|
|
51
|
+
* the shipped decoders to render the video
|
|
52
|
+
* (You can still record the stream into a file).
|
|
53
|
+
*
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
sendFrameMeta: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
control: boolean;
|
|
61
|
+
displayId: number;
|
|
62
|
+
showTouches: boolean;
|
|
63
|
+
stayAwake: boolean;
|
|
64
|
+
codecOptions: CodecOptions;
|
|
65
|
+
encoderName: string;
|
|
66
|
+
}
|
|
67
|
+
export declare const VideoPacket: Struct<{
|
|
68
|
+
pts: bigint;
|
|
69
|
+
size: number;
|
|
70
|
+
data: Uint8Array;
|
|
71
|
+
}, "size", {}, undefined>;
|
|
72
|
+
export declare const NO_PTS: bigint;
|
|
73
|
+
export declare const ScrcpyBackOrScreenOnControlMessage1_16: Struct<{
|
|
74
|
+
type: ScrcpyControlMessageType.BackOrScreenOn;
|
|
75
|
+
}, never, {}, undefined>;
|
|
76
|
+
export declare const ScrcpyInjectScrollControlMessage1_16: Struct<{
|
|
77
|
+
type: ScrcpyControlMessageType.InjectScroll;
|
|
78
|
+
pointerX: number;
|
|
79
|
+
pointerY: number;
|
|
80
|
+
screenWidth: number;
|
|
81
|
+
screenHeight: number;
|
|
82
|
+
scrollX: number;
|
|
83
|
+
scrollY: number;
|
|
84
|
+
}, never, {}, undefined>;
|
|
85
|
+
export declare class ScrcpyOptions1_16<T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16> implements ScrcpyOptions<T> {
|
|
86
|
+
value: Partial<T>;
|
|
87
|
+
constructor(value: Partial<ScrcpyOptionsInit1_16>);
|
|
88
|
+
protected getArgumentOrder(): (keyof T)[];
|
|
89
|
+
getDefaultValue(): T;
|
|
90
|
+
formatServerArguments(): string[];
|
|
91
|
+
getOutputEncoderNameRegex(): RegExp;
|
|
92
|
+
createVideoStreamTransformer(): TransformStream<Uint8Array, ScrcpyVideoStreamPacket>;
|
|
93
|
+
getControlMessageTypes(): ScrcpyControlMessageType[];
|
|
94
|
+
serializeBackOrScreenOnControlMessage(message: ScrcpyBackOrScreenOnControlMessage1_18): Uint8Array | undefined;
|
|
95
|
+
serializeInjectScrollControlMessage(message: ScrcpyInjectScrollControlMessage1_22): Uint8Array;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAyB,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,oBAAY,cAAc;IACtB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;CAClB;AAED,oBAAY,sBAAsB;IAC9B,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,QAAQ,IAAI;IACZ,SAAS,IAAI;IACb,eAAe,IAAI;IACnB,gBAAgB,IAAI;CACvB;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,oBAAoB,EAAE,sBAAsB,CAAC;IAE7C,aAAa,EAAE,OAAO,CAAC;IAEvB,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;OAUG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,OAAO,CAAC;IAErB,SAAS,EAAE,OAAO,CAAC;IAEnB,YAAY,EAAE,YAAY,CAAC;IAE3B,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,WAAW;;;;yBAI4B,CAAC;AAErD,eAAO,MAAM,MAAM,QAA0B,CAAC;AAE9C,eAAO,MAAM,sCAAsC;;wBAEqB,CAAC;AAEzE,eAAO,MAAM,oCAAoC;;;;;;;;wBAQxB,CAAC;AAE1B,qBAAa,iBAAiB,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAClF,YAAW,aAAa,CAAC,CAAC,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEN,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAcxD,SAAS,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;IAmBlC,eAAe,IAAI,CAAC;IAmBpB,qBAAqB,IAAI,MAAM,EAAE;IASjC,yBAAyB,IAAI,MAAM;IAInC,4BAA4B,IAAI,eAAe,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAsFpF,sBAAsB,IAAI,wBAAwB,EAAE;IAgBpD,qCAAqC,CACxC,OAAO,EAAE,sCAAsC;IAS5C,mCAAmC,CACtC,OAAO,EAAE,oCAAoC,GAC9C,UAAU;CAGhB"}
|