@flowselections/logistiek-engine 1.0.34 → 1.0.53

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 (160) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/components/FlowCanvas.d.ts +28 -0
  3. package/dist-lib/components/FlowCanvas.d.ts.map +1 -0
  4. package/dist-lib/components/FlowCanvas.js +429 -0
  5. package/dist-lib/components/FlowOrders.d.ts +8 -0
  6. package/dist-lib/components/FlowOrders.d.ts.map +1 -0
  7. package/dist-lib/components/FlowOrders.js +125 -0
  8. package/dist-lib/components/FlowPage.d.ts +2 -0
  9. package/dist-lib/components/FlowPage.d.ts.map +1 -0
  10. package/dist-lib/components/FlowPage.js +141 -0
  11. package/dist-lib/components/InklapbaarVenster.d.ts +9 -0
  12. package/dist-lib/components/InklapbaarVenster.d.ts.map +1 -0
  13. package/dist-lib/components/InklapbaarVenster.js +10 -0
  14. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  15. package/dist-lib/components/LogistiekEnginePage.js +9 -3
  16. package/dist-lib/components/LogistiekEngineQueuePage.d.ts +2 -0
  17. package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -0
  18. package/dist-lib/components/LogistiekEngineQueuePage.js +11 -0
  19. package/dist-lib/components/NodeTracePanel.d.ts +11 -0
  20. package/dist-lib/components/NodeTracePanel.d.ts.map +1 -0
  21. package/dist-lib/components/NodeTracePanel.js +40 -0
  22. package/dist-lib/components/OrderJourneyBar.d.ts +9 -0
  23. package/dist-lib/components/OrderJourneyBar.d.ts.map +1 -0
  24. package/dist-lib/components/OrderJourneyBar.js +26 -0
  25. package/dist-lib/components/OrderLogboek.d.ts +10 -0
  26. package/dist-lib/components/OrderLogboek.d.ts.map +1 -0
  27. package/dist-lib/components/OrderLogboek.js +92 -0
  28. package/dist-lib/components/OrderStopBanner.d.ts +5 -0
  29. package/dist-lib/components/OrderStopBanner.d.ts.map +1 -0
  30. package/dist-lib/components/OrderStopBanner.js +22 -0
  31. package/dist-lib/components/OrderTraceDetails.d.ts +22 -0
  32. package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -0
  33. package/dist-lib/components/OrderTraceDetails.js +87 -0
  34. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  35. package/dist-lib/components/RegiePage.js +11 -69
  36. package/dist-lib/components/WerktijdenCard.d.ts +2 -0
  37. package/dist-lib/components/WerktijdenCard.d.ts.map +1 -0
  38. package/dist-lib/components/WerktijdenCard.js +37 -0
  39. package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
  40. package/dist-lib/components/WerkwijzeHerindelingCard.js +100 -6
  41. package/dist-lib/hooks/useLogisticsTrace.d.ts +78 -0
  42. package/dist-lib/hooks/useLogisticsTrace.d.ts.map +1 -0
  43. package/dist-lib/hooks/useLogisticsTrace.js +152 -0
  44. package/dist-lib/hooks/useOrderNodeTrace.d.ts +11 -0
  45. package/dist-lib/hooks/useOrderNodeTrace.d.ts.map +1 -0
  46. package/dist-lib/hooks/useOrderNodeTrace.js +26 -0
  47. package/dist-lib/hooks/useOrderTrace.d.ts +74 -0
  48. package/dist-lib/hooks/useOrderTrace.d.ts.map +1 -0
  49. package/dist-lib/hooks/useOrderTrace.js +134 -0
  50. package/dist-lib/hooks/useOrderVersies.d.ts +47 -0
  51. package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -0
  52. package/dist-lib/hooks/useOrderVersies.js +180 -0
  53. package/dist-lib/hooks/useRuleEngine.d.ts +1 -0
  54. package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -1
  55. package/dist-lib/hooks/useRuleEngine.js +1 -0
  56. package/dist-lib/hooks/useShippingNoteStatus.d.ts +29 -0
  57. package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -0
  58. package/dist-lib/hooks/useShippingNoteStatus.js +107 -0
  59. package/dist-lib/hooks/useWerktijden.d.ts +33 -0
  60. package/dist-lib/hooks/useWerktijden.d.ts.map +1 -0
  61. package/dist-lib/hooks/useWerktijden.js +88 -0
  62. package/dist-lib/hooks/useWerkwijzeStatus.d.ts +12 -1
  63. package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
  64. package/dist-lib/hooks/useWerkwijzeStatus.js +60 -4
  65. package/dist-lib/index.d.ts +13 -0
  66. package/dist-lib/index.d.ts.map +1 -1
  67. package/dist-lib/index.js +13 -0
  68. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1600 -54
  69. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  70. package/dist-lib/integrations/supabase/client.server.d.ts +1600 -54
  71. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  72. package/dist-lib/integrations/supabase/client.server.js +1 -1
  73. package/dist-lib/integrations/supabase/moduleClient.d.ts +1600 -54
  74. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  75. package/dist-lib/integrations/supabase/types.d.ts +1618 -50
  76. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  77. package/dist-lib/lib/cartPlanRequests.server.d.ts +1 -1
  78. package/dist-lib/lib/cartPlanRequests.server.d.ts.map +1 -1
  79. package/dist-lib/lib/cartPlanRequests.server.js +49 -8
  80. package/dist-lib/lib/floridayDocuments.functions.d.ts +4644 -6
  81. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  82. package/dist-lib/lib/floridayDocuments.functions.js +1 -1
  83. package/dist-lib/lib/floridayDocuments.server.d.ts +14 -0
  84. package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -1
  85. package/dist-lib/lib/floridayDocuments.server.js +58 -0
  86. package/dist-lib/lib/floridayGuard.server.d.ts +1 -1
  87. package/dist-lib/lib/floridayGuard.server.d.ts.map +1 -1
  88. package/dist-lib/lib/floridayGuard.server.js +6 -3
  89. package/dist-lib/lib/floridayPush.functions.d.ts +1600 -54
  90. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  91. package/dist-lib/lib/floridayPush.functions.js +1 -1
  92. package/dist-lib/lib/flowGraph.d.ts +43 -0
  93. package/dist-lib/lib/flowGraph.d.ts.map +1 -0
  94. package/dist-lib/lib/flowGraph.js +153 -0
  95. package/dist-lib/lib/flowNodes.d.ts +23 -0
  96. package/dist-lib/lib/flowNodes.d.ts.map +1 -0
  97. package/dist-lib/lib/flowNodes.js +58 -0
  98. package/dist-lib/lib/flowRoute.d.ts +107 -0
  99. package/dist-lib/lib/flowRoute.d.ts.map +1 -0
  100. package/dist-lib/lib/flowRoute.js +280 -0
  101. package/dist-lib/lib/flowTree.d.ts +64 -0
  102. package/dist-lib/lib/flowTree.d.ts.map +1 -0
  103. package/dist-lib/lib/flowTree.js +519 -0
  104. package/dist-lib/lib/handlers/index.d.ts +1 -0
  105. package/dist-lib/lib/handlers/index.d.ts.map +1 -1
  106. package/dist-lib/lib/handlers/index.js +1 -0
  107. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts +3 -0
  108. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -0
  109. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +100 -0
  110. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  111. package/dist-lib/lib/handlers/logistics-tick.server.js +97 -2
  112. package/dist-lib/lib/loadCarrierPlanner.d.ts +2 -0
  113. package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
  114. package/dist-lib/lib/loadCarrierPlanner.js +18 -0
  115. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +7740 -10
  116. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  117. package/dist-lib/lib/loadCarrierPlanning.functions.js +1 -1
  118. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +9 -0
  119. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  120. package/dist-lib/lib/loadCarrierPlanning.server.js +44 -17
  121. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
  122. package/dist-lib/lib/logisticsPlanner.js +14 -2
  123. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +3096 -4
  124. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  125. package/dist-lib/lib/logisticsRecalcJob.functions.js +1 -1
  126. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +1600 -54
  127. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  128. package/dist-lib/lib/logisticsRecalculate.functions.js +1 -1
  129. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  130. package/dist-lib/lib/modulePrompts.js +3459 -2677
  131. package/dist-lib/lib/nodeTrace.d.ts +61 -0
  132. package/dist-lib/lib/nodeTrace.d.ts.map +1 -0
  133. package/dist-lib/lib/nodeTrace.js +191 -0
  134. package/dist-lib/lib/pickQueueCleanup.server.d.ts +14 -0
  135. package/dist-lib/lib/pickQueueCleanup.server.d.ts.map +1 -0
  136. package/dist-lib/lib/pickQueueCleanup.server.js +80 -0
  137. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  138. package/dist-lib/lib/planQueue.server.js +140 -0
  139. package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -1
  140. package/dist-lib/lib/ruleEngineImpact.js +11 -4
  141. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  142. package/dist-lib/lib/ruleEngineSchema.js +50 -6
  143. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
  144. package/dist-lib/lib/ruleEngineWizard.js +3 -1
  145. package/dist-lib/lib/shippingNoteQueue.server.d.ts +18 -0
  146. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -0
  147. package/dist-lib/lib/shippingNoteQueue.server.js +304 -0
  148. package/dist-lib/lib/trace.server.d.ts +75 -0
  149. package/dist-lib/lib/trace.server.d.ts.map +1 -0
  150. package/dist-lib/lib/trace.server.js +75 -0
  151. package/dist-lib/lib/vakUitleg.d.ts +19 -0
  152. package/dist-lib/lib/vakUitleg.d.ts.map +1 -0
  153. package/dist-lib/lib/vakUitleg.js +132 -0
  154. package/package.json +26 -2
  155. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
  156. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
  157. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
  158. package/dist-lib/integrations/supabase/client.d.ts +0 -20293
  159. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  160. package/dist-lib/integrations/supabase/client.js +0 -13
