@fecp/designer 5.6.17 → 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 (71) hide show
  1. package/es/designer/package.json.mjs +1 -1
  2. package/es/designer/src/layout/aside/index.vue.mjs +6 -6
  3. package/es/designer/src/layout/header/index.vue.mjs +2 -2
  4. package/es/designer/src/layout/index.vue.mjs +38 -45
  5. package/es/designer/src/layout/property/index.vue.mjs +2 -2
  6. package/es/designer/src/packages/dialog/useDialogDialog.mjs +1 -1
  7. package/es/designer/src/packages/dialogGlobal/useDialogGlobalDialog.mjs +1 -1
  8. package/es/designer/src/packages/form/property/widgets.vue.mjs +2 -2
  9. package/es/designer/src/packages/utils/common.mjs +17 -17
  10. package/es/designer/src/store/index.mjs +2 -2
  11. package/es/designer.css +140 -62
  12. package/es/node_modules/@vant/use/dist/index.esm.mjs +1 -1
  13. package/es/node_modules/d3-sankey/node_modules/d3-path/src/path.mjs +73 -0
  14. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/array.mjs +4 -0
  15. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/constant.mjs +8 -0
  16. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.mjs +45 -0
  17. package/es/node_modules/d3-sankey/node_modules/d3-shape/src/point.mjs +10 -0
  18. package/es/node_modules/d3-sankey/src/sankeyLinkHorizontal.mjs +1 -1
  19. package/es/node_modules/vant/es/toast/function-call.mjs +1 -1
  20. package/es/packages/mobile/src/assets/images/ai2.png.mjs +4 -0
  21. package/es/packages/mobile/src/components/ai/AiChat/AiChat.vue.mjs +145 -22
  22. package/es/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.mjs +4 -6
  23. package/es/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.mjs +71 -11
  24. package/es/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.mjs +37 -3
  25. package/es/packages/mobile/src/components/base/card/Card.vue.mjs +2 -2
  26. package/es/packages/mobile/src/components/form/uploader/Uploader.vue.mjs +1 -2
  27. package/es/packages/mobile/src/composables/useAI/adapters/h5.mjs +255 -0
  28. package/es/packages/mobile/src/composables/useAI/adapters/index.mjs +3 -3
  29. package/es/packages/mobile/src/composables/useAI/useChat.mjs +10 -3
  30. package/es/packages/mobile/src/composables/usePageEvents.mjs +1 -1
  31. package/es/packages/mobile/src/index.vue.mjs +20 -8
  32. package/es/packages/mobile/src/utils/datasource.mjs +1 -1
  33. package/es/packages/vue/src/components/dialog/DialogRenderer.vue2.mjs +0 -1
  34. package/es/packages/vue/src/components/forms/number/Number.vue.mjs +0 -1
  35. package/es/packages/vue/src/components/forms/text/Text.vue.mjs +0 -1
  36. package/es/packages/vue/src/components/table/TableColumn.vue.mjs +0 -1
  37. package/es/packages/vue/src/composables/usePageEvents.mjs +0 -1
  38. package/es/packages/vue/src/utils/datasource.mjs +0 -20
  39. package/lib/designer/package.json.js +1 -1
  40. package/lib/designer/src/layout/index.vue.js +55 -62
  41. package/lib/designer/src/packages/dialog/useDialogDialog.js +1 -1
  42. package/lib/designer/src/packages/dialogGlobal/useDialogGlobalDialog.js +1 -1
  43. package/lib/designer/src/packages/form/property/widgets.vue.js +2 -2
  44. package/lib/designer/src/store/index.js +2 -2
  45. package/lib/designer.css +140 -62
  46. package/lib/node_modules/d3-sankey/node_modules/d3-path/src/path.js +73 -0
  47. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/array.js +4 -0
  48. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/constant.js +8 -0
  49. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.js +45 -0
  50. package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/point.js +10 -0
  51. package/lib/node_modules/d3-sankey/src/sankeyLinkHorizontal.js +1 -1
  52. package/lib/packages/mobile/src/assets/images/ai2.png.js +4 -0
  53. package/lib/packages/mobile/src/components/ai/AiChat/AiChat.vue.js +144 -21
  54. package/lib/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.js +4 -6
  55. package/lib/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.js +73 -13
  56. package/lib/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.js +37 -3
  57. package/lib/packages/mobile/src/components/base/card/Card.vue.js +2 -2
  58. package/lib/packages/mobile/src/components/form/uploader/Uploader.vue.js +1 -2
  59. package/lib/packages/mobile/src/composables/useAI/adapters/h5.js +255 -0
  60. package/lib/packages/mobile/src/composables/useAI/adapters/index.js +3 -3
  61. package/lib/packages/mobile/src/composables/useAI/useChat.js +10 -3
  62. package/lib/packages/mobile/src/composables/usePageEvents.js +1 -1
  63. package/lib/packages/mobile/src/index.vue.js +19 -7
  64. package/lib/packages/mobile/src/utils/datasource.js +1 -1
  65. package/lib/packages/vue/src/components/dialog/DialogRenderer.vue2.js +0 -1
  66. package/lib/packages/vue/src/components/forms/number/Number.vue.js +0 -1
  67. package/lib/packages/vue/src/components/forms/text/Text.vue.js +0 -1
  68. package/lib/packages/vue/src/components/table/TableColumn.vue.js +0 -1
  69. package/lib/packages/vue/src/composables/usePageEvents.js +0 -1
  70. package/lib/packages/vue/src/utils/datasource.js +2 -22
  71. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { ref, unref, onUnmounted, onDeactivated, isRef, watch, onMounted, nextTick, onActivated, reactive, getCurrentInstance, inject, computed, provide, isVNode, onBeforeUnmount } from "vue";
