@fecp/designer 5.6.18 → 5.6.19

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.
Files changed (61) hide show
  1. package/es/designer/package.json.mjs +1 -1
  2. package/es/designer/src/packages/dialog/useDialogDialog.mjs +1 -1
  3. package/es/designer/src/packages/dialogGlobal/useDialogGlobalDialog.mjs +1 -1
  4. package/es/designer/src/packages/form/property/widgets.vue.mjs +2 -2
  5. package/es/designer.css +131 -53
  6. package/es/node_modules/@vant/use/dist/index.esm.mjs +1 -1
  7. package/es/node_modules/d3-sankey/node_modules/d3-path/src/path.mjs +73 -0
  8. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/array.mjs +4 -0
  9. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/constant.mjs +8 -0
  10. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.mjs +45 -0
  11. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/point.mjs +10 -0
  12. package/es/node_modules/d3-sankey/src/sankeyLinkHorizontal.mjs +1 -1
  13. package/es/node_modules/vant/es/toast/function-call.mjs +1 -1
  14. package/es/packages/mobile/src/assets/images/ai2.png.mjs +4 -0
  15. package/es/packages/mobile/src/components/ai/AiChat/AiChat.vue.mjs +145 -22
  16. package/es/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.mjs +4 -6
  17. package/es/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.mjs +71 -11
  18. package/es/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.mjs +37 -3
  19. package/es/packages/mobile/src/components/form/uploader/Uploader.vue.mjs +1 -2
  20. package/es/packages/mobile/src/composables/useAI/adapters/h5.mjs +255 -0
  21. package/es/packages/mobile/src/composables/useAI/adapters/index.mjs +3 -3
  22. package/es/packages/mobile/src/composables/useAI/useChat.mjs +10 -3
  23. package/es/packages/mobile/src/composables/usePageEvents.mjs +1 -1
  24. package/es/packages/mobile/src/index.vue.mjs +20 -8
  25. package/es/packages/mobile/src/utils/datasource.mjs +1 -1
  26. package/es/packages/vue/src/components/dialog/DialogRenderer.vue2.mjs +0 -1
  27. package/es/packages/vue/src/components/forms/number/Number.vue.mjs +0 -1
  28. package/es/packages/vue/src/components/forms/text/Text.vue.mjs +0 -1
  29. package/es/packages/vue/src/components/table/TableColumn.vue.mjs +0 -1
  30. package/es/packages/vue/src/composables/usePageEvents.mjs +0 -1
  31. package/es/packages/vue/src/utils/datasource.mjs +0 -20
  32. package/lib/designer/package.json.js +1 -1
  33. package/lib/designer/src/packages/dialog/useDialogDialog.js +1 -1
  34. package/lib/designer/src/packages/dialogGlobal/useDialogGlobalDialog.js +1 -1
  35. package/lib/designer/src/packages/form/property/widgets.vue.js +2 -2
  36. package/lib/designer.css +131 -53
  37. package/lib/node_modules/d3-sankey/node_modules/d3-path/src/path.js +73 -0
  38. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/array.js +4 -0
  39. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/constant.js +8 -0
  40. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.js +45 -0
  41. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/point.js +10 -0
  42. package/lib/node_modules/d3-sankey/src/sankeyLinkHorizontal.js +1 -1
  43. package/lib/packages/mobile/src/assets/images/ai2.png.js +4 -0
  44. package/lib/packages/mobile/src/components/ai/AiChat/AiChat.vue.js +144 -21
  45. package/lib/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.js +4 -6
  46. package/lib/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.js +73 -13
  47. package/lib/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.js +37 -3
  48. package/lib/packages/mobile/src/components/form/uploader/Uploader.vue.js +1 -2
  49. package/lib/packages/mobile/src/composables/useAI/adapters/h5.js +255 -0
  50. package/lib/packages/mobile/src/composables/useAI/adapters/index.js +3 -3
  51. package/lib/packages/mobile/src/composables/useAI/useChat.js +10 -3
  52. package/lib/packages/mobile/src/composables/usePageEvents.js +1 -1
  53. package/lib/packages/mobile/src/index.vue.js +19 -7
  54. package/lib/packages/mobile/src/utils/datasource.js +1 -1
  55. package/lib/packages/vue/src/components/dialog/DialogRenderer.vue2.js +0 -1
  56. package/lib/packages/vue/src/components/forms/number/Number.vue.js +0 -1
  57. package/lib/packages/vue/src/components/forms/text/Text.vue.js +0 -1
  58. package/lib/packages/vue/src/components/table/TableColumn.vue.js +0 -1
  59. package/lib/packages/vue/src/composables/usePageEvents.js +0 -1
  60. package/lib/packages/vue/src/utils/datasource.js +2 -22
  61. package/package.json +1 -1
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ var pi = Math.PI, tau = 2 * pi, epsilon = 1e-6, tauEpsilon = tau - epsilon;
4
+ function Path() {
5
+ this._x0 = this._y0 = // start of current subpath
6
+ this._x1 = this._y1 = null;
7
+ this._ = "";
8
+ }
9
+ function path() {
10
+ return new Path();
11
+ }
12
+ Path.prototype = path.prototype = {
13
+ constructor: Path,
14
+ moveTo: function(x, y) {
15
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
16
+ },
17
+ closePath: function() {
18
+ if (this._x1 !== null) {
19
+ this._x1 = this._x0, this._y1 = this._y0;
20
+ this._ += "Z";
21
+ }
22
+ },
23
+ lineTo: function(x, y) {
24
+ this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
25
+ },
26
+ quadraticCurveTo: function(x1, y1, x, y) {
27
+ this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
28
+ },
29
+ bezierCurveTo: function(x1, y1, x2, y2, x, y) {
30
+ this._ += "C" + +x1 + "," + +y1 + "," + +x2 + "," + +y2 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
31
+ },
32
+ arcTo: function(x1, y1, x2, y2, r) {
33
+ x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
34
+ var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
35
+ if (r < 0) throw new Error("negative radius: " + r);
36
+ if (this._x1 === null) {
37
+ this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
38
+ } else if (!(l01_2 > epsilon)) ;
39
+ else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
40
+ this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
41
+ } else {
42
+ var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
43
+ if (Math.abs(t01 - 1) > epsilon) {
44
+ this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
45
+ }
46
+ this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
47
+ }
48
+ },
49
+ arc: function(x, y, r, a0, a1, ccw) {
50
+ x = +x, y = +y, r = +r, ccw = !!ccw;
51
+ var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
52
+ if (r < 0) throw new Error("negative radius: " + r);
53
+ if (this._x1 === null) {
54
+ this._ += "M" + x0 + "," + y0;
55
+ } else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
56
+ this._ += "L" + x0 + "," + y0;
57
+ }
58
+ if (!r) return;
59
+ if (da < 0) da = da % tau + tau;
60
+ if (da > tauEpsilon) {
61
+ this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
62
+ } else if (da > epsilon) {
63
+ this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
64
+ }
65
+ },
66
+ rect: function(x, y, w, h) {
67
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + +w + "v" + +h + "h" + -w + "Z";
68
+ },
69
+ toString: function() {
70
+ return this._;
71
+ }
72
+ };
73
+ exports.default = path;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ var slice = Array.prototype.slice;
4
+ exports.slice = slice;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ function constant(x) {
4
+ return function constant2() {
5
+ return x;
6
+ };
7
+ }
8
+ exports.default = constant;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const array = require("../array.js");
4
+ const constant = require("../constant.js");
5
+ const point = require("../point.js");
6
+ const path = require("../../../d3-path/src/path.js");
7
+ function linkSource(d) {
8
+ return d.source;
9
+ }
10
+ function linkTarget(d) {
11
+ return d.target;
12
+ }
13
+ function link(curve) {
14
+ var source = linkSource, target = linkTarget, x = point.x, y = point.y, context = null;
15
+ function link2() {
16
+ var buffer, argv = array.slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
17
+ if (!context) context = buffer = path.default();
18
+ curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
19
+ if (buffer) return context = null, buffer + "" || null;
20
+ }
21
+ link2.source = function(_) {
22
+ return arguments.length ? (source = _, link2) : source;
23
+ };
24
+ link2.target = function(_) {
25
+ return arguments.length ? (target = _, link2) : target;
26
+ };
27
+ link2.x = function(_) {
28
+ return arguments.length ? (x = typeof _ === "function" ? _ : constant.default(+_), link2) : x;
29
+ };
30
+ link2.y = function(_) {
31
+ return arguments.length ? (y = typeof _ === "function" ? _ : constant.default(+_), link2) : y;
32
+ };
33
+ link2.context = function(_) {
34
+ return arguments.length ? (context = _ == null ? null : _, link2) : context;
35
+ };
36
+ return link2;
37
+ }
38
+ function curveHorizontal(context, x0, y0, x1, y1) {
39
+ context.moveTo(x0, y0);
40
+ context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
41
+ }
42
+ function linkHorizontal() {
43
+ return link(curveHorizontal);
44
+ }
45
+ exports.linkHorizontal = linkHorizontal;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function x(p) {
4
+ return p[0];
5
+ }
6
+ function y(p) {
7
+ return p[1];
8
+ }
9
+ exports.x = x;
10
+ exports.y = y;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const index = require("../../d3-shape/src/link/index.js");
3
+ const index = require("../node_modules/d3-shape/src/link/index.js");
4
4
  function horizontalSource(d) {
5
5
  return [d.source.x1, d.y0];
6
6
  }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const ai2Icon = "data:image/png;base64,UklGRgQ1AABXRUJQVlA4WAoAAAAQAAAAPwEAPwEAQUxQSIsKAAAB8Mf/vyKl//+dMzMbdO4agCJ2dyfY3d36LLu7Wy/iM7G7u7u7FWzpMlnpWHZ34vwBFjM75/FKI2IC0A////D//wRktY7O3n5lKtVu1rZLnyETZi5cEfz7P9t2bl67Ye3KJcumTx4zqEfHBrUrlPbzdHXQstDgGlC/zc+z1mw/dvXxy+iE96aU9FyrzWbjhXx5G2/Lzc1JS/6YEPfk0eUj23+fM6R1jRLOtIdZvat/5VaD5m2+HWEyk4LPZ314fWHz3J/a1Szl4cBh+tIUaTz09x3Xn79LswhEvqJgzfwQ/mDvXyPalXWhJcy5+dXtvfhQeIpIlNX69sa20Z0r+jhxdMN6NRi5/Up0slUkCiwJOUnPz/89uqoXQyWY86jQd86Nj8QO8h8u/dW3ThFHhi4cqo3Z/SjVIhH7KNlSo0793rUEQwmsS+Ve654LxA7n3ArpUsmVU3uMZ/c1T1N4idhlyWZ6vvHXElr1hh0rDTluInY/69Gc1kX0qkzTeuWzVJGowdx3p+dX1qks7FFr8UOBqEnr0xnNPFj1pK+//ZVFIirTHL9zmDtWRZrKI8JsRKW+2dHGh1U9xceFZRD1Krw929tbzWDHZr+nS0Tliu+XBzljtVJuYYyFqGBL/F+NGTWiqRecSVQzf3yAkVUbxpEvc4mKFpL3d2FVhc/gGJGobeHiIE9GLTDljn4iKlxM3tJUHbDF/komat22JVCrAoJOWIl6t0WPM9o5XHpxLlH3YlRvgz1jyl3MJqr/4w4/bLdcZ7wjVJg4wwvbp8JLMyU6kLI2VrRHmpphIqHHT4MN9qfVbYnQZNJGdzvjOjSL0Ob9rpxdmZxIqFOM76azH4b5IqHR7M1GbCfwshRCp9YN/vbBfa5EaFV8Wp2zB73fEHqVrjVSPhwQI1EMIUmBGqXzCpEI3T5opHDaEDOhXCm2LKNkbMdMQr3S1sJK1jaaULBlrUa5XK4JNETSAxmlMq4llBxWV6lGmmjJspNTJKZGGqHnMQ5KZNxFKPpZQwVilplpSnpcSHnKfSRULc5xVhqf44SyU8dghRmSTFtSTICyFEog9H3SX0m04yUKy5ytJE2iCY2bGzDKscZKZWSnQSlwRTOh84zRSuGwmFC69MBRIRrG0BohwzTKsMRCb6d9FMEnhdB76jAl4H6WKE48zihAsSuE5i21sfw6fqQ6Mk8vO+a4SHdPqsnOL5XQffoIuelmEsqXQvUyK3qO9oilPpZXlyTqI1s95RVspb/werJyjiL0bw2WE65lAwDpjkZG+iUEAnNKy8jnHAiIgVg+rd+CAJmmk8/EHBg4aJANc16CgRfVZePxnsDgpz5ywYESEAib5aKZSIBQeuIoE699UED4Rlgepe6DAZmklUe7D3Bwpog8xmbDwYtq8tguwEH6L7Jg7xM4tK6UReFPgCCekEU1HhDIM70M2CEEErMry0C3BBSkAWzBMxwGBXLBr+CVfgAL4TULFNY6G4t1ewML79sXpCJNZq45eiXUAgupAwsK495lU5JIAFK44OvabvORLStGBJVywN+jxur3NgKT1rNbY3iRt2Yn3llQG38z4+h0AqKWrU25b6P7w0SA1BbeRfctfNcRQM38w+UbLEuHFJI93vlrdEN5AqsZc5ivqBNGgFX6UAV/kf6qCC2EXC79JUwbK4HXzMlf4n+ZQGys5xf0TwYZoRX+DHdXAhmy0eUzFcwEZh+Uzk83lwDtp175GY9BjXVefg1ioUY8hvMZkgE1JNwpnw0i2KQVz+cxAVtr1Tw+aXBDejEIoXoi4EzXIMSOIIC7wRkh3XLIOWVEyH0/5ISVR8jvGuQkBCJU8TnkpA1BqG4c5OROR6hTEuQIWxEanA450nmEJuVCDnmI0HIedBK0aJMIOrlF0UnY4auimxLokC74CYHdn9kY4Fmoew88612SgOegtxl4zvlYgCesfBbwvKxqBp6YWjbgedOAB54PrXKB510rG/C8CRKAJzHQBjwJDbOgp3EG8MQ3TgWexEYm4HnTGHrim8QBT2yDUOCJrHlCgp3wqrtF2HlaYakVdu4FTM2FnWvFhmXCzgnvth9hZ79n5ZewE+LkfxN2FutcN8HOcFYzA3Y6INRSghxbGYT8cyEn2YgQ+1ACnFCMEArh4UY8jBBC3ZPgxjI7T4XHcJPWL4/DUrh5VjkPbmgBm2OGPAidEaBmLJffoBSgsVVH+XtshBnpOvMZXDMTZLInoS+cmgYxd0p9ie8+iJmh/xLkcZOHFinUGX15g9vQkjwUfa3hWCao8JMdvgoFLLMAinjFA33LlgfSeCARd/ujb8oWGr7xjQAhws0A5tvkNbQKuZUlwYaUttCAvifjHDA3EjZCR7mg743dr4pAIeUkHhjshAriYiss8Kao0NdWITPi7NSWBg4VyJ7JoCCOLOzIOdVuEOCEUYGtFQ4KWaURQghjVJC9D4BCSuE8BVy/FBRiXWXABPKAIJ7HMkDG94Bg/QPJ8oAAB6bu8hidCQdPq8ijYigcrHWVh8c2MJD6cfLATXkoeGNEMnV5BQTCHkYuaGoWDLxti2Rb+xUMnPGVj342CAh9WPngslkQkGBAcl5upr+saUjWtZ/TX1hVeXGDBdoTf+bkhdzDJMqLMyK5t4mlu+ThSPYuS+juqK/8kON1geJMZZASdoilN/MKRhG4rlnUtt2IlFG3JpfSkqswCoE8fxepLL4HUkxc9LZIY7NclAOhkgdE6rLs4ZCSMqUeiLR1qTJS2JK7BaoSHhRGSsv4XxRo6llzpMBeC7KoiX9aDisRcl2aTEv3m2OkzFyjZzYaslwpghSbaXiYhg5XRUrOTXgtUc6HYD1SdsfAUIFq0od5IcX3/C3SRi2Ww3WRPdQGbrdRStpaP9YuIIRb70kV6SP7Rj0O2U3W8NM1iTYy55fHyK5qO+8y8fQgmv6qguwu6917W4pICxf6umL7k7dIjblXUnm1J6Yd6qVBdhs7lBi4ziSpOtvp4UYO2XmffmdjrZI6y476M4hBKpD1abLysaDCrOHTG7kwSC3qG888G5kjqibJmnpzbWNnpCqxzqfelINJgvoReUKS76/qX8oVIzXqXWfe/uefbJI6sWW8vBg8olmdwKYGLVKvWO9dtdtfF0y8+sh5+vuwmn6OHMYYI/XLFa42bMGhG7EpFlEV8J+ebx8R4IBUNqszFG/cZ+nB8CzJ3uU82tizuocGqXZH36Chf+69/fJtcrZFkOyKaDN/eHV2db8KWqT2Gc7J079aq56j5m0/9+J9pkAkyQ6Ykx6d/GNSx5pFnViMqFJrCKg1qn1Qz4nL1+47dfdpZPy79AyzxcoLonwkgbdZLeac9KSE6BePblw4svvvOYPblDPqMKJVrOUwq9E5exUJKFenSZsBQyZNW7pu26EbNx+/johP+phqzjVLRJK+nSASKScjI9WUGPky7OHdG6d2hAQvnjPu14FdmtapVNbfx+jpqOUYROVarc7d6O0TUKpstRo1GjVt2KJzuzadenbu2K1/j46du3Vt3bJ1uxb1atasUblCQPFivkZXrUarwQgsMUYMgzHDMgzLMgzDMhgzDEYIo//QxyzHAA/DYNj54f8f/v/h//9tCABWUDggUioAABC0AJ0BKkABQAE+MRaJQ6IhIRNYlUggAwSm78PriUIG7NOm5fUH+P5yvG/ZR7K++fqH96/9n0jHN+Rr0X/wvt3+Wf/G/33tT/Vv/Q9wv9Uf9N/ef3Z/qfxkfrB8H/3Q9SX9E/rn+u/xX78fMN/wf2k91X+R/w3/V/Zn5A/6J/gPTX9kv9uvYF/ln9X+//4vP/V/pvhJ/af/x/7r9//oi/YL/r/n/8gHoAegB6c/Er8Q/1N8yf8V+RP7O+ZX6v/H/lt/cP/Fv++a37x/jPy39rfCf47f5/qI/k38//v35jeUd4j9p/956kfsf9L/z392/d7/FfEx8r/zvSH7C/6D3Af1E/wf5w/4r6H76f77/qvYD/jn8+/yn9n/HD43P8j/Nfj37p/oP/ff5v8qPsM/kn9A/yH9y/zn/Y/vn///9n3P+xP9rvYt/Uv74S5kpyU5KclOSnJTkpyU45iJt5iJtk17QlH6nz72y0ycvfi2MozYW6meaMGRf9wKIeOB9131Nr44voj5/rHrRPZ+IsbD9Js/TkDIAoC0AfVzfDhUwPe7YCGwCetQaoH3k0lrZ4JqdjQKil1Ypr7UMxJv3TG/y9huP9NNUI+wDHpJrWkNaV5DBScp+DOI8UTll/j5qptnJvs+GOIvjHyFyCFU0zb1ikwe3Ks1CGqptH3DErXWAiPuuTX/j24eWHT7Yuc/mdfs7+/SGJRvhpWqCovdIBZIdhe3yjRP0GbeRI6l2b5JuUeEn9XkFaYESobibgx5rXAAE+eXeds2izftMisYoP95XO3TydbQWUe3Zkt2URFHvOY00B0o8xmaQy19vcfNFNK76VuRD55xtPt+Hq7lkhckHfr9MHpenFt4KHTQA2kK9nDY+pMLGVD6ZZxpRodsloZcQbijR8c9lDdHXEZNCmj+5XfxcEtrNBmB0IS0QBCjbWpNECT5J4MUD4GSf9eVR6ohHXlb0WbpEzKNoEZrzH1h/0WcsEmcVfvQdF5WsVFXJ9/MDRA+U2II0XpGJJA79GtXxzaQ2KsvqBPsrrk6oDgUqMne0NES4Glle8dD9BbiIyH1k7q9Gub7rNAPGKVATF0Z/e04W1D/9UPt5sycNz5HrRgmnAQc17e4G5SvzL0iLUCfbQxymW6ex7BduLrQkGg/Bj591vp00pjVhwTJzbcBbOxc1G9YVjoQx+u9fwNypzpcdQbKSYtvGW4fRttd9bFVmYZTDR0erFrnnT4MzPMgXvNT5z42ujf+U8zDwEuzwqw+2uv3Sk8/vvBi/VqepPL0J9XcCd9G/NyMQB8W6PGTTZ/CA4ZFFKuc6aue8+QpsED6EsiMJuDRpZLFqY/l+ik25I9tAaQPNTRT53zAyAYGufpUXxDB6QxjH3/bp4yHtjP2C4lmaU3g8ztvoYdSSdsZHMsGVQpzjA73HvYdU/VHkleIZqrRw8hrBDtOiNC7X4Q9NXwjoXnngBNs7Vr/3B31FZjllBngbawW/9lqG3HC7MozOCc/bBAOp88OnObjy2g1elVH0B2f9mhZlyVwJQUqpVpYXXAO9PlBZ2reX4m3C5q6UcISY/SDVrSBLH/FLYjoEnYMnJrP/AgqazF77dH//9YcgbEGPnqCTP74sqH+WbFr4SH7lew6dmF+3eLyxjFf8GDd0t54e0KZP02IFgKqF/n9mMLhYAPDXtOYoLrpQonruBsPexiRJc10u0a5+6XTZshVWAZ997lQlqPh8FP3gmfsCWMMHajI60KMmt/2vx+K/4E3nO/iqOKo3xU5TIfHk7tvQMzsjaOcJ26pBDAP6nafPkLkYohTIKESpK6FtLCiOYQ7LYeYUoxLbmL2PLGE3+qBOamWs4SI+q6KmaOk0nebzT1mWP/Sj3VGy0Jwni2O+M2fhLEnkdZW774MXlSsQ2mrTVpq01aatNWmrTVpq01aatNWmrSoAAD+/7u9wAAAPH+rMMZYGj7pZ8I4hcO2Gm8+I+954DNKP+Bz1F5yRxZkQtOQXdtLrdrNqqFqrzXXCpVI4yFD6BGqu4U7tNVai2jTYGXDbYCdaYYRKg/uFtb1rr+ogr71L56oKIWLhGN2mxoRPeAAZv9WfF9sZlI2hbVbh+ih5RC96juldRBCtjAgVqoy1PkwHKrGIfOB7UQUzO/yT0CoycdqYxI8HfmrMkFjLAbBrjIiNhm+XHi+Us0EsE4rQaclUzTnufNdcD71mokMCUew1dYSDwzO6RZ/1s6Y1W+BIR16y4+OYFhR+T6bL2Hkv9i+CFisdfMQwmAa0JalPwn7K6KPjpVM/e/EN6Yk74Xv4FRP/AYCQTr1XY08rYzt1vO+7fvPzhRntZh/OSxp6Lram8//3Ibur1XMY5d+i6i82ycMXCf7uK/eOXkCeJmdHmEQcybGYsjk57DeTt1K/c9tuVT80JqUAwf3JZJRU04l0dbWiWvtF9JrbqfDzFpM8B5gvs+W6aP+uKAovrVMyj/tPwYGE6Ef5mO6yJ1V6kfQZRVpTckFEirTnl4U9cFNb6HX/uuSinQyr4oewBSL8gf8tmxiteOwUjC/11o9DGvp0oNpDN0NW0pXdc5BDxmJ5S0yUIE//4qnksZZ5ULP+C+ieqeAARIyVXNkfBmYbHGlobUPek/1BSA+zAqzeJXNQLVGEE1oKReTI2adaYiMdAaDEdQnUefqvzEHZvVupFJ5ransxf3InZkOv9iu8VosbG5Qb3zkFyG6iD80U0zsZvFPWkMNbGRmx+QyPlNNo4pmjjZQ8oTJqNpanG9zgYSS0G5If47EdHM+wTeMq8IRryQjqDbUy7EQ0a1WRu4dQpdu4Sk4SjmGqLASpji2a37UrgCn7vfEQiMsxVq9mpLXPz+af9v6oiPwh6jj8d6TAssEnmhg/0AvfcI/HAcPx2tVFDxHj2/wX/EHmRlfz8G6In/8lFmqcz7HspniLCYxcQtb4j4cuAr68wPwPthtxAm53f1iyTMd9GpZa21vurcua4XdXrGF12hEGoApIaa82jxZ8M90RfVoOplPHN5ueU5yB+oIuOqBxXgJgpP3gcpljUpx3UQvosDF5jARS6JQM0vb7Q8MmS2HWveVebKoPU/8qU5cc7Oe9vSlYQT6VJLorPW+ODvkoaZg8Il9j6jiVPQDwpRkg++4SKcaxZNLqe4tNe9j7rofBlRyWrfd6HImVWuqSAj8/fMeInZc42OuZe9BlOUwLhQyjcs4cpw/1wmsmrQBpFk2EeXAvepouMHDMDW0gxyZy6PUOpdpk3mDTukk5GEmQr20ZmC2jZlmg36wGGWZZGwcu/JQ7Cr7AayAs6wGOe2R8+fvS6+M68W6ghSteoN/5PmvJy5z8/1n75H/4qopWFtfoDjW9SPvbD0Pn6XadeR7Wt3e9Tpuix2C9UyZBH+stL0OfmAh/k+02wzh3+Ngj4SLBkteaLi0Ji8udmgk0uq20RBsxMdjXVvZS1nj9dJbbmLoZxpZ0z0sw400Mnw7C0bGb+wRVWfmqjk6GZGOxaK3Fg/IfE8zP6w+iWEdepUX+tfcCDhyePOxn3ESXmLCgW6ic8s3NbAby88aerRURRX/fzuhQRoLfMyS0Fec4lxkSlTT1loK68RfDSceHvBGuqotUON+pzC3gPxsdL9+TghV7sGFctu60fT3muuD1ORacdfyL2tpEwdDE+5KEOBvx90yg3Vlp6vaDSjp7HAPjVtAQ35G+DuU+qWxICdhfjhBe4o7c+xrklJsXAkeLUynkCRg7XonWJBdRzHJfaL5EZXgoagkQcaU1Q7bbJfqRQUNXuSnQXNSRS7sWnT/sgeR2DHoaQpd5SI1Lumrk92yzxlvpVYMecbE2iwJUN9Q5r85fT3cGKJkb3rUhF71UO730J4LHF5cGkijb1PzN3Wlb03HNgjgxguHGMS3xcjDTxwqRojD1Vhln/7BIhvdGONmkETtqC4for1mpxBfiy1P2WBOPd0q24Y9xm48M0iCJ+6cqv3Wavs+NyL7lIEgosZeHzza4j8gonuhAuRfjGfAQFvqJbRapgR0F/oySs7nN372kzWz/+akZ/PTwNpdGfVCcgT0VJfAQbrWfSN0+4AqLpIlQ9tmrPFKZEYuhtCkZie6PbJfPOtn21XLtD6V1lreYqA74uG/MJBTqTtchCyRAOOqtVT2AhMBfDB6ZUAgTKjRk6QlpSceL6lf+PrhTMY7jFsh+Bb9JC9Rs+XiGUG++3oZhMJ5C2GNViPkjZdPXZB0OPkBMgvcdAJdv9pfkPy/fhCAgk8vzTTB2y8q+Po++31wkrAs6Lor/0UpeZQZ+gQtvOkMbOmeUxEBe/bAEmHsu3Or4CLnk0rYwnZnnwQyhhMBUciBZpZIf8Kicj1fTZv5b/J+D7wx7N5lj6ukmDOM+aEODbmRuqtT886MfsigHHgEqB75WdQSxDjf//kwiw3VevfEPwdWeVC3TaosPD1RxeiF4fwng7/iotLtRRz50HhFQ49lLcKG4oVW/GoxdZS2f/oF2us9pM/1HVbwBsl9UxOiPGl70KqezKjrItxI2HjIOfGDE1ka+O3dwJRmgbFPBLIS+bZpJZZQZXQttJlyOJ5nVksd2YW6+n8PLRT4BQDhWESw0duEoyeDF1QGhTAKOUw+FZl2p0jmXccLIlXzde87Bd1+vlEVPo033oh8r6kRGv05gRBsNjxw3ICPD1Duo6+FeqInMGcVEcYNnz8uZ8ZN6KborZHZfH5XQ2sSsCZRPCFsqK033BZ6yNm9qudMlyCyIGIjxkuD+PAV3lXg7sUOxb6YQT2fQxTlt5UzOOd8wkadK8EWrtt2Fasi5Nu3vzjD88xalpkXdx7Hws64QZDNRRHE8/+a6jE97DUrKZ/5HFYe0RZWgiaor4uJpr7oI17jn339rohuuRK8nwmj4eZvcQbRuW1BoHeEzUWiXqhhARAz7r8ZCQ08ZawEWCLdB2ss+MqgZsoVZl/9oLvACyGeGg2k5HVwDPueNCEUKS0DXNuhm3TRkelxTgdBFtQZJi6404QwSE/scWFGGecGTswCyP1XoScZeHpOvkisf7uJRnaVMO4De7vBqUEFd3yPqgjxNtc6K4t4RlsZeYc0p6RA5aQusERgTDtrqywKkUOYqcgOTb4qSP/844rJFQTnog51ITFgMRFxraalySE9m+NFs7k7jyzl89mL2WsNKD46ky5T4BL3WO1dv6WZypOahNJm9s4GY0HsCq0P0yVo8pyXCRURNARcrdm/zhLxA8zfgDyBJqLFyb+VujZCK9Vc2iPNbVMVdWPWq9aovzOCoUwPAyNOi8ztKIZpbNGvthJJtRFl/8aInSKIWuDqxc39JT5PnNWWsxD4KiX38w76xn+1gk1c11BH5k4z3Gv9PNAlrZ1Onnlwp1Gu708ScB3upBrdJ/jMF1DsSewPP2ChTvgNHlV/pAdwUXb9R9IFdVqeoStO7+1tGzwQMzinlHLrvrg0AMKZtFMsf2zkuMMCNs5HO7cZ5D9HjC9ef/Sy7oNVJO4IfHr2M+Jz26DL5vCFPaaD0SsSaYJBbU6vi/8tWF25CqB6x8HaFGdCbYnxrYtb2Qhp6FsTHBMOatH6do0/GJXBxehMqclY/f+OKDlPtS6fSA/5kZfPWZEHMQLs8g5gn20sy+aC+hlpirTOFBC2JOvew18NTO3dIKAf63E8pByOKl+UHJe5UgqT5vEDaNy4bLAJVaPLpf+bFNvVERApuGyU3txl0NCRKPHqys6hfxnXbgI0p0PpV2djHfopr3VdOQLmbhTwjUGA1ZzK5Zyzuzu/Gy1uOq98FEVBPXhnq+LW7e7MS2pPGk4FJWRmvoMugFIHNCMWyzmV7Cor0riUyC67PKPPH8V4OoT6451EUGD6jchsiWedWbOQdF9S6ofXVD2FqlXg+hAYixbReGHjHDRDjtknXXDtTGRl2aYy+LliQk9hV2DQZUCB1/gROlmg21j4fMSjfD0v+hctsuYmhrN3VYKsxNDJfFkN5SaPUjo6f+Ea/HbH+h/A83w05Ltysoox8ukLZjEJYxDD6nPOmUgw+GkGbb4XCpk4gz6sykquaXEZTK2N6dh1M48cjH5AOYPyKrZQxo+DVR5MczjrFXR9Q1DMIuTWLHJ5mbfz6EWKVptgX22/lQOZfSwMdobGITZf9Jyhvxyp78I/An4KV0EJXwuJz/MvFVosw5ZI2D83n1ZTkPIMp/16OAC8VJIy3RJ3HrZQ29sj9J/mwlFIr3swApAXfJMR5riPaj+I+cQDMBllxg5z/pQ8mUelGL1+zxYIfi9/gT3nYVz+Qc48eWUhEANbG8hf/KuEOsUp7q0JuN9m0mXqpIPg9f7CAzba1KbX0ElJPWpuv0Gb/AgbIDWO7NkHISB9DknjYqWe6DBbONVMl26rNBuEsPIk+0+i+Lrqe13JrWtG58Vi//nCitErJkXMMMMMsJFc2cFX8Ga83tCuXo/tUCtE7+Ywm1eZXK9Of9/XeY1qbmCuyNf6p+EvIC2BhfsnDfEICn074o2SpuDWGDJKlG4p3SWrJJcWGiJAStXBWhwuUSECeyfC9+WyFjBYSlFB9DCUbS7y6fAJO/vv5M480HSieCOVZyJW6QJ6QRnaeZjhqZQ0Ews8pY0DEz2Svx9izSuSZrYi9Fyk186lFK5ttCIGjNybo4pPMNc1lqjZQLl8gQ4ng2LjvB3eu33avS1ob31u2w3b3ND7yG6XRwIbSfv+j14mo3d0YkHZUHvgpzA9w1c5gfnmfSdeRNV/jsuvvInb8RqLjA1f1VzRKthbaRIvl0k4CNuy/JpOH1dI6/dwslTbBypFFCspwYn+uggCY/+Hl36qjql/VBb179d7kqMGdw6hUrpPT+JRjK8PKEu1bNMp/FZX5InOZFMN7GYTnDI8QAEj+N2XwPAGeDh3BO5UcxpexTrifQJvHnKQWoaRCcKA3OTy7C7LizYb+GqCR4jk84hPQ2UwVPKtZpBSX67EFW7NZVtrDRTJpDfrfFmPWTcCsUYS0gpF+KtcMy9f/7dmdb1nG5LqaJpsh/OAqze/29sgjG09IGTo3VZleqXyxfccfIT7x+QvZiA15zAkIJrZSSBJIOSsrbxru37uKipaSTCeWwO3lrUFprDyOX/JHZyt2vt6G6Uc0K2nT7HMxK7tUL4aujhmJ0riQ1fH43tueFOnSH39Krn7Nk1Et0QoruBG7nZ/bD3r/yvYWpEa5/lUWxjGpYb5RU8n5deaJ7zFQcLYqZ6ANwvqsnUJuOxoKN9lfFefv33N6rYJ5J0q2U1ea3FtYa8L+UmwaaazqgIpefx1EV33xSKepOIqTjhE3JydFwWMPecZ+OjA+WJ+T0f6gnbZO6pAfUbBof/0R79+jLvJ/vFu8xjLqer+4fLYW12RF9ipvDMK1CVT/PP17XQPtYEaf2+sFIJGiqfJh8Cby6dxpU48gXZcK/lvm/59LrOCj/6JL6D/G63erDNGilxAX5ERFhLLFw7j0kVCPxBlGK6rIrW8NOZB3T53umEhkbT5dFcmL2NaStr0L7XXMvohnzLUOQmRbVlBlefSKiLsvvXv+aZWdGQhIVCdOLtF+KQiJaAiRrdrsCAcx5W3mJ/0F/CIhUaaufyJ0RVXBy3gtd7CCcTIP+lq3LV+F7XT6nwOuXqhoC42Xx9EJLyA+6bXHwwn4R3wpN0B2Q6rbFJQle5Qqin3QitzTx0nIuep7C7HIhuRbKyuYGFmuSE3ZRr0K43vcW8JcaXL5T14//haTkE8wBkjHSrgxzbXWCAhbmYZ7YK/xej+89ofgmXaeiZEaA8fPMg7YLBmtq+RilPHG1nCPqB9vVVpomvKzjVSmzElUkFrPJFw1RIGC78w1LzZsB25oynRGaW2GlxrmBDt/xfPq3Btns525IC5hdJXWuddnPPy7qJ/8AFvtjRqmPnhzdL2d90JX7ZCwOdmdOKdVtofB4LhBBlY9TWY2R6ugPXYA6BDN1zM1qwUzY6AI7J2RX4D/hP0WFMkeK5zaxuocedIwSHwlUPWTMZOjjAgQc52mfp3R1dyJQaTMpeyoF6NbvlLexfZfyZN83diQJOQkvq7/eAab1uEdlLhIIbfo7DtCRrsfdkukrLR9U3ePV5/ggKSo16rmQEYQpREoGQmJry4EO6Bk9GomBUpOOt1JhznNxFY7gNE74RHzog7L+cdGpo0fNiDjRK9tBDTkU135pzZ2yw9biYiGhyByMqUbrmmEjJQ5zmpiigtapcNyozqhNla0BgTowMFWvz/3aF8IRzisSSRA7SYgk5R4rpJBdci37CTc2vVlK0juWSO22nCiDehK5y5+23/fq9AzMw2tmgiCTIXqm6qON10NG8qODod0xr1K2JGzhkipBvK0x7ji5FjLBHsABsEYozCs7ZjiT28poG72otTiweKxmTjFX6ms0lMtw42/MoZXtOfGXto3YmaSPYfOLUJ4wRiDF981QbXU4IHZ4RVOsiXGgQr+PzqECZ6oPfCQl03ld/EmMfQzdKTUzT+cBC2mdTOYyQlOmOyuSgzcScoqcpm8KxPL94HG2A6Ss1ngILx4bHX12JshN18qysX7g7629ZT1r5hd1HYS6Qdajppo3dE4PJWiZ9aD1Y+wWFHjVL3NkyoYpkL59YS9upWZqbm31RDqDCNxCRg5Gzylpv7n6qHfXX9OC7Df3au5M7y6yTi+UNHTTI/fvDB20vPRIjzYKU8/cKjZ3hMRq5+/utTI5HQBhJxuWKdA68/ez4oAY7QSNUJdz7I8nwL0UbjV2Nb4e7jfNB2cRSHV3LnkbgxX/Upy5tgeG0NrYuGDVG50oPVSQvJHE9LYMpMErYw3Wpgeb0AdglSMq7qDtXkzvumGGcJHAxGctf0flaurgbBByYZ6VQv7prTsU5+GABlJ1iRb83nIgWBnTjFIzeiUXVnEViLzFlyNiTUtvoBfSEnTp2bN0vrcRdA1e6aXfEdH+ASi14N7wafmsOnylTV/l2D6WU5jlMIdP+QT594eIzEu/t3DyqefsD+fV/+3IP5uHDczykC3MGysZL43WEkNo7XbSetsPeTMqGzjwhT/cKAOLZSUoaH/QroeBuUmkgc3eKixZJkj6gDGcjvrC36yNstI09Yd6efWpHaGtU7Y+VMdmXPX/+Oyh/uZeY6YwIxRMC1Ff7eQoGJ2xKqzyrX2qdSZcvZ0xpSSsMMc/bqgI2+9DlKAbdKEOpsFlnP8zHSsKsPdDoAFMtg0ZLFVlZ/gJyQFro9yWZaW/MliMaK3GIvMj1Lw2JNXW3MSopQfwGlmskKdYoXA9d0n2wyBQWcHZ8OO4Gn4y0WO/phO+8f660GixAebNNzvu549E8BNyJV4DGV8FBLnZ2ke6Sfpr4VFX+/PVQf7YOV5FaeDT5wMSFoFEQ4gDfPesRdXdjSxSana8RkZR+pEQvMfWlM3DtgHk1uvV3mfiKGMH5HMdA+A70XTFk+mfjwR1IIhLDci4T6HOSDaBpxIAHG/kWvqFloZ2wE5nvhx2a9yeiiSIe7TzbfjSeQ5TvqyrTp3Ne+VRR2lSTf1W0PPBU/Ei50QpIc+3CZGiRfVVb6xEXgz5g3Ggouk4Ngfc5FNxxxnGdmRfF9H+5S/FrWGwTNgVlMjMA6BQjuRmXBrzQeUjXB01kv4L6+9fkKpoJNH2aoQfhqYxCjHn+1ey72zThlSLoqH7HFeG1bMkv2FKcf+Ed3b81rXw6AGlASnodY5dyMbMk6L+MI9kz30m0kQJYQOQ5IhSIVbnN05gsAkNpE1i0WbGS8AvEv1DoV+34QaxIg4WUVAMAZkDahH88GW+WOFef4oCSV3FWleC7yTTHEnje9nlbfJ8RYR9d0ranAC2vbkX90FIn3oQHJc7WkH1k7nn3Pmdw1o7Wb7DEoix0g3UYrHTJZm+F8sRQLTKYWpscoP1s0a6LFVA/zjqh4wjsVmGX2dPhZX2gUL/jjqPvqFAKi5OHrpYdV6pHyJATX88Wdg//aZvLpzKIcSLdCxgS9o9r+/v1ROw+zNG38eGu2Sn2thc7aF0g5m0NZAvafU8kGduhVsoqDfcu8GhF3K1f1GMna0r6k6v9ulXI+BWu8B9FHklQpbGPkUjCcKFomrzRBBVr7WDvzBdPdXooD9eXbUFmgjGgyxgT+Wbll2hpBFoySLpAHGj+9NSHOYOSqH0JOtWDbkL2Lgap/0dJ1pFvVjbF8LssDEMSwTWbYZZDLJEfkYiFDy/lV6I/bOB04rYcESN5KWzvlOq3ZbI8HpyyTULAlkXWvykH0I8j2cOntvkSbJF8fZj40IxwmTKbkLhtCYyYWJR//gObvvOswlaYUt/b5aQZBhgaexwueuTVqvh/vxe3MHma9Sgg4oYj3ZbehXUuM0yqseRjK41M7nT+PqwCJqMczB5gF9aNcUU+Wa8lgHnmMEGz3ra3k1LQ5DkO1TwTXT0Rmd7aPpt4/2F4dr6mLhWr6pbXeok2/5jmdk7lnV8EAKCH6YfdDNTCj4CrvkCqjE2eAu1CWMf8oijnkOkmBpcbCf+e3ixXJPmJ+d49KzbjbsD6SsPBXr+CPCEo+Yco/wrgBV4DOmbUPdwwY8aU+81U8KDqp0RIuMkJjyBHPJ+bNGLU7XEjF1oV9aAKwy2Q2j4SssGLZeCsX+0b0oCIpp1sqM95nVdnEDtcEjYCyLhWj0myaTuX5LLH82x7AxkEUx6g3UgjOEdBY/adNaym251alLaz32vpBHAW5y+9uwD0o0PxLXJdmmv2dEEUB+UvoPR9Pmaw5wH6GuDblapPzpxHIJfRJfr3/NsPViRI+d4fyjlx0Yf6fyTyhpWYlwfqV8p1yslB3NZwF/w5U5UmeRjS4o4+VyED9BAdGXYqgSXZ1reQwQAhmUuGlWVVrxwpaGI8kBMhS75a3uNyb0V/GA4oePcHU7sBKqBdRRPhxTJ+QDPsNgEtfi7h1BO91+8T8/Jf//KUslPlLK+TpZ7xkxK2HNQeYsYyhE8lK8rslY0RytEYi45/j/y7vFyd2/7/lffnxIc48bM61y81HtKppUz3KaLbOXwG5JyTRav6kksCghAzTAOGpRebBh6EYAnIWL+SMI26wcs4/2wEJz/mdK/hIsBrtb2GDrGc3fePnyjNOuxntJSjkcvQudGYnZ7NJMmFeDZvJcVxd+3a8DVtrLiEn80qo0gWBqrtyXeT1lWbV203T7hFHllgeSrdvATN82JqcXpc60WVGhfgEiRT4u2oQB0BqDd7q2GBckoR2nnTmKApIDAp6wvGoyzbXXucHE2XMzj6PXmuWbCDM40vG3/NDoywq9dHq7Vswa8no16P+Qml3z8B2ImdRu0ko37RzqHVAv9eSmdB5HCYTot3eczY0oquBcbZCml9T8deK/21a8GxPM0aswTHtMrXV7VLmZUgiBH7mn+R6v8BdYp16Yes3jRe0gzOTOVSBO7fwLIUdFN9e6NRpyLh/35qpLjhgyQlQKLKxB2Z5PjqG3e+jX0cyAQiuLjrZl4dP8kH4P0oNFOaH7NK1TyOubpiJuIbm5VXIB4yo2djuI2t7uJKPatk32I+3lGRXdZl9Pa6aLHQe2ffQ8ZwDVoRltjXEojDC9KsarEfz7zJw9dPev006JtX0sF/DlF+zg5ooYdD0ZSK76EfAfEqpEBAVU14e+mqhtS1CDPpFWNqx0ssIm9FQ47GCEDioC2sOxkUoSNaAhL0BWgY84wxjSbiZPUOrAiMhZGBzB19v8K1Ju9hwBRvPjCtvAt+X5o3yY2jdtz452FCSvQfSuubpcYiLk0V4Jvb6TFrG6OBLppTiRZOy+QO6S5UWYLaBIGTYO6cw56Ha66ZgVL47haR0c1dXntBHNRERQIHdgw5TLDMAC4oWPsQA6L/LeaRnYDY4A7IQfsONRPfitwQbM8RirTKFjvV4GM9P7vxk+VVCLNowYLbY3ByHGn9MaWOP9w+tRxXUpyZiIhS4C4V+ZmsD7fqRxQfkPbe8hOBvKfAhd0m7ZzsZ7qH/J2a4BmbeZxO1krQaPcNhZKLj7E38l5Xw91SzBCuciOEmwTFEojSsw4SYaIcjArPHFOaH2uFpFvkgIyT6320MmENMVZl0bcP4S5Y2yWHuh1DkKg6Av+/jzii2SETnmyDq/MmtfIrjVHtxpb4nw371DEGpP9PqcRkdwdtpyxodhuQj8jejaSUHXL4tVcQNYiMlNyQNKJMn44y7e7oMy7vGfg2WNHfwzWJd0o1ALcC+t2dNxgMhbqJvq/0YqBXK/BBkIZ2yRI+/04t/ji+vy9eRFo4g3k+84FpP2zBwtuCV4JibV5CMEDCWzziMKB3t/TRo7ZSFtjnjOWPFkZDiu56AwBYg4JnasKcryOcEgMGzsOo4XfYcdyzcJoU4y8MjuSKQPhnl0+D+TwOSSgFII40jZmqOVTEG1beMWXXOKypoN6FUH6EOu196Mtps1Dpuu+IL397R/bedNFjPKkfTvYw7Ga+UNwqgx0vVjPC685GLMLSloXRvGwcYleRnqSq2LA8vM6+MBxD5o/5ruB5zoZQdkNVbQ7JBdKzVTcyQYPZvQBI4FGemoJOO0KPuDF37TkPVYRmHQ0z8rqgMfL9zEin5N8M94puidGsQRG90K6xvuuRW9fV5MWjFM1KnjBdcCYWzJZg5zXi2ewPBLR2ibsS6MTLSIxvNoLd28GLDFYrfKKkJhhlZ8o4k83c50pWwyyTgsgK+cLUWqL8h2fwK05osRIA27kO0ZfgFX5zzn5xVH5hxK5rl3VwfdsxxxaEEsQZCnFaXS4umr8Rbv1X7fECXnCXIxyzi3lwEUa/dU12YLxCrfng6H+kQwQqp8MLxoBomkzbcntM4Ae8vJ3tKmz2DGkMP+pS8e+hCDj63/yqhC29//Z7yGlyBrz6fTRuTBVkFW7fVsOIJrzIxqG0lKwr52RF6WJzhsL+oceSFWHJ2OxKHMgyvMH89Oc513LLmILqah/gcc40s+K1kf2AYaAMC8KEx2BfHBzzejLuawcCjzi6Cb3XHUKaOcf4a39G36OT7R2c0p2vluqhVNGdRy41abbUD7Xu5Bt/jvpcM1wPftqgTpf2jawxwZnqONRveQU94W2fjIJlvaduudEWoXqxOr4JX5N/EZs83vMP4Mte8O6iH2dgAXuVKi/GRWXPKpJkHFnWi5dgm+gqxLCBvXsE/XKeBZRqxOXIjIf+YgtUnzvsIg3Vl3dhuKhvIDdQT/hedMcTHzOwZK7i2Lzyomtg5UuX3+cYjMOmoT0eawgLjpe3ogwli99ejN+iRyaSE1aY9BPYgsGm8dzNgWeZutQqdHHUuiBTbVkv20d3oXCRHtXD8xUNtO6UVybM7x0oRYJTCJzpwsF7qxqNRJC8x0rhc0IKPqmiOWz9RB0qEpXnQIbZrGEsu3qG8zoGon6W4aT394/p5702NiDJiJAvmZzF2glWgXPZFnOCSw3yPoJCJ/KFrhfi0qSpvi02SxVoi8pyLIBCfaga7WoJIBtRxEBG/Zep8dv8idhGQ/Kz+rPUApi4o38XfDo1HyIu+hc9Wnod/ulGMd/DQo0TAYm2tWQAAaNHg2YuHwGCgj8rxa0wG33AUB7SDfrLhiPtzK8Sqq8RwOeb8Mh5tWrf187uRswKZC8RYlh5PgF6IpnJ2jNzYD7zmXraaAWSYxCveOIB0Py17M7q4r6dNGuCUzzQ+UCQ15PHFv8iPP9eZmhZOVTqcr2i+Ci85jCaP2QFmKwWkgZ7jgQWa9hk/SiWNpXZjQa2BIeJ/h9f4/UPXXtwXTuy1Y2nLKKhCif86hVftIkQPs9n99b+NKVMTOj0/N/pwD9Cj2T4E5vIWd9KdOCp/QCbA0zJ+tFXYfuNVvoEs5hfc3+nYYKI6V19J27jCE8X+M6+mca3s+E2dKNlmmhsrXd5UAB15XoZ7QaCYjXU/1ZyF16SP+JPt9AuIiXKQF+ubaB6+xZZG3EItXpmL8MwzEQBvWqV/0gbrCCY3WbZc+wxAVljKDxbG7Pg5YUs3QnKe9qeigG5EAqdYlFX2YRC0ny7LBkB9jv0GwsuQikcMeWZCrrNzGNvMhWobva4bvSA8LPuQyVUkPnSUdkPoP/vZ8QpVc9hfyb2RwWLbFH7+RSmYlg8AEmIK1wmlhSCH2Op5TPBH1yz4FlCo01ylic3S5oXmbPsAY5adeNYIb8xMhN/Tjt/qRgEb1TYkRDmOxAcD0sG/2RsUdiQtdTvzSKZFDuyvo5ENORnYFDCX4u4k/be/JYu2KjVb2oCoG+Ky3owDgyczVSROUbTDxAqcX5TRKM9qQ7run+6dkdCuYbEndulPQJlaDSZZKXkUM5aiyY9kZ5Z+YPyET7JUdp9K7Yt7pAPFS+21eMFc8WodI49uztcIlEhxkLV8ASYQlEdrHpHetf7+b+5v/4GVffx3dXe34oQivqhmgkwn9KmyICq4GWgQMWA7WDizv/mvzxblEgk3eyDGSraQ+FI/SP8pUzw+AAAAAAAAAAAAA2OlaG4oVzscE25z2AAAAAAAAAAAAAA=";
