@aalis/schema-message 0.10.0 → 0.11.1

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.
@@ -1,3 +1,4 @@
1
+ import type { MessageAttachment } from './index.js';
1
2
  /** 附件 kind 显示名(中文,用作占位符前缀)。新增 kind 在此处加常量即可。 */
2
3
  export declare const AttachmentRefKind: {
3
4
  readonly Image: "图片";
@@ -6,6 +7,8 @@ export declare const AttachmentRefKind: {
6
7
  readonly File: "文件";
7
8
  };
8
9
  export type AttachmentRefKind = (typeof AttachmentRefKind)[keyof typeof AttachmentRefKind];
10
+ /** 附件的种类({@link MessageAttachment} 的 kind)→ 引用里写的种类。写引用与按种类认引用的各方都查这一份 */
11
+ export declare const ATTACHMENT_REF_KINDS: Readonly<Record<MessageAttachment['kind'], AttachmentRefKind>>;
9
12
  export interface AttachmentRef {
10
13
  kind: AttachmentRefKind;
11
14
  /** 可选语义描述(视觉概要 / 文件备注 / 音频转写片段等) */
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-ref.d.ts","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"AA0BA,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAK3F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAI5D;AAgBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAUjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtF"}
1
+ {"version":3,"file":"attachment-ref.d.ts","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE3F,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAK/F,CAAC;AAKF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAI5D;AAgBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAUjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtF"}
@@ -4,7 +4,7 @@
4
4
  // Aalis 在多个地方需要把附件(图片 / 音频 / 视频 / 文件)以可读、可解析的
5
5
  // 形式塞回 LLM 上下文里。依赖 `[图片: desc | ref:xxx]` 这种格式的调用点:
6
6
  // - plugin-adapter-onebot 入站构造附件占位
7
- // - plugin-image-sender 出站归档自己刚发的图
7
+ // - plugin-message-archive 把发出的附件记进会话历史(outboundMediaMessage)
8
8
  // - plugin-media 到达识别写入描述(service.ts),以及按 ref 匹配并重写
9
9
  // 历史描述(tools.ts,另有一处本地正则提取 ref)
10
10
  // 任何一处格式漂移都会让其它调用点的解析悄悄断链。
@@ -30,6 +30,13 @@ export const AttachmentRefKind = {
30
30
  Video: '视频',
31
31
  File: '文件',
32
32
  };
33
+ /** 附件的种类({@link MessageAttachment} 的 kind)→ 引用里写的种类。写引用与按种类认引用的各方都查这一份 */
34
+ export const ATTACHMENT_REF_KINDS = {
35
+ image: AttachmentRefKind.Image,
36
+ audio: AttachmentRefKind.Audio,
37
+ video: AttachmentRefKind.Video,
38
+ file: AttachmentRefKind.File,
39
+ };
33
40
  /** 所有 kind 显示名的联合,供正则构造时迭代。 */
34
41
  const ALL_KINDS = Object.values(AttachmentRefKind);
35
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-ref.js","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-ref.js","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@ export declare function getSenderLabel(nickname?: string, userId?: string): stri
20
20
  * 有标签时返回 `[label]: content`,无标签时原样返回 content。
21
21
  */
22
22
  export declare function prefixSender(content: string, nickname?: string, userId?: string): string;
23
+ /**
24
+ * 归档正文由 prefixSender 烘进了发送者前缀;重排给模型或界面看时身份另有标注,按归档时记下的同一个标签(元数据的
25
+ * SenderLabel 键)去掉这一层,正文自己以 [..]: 开头的不动。content 以 `[label]: ` 开头时去掉这一段,没有标签时原样返回
26
+ */
27
+ export declare function stripSenderPrefix(content: string, label: string | undefined): string;
23
28
  /**
24
29
  * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
25
30
  * 使用 userId(稳定不变)而非 nickname(可变)。
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE"}
package/dist/identity.js CHANGED
@@ -28,6 +28,14 @@ export function prefixSender(content, nickname, userId) {
28
28
  const label = getSenderLabel(nickname, userId);
29
29
  return label ? `[${label}]: ${content}` : content;
30
30
  }
31
+ /**
32
+ * 归档正文由 prefixSender 烘进了发送者前缀;重排给模型或界面看时身份另有标注,按归档时记下的同一个标签(元数据的
33
+ * SenderLabel 键)去掉这一层,正文自己以 [..]: 开头的不动。content 以 `[label]: ` 开头时去掉这一段,没有标签时原样返回
34
+ */
35
+ export function stripSenderPrefix(content, label) {
36
+ const prefix = `[${label}]: `;
37
+ return label && content.startsWith(prefix) ? content.slice(prefix.length) : content;
38
+ }
31
39
  /**
32
40
  * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
33
41
  * 使用 userId(稳定不变)而非 nickname(可变)。
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;IAChD,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAiB,EAAE,MAAe;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;IAChD,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAiB,EAAE,MAAe;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAyB;IAC1E,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;IAC9B,OAAO,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
@@ -1,7 +1,12 @@
1
- import type { IncomingMessage } from './index.js';
1
+ import type { ForwardedChat, IncomingMessage } from './index.js';
2
+ /** 正文里一段转发所在位置的占位:适配器写进 content,归档文本由 {@link withForwards} 换成展开 */
3
+ export declare function forwardPlaceholder(id: string): string;
4
+ /** 正文里的转发占位换成对应的展开;没有对应展开的占位原样留着 */
5
+ export declare function withForwards(content: string, forwards: readonly ForwardedChat[] | undefined): string;
2
6
  /**
3
- * 入站消息 → 归档文本:多用户平台加发送者前缀,引用回复与附件描述(`_attachmentDescriptions`)
4
- * 追加在末尾。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
7
+ * 入站消息 → 归档文本:转发的展开换回正文里占位的位置({@link withForwards});给了说话人(speaker)就加发送者前缀
8
+ * (getSenderLabel 的写法),不给不加;引用回复与附件描述(`_attachmentDescriptions`)追加在末尾。谁算说话人由调用方定
9
+ * (参考规则是 api-message-archive 的 speakerOf),本函数不看平台。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
5
10
  */
6
- export declare function buildIncomingContent(incoming: IncomingMessage): string;
11
+ export declare function buildIncomingContent(incoming: IncomingMessage, speaker?: Pick<IncomingMessage, 'nickname' | 'userId'>): string;
7
12
  //# sourceMappingURL=incoming-content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"incoming-content.d.ts","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAwBtE"}
1
+ {"version":3,"file":"incoming-content.d.ts","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,GAAG,MAAM,CAOpG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,QAAQ,CAAC,GACrD,MAAM,CAwBR"}
@@ -5,17 +5,27 @@
5
5
  // 共用同一份拼法;两边各写一份会让判定时看到的当前消息与历史里存下的那条逐字漂移。
6
6
  // ============================================================
7
7
  import { getSenderLabel, prefixSender } from './identity.js';
8
- /** 单用户平台:无需发送者前缀(不存在多人说话歧义) */
9
- const SINGLE_USER_PLATFORMS = new Set(['webui', 'cli']);
8
+ /** 正文里一段转发所在位置的占位:适配器写进 content,归档文本由 {@link withForwards} 换成展开 */
9
+ export function forwardPlaceholder(id) {
10
+ return `<forward id="${id}">[合并转发消息]</forward>`;
11
+ }
12
+ /** 正文里的转发占位换成对应的展开;没有对应展开的占位原样留着 */
13
+ export function withForwards(content, forwards) {
14
+ if (!forwards?.length)
15
+ return content;
16
+ const expanded = new Map(forwards.map(forward => [forward.id, forward.content]));
17
+ return content.replace(/<forward id="([^"]+)">\[合并转发消息\]<\/forward>/g, (raw, id) => expanded.get(id) ?? raw);
18
+ }
10
19
  /**
11
- * 入站消息 → 归档文本:多用户平台加发送者前缀,引用回复与附件描述(`_attachmentDescriptions`)
12
- * 追加在末尾。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
20
+ * 入站消息 → 归档文本:转发的展开换回正文里占位的位置({@link withForwards});给了说话人(speaker)就加发送者前缀
21
+ * (getSenderLabel 的写法),不给不加;引用回复与附件描述(`_attachmentDescriptions`)追加在末尾。谁算说话人由调用方定
22
+ * (参考规则是 api-message-archive 的 speakerOf),本函数不看平台。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
13
23
  */
