@things-factory/ai-dashboard 10.1.213 → 10.1.215

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 (73) hide show
  1. package/client/components/card-dialogs.ts +24 -1
  2. package/client/components/dashboard-card.ts +24 -70
  3. package/client/index.ts +2 -0
  4. package/client/pages/my-dashboard-page.ts +6 -5
  5. package/client/utils/card-api.ts +3 -2
  6. package/client/utils/card-words.ts +11 -0
  7. package/client/utils/examples.ts +15 -0
  8. package/dist-client/components/card-dialogs.js +22 -1
  9. package/dist-client/components/card-dialogs.js.map +1 -1
  10. package/dist-client/components/dashboard-card.d.ts +6 -5
  11. package/dist-client/components/dashboard-card.js +23 -73
  12. package/dist-client/components/dashboard-card.js.map +1 -1
  13. package/dist-client/index.d.ts +1 -0
  14. package/dist-client/index.js +2 -0
  15. package/dist-client/index.js.map +1 -1
  16. package/dist-client/pages/my-dashboard-page.js +6 -5
  17. package/dist-client/pages/my-dashboard-page.js.map +1 -1
  18. package/dist-client/tsconfig.tsbuildinfo +1 -1
  19. package/dist-client/utils/card-api.d.ts +6 -1
  20. package/dist-client/utils/card-api.js +1 -1
  21. package/dist-client/utils/card-api.js.map +1 -1
  22. package/dist-client/utils/card-words.d.ts +14 -0
  23. package/dist-client/utils/card-words.js +9 -0
  24. package/dist-client/utils/card-words.js.map +1 -1
  25. package/dist-client/utils/examples.d.ts +3 -0
  26. package/dist-client/utils/examples.js +14 -0
  27. package/dist-client/utils/examples.js.map +1 -0
  28. package/dist-server/service/card/card-access.d.ts +8 -2
  29. package/dist-server/service/card/card-access.js +9 -3
  30. package/dist-server/service/card/card-access.js.map +1 -1
  31. package/dist-server/service/card/card-definition.d.ts +42 -6
  32. package/dist-server/service/card/card-definition.js +172 -18
  33. package/dist-server/service/card/card-definition.js.map +1 -1
  34. package/dist-server/service/card/card-names.d.ts +5 -0
  35. package/dist-server/service/card/card-names.js +6 -1
  36. package/dist-server/service/card/card-names.js.map +1 -1
  37. package/dist-server/service/card/card-proposal.d.ts +6 -0
  38. package/dist-server/service/card/card-proposal.js +9 -0
  39. package/dist-server/service/card/card-proposal.js.map +1 -1
  40. package/dist-server/service/card/card-resolver.js +24 -5
  41. package/dist-server/service/card/card-resolver.js.map +1 -1
  42. package/dist-server/service/card/card-run.js +5 -1
  43. package/dist-server/service/card/card-run.js.map +1 -1
  44. package/dist-server/service/card/card-tool.d.ts +66 -8
  45. package/dist-server/service/card/card-tool.js +88 -17
  46. package/dist-server/service/card/card-tool.js.map +1 -1
  47. package/dist-server/service/card/card-types.d.ts +1 -0
  48. package/dist-server/service/card/card-types.js +8 -4
  49. package/dist-server/service/card/card-types.js.map +1 -1
  50. package/dist-server/service/card/dashboard-card.d.ts +2 -0
  51. package/dist-server/service/card/dashboard-card.js +5 -3
  52. package/dist-server/service/card/dashboard-card.js.map +1 -1
  53. package/dist-server/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +5 -5
  55. package/server/service/card/card-access.test.ts +62 -7
  56. package/server/service/card/card-access.ts +12 -5
  57. package/server/service/card/card-definition.ts +182 -18
  58. package/server/service/card/card-intent.test.ts +250 -0
  59. package/server/service/card/card-names.ts +5 -0
  60. package/server/service/card/card-proposal.ts +10 -1
  61. package/server/service/card/card-resolver.ts +26 -8
  62. package/server/service/card/card-run.ts +5 -1
  63. package/server/service/card/card-tool.ts +91 -20
  64. package/server/service/card/card-types.ts +7 -4
  65. package/server/service/card/dashboard-card.ts +5 -3
  66. package/test/card-menu.test.ts +34 -0
  67. package/test/translations.test.ts +1 -1
  68. package/translations/en.json +3 -3
  69. package/translations/es.json +3 -3
  70. package/translations/ja.json +3 -3
  71. package/translations/ko.json +3 -3
  72. package/translations/ms.json +3 -3
  73. package/translations/zh.json +3 -3
@@ -36,6 +36,17 @@ function refuse(context, code, fallback, options = {}) {
36
36
  throw error;
37
37
  }
38
38
  /** The viewer of a request, with the departments they belong to for sharing - asked once per request. */
39
+ /**
40
+ * The roles of the domain - the ones it inherits from its parent included, as its privileges are (User.getPrivilegesByDomain);
41
+ * `holder` keeps those one person holds.
42
+ */
43
+ async function domainRoles(context, holder, tx) {
44
+ const qb = (0, shell_1.getRepository)(auth_base_1.Role, tx).createQueryBuilder('ROLE');
45
+ if (holder)
46
+ qb.innerJoin('ROLE.users', 'HOLDER', 'HOLDER.id = :holder', { holder });
47
+ (0, shell_1.applyDomainInheritanceFilter)(qb, 'ROLE', context.state.domain, shell_1.InheritedValueType.Include);
48
+ return await qb.orderBy('ROLE.name').getMany();
49
+ }
39
50
  async function viewerOf(context) {
40
51
  const state = context.state;
41
52
  if (state.__aiDashboardViewer)
@@ -52,8 +63,9 @@ async function viewerOf(context) {
52
63
  }
53
64
  const departmentIds = (0, card_access_js_1.departmentsOfEmployees)(records);
54
65
  const departments = departmentIds.map(id => ({ id, name: records.find(one => one?.department?.id === id)?.department?.name ?? id }));
66
+ const roleIds = state.user?.id ? (await domainRoles(context, state.user.id)).map(one => one.id) : [];
55
67
  const answer = {
56
- viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds },
68
+ viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds, roleIds },
57
69
  departmentsAvailable: records !== undefined,
58
70
  departments
59
71
  };
@@ -62,7 +74,11 @@ async function viewerOf(context) {
62
74
  }
63
75
  const sharesOf = async (cardIds, tx) => cardIds.length ? await (0, shell_1.getRepository)(dashboard_card_js_1.DashboardCardShare, tx).find({ where: { card: { id: (0, typeorm_1.In)(cardIds) } } }) : [];
64
76
  /** A card the viewer may use, and how - refused otherwise (decision 7). */
65
- async function usableCard(id, context, tx) {
77
+ async function usableCard(given, context, tx) {
78
+ /* A card's uuid or its key - anything else is no card, and is not handed to a database that refuses it as no uuid. */
79
+ const id = (0, card_proposal_js_1.cardIdOf)(given);
80
+ if (!id)
81
+ refuse(context, 'unknown-card', 'there is no such card.');
66
82
  const card = await (0, shell_1.getRepository)(dashboard_card_js_1.DashboardCard, tx).findOne({ where: { id, domain: { id: context.state.domain.id } } });
67
83
  if (!card)
68
84
  refuse(context, 'unknown-card', 'there is no such card.');
@@ -168,7 +184,8 @@ let DashboardCardResolver = class DashboardCardResolver {
168
184
  where: [
169
185
  { domain: { id: viewer.domainId }, scope: dashboard_card_js_1.DashboardCardShareScope.USER, targetId: viewer.userId },
170
186
  { domain: { id: viewer.domainId }, scope: dashboard_card_js_1.DashboardCardShareScope.DOMAIN, targetId: viewer.domainId },
171
- ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: dashboard_card_js_1.DashboardCardShareScope.DEPARTMENT, targetId: (0, typeorm_1.In)([...viewer.departmentIds]) }] : [])
187
+ ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: dashboard_card_js_1.DashboardCardShareScope.DEPARTMENT, targetId: (0, typeorm_1.In)([...viewer.departmentIds]) }] : []),
188
+ ...(viewer.roleIds?.length ? [{ domain: { id: viewer.domainId }, scope: dashboard_card_js_1.DashboardCardShareScope.ROLE, targetId: (0, typeorm_1.In)([...viewer.roleIds]) }] : [])
172
189
  ]
173
190
  });
174
191
  const ids = [...new Set(shares.map(one => one.cardId))];
@@ -193,7 +210,8 @@ let DashboardCardResolver = class DashboardCardResolver {
193
210
  domainName: domain.name ?? domain.subdomain ?? domain.id,
194
211
  departmentsAvailable,
195
212
  departments,
196
- peopleAvailable: await (0, ai_assistant_1.toolAccessFor)(context)('Query.employees')
213
+ peopleAvailable: await (0, ai_assistant_1.toolAccessFor)(context)('Query.employees'),
214
+ roles: (await domainRoles(context)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))
197
215
  };
198
216
  }