4
+ exports.default = ai2Icon;
@@ -10,11 +10,19 @@ const index$1 = require("../ChatPanel/index.js");
10
10
  const useChat = require("../../../composables/useAI/useChat.js");
11
11
  const useVoice = require("../../../composables/useAI/useVoice.js");
12
12
  const index$3 = require("../../../composables/useAI/adapters/index.js");
13
- const detector = require("../../../composables/useAI/adapters/detector.js");
14
13
  ;/* empty css */
15
14
  const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.js");
16
15
  const index = require("../../../../../../node_modules/vant/es/nav-bar/index.js");
16
+ const functionCall = require("../../../../../../node_modules/vant/es/toast/function-call.js");
17
17
  const _hoisted_1 = { class: "mobile-chat-view" };
18
+ const _hoisted_2 = {
19
+ key: 0,
20
+ class: "iconfont icon-mobileyinliang1"
21
+ };
22
+ const _hoisted_3 = {
23
+ key: 1,
24
+ class: "iconfont icon-mobilejingyin"
25
+ };
18
26
  const _sfc_main = {
19
27
  __name: "AiChat",
20
28
  props: {
@@ -42,6 +50,46 @@ const _sfc_main = {
42
50
  const ctx = instance.proxy;
43
51
  const emit = __emit;
44
52
  const sessionId = Vue.ref("mobile_session_" + Date.now());
53
+ const autoRead = Vue.ref(true);
54
+ const speakingId = Vue.ref("");
55
+ let manualStopSeq = null;
56
+ function toggleAutoRead() {
57
+ autoRead.value = !autoRead.value;
58
+ functionCall.showToast(autoRead.value ? "已开启自动朗读" : "已关闭自动朗读");
59
+ if (!autoRead.value) {
60
+ stopManualSpeak();
61
+ }
62
+ }
63
+ function stopManualSpeak() {
64
+ if (manualStopSeq) {
65
+ manualStopSeq();
66
+ manualStopSeq = null;
67
+ }
68
+ speakingId.value = "";
69
+ }
70
+ function onManualSpeak(msg) {
71
+ if (speakingId.value === msg.id) {
72
+ stopManualSpeak();
73
+ return;
74
+ }
75
+ stopManualSpeak();
76
+ const urls = Array.isArray(msg.speechUrls) && msg.speechUrls.length > 0 ? msg.speechUrls : [];
77
+ if (urls.length === 0) {
78
+ functionCall.showToast("该消息无可朗读的语音");
79
+ return;
80
+ }
81
+ speakingId.value = msg.id;
82
+ manualStopSeq = playAudioSequence(
83
+ urls,
84
+ (a) => {
85
+ if (!a) {
86
+ speakingId.value = "";
87
+ manualStopSeq = null;
88
+ }
89
+ },
90
+ 300
91
+ );
92
+ }
45
93
  function extractReplyText(data) {
46
94
  if (typeof data === "string") return data;
47
95
  if (data && typeof data === "object") {
@@ -49,21 +97,74 @@ const _sfc_main = {
49
97
  }
50
98
  return String(data || "");
51
99
  }
100
+ function playAudioSequence(urls, onAudioChange, gap = 300) {
101
+ let idx = 0;
102
+ let advancing = false;
103
+ let pendingTimer = null;
104
+ let stopped = false;
105
+ let currentAudio = null;
106
+ const advance = () => {
107
+ if (advancing) return;
108
+ advancing = true;
109
+ idx++;
110
+ advancing = false;
111
+ pendingTimer = setTimeout(() => {
112
+ pendingTimer = null;
113
+ playNext();
114
+ }, gap);
115
+ };
116
+ const playNext = () => {
117
+ if (stopped || idx >= urls.length) {
118
+ onAudioChange == null ? void 0 : onAudioChange(null);
119
+ return;
120
+ }
121
+ const audio = new Audio(urls[idx]);
122
+ currentAudio = audio;
123
+ onAudioChange == null ? void 0 : onAudioChange(audio);
124
+ audio.addEventListener("ended", advance);
125
+ audio.addEventListener("error", advance);
126
+ audio.play().catch(advance);
127
+ };
128
+ playNext();
129
+ return () => {
130
+ stopped = true;
131
+ if (pendingTimer) {
132
+ clearTimeout(pendingTimer);
133
+ pendingTimer = null;
134
+ }
135
+ if (currentAudio) {
136
+ currentAudio.pause();
137
+ currentAudio = null;
138
+ }
139
+ };
140
+ }
52
141
  function initAdapter() {
53
- const adapter = index$3.getAdapter();
142
+ const adapter = index$3.getAdapter({ sessionId: sessionId.value, ctx });
54
143
  const http = ctx.$http;
55
144
  const sid = sessionId.value;
56
145
  adapter.createStreamRequest = (options) => {
57
146
  const { body, onMessage, onComplete, onError } = options;
58
147
  let aborted = false;
148
+ let currentAudio = null;
149
+ let stopAudioSeq = null;
59
150
  http.postForm(
60
151
  "ai-server/aiAsst/mobileQuery",
61
- { sessionId: sid, message: body.prompt },
152
+ { sessionId: sid, message: body.prompt, isRead: autoRead.value },
62
153
  false
63
154
  ).then((data) => {
64
155
  if (aborted) return;
65
- const replyText = extractReplyText(data);
156
+ const replyText = data && typeof data === "object" && typeof data.message === "string" ? data.message : extractReplyText(data);
157
+ const speechUrls = data && data.speech && Array.isArray(data.speech.urls) ? data.speech.urls.filter(Boolean) : [];
158
+ const lastMsg = messages.value[messages.value.length - 1];
159
+ if (lastMsg && lastMsg.role === "assistant" && speechUrls.length > 0) {
160
+ lastMsg.speechUrls = speechUrls;
161
+ }
66
162
  let i = 0;
163
+ if (autoRead.value && speechUrls.length > 0) {
164
+ stopAudioSeq = playAudioSequence(speechUrls, (a) => {
165
+ currentAudio = a;
166
+ });
167
+ }
67
168
  const timer = setInterval(() => {
68
169
  if (aborted) {
69
170
  clearInterval(timer);
@@ -75,13 +176,21 @@ const _sfc_main = {
75
176
  clearInterval(timer);
76
177
  onComplete();
77
178
  }
78
- }, 30);
179
+ }, 20);
79
180
  }).catch((err) => {
80
181
  if (!aborted) onError(err || new Error("请求失败"));
81
182
  });
82
183
  return {
83
184
  abort: () => {
84
185
  aborted = true;
186
+ if (stopAudioSeq) {
187
+ stopAudioSeq();
188
+ stopAudioSeq = null;
189
+ }
190
+ if (currentAudio) {
191
+ currentAudio.pause();
192
+ currentAudio = null;
193
+ }
85
194
  }
86
195
  };
87
196
  };
@@ -115,22 +224,15 @@ const _sfc_main = {
115
224
  } = useVoice.useVoice({
116
225
  maxDuration: props.maxVoiceDuration,
117
226
  onResult: async (result) => {
118
- const platform = window.__fecPlatform || "";
119
- if (!platform || platform === detector.PlatformType.WEB) {
120
- messages.value.push({
121
- id: "voice-tip-" + Date.now(),
122
- role: "assistant",
123
- type: "text",
124
- content: result.transcript || "抱歉,当前环境不支持语音功能",
125
- status: "done",
126
- timestamp: Date.now()
127
- });
227
+ const transcript = (result.transcript || "").trim();
228
+ if (!transcript) {
229
+ functionCall.showToast("语音识别失败,请重试");
128
230
  return;
129
231
  }
130
232
  await sendVoice({
131
233
  audioBlob: result.audioBlob,
132
234
  duration: result.duration,
133
- transcript: result.transcript,
235
+ transcript,
134
236
  audioUrl: null,
135
237
  serverId: null
136
238
  });
@@ -170,13 +272,26 @@ const _sfc_main = {
170
272
  initAdapter();
171
273
  if (props.historyMessages && props.historyMessages.length > 0) {
172
274
  loadHistory(props.historyMessages);
275
+ } else if (messages.value.length === 0) {
276
+ messages.value.push({
277
+ id: "welcome-" + Date.now(),
278
+ role: "assistant",
279
+ type: "text",
280
+ content: "你好!我是语音助手,有什么可以帮你的吗?",
281
+ status: "done",
282
+ timestamp: Date.now(),
283
+ isWelcome: true
284
+ });
173
285
  }
174
286
  });
287
+ Vue.onBeforeUnmount(() => {
288
+ stopManualSpeak();
289
+ });
175
290
  return (_ctx, _cache) => {
176
291
  const _component_van_nav_bar = index.NavBar;
177
292
  return Vue.openBlock(), Vue.createElementBlock("div", _hoisted_1, [
178
293
  Vue.createVNode(_component_van_nav_bar, {
179
- title: "智能助手",
294
+ title: "语音助手",
180
295
  "left-text": "收起",
181
296
  "left-arrow": "",
182
297
  fixed: "",
@@ -187,16 +302,24 @@ const _sfc_main = {
187
302
  Vue.createElementVNode("span", {
188
303
  class: "nav-right-btn",
189
304
  onClick: handleNewChat
190
- }, "新对话")
305
+ }, "新对话"),
306
+ Vue.createElementVNode("span", {
307
+ class: Vue.normalizeClass(["nav-right-btn nav-read-btn", autoRead.value ? "is-active" : "is-muted"]),
308
+ onClick: toggleAutoRead
309
+ }, [
310
+ autoRead.value ? (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_2)) : (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_3))
311
+ ], 2)
191
312
  ]),
192
313
  _: 1
193
314
  }),
194
315
  Vue.createVNode(Vue.unref(index$1.MobileChatPanel), {
195
316
  messages: Vue.unref(messages),
196
317
  emptyText: __props.emptyText,
318
+ speakingId: speakingId.value,
197
319
  onRetry: Vue.unref(retry),
198
- onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event))
199
- }, null, 8, ["messages", "emptyText", "onRetry"]),
320
+ onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event)),
321
+ onSpeak: onManualSpeak
322
+ }, null, 8, ["messages", "emptyText", "speakingId", "onRetry"]),
200
323
  Vue.createVNode(Vue.unref(index$2.MobileChatInput), {
201
324
  disabled: false,
202
325
  isStreaming: Vue.unref(isStreaming),
@@ -214,5 +337,5 @@ const _sfc_main = {
214
337
  };
215
338
  }
216
339
  };