14
- export function buildIncomingContent(incoming) {
15
- const useSenderPrefix = !SINGLE_USER_PLATFORMS.has(incoming.platform);
16
- let content = useSenderPrefix ? prefixSender(incoming.content, incoming.nickname, incoming.userId) : incoming.content;
24
+ export function buildIncomingContent(incoming, speaker) {
25
+ const body = withForwards(incoming.content, incoming.forwards);
26
+ let content = speaker ? prefixSender(body, speaker.nickname, speaker.userId) : body;
17
27
  // 引用回复:把被引用消息的标签 + 内容拼到末尾,作为不可分割的上下文
18
- // 与图片描述、forward 摘要相同处理逻辑——把"非当前指令"的素材烘焙进归档文本,
28
+ // 与附件描述相同处理逻辑——把"非当前指令"的素材烘焙进归档文本,
19
29
  // 这样下一轮从 memory 拉历史时仍能看到引用关系。
20
30
  if (incoming.replyTo?.content) {
21
31
  const replyLabel = getSenderLabel(incoming.replyTo.nickname, incoming.replyTo.userId) ?? '?';
@@ -1 +1 @@
1
- {"version":3,"file":"incoming-content.js","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,EAAE;AACF,2DAA2D;AAC3D,2CAA2C;AAC3C,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,+BAA+B;AAC/B,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAyB;IAC5D,MAAM,eAAe,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IAEtH,qCAAqC;IACrC,8CAA8C;IAC9C,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7F,OAAO,IAAI,SAAS,UAAU,SAAS,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;IACrE,CAAC;IAED,iEAAiE;IACjE,oEAAoE;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"incoming-content.js","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,EAAE;AACF,2DAA2D;AAC3D,2CAA2C;AAC3C,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,gBAAgB,EAAE,sBAAsB,CAAC;AAClD,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAA8C;IAC1F,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,OAAO,CAAC,OAAO,CACpB,8CAA8C,EAC9C,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAC7C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAyB,EACzB,OAAsD;IAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpF,qCAAqC;IACrC,mCAAmC;IACnC,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7F,OAAO,IAAI,SAAS,UAAU,SAAS,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;IACrE,CAAC;IAED,iEAAiE;IACjE,oEAAoE;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}