199
217
  async dashboardSharePeople(text, context) {
@@ -315,9 +333,10 @@ let DashboardCardResolver = class DashboardCardResolver {
315
333
  const { domain, user, tx } = context.state;
316
334
  const card = await ownCard(id, context, tx);
317
335
  const { departmentsAvailable } = await viewerOf(context);
336
+ const roleIds = (shares ?? []).some(one => one.scope === dashboard_card_js_1.DashboardCardShareScope.ROLE) ? (await domainRoles(context, undefined, tx)).map(one => one.id) : [];
318
337
  const wanted = new Map();
319
338
  for (const share of shares ?? []) {
320
- const refusal = (0, card_access_js_1.shareRefusal)(share, { domainId: domain.id, departmentsAvailable });
339
+ const refusal = (0, card_access_js_1.shareRefusal)(share, { domainId: domain.id, departmentsAvailable, roleIds });
321
340
  if (refusal)
322
341
  refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal });
323
342
  if (share.scope === dashboard_card_js_1.DashboardCardShareScope.USER && share.targetId === user.id)
@@ -1 +1 @@
1
- {"version":3,"file":"card-resolver.js","sourceRoot":"","sources":["../../../server/service/card/card-resolver.ts"],"names":[],"mappings":";;;AAgIA,kCAaC;;AA7ID;;;;;;;GAOG;AACH,+CAAkF;AAClF,qDAA6C;AAC7C,qCAAyC;AAEzC,iDAAqD;AACrD,yDAAgD;AAChD,+DAWqC;AAErC,qDAAuH;AACvH,6DAAmH;AAqZ1G,oGArZA,wCAAmB,OAqZA;AApZ5B,yDAAqD;AACrD,+CAA2D;AAC3D,2DAA0I;AAC1I,mDAA4L;AAE5L,MAAM,KAAK,GAAG,oFAAoF,CAAA;AAClG,MAAM,QAAQ,GAAG,uFAAuF,CAAA;AAExG,MAAM,SAAS,GAAG,CAAC,CAAA;AACnB,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,6EAA6E;AAC7E,SAAS,MAAM,CAAC,OAAwB,EAAE,IAAY,EAAE,QAAgB,EAAE,UAAmC,EAAE;IAC7G,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAChI,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IACrC,KAAK,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAA;IACnD,MAAM,KAAK,CAAA;AACb,CAAC;AAED,yGAAyG;AACzG,KAAK,UAAU,QAAQ,CAAC,OAAwB;IAC9C,MAAM,KAAK,GAAQ,OAAO,CAAC,KAAK,CAAA;IAChC,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,KAAK,CAAC,mBAAmB,CAAA;IAC/D,IAAI,OAA0B,CAAA;IAC9B,IAAI,CAAC;QACH,8FAA8F;QAC9F,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,OAAO,CAAC,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAA;QACxG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,SAAS,CAAA;IACrB,CAAC;IACD,MAAM,aAAa,GAAG,IAAA,uCAAsB,EAAC,OAAO,CAAC,CAAA;IACrD,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IACrI,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE;QAC7E,oBAAoB,EAAE,OAAO,KAAK,SAAS;QAC3C,WAAW;KACZ,CAAA;IACD,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAA;IAClC,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAiB,EAAE,EAAQ,EAAE,EAAE,CACrD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,OAAO,CAAC,EAAE,EAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAEzH,2EAA2E;AAC3E,KAAK,UAAU,UAAU,CAAC,EAAU,EAAE,OAAwB,EAAE,EAAQ;IACtE,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;IAC9H,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAA;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,IAAA,6BAAY,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACxE,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,mCAAmC,CAAC,CAAA;IACpF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,EAAU,EAAE,OAAwB,EAAE,EAAQ;IACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IAC1D,IAAI,MAAM,KAAK,OAAO;QAAE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,wEAAwE,CAAC,CAAA;IAClI,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAiB;IACtC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACjD,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,GAAG,EAAE,CAAA;IACjC,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC,EAAS,EAAE,CAAC,CAAA;IAC/E,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED,8GAA8G;AAC9G,KAAK,UAAU,OAAO,CAAC,KAAsB,EAAE,OAAwB;IACrE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QACzB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,sCAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChN,CAAC,CAAC,IAAI,GAAG,EAAU,CAAA;IACrB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,IAAA,6BAAY,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QACtB,OAAO;YACL;gBACE,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM;gBACN,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtI,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,uGAAuG;AAChG,KAAK,UAAU,WAAW,CAAC,UAA0B,EAAE,OAAwB;IACpF,OAAO,MAAM,IAAA,qBAAO,EAAC,UAAU,EAAE;QAC/B,YAAY,EAAZ,2BAAY;QACZ,YAAY,EAAZ,2BAAY;QACZ,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,IAAA,4BAAa,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC;QAChD,GAAG,EAAE,IAAA,0BAAW,EAAC,OAAO,CAAC;QACzB,KAAK,EAAE,IAAA,4BAAO,EAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC9C,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,CAAC,KAAK,UAAU;gBAAE,OAAO,QAAQ,CAAA;YAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC3B,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACvD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,UAAe,EAAE,OAAwB;IACzD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,6BAAQ,EAAC,UAAU,EAAE,MAAM,EAAE,2BAAY,EAAE,2BAAY,CAAC,CAAA;IAClF,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,4DAA4D,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACrI,MAAM,MAAM,GAAG,IAAA,oCAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,uDAAuD,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACzI,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,OAAwB,EAAE,EAAO;IACzE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IACtC,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAS,EAAE,CAAC,CAAA;IACvI,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAS,EAAE,CAAC,CAAA;IAC9I,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;AAChK,CAAC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAG1B,AAAN,KAAK,CAAC,WAAW,CAAQ,OAAwB;QAC/C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sCAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAS,EAAE,CAAC,CAAA;QACnK,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClK,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;QAChF,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnL,CAAC;IAIK,AAAN,KAAK,CAAC,cAAc,CAAuD,KAAa,EAAS,OAAwB;QACvH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC1C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAS,EAAE,CAAC,CAAA;YAC/K,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sCAAkB,CAAC,CAAC,IAAI,CAAC;YAC1D,KAAK,EAAE;gBACL,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,2CAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;gBACjG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,2CAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACrG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,2CAAuB,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAA,YAAE,EAAC,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3J;SACT,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAA,aAAG,EAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnN,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAIK,AAAN,KAAK,CAAC,gBAAgB,CAAY,EAAU,EAAS,OAAwB;QAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC9C,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,UAA4B,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAIK,AAAN,KAAK,CAAC,qBAAqB,CAAY,EAAU,EAAS,OAAwB;QAChF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,wCAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAS,EAAE,CAAC,CAAA;QAC/I,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QAC/D,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACrK,CAAC;IAIK,AAAN,KAAK,CAAC,qBAAqB,CAAQ,OAAwB;QACzD,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;QACrE,MAAM,MAAM,GAAQ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAA;QACxC,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE;YACxD,oBAAoB;YACpB,WAAW;YACX,eAAe,EAAE,MAAM,IAAA,4BAAa,EAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC;SACjE,CAAA;IACH,CAAC;IAIK,AAAN,KAAK,CAAC,oBAAoB,CAAc,IAAY,EAAS,OAAwB;QACnF,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACrB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,OAAO,CAAC,CACvC,mKAAmK,EACnK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CACvJ,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;YAAE,MAAM,CAAC,OAAO,EAAE,oBAAoB,EAAE,kCAAkC,CAAC,CAAA;QACpG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5E,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;IAMK,AAAN,KAAK,CAAC,4BAA4B,CAAmB,SAAiB,EAAsB,WAAmB,EAAS,OAAwB;QAC9I,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,0BAAW,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAS,CAAC,CAAA;QAC/G,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,sBAAsB,EAAE,gCAAgC,CAAC,CAAA;QACvF,MAAM,WAAW,GAAG,MAAM,IAAA,mCAAoB,EAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,IAAA,6BAAc,EAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC;YAAE,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAE,uCAAuC,CAAC,CAAA;QACrI,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,mCAAgB,EAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;QACtF,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,6CAA6C,CAAC,CAAA;QACjG,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7D,CAAC;IAQK,AAAN,KAAK,CAAC,yBAAyB,CAAmB,SAAiB,EAAsB,WAAmB,EAAS,OAAwB;QAC3I,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,0BAAW,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAS,CAAC,CAAA;QACnH,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,sBAAsB,EAAE,gCAAgC,CAAC,CAAA;QACvF,MAAM,IAAA,oCAAqB,EAAC;YAC1B,OAAO;YACP,MAAM,EAAE,IAAI,EAAE,EAAE;YAChB,aAAa,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAoB,EAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1E,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC,CAAC;SAClG,CAAC,CAAA;QAEF,0EAA0E;QAC1E,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAS,EAAE,CAAC,CAAA;QAChK,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACrD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACpD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;QACpF,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAA,mCAAgB,EAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;QAChH,IAAI,QAAQ;YAAE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,wCAAwC,CAAC,CAAA;QACrF,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,6CAA6C,CAAC,CAAA;QACjG,IAAI,UAAU;YAAE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,qEAAqE,CAAC,CAAA;QACpH,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAC9D,wFAAwF;QACxF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAQ,EAAC,UAAU,CAAC,MAAM,EAAE,2BAAY,EAAE,2BAAY,CAAC,CAAA;QAC1E,IAAI,CAAC,CAAC,MAAM,IAAA,4BAAa,EAAC,OAAO,CAAC,CAAC,IAAA,0BAAW,EAAC,MAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,4CAA4C,CAAC,CAAA;QACtJ,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAA;QAC5E,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAEtG,IAAI,IAAmB,CAAA;QACvB,IAAI,OAAe,CAAA;QACnB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,0FAA0F,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACvM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;YAC1B,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACxJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,CAAA;YACX,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QAC1L,CAAC;QACD,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACjO,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACpD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAA;IACxD,CAAC;IAKK,AAAN,KAAK,CAAC,mBAAmB,CAAY,EAAU,EAAe,IAAY,EAAS,OAAwB;QACzG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAChC,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACpG,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACrL,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzG,CAAC;IAKK,AAAN,KAAK,CAAC,2BAA2B,CAAY,EAAU,EAA+B,OAAe,EAAS,OAAwB;QACpI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAS,EAAE,CAAC,CAAA;QAC3H,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,CAAC,CAAA;QAC7E,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAC7B,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACzJ,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACrM,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzG,CAAC;IAKK,AAAN,KAAK,CAAC,iBAAiB,CAAY,EAAU,EAAS,OAAwB;QAC5E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QAC9O,MAAM,IAAA,qBAAa,EAAC,wCAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QAC5L,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACtC,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAKK,AAAN,KAAK,CAAC,mBAAmB,CAAY,EAAU,EAAS,OAAwB;QAC9E,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAC3C,KAAK,MAAM,MAAM,IAAI,CAAC,sCAAkB,EAAE,sCAAkB,EAAE,wCAAoB,CAAU,EAAE,CAAC;YAC7F,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;YAC9F,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAA,qBAAa,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACnE,CAAC;QACD,MAAM,IAAA,qBAAa,EAAC,iCAAa,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACvD,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,kBAAkB,CAAY,EAAU,EAAoD,MAAiC,EAAS,OAAwB;QAClK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAC3C,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAA;QACzD,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAA,6BAAY,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAA;YAClF,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,sCAAsC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3G,IAAI,KAAK,CAAC,KAAK,KAAK,2CAAuB,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE;gBAAE,SAAQ;YACxF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;QAClF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC/E,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC;gBAAE,SAAQ;YACzE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QAC1L,CAAC;QACD,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAKK,AAAN,KAAK,CAAC,kBAAkB,CAAgB,MAAc,EAAS,OAAwB;QACrF,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACtD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACpD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAClI,CAAC;IAKK,AAAN,KAAK,CAAC,oBAAoB,CAAY,EAAU,EAAS,OAAwB;QAC/E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;QAC7I,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,qCAAqC,CAAC,CAAA;QACnF,MAAM,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC7D,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,gBAAgB,CAA+C,MAA6B,EAAS,OAAwB;QACjI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAY,CAAA;QACjD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sCAAkB,EAAE,EAAE,CAAC,CAAA;QACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;QAC1G,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAA;YACnD,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,qCAAqC,CAAC,CAAA;YACnF,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;gBAAE,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,8CAA8C,CAAC,CAAA;YAC5L,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAA;QACzH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AAnQY,sDAAqB;AAG1B;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,kCAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,sFAAsF,EAAE,CAAC;IAC7H,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wDAMvB;AAIK;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,+FAA+F,EAAE,CAAC;IAClI,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAA;IAAiB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2DAgB/F;AAIK;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE,EAAE,WAAW,EAAE,mIAAmI,EAAE,CAAC;IAC5J,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAGnD;AAIK;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,wCAAwB,CAAC,EAAE,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;IACtF,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kEAKxD;AAIK;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,qCAAqB,EAAE,EAAE,WAAW,EAAE,iHAAiH,EAAE,CAAC;IAC/I,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kEAUjC;AAIK;IAFL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oCAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,+FAA+F,EAAE,CAAC;IAC/H,mBAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;IAAgB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;iEAW3D;AAMK;IAJL,IAAA,wBAAS,EAAC,KAAK,CAAC;IAChB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE;QAC7B,WAAW,EAAE,qIAAqI;KACnJ,CAAC;IACkC,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAAuB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yEAStH;AAQK;IANL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE;QAChC,WAAW,EACT,iQAAiQ;KACpQ,CAAC;IAC+B,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAAuB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;sEA4CnH;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAiB,EAAE,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;IACxE,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;IAAgB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEASjF;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAiB,EAAE,EAAE,WAAW,EAAE,kGAAkG,EAAE,CAAC;IACzH,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC,CAAA;IAAmB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wEAU5G;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAiB,EAAE,EAAE,WAAW,EAAE,kFAAkF,EAAE,CAAC;IACnH,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;8DAOpD;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,2EAA2E,EAAE,CAAC;IAChG,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAStD;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAiB,EAAE,EAAE,WAAW,EAAE,kIAAkI,EAAE,CAAC;IAClK,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,uCAAuB,CAAC,CAAC,CAAA;IAAqC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;+DAoB1I;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,kCAAkB,EAAE,EAAE,WAAW,EAAE,0DAA0D,EAAE,CAAC;IAC3F,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;+DAK7D;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,mEAAmE,EAAE,CAAC;IACvF,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;iEAMvD;AAKK;IAHL,IAAA,wBAAS,EAAC,QAAQ,CAAC;IACnB,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,0DAA0D,EAAE,CAAC;IAClF,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,mCAAmB,CAAC,CAAC,CAAA;IAAiC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAWzG;gCAlQU,qBAAqB;IADjC,IAAA,uBAAQ,GAAE;GACE,qBAAqB,CAmQjC;AAED,sEAAsE;AACtE,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,EAAQ;IACzD,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,0BAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAQ;QAC/C,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAS,EAAE,SAAS,EAAE,IAAA,aAAG,EAAC,IAAA,gBAAM,GAAE,CAAC,EAAS;QAC7E,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAS;KACnC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;AACrF,CAAC","sourcesContent":["/*\n * The doors of the dashboard cards (ADR-0160 decisions 6-10) - one's own cards and those shared with one, one's own\n * dashboard, a card's versions and shares (its owner's), running a card, and saving a proposal a conversation made.\n *\n * Every door asks who may use the card again (card-access.ts) - a share withdrawn closes at once. Running a card asks\n * the data's own door as the viewer and reads with the viewer's request (card-run.ts): the card gives the definition,\n * never the data.\n */\nimport { Arg, Ctx, Directive, Int, Mutation, Query, Resolver } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport { In, IsNull, Not } from 'typeorm'\n\nimport { getRepository } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport {\n assertMayWriteSession,\n ChatMessage,\n ChatSession,\n detailReadOf,\n isSessionParticipant,\n mayReadSession,\n readTargetOf,\n rootFieldOf,\n runAsCaller,\n toolAccessFor\n} from '@things-factory/ai-assistant'\n\nimport { cardAccessOf, departmentsOfEmployees, shareRefusal, type CardAccess, type CardViewer } from './card-access.js'\nimport { CARD_SCHEMA_VERSION, checkDefinition, sourceOf, todayIn, type CardDefinition } from './card-definition.js'\nimport { findCardProposal } from './card-proposal.js'\nimport { runCard, type CardRunResult } from './card-run.js'\nimport { DashboardCard, DashboardCardPlace, DashboardCardShare, DashboardCardShareScope, DashboardCardVersion } from './dashboard-card.js'\nimport { DashboardCardItem, DashboardCardShareInput, DashboardCardVersionItem, DashboardPlaceInput, DashboardPlaceItem, DashboardShareChoice, DashboardShareOptions } from './card-types.js'\n\nconst QUERY = '@privilege(category: \"ai-dashboard\", privilege: \"query\", domainOwnerGranted: true)'\nconst MUTATION = '@privilege(category: \"ai-dashboard\", privilege: \"mutation\", domainOwnerGranted: true)'\n\nconst MAX_WIDTH = 4\nconst MAX_HEIGHT = 2\n\n/** A refusal said in the reader's words, with a code the screen may read. */\nfunction refuse(context: ResolverContext, code: string, fallback: string, options: Record<string, unknown> = {}): never {\n const message = context.t ? String(context.t(`ai-dashboard.refusal.${code}`, { defaultValue: fallback, ...options })) : fallback\n const error: any = new Error(message)\n error.extensions = { code: `ai-dashboard.${code}` }\n throw error\n}\n\n/** The viewer of a request, with the departments they belong to for sharing - asked once per request. */\nasync function viewerOf(context: ResolverContext): Promise<{ viewer: CardViewer; departmentsAvailable: boolean; departments: { id: string; name: string }[] }> {\n const state: any = context.state\n if (state.__aiDashboardViewer) return state.__aiDashboardViewer\n let records: any[] | undefined\n try {\n /* The organization module's own door, as the viewer - absent in an application without it. */\n const answer = await runAsCaller(context)('query { myEmployees { active department { id name } } }', {})\n if (!answer.errors?.length) records = answer.data?.myEmployees ?? []\n } catch {\n records = undefined\n }\n const departmentIds = departmentsOfEmployees(records)\n const departments = departmentIds.map(id => ({ id, name: records!.find(one => one?.department?.id === id)?.department?.name ?? id }))\n const answer = {\n viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds },\n departmentsAvailable: records !== undefined,\n departments\n }\n state.__aiDashboardViewer = answer\n return answer\n}\n\nconst sharesOf = async (cardIds: string[], tx?: any) =>\n cardIds.length ? await getRepository(DashboardCardShare, tx).find({ where: { card: { id: In(cardIds) } } as any }) : []\n\n/** A card the viewer may use, and how - refused otherwise (decision 7). */\nasync function usableCard(id: string, context: ResolverContext, tx?: any): Promise<{ card: DashboardCard; access: CardAccess }> {\n const card = await getRepository(DashboardCard, tx).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n if (!card) refuse(context, 'unknown-card', 'there is no such card.')\n const { viewer } = await viewerOf(context)\n const access = cardAccessOf(card, viewer, await sharesOf([card.id], tx))\n if (!access) refuse(context, 'card-not-shared', 'this card is not shared with you.')\n return { card, access }\n}\n\nasync function ownCard(id: string, context: ResolverContext, tx?: any): Promise<DashboardCard> {\n const { card, access } = await usableCard(id, context, tx)\n if (access !== 'owner') refuse(context, 'not-your-card', 'only the one who made this card changes it - copy it to make your own.')\n return card\n}\n\nasync function namesOf(userIds: string[]): Promise<Map<string, string>> {\n const ids = [...new Set(userIds.filter(Boolean))]\n if (!ids.length) return new Map()\n const users = await getRepository(User).find({ where: { id: In(ids) } as any })\n return new Map(users.map(one => [one.id, one.name || one.email || one.id]))\n}\n\n/** The cards as the viewer sees them - each with its access, whether placed, and its shares for its owner. */\nasync function itemsOf(cards: DashboardCard[], context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n const shares = await sharesOf(cards.map(one => one.id))\n const placed = cards.length\n ? new Set((await getRepository(DashboardCardPlace).find({ where: { domain: { id: viewer.domainId }, user: { id: viewer.userId }, card: { id: In(cards.map(one => one.id)) } } as any })).map(one => one.cardId))\n : new Set<string>()\n const names = await namesOf(cards.map(one => one.ownerId))\n return cards.flatMap(card => {\n const mine = shares.filter(one => one.cardId === card.id)\n const access = cardAccessOf(card, viewer, mine)\n if (!access) return []\n return [\n {\n id: card.id,\n name: card.name,\n description: card.description,\n version: card.version,\n definition: card.definition,\n access,\n ownerName: names.get(card.ownerId),\n copiedFromId: card.copiedFromId,\n placed: placed.has(card.id),\n ...(access === 'owner' ? { shares: mine.map(one => ({ scope: one.scope, targetId: one.targetId, targetName: one.targetName })) } : {}),\n updatedAt: card.updatedAt\n }\n ]\n })\n}\n\n/** Runs a definition as the viewer - the data's door and the data's API, the viewer's (decision 6). */\nexport async function runAsViewer(definition: CardDefinition, context: ResolverContext): Promise<CardRunResult> {\n return await runCard(definition, {\n readTargetOf,\n detailReadOf,\n passesDoor: door => toolAccessFor(context)(door),\n run: runAsCaller(context),\n today: todayIn(context.state.domain?.timezone),\n words: (key, fallback) => {\n if (!key || typeof context.t !== 'function') return fallback\n const said = context.t(key)\n return said && said !== key ? String(said) : fallback\n }\n })\n}\n\n/** A definition fit to keep - its source known and every name its own. */\nfunction keepable(definition: any, context: ResolverContext): CardDefinition {\n const { source, issue } = sourceOf(definition?.source, readTargetOf, detailReadOf)\n if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares ({code}).', { code: issue?.code })\n const issues = checkDefinition(definition, source)\n if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source ({code}).', { code: issues[0].code })\n return definition\n}\n\nasync function placeAtEnd(cardId: string, context: ResolverContext, tx: any): Promise<DashboardCardPlace> {\n const { domain, user } = context.state\n const repository = getRepository(DashboardCardPlace, tx)\n const existing = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id }, card: { id: cardId } } as any })\n if (existing) return existing\n const last = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'DESC' } as any })\n return await repository.save({ domain, user, card: { id: cardId }, order: (last?.order ?? -1) + 1, width: 2, height: 1, creator: user, updater: user } as any)\n}\n\n@Resolver()\nexport class DashboardCardResolver {\n @Directive(QUERY)\n @Query(returns => [DashboardPlaceItem], { description: \"The cards on the viewer's dashboard, in order - only those the viewer may still use.\" })\n async myDashboard(@Ctx() context: ResolverContext): Promise<DashboardPlaceItem[]> {\n const { domain, user } = context.state\n const places = await getRepository(DashboardCardPlace).find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'ASC' } as any })\n const cards = places.length ? await getRepository(DashboardCard).find({ where: { id: In(places.map(one => one.cardId)), domain: { id: domain.id } } as any }) : []\n const items = new Map((await itemsOf(cards, context)).map(one => [one.id, one]))\n return places.flatMap(place => (items.has(place.cardId) ? [{ id: place.id, order: place.order, width: place.width, height: place.height, card: items.get(place.cardId)! }] : []))\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardItem], { description: \"The viewer's card library - 'mine', the cards they made, or 'shared', those shared with them.\" })\n async dashboardCards(@Arg('which', { description: \"'mine' or 'shared'.\" }) which: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n if (which === 'mine') {\n const cards = await getRepository(DashboardCard).find({ where: { domain: { id: viewer.domainId }, owner: { id: viewer.userId } } as any, order: { updatedAt: 'DESC' } as any })\n return await itemsOf(cards, context)\n }\n const shares = await getRepository(DashboardCardShare).find({\n where: [\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.USER, targetId: viewer.userId },\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DOMAIN, targetId: viewer.domainId },\n ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DEPARTMENT, targetId: In([...viewer.departmentIds]) }] : [])\n ] as any\n })\n const ids = [...new Set(shares.map(one => one.cardId))]\n const cards = ids.length ? await getRepository(DashboardCard).find({ where: { id: In(ids), domain: { id: viewer.domainId }, owner: { id: Not(viewer.userId) } } as any, order: { updatedAt: 'DESC' } as any }) : []\n return await itemsOf(cards, context)\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, { description: 'Draws one card as the viewer - its block, how much of the source it was drawn from, or why it cannot be drawn. No model is asked.' })\n async dashboardCardRun(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { card } = await usableCard(id, context)\n return await runAsViewer(card.definition as CardDefinition, context)\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardVersionItem], { description: \"A card's versions, newest first - its owner only.\" })\n async dashboardCardVersions(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardVersionItem[]> {\n const card = await ownCard(id, context)\n const versions = await getRepository(DashboardCardVersion).find({ where: { card: { id: card.id } } as any, order: { version: 'DESC' } as any })\n const names = await namesOf(versions.map(one => one.creatorId))\n return versions.map(one => ({ version: one.version, name: one.name, definition: one.definition, creatorName: names.get(one.creatorId), createdAt: one.createdAt }))\n }\n\n @Directive(QUERY)\n @Query(returns => DashboardShareOptions, { description: 'What the viewer may share a card with - the domain, their own departments, and whether people can be looked up.' })\n async dashboardShareOptions(@Ctx() context: ResolverContext): Promise<DashboardShareOptions> {\n const { departmentsAvailable, departments } = await viewerOf(context)\n const domain: any = context.state.domain\n return {\n domainId: domain.id,\n domainName: domain.name ?? domain.subdomain ?? domain.id,\n departmentsAvailable,\n departments,\n peopleAvailable: await toolAccessFor(context)('Query.employees')\n }\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardShareChoice], { description: \"People to share a card with, found by name through the organization's own list as the viewer.\" })\n async dashboardSharePeople(@Arg('text') text: string, @Ctx() context: ResolverContext): Promise<DashboardShareChoice[]> {\n const words = (text ?? '').trim()\n if (!words) return []\n const answer = await runAsCaller(context)(\n 'query ($filters: [Filter!], $pagination: Pagination) { employees(filters: $filters, pagination: $pagination) { items { name department { name } user { id } } } }',\n { filters: [{ name: 'active', operator: 'eq', value: true }, { name: 'name', operator: 'i_like', value: words }], pagination: { page: 1, limit: 20 } }\n )\n if (answer.errors?.length) refuse(context, 'people-unavailable', 'people cannot be looked up here.')\n return (answer.data?.employees?.items ?? [])\n .filter((one: any) => one?.user?.id && one.user.id !== context.state.user.id)\n .map((one: any) => ({ id: one.user.id, name: one.name, note: one.department?.name }))\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, {\n description: \"Draws a card a conversation proposed, as the one looking at the conversation - the proposal keeps the definition, never its values.\"\n })\n async dashboardCardProposalPreview(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { domain, user } = context.state\n const session = await getRepository(ChatSession).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n const participant = await isSessionParticipant(domain.id, session.id, user?.id)\n if (!mayReadSession(session.visibility, participant)) refuse(context, 'conversation-closed', 'this conversation is not open to you.')\n const { proposal } = findCardProposal(await proposalMessages(session.id), proposalKey)\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n return await runAsViewer(proposal.card.definition, context)\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => GraphQLJSON, {\n description:\n \"Saves a card a conversation proposed and places it on the viewer's dashboard - the stored proposal's definition, never one the screen sends. A change of a saved card is its owner's, from the version it was read at. Pressing it again answers the same card.\"\n })\n async saveDashboardCardProposal(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<{ cardId: string; version: number; placeId: string; again?: boolean }> {\n const { domain, user, tx } = context.state as any\n const session = await getRepository(ChatSession, tx).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n await assertMayWriteSession({\n session,\n userId: user?.id,\n isParticipant: () => isSessionParticipant(domain.id, session.id, user?.id),\n t: (key, options) => (context.t ? context.t(key, options) : String(options?.defaultValue ?? key))\n })\n\n /* Saved already - the same card, whoever's request it is now asked by. */\n const saved = await getRepository(DashboardCardVersion, tx).findOne({ where: { domain: { id: domain.id }, proposalSessionId: session.id, proposalKey } as any })\n if (saved) {\n const card = await ownCard(saved.cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version: saved.version, placeId: place.id, again: true }\n }\n\n const { proposal, superseded, notACard } = findCardProposal(await proposalMessages(session.id, tx), proposalKey)\n if (notACard) refuse(context, 'not-a-card', 'this proposal is not a dashboard card.')\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n if (superseded) refuse(context, 'superseded', 'a newer card replaced this one in the conversation - save that one.')\n const definition = keepable(proposal.card.definition, context)\n /* Keeping a card one cannot read draws nothing - the data's door is the saver's too. */\n const { source } = sourceOf(definition.source, readTargetOf, detailReadOf)\n if (!(await toolAccessFor(context)(rootFieldOf(source!.query, 'query')))) refuse(context, 'data-closed', 'you may not read the data this card draws.')\n const name = String(proposal.card.name ?? '').trim().slice(0, 100) || 'card'\n const description = proposal.card.description ? String(proposal.card.description).slice(0, 300) : null\n\n let card: DashboardCard\n let version: number\n if (proposal.card.cardId) {\n card = await ownCard(proposal.card.cardId, context, tx)\n if (proposal.card.baseVersion !== card.version) refuse(context, 'stale-version', 'the card changed since this proposal (now version {version}) - ask for the change again.', { version: card.version })\n version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name, description, version, definitionJson: JSON.stringify(definition), updater: user } as any)\n } else {\n version = 1\n card = await getRepository(DashboardCard, tx).save({ domain, name, description, owner: user, version, definitionJson: JSON.stringify(definition), creator: user, updater: user } as any)\n }\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name, definitionJson: JSON.stringify(definition), proposalSessionId: session.id, proposalKey, creator: user, updater: user } as any)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version, placeId: place.id }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Renames one's own card - a new version.\" })\n async renameDashboardCard(@Arg('id') id: string, @Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const given = (name ?? '').trim().slice(0, 100)\n if (!given) refuse(context, 'no-name', 'a card needs a name.')\n const version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: given, version, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name: given, definitionJson: card.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Brings back an earlier version of one's own card - its definition and name become a new version.\" })\n async restoreDashboardCardVersion(@Arg('id') id: string, @Arg('version', type => Int) version: number, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const earlier = await getRepository(DashboardCardVersion, tx).findOne({ where: { card: { id: card.id }, version } as any })\n if (!earlier) refuse(context, 'unknown-version', 'there is no such version.')\n keepable(earlier.definition, context)\n const next = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: earlier.name, definitionJson: earlier.definitionJson, version: next, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version: next, name: earlier.name, definitionJson: earlier.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: 'Copies a card one may use into a card of one\\'s own, placed on one\\'s dashboard.' })\n async copyDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const { card } = await usableCard(id, context, tx)\n const copy = await getRepository(DashboardCard, tx).save({ domain, name: card.name, description: card.description, owner: user, version: 1, definitionJson: card.definitionJson, copiedFromId: card.id, creator: user, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: copy.id }, version: 1, name: copy.name, definitionJson: copy.definitionJson, creator: user, updater: user } as any)\n await placeAtEnd(copy.id, context, tx)\n return (await itemsOf([copy], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Deletes one's own card - its versions, shares and every place it was put.\" })\n async deleteDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { tx } = context.state as any\n const card = await ownCard(id, context, tx)\n for (const entity of [DashboardCardPlace, DashboardCardShare, DashboardCardVersion] as any[]) {\n const rows = await getRepository(entity, tx).find({ where: { card: { id: card.id } } as any })\n if (rows.length) await getRepository(entity, tx).softRemove(rows)\n }\n await getRepository(DashboardCard, tx).softRemove(card)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Sets who one's own card is shared with - the whole list; none keeps it to oneself. A share gives the definition, never the data.\" })\n async shareDashboardCard(@Arg('id') id: string, @Arg('shares', type => [DashboardCardShareInput]) shares: DashboardCardShareInput[], @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const { departmentsAvailable } = await viewerOf(context)\n const wanted = new Map<string, DashboardCardShareInput>()\n for (const share of shares ?? []) {\n const refusal = shareRefusal(share, { domainId: domain.id, departmentsAvailable })\n if (refusal) refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal })\n if (share.scope === DashboardCardShareScope.USER && share.targetId === user.id) continue\n wanted.set(`${share.scope}:${share.targetId}`, share)\n }\n const repository = getRepository(DashboardCardShare, tx)\n const current = await repository.find({ where: { card: { id: card.id } } as any })\n const gone = current.filter(one => !wanted.has(`${one.scope}:${one.targetId}`))\n if (gone.length) await repository.softRemove(gone)\n for (const [key, share] of wanted) {\n if (current.some(one => `${one.scope}:${one.targetId}` === key)) continue\n await repository.save({ domain, card: { id: card.id }, scope: share.scope, targetId: share.targetId, targetName: share.targetName?.slice(0, 100), creator: user, updater: user } as any)\n }\n return (await itemsOf([card], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardPlaceItem, { description: \"Places a card one may use at the end of one's dashboard.\" })\n async placeDashboardCard(@Arg('cardId') cardId: string, @Ctx() context: ResolverContext): Promise<DashboardPlaceItem> {\n const { tx } = context.state as any\n const { card } = await usableCard(cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { id: place.id, order: place.order, width: place.width, height: place.height, card: (await itemsOf([card], context))[0] }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Takes a card off one's dashboard - the card stays in the library.\" })\n async removeDashboardPlace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const place = await getRepository(DashboardCardPlace, tx).findOne({ where: { id, domain: { id: domain.id }, user: { id: user.id } } as any })\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n await getRepository(DashboardCardPlace, tx).softRemove(place)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Sets the order and size of the cards on one's dashboard.\" })\n async arrangeDashboard(@Arg('places', type => [DashboardPlaceInput]) places: DashboardPlaceInput[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const repository = getRepository(DashboardCardPlace, tx)\n const mine = await repository.find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any })\n for (const given of places ?? []) {\n const place = mine.find(one => one.id === given.id)\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n if (!(given.width >= 1 && given.width <= MAX_WIDTH && given.height >= 1 && given.height <= MAX_HEIGHT)) refuse(context, 'size-out-of-range', 'a card spans 1 to 4 columns and 1 to 2 rows.')\n await repository.save({ ...place, order: given.order, width: given.width, height: given.height, updater: user } as any)\n }\n return true\n }\n}\n\n/** The conversation's messages that carry proposals, oldest first. */\nasync function proposalMessages(sessionId: string, tx?: any): Promise<{ proposals: any[] }[]> {\n const carrying = await getRepository(ChatMessage, tx).find({\n select: ['id', 'proposals', 'createdAt'] as any,\n where: { session: { id: sessionId } as any, proposals: Not(IsNull()) } as any,\n order: { createdAt: 'ASC' } as any\n })\n return carrying.map((message: any) => ({ proposals: message.proposalsJson ?? [] }))\n}\n\nexport { CARD_SCHEMA_VERSION }\n"]}
1
+ {"version":3,"file":"card-resolver.js","sourceRoot":"","sources":["../../../server/service/card/card-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors of the dashboard cards (ADR-0160 decisions 6-10) - one's own cards and those shared with one, one's own\n * dashboard, a card's versions and shares (its owner's), running a card, and saving a proposal a conversation made.\n *\n * Every door asks who may use the card again (card-access.ts) - a share withdrawn closes at once. Running a card asks\n * the data's own door as the viewer and reads with the viewer's request (card-run.ts): the card gives the definition,\n * never the data.\n */\nimport { Arg, Ctx, Directive, Int, Mutation, Query, Resolver } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport { In, IsNull, Not } from 'typeorm'\n\nimport { applyDomainInheritanceFilter, getRepository, InheritedValueType } from '@things-factory/shell'\nimport { Role, User } from '@things-factory/auth-base'\nimport {\n assertMayWriteSession,\n ChatMessage,\n ChatSession,\n detailReadOf,\n isSessionParticipant,\n mayReadSession,\n readTargetOf,\n rootFieldOf,\n runAsCaller,\n toolAccessFor\n} from '@things-factory/ai-assistant'\n\nimport { cardAccessOf, departmentsOfEmployees, shareRefusal, type CardAccess, type CardViewer } from './card-access.js'\nimport { CARD_SCHEMA_VERSION, checkDefinition, sourceOf, todayIn, type CardDefinition } from './card-definition.js'\nimport { cardIdOf, findCardProposal } from './card-proposal.js'\nimport { runCard, type CardRunResult } from './card-run.js'\nimport { DashboardCard, DashboardCardPlace, DashboardCardShare, DashboardCardShareScope, DashboardCardVersion } from './dashboard-card.js'\nimport { DashboardCardItem, DashboardCardShareInput, DashboardCardVersionItem, DashboardPlaceInput, DashboardPlaceItem, DashboardShareChoice, DashboardShareOptions } from './card-types.js'\n\nconst QUERY = '@privilege(category: \"ai-dashboard\", privilege: \"query\", domainOwnerGranted: true)'\nconst MUTATION = '@privilege(category: \"ai-dashboard\", privilege: \"mutation\", domainOwnerGranted: true)'\n\nconst MAX_WIDTH = 4\nconst MAX_HEIGHT = 2\n\n/** A refusal said in the reader's words, with a code the screen may read. */\nfunction refuse(context: ResolverContext, code: string, fallback: string, options: Record<string, unknown> = {}): never {\n const message = context.t ? String(context.t(`ai-dashboard.refusal.${code}`, { defaultValue: fallback, ...options })) : fallback\n const error: any = new Error(message)\n error.extensions = { code: `ai-dashboard.${code}` }\n throw error\n}\n\n/** The viewer of a request, with the departments they belong to for sharing - asked once per request. */\n/**\n * The roles of the domain - the ones it inherits from its parent included, as its privileges are (User.getPrivilegesByDomain);\n * `holder` keeps those one person holds.\n */\nasync function domainRoles(context: ResolverContext, holder?: string, tx?: any): Promise<Role[]> {\n const qb = getRepository(Role, tx).createQueryBuilder('ROLE')\n if (holder) qb.innerJoin('ROLE.users', 'HOLDER', 'HOLDER.id = :holder', { holder })\n applyDomainInheritanceFilter(qb, 'ROLE', context.state.domain as any, InheritedValueType.Include)\n return await qb.orderBy('ROLE.name').getMany()\n}\n\nasync function viewerOf(context: ResolverContext): Promise<{ viewer: CardViewer; departmentsAvailable: boolean; departments: { id: string; name: string }[] }> {\n const state: any = context.state\n if (state.__aiDashboardViewer) return state.__aiDashboardViewer\n let records: any[] | undefined\n try {\n /* The organization module's own door, as the viewer - absent in an application without it. */\n const answer = await runAsCaller(context)('query { myEmployees { active department { id name } } }', {})\n if (!answer.errors?.length) records = answer.data?.myEmployees ?? []\n } catch {\n records = undefined\n }\n const departmentIds = departmentsOfEmployees(records)\n const departments = departmentIds.map(id => ({ id, name: records!.find(one => one?.department?.id === id)?.department?.name ?? id }))\n const roleIds = state.user?.id ? (await domainRoles(context, state.user.id)).map(one => one.id) : []\n const answer = {\n viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds, roleIds },\n departmentsAvailable: records !== undefined,\n departments\n }\n state.__aiDashboardViewer = answer\n return answer\n}\n\nconst sharesOf = async (cardIds: string[], tx?: any) =>\n cardIds.length ? await getRepository(DashboardCardShare, tx).find({ where: { card: { id: In(cardIds) } } as any }) : []\n\n/** A card the viewer may use, and how - refused otherwise (decision 7). */\nasync function usableCard(given: string, context: ResolverContext, tx?: any): Promise<{ card: DashboardCard; access: CardAccess }> {\n /* A card's uuid or its key - anything else is no card, and is not handed to a database that refuses it as no uuid. */\n const id = cardIdOf(given)\n if (!id) refuse(context, 'unknown-card', 'there is no such card.')\n const card = await getRepository(DashboardCard, tx).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n if (!card) refuse(context, 'unknown-card', 'there is no such card.')\n const { viewer } = await viewerOf(context)\n const access = cardAccessOf(card, viewer, await sharesOf([card.id], tx))\n if (!access) refuse(context, 'card-not-shared', 'this card is not shared with you.')\n return { card, access }\n}\n\nasync function ownCard(id: string, context: ResolverContext, tx?: any): Promise<DashboardCard> {\n const { card, access } = await usableCard(id, context, tx)\n if (access !== 'owner') refuse(context, 'not-your-card', 'only the one who made this card changes it - copy it to make your own.')\n return card\n}\n\nasync function namesOf(userIds: string[]): Promise<Map<string, string>> {\n const ids = [...new Set(userIds.filter(Boolean))]\n if (!ids.length) return new Map()\n const users = await getRepository(User).find({ where: { id: In(ids) } as any })\n return new Map(users.map(one => [one.id, one.name || one.email || one.id]))\n}\n\n/** The cards as the viewer sees them - each with its access, whether placed, and its shares for its owner. */\nasync function itemsOf(cards: DashboardCard[], context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n const shares = await sharesOf(cards.map(one => one.id))\n const placed = cards.length\n ? new Set((await getRepository(DashboardCardPlace).find({ where: { domain: { id: viewer.domainId }, user: { id: viewer.userId }, card: { id: In(cards.map(one => one.id)) } } as any })).map(one => one.cardId))\n : new Set<string>()\n const names = await namesOf(cards.map(one => one.ownerId))\n return cards.flatMap(card => {\n const mine = shares.filter(one => one.cardId === card.id)\n const access = cardAccessOf(card, viewer, mine)\n if (!access) return []\n return [\n {\n id: card.id,\n name: card.name,\n description: card.description,\n version: card.version,\n definition: card.definition,\n access,\n ownerName: names.get(card.ownerId),\n copiedFromId: card.copiedFromId,\n placed: placed.has(card.id),\n ...(access === 'owner' ? { shares: mine.map(one => ({ scope: one.scope, targetId: one.targetId, targetName: one.targetName })) } : {}),\n updatedAt: card.updatedAt\n }\n ]\n })\n}\n\n/** Runs a definition as the viewer - the data's door and the data's API, the viewer's (decision 6). */\nexport async function runAsViewer(definition: CardDefinition, context: ResolverContext): Promise<CardRunResult> {\n return await runCard(definition, {\n readTargetOf,\n detailReadOf,\n passesDoor: door => toolAccessFor(context)(door),\n run: runAsCaller(context),\n today: todayIn(context.state.domain?.timezone),\n words: (key, fallback) => {\n if (!key || typeof context.t !== 'function') return fallback\n const said = context.t(key)\n return said && said !== key ? String(said) : fallback\n }\n })\n}\n\n/** A definition fit to keep - its source known and every name its own. */\nfunction keepable(definition: any, context: ResolverContext): CardDefinition {\n const { source, issue } = sourceOf(definition?.source, readTargetOf, detailReadOf)\n if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares ({code}).', { code: issue?.code })\n const issues = checkDefinition(definition, source)\n if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source ({code}).', { code: issues[0].code })\n return definition\n}\n\nasync function placeAtEnd(cardId: string, context: ResolverContext, tx: any): Promise<DashboardCardPlace> {\n const { domain, user } = context.state\n const repository = getRepository(DashboardCardPlace, tx)\n const existing = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id }, card: { id: cardId } } as any })\n if (existing) return existing\n const last = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'DESC' } as any })\n return await repository.save({ domain, user, card: { id: cardId }, order: (last?.order ?? -1) + 1, width: 2, height: 1, creator: user, updater: user } as any)\n}\n\n@Resolver()\nexport class DashboardCardResolver {\n @Directive(QUERY)\n @Query(returns => [DashboardPlaceItem], { description: \"The cards on the viewer's dashboard, in order - only those the viewer may still use.\" })\n async myDashboard(@Ctx() context: ResolverContext): Promise<DashboardPlaceItem[]> {\n const { domain, user } = context.state\n const places = await getRepository(DashboardCardPlace).find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'ASC' } as any })\n const cards = places.length ? await getRepository(DashboardCard).find({ where: { id: In(places.map(one => one.cardId)), domain: { id: domain.id } } as any }) : []\n const items = new Map((await itemsOf(cards, context)).map(one => [one.id, one]))\n return places.flatMap(place => (items.has(place.cardId) ? [{ id: place.id, order: place.order, width: place.width, height: place.height, card: items.get(place.cardId)! }] : []))\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardItem], { description: \"The viewer's card library - 'mine', the cards they made, or 'shared', those shared with them.\" })\n async dashboardCards(@Arg('which', { description: \"'mine' or 'shared'.\" }) which: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n if (which === 'mine') {\n const cards = await getRepository(DashboardCard).find({ where: { domain: { id: viewer.domainId }, owner: { id: viewer.userId } } as any, order: { updatedAt: 'DESC' } as any })\n return await itemsOf(cards, context)\n }\n const shares = await getRepository(DashboardCardShare).find({\n where: [\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.USER, targetId: viewer.userId },\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DOMAIN, targetId: viewer.domainId },\n ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DEPARTMENT, targetId: In([...viewer.departmentIds]) }] : []),\n ...(viewer.roleIds?.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.ROLE, targetId: In([...viewer.roleIds]) }] : [])\n ] as any\n })\n const ids = [...new Set(shares.map(one => one.cardId))]\n const cards = ids.length ? await getRepository(DashboardCard).find({ where: { id: In(ids), domain: { id: viewer.domainId }, owner: { id: Not(viewer.userId) } } as any, order: { updatedAt: 'DESC' } as any }) : []\n return await itemsOf(cards, context)\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, { description: 'Draws one card as the viewer - its block, how much of the source it was drawn from, or why it cannot be drawn. No model is asked.' })\n async dashboardCardRun(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { card } = await usableCard(id, context)\n return await runAsViewer(card.definition as CardDefinition, context)\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardVersionItem], { description: \"A card's versions, newest first - its owner only.\" })\n async dashboardCardVersions(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardVersionItem[]> {\n const card = await ownCard(id, context)\n const versions = await getRepository(DashboardCardVersion).find({ where: { card: { id: card.id } } as any, order: { version: 'DESC' } as any })\n const names = await namesOf(versions.map(one => one.creatorId))\n return versions.map(one => ({ version: one.version, name: one.name, definition: one.definition, creatorName: names.get(one.creatorId), createdAt: one.createdAt }))\n }\n\n @Directive(QUERY)\n @Query(returns => DashboardShareOptions, { description: 'What the viewer may share a card with - the domain, their own departments, and whether people can be looked up.' })\n async dashboardShareOptions(@Ctx() context: ResolverContext): Promise<DashboardShareOptions> {\n const { departmentsAvailable, departments } = await viewerOf(context)\n const domain: any = context.state.domain\n return {\n domainId: domain.id,\n domainName: domain.name ?? domain.subdomain ?? domain.id,\n departmentsAvailable,\n departments,\n peopleAvailable: await toolAccessFor(context)('Query.employees'),\n roles: (await domainRoles(context)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))\n }\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardShareChoice], { description: \"People to share a card with, found by name through the organization's own list as the viewer.\" })\n async dashboardSharePeople(@Arg('text') text: string, @Ctx() context: ResolverContext): Promise<DashboardShareChoice[]> {\n const words = (text ?? '').trim()\n if (!words) return []\n const answer = await runAsCaller(context)(\n 'query ($filters: [Filter!], $pagination: Pagination) { employees(filters: $filters, pagination: $pagination) { items { name department { name } user { id } } } }',\n { filters: [{ name: 'active', operator: 'eq', value: true }, { name: 'name', operator: 'i_like', value: words }], pagination: { page: 1, limit: 20 } }\n )\n if (answer.errors?.length) refuse(context, 'people-unavailable', 'people cannot be looked up here.')\n return (answer.data?.employees?.items ?? [])\n .filter((one: any) => one?.user?.id && one.user.id !== context.state.user.id)\n .map((one: any) => ({ id: one.user.id, name: one.name, note: one.department?.name }))\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, {\n description: \"Draws a card a conversation proposed, as the one looking at the conversation - the proposal keeps the definition, never its values.\"\n })\n async dashboardCardProposalPreview(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { domain, user } = context.state\n const session = await getRepository(ChatSession).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n const participant = await isSessionParticipant(domain.id, session.id, user?.id)\n if (!mayReadSession(session.visibility, participant)) refuse(context, 'conversation-closed', 'this conversation is not open to you.')\n const { proposal } = findCardProposal(await proposalMessages(session.id), proposalKey)\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n return await runAsViewer(proposal.card.definition, context)\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => GraphQLJSON, {\n description:\n \"Saves a card a conversation proposed and places it on the viewer's dashboard - the stored proposal's definition, never one the screen sends. A change of a saved card is its owner's, from the version it was read at. Pressing it again answers the same card.\"\n })\n async saveDashboardCardProposal(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<{ cardId: string; version: number; placeId: string; again?: boolean }> {\n const { domain, user, tx } = context.state as any\n const session = await getRepository(ChatSession, tx).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n await assertMayWriteSession({\n session,\n userId: user?.id,\n isParticipant: () => isSessionParticipant(domain.id, session.id, user?.id),\n t: (key, options) => (context.t ? context.t(key, options) : String(options?.defaultValue ?? key))\n })\n\n /* Saved already - the same card, whoever's request it is now asked by. */\n const saved = await getRepository(DashboardCardVersion, tx).findOne({ where: { domain: { id: domain.id }, proposalSessionId: session.id, proposalKey } as any })\n if (saved) {\n const card = await ownCard(saved.cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version: saved.version, placeId: place.id, again: true }\n }\n\n const { proposal, superseded, notACard } = findCardProposal(await proposalMessages(session.id, tx), proposalKey)\n if (notACard) refuse(context, 'not-a-card', 'this proposal is not a dashboard card.')\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n if (superseded) refuse(context, 'superseded', 'a newer card replaced this one in the conversation - save that one.')\n const definition = keepable(proposal.card.definition, context)\n /* Keeping a card one cannot read draws nothing - the data's door is the saver's too. */\n const { source } = sourceOf(definition.source, readTargetOf, detailReadOf)\n if (!(await toolAccessFor(context)(rootFieldOf(source!.query, 'query')))) refuse(context, 'data-closed', 'you may not read the data this card draws.')\n const name = String(proposal.card.name ?? '').trim().slice(0, 100) || 'card'\n const description = proposal.card.description ? String(proposal.card.description).slice(0, 300) : null\n\n let card: DashboardCard\n let version: number\n if (proposal.card.cardId) {\n card = await ownCard(proposal.card.cardId, context, tx)\n if (proposal.card.baseVersion !== card.version) refuse(context, 'stale-version', 'the card changed since this proposal (now version {version}) - ask for the change again.', { version: card.version })\n version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name, description, version, definitionJson: JSON.stringify(definition), updater: user } as any)\n } else {\n version = 1\n card = await getRepository(DashboardCard, tx).save({ domain, name, description, owner: user, version, definitionJson: JSON.stringify(definition), creator: user, updater: user } as any)\n }\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name, definitionJson: JSON.stringify(definition), proposalSessionId: session.id, proposalKey, creator: user, updater: user } as any)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version, placeId: place.id }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Renames one's own card - a new version.\" })\n async renameDashboardCard(@Arg('id') id: string, @Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const given = (name ?? '').trim().slice(0, 100)\n if (!given) refuse(context, 'no-name', 'a card needs a name.')\n const version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: given, version, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name: given, definitionJson: card.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Brings back an earlier version of one's own card - its definition and name become a new version.\" })\n async restoreDashboardCardVersion(@Arg('id') id: string, @Arg('version', type => Int) version: number, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const earlier = await getRepository(DashboardCardVersion, tx).findOne({ where: { card: { id: card.id }, version } as any })\n if (!earlier) refuse(context, 'unknown-version', 'there is no such version.')\n keepable(earlier.definition, context)\n const next = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: earlier.name, definitionJson: earlier.definitionJson, version: next, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version: next, name: earlier.name, definitionJson: earlier.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: 'Copies a card one may use into a card of one\\'s own, placed on one\\'s dashboard.' })\n async copyDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const { card } = await usableCard(id, context, tx)\n const copy = await getRepository(DashboardCard, tx).save({ domain, name: card.name, description: card.description, owner: user, version: 1, definitionJson: card.definitionJson, copiedFromId: card.id, creator: user, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: copy.id }, version: 1, name: copy.name, definitionJson: copy.definitionJson, creator: user, updater: user } as any)\n await placeAtEnd(copy.id, context, tx)\n return (await itemsOf([copy], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Deletes one's own card - its versions, shares and every place it was put.\" })\n async deleteDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { tx } = context.state as any\n const card = await ownCard(id, context, tx)\n for (const entity of [DashboardCardPlace, DashboardCardShare, DashboardCardVersion] as any[]) {\n const rows = await getRepository(entity, tx).find({ where: { card: { id: card.id } } as any })\n if (rows.length) await getRepository(entity, tx).softRemove(rows)\n }\n await getRepository(DashboardCard, tx).softRemove(card)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Sets who one's own card is shared with - the whole list; none keeps it to oneself. A share gives the definition, never the data.\" })\n async shareDashboardCard(@Arg('id') id: string, @Arg('shares', type => [DashboardCardShareInput]) shares: DashboardCardShareInput[], @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const { departmentsAvailable } = await viewerOf(context)\n const roleIds = (shares ?? []).some(one => one.scope === DashboardCardShareScope.ROLE) ? (await domainRoles(context, undefined, tx)).map(one => one.id) : []\n const wanted = new Map<string, DashboardCardShareInput>()\n for (const share of shares ?? []) {\n const refusal = shareRefusal(share, { domainId: domain.id, departmentsAvailable, roleIds })\n if (refusal) refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal })\n if (share.scope === DashboardCardShareScope.USER && share.targetId === user.id) continue\n wanted.set(`${share.scope}:${share.targetId}`, share)\n }\n const repository = getRepository(DashboardCardShare, tx)\n const current = await repository.find({ where: { card: { id: card.id } } as any })\n const gone = current.filter(one => !wanted.has(`${one.scope}:${one.targetId}`))\n if (gone.length) await repository.softRemove(gone)\n for (const [key, share] of wanted) {\n if (current.some(one => `${one.scope}:${one.targetId}` === key)) continue\n await repository.save({ domain, card: { id: card.id }, scope: share.scope, targetId: share.targetId, targetName: share.targetName?.slice(0, 100), creator: user, updater: user } as any)\n }\n return (await itemsOf([card], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardPlaceItem, { description: \"Places a card one may use at the end of one's dashboard.\" })\n async placeDashboardCard(@Arg('cardId') cardId: string, @Ctx() context: ResolverContext): Promise<DashboardPlaceItem> {\n const { tx } = context.state as any\n const { card } = await usableCard(cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { id: place.id, order: place.order, width: place.width, height: place.height, card: (await itemsOf([card], context))[0] }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Takes a card off one's dashboard - the card stays in the library.\" })\n async removeDashboardPlace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const place = await getRepository(DashboardCardPlace, tx).findOne({ where: { id, domain: { id: domain.id }, user: { id: user.id } } as any })\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n await getRepository(DashboardCardPlace, tx).softRemove(place)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Sets the order and size of the cards on one's dashboard.\" })\n async arrangeDashboard(@Arg('places', type => [DashboardPlaceInput]) places: DashboardPlaceInput[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const repository = getRepository(DashboardCardPlace, tx)\n const mine = await repository.find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any })\n for (const given of places ?? []) {\n const place = mine.find(one => one.id === given.id)\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n if (!(given.width >= 1 && given.width <= MAX_WIDTH && given.height >= 1 && given.height <= MAX_HEIGHT)) refuse(context, 'size-out-of-range', 'a card spans 1 to 4 columns and 1 to 2 rows.')\n await repository.save({ ...place, order: given.order, width: given.width, height: given.height, updater: user } as any)\n }\n return true\n }\n}\n\n/** The conversation's messages that carry proposals, oldest first. */\nasync function proposalMessages(sessionId: string, tx?: any): Promise<{ proposals: any[] }[]> {\n const carrying = await getRepository(ChatMessage, tx).find({\n select: ['id', 'proposals', 'createdAt'] as any,\n where: { session: { id: sessionId } as any, proposals: Not(IsNull()) } as any,\n order: { createdAt: 'ASC' } as any\n })\n return carrying.map((message: any) => ({ proposals: message.proposalsJson ?? [] }))\n}\n\nexport { CARD_SCHEMA_VERSION }\n"]}
@@ -26,6 +26,10 @@ const compare = (a, b) => {
26
26
  };
27
27
  function matches(row, column, op, given, today) {
28
28
  const cell = row[column.name];
29
+ if (op === 'in' || op === 'not_in') {
30
+ const listed = given.some(one => (column.type === 'number' ? Number(cell) === Number(one) : String(cell ?? '') === String(one)));
31
+ return op === 'in' ? listed : !listed;
32
+ }
29
33
  const value = column.type === 'date' && (0, card_definition_js_1.isRelativeDate)(given) ? (0, card_definition_js_1.resolveRelativeDate)(given, today) : given;
30
34
  if (op === 'eq')
31
35
  return column.type === 'number' ? Number(cell) === Number(value) : String(cell ?? '') === String(value);
@@ -149,7 +153,7 @@ async function runCard(definition, deps) {
149
153
  /* ① The viewer may read this source at all - a shared card gives the definition, never the data (decision 6). */
150
154
  if (!(await deps.passesDoor((0, ai_assistant_1.rootFieldOf)(source.query, 'query'))))
151
155
  return { issue: { code: 'door-closed' }, asOf, source: about };
152
- const read = await readSource(source, (0, card_definition_js_1.resolveWhere)(definition.source.where, asOf), deps);
156
+ const read = await readSource(source, (0, card_definition_js_1.resolveWhere)(definition.source.where, asOf, source.conditions), deps);
153
157
  if (read.issue)
154
158
  return { issue: read.issue, asOf, source: about };
155
159
  const rowsDef = definition.rows ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"card-run.js","sourceRoot":"","sources":["../../../server/service/card/card-run.ts"],"names":[],"mappings":";;;AA2LA,0BAiGC;AA5RD;;;;;;;;;GASG;AACH,+DAAwJ;AAExJ,6DAc6B;AAqQpB,kGA1QP,sCAAiB,OA0QO;AApN1B,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,CAAU,EAAU,EAAE;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED,SAAS,OAAO,CAAC,GAAQ,EAAE,MAAkB,EAAE,EAAU,EAAE,KAAc,EAAE,KAAa;IACtF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,IAAA,mCAAc,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,wCAAmB,EAAC,KAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnH,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;IACxH,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;IACxH,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrD,wHAAwH;IACxH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAChJ,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;AACnG,CAAC;AAED,0EAA0E;AAC1E,KAAK,UAAU,UAAU,CAAC,MAAkB,EAAE,KAA8B,EAAE,IAAiB;IAC7F,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAA,2BAAY,EAAC,MAAM,CAAC,MAAO,EAAE,KAAK,CAAC,CAAA;QACjE,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QAC3F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAQ,EAAC,MAAM,CAAC,MAAO,EAAE,IAAA,wBAAS,EAAC,MAAM,CAAC,MAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAClL,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,CAAA;QAClG,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,IAAA,wBAAS,EAAC,MAAM,CAAC,MAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5D,IAAI,GAAG,CAAC,KAAK,KAAK,qBAAqB;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAA;IAC7H,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAA;IAC9G,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAA;IACtE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAK,CAAC,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAA,sBAAO,EAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA;IACrD,qGAAqG;IACrG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;IAC/H,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,4BAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,oBAAK,EAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAQ,CAAC,CAAA;IACvG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,4BAAa,EAAE,CAAA;AAC/E,CAAC;AAED,sFAAsF;AACtF,SAAS,YAAY,CAAC,IAAW,EAAE,MAAkB;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACjJ,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;AAEtD;;;GAGG;AACH,SAAS,KAAK,CAAC,IAAW,EAAE,EAAc,EAAE,OAAqB;IAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3G,MAAM,OAAO,GAAa;QACxB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;QACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;QACjC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1K,CAAC,CAAC;KACH,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAA;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACxB,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC/G,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;QAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAA;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,IAAI,SAAS,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;YAC9G,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3H,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;AAC/B,CAAC;AAED,oHAAoH;AACpH,SAAS,cAAc,CAAC,IAAW,EAAE,OAAqB;IACxD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,MAAM,GAA8C,EAAE,CAAA;IAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3G,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IACpD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACnB,MAAM,GAAG,GAAQ,EAAE,GAAG,GAAG,EAAE,CAAA;YAC3B,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAC,QAAS,CAAY,IAAI,SAAS,CAAA;gBAC3D,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACnG,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC;QACF,OAAO,EAAE,MAAM;KAChB,CAAA;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,MAAM,GAAG,CAAC,OAAiB,EAAE,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;AAE/G,wEAAwE;AACjE,KAAK,UAAU,OAAO,CAAC,UAA0B,EAAE,IAAiB;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAwB,EAAE,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;IACtF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,6BAAQ,EAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IAC5F,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC5F,MAAM,MAAM,GAAG,IAAA,oCAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEnE,iHAAiH;IACjH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEhI,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,IAAA,iCAAY,EAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IACxF,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAEnE,kDAAkD;IAClD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACxI,IAAI,MAA0C,CAAA;IAC9C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAA;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;;QAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,+GAA+G;IAC/G,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;QACxD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpH,CAAC;IACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAClB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAA;IAE/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACpD,oFAAoF;QACpF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACzK,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxB,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mCAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qCAAgB,CAAA;IACzG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,CAAA;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAEvD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IACrL,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACnI,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,CAAC,CAAA;IACD,oFAAoF;IACpF,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACtE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAChF,CAAC,CAAA;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;YACxB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5R,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,yBAAyB,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzJ,IAAI,KAAK,CAAC,MAAM,GAAG,gCAAW;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gCAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;QAChK,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC3E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAClH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;QACjG,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;aACxG;YACD,MAAM;YACN,IAAI;YACJ,MAAM,EAAE,KAAK;SACd,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAE,CAAA;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,IAAI,MAAM,CAAC,MAAM,GAAG,+BAAU;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,+BAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC9J,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9J,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF;QACD,MAAM;QACN,IAAI;QACJ,MAAM,EAAE,KAAK;KACd,CAAA;AACH,CAAC","sourcesContent":["/*\n * Drawing a card - its definition run as the one looking at it (ADR-0160 decisions 2, 4, 5, 6).\n *\n * The read's door is asked first, with the viewer's request; then the application's query runs with that request,\n * so the rows are those its API gives this person. The rows are filtered, grouped, ordered and cut - in that order -\n * and become one AI 작업판 block, already within what the 작업판 draws: a card that would need a ninth series or a\n * thirteenth figure is refused, never folded, so two currencies are never added on the way. Nothing is kept.\n *\n * Dependencies come in as arguments - tested without a server.\n */\nimport { filtersOf, MAX_READ_ROWS, readCriteria, readRows, rootFieldOf, rowOf, runDetail, valueAt, type ReadColumn } from '@things-factory/ai-assistant'\n\nimport {\n checkDefinition,\n MAX_CHART_POINTS,\n MAX_FIGURES,\n MAX_SERIES,\n MAX_TABLE_ROWS,\n resolveRelativeDate,\n isRelativeDate,\n resolveWhere,\n shapedColumnNames,\n sourceOf,\n type CardDefinition,\n type CardIssue,\n type CardSource\n} from './card-definition.js'\n\ntype Row = Record<string, string | number | null>\ntype Runner = (document: string, variables: Record<string, unknown>) => Promise<{ data?: any; errors?: readonly { message: string }[] }>\n\nexport interface CardRunDeps {\n readTargetOf(key: string): any\n detailReadOf(key: string): any\n /** Whether the viewer passes a door (`Query.receivables`) - their request's answer. */\n passesDoor(door: string): Promise<boolean>\n /** The application's API with the viewer's request state. */\n run: Runner\n /** Today in the domain's time zone - `YYYY-MM-DD`. */\n today: string\n /** The reader's words for a label key. */\n words?(key: string | undefined, fallback: string): string\n}\n\n/** How much of the source the card was drawn from - said on the card (decision 4). */\nexport interface CardCounts {\n /** Rows read from the source. */\n read: number\n /** Rows the source holds. */\n total: number\n /** Every row of the source was read. */\n complete: boolean\n /** Rows (or groups) after filtering and grouping, before the cut. */\n shaped: number\n /** Rows (or points) drawn. */\n shown: number\n}\n\nexport interface CardRunResult {\n /** One AI 작업판 block - metrics, table or chart. */\n block?: Record<string, unknown>\n issue?: CardIssue\n counts?: CardCounts\n /** The day relative conditions were read for. */\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\n/** A column of the shaped rows, with the currency its sums are kept in. */\ninterface Shaped extends ReadColumn {\n /** Set on a column split by currency: `remaining:USD` holds remaining in USD only. */\n of?: string\n code?: string\n}\n\nconst compare = (a: unknown, b: unknown): number => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (a === null || a === undefined) return b === null || b === undefined ? 0 : 1\n if (b === null || b === undefined) return -1\n return String(a).localeCompare(String(b))\n}\n\nfunction matches(row: Row, column: ReadColumn, op: string, given: unknown, today: string): boolean {\n const cell = row[column.name]\n const value = column.type === 'date' && isRelativeDate(given) ? resolveRelativeDate(given as string, today) : given\n if (op === 'eq') return column.type === 'number' ? Number(cell) === Number(value) : String(cell ?? '') === String(value)\n if (op === 'ne') return column.type === 'number' ? Number(cell) !== Number(value) : String(cell ?? '') !== String(value)\n if (cell === null || cell === undefined) return false\n /* A date column holds a day or a time - compared as text from its start, so `2026-10-01` is within `gte 2026-10-01`. */\n const order = column.type === 'number' ? Number(cell) - Number(value) : String(cell).slice(0, String(value).length).localeCompare(String(value))\n return op === 'gt' ? order > 0 : op === 'gte' ? order >= 0 : op === 'lt' ? order < 0 : order <= 0\n}\n\n/** The rows of the source, read as the viewer - or why there are none. */\nasync function readSource(source: CardSource, where: Record<string, unknown>, deps: CardRunDeps): Promise<{ rows?: Row[]; total?: number; complete?: boolean; issue?: CardIssue }> {\n if (source.kind === 'list') {\n const { criteria, refused } = readCriteria(source.target!, where)\n if (refused.length) return { issue: { code: 'condition-unreadable', params: { refused } } }\n try {\n const read = await readRows(source.target!, filtersOf(source.target!, criteria), deps.run, typeof criteria.text === 'string' && source.target!.search ? criteria.text : undefined)\n return { rows: read.rows as Row[], total: read.total, complete: read.complete }\n } catch (error: any) {\n return { issue: { code: 'query-failed', params: { message: String(error?.message ?? error) } } }\n }\n }\n const ran = await runDetail(source.detail!, where, deps.run)\n if (ran.error === 'argument-unreadable') return { issue: { code: 'condition-unreadable', params: { refused: ran.refused } } }\n if (ran.error === 'query-failed') return { issue: { code: 'query-failed', params: { message: ran.message } } }\n if (ran.error === 'not-found') return { issue: { code: 'not-found' } }\n const at = source.list!.at\n const items = at ? valueAt(ran.value, at) : ran.value\n /* An empty list is no rows; a path that holds no list is the declaration's mistake, said as such. */\n if (!Array.isArray(items)) return { issue: { code: 'list-missing', params: { read: source.key, list: source.list!.key, at } } }\n const rows = items.slice(0, MAX_READ_ROWS).map(item => rowOf({ columns: source.columns }, item) as Row)\n return { rows, total: items.length, complete: items.length <= MAX_READ_ROWS }\n}\n\n/** The currencies a currency column's rows hold - `unknown` for a row without one. */\nfunction currenciesIn(rows: Row[], column: ReadColumn): string[] {\n const codes = new Set<string>()\n for (const row of rows) codes.add(typeof row[column.currency!] === 'string' && row[column.currency!] ? String(row[column.currency!]) : 'unknown')\n return [...codes].sort()\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100\n\n/**\n * Grouped rows - the group column, a count and each number column summed. A number with a currency is summed per\n * currency; its column is split into one per currency when the rows hold more than one.\n */\nfunction group(rows: Row[], by: ReadColumn, numbers: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const splits = new Map(numbers.filter(one => one.currency).map(one => [one.name, currenciesIn(rows, one)]))\n const columns: Shaped[] = [\n { ...by, type: by.type === 'date' ? 'string' : by.type },\n { name: 'count', type: 'number' },\n ...numbers.flatMap(one => {\n const codes = splits.get(one.name)\n return codes && codes.length > 1 ? codes.map(code => ({ ...one, name: `${one.name}:${code}`, of: one.name, code })) : [{ ...one, ...(codes ? { code: codes[0] } : {}) }]\n })\n ]\n const groups = new Map<string, Row[]>()\n for (const row of rows) {\n const raw = row[by.name]\n const key = raw === null || raw === undefined ? '' : by.type === 'date' ? String(raw).slice(0, 7) : String(raw)\n groups.set(key, [...(groups.get(key) ?? []), row])\n }\n const out = [...groups].map(([key, members]) => {\n const row: Row = { [by.name]: key, count: members.length }\n for (const column of columns.slice(2)) {\n const name = column.of ?? column.name\n const kept = column.of ? members.filter(one => (one[column.currency!] || 'unknown') === column.code) : members\n row[column.name] = round(kept.reduce((sum, one) => sum + (typeof one[name] === 'number' ? (one[name] as number) : 0), 0))\n }\n return row\n })\n return { rows: out, columns }\n}\n\n/** Ungrouped rows with a number column split by currency when the rows hold more than one - each row in its own. */\nfunction splitUngrouped(rows: Row[], columns: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const shaped: Shaped[] = []\n const splits: { column: ReadColumn; codes: string[] }[] = []\n for (const column of columns) {\n const codes = column.currency ? currenciesIn(rows, column) : []\n if (codes.length > 1) {\n splits.push({ column, codes })\n shaped.push(...codes.map(code => ({ ...column, name: `${column.name}:${code}`, of: column.name, code })))\n } else shaped.push({ ...column, ...(codes.length ? { code: codes[0] } : {}) })\n }\n if (!splits.length) return { rows, columns: shaped }\n return {\n rows: rows.map(row => {\n const out: Row = { ...row }\n for (const { column, codes } of splits) {\n const mine = (row[column.currency!] as string) || 'unknown'\n for (const code of codes) out[`${column.name}:${code}`] = code === mine ? row[column.name] : null\n }\n return out\n }),\n columns: shaped\n }\n}\n\n/** The shaped columns a definition's name stands for - one, or one per currency when it was split. */\nconst expand = (columns: Shaped[], name: string) => columns.filter(one => one.name === name || one.of === name)\n\n/** Runs a card's definition as the viewer and draws it as one block. */\nexport async function runCard(definition: CardDefinition, deps: CardRunDeps): Promise<CardRunResult> {\n const asOf = deps.today\n const words = deps.words ?? ((_key: string | undefined, fallback: string) => fallback)\n const { source, issue } = sourceOf(definition?.source, deps.readTargetOf, deps.detailReadOf)\n if (!source) return { issue, asOf }\n const about = { key: source.key, ...(source.labelKey ? { labelKey: source.labelKey } : {}) }\n const issues = checkDefinition(definition, source)\n if (issues.length) return { issue: issues[0], asOf, source: about }\n\n /* ① The viewer may read this source at all - a shared card gives the definition, never the data (decision 6). */\n if (!(await deps.passesDoor(rootFieldOf(source.query, 'query')))) return { issue: { code: 'door-closed' }, asOf, source: about }\n\n const read = await readSource(source, resolveWhere(definition.source.where, asOf), deps)\n if (read.issue) return { issue: read.issue, asOf, source: about }\n const rowsDef = definition.rows ?? {}\n const view = definition.view\n const columns = new Map(source.columns.map(one => [one.name, one]))\n\n /* ② Filter → group → order → cut (decision 4). */\n let rows = read.rows!.filter(row => (rowsDef.match ?? []).every(one => matches(row, columns.get(one.column)!, one.op, one.value, asOf)))\n let shaped: { rows: Row[]; columns: Shaped[] }\n if (rowsDef.groupBy) {\n const by = columns.get(rowsDef.groupBy)!\n const numbers = source.columns.filter(one => one.type === 'number' && one.name !== by.name)\n shaped = group(rows, by, numbers)\n } else shaped = splitUngrouped(rows, source.columns)\n /* A group of rows with no value in the grouped column is said as such, never drawn as a bar without a name. */\n if (rowsDef.groupBy) {\n const blank = words('ai-dashboard.card.blank', '(none)')\n shaped.rows = shaped.rows.map(row => (row[rowsDef.groupBy!] === '' ? { ...row, [rowsDef.groupBy!]: blank } : row))\n }\n rows = shaped.rows\n const shapedCount = rows.length\n\n if (rowsDef.sortBy) {\n const order = expand(shaped.columns, rowsDef.sortBy)\n /* Two currencies have no common order - ranking them would compare yen with won. */\n if (order.length > 1) return { issue: { code: 'mixed-currency-order', params: { column: rowsDef.sortBy, currencies: order.map(one => one.code) } }, asOf, source: about }\n const by = order[0].name\n rows = [...rows].sort((a, b) => (rowsDef.desc ? -compare(a[by], b[by]) : compare(a[by], b[by])))\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n const limit = Math.min(rowsDef.limit ?? cap, cap)\n if (view.kind !== 'number') rows = rows.slice(0, limit)\n\n const counts: CardCounts = { read: read.rows!.length, total: read.total!, complete: !!read.complete, shaped: shapedCount, shown: view.kind === 'number' ? shapedCount : rows.length }\n const label = (column: Shaped) => {\n const base = column.name === 'count' ? words('ai-dashboard.card.count', 'count') : words(column.labelKey, column.of ?? column.name)\n return column.code && column.of ? `${base} (${column.code})` : base\n }\n /* A unit beside the numbers: a single currency says itself, else the card's own. */\n const unitOf = (drawn: Shaped[]) => {\n const codes = [...new Set(drawn.map(one => one.code).filter(Boolean))]\n return codes.length === 1 && !drawn.some(one => one.of) ? codes[0] : view.unit\n }\n\n if (view.kind === 'number') {\n const names = view.values?.length ? view.values : []\n const drawn = names.flatMap(name => expand(shaped.columns, name))\n const items = drawn.length\n ? drawn.map(column => ({ label: label(column), value: round(rows.reduce((sum, row) => sum + (typeof row[column.name] === 'number' ? (row[column.name] as number) : 0), 0)), ...(column.code && column.code !== 'unknown' ? { unit: column.code } : view.unit ? { unit: view.unit } : {}) }))\n : [{ label: words('ai-dashboard.card.count', 'count'), value: rowsDef.groupBy ? shapedCount : rows.length, ...(view.unit ? { unit: view.unit } : {}) }]\n if (items.length > MAX_FIGURES) return { issue: { code: 'too-many-figures', params: { figures: items.length, max: MAX_FIGURES } }, asOf, source: about, counts }\n return { block: { kind: 'metrics', items }, counts, asOf, source: about }\n }\n\n if (view.kind === 'table') {\n const names = [...(view.columns ?? []), ...(view.values ?? []).filter(one => !(view.columns ?? []).includes(one))]\n const drawn = names.length ? names.flatMap(name => expand(shaped.columns, name)) : shaped.columns\n return {\n block: {\n kind: 'table',\n columns: drawn.map(column => ({ name: column.name, label: label(column), type: column.type })),\n rows: rows.map(row => Object.fromEntries(drawn.map(column => [column.name, row[column.name] ?? null])))\n },\n counts,\n asOf,\n source: about\n }\n }\n\n const x = (view.label ?? rowsDef.groupBy)!\n const values = view.values?.length ? view.values : ['count']\n const series = values.flatMap(name => expand(shaped.columns, name))\n if (series.length > MAX_SERIES) return { issue: { code: 'too-many-series', params: { series: series.length, max: MAX_SERIES } }, asOf, source: about, counts }\n return {\n block: {\n kind: 'chart',\n chart: view.kind,\n x: rows.map(row => String(row[x] ?? '').slice(0, 60)),\n series: series.map(column => ({ name: label(column), values: rows.map(row => (typeof row[column.name] === 'number' ? (row[column.name] as number) : null)) })),\n ...(unitOf(series) && unitOf(series) !== 'unknown' ? { unit: unitOf(series) } : {})\n },\n counts,\n asOf,\n source: about\n }\n}\n\n/** The columns a definition may name after its `rows` - for a refusal that says what there is. */\nexport { shapedColumnNames }\n"]}
1
+ {"version":3,"file":"card-run.js","sourceRoot":"","sources":["../../../server/service/card/card-run.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Drawing a card - its definition run as the one looking at it (ADR-0160 decisions 2, 4, 5, 6).\n *\n * The read's door is asked first, with the viewer's request; then the application's query runs with that request,\n * so the rows are those its API gives this person. The rows are filtered, grouped, ordered and cut - in that order -\n * and become one AI 작업판 block, already within what the 작업판 draws: a card that would need a ninth series or a\n * thirteenth figure is refused, never folded, so two currencies are never added on the way. Nothing is kept.\n *\n * Dependencies come in as arguments - tested without a server.\n */\nimport { filtersOf, MAX_READ_ROWS, readCriteria, readRows, rootFieldOf, rowOf, runDetail, valueAt, type ReadColumn } from '@things-factory/ai-assistant'\n\nimport {\n checkDefinition,\n MAX_CHART_POINTS,\n MAX_FIGURES,\n MAX_SERIES,\n MAX_TABLE_ROWS,\n resolveRelativeDate,\n isRelativeDate,\n resolveWhere,\n shapedColumnNames,\n sourceOf,\n type CardDefinition,\n type CardIssue,\n type CardSource\n} from './card-definition.js'\n\ntype Row = Record<string, string | number | null>\ntype Runner = (document: string, variables: Record<string, unknown>) => Promise<{ data?: any; errors?: readonly { message: string }[] }>\n\nexport interface CardRunDeps {\n readTargetOf(key: string): any\n detailReadOf(key: string): any\n /** Whether the viewer passes a door (`Query.receivables`) - their request's answer. */\n passesDoor(door: string): Promise<boolean>\n /** The application's API with the viewer's request state. */\n run: Runner\n /** Today in the domain's time zone - `YYYY-MM-DD`. */\n today: string\n /** The reader's words for a label key. */\n words?(key: string | undefined, fallback: string): string\n}\n\n/** How much of the source the card was drawn from - said on the card (decision 4). */\nexport interface CardCounts {\n /** Rows read from the source. */\n read: number\n /** Rows the source holds. */\n total: number\n /** Every row of the source was read. */\n complete: boolean\n /** Rows (or groups) after filtering and grouping, before the cut. */\n shaped: number\n /** Rows (or points) drawn. */\n shown: number\n}\n\nexport interface CardRunResult {\n /** One AI 작업판 block - metrics, table or chart. */\n block?: Record<string, unknown>\n issue?: CardIssue\n counts?: CardCounts\n /** The day relative conditions were read for. */\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\n/** A column of the shaped rows, with the currency its sums are kept in. */\ninterface Shaped extends ReadColumn {\n /** Set on a column split by currency: `remaining:USD` holds remaining in USD only. */\n of?: string\n code?: string\n}\n\nconst compare = (a: unknown, b: unknown): number => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (a === null || a === undefined) return b === null || b === undefined ? 0 : 1\n if (b === null || b === undefined) return -1\n return String(a).localeCompare(String(b))\n}\n\nfunction matches(row: Row, column: ReadColumn, op: string, given: unknown, today: string): boolean {\n const cell = row[column.name]\n if (op === 'in' || op === 'not_in') {\n const listed = (given as unknown[]).some(one => (column.type === 'number' ? Number(cell) === Number(one) : String(cell ?? '') === String(one)))\n return op === 'in' ? listed : !listed\n }\n const value = column.type === 'date' && isRelativeDate(given) ? resolveRelativeDate(given as string, today) : given\n if (op === 'eq') return column.type === 'number' ? Number(cell) === Number(value) : String(cell ?? '') === String(value)\n if (op === 'ne') return column.type === 'number' ? Number(cell) !== Number(value) : String(cell ?? '') !== String(value)\n if (cell === null || cell === undefined) return false\n /* A date column holds a day or a time - compared as text from its start, so `2026-10-01` is within `gte 2026-10-01`. */\n const order = column.type === 'number' ? Number(cell) - Number(value) : String(cell).slice(0, String(value).length).localeCompare(String(value))\n return op === 'gt' ? order > 0 : op === 'gte' ? order >= 0 : op === 'lt' ? order < 0 : order <= 0\n}\n\n/** The rows of the source, read as the viewer - or why there are none. */\nasync function readSource(source: CardSource, where: Record<string, unknown>, deps: CardRunDeps): Promise<{ rows?: Row[]; total?: number; complete?: boolean; issue?: CardIssue }> {\n if (source.kind === 'list') {\n const { criteria, refused } = readCriteria(source.target!, where)\n if (refused.length) return { issue: { code: 'condition-unreadable', params: { refused } } }\n try {\n const read = await readRows(source.target!, filtersOf(source.target!, criteria), deps.run, typeof criteria.text === 'string' && source.target!.search ? criteria.text : undefined)\n return { rows: read.rows as Row[], total: read.total, complete: read.complete }\n } catch (error: any) {\n return { issue: { code: 'query-failed', params: { message: String(error?.message ?? error) } } }\n }\n }\n const ran = await runDetail(source.detail!, where, deps.run)\n if (ran.error === 'argument-unreadable') return { issue: { code: 'condition-unreadable', params: { refused: ran.refused } } }\n if (ran.error === 'query-failed') return { issue: { code: 'query-failed', params: { message: ran.message } } }\n if (ran.error === 'not-found') return { issue: { code: 'not-found' } }\n const at = source.list!.at\n const items = at ? valueAt(ran.value, at) : ran.value\n /* An empty list is no rows; a path that holds no list is the declaration's mistake, said as such. */\n if (!Array.isArray(items)) return { issue: { code: 'list-missing', params: { read: source.key, list: source.list!.key, at } } }\n const rows = items.slice(0, MAX_READ_ROWS).map(item => rowOf({ columns: source.columns }, item) as Row)\n return { rows, total: items.length, complete: items.length <= MAX_READ_ROWS }\n}\n\n/** The currencies a currency column's rows hold - `unknown` for a row without one. */\nfunction currenciesIn(rows: Row[], column: ReadColumn): string[] {\n const codes = new Set<string>()\n for (const row of rows) codes.add(typeof row[column.currency!] === 'string' && row[column.currency!] ? String(row[column.currency!]) : 'unknown')\n return [...codes].sort()\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100\n\n/**\n * Grouped rows - the group column, a count and each number column summed. A number with a currency is summed per\n * currency; its column is split into one per currency when the rows hold more than one.\n */\nfunction group(rows: Row[], by: ReadColumn, numbers: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const splits = new Map(numbers.filter(one => one.currency).map(one => [one.name, currenciesIn(rows, one)]))\n const columns: Shaped[] = [\n { ...by, type: by.type === 'date' ? 'string' : by.type },\n { name: 'count', type: 'number' },\n ...numbers.flatMap(one => {\n const codes = splits.get(one.name)\n return codes && codes.length > 1 ? codes.map(code => ({ ...one, name: `${one.name}:${code}`, of: one.name, code })) : [{ ...one, ...(codes ? { code: codes[0] } : {}) }]\n })\n ]\n const groups = new Map<string, Row[]>()\n for (const row of rows) {\n const raw = row[by.name]\n const key = raw === null || raw === undefined ? '' : by.type === 'date' ? String(raw).slice(0, 7) : String(raw)\n groups.set(key, [...(groups.get(key) ?? []), row])\n }\n const out = [...groups].map(([key, members]) => {\n const row: Row = { [by.name]: key, count: members.length }\n for (const column of columns.slice(2)) {\n const name = column.of ?? column.name\n const kept = column.of ? members.filter(one => (one[column.currency!] || 'unknown') === column.code) : members\n row[column.name] = round(kept.reduce((sum, one) => sum + (typeof one[name] === 'number' ? (one[name] as number) : 0), 0))\n }\n return row\n })\n return { rows: out, columns }\n}\n\n/** Ungrouped rows with a number column split by currency when the rows hold more than one - each row in its own. */\nfunction splitUngrouped(rows: Row[], columns: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const shaped: Shaped[] = []\n const splits: { column: ReadColumn; codes: string[] }[] = []\n for (const column of columns) {\n const codes = column.currency ? currenciesIn(rows, column) : []\n if (codes.length > 1) {\n splits.push({ column, codes })\n shaped.push(...codes.map(code => ({ ...column, name: `${column.name}:${code}`, of: column.name, code })))\n } else shaped.push({ ...column, ...(codes.length ? { code: codes[0] } : {}) })\n }\n if (!splits.length) return { rows, columns: shaped }\n return {\n rows: rows.map(row => {\n const out: Row = { ...row }\n for (const { column, codes } of splits) {\n const mine = (row[column.currency!] as string) || 'unknown'\n for (const code of codes) out[`${column.name}:${code}`] = code === mine ? row[column.name] : null\n }\n return out\n }),\n columns: shaped\n }\n}\n\n/** The shaped columns a definition's name stands for - one, or one per currency when it was split. */\nconst expand = (columns: Shaped[], name: string) => columns.filter(one => one.name === name || one.of === name)\n\n/** Runs a card's definition as the viewer and draws it as one block. */\nexport async function runCard(definition: CardDefinition, deps: CardRunDeps): Promise<CardRunResult> {\n const asOf = deps.today\n const words = deps.words ?? ((_key: string | undefined, fallback: string) => fallback)\n const { source, issue } = sourceOf(definition?.source, deps.readTargetOf, deps.detailReadOf)\n if (!source) return { issue, asOf }\n const about = { key: source.key, ...(source.labelKey ? { labelKey: source.labelKey } : {}) }\n const issues = checkDefinition(definition, source)\n if (issues.length) return { issue: issues[0], asOf, source: about }\n\n /* ① The viewer may read this source at all - a shared card gives the definition, never the data (decision 6). */\n if (!(await deps.passesDoor(rootFieldOf(source.query, 'query')))) return { issue: { code: 'door-closed' }, asOf, source: about }\n\n const read = await readSource(source, resolveWhere(definition.source.where, asOf, source.conditions), deps)\n if (read.issue) return { issue: read.issue, asOf, source: about }\n const rowsDef = definition.rows ?? {}\n const view = definition.view\n const columns = new Map(source.columns.map(one => [one.name, one]))\n\n /* ② Filter → group → order → cut (decision 4). */\n let rows = read.rows!.filter(row => (rowsDef.match ?? []).every(one => matches(row, columns.get(one.column)!, one.op, one.value, asOf)))\n let shaped: { rows: Row[]; columns: Shaped[] }\n if (rowsDef.groupBy) {\n const by = columns.get(rowsDef.groupBy)!\n const numbers = source.columns.filter(one => one.type === 'number' && one.name !== by.name)\n shaped = group(rows, by, numbers)\n } else shaped = splitUngrouped(rows, source.columns)\n /* A group of rows with no value in the grouped column is said as such, never drawn as a bar without a name. */\n if (rowsDef.groupBy) {\n const blank = words('ai-dashboard.card.blank', '(none)')\n shaped.rows = shaped.rows.map(row => (row[rowsDef.groupBy!] === '' ? { ...row, [rowsDef.groupBy!]: blank } : row))\n }\n rows = shaped.rows\n const shapedCount = rows.length\n\n if (rowsDef.sortBy) {\n const order = expand(shaped.columns, rowsDef.sortBy)\n /* Two currencies have no common order - ranking them would compare yen with won. */\n if (order.length > 1) return { issue: { code: 'mixed-currency-order', params: { column: rowsDef.sortBy, currencies: order.map(one => one.code) } }, asOf, source: about }\n const by = order[0].name\n rows = [...rows].sort((a, b) => (rowsDef.desc ? -compare(a[by], b[by]) : compare(a[by], b[by])))\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n const limit = Math.min(rowsDef.limit ?? cap, cap)\n if (view.kind !== 'number') rows = rows.slice(0, limit)\n\n const counts: CardCounts = { read: read.rows!.length, total: read.total!, complete: !!read.complete, shaped: shapedCount, shown: view.kind === 'number' ? shapedCount : rows.length }\n const label = (column: Shaped) => {\n const base = column.name === 'count' ? words('ai-dashboard.card.count', 'count') : words(column.labelKey, column.of ?? column.name)\n return column.code && column.of ? `${base} (${column.code})` : base\n }\n /* A unit beside the numbers: a single currency says itself, else the card's own. */\n const unitOf = (drawn: Shaped[]) => {\n const codes = [...new Set(drawn.map(one => one.code).filter(Boolean))]\n return codes.length === 1 && !drawn.some(one => one.of) ? codes[0] : view.unit\n }\n\n if (view.kind === 'number') {\n const names = view.values?.length ? view.values : []\n const drawn = names.flatMap(name => expand(shaped.columns, name))\n const items = drawn.length\n ? drawn.map(column => ({ label: label(column), value: round(rows.reduce((sum, row) => sum + (typeof row[column.name] === 'number' ? (row[column.name] as number) : 0), 0)), ...(column.code && column.code !== 'unknown' ? { unit: column.code } : view.unit ? { unit: view.unit } : {}) }))\n : [{ label: words('ai-dashboard.card.count', 'count'), value: rowsDef.groupBy ? shapedCount : rows.length, ...(view.unit ? { unit: view.unit } : {}) }]\n if (items.length > MAX_FIGURES) return { issue: { code: 'too-many-figures', params: { figures: items.length, max: MAX_FIGURES } }, asOf, source: about, counts }\n return { block: { kind: 'metrics', items }, counts, asOf, source: about }\n }\n\n if (view.kind === 'table') {\n const names = [...(view.columns ?? []), ...(view.values ?? []).filter(one => !(view.columns ?? []).includes(one))]\n const drawn = names.length ? names.flatMap(name => expand(shaped.columns, name)) : shaped.columns\n return {\n block: {\n kind: 'table',\n columns: drawn.map(column => ({ name: column.name, label: label(column), type: column.type })),\n rows: rows.map(row => Object.fromEntries(drawn.map(column => [column.name, row[column.name] ?? null])))\n },\n counts,\n asOf,\n source: about\n }\n }\n\n const x = (view.label ?? rowsDef.groupBy)!\n const values = view.values?.length ? view.values : ['count']\n const series = values.flatMap(name => expand(shaped.columns, name))\n if (series.length > MAX_SERIES) return { issue: { code: 'too-many-series', params: { series: series.length, max: MAX_SERIES } }, asOf, source: about, counts }\n return {\n block: {\n kind: 'chart',\n chart: view.kind,\n x: rows.map(row => String(row[x] ?? '').slice(0, 60)),\n series: series.map(column => ({ name: label(column), values: rows.map(row => (typeof row[column.name] === 'number' ? (row[column.name] as number) : null)) })),\n ...(unitOf(series) && unitOf(series) !== 'unknown' ? { unit: unitOf(series) } : {})\n },\n counts,\n asOf,\n source: about\n }\n}\n\n/** The columns a definition may name after its `rows` - for a refusal that says what there is. */\nexport { shapedColumnNames }\n"]}