217
- const _AiChat = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-80fc6732"]]);
340
+ const _AiChat = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-0599028a"]]);
218
341
  exports.default = _AiChat;
@@ -58,7 +58,7 @@ const _sfc_main = {
58
58
  const emit = __emit;
59
59
  const inputRef = Vue.ref(null);
60
60
  const inputText = Vue.ref("");
61
- const isVoiceMode = Vue.ref(false);
61
+ const isVoiceMode = Vue.ref(true);
62
62
  const { isCancelling, onVoiceStart } = useVoiceTouch.useVoiceTouch({
63
63
  emit,
64
64
  voiceStatus: Vue.computed(() => props.voiceStatus),
@@ -89,14 +89,12 @@ const _sfc_main = {
89
89
  }
90
90
  }
91
91
  function onSend() {
92
+ var _a;
92
93
  const text = inputText.value.trim();
93
94
  if (!text || props.disabled || props.isStreaming) return;
94
95
  emit("send", text);
95
96
  inputText.value = "";
96
- Vue.nextTick(() => {
97
- var _a;
98
- return (_a = inputRef.value) == null ? void 0 : _a.focus();
99
- });
97
+ (_a = inputRef.value) == null ? void 0 : _a.blur();
100
98
  }
101
99
  function onStopStream() {
102
100
  emit("stop");
@@ -207,5 +205,5 @@ const _sfc_main = {
207
205
  };
208
206
  }
209
207
  };
210
- const _ChatInput = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-bc3d78f6"]]);
208
+ const _ChatInput = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-05501c87"]]);
211
209
  exports.default = _ChatInput;
@@ -1,17 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  ;/* empty css */
4
+ ;/* empty css */
4
5
  ;/* empty css */
5
6
  ;/* empty css */
6
- ;/* empty css */
7
7
  ;/* empty css */
8
8
  const Vue = require("vue");
9
9
  const index$1 = require("../MarkdownRenderer/index.js");
10
10
  ;/* empty css */
11
11
  const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.js");
12
12
  const index = require("../../../../../../node_modules/vant/es/empty/index.js");
13
- const index$2 = require("../../../../../../node_modules/vant/es/loading/index.js");
14
- const index$3 = require("../../../../../../node_modules/vant/es/icon/index.js");
13
+ const functionCall = require("../../../../../../node_modules/vant/es/toast/function-call.js");
14
+ require("../../../../../../node_modules/vant/es/toast/index.js");
15
+ const index$2 = require("../../../../../../node_modules/vant/es/icon/index.js");
16
+ const index$3 = require("../../../../../../node_modules/vant/es/loading/index.js");
15
17
  const _hoisted_1 = {
16
18
  key: 0,
17
19
  class: "chat-panel__empty"
@@ -39,13 +41,23 @@ const _hoisted_7 = {
39
41
  };
40
42
  const _hoisted_8 = {
41
43
  key: 2,
44
+ class: "chat-panel__actions"
45
+ };
46
+ const _hoisted_9 = ["onClick"];
47
+ const _hoisted_10 = ["onClick"];
48
+ const _hoisted_11 = {
49
+ key: 1,
50
+ class: "iconfont icon-mobileyinliang"
51
+ };
52
+ const _hoisted_12 = {
53
+ key: 3,
42
54
  class: "chat-panel__status"
43
55
  };
44
- const _hoisted_9 = {
56
+ const _hoisted_13 = {
45
57
  key: 1,
46
58
  class: "chat-panel__streaming-dot"
47
59
  };
48
- const _hoisted_10 = ["onClick"];
60
+ const _hoisted_14 = ["onClick"];
49
61
  const _sfc_main = {
50
62
  __name: "ChatPanel",
51
63
  props: {
@@ -56,9 +68,11 @@ const _sfc_main = {
56
68
  /** 是否自动滚动到底部 */
57
69
  autoScroll: { type: Boolean, default: true },
58
70
  /** 两条消息间隔多久显示时间戳(ms),默认 5 分钟 */
59
- timeGap: { type: Number, default: 5 * 60 * 1e3 }
71
+ timeGap: { type: Number, default: 5 * 60 * 1e3 },
72
+ /** 正在朗读的消息 id(用于高亮"停止"态) */
73
+ speakingId: { type: String, default: "" }
60
74
  },
61
- emits: ["retry", "scroll-to-bottom", "navigate"],
75
+ emits: ["retry", "scroll-to-bottom", "navigate", "speak"],
62
76
  setup(__props, { expose: __expose, emit: __emit }) {
63
77
  const props = __props;
64
78
  const emit = __emit;
@@ -81,6 +95,34 @@ const _sfc_main = {
81
95
  const D = d.getDate();
82
96
  return `${M}/${D} ${hh}:${mm}`;
83
97
  }
98
+ async function onCopy(msg) {
99
+ var _a;
100
+ try {
101
+ const text = msg.content || "";
102
+ if ((_a = navigator.clipboard) == null ? void 0 : _a.writeText) {
103
+ await navigator.clipboard.writeText(text);
104
+ } else {
105
+ const ta = document.createElement("textarea");
106
+ ta.value = text;
107
+ ta.style.position = "fixed";
108
+ ta.style.opacity = "0";
109
+ document.body.appendChild(ta);
110
+ ta.select();
111
+ document.execCommand("copy");
112
+ document.body.removeChild(ta);
113
+ }
114
+ msg.__copied = true;
115
+ functionCall.showToast("已复制");
116
+ setTimeout(() => {
117
+ msg.__copied = false;
118
+ }, 1500);
119
+ } catch (e) {
120
+ functionCall.showToast("复制失败");
121
+ }
122
+ }
123
+ function onSpeak(msg) {
124
+ emit("speak", msg);
125
+ }
84
126
  function scrollToBottom() {
85
127
  if (!panelRef.value) return;
86
128
  const el = panelRef.value;
@@ -137,8 +179,8 @@ const _sfc_main = {
137
179
  __expose({ scrollToBottom });
138
180
  return (_ctx, _cache) => {
139
181
  const _component_van_empty = index.Empty;
140
- const _component_van_loading = index$2.Loading;
141
- const _component_van_icon = index$3.Icon;
182
+ const _component_van_icon = index$2.Icon;
183
+ const _component_van_loading = index$3.Loading;
142
184
  return Vue.openBlock(), Vue.createElementBlock("div", {
143
185
  class: "chat-panel",
144
186
  ref_key: "panelRef",
@@ -185,11 +227,29 @@ const _sfc_main = {
185
227
  onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event))
186
228
  }, null, 8, ["content", "is-streaming"])
187
229
  ])) : (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_7, Vue.toDisplayString(msg.content), 1)),
188
- ["sending", "streaming", "error"].includes(msg.status) ? (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_8, [
230
+ msg.role === "assistant" && msg.status === "done" && msg.content && !msg.isWelcome ? (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_8, [
231
+ Vue.createElementVNode("span", {
232
+ class: "chat-panel__action",
233
+ onClick: ($event) => onCopy(msg)
234
+ }, _cache[3] || (_cache[3] = [
235
+ Vue.createElementVNode("i", { class: "iconfont icon-mobilefuzhi" }, null, -1)
236
+ ]), 8, _hoisted_9),
237
+ Vue.createElementVNode("span", {
238
+ class: Vue.normalizeClass(["chat-panel__action", { "chat-panel__action--active": __props.speakingId === msg.id }]),
239
+ onClick: ($event) => onSpeak(msg)
240
+ }, [
241
+ __props.speakingId === msg.id ? (Vue.openBlock(), Vue.createBlock(_component_van_icon, {
242
+ key: 0,
243
+ name: "pause",
244
+ size: "14"
245
+ })) : (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_11))
246
+ ], 10, _hoisted_10)
247
+ ])) : Vue.createCommentVNode("", true),
248
+ ["sending", "streaming", "error"].includes(msg.status) ? (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_12, [
189
249
  msg.status === "sending" ? (Vue.openBlock(), Vue.createBlock(_component_van_loading, {
190
250
  key: 0,
191
251
  size: "14"
192
- })) : msg.status === "streaming" ? (Vue.openBlock(), Vue.createElementBlock("span", _hoisted_9, _cache[3] || (_cache[3] = [
252
+ })) : msg.status === "streaming" ? (Vue.openBlock(), Vue.createElementBlock("span", _hoisted_13, _cache[4] || (_cache[4] = [
193
253
  Vue.createElementVNode("i", null, null, -1),
194
254
  Vue.createElementVNode("i", null, null, -1),
195
255
  Vue.createElementVNode("i", null, null, -1)
@@ -204,7 +264,7 @@ const _sfc_main = {
204
264
  size: "14"
205
265
  }),
206
266
  Vue.createTextVNode(" " + Vue.toDisplayString(msg.error || "发送失败"), 1)
207
- ], 8, _hoisted_10)) : Vue.createCommentVNode("", true)
267
+ ], 8, _hoisted_14)) : Vue.createCommentVNode("", true)
208
268
  ])) : Vue.createCommentVNode("", true)
209
269
  ], 2))
210
270
  ], 2);
@@ -228,5 +288,5 @@ const _sfc_main = {
228
288
  };
229
289
  }
230
290
  };
231
- const _ChatPanel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-e842ef15"]]);
291
+ const _ChatPanel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c2dc87cf"]]);
232
292
  exports.default = _ChatPanel;