@@ -0,0 +1,132 @@
1
+ // ============================================================================
2
+ // src/lib/vakUitleg.ts — wat is er in dit vakje besloten, en waarom
3
+ // ============================================================================
4
+ // Eén bron van uitleg voor zowel het vakje op de flowkaart als het zijpaneel.
5
+ // Alleen lezen: hier wordt niets bepaald, alleen leesbaar gemaakt.
6
+ // ============================================================================
7
+ import { FLOW_NODE } from "./flowNodes";
8
+ import { isAutomatisch } from "./nodeTrace";
9
+ const LABELS = {
10
+ aanmeldmoment: "Aanmeldmoment",
11
+ nu: "Huidige tijd",
12
+ huidigeTijd: "Huidige tijd",
13
+ lagen: "Lagen",
14
+ maxPerKar: "Max. per kar",
15
+ karren: "Karren",
16
+ methode: "Methode",
17
+ deelkar: "Deelkar",
18
+ pickdatum: "Pickdatum",
19
+ pogingen: "Pogingen",
20
+ buffer: "Buffer",
21
+ klant: "Klant",
22
+ };
23
+ function labelVan(sleutel) {
24
+ if (LABELS[sleutel])
25
+ return LABELS[sleutel];
26
+ const met = sleutel.replace(/[_-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2");
27
+ return met.charAt(0).toUpperCase() + met.slice(1);
28
+ }
29
+ function waardeVan(v) {
30
+ if (v === null || v === undefined || v === "")
31
+ return null;
32
+ if (typeof v === "boolean")
33
+ return v ? "ja" : "nee";
34
+ if (typeof v === "number")
35
+ return String(v);
36
+ if (typeof v === "string")
37
+ return v.length > 60 ? `${v.slice(0, 57)}…` : v;
38
+ return null;
39
+ }
40
+ function paren(bron, uit, gezien) {
41
+ if (!bron || typeof bron !== "object" || Array.isArray(bron))
42
+ return;
43
+ for (const [sleutel, waarde] of Object.entries(bron)) {
44
+ const tekst = waardeVan(waarde);
45
+ if (!tekst)
46
+ continue;
47
+ const label = labelVan(sleutel);
48
+ if (gezien.has(label))
49
+ continue;
50
+ gezien.add(label);
51
+ uit.push(`${label}: ${tekst}`);
52
+ }
53
+ }
54
+ /** Leesbare zin wanneer de Engine (nog) geen besluit vastlegde. */
55
+ function afgeleideBeslissing(groep, laatste) {
56
+ const tabel = (laatste?.dbTable ?? "").toLowerCase();
57
+ const actie = (laatste?.dbAction ?? "").toUpperCase();
58
+ if (tabel === "logistics_plan_queue") {
59
+ if (actie === "INSERT")
60
+ return "Order aangemeld voor indeling";
61
+ if (groep.status === "mislukt")
62
+ return "Indeling mislukt";
63
+ if (groep.status === "wachtend")
64
+ return "Wacht op de planronde";
65
+ return "Indeling bijgewerkt";
66
+ }
67
+ if (groep.nodeId === FLOW_NODE.eind)
68
+ return "Order afgehandeld";
69
+ if (groep.status === "mislukt")
70
+ return "Hier is de order vastgelopen";
71
+ if (groep.status === "wachtend")
72
+ return "Order wacht in deze stap";
73
+ if (groep.status === "overgeslagen")
74
+ return "Deze stap is overgeslagen";
75
+ return "Deze stap is doorlopen";
76
+ }
77
+ /**
78
+ * Maakt van de gebeurtenissen van één vakje een vaste uitleg:
79
+ * welke keuze is gemaakt, waarom, en welke gegevens dat bepaalden.
80
+ */
81
+ export function vakUitleg(groep) {
82
+ const events = Array.isArray(groep.events) ? groep.events : [];
83
+ const engine = events.filter((e) => !isAutomatisch(e));
84
+ const relevant = engine.length > 0 ? engine : events;
85
+ const laatste = relevant[relevant.length - 1] ?? null;
86
+ const laatsteMet = (kies) => {
87
+ for (let i = relevant.length - 1; i >= 0; i--) {
88
+ const ev = relevant[i];
89
+ if (!ev)
90
+ continue;
91
+ const v = kies(ev);
92
+ if (v !== null && v !== undefined && v !== "")
93
+ return v;
94
+ }
95
+ return null;
96
+ };
97
+ const besluit = laatsteMet((e) => e.decision);
98
+ const fout = [...relevant].reverse().find((e) => e.status === "mislukt") ?? null;
99
+ const reden = laatsteMet((e) => e.reason) ?? fout?.error ?? groep.reden ?? null;
100
+ const regel = laatsteMet((e) => e.rule);
101
+ const calc = laatsteMet((e) => (e.calc && typeof e.calc === "object" ? e.calc : null));
102
+ const feiten = [];
103
+ const gezien = new Set();
104
+ if (calc) {
105
+ paren(calc["values"], feiten, gezien);
106
+ const rekenstap = waardeVan(calc["formula"]);
107
+ if (rekenstap && !gezien.has("Rekenstap")) {
108
+ gezien.add("Rekenstap");
109
+ feiten.push(`Rekenstap: ${rekenstap}`);
110
+ }
111
+ const uitkomst = waardeVan(calc["result"]);
112
+ if (uitkomst && !gezien.has("Uitkomst")) {
113
+ gezien.add("Uitkomst");
114
+ feiten.push(`Uitkomst: ${uitkomst}`);
115
+ }
116
+ const instelling = waardeVan(calc["setting"]);
117
+ if (instelling && !gezien.has("Instelling")) {
118
+ gezien.add("Instelling");
119
+ feiten.push(`Instelling: ${instelling}`);
120
+ }
121
+ }
122
+ paren(laatsteMet((e) => e.values), feiten, gezien);
123
+ if (groep.pogingen > 1)
124
+ feiten.push(`Pogingen: ${groep.pogingen}`);
125
+ return {
126
+ beslissing: besluit ?? afgeleideBeslissing(groep, laatste),
127
+ waarom: reden,
128
+ feiten,
129
+ regel: regel ?? null,
130
+ afgeleid: !besluit,
131
+ };
132
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/logistiek-engine",
3
- "version": "1.0.34",
3
+ "version": "1.0.53",
4
4
  "flowselections": {
5
5
  "moduleId": "logistiek-engine",
6
6
  "pages": [
@@ -32,7 +32,20 @@
32
32
  "route": "logistiek-engine/ladingdragers",
33
33
  "title": "Ladingdragers",
34
34
  "nav": false
35
+ },
36
+ {
37
+ "export": "LogistiekEngineQueuePage",
38
+ "route": "logistiek-engine/queue",
39
+ "title": "Queue"
40
+ },
41
+ {
42
+ "export": "FlowPage",
43
+ "route": "logistiek-engine/flow",
44
+ "title": "Flow"
35
45
  }
46
+
47
+
48
+
36
49
  ],
37
50
  "serverRoutes": [
38
51
  {
@@ -43,6 +56,15 @@
43
56
  "POST",
44
57
  "OPTIONS"
45
58
  ]
59
+ },
60
+ {
61
+ "routePath": "/api/public/hooks/logistics-shipping-note-now",
62
+ "import": "@flowselections/logistiek-engine/hooks",
63
+ "handler": "handleShippingNoteNow",
64
+ "methods": [
65
+ "POST",
66
+ "OPTIONS"
67
+ ]
46
68
  }
47
69
  ]
48
70
  },
@@ -90,8 +112,10 @@
90
112
  "@flowselections/floriday-authenticatie-module": "^1.0.30"
91
113
  },
