ibiz-template-plugin.es.js 13.0 KB
Newer Older
lxm1993's avatar
lxm1993 committed
1 2
var R = Object.defineProperty;
var N = (s, n, e) => n in s ? R(s, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[n] = e;
lxm1993's avatar
lxm1993 committed
3 4
var y = (s, n, e) => (N(s, typeof n != "symbol" ? n + "" : n, e), e);
import { ListPortletController as D, AppMenuPortletController as E } from "@ibiz-template/controller";
5
import { ListPortletModel as z, AppMenuPortletModel as U } from "@ibiz-template/model";
lxm1993's avatar
lxm1993 committed
6
import { useNamespace as k, useListController as O } from "@ibiz-template/vue-util";
lxm1993's avatar
lxm1993 committed
7
import { defineComponent as L, ref as f, getCurrentInstance as C, onMounted as x, h as t, watch as j, onUnmounted as B } from "vue";
lxm1993's avatar
lxm1993 committed
8
import { Tooltip as P, Button as A, Icon as F } from "view-design";
9
import { PluginStaticResource as G, AppFuncCommand as J } from "@ibiz-template/runtime";
lxm1993's avatar
lxm1993 committed
10
import { CounterService as H } from "@ibiz-template/service";
11
const d = new G(import.meta.url), K = L({
lxm1993's avatar
lxm1993 committed
12
  name: "AppPortalListPortlet",
chitanda's avatar
chitanda committed
13
  props: {
lxm1993's avatar
lxm1993 committed
14 15
    modelData: {
      type: z,
chitanda's avatar
chitanda committed
16 17
      required: !0
    },
lxm1993's avatar
lxm1993 committed
18 19
    controller: {
      type: D,
chitanda's avatar
chitanda committed
20 21 22
      required: !0
    }
  },
lxm1993's avatar
lxm1993 committed
23
  setup(s) {
lxm1993's avatar
lxm1993 committed
24
    const n = k("app-portal-list-portlet"), e = f([]), p = Array.from({
lxm1993's avatar
lxm1993 committed
25
      length: 3
26
    }).map((c, i) => d.dir(`/assets/img/app-portal-list-${i}.svg`)), l = C();
lxm1993's avatar
lxm1993 committed
27 28
    if (l && s.modelData.list) {
      const c = O(l.proxy, s.modelData.list, s.controller.context);
lxm1993's avatar
lxm1993 committed
29
      x(() => {
lxm1993's avatar
lxm1993 committed
30 31 32 33
        c.nerve.self.evt.on("mounted", async () => {
          const i = await c.load();
          e.value = i.slice(0, 3);
        });
chitanda's avatar
chitanda committed
34
      });
lxm1993's avatar
lxm1993 committed
35
    }
chitanda's avatar
chitanda committed
36
    return {
lxm1993's avatar
lxm1993 committed
37 38 39 40 41 42
      ns: n,
      appPortalList: e,
      appPortalImgList: p,
      openPage: (c) => {
        c && window.open(c);
      }
chitanda's avatar
chitanda committed
43 44 45
    };
  },
  render() {
lxm1993's avatar
lxm1993 committed
46 47 48 49 50
    return t("div", {
      class: this.ns.b()
    }, [this.appPortalList.map((s, n) => t("div", {
      class: [this.ns.b("item"), s.url ? "" : this.ns.bm("item", "disabled")],
      key: s.srfkey,
chitanda's avatar
chitanda committed
51
      on: {
lxm1993's avatar
lxm1993 committed
52
        click: () => this.openPage(s.url)
chitanda's avatar
chitanda committed
53
      }
lxm1993's avatar
lxm1993 committed
54
    }, [t(P, {
lxm1993's avatar
lxm1993 committed
55 56 57 58 59 60 61 62 63 64 65 66 67
      attrs: {
        content: s.tip,
        disabled: !s.tip
      }
    }, [t("div", {
      class: this.ns.be("item", "text")
    }, [s.srfmajortext])]), t("div", {
      class: this.ns.be("item", "icon")
    }, [t("img", {
      attrs: {
        src: this.appPortalImgList[n]
      }
    })])]))]);
chitanda's avatar
chitanda committed
68 69
  }
});
lxm1993's avatar
lxm1993 committed
70
class Q {
lxm1993's avatar
lxm1993 committed
71
  constructor() {
lxm1993's avatar
lxm1993 committed
72
    y(this, "component", K);
lxm1993's avatar
lxm1993 committed
73
  }
lxm1993's avatar
lxm1993 committed
74 75 76 77 78 79 80
  async createController(n, e, p) {
    const l = new D(
      n,
      e,
      p
    );
    return await l.init(), l;
lxm1993's avatar
lxm1993 committed
81 82
  }
}
lxm1993's avatar
lxm1993 committed
83 84
const T = L({
  name: "FuncDrawer",
chitanda's avatar
chitanda committed
85
  props: {
lxm1993's avatar
lxm1993 committed
86 87 88 89
    isShowDrawer: {
      type: Boolean,
      required: !0,
      default: !1
chitanda's avatar
chitanda committed
90 91
    }
  },
lxm1993's avatar
lxm1993 committed
92 93
  emits: {
    "on-close": () => !0
94
  },
lxm1993's avatar
lxm1993 committed
95 96 97
  setup(s, {
    emit: n
  }) {
lxm1993's avatar
lxm1993 committed
98
    var M;
99
    const e = k("func-drawer"), p = d.dir("/assets/img/placeholder.svg"), l = "未分类", h = f([]), c = f([]), i = f(!1), m = (M = C()) == null ? void 0 : M.proxy, b = () => {
lxm1993's avatar
lxm1993 committed
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
      ibiz.net.post("/appfuncs/fetchpersonfuncsetting", {
        page: 0,
        size: 1e3,
        sort: "showorder,asc"
      }).then((o) => {
        if (o.ok && o.data && o.data.length) {
          const r = {};
          c.value = o.data.filter((a) => {
            if (a.ispersonal || (a.ispersonal = 0), !a.pssystemappid)
              r[l] ? r[l].push(a) : r[l] = [a];
            else {
              const u = a.pssystemappname;
              r[u] ? r[u].push(a) : r[u] = [a];
            }
            return a.ispersonal;
lxm1993's avatar
lxm1993 committed
115
          }), h.value = Object.keys(r).map((a) => ({
lxm1993's avatar
lxm1993 committed
116 117 118 119 120
            name: a,
            items: r[a]
          }));
        }
      });
lxm1993's avatar
lxm1993 committed
121
    }, I = () => {
lxm1993's avatar
lxm1993 committed
122 123 124 125 126 127 128
      i.value && (c.value.forEach((o, r) => {
        o.showorder = r;
      }), ibiz.net.post("/appfuncs/setfuncsetting", {
        setting: JSON.stringify({
          list: c.value
        })
      }).then((o) => {
lxm1993's avatar
lxm1993 committed
129
        o.ok && (m == null || m.$Notice.success({
130 131
          title: "成功",
          desc: "保存成功"
lxm1993's avatar
lxm1993 committed
132 133 134
        }), b());
      })), i.value = !i.value;
    };
135
    j(() => s.isShowDrawer, (o) => {
lxm1993's avatar
lxm1993 committed
136 137
      o && b();
    });
138
    const g = (o) => {
lxm1993's avatar
lxm1993 committed
139 140 141
      o && ibiz.net.get(`/appfuncs/${o}/getfuncurl`).then((r) => {
        r.ok && r.data && r.data.url && window.open(r.data.url);
      });
lxm1993's avatar
lxm1993 committed
142
    }, v = (o, r) => {
lxm1993's avatar
lxm1993 committed
143 144 145 146 147 148 149 150
      var a;
      i.value && ((a = o.dataTransfer) == null || a.setData("originIndex", r.toString()));
    }, q = (o) => {
      o.preventDefault();
    }, _ = (o, r) => {
      if (o.preventDefault(), i.value && o.dataTransfer) {
        const a = Number(o.dataTransfer.getData("originIndex"));
        if (a !== r) {
lxm1993's avatar
lxm1993 committed
151 152
          const u = c.value[a], w = c.value[r];
          c.value.splice(a, 1, w), c.value.splice(r, 1, u);
lxm1993's avatar
lxm1993 committed
153 154
        }
      }
lxm1993's avatar
lxm1993 committed
155
    }, S = (o, r, a, u) => {
156
      if (o.stopPropagation(), r.ispersonal = +!r.ispersonal, u === "remove")
lxm1993's avatar
lxm1993 committed
157 158
        c.value.splice(a, 1);
      else if (u === "change") {
lxm1993's avatar
lxm1993 committed
159 160
        const w = c.value.findIndex(($) => $.pssysappfuncid === r.pssysappfuncid);
        w === -1 ? c.value.push(r) : c.value.splice(w, 1);
lxm1993's avatar
lxm1993 committed
161 162 163 164 165 166 167 168 169 170 171 172
      }
    };
    return () => t("div", {
      class: [e.b(), s.isShowDrawer ? e.m("show") : ""]
    }, [t("div", {
      class: e.b("content")
    }, [t("div", {
      class: e.b("group")
    }, [t("header", {
      class: e.b("group-header")
    }, [t("div", {
      class: e.b("group-header-left")
173
    }, ["常用应用"]), t("div", {
lxm1993's avatar
lxm1993 committed
174 175 176
      class: e.b("group-header-right")
    }, [t(A, {
      on: {
lxm1993's avatar
lxm1993 committed
177
        click: I
lxm1993's avatar
lxm1993 committed
178
      }
179
    }, [i.value ? "保存" : "配置"]), t(A, {
lxm1993's avatar
lxm1993 committed
180 181 182
      on: {
        click: () => n("on-close")
      }
183
    }, ["返回"])])]), t("main", {
lxm1993's avatar
lxm1993 committed
184 185 186 187 188
      class: e.b("group-content")
    }, [c.value.map((o, r) => t("div", {
      class: [e.b("group-item"), o.pssysappfuncid ? "" : e.bm("group-item", "disabled")],
      key: o.pssysappfuncid,
      on: {
189
        click: () => g(o.pssysappfuncid),
lxm1993's avatar
lxm1993 committed
190
        dragstart: (a) => v(a, r),
lxm1993's avatar
lxm1993 committed
191 192 193
        dragover: q,
        drop: (a) => _(a, r)
      },
chitanda's avatar
chitanda committed
194
      attrs: {
lxm1993's avatar
lxm1993 committed
195
        draggable: i.value
chitanda's avatar
chitanda committed
196
      }
lxm1993's avatar
lxm1993 committed
197 198 199
    }, [t("div", {
      class: [e.be("group-item", "checkbox"), e.bem("group-item", "checkbox", "remove"), i.value ? e.bem("group-item", "checkbox", "show") : ""],
      on: {
lxm1993's avatar
lxm1993 committed
200
        click: (a) => S(a, o, r, "remove")
lxm1993's avatar
lxm1993 committed
201 202 203 204 205 206 207 208 209 210
      }
    }, [t(F, {
      attrs: {
        type: "md-remove",
        size: 16
      }
    })]), t("div", {
      class: e.be("group-item", "icon")
    }, [t("img", {
      attrs: {
211
        src: o.icon ? d.dir(`/assets/img/${o.icon}`) : p,
lxm1993's avatar
lxm1993 committed
212 213
        draggable: !1
      }
lxm1993's avatar
lxm1993 committed
214
    })]), t(P, {
lxm1993's avatar
lxm1993 committed
215 216 217 218 219 220
      attrs: {
        content: o.tip,
        disabled: !o.tip
      }
    }, [t("div", {
      class: e.be("group-item", "text")
lxm1993's avatar
lxm1993 committed
221
    }, [o.pssysappfuncname])])]))])]), h.value.map((o, r) => t("div", {
lxm1993's avatar
lxm1993 committed
222 223 224 225 226 227 228 229 230 231
      class: e.b("group"),
      key: r
    }, [t("header", {
      class: e.b("group-header")
    }, [o.name]), t("main", {
      class: e.b("group-content")
    }, [o.items.map((a) => t("div", {
      class: [e.b("group-item"), a.pssysappfuncid ? "" : e.bm("group-item", "disabled")],
      key: a.pssysappfuncid,
      on: {
232
        click: () => g(a.pssysappfuncid)
lxm1993's avatar
lxm1993 committed
233 234 235 236
      }
    }, [t("div", {
      class: [e.be("group-item", "checkbox"), a.ispersonal ? e.bem("group-item", "checkbox", "selected") : "", i.value ? e.bem("group-item", "checkbox", "show") : ""],
      on: {
lxm1993's avatar
lxm1993 committed
237
        click: (u) => S(u, a, r, "change")
lxm1993's avatar
lxm1993 committed
238 239 240 241 242 243 244 245 246 247
      }
    }, [a.ispersonal ? t(F, {
      attrs: {
        type: "md-checkmark",
        size: 16
      }
    }) : null]), t("div", {
      class: e.be("group-item", "icon")
    }, [t("img", {
      attrs: {
248
        src: a.icon ? d.dir(`/assets/img/${a.icon}`) : p,
lxm1993's avatar
lxm1993 committed
249 250
        draggable: !1
      }
lxm1993's avatar
lxm1993 committed
251
    })]), t(P, {
lxm1993's avatar
lxm1993 committed
252 253 254 255 256 257 258
      attrs: {
        content: a.tip,
        disabled: !a.tip
      }
    }, [t("div", {
      class: e.be("group-item", "text")
    }, [a.pssysappfuncname])])]))])]))])]);
259
  }
lxm1993's avatar
lxm1993 committed
260
}), V = L({
lxm1993's avatar
lxm1993 committed
261 262 263 264
  name: "FuncPortalListPortlet",
  components: {
    FuncDrawer: T
  },
chitanda's avatar
chitanda committed
265
  props: {
lxm1993's avatar
lxm1993 committed
266 267
    modelData: {
      type: z,
chitanda's avatar
chitanda committed
268 269
      required: !0
    },
lxm1993's avatar
lxm1993 committed
270 271
    controller: {
      type: D,
chitanda's avatar
chitanda committed
272 273 274
      required: !0
    }
  },
lxm1993's avatar
lxm1993 committed
275
  setup(s) {
276
    const n = k("func-portal-list-portlet"), e = d.dir("/assets/img/quick-entry.svg"), p = d.dir("/assets/img/editor.svg"), l = d.dir("/assets/img/placeholder.svg"), h = f([]), c = C();
lxm1993's avatar
lxm1993 committed
277
    let i = null;
lxm1993's avatar
lxm1993 committed
278
    c && s.modelData.list && (i = O(c.proxy, s.modelData.list, s.controller.context), x(() => {
lxm1993's avatar
lxm1993 committed
279 280
      i == null || i.nerve.self.evt.on("mounted", async () => {
        if (i) {
281 282
          const g = await i.load();
          h.value = g;
lxm1993's avatar
lxm1993 committed
283
        }
chitanda's avatar
chitanda committed
284
      });
lxm1993's avatar
lxm1993 committed
285
    }));
286 287
    const m = (g) => {
      g && ibiz.net.get(`/appfuncs/${g}/getfuncurl`).then((v) => {
lxm1993's avatar
lxm1993 committed
288
        v.ok && v.data && v.data.url && window.open(v.data.url);
lxm1993's avatar
lxm1993 committed
289
      });
lxm1993's avatar
lxm1993 committed
290
    }, b = f(!1);
chitanda's avatar
chitanda committed
291
    return {
lxm1993's avatar
lxm1993 committed
292 293 294 295
      ns: n,
      quickEntryImg: e,
      editorImg: p,
      placeholderImg: l,
lxm1993's avatar
lxm1993 committed
296 297
      funcPortalList: h,
      openPage: m,
lxm1993's avatar
lxm1993 committed
298 299 300
      isShowDrawer: b,
      isShowDrawerChange: async () => {
        if (b.value = !1, i) {
301 302
          const g = await i.load();
          h.value = g;
lxm1993's avatar
lxm1993 committed
303 304
        }
      }
chitanda's avatar
chitanda committed
305 306 307
    };
  },
  render() {
lxm1993's avatar
lxm1993 committed
308
    return t("div", {
chitanda's avatar
chitanda committed
309
      class: this.ns.b()
lxm1993's avatar
lxm1993 committed
310 311 312 313 314 315 316
    }, [t("header", {
      class: this.ns.b("header")
    }, [t("div", {
      class: this.ns.b("header-left")
    }, [t("div", {
      class: this.ns.be("header-left", "icon")
    }, [t("img", {
chitanda's avatar
chitanda committed
317
      attrs: {
lxm1993's avatar
lxm1993 committed
318 319 320 321
        src: this.quickEntryImg
      }
    })]), t("div", {
      class: this.ns.be("header-left", "text")
322
    }, ["快速入口"])]), t("div", {
lxm1993's avatar
lxm1993 committed
323 324 325 326
      class: this.ns.b("header-right"),
      on: {
        click: () => {
          this.isShowDrawer = !0;
327
        }
chitanda's avatar
chitanda committed
328
      }
lxm1993's avatar
lxm1993 committed
329 330 331
    }, [t("div", {
      class: this.ns.be("header-right", "icon")
    }, [t("img", {
chitanda's avatar
chitanda committed
332
      attrs: {
lxm1993's avatar
lxm1993 committed
333 334 335 336
        src: this.editorImg
      }
    })]), t("div", {
      class: this.ns.be("header-right", "text")
337
    }, ["更多"])])]), t("div", {
lxm1993's avatar
lxm1993 committed
338 339 340 341 342 343
      class: this.ns.e("divider")
    }), t("main", {
      class: this.ns.b("content")
    }, [this.funcPortalList.map((s) => t("div", {
      class: [this.ns.b("item"), s.pssysappfuncid ? "" : this.ns.bm("item", "disabled")],
      key: s.pssysappfuncid,
chitanda's avatar
chitanda committed
344
      on: {
lxm1993's avatar
lxm1993 committed
345
        click: () => this.openPage(s.pssysappfuncid)
chitanda's avatar
chitanda committed
346
      }
lxm1993's avatar
lxm1993 committed
347 348 349
    }, [t("div", {
      class: this.ns.be("item", "icon")
    }, [t("img", {
350
      attrs: {
351
        src: s.icon ? d.dir(`/assets/img/${s.icon}`) : this.placeholderImg
352
      }
lxm1993's avatar
lxm1993 committed
353
    })]), t(P, {
lxm1993's avatar
lxm1993 committed
354 355 356 357 358 359 360 361 362 363 364 365 366 367
      attrs: {
        content: s.tip,
        disabled: !s.tip
      }
    }, [t("div", {
      class: this.ns.be("item", "text")
    }, [s.pssysappfuncname])])]))]), t(T, {
      attrs: {
        isShowDrawer: this.isShowDrawer
      },
      on: {
        "on-close": this.isShowDrawerChange
      }
    })]);
chitanda's avatar
chitanda committed
368 369
  }
});
lxm1993's avatar
lxm1993 committed
370
class W {
lxm1993's avatar
lxm1993 committed
371
  constructor() {
lxm1993's avatar
lxm1993 committed
372
    y(this, "component", V);
lxm1993's avatar
lxm1993 committed
373 374 375 376 377 378 379 380
  }
  async createController(n, e, p) {
    const l = new D(
      n,
      e,
      p
    );
    return await l.init(), l;
lxm1993's avatar
lxm1993 committed
381 382
  }
}
lxm1993's avatar
lxm1993 committed
383
const X = L({
lxm1993's avatar
lxm1993 committed
384
  name: "TodoAppMenuPortlet",
chitanda's avatar
chitanda committed
385
  props: {
lxm1993's avatar
lxm1993 committed
386
    modelData: {
387
      type: U,
chitanda's avatar
chitanda committed
388
      required: !0
389
    },
lxm1993's avatar
lxm1993 committed
390 391 392
    controller: {
      type: E,
      required: !0
chitanda's avatar
chitanda committed
393 394
    }
  },
lxm1993's avatar
lxm1993 committed
395 396 397
  setup(s) {
    const n = k("todo-app-menu-portlet"), e = Array.from({
      length: 5
398
    }).map((c, i) => d.dir(`/assets/img/todo-app-menu-${i}.svg`));
lxm1993's avatar
lxm1993 committed
399
    let p = null;
lxm1993's avatar
lxm1993 committed
400
    const l = f({});
lxm1993's avatar
lxm1993 committed
401 402
    if (s.modelData.appMenu) {
      const i = s.modelData.appMenu.source.getPSAppCounterRef();
lxm1993's avatar
lxm1993 committed
403
      i && (x(async () => {
lxm1993's avatar
lxm1993 committed
404
        p = await H.getCounterByRef(i), p.onChange((m) => {
lxm1993's avatar
lxm1993 committed
405
          l.value = m;
lxm1993's avatar
lxm1993 committed
406
        });
407
      }), B(() => {
lxm1993's avatar
lxm1993 committed
408 409 410
        p == null || p.destroy();
      }));
    }
chitanda's avatar
chitanda committed
411
    return {
lxm1993's avatar
lxm1993 committed
412 413 414 415 416 417
      ns: n,
      todoImgList: e,
      counter: p,
      counterData: l,
      onClickMenuItem: async (c) => {
        const i = c.source.getPSAppFunc();
lxm1993's avatar
lxm1993 committed
418
        i && await ibiz.commands.execute(J.TAG, i, s.controller.context, s.controller.params);
lxm1993's avatar
lxm1993 committed
419
      }
chitanda's avatar
chitanda committed
420 421
    };
  },
lxm1993's avatar
lxm1993 committed
422 423 424 425 426 427 428
  render() {
    var s;
    return t("div", {
      class: this.ns.b()
    }, [(s = this.modelData.appMenu) == null ? void 0 : s.items.map((n, e) => t("div", {
      class: [this.ns.b("item"), n.source.getPSAppFunc() ? "" : this.ns.bm("item", "disabled")],
      key: n.id,
chitanda's avatar
chitanda committed
429
      on: {
lxm1993's avatar
lxm1993 committed
430
        click: () => this.onClickMenuItem(n)
chitanda's avatar
chitanda committed
431
      }
lxm1993's avatar
lxm1993 committed
432 433 434 435 436
    }, [t("div", {
      class: this.ns.b("item-left")
    }, [t("div", {
      class: this.ns.be("item-left", "icon")
    }, [t("img", {
chitanda's avatar
chitanda committed
437
      attrs: {
lxm1993's avatar
lxm1993 committed
438
        src: this.todoImgList[e]
chitanda's avatar
chitanda committed
439
      }
lxm1993's avatar
lxm1993 committed
440 441 442 443 444 445
    })])]), t("div", {
      class: this.ns.b("item-right")
    }, [t("div", {
      class: this.ns.be("item-right", "count")
    }, [t("span", {
      class: [(this.counterData[n.counterId] || 0) > 99 ? this.ns.be("item-right", "add") : ""]
446
    }, [(this.counterData[n.counterId] || 0) > 99 ? 99 : this.counterData[n.counterId] || 0]), t("span", ["件"])]), t(P, {
chitanda's avatar
chitanda committed
447
      attrs: {
lxm1993's avatar
lxm1993 committed
448 449
        content: n.source.tooltip,
        disabled: !n.source.tooltip
chitanda's avatar
chitanda committed
450
      }
lxm1993's avatar
lxm1993 committed
451 452 453
    }, [t("div", {
      class: this.ns.be("item-right", "text")
    }, [n.label])])])]))]);
chitanda's avatar
chitanda committed
454 455
  }
});
lxm1993's avatar
lxm1993 committed
456
class Y {
457
  constructor() {
lxm1993's avatar
lxm1993 committed
458
    y(this, "component", X);
lxm1993's avatar
lxm1993 committed
459 460 461 462 463 464 465 466
  }
  async createController(n, e, p) {
    const l = new E(
      n,
      e,
      p
    );
    return await l.init(), l;
467 468
  }
}
lxm1993's avatar
lxm1993 committed
469
const it = {
chitanda's avatar
chitanda committed
470
  mateUrl: import.meta.url,
lxm1993's avatar
lxm1993 committed
471
  install(s) {
472
    d.loadStyle(["/style.css"]), ibiz.register.portletPart.register(
lxm1993's avatar
lxm1993 committed
473
      "PORTLET_CUSTOM_AppPortalList",
lxm1993's avatar
lxm1993 committed
474
      new Q()
lxm1993's avatar
lxm1993 committed
475 476
    ), ibiz.register.portletPart.register(
      "PORTLET_CUSTOM_FuncPortalList",
lxm1993's avatar
lxm1993 committed
477
      new W()
lxm1993's avatar
lxm1993 committed
478 479
    ), ibiz.register.portletPart.register(
      "PORTLET_CUSTOM_TodoAppMenu",
lxm1993's avatar
lxm1993 committed
480
      new Y()
481 482 483 484
    );
  }
};
export {
lxm1993's avatar
lxm1993 committed
485
  it as default
486
};