1
+ import { onUnmounted, onDeactivated, isRef, watch, onMounted, nextTick, onActivated, unref, ref, reactive, getCurrentInstance, inject, computed, provide, isVNode, onBeforeUnmount } from "vue";
2
2
  var inBrowser = typeof window !== "undefined";
3
3
  function raf(fn) {
4
4
  return inBrowser ? requestAnimationFrame(fn) : -1;
@@ -0,0 +1,73 @@
1
+ var pi = Math.PI, tau = 2 * pi, epsilon = 1e-6, tauEpsilon = tau - epsilon;
2
+ function Path() {
3
+ this._x0 = this._y0 = // start of current subpath
4
+ this._x1 = this._y1 = null;
5
+ this._ = "";
6
+ }
7
+ function path() {
8
+ return new Path();
9
+ }
10
+ Path.prototype = path.prototype = {
11
+ constructor: Path,
12
+ moveTo: function(x, y) {
13
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
14
+ },
15
+ closePath: function() {
16
+ if (this._x1 !== null) {
17
+ this._x1 = this._x0, this._y1 = this._y0;
18
+ this._ += "Z";
19
+ }
20
+ },
21
+ lineTo: function(x, y) {
22
+ this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
23
+ },
24
+ quadraticCurveTo: function(x1, y1, x, y) {
25
+ this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
26
+ },
27
+ bezierCurveTo: function(x1, y1, x2, y2, x, y) {
28
+ this._ += "C" + +x1 + "," + +y1 + "," + +x2 + "," + +y2 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
29
+ },
30
+ arcTo: function(x1, y1, x2, y2, r) {
31
+ x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
32
+ 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;
33
+ if (r < 0) throw new Error("negative radius: " + r);
34
+ if (this._x1 === null) {
35
+ this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
36
+ } else if (!(l01_2 > epsilon)) ;
37
+ else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
38
+ this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
39
+ } else {
40
+ 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;
41
+ if (Math.abs(t01 - 1) > epsilon) {
42
+ this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
43
+ }
44
+ this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
45
+ }
46
+ },
47
+ arc: function(x, y, r, a0, a1, ccw) {
48
+ x = +x, y = +y, r = +r, ccw = !!ccw;
49
+ 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;
50
+ if (r < 0) throw new Error("negative radius: " + r);
51
+ if (this._x1 === null) {
52
+ this._ += "M" + x0 + "," + y0;
53
+ } else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
54
+ this._ += "L" + x0 + "," + y0;
55
+ }
56
+ if (!r) return;
57
+ if (da < 0) da = da % tau + tau;
58
+ if (da > tauEpsilon) {
59
+ this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
60
+ } else if (da > epsilon) {
61
+ this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
62
+ }
63
+ },
64
+ rect: function(x, y, w, h) {
65
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + +w + "v" + +h + "h" + -w + "Z";
66
+ },
67
+ toString: function() {
68
+ return this._;
69
+ }
70
+ };
71
+ export {
72
+ path as default
73
+ };
@@ -0,0 +1,4 @@
1
+ var slice = Array.prototype.slice;
2
+ export {
3
+ slice
4
+ };
@@ -0,0 +1,8 @@
1
+ function constant(x) {
2
+ return function constant2() {
3
+ return x;
4
+ };
5
+ }
6
+ export {
7
+ constant as default
8
+ };
@@ -0,0 +1,45 @@
1
+ import { slice } from "../array.mjs";
2
+ import constant from "../constant.mjs";
3
+ import { x, y } from "../point.mjs";
4
+ import path from "../../../d3-path/src/path.mjs";
5
+ function linkSource(d) {
6
+ return d.source;
7
+ }
8
+ function linkTarget(d) {
9
+ return d.target;
10
+ }
11
+ function link(curve) {
12
+ var source = linkSource, target = linkTarget, x$1 = x, y$1 = y, context = null;
13
+ function link2() {
14
+ var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
15
+ if (!context) context = buffer = path();
16
+ curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv));
17
+ if (buffer) return context = null, buffer + "" || null;
18
+ }
19
+ link2.source = function(_) {
20
+ return arguments.length ? (source = _, link2) : source;
21
+ };
22
+ link2.target = function(_) {
23
+ return arguments.length ? (target = _, link2) : target;
24
+ };
25
+ link2.x = function(_) {
26
+ return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link2) : x$1;
27
+ };
28
+ link2.y = function(_) {
29
+ return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link2) : y$1;
30
+ };
31
+ link2.context = function(_) {
32
+ return arguments.length ? (context = _ == null ? null : _, link2) : context;
33
+ };
34
+ return link2;
35
+ }
36
+ function curveHorizontal(context, x0, y0, x1, y1) {
37
+ context.moveTo(x0, y0);
38
+ context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
39
+ }
40
+ function linkHorizontal() {
41
+ return link(curveHorizontal);
42
+ }
43
+ export {
44
+ linkHorizontal
45
+ };
@@ -0,0 +1,10 @@
1
+ function x(p) {
2
+ return p[0];
3
+ }
4
+ function y(p) {
5
+ return p[1];
6
+ }
7
+ export {
8
+ x,
9
+ y
10
+ };
@@ -1,4 +1,4 @@
1
- import { linkHorizontal } from "../../d3-shape/src/link/index.mjs";
1
+ import { linkHorizontal } from "../node_modules/d3-shape/src/link/index.mjs";
2
2
  function horizontalSource(d) {
3
3
  return [d.source.x1, d.y0];
4
4
  }