92
114
  "dependencies": {
115
+ "@dagrejs/dagre": "^3.1.1",
116
+ "@flowselections/floriday-authenticatie-module": "^1.0.30",
93
117
  "@supabase/supabase-js": "^2.111.0",
94
- "@flowselections/floriday-authenticatie-module": "^1.0.30"
118
+ "@xyflow/react": "^12.11.6"
95
119
  },
96
120
  "devDependencies": {
97
121
  "@cloudflare/vite-plugin": "^1.25.5",
@@ -1,2 +0,0 @@
1
- export declare function FloridayConnectionBanner(): import("react").JSX.Element;
2
- //# sourceMappingURL=FloridayConnectionBanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FloridayConnectionBanner.d.ts","sourceRoot":"","sources":["../../../src/components/rule-engine/FloridayConnectionBanner.tsx"],"names":[],"mappings":"AAYA,wBAAgB,wBAAwB,gCAwDvC"}
@@ -1,41 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // ============================================================================
3
- // src/components/rule-engine/FloridayConnectionBanner.tsx
4
- // Toont welke Floriday-koppeling de documenten levert. De gegevens komen
5
- // volledig uit de authenticatie-module; deze module kiest niets zelf.
6
- // ============================================================================
7
- import { useQuery } from "@tanstack/react-query";
8
- import { Badge, Skeleton } from "@flowselections/core";
9
- import { AlertTriangle, Link2 } from "lucide-react";
10
- import { supabase } from "../../integrations/supabase/client";
11
- import { getFloridayConnection } from "../../lib/floridayDocuments.functions";
12
- export function FloridayConnectionBanner() {
13
- const { data, isLoading } = useQuery({
14
- queryKey: ["floriday-connection"],
15
- queryFn: async () => {
16
- try {
17
- // Zonder sessie geeft de server-function een 401-Response terug; die
18
- // mag nooit als throw naar de router lekken (blanco scherm).
19
- const { data: sessionData } = await supabase.auth.getSession();
20
- if (!sessionData.session) {
21
- return { ok: false, error: "Geen actieve sessie." };
22
- }
23
- return await getFloridayConnection();
24
- }
25
- catch (e) {
26
- // Geen sessie of gateway-fout: banner toont de foutstaat, geen crash.
27
- const message = e instanceof Response ? `HTTP ${e.status}` : String(e?.message ?? e);
28
- return { ok: false, error: message };
29
- }
30
- },
31
- retry: false,
32
- staleTime: 60000,
33
- });
34
- if (isLoading)
35
- return _jsx(Skeleton, { className: "h-14 w-full rounded-lg" });
36
- if (!data || data.ok !== true) {
37
- return (_jsxs("div", { className: "flex items-start gap-3 rounded-lg border border-destructive/40 bg-destructive/5 p-3", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 text-destructive" }), _jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "font-medium text-destructive", children: "Geen actieve Floriday-koppeling" }), _jsx("p", { className: "text-muted-foreground", children: "Documenten kunnen niet worden opgehaald zolang de Floriday-authenticatiemodule geen actieve koppeling heeft." })] })] }));
38
- }
39
- const c = data.connection;
40
- return (_jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-lg border border-border bg-muted/40 p-3", children: [_jsx(Link2, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("div", { className: "text-sm", children: [_jsx("span", { className: "font-medium", children: c?.label ?? c?.organization_name ?? "Floriday" }), c?.gln_code && _jsxs("span", { className: "text-muted-foreground", children: [" \u00B7 GLN ", c.gln_code] })] }), _jsx(Badge, { variant: data.environment === "live" ? "default" : "secondary", children: data.environment === "live" ? "Live" : "Staging" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Documenten worden opgehaald via de Floriday-authenticatiemodule." })] }));
41
- }