@@ -1,7 +1,7 @@
1
1
  import { ref, watch, getCurrentInstance, createVNode, mergeProps } from "vue";
2
2
  import { mountComponent, usePopupState } from "../utils/mount-component.mjs";
3
3
  import stdin_default from "./Toast.mjs";
4
- import { extend, inBrowser, isObject } from "../utils/basic.mjs";
4
+ import { inBrowser, extend, isObject } from "../utils/basic.mjs";
5
5
  const defaultOptions = {
6
6
  icon: "",
7
7
  type: "text",
@@ -0,0 +1,4 @@
1
+ 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=";
2
+ export {
3
+ ai2Icon as default
4
+ };
@@ -2,17 +2,25 @@
2
2
  /* empty css */
3
3
  /* empty css */
4
4
  /* empty css */
5
- import { getCurrentInstance, ref, onMounted, createElementBlock, openBlock, createVNode, withCtx, createElementVNode, unref } from "vue";
5
+ import { getCurrentInstance, ref, onMounted, onBeforeUnmount, createElementBlock, openBlock, createVNode, withCtx, createElementVNode, normalizeClass, unref } from "vue";
6
6
  import { MobileChatInput } from "../ChatInput/index.mjs";
7
7
  import { MobileChatPanel } from "../ChatPanel/index.mjs";
8
8
  import { useChat } from "../../../composables/useAI/useChat.mjs";
9
9
  import { useVoice } from "../../../composables/useAI/useVoice.mjs";
10
10
  import { getAdapter } from "../../../composables/useAI/adapters/index.mjs";
11
- import { PlatformType } from "../../../composables/useAI/adapters/detector.mjs";
12
11
  /* empty css */
13
12
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.mjs";
14
13
  import { NavBar } from "../../../../../../node_modules/vant/es/nav-bar/index.mjs";
14
+ import { showToast } from "../../../../../../node_modules/vant/es/toast/function-call.mjs";
15
15
  const _hoisted_1 = { class: "mobile-chat-view" };
16
+ const _hoisted_2 = {
17
+ key: 0,
18
+ class: "iconfont icon-mobileyinliang1"
19
+ };
20
+ const _hoisted_3 = {
21
+ key: 1,
22
+ class: "iconfont icon-mobilejingyin"
23
+ };
16
24
  const _sfc_main = {
17
25
  __name: "AiChat",
18
26
  props: {
@@ -40,6 +48,46 @@ const _sfc_main = {
40
48
  const ctx = instance.proxy;
41
49
  const emit = __emit;
42
50
  const sessionId = ref("mobile_session_" + Date.now());
51
+ const autoRead = ref(true);
52
+ const speakingId = ref("");
53
+ let manualStopSeq = null;
54
+ function toggleAutoRead() {
55
+ autoRead.value = !autoRead.value;
56
+ showToast(autoRead.value ? "已开启自动朗读" : "已关闭自动朗读");
57
+ if (!autoRead.value) {
58
+ stopManualSpeak();
59
+ }
60
+ }
61
+ function stopManualSpeak() {
62
+ if (manualStopSeq) {
63
+ manualStopSeq();
64
+ manualStopSeq = null;
65
+ }
66
+ speakingId.value = "";
67
+ }
68
+ function onManualSpeak(msg) {
69
+ if (speakingId.value === msg.id) {
70
+ stopManualSpeak();
71
+ return;
72
+ }
73
+ stopManualSpeak();
74
+ const urls = Array.isArray(msg.speechUrls) && msg.speechUrls.length > 0 ? msg.speechUrls : [];
75
+ if (urls.length === 0) {
76
+ showToast("该消息无可朗读的语音");
77
+ return;
78
+ }
79
+ speakingId.value = msg.id;
80
+ manualStopSeq = playAudioSequence(
81
+ urls,
82
+ (a) => {
83
+ if (!a) {
84
+ speakingId.value = "";
85
+ manualStopSeq = null;
86
+ }
87
+ },
88
+ 300
89
+ );
90
+ }
43
91
  function extractReplyText(data) {
44
92
  if (typeof data === "string") return data;
45
93
  if (data && typeof data === "object") {
@@ -47,21 +95,74 @@ const _sfc_main = {
47
95
  }
48
96
  return String(data || "");
49
97
  }
98
+ function playAudioSequence(urls, onAudioChange, gap = 300) {
99
+ let idx = 0;
100
+ let advancing = false;
101
+ let pendingTimer = null;
102
+ let stopped = false;
103
+ let currentAudio = null;
104
+ const advance = () => {
105
+ if (advancing) return;
106
+ advancing = true;
107
+ idx++;
108
+ advancing = false;
109
+ pendingTimer = setTimeout(() => {
110
+ pendingTimer = null;
111
+ playNext();
112
+ }, gap);
113
+ };
114
+ const playNext = () => {
115
+ if (stopped || idx >= urls.length) {
116
+ onAudioChange == null ? void 0 : onAudioChange(null);
117
+ return;
118
+ }
119
+ const audio = new Audio(urls[idx]);
120
+ currentAudio = audio;
121
+ onAudioChange == null ? void 0 : onAudioChange(audio);
122
+ audio.addEventListener("ended", advance);
123
+ audio.addEventListener("error", advance);
124
+ audio.play().catch(advance);
125
+ };
126
+ playNext();
127
+ return () => {
128
+ stopped = true;
129
+ if (pendingTimer) {
130
+ clearTimeout(pendingTimer);
131
+ pendingTimer = null;
132
+ }
133
+ if (currentAudio) {
134
+ currentAudio.pause();
135
+ currentAudio = null;
136
+ }
137
+ };
138
+ }
50
139
  function initAdapter() {
51
- const adapter = getAdapter();
140
+ const adapter = getAdapter({ sessionId: sessionId.value, ctx });
52
141
  const http = ctx.$http;
53
142
  const sid = sessionId.value;
54
143
  adapter.createStreamRequest = (options) => {
55
144
  const { body, onMessage, onComplete, onError } = options;
56
145
  let aborted = false;
146
+ let currentAudio = null;
147
+ let stopAudioSeq = null;
57
148
  http.postForm(
58
149
  "ai-server/aiAsst/mobileQuery",
59
- { sessionId: sid, message: body.prompt },
150
+ { sessionId: sid, message: body.prompt, isRead: autoRead.value },
60
151
  false
61
152
  ).then((data) => {
62
153
  if (aborted) return;
63
- const replyText = extractReplyText(data);
154
+ const replyText = data && typeof data === "object" && typeof data.message === "string" ? data.message : extractReplyText(data);
155
+ const speechUrls = data && data.speech && Array.isArray(data.speech.urls) ? data.speech.urls.filter(Boolean) : [];
156
+ const lastMsg = messages.value[messages.value.length - 1];
157
+ if (lastMsg && lastMsg.role === "assistant" && speechUrls.length > 0) {
158
+ lastMsg.speechUrls = speechUrls;
159
+ }
64
160
  let i = 0;
161
+ if (autoRead.value && speechUrls.length > 0) {
162
+ stopAudioSeq = playAudioSequence(speechUrls, (a) => {
163
+ currentAudio = a;
164
+ });
165
+ }
65
166
  const timer = setInterval(() => {
66
167
  if (aborted) {
67
168
  clearInterval(timer);
@@ -73,13 +174,21 @@ const _sfc_main = {
73
174
  clearInterval(timer);
74
175
  onComplete();
75
176
  }
76
- }, 30);
177
+ }, 20);
77
178
  }).catch((err) => {
78
179
  if (!aborted) onError(err || new Error("请求失败"));
79
180
  });
80
181
  return {
81
182
  abort: () => {
82
183
  aborted = true;
184
+ if (stopAudioSeq) {
185
+ stopAudioSeq();
186
+ stopAudioSeq = null;
187
+ }
188
+ if (currentAudio) {
189
+ currentAudio.pause();
190
+ currentAudio = null;
191
+ }
83
192
  }
84
193
  };
85
194
  };
@@ -113,22 +222,15 @@ const _sfc_main = {
113
222
  } = useVoice({
114
223
  maxDuration: props.maxVoiceDuration,
115
224
  onResult: async (result) => {
116
- const platform = window.__fecPlatform || "";
117
- if (!platform || platform === PlatformType.WEB) {
118
- messages.value.push({
119
- id: "voice-tip-" + Date.now(),
120
- role: "assistant",
121
- type: "text",
122
- content: result.transcript || "抱歉,当前环境不支持语音功能",
123
- status: "done",
124
- timestamp: Date.now()
125
- });
225
+ const transcript = (result.transcript || "").trim();
226
+ if (!transcript) {
227
+ showToast("语音识别失败,请重试");
126
228
  return;
127
229
  }
128
230
  await sendVoice({
129
231
  audioBlob: result.audioBlob,
130
232
  duration: result.duration,
131
- transcript: result.transcript,
233
+ transcript,
132
234
  audioUrl: null,
133
235
  serverId: null
134
236
  });
@@ -168,13 +270,26 @@ const _sfc_main = {
168
270
  initAdapter();
169
271
  if (props.historyMessages && props.historyMessages.length > 0) {
170
272
  loadHistory(props.historyMessages);
273
+ } else if (messages.value.length === 0) {
274
+ messages.value.push({
275
+ id: "welcome-" + Date.now(),
276
+ role: "assistant",
277
+ type: "text",
278
+ content: "你好!我是语音助手,有什么可以帮你的吗?",
279
+ status: "done",
280
+ timestamp: Date.now(),
281
+ isWelcome: true
282
+ });
171
283
  }
172
284
  });
285
+ onBeforeUnmount(() => {
286
+ stopManualSpeak();
287
+ });
173
288
  return (_ctx, _cache) => {
174
289
  const _component_van_nav_bar = NavBar;
175
290
  return openBlock(), createElementBlock("div", _hoisted_1, [
176
291
  createVNode(_component_van_nav_bar, {
177
- title: "智能助手",
292
+ title: "语音助手",
178
293
  "left-text": "收起",
179
294
  "left-arrow": "",
180
295
  fixed: "",
@@ -185,16 +300,24 @@ const _sfc_main = {
185
300
  createElementVNode("span", {
186
301
  class: "nav-right-btn",
187
302
  onClick: handleNewChat
188
- }, "新对话")
303
+ }, "新对话"),
304
+ createElementVNode("span", {
305
+ class: normalizeClass(["nav-right-btn nav-read-btn", autoRead.value ? "is-active" : "is-muted"]),
306
+ onClick: toggleAutoRead
307
+ }, [
308
+ autoRead.value ? (openBlock(), createElementBlock("i", _hoisted_2)) : (openBlock(), createElementBlock("i", _hoisted_3))
309
+ ], 2)
189
310
  ]),
190
311
  _: 1
191
312
  }),
192
313
  createVNode(unref(MobileChatPanel), {
193
314
  messages: unref(messages),
194
315
  emptyText: __props.emptyText,
316
+ speakingId: speakingId.value,
195
317
  onRetry: unref(retry),
196
- onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event))
197
- }, null, 8, ["messages", "emptyText", "onRetry"]),
318
+ onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event)),
319
+ onSpeak: onManualSpeak
320
+ }, null, 8, ["messages", "emptyText", "speakingId", "onRetry"]),
198
321
  createVNode(unref(MobileChatInput), {
199
322
  disabled: false,
200
323
  isStreaming: unref(isStreaming),
@@ -212,7 +335,7 @@ const _sfc_main = {
212
335
  };
213
336
  }
214
337
  };
215
- const _AiChat = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-80fc6732"]]);
338
+ const _AiChat = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0599028a"]]);
216
339
  export {
217
340
  _AiChat as default
218
341
  };
@@ -56,7 +56,7 @@ const _sfc_main = {
56
56
  const emit = __emit;
57
57
  const inputRef = ref(null);
58
58
  const inputText = ref("");
59
- const isVoiceMode = ref(false);
59
+ const isVoiceMode = ref(true);
60
60
  const { isCancelling, onVoiceStart } = useVoiceTouch({
61
61
  emit,
62
62
  voiceStatus: computed(() => props.voiceStatus),
@@ -87,14 +87,12 @@ const _sfc_main = {
87
87
  }
88
88
  }
89
89
  function onSend() {
90
+ var _a;
90
91
  const text = inputText.value.trim();
91
92
  if (!text || props.disabled || props.isStreaming) return;
92
93
  emit("send", text);
93
94
  inputText.value = "";
94
- nextTick(() => {
95
- var _a;
96
- return (_a = inputRef.value) == null ? void 0 : _a.focus();
97
- });
95
+ (_a = inputRef.value) == null ? void 0 : _a.blur();
98
96
  }
99
97
  function onStopStream() {
100
98
  emit("stop");
@@ -205,7 +203,7 @@ const _sfc_main = {
205
203
  };
206
204
  }
207
205
  };
208
- const _ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-bc3d78f6"]]);
206
+ const _ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-05501c87"]]);
209
207
  export {
210
208
  _ChatInput as default
211
209
  };