fixtureqa 0.3.2__tar.gz → 0.3.4__tar.gz

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 (94) hide show
  1. {fixtureqa-0.3.2/fixtureqa.egg-info → fixtureqa-0.3.4}/PKG-INFO +1 -1
  2. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/fix_builder.py +2 -2
  3. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_payload.py +14 -8
  4. fixtureqa-0.3.2/fixture/static/assets/index-CRwrc-Pi.js → fixtureqa-0.3.4/fixture/static/assets/index-BYDmHEr1.js +1 -1
  5. fixtureqa-0.3.2/fixture/static/assets/index-WkbDd3YE.css → fixtureqa-0.3.4/fixture/static/assets/index-D9vW5wFo.css +1 -1
  6. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/static/index.html +2 -2
  7. {fixtureqa-0.3.2 → fixtureqa-0.3.4/fixtureqa.egg-info}/PKG-INFO +1 -1
  8. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixtureqa.egg-info/SOURCES.txt +2 -2
  9. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/pyproject.toml +1 -1
  10. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_perf_payload.py +27 -0
  11. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/LICENSE +0 -0
  12. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/README.md +0 -0
  13. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/__init__.py +0 -0
  14. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/__main__.py +0 -0
  15. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/__init__.py +0 -0
  16. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/app.py +0 -0
  17. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/connection_manager.py +0 -0
  18. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/deps.py +0 -0
  19. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/__init__.py +0 -0
  20. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/admin.py +0 -0
  21. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/auth.py +0 -0
  22. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/branding.py +0 -0
  23. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/custom_tags.py +0 -0
  24. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/fix_spec.py +0 -0
  25. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/messages.py +0 -0
  26. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/perf.py +0 -0
  27. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/scenarios.py +0 -0
  28. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/sessions.py +0 -0
  29. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/setup.py +0 -0
  30. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/spec_overlay.py +0 -0
  31. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/templates.py +0 -0
  32. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/routers/ws.py +0 -0
  33. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/api/schemas.py +0 -0
  34. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/config/__init__.py +0 -0
  35. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/__init__.py +0 -0
  36. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/atomic_io.py +0 -0
  37. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/auth.py +0 -0
  38. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/config_store.py +0 -0
  39. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/custom_tag_store.py +0 -0
  40. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/db_migrations.py +0 -0
  41. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/events.py +0 -0
  42. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/fix_application.py +0 -0
  43. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/fix_parser.py +0 -0
  44. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/fix_spec_parser.py +0 -0
  45. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/fix_tags.py +0 -0
  46. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/housekeeping.py +0 -0
  47. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/inbound.py +0 -0
  48. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/message_log.py +0 -0
  49. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/message_store.py +0 -0
  50. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/models.py +0 -0
  51. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_engine.py +0 -0
  52. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_models.py +0 -0
  53. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_stats.py +0 -0
  54. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_store.py +0 -0
  55. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/perf_writer.py +0 -0
  56. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/scenario_runner.py +0 -0
  57. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/scenario_store.py +0 -0
  58. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/session.py +0 -0
  59. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/session_manager.py +0 -0
  60. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/spec_overlay_store.py +0 -0
  61. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/template_store.py +0 -0
  62. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/user_store.py +0 -0
  63. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/core/venue_responses.py +0 -0
  64. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/fix_specs/FIX42.xml +0 -0
  65. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/fix_specs/FIX44.xml +0 -0
  66. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/server.py +0 -0
  67. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/static/assets/ag-grid-_QKprVdm.js +0 -0
  68. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/static/assets/react-vendor-2eF0YfZT.js +0 -0
  69. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/static/favicon.svg +0 -0
  70. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixture/ui/__init__.py +0 -0
  71. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixtureqa.egg-info/dependency_links.txt +0 -0
  72. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixtureqa.egg-info/entry_points.txt +0 -0
  73. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixtureqa.egg-info/requires.txt +0 -0
  74. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/fixtureqa.egg-info/top_level.txt +0 -0
  75. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/setup.cfg +0 -0
  76. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_atomic_io.py +0 -0
  77. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_auth.py +0 -0
  78. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_connection_manager.py +0 -0
  79. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_db_migrations.py +0 -0
  80. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_fix_builder.py +0 -0
  81. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_health.py +0 -0
  82. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_inbound.py +0 -0
  83. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_inbound_validation.py +0 -0
  84. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_message_store.py +0 -0
  85. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_perf_api.py +0 -0
  86. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_perf_engine.py +0 -0
  87. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_perf_models.py +0 -0
  88. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_perf_rehydrate.py +0 -0
  89. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_scenarios.py +0 -0
  90. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_session_lifecycle.py +0 -0
  91. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_session_manager_concurrency.py +0 -0
  92. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_sessions.py +0 -0
  93. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_templates.py +0 -0
  94. {fixtureqa-0.3.2 → fixtureqa-0.3.4}/tests/test_ws.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixtureqa
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: FIXture — FIX Protocol Testing Tool
5
5
  Requires-Python: >=3.10
6
6
  License-File: LICENSE
@@ -23,7 +23,7 @@ from fixcore.message import DataDictionary, Group, GroupDef, Message
23
23
  SOH = "\x01"
24
24
 
25
25
  # Tags the transport owns; never copied from the user's raw into the body.
26
- _CONTROL_TAGS = frozenset({8, 9, 10, 34, 49, 52, 56})
26
+ CONTROL_TAGS = frozenset({8, 9, 10, 34, 49, 52, 56})
27
27
  _MSG_TYPE = 35
28
28
  _TRANSACT_TIME = 60
29
29
 
@@ -57,7 +57,7 @@ def build_message_from_raw(
57
57
  if not msg_type:
58
58
  raise ValueError("Missing MsgType (tag 35)")
59
59
 
60
- body = [(t, v) for t, v in pairs if t != _MSG_TYPE and t not in _CONTROL_TAGS]
60
+ body = [(t, v) for t, v in pairs if t != _MSG_TYPE and t not in CONTROL_TAGS]
61
61
  if transact_time is not None and not any(t == _TRANSACT_TIME for t, _ in body):
62
62
  body.insert(0, (_TRANSACT_TIME, transact_time))
63
63
 
@@ -28,6 +28,7 @@ from typing import Optional
28
28
 
29
29
  from fixcore.message.message import Message
30
30
 
31
+ from .fix_builder import CONTROL_TAGS
31
32
  from .perf_models import RunConfig, ScenarioConfig
32
33
 
33
34
  _TOKEN_RE = re.compile(r"\{([^}]+)\}")
@@ -94,10 +95,7 @@ class PayloadFactory:
94
95
  tpl = self._ts.get_template(self._uid, tpl_id) if self._ts else None
95
96
  if tpl is None:
96
97
  raise PerfConfigError(f"template {tpl_id!r} not found for scenario {scn.name!r}")
97
- try:
98
- fields = {int(k): str(v) for k, v in tpl.get("fields", {}).items()}
99
- except (TypeError, ValueError):
100
- raise PerfConfigError(f"template {tpl_id!r} has non-integer tags")
98
+ fields = self._parse_fields(tpl, tpl_id)
101
99
  self._templates[tpl_id] = fields
102
100
  for val in fields.values():
103
101
  for tok in _tokens(val):
@@ -116,10 +114,7 @@ class PayloadFactory:
116
114
  tpl = self._ts.get_template(self._uid, tpl_id) if self._ts else None
117
115
  if tpl is None:
118
116
  raise PerfConfigError(f"{label} template {tpl_id!r} not found")
119
- try:
120
- fields = {int(k): str(v) for k, v in tpl.get("fields", {}).items()}
121
- except (TypeError, ValueError):
122
- raise PerfConfigError(f"{label} template {tpl_id!r} has non-integer tags")
117
+ fields = self._parse_fields(tpl, tpl_id, label)
123
118
  vars_ = self.config.payload.variables
124
119
  for val in fields.values():
125
120
  for tok in _tokens(val):
@@ -130,6 +125,17 @@ class PayloadFactory:
130
125
  raise PerfConfigError(f"unknown token {{{tok}}} in {label} template {tpl_id!r}")
131
126
  return fields
132
127
 
128
+ def _parse_fields(self, tpl: dict, tpl_id: str, label: str = "") -> dict[int, str]:
129
+ try:
130
+ fields = {int(k): str(v) for k, v in tpl.get("fields", {}).items()}
131
+ except (TypeError, ValueError):
132
+ what = f"{label} template" if label else "template"
133
+ raise PerfConfigError(f"{what} {tpl_id!r} has non-integer tags")
134
+ # Templates saved from composed raw keep transport-owned header tags
135
+ # (8/9/10/34/49/52/56). The session stamps those on send, so copying
136
+ # them into the body would duplicate them on the wire.
137
+ return {t: v for t, v in fields.items() if t not in CONTROL_TAGS}
138
+
133
139
  def _validate_token(self, tok: str, scn: ScenarioConfig, tpl_id: str,
134
140
  seen: list[str], vars_: dict) -> None:
135
141
  if tok in _SIMPLE or tok in vars_:
@@ -33,7 +33,7 @@ Please change the parent <Route path="${b}"> to <Route path="${b==="/"?"*":`${b}
33
33
  *
34
34
  * This source code is licensed under the MIT license found in the
35
35
  * LICENSE file in the root directory of this source tree.
36
- */var Mo=m,NS=PS;function CS(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var ES=typeof Object.is=="function"?Object.is:CS,AS=NS.useSyncExternalStore,IS=Mo.useRef,kS=Mo.useEffect,TS=Mo.useMemo,DS=Mo.useDebugValue;fv.useSyncExternalStoreWithSelector=function(e,t,r,n,a){var i=IS(null);if(i.current===null){var o={hasValue:!1,value:null};i.current=o}else o=i.current;i=TS(function(){function l(p){if(!u){if(u=!0,d=p,p=n(p),a!==void 0&&o.hasValue){var v=o.value;if(a(v,p))return f=v}return f=p}if(v=f,ES(d,p))return v;var y=n(p);return a!==void 0&&a(v,y)?(d=p,v):(d=p,f=y)}var u=!1,d,f,h=r===void 0?null:r;return[function(){return l(t())},h===null?void 0:function(){return l(h())}]},[t,r,n,a]);var s=AS(e,i[0],i[1]);return kS(function(){o.hasValue=!0,o.value=s},[s]),DS(s),s};dv.exports=fv;var pv=dv.exports;const MS=_r(pv),vv={},{useDebugValue:RS}=Hp,{useSyncExternalStoreWithSelector:$S}=MS;let Ld=!1;const LS=e=>e;function FS(e,t=LS,r){(vv?"production":void 0)!=="production"&&r&&!Ld&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),Ld=!0);const n=$S(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return RS(n),n}const Fd=e=>{(vv?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?vS(e):e,r=(n,a)=>FS(t,n,a);return Object.assign(r,t),r},BS=e=>e?Fd(e):Fd,tt={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}},remove(e){try{localStorage.removeItem(e)}catch{}}};let Ks=0;const zS=tt.get("theme")??"dark",WS=tt.get("auth_token"),US=(()=>{try{const e=tt.get("auth_user");return e?JSON.parse(e):null}catch{return null}})(),ne=BS(e=>({sessions:{},messages:{},openTabs:[],activeTabId:null,theme:zS,_pendingStatus:{},scenarioRuns:{},messageRates:{},branding:null,setBranding:t=>e({branding:t}),token:WS,user:US,login:(t,r)=>{tt.set("auth_token",t),tt.set("auth_user",JSON.stringify(r)),e({token:t,user:r})},logout:()=>{tt.remove("auth_token"),tt.remove("auth_user"),e({token:null,user:null,sessions:{},messages:{},openTabs:[],activeTabId:null})},setSessions:t=>e(r=>{const n=Object.fromEntries(t.map(a=>[a.session_id,a]));for(const[a,i]of Object.entries(r._pendingStatus))n[a]&&(n[a]={...n[a],...i});return{sessions:n,_pendingStatus:{}}}),upsertSession:t=>e(r=>{const n=r.sessions[t.session_id];return(n==null?void 0:n.status_changed_at)!=null&&t.status_changed_at!=null&&n.status_changed_at>t.status_changed_at?{sessions:{...r.sessions,[t.session_id]:{...t,status:n.status,status_changed_at:n.status_changed_at,last_heartbeat_at:n.last_heartbeat_at}}}:{sessions:{...r.sessions,[t.session_id]:t}}}),removeSession:t=>e(r=>{const{[t]:n,...a}=r.sessions,{[t]:i,...o}=r.messages,s=r.openTabs.filter(u=>u!==t);let l=r.activeTabId;if(l===t){const u=r.openTabs.indexOf(t);l=s[u]??s[u-1]??null}return{sessions:a,messages:o,openTabs:s,activeTabId:l}}),updateSessionStatus:(t,r,n={})=>e(a=>{const i=a.sessions[t];return i?{sessions:{...a.sessions,[t]:{...i,status:r,...n}}}:{_pendingStatus:{...a._pendingStatus,[t]:{status:r,...n}}}}),updateLastHeartbeat:(t,r)=>e(n=>{const a=n.sessions[t];return a?{sessions:{...n.sessions,[t]:{...a,last_heartbeat_at:r}}}:{}}),openTab:t=>e(r=>({openTabs:r.openTabs.includes(t)?r.openTabs:[...r.openTabs,t],activeTabId:t})),closeTab:t=>e(r=>{const n=r.openTabs.filter(i=>i!==t);let a=r.activeTabId;if(a===t){const i=r.openTabs.indexOf(t);a=n[i]??n[i-1]??null}return{openTabs:n,activeTabId:a}}),setActiveTab:t=>e({activeTabId:t}),setMessages:(t,r)=>e(n=>({messages:{...n.messages,[t]:r.map(a=>({...a,_id:++Ks}))}})),prependMessages:(t,r)=>e(n=>{const a=n.messages[t]??[],i=r.map(o=>({...o,_id:++Ks}));return{messages:{...n.messages,[t]:[...i,...a]}}}),appendMessage:(t,r)=>e(n=>{const a=n.messages[t]??[],i={...r,_id:++Ks},o=[...a,i],s=2e3;return{messages:{...n.messages,[t]:o.length>s?o.slice(-s):o}}}),clearMessages:t=>e(r=>({messages:{...r.messages,[t]:[]}})),toggleTheme:()=>e(t=>{const r=t.theme==="dark"?"light":"dark";return tt.set("theme",r),{theme:r}}),setMessageRate:(t,r)=>e(n=>({messageRates:{...n.messageRates,[t]:{...r,at:Date.now()}}})),upsertScenarioRun:t=>e(r=>({scenarioRuns:{...r.scenarioRuns,[t.run_id]:t}})),updateScenarioStep:(t,r)=>e(n=>{const a=n.scenarioRuns[t];if(!a)return{};const i=[...a.steps],o=i.findIndex(s=>s.step_index===r.step_index);return o>=0?i[o]=r:i.push(r),{scenarioRuns:{...n.scenarioRuns,[t]:{...a,steps:i}}}}),completeScenarioRun:(t,r,n)=>e(a=>{const i=a.scenarioRuns[t];return i?{scenarioRuns:{...a.scenarioRuns,[t]:{...i,status:r,duration_ms:n}}}:{}})})),Tc="/api";async function X(e,t){const r=ne.getState().token,n={"Content-Type":"application/json"};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}${e}`,{headers:n,...t});if(a.status===401)throw ne.getState().logout(),window.location.href="/login",new Error("Session expired");if(!a.ok){const o=(await a.json().catch(()=>({detail:a.statusText}))).detail,s=Array.isArray(o)?o.map(l=>{const u=Array.isArray(l.loc)?l.loc.filter(d=>d!=="body").join("."):"";return u?`${u}: ${l.msg}`:l.msg??JSON.stringify(l)}).join("; "):o??a.statusText;throw new Error(s)}if(a.status!==204)return a.json()}const G={sessions:{list:()=>X("/sessions/"),create:e=>X("/sessions/",{method:"POST",body:JSON.stringify(e)}),get:e=>X(`/sessions/${e}`),update:(e,t)=>X(`/sessions/${e}`,{method:"PATCH",body:JSON.stringify(t)}),remove:e=>X(`/sessions/${e}`,{method:"DELETE"}),start:e=>X(`/sessions/${e}/start`,{method:"POST"}),stop:(e,t=!1)=>X(`/sessions/${e}/stop?force=${t}`,{method:"POST"}),send:(e,t,r)=>X(`/sessions/${e}/send`,{method:"POST",body:JSON.stringify({raw:t,no_auto_ts:(r==null?void 0:r.noAutoTs)??!1})}),import:e=>X("/sessions/import",{method:"POST",body:JSON.stringify(e)}),getSeqnums:e=>X(`/sessions/${e}/seqnums`),setSeqnums:(e,t)=>X(`/sessions/${e}/seqnums`,{method:"PATCH",body:JSON.stringify(t)})},messages:{list:(e,t)=>{const r=new URLSearchParams;return t!=null&&t.direction&&r.set("direction",t.direction),t!=null&&t.limit&&r.set("limit",String(t.limit)),(t==null?void 0:t.beforeId)!=null&&r.set("before_id",String(t.beforeId)),X(`/sessions/${e}/messages?${r}`)},clear:e=>X(`/sessions/${e}/messages`,{method:"DELETE"}),export:async(e,t)=>{const r=ne.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}/sessions/${e}/messages/export?fmt=${t}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=`${e}.${t}`,s.click(),URL.revokeObjectURL(o)}},admin:{users:{list:()=>X("/admin/users"),create:e=>X("/admin/users",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>X(`/admin/users/${e}`,{method:"DELETE"})},settings:{get:()=>X("/admin/settings"),update:e=>X("/admin/settings",{method:"PATCH",body:JSON.stringify(e)})},housekeeping:{get:()=>X("/admin/housekeeping"),update:e=>X("/admin/housekeeping",{method:"PATCH",body:JSON.stringify(e)}),runNow:()=>X("/admin/housekeeping/run",{method:"POST"})},branding:{get:()=>X("/admin/branding"),update:e=>X("/admin/branding",{method:"PATCH",body:JSON.stringify(e)})}},fixSpec:{messages:e=>X(`/fix-spec/messages?begin_string=${encodeURIComponent(e)}`),message:(e,t)=>X(`/fix-spec/messages/${encodeURIComponent(t)}?begin_string=${encodeURIComponent(e)}`)},templates:{list:()=>X("/templates"),create:e=>X("/templates",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/templates/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/templates/${e}`,{method:"DELETE"})},customTags:{list:()=>X("/custom-tags"),upsert:e=>X("/custom-tags",{method:"POST",body:JSON.stringify(e)}),delete:e=>X(`/custom-tags/${e}`,{method:"DELETE"})},specOverlay:{get:()=>X("/spec-overlay"),set:e=>X("/spec-overlay",{method:"PUT",body:JSON.stringify(e)})},scenarios:{list:()=>X("/scenarios"),create:e=>X("/scenarios",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/scenarios/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/scenarios/${e}`,{method:"DELETE"}),run:e=>X(`/scenarios/${e}/run`,{method:"POST"}),abort:e=>X(`/scenarios/runs/${e}`,{method:"DELETE"})},perf:{runs:{create:e=>X("/perf/runs",{method:"POST",body:JSON.stringify(e)}),list:()=>X("/perf/runs"),get:e=>X(`/perf/runs/${e}`),stop:e=>X(`/perf/runs/${e}`,{method:"DELETE"}),messages:(e,t)=>{const r=new URLSearchParams;return(t==null?void 0:t.limit)!=null&&r.set("limit",String(t.limit)),(t==null?void 0:t.offset)!=null&&r.set("offset",String(t.offset)),X(`/perf/runs/${e}/messages?${r}`)},scenarios:(e,t)=>{const r=new URLSearchParams;return(t==null?void 0:t.limit)!=null&&r.set("limit",String(t.limit)),(t==null?void 0:t.offset)!=null&&r.set("offset",String(t.offset)),X(`/perf/runs/${e}/scenarios?${r}`)},ticket:e=>X(`/perf/runs/${e}/ticket`,{method:"POST"}),export:(e,t)=>HS(`/perf/runs/${e}/export?kind=${t}`,`${e}_${t}.${t==="both"?"zip":"csv"}`)},configs:{list:()=>X("/perf/configs"),get:e=>X(`/perf/configs/${e}`),save:e=>X("/perf/configs",{method:"POST",body:JSON.stringify(e)}),delete:e=>X(`/perf/configs/${e}`,{method:"DELETE"})}}};async function HS(e,t){const r=ne.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}${e}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=t,s.click(),URL.revokeObjectURL(o)}const GS=Object.freeze(Object.defineProperty({__proto__:null,api:G},Symbol.toStringTag,{value:"Module"})),ZS={1:"Account",6:"AvgPx",7:"BeginSeqNo",8:"BeginString",9:"BodyLength",10:"CheckSum",11:"ClOrdID",14:"CumQty",15:"Currency",17:"ExecID",18:"ExecInst",20:"ExecTransType",21:"HandlInst",22:"IDSource",29:"LastCapacity",30:"LastMkt",31:"LastPx",32:"LastShares",34:"MsgSeqNum",35:"MsgType",37:"OrderID",38:"OrderQty",39:"OrdStatus",40:"OrdType",41:"OrigClOrdID",44:"Price",48:"SecurityID",49:"SenderCompID",50:"SenderSubID",52:"SendingTime",54:"Side",55:"Symbol",56:"TargetCompID",57:"TargetSubID",58:"Text",59:"TimeInForce",60:"TransactTime",63:"SettlmntTyp",64:"FutSettDate",76:"ExecBroker",77:"OpenClose",98:"EncryptMethod",99:"StopPx",100:"ExDestination",102:"CxlRejReason",103:"OrdRejReason",108:"HeartBtInt",109:"ClientID",110:"MinQty",111:"MaxFloor",112:"TestReqID",115:"OnBehalfOfCompID",117:"QuoteID",122:"OrigSendingTime",126:"ExpireTime",131:"QuoteReqID",132:"BidPx",133:"OfferPx",134:"BidSize",135:"OfferSize",140:"PrevClosePx",141:"ResetSeqNumFlag",150:"ExecType",151:"LeavesQty",167:"SecurityType",200:"MaturityMonthYear",201:"PutOrCall",202:"StrikePrice",207:"SecurityExchange",210:"MaxShow",369:"LastMsgSeqNumProcessed",371:"RefTagID",372:"RefMsgType",373:"SessionRejectReason",553:"Username",554:"Password"},ki={};function gv(e){for(const t of e)ki[t.number]=t.name}function KS(){for(const e of Object.keys(ki))delete ki[Number(e)]}function Fr(e){const t=typeof e=="string"?parseInt(e,10):e;return ki[t]??ZS[t]??`Tag${t}`}const qS=3e3;function yv(){const e=m.useRef(null),{updateSessionStatus:t,appendMessage:r,upsertSession:n,updateLastHeartbeat:a,setMessageRate:i,upsertScenarioRun:o,updateScenarioStep:s,completeScenarioRun:l}=ne();m.useEffect(()=>{let u=!1,d;function f(){const h=window.location.protocol==="https:"?"wss:":"ws:",p=ne.getState().token,v=`${h}//${window.location.host}/ws`,y=p?new WebSocket(v,["bearer",p]):new WebSocket(v);e.current=y,y.onmessage=g=>{let b;try{b=JSON.parse(g.data)}catch{return}b.type!=="ping"&&(b.type==="session_status"?t(b.session_id,b.status,{last_sent_seq_num:b.last_sent_seq_num,last_recv_seq_num:b.last_recv_seq_num,status_changed_at:b.status_changed_at??void 0,last_heartbeat_at:b.last_heartbeat_at??void 0}):b.type==="message"?(r(b.session_id,{session_id:b.session_id,direction:b.direction,admin:b.admin,seq_num:b.seq_num,msg_type:b.msg_type,msg_type_name:b.msg_type_name,ts:b.ts,fields:b.fields,raw:b.raw}),b.msg_type==="0"&&a(b.session_id,Date.now()/1e3)):b.type==="message_agg"?i(b.session_id,{rate:b.rate,in:b.in,out:b.out,last_seq:b.last_seq}):b.type==="scenario_start"?o({run_id:b.run_id,scenario_id:b.scenario_id,scenario_name:b.scenario_name,status:"running",step_count:b.step_count,steps:[],started_at:Date.now()}):b.type==="scenario_step"?s(b.run_id,{step_index:b.step_index,label:b.label,status:b.status,error:b.error??void 0,duration_ms:b.duration_ms}):b.type==="scenario_complete"&&l(b.run_id,b.status,b.duration_ms))},y.onclose=()=>{u||(d=setTimeout(f,qS))},y.onerror=()=>{y.close()}}return f(),()=>{var h;u=!0,clearTimeout(d),(h=e.current)==null||h.close()}},[])}const YS={display_name:"",begin_string:"FIX.4.2",sender_comp_id:"",target_comp_id:"",connection_type:"initiator",host:"localhost",port:9876,heartbeat_interval:30,session_role:"generic",auto_start:!0,durable_seqnums:!0,log_messages:!0,validate_inbound:!1};function XS({onClose:e,onSubmit:t}){const[r,n]=m.useState(YS),[a,i]=m.useState(""),[o,s]=m.useState(!1),l=(d,f)=>n(h=>({...h,[d]:f}));async function u(d){if(d.preventDefault(),!r.sender_comp_id||!r.target_comp_id){i("SenderCompID and TargetCompID are required");return}i(""),s(!0);try{await t(r),e()}catch(f){i(f instanceof Error?f.message:String(f))}finally{s(!1)}}return c.jsx("div",{className:"modal-overlay",onClick:e,children:c.jsxs("div",{className:"modal",onClick:d=>d.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Add Session"}),c.jsx("button",{className:"btn-icon",onClick:e,children:"✕"})]}),c.jsxs("form",{onSubmit:u,children:[c.jsxs("div",{className:"form-grid",children:[c.jsx("label",{children:"Display Name"}),c.jsx("input",{value:r.display_name,onChange:d=>l("display_name",d.target.value),placeholder:"My Session"}),c.jsx("label",{children:"FIX Version"}),c.jsxs("select",{value:r.begin_string,onChange:d=>l("begin_string",d.target.value),children:[c.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),c.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),c.jsx("label",{children:"Connection Type"}),c.jsxs("select",{value:r.connection_type,onChange:d=>l("connection_type",d.target.value),children:[c.jsx("option",{value:"initiator",children:"Initiator"}),c.jsx("option",{value:"acceptor",children:"Acceptor"})]}),c.jsx("label",{children:"SenderCompID *"}),c.jsx("input",{value:r.sender_comp_id,onChange:d=>l("sender_comp_id",d.target.value),placeholder:"CLIENT",required:!0}),c.jsx("label",{children:"TargetCompID *"}),c.jsx("input",{value:r.target_comp_id,onChange:d=>l("target_comp_id",d.target.value),placeholder:"SERVER",required:!0}),r.connection_type==="initiator"&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Host"}),c.jsx("input",{value:r.host,onChange:d=>l("host",d.target.value)})]}),c.jsx("label",{children:"Port"}),c.jsx("input",{type:"number",value:r.port,onChange:d=>l("port",Number(d.target.value)),min:1,max:65535}),c.jsx("label",{children:"HeartBtInt (s)"}),c.jsx("input",{type:"number",value:r.heartbeat_interval,onChange:d=>l("heartbeat_interval",Number(d.target.value)),min:1}),c.jsx("label",{children:"Role"}),c.jsxs("select",{value:r.session_role,onChange:d=>l("session_role",d.target.value),children:[c.jsx("option",{value:"client",children:"Client — sends orders"}),c.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),c.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]}),c.jsx("label",{children:"Auto-start"}),c.jsx("input",{type:"checkbox",checked:r.auto_start,onChange:d=>l("auto_start",d.target.checked)}),c.jsx("label",{title:"Disables per-message fsync (durable_seqnums) and the message log — required for high-rate perf runs.",children:"Performance session"}),c.jsx("input",{type:"checkbox",checked:!r.durable_seqnums&&!r.log_messages,onChange:d=>{const f=d.target.checked;n(h=>({...h,durable_seqnums:!f,log_messages:!f}))}}),c.jsx("label",{title:"Validate inbound messages against the FIX spec and reject non-conforming ones (missing required fields, unknown MsgType), like a real counterparty. Off = permissive: repeating groups still decode, but nothing is auto-rejected.",children:"Validate inbound (conformant venue)"}),c.jsx("input",{type:"checkbox",checked:!!r.validate_inbound,onChange:d=>l("validate_inbound",d.target.checked)})]}),r.validate_inbound&&c.jsx("div",{className:"form-hint",children:"Conformant-venue mode: inbound app messages are validated against the FIX spec and non-conforming ones are rejected (Reject, 35=3). Leave off for permissive testing — repeating groups still decode correctly either way."}),!r.durable_seqnums&&!r.log_messages&&c.jsx("div",{className:"form-hint",children:"Performance mode: in-memory seqnums (no fsync) and no message log — fast, but messages won't appear in the session log and sequence numbers reset on restart."}),a&&c.jsx("div",{className:"error-msg",children:a}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{type:"button",className:"btn btn-secondary",onClick:e,children:"Cancel"}),c.jsx("button",{type:"submit",className:"btn btn-primary",disabled:o,children:o?"Adding…":"Add Session"})]})]})]})})}const VS="modulepreload",JS=function(e){return"/"+e},Bd={},QS=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),s=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));a=Promise.allSettled(r.map(l=>{if(l=JS(l),l in Bd)return;Bd[l]=!0;const u=l.endsWith(".css"),d=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${d}`))return;const f=document.createElement("link");if(f.rel=u?"stylesheet":VS,u||(f.as="script"),f.crossOrigin="",f.href=l,s&&f.setAttribute("nonce",s),document.head.appendChild(f),u)return new Promise((h,p)=>{f.addEventListener("load",h),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o}return a.then(o=>{for(const s of o||[])s.status==="rejected"&&i(s.reason);return t().catch(i)})};function e1({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState({display_name:e.display_name,begin_string:e.begin_string,sender_comp_id:e.sender_comp_id,target_comp_id:e.target_comp_id,connection_type:e.connection_type,host:e.host,port:e.port,heartbeat_interval:e.heartbeat_interval,reconnect_interval:e.reconnect_interval,use_file_log:e.use_file_log,start_time:e.start_time,end_time:e.end_time,reset_on_logon:e.reset_on_logon,reset_on_logout:e.reset_on_logout,session_role:e.session_role,auto_ack:e.auto_ack,auto_ack_delay_ms:e.auto_ack_delay_ms,auto_fill:e.auto_fill,auto_fill_delay_ms:e.auto_fill_delay_ms,validate_inbound:e.validate_inbound,data_dictionary_path:e.data_dictionary_path??""}),[i,o]=m.useState(""),[s,l]=m.useState(!1),[u,d]=m.useState(!1),f=ne(b=>b.user),h=(b,x)=>a(j=>({...j,[b]:x})),p=e.durable_seqnums===!1&&e.log_messages===!1,v=e.durable_seqnums!==!1&&e.log_messages!==!1,y=b=>b?"on":"off";async function g(b){b.preventDefault(),o(""),l(!0);try{const{api:x}=await QS(async()=>{const{api:_}=await Promise.resolve().then(()=>GS);return{api:_}},[]),j={...n,data_dictionary_path:n.data_dictionary_path||null},S=await x.sessions.update(e.session_id,j);r(S),t()}catch(x){o(x instanceof Error?x.message:String(x))}finally{l(!1)}}return c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal",onClick:b=>b.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Edit Session"}),c.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),c.jsxs("div",{className:`session-type-banner ${p?"perf":""}`,children:[c.jsx("span",{className:"session-type-tag",children:p?"⚡ Performance session":v?"Standard session":"Custom session"}),c.jsxs("span",{className:"session-type-detail",children:["durable seqnums: ",y(e.durable_seqnums)," · message log: ",y(e.log_messages)," · validate inbound: ",y(e.validate_inbound)]})]}),c.jsxs("form",{onSubmit:g,children:[c.jsxs("div",{className:"form-grid",children:[(f==null?void 0:f.role)==="platform_admin"&&e.owner_username&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Owner"}),c.jsx("span",{className:"owner-badge",style:{justifySelf:"start"},children:e.owner_username})]}),c.jsx("label",{children:"Display Name"}),c.jsx("input",{value:n.display_name,onChange:b=>h("display_name",b.target.value),placeholder:"My Session"}),c.jsx("label",{children:"FIX Version"}),c.jsxs("select",{value:n.begin_string,onChange:b=>h("begin_string",b.target.value),children:[c.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),c.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),c.jsx("label",{children:"Connection Type"}),c.jsxs("select",{value:n.connection_type,onChange:b=>h("connection_type",b.target.value),children:[c.jsx("option",{value:"initiator",children:"Initiator"}),c.jsx("option",{value:"acceptor",children:"Acceptor"})]}),c.jsx("label",{children:"SenderCompID *"}),c.jsx("input",{value:n.sender_comp_id,onChange:b=>h("sender_comp_id",b.target.value),required:!0}),c.jsx("label",{children:"TargetCompID *"}),c.jsx("input",{value:n.target_comp_id,onChange:b=>h("target_comp_id",b.target.value),required:!0}),n.connection_type==="initiator"&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Host"}),c.jsx("input",{value:n.host,onChange:b=>h("host",b.target.value)})]}),c.jsx("label",{children:"Port"}),c.jsx("input",{type:"number",value:n.port,onChange:b=>h("port",Number(b.target.value)),min:1,max:65535}),c.jsx("label",{children:"HeartBtInt (s)"}),c.jsx("input",{type:"number",value:n.heartbeat_interval,onChange:b=>h("heartbeat_interval",Number(b.target.value)),min:1}),c.jsx("label",{children:"Role"}),c.jsxs("select",{value:n.session_role,onChange:b=>h("session_role",b.target.value),children:[c.jsx("option",{value:"client",children:"Client — sends orders"}),c.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),c.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]})]}),n.session_role==="venue"&&c.jsxs("div",{className:"venue-auto-section",children:[c.jsx("div",{className:"venue-auto-title",children:"Auto-responses (venue)"}),c.jsxs("div",{className:"form-grid",children:[c.jsx("label",{children:"Auto-ack"}),c.jsxs("div",{className:"venue-auto-row",children:[c.jsx("input",{type:"checkbox",checked:n.auto_ack,onChange:b=>h("auto_ack",b.target.checked),title:"Send Execution Report (OrdStatus=New) on each inbound New Order Single"}),c.jsx("span",{className:"venue-auto-label",children:"delay"}),c.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_ack_delay_ms,onChange:b=>h("auto_ack_delay_ms",Number(b.target.value)),min:0,disabled:!n.auto_ack}),c.jsx("span",{className:"venue-auto-label",children:"ms"})]}),c.jsx("label",{children:"Auto-fill"}),c.jsxs("div",{className:"venue-auto-row",children:[c.jsx("input",{type:"checkbox",checked:n.auto_fill,onChange:b=>h("auto_fill",b.target.checked),title:"Send Execution Report (OrdStatus=Filled) on each inbound New Order Single"}),c.jsx("span",{className:"venue-auto-label",children:"delay"}),c.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_fill_delay_ms,onChange:b=>h("auto_fill_delay_ms",Number(b.target.value)),min:0,disabled:!n.auto_fill}),c.jsx("span",{className:"venue-auto-label",children:"ms"})]})]})]}),c.jsx("div",{style:{margin:"8px 0 0"},children:c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:()=>d(b=>!b),children:u?"▲ Hide advanced":"▼ Show advanced"})}),u&&c.jsxs("div",{className:"form-grid",style:{marginTop:8},children:[c.jsx("label",{children:"ReconnectInterval (s)"}),c.jsx("input",{type:"number",value:n.reconnect_interval,onChange:b=>h("reconnect_interval",Number(b.target.value)),min:1}),c.jsx("label",{children:"StartTime"}),c.jsx("input",{value:n.start_time,onChange:b=>h("start_time",b.target.value),placeholder:"00:00:00"}),c.jsx("label",{children:"EndTime"}),c.jsx("input",{value:n.end_time,onChange:b=>h("end_time",b.target.value),placeholder:"00:00:00"}),c.jsx("label",{children:"ResetOnLogon"}),c.jsx("input",{type:"checkbox",checked:n.reset_on_logon,onChange:b=>h("reset_on_logon",b.target.checked),title:"Reset sequence numbers to 1 on each Logon"}),c.jsx("label",{children:"ResetOnLogout"}),c.jsx("input",{type:"checkbox",checked:n.reset_on_logout,onChange:b=>h("reset_on_logout",b.target.checked),title:"Reset sequence numbers on Logout"}),c.jsx("label",{children:"Data Dictionary"}),c.jsx("input",{value:n.data_dictionary_path,onChange:b=>h("data_dictionary_path",b.target.value),placeholder:"(use bundled)"}),c.jsx("label",{children:"File Log"}),c.jsx("input",{type:"checkbox",checked:n.use_file_log,onChange:b=>h("use_file_log",b.target.checked)}),c.jsx("label",{title:"Validate inbound messages against the FIX spec and reject non-conforming ones (missing required fields, unknown MsgType), like a real counterparty. Off = permissive: repeating groups still decode, but nothing is auto-rejected. Takes effect on next start.",children:"Validate inbound"}),c.jsx("input",{type:"checkbox",checked:n.validate_inbound,onChange:b=>h("validate_inbound",b.target.checked),title:"Conformant-venue mode — applies on next session start"})]}),i&&c.jsx("div",{className:"error-msg",children:i}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{type:"button",className:"btn btn-secondary",onClick:t,children:"Cancel"}),c.jsx("button",{type:"submit",className:"btn btn-primary",disabled:s,children:s?"Saving…":"Save"})]})]})]})})}function t1({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState(""),[i,o]=m.useState(""),[s,l]=m.useState(!0),[u,d]=m.useState(!1),[f,h]=m.useState(null),p=!["STOPPED","ERROR"].includes(e.status),v=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;m.useEffect(()=>{G.sessions.getSeqnums(e.session_id).then(b=>{a(String(b.sender)),o(String(b.target)),l(!1)}).catch(b=>{h(b.message),l(!1)})},[e.session_id]);async function y(){const b=parseInt(n,10),x=parseInt(i,10);if(isNaN(b)||isNaN(x)||b<1||x<1){h("Sequence numbers must be ≥ 1");return}d(!0),h(null);try{await G.sessions.setSeqnums(e.session_id,{sender:b,target:x}),r(),t()}catch(j){h(j.message??"Failed to set seqnums")}finally{d(!1)}}function g(){a("1"),o("1")}return c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal",style:{width:340},onClick:b=>b.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsxs("span",{children:["Sequence Numbers — ",v]}),c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:t,children:"✕"})]}),c.jsxs("div",{className:"modal-body",children:[p&&c.jsx("div",{className:"seqnum-warning",children:"⚠ Session is running — changing seqnums will trigger a sequence reset with the counterparty."}),s?c.jsx("div",{style:{color:"var(--text2)",padding:"12px 0"},children:"Loading…"}):c.jsxs("div",{className:"form-grid",style:{"--label-w":"140px"},children:[c.jsx("label",{children:"Next TX (outgoing)"}),c.jsx("input",{type:"number",min:1,value:n,onChange:b=>a(b.target.value),disabled:u}),c.jsx("label",{children:"Next RX (incoming)"}),c.jsx("input",{type:"number",min:1,value:i,onChange:b=>o(b.target.value),disabled:u})]}),f&&c.jsx("div",{className:"error-msg",children:f})]}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:g,disabled:s||u,children:"Reset 1/1"}),c.jsx("div",{style:{flex:1}}),c.jsx("button",{className:"btn btn-sm btn-secondary",onClick:t,children:"Cancel"}),c.jsx("button",{className:"btn btn-sm btn-primary",onClick:y,disabled:s||u,children:u?"Applying…":"Apply"})]})]})})}const r1=["display_name","begin_string","sender_comp_id","target_comp_id","connection_type","host","port","heartbeat_interval","reconnect_interval","use_file_log","start_time","end_time","reset_on_logon","reset_on_logout","session_role","data_dictionary_path"];function bv(e){return Object.fromEntries(r1.map(t=>[t,e[t]]))}function xv(e,t){const r=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(r),a=document.createElement("a");a.href=n,a.download=t,a.click(),URL.revokeObjectURL(n)}const n1={LOGGED_ON:"#4ade80",CONNECTING:"#facc15",LISTENING:"#facc15",LOGGED_OUT:"#94a3b8",STOPPED:"#94a3b8",ERROR:"#f87171"};function a1({status:e}){return c.jsxs("span",{className:"status-badge",style:{color:n1[e]??"#94a3b8"},children:["● ",e]})}function zd(e){const t=Math.floor(e/60),r=e%60;return t>0?`${t}m ${r}s`:`${r}s`}function i1({session:e}){const[,t]=m.useState(0),r=e.status==="LOGGED_ON",n=e.connection_type==="initiator"&&["CONNECTING","LOGGED_OUT"].includes(e.status);m.useEffect(()=>{if(!r&&!n)return;const i=setInterval(()=>t(o=>o+1),1e3);return()=>clearInterval(i)},[r,n]);const a=Date.now()/1e3;if(r&&e.status_changed_at){const i=Math.floor(a-e.status_changed_at);let o=null;if(e.last_heartbeat_at){const s=Math.floor(a-e.last_heartbeat_at),l=s<2*e.heartbeat_interval?"var(--green)":s<3*e.heartbeat_interval?"var(--yellow)":"var(--red)";o=c.jsxs("span",{style:{color:l},children:["· HB ",zd(s)," ago"]})}return c.jsxs("div",{className:"session-status-details",children:[c.jsxs("span",{children:["Connected ",zd(i)]}),o]})}if(n&&e.status_changed_at){const i=a-e.status_changed_at,o=Math.ceil(e.reconnect_interval-i%e.reconnect_interval);return c.jsx("div",{className:"session-status-details",children:c.jsxs("span",{style:{color:"var(--text2)"},children:["Reconnecting in ",o,"s"]})})}return null}function o1({session:e,active:t,onClick:r,showOwner:n}){const{upsertSession:a,removeSession:i}=ne(),[o,s]=m.useState(!1),[l,u]=m.useState(!1),[d,f]=m.useState(!1),h=!["STOPPED","ERROR"].includes(e.status);async function p(){s(!0);try{const g=h?await G.sessions.stop(e.session_id):await G.sessions.start(e.session_id);a(g)}catch(g){console.error(g)}finally{s(!1)}}async function v(){confirm(`Remove session "${e.display_name||e.sender_comp_id}"?`)&&(await G.sessions.remove(e.session_id),i(e.session_id))}const y=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;return c.jsxs("div",{className:`session-card${t?" active":""}`,onClick:r,children:[c.jsx("div",{className:"session-card-name",children:y}),c.jsxs("div",{className:"session-card-meta",children:[e.begin_string," · ",e.connection_type,c.jsx("span",{className:`role-badge role-${e.session_role}`,children:e.session_role}),n&&e.owner_username&&c.jsx("span",{className:"owner-badge",children:e.owner_username})]}),c.jsx(a1,{status:e.status}),c.jsx(i1,{session:e}),c.jsxs("div",{className:"session-card-seqnums",children:[c.jsxs("span",{children:["↑",e.last_sent_seq_num]}),c.jsxs("span",{children:["↓",e.last_recv_seq_num]}),c.jsxs("span",{children:[e.message_count," msgs"]})]}),c.jsxs("div",{className:"session-card-actions",onClick:g=>g.stopPropagation(),children:[c.jsx("button",{className:`btn btn-sm ${h?"btn-stop":"btn-start"}`,onClick:p,disabled:o,children:h?"Stop":"Start"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>u(!0),disabled:h,title:h?"Stop session to edit":"Edit config",children:"Edit"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>f(!0),title:"Set sequence numbers",children:"Seq"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>xv([bv(e)],`${y}.json`),title:"Export this session",children:"⬇"}),c.jsx("button",{className:"btn btn-sm btn-danger",onClick:v,children:"✕"})]}),l&&c.jsx(e1,{session:e,onClose:()=>u(!1),onSaved:g=>{a(g),u(!1)}}),d&&c.jsx(t1,{session:e,onClose:()=>f(!1),onSaved:async()=>{const g=await G.sessions.get(e.session_id);a(g)}})]})}const Wd="sessions_mine_only";function s1(){const{sessions:e,activeTabId:t,openTab:r,upsertSession:n,user:a}=ne(),[i,o]=m.useState(!1),[s,l]=m.useState(""),[u,d]=m.useState(""),[f,h]=m.useState(()=>tt.get(Wd)==="1"),p=m.useRef(null),v=(a==null?void 0:a.role)==="platform_admin";function y(){h(_=>(tt.set(Wd,_?"0":"1"),!_))}async function g(_){const w=await G.sessions.create({..._,auto_start:_.auto_start});n(w),r(w.session_id)}function b(){const _=Object.values(e);if(_.length===0)return;const w=new Date().toISOString().slice(0,10);xv(_.map(bv),`fixture-sessions-${w}.json`)}async function x(_){var O;const w=(O=_.target.files)==null?void 0:O[0];if(p.current&&(p.current.value="",!!w)){l(""),d("");try{const P=await w.text();let A=JSON.parse(P);Array.isArray(A)||(A=[A]);const I=await G.sessions.import(A);I.length===0?l("No sessions imported — file may be empty or all entries conflicted."):(I.forEach(T=>{n(T)}),d(`Imported ${I.length} of ${A.length} session${A.length!==1?"s":""}.`),setTimeout(()=>d(""),4e3))}catch(P){l(P instanceof Error?P.message:"Import failed")}}}const j=Object.values(e),S=v&&f?j.filter(_=>_.owner_username===(a==null?void 0:a.username)):j;return c.jsxs("div",{className:"sessions-panel",children:[c.jsxs("div",{className:"sessions-panel-header",children:[c.jsx("span",{children:"Sessions"}),c.jsxs("div",{className:"sessions-panel-header-actions",children:[v&&c.jsx("button",{className:`btn btn-sm ${f?"btn-active":"btn-ghost"}`,onClick:y,title:f?"Showing only your sessions — click to show all users’ sessions":"Showing all users’ sessions — click to show only yours",children:"Mine"}),c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:b,disabled:j.length===0,title:"Export all sessions to JSON",children:"⬇ Export"}),c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:()=>{var _;return(_=p.current)==null?void 0:_.click()},title:"Import sessions from JSON",children:"⬆ Import"}),c.jsx("input",{ref:p,type:"file",accept:".json,application/json",style:{display:"none"},onChange:x}),c.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>o(!0),children:"+ Add"})]})]}),s&&c.jsx("div",{className:"import-feedback import-error",children:s}),u&&c.jsx("div",{className:"import-feedback import-ok",children:u}),c.jsxs("div",{className:"sessions-list",children:[S.length===0&&c.jsx("div",{className:"sessions-empty",children:j.length>0?'No sessions of yours. Click "Mine" to show all users’ sessions.':"No sessions. Add one to get started."}),S.map(_=>c.jsx(o1,{session:_,active:_.session_id===t,onClick:()=>r(_.session_id),showOwner:(a==null?void 0:a.role)==="platform_admin"},_.session_id))]}),i&&c.jsx(XS,{onClose:()=>o(!1),onSubmit:g})]})}const Dc={D:{tag:"11",name:"ClOrdID"},F:{tag:"11",name:"ClOrdID"},G:{tag:"11",name:"ClOrdID"},AB:{tag:"11",name:"ClOrdID"},V:{tag:"262",name:"MDReqID"},R:{tag:"131",name:"QuoteReqID"},S:{tag:"117",name:"QuoteID"},x:{tag:"320",name:"SecurityReqID"}},da={autoTs:!0,autoId:!0,idPrefix:"",idCounter:1,autoExpiry:!0,expiryOffset:1,expiryUnit:"days",evalInline:!0,genRules:[]};function wv(e){return`fixture_send_opts_${e}`}function jv(e){try{const t=JSON.parse(tt.get(wv(e))??"null");return t?{...da,...t}:{...da}}catch{return{...da}}}function Sv(e,t){tt.set(wv(e),JSON.stringify(t))}function Ud(e){return e.replace(/\x01/g,"|").replace(/\|$/,"")}function pa(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e?`${e}|${t}=${r}`:`${t}=${r}`}function Hd(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e}function Ro(e=new Date){const t=e.toISOString();return t.slice(0,10).replace(/-/g,"")+"-"+t.slice(11,19)}function _v(e=new Date){return e.toISOString().slice(0,10).replace(/-/g,"")}const l1={minutes:6e4,hours:36e5,days:864e5};function c1(e,t){return new Date(Date.now()+e*l1[t])}function Ov(e,t){if(!t.autoExpiry)return e;const r=c1(t.expiryOffset,t.expiryUnit);return e=Hd(e,"126",Ro(r)),e=Hd(e,"432",_v(r)),e}const u1="uuid() · random_str() / random_str(n) · random_int(a,b) · timestamp() · date()",Gd="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Pv(e){const t=new Uint8Array(e);return crypto.getRandomValues(t),t}function d1(){const e=Pv(16);e[6]=e[6]&15|64,e[8]=e[8]&63|128;const t=[...e].map(r=>r.toString(16).padStart(2,"0"));return`${t.slice(0,4).join("")}-${t.slice(4,6).join("")}-${t.slice(6,8).join("")}-${t.slice(8,10).join("")}-${t.slice(10,16).join("")}`}function f1(e){const t=Number.isFinite(e)&&e>0?Math.min(Math.floor(e),256):8;return[...Pv(t)].map(r=>Gd[r%Gd.length]).join("")}function h1(e,t){const r=Math.ceil(Math.min(e,t)),n=Math.floor(Math.max(e,t));return r+Math.floor(Math.random()*(n-r+1))}const m1=/^(\w+)\(([^)]*)\)$/;function Nv(e){const t=e.trim().match(m1);if(!t)return e;const r=t[1],n=t[2].trim()?t[2].split(",").map(a=>a.trim()):[];switch(r){case"uuid":return d1();case"random_str":return f1(n[0]!==void 0?Number(n[0]):8);case"random_int":{const a=Number(n[0]),i=Number(n[1]);return!Number.isFinite(a)||!Number.isFinite(i)?e:String(h1(a,i))}case"timestamp":return Ro();case"date":return _v();default:return e}}function Cv(e){const t=e.includes("")?"":"|";return e.split(t).map(r=>{const n=r.indexOf("=");if(n<0)return r;const a=r.slice(0,n),i=r.slice(n+1),o=Nv(i);return o===i?r:`${a}=${o}`}).join(t)}function Ev(e,t){for(const r of t.genRules){const n=r.tag.trim();n&&(e=pa(e,n,Nv(r.value)))}return e}function Av({opts:e,onChange:t,expanded:r,onToggle:n,msgType:a}){const i=a?Dc[a]:void 0;function o(f){t({...e,...f})}const s=`${e.idPrefix}${e.idCounter}`;function l(f,h){o({genRules:e.genRules.map((p,v)=>v===f?{...p,...h}:p)})}function u(){o({genRules:[...e.genRules,{tag:"",value:""}]})}function d(f){o({genRules:e.genRules.filter((h,p)=>p!==f)})}return c.jsxs("div",{className:"send-opts",children:[c.jsxs("button",{type:"button",className:"btn btn-sm btn-ghost send-opts-toggle",onClick:n,children:[r?"▲":"▶"," Send Options"]}),r&&c.jsxs("div",{className:"send-opts-body",children:[c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoTs,onChange:f=>o({autoTs:f.target.checked})}),"Auto TransactTime (tag 60)"]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoId,onChange:f=>o({autoId:f.target.checked})}),i?`Auto-generate ${i.name} (tag ${i.tag})`:a?`Auto-generate ID — no mapping for type ${a}`:"Auto-generate ID tag"]}),e.autoId&&c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("span",{className:"send-opts-label",children:"Prefix"}),c.jsx("input",{className:"send-opts-prefix",value:e.idPrefix,onChange:f=>o({idPrefix:f.target.value}),placeholder:"e.g. ORD",maxLength:20}),c.jsxs("span",{className:"send-opts-next",children:["Next: ",c.jsx("code",{children:s||e.idCounter})]})]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoExpiry,onChange:f=>o({autoExpiry:f.target.checked})}),"Auto expiry (tags 126 / 432, only if present)"]}),e.autoExpiry&&c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("span",{className:"send-opts-label",children:"Future offset"}),c.jsx("input",{className:"send-opts-prefix",type:"number",min:0,style:{width:64},value:e.expiryOffset,onChange:f=>o({expiryOffset:Number(f.target.value)})}),c.jsxs("select",{value:e.expiryUnit,onChange:f=>o({expiryUnit:f.target.value}),children:[c.jsx("option",{value:"minutes",children:"minutes"}),c.jsx("option",{value:"hours",children:"hours"}),c.jsx("option",{value:"days",children:"days"})]}),c.jsx("span",{className:"send-opts-next",children:"126 = future time · 432 = that date"})]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.evalInline,onChange:f=>o({evalInline:f.target.checked})}),"Evaluate value generators in the message (uuid(), random_str(), …)"]}),c.jsxs("div",{className:"send-opts-gen",children:[c.jsx("div",{className:"send-opts-label",children:"Custom tag generators"}),e.genRules.map((f,h)=>c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("input",{className:"send-opts-prefix",style:{width:64},placeholder:"tag",value:f.tag,onChange:p=>l(h,{tag:p.target.value.replace(/[^0-9]/g,"")})}),c.jsx("span",{children:"="}),c.jsx("input",{className:"send-opts-prefix",style:{flex:1},placeholder:"uuid() / random_str(8) / literal",value:f.value,onChange:p=>l(h,{value:p.target.value})}),c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost btn-danger-ghost",onClick:()=>d(h),title:"Remove rule",children:"✕"})]},h)),c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:u,children:"+ Add tag generator"}),c.jsxs("div",{className:"send-opts-next",style:{marginTop:4},children:["Generators: ",u1,". Rules set the tag on every send (insert or replace); literal values are sent as-is."]})]})]})]})}const p1=["FIX.4.2","FIX.4.4"];function v1(e){const t={};for(const r of e.split("|")){const n=r.indexOf("=");if(n<1)continue;const a=r.slice(0,n).trim(),i=r.slice(n+1).trim();a&&!isNaN(Number(a))&&(t[a]=i)}return t}function Zd(e){return Object.entries(e).filter(([,t])=>t!=="").map(([t,r])=>`${t}=${r}`).join("|")}function g1({fieldRef:e,value:t,onChange:r}){const n=String(e.tag||""),a=Object.keys(e.values).length>0;return c.jsxs("tr",{className:`tpl-field-row${e.required?" required":""}`,children:[c.jsx("td",{className:"tpl-field-tag",children:e.tag||"?"}),c.jsxs("td",{className:"tpl-field-name",children:[e.name,e.required&&c.jsx("span",{className:"tpl-req-badge",children:"req"})]}),c.jsx("td",{className:"tpl-field-value",children:a?c.jsxs("select",{className:"tpl-select",value:t,onChange:i=>r(n,i.target.value),children:[c.jsx("option",{value:"",children:"— pick —"}),Object.entries(e.values).map(([i,o])=>c.jsxs("option",{value:i,children:[i," – ",o.replace(/_/g," ")]},i))]}):c.jsx("input",{className:"tpl-input",type:"text",value:t,placeholder:e.type,onChange:i=>r(n,i.target.value)})})]})}function Mc({template:e,defaultBeginString:t="FIX.4.2",onSaved:r,onClose:n}){const[a,i]=m.useState("fields"),[o,s]=m.useState((e==null?void 0:e.name)??""),[l,u]=m.useState((e==null?void 0:e.begin_string)??t),[d,f]=m.useState((e==null?void 0:e.msg_type)??""),[h,p]=m.useState((e==null?void 0:e.msg_type_name)??""),[v,y]=m.useState((e==null?void 0:e.fields)??{}),[g,b]=m.useState(()=>Zd((e==null?void 0:e.fields)??{})),[x,j]=m.useState([]),[S,_]=m.useState(null),[w,O]=m.useState(!1),[P,A]=m.useState(!1),[I,T]=m.useState("");m.useEffect(()=>{G.fixSpec.messages(l).then(j).catch(()=>j([]))},[l]),m.useEffect(()=>{if(!d){_(null);return}O(!0),G.fixSpec.message(l,d).then(R=>{_(R),O(!1)}).catch(()=>{_(null),O(!1)})},[l,d]);function N(R,oe){y(re=>({...re,[R]:oe}))}function K(R){const oe=x.find(re=>re.msg_type===R);f(R),p((oe==null?void 0:oe.name)??R),R&&y(re=>({...re,35:R}))}function $(R){b(R);const oe=v1(R);if(y(oe),oe[35]&&oe[35]!==d){const re=oe[35],z=x.find(L=>L.msg_type===re);f(re),p((z==null?void 0:z.name)??re)}}function U(R){R==="raw"&&b(Zd(v)),i(R)}const k=new Set((S==null?void 0:S.fields.map(R=>String(R.tag)).filter(Boolean))??[]),M=Object.entries(v).filter(([R])=>!k.has(R)&&R!=="35"),[B,W]=m.useState(""),[V,le]=m.useState("");function Q(){!B||isNaN(Number(B))||(N(B,V),W(""),le(""))}async function ge(){if(!o.trim()){T("Template name is required");return}if(!d){T("Message type is required");return}A(!0),T("");try{const R=Object.fromEntries(Object.entries(v).filter(([,z])=>z!=="")),oe={name:o.trim(),msg_type:d,msg_type_name:h,begin_string:l,fields:R},re=e!=null&&e.id?await G.templates.update(e.id,oe):await G.templates.create(oe);r(re)}catch(R){T(R instanceof Error?R.message:"Save failed")}finally{A(!1)}}const we=x.filter(R=>R.category==="app"),ze=x.filter(R=>R.category==="admin");return c.jsx("div",{className:"modal-overlay",onClick:n,children:c.jsxs("div",{className:"modal tpl-form-modal",onClick:R=>R.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:e!=null&&e.id?"Edit Template":"New Template"}),c.jsx("button",{className:"btn-icon",onClick:n,children:"✕"})]}),c.jsxs("div",{className:"tpl-form-top",children:[c.jsxs("div",{className:"tpl-form-row",children:[c.jsx("label",{className:"tpl-label",children:"Name"}),c.jsx("input",{className:"tpl-input tpl-name-input",value:o,onChange:R=>s(R.target.value),placeholder:"e.g. Buy 100 AAPL",autoFocus:!0})]}),c.jsxs("div",{className:"tpl-form-row",children:[c.jsx("label",{className:"tpl-label",children:"FIX version"}),c.jsx("select",{className:"tpl-select",value:l,onChange:R=>u(R.target.value),children:p1.map(R=>c.jsx("option",{value:R,children:R},R))}),c.jsx("label",{className:"tpl-label",style:{marginLeft:12},children:"Message type"}),c.jsxs("select",{className:"tpl-select tpl-msgtype-select",value:d,onChange:R=>K(R.target.value),children:[c.jsx("option",{value:"",children:"— select —"}),we.length>0&&c.jsx("optgroup",{label:"Application",children:we.map(R=>c.jsxs("option",{value:R.msg_type,children:[R.name," (",R.msg_type,")"]},R.msg_type))}),ze.length>0&&c.jsx("optgroup",{label:"Admin",children:ze.map(R=>c.jsxs("option",{value:R.msg_type,children:[R.name," (",R.msg_type,")"]},R.msg_type))})]})]})]}),c.jsxs("div",{className:"analysis-tabs",style:{marginBottom:0},children:[c.jsx("button",{className:`analysis-tab-btn${a==="fields"?" active":""}`,onClick:()=>U("fields"),children:"Fields"}),c.jsx("button",{className:`analysis-tab-btn${a==="raw"?" active":""}`,onClick:()=>U("raw"),children:"Raw FIX"})]}),c.jsxs("div",{className:"tpl-form-body",children:[a==="fields"&&c.jsxs("div",{className:"tpl-fields-tab",children:[!d&&c.jsx("div",{className:"tpl-no-msgtype",children:"Select a message type above to see its field definitions."}),d&&w&&c.jsx("div",{className:"tpl-loading",children:"Loading fields…"}),d&&!w&&c.jsxs("table",{className:"tpl-field-table",children:[c.jsx("thead",{children:c.jsxs("tr",{children:[c.jsx("th",{children:"Tag"}),c.jsx("th",{children:"Field"}),c.jsx("th",{children:"Value"})]})}),c.jsxs("tbody",{children:[S==null?void 0:S.fields.map(R=>c.jsx(g1,{fieldRef:R,value:v[String(R.tag)]??"",onChange:N},`${R.tag}-${R.name}`)),M.length>0&&c.jsxs(c.Fragment,{children:[c.jsx("tr",{className:"tpl-section-divider",children:c.jsx("td",{colSpan:3,children:"Custom / extra fields"})}),M.map(([R,oe])=>c.jsxs("tr",{className:"tpl-field-row",children:[c.jsx("td",{className:"tpl-field-tag",children:R}),c.jsx("td",{className:"tpl-field-name",children:Fr(Number(R))}),c.jsx("td",{className:"tpl-field-value",children:c.jsx("input",{className:"tpl-input",value:oe,onChange:re=>N(R,re.target.value)})})]},R))]}),c.jsxs("tr",{className:"tpl-add-field-row",children:[c.jsx("td",{children:c.jsx("input",{className:"tpl-input tpl-add-tag",type:"number",placeholder:"tag",value:B,onChange:R=>W(R.target.value)})}),c.jsx("td",{className:"tpl-field-name",style:{color:"var(--text2)",fontSize:11},children:B&&!isNaN(Number(B))?Fr(Number(B)):"add field"}),c.jsxs("td",{className:"tpl-field-value",style:{display:"flex",gap:4},children:[c.jsx("input",{className:"tpl-input",placeholder:"value",value:V,onChange:R=>le(R.target.value),onKeyDown:R=>{R.key==="Enter"&&Q()}}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:Q,children:"+"})]})]})]})]})]}),a==="raw"&&c.jsxs("div",{className:"tpl-raw-tab",children:[c.jsx("textarea",{className:"tpl-raw-textarea",value:g,onChange:R=>$(R.target.value),placeholder:"35=D|49=CLIENT|56=VENUE|55=AAPL|54=1|38=100|40=2|44=100.00",spellCheck:!1}),Object.keys(v).length>0&&c.jsxs("div",{className:"tpl-raw-preview",children:[c.jsx("div",{className:"tpl-raw-preview-title",children:"Parsed fields"}),c.jsx("table",{className:"tpl-field-table tpl-preview-table",children:c.jsx("tbody",{children:Object.entries(v).map(([R,oe])=>c.jsxs("tr",{children:[c.jsx("td",{className:"tpl-field-tag",children:R}),c.jsx("td",{className:"tpl-field-name",children:Fr(Number(R))}),c.jsx("td",{className:"tpl-field-value",style:{color:"var(--text)"},children:oe})]},R))})})]})]})]}),I&&c.jsx("div",{className:"tpl-error",children:I}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{className:"btn btn-ghost",onClick:n,children:"Cancel"}),c.jsx("button",{className:"btn btn-primary",onClick:ge,disabled:P,children:P?"Saving…":"Save template"})]})]})})}function Iv({onSelect:e,onClose:t,defaultBeginString:r="FIX.4.2"}){const[n,a]=m.useState([]),[i,o]=m.useState(!0),[s,l]=m.useState(!1),[u,d]=m.useState(null);async function f(){o(!0);try{a(await G.templates.list())}finally{o(!1)}}m.useEffect(()=>{f()},[]);async function h(g,b){b.stopPropagation(),confirm(`Delete template "${g.name}"?`)&&(await G.templates.delete(g.id),a(x=>x.filter(j=>j.id!==g.id)))}function p(g,b){b.stopPropagation(),d(g),l(!0)}function v(g){l(!1),d(null),f()}const y=n.reduce((g,b)=>{const x=`${b.msg_type_name} (${b.msg_type})`;return(g[x]??(g[x]=[])).push(b),g},{});return s?c.jsx(Mc,{template:u??void 0,defaultBeginString:r,onSaved:v,onClose:()=>{l(!1),d(null)}}):c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal template-picker-modal",onClick:g=>g.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Templates"}),c.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),c.jsx("div",{className:"template-picker-toolbar",children:c.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>{d(null),l(!0)},children:"+ New template"})}),c.jsxs("div",{className:"template-picker-body",children:[i&&c.jsx("div",{className:"template-picker-empty",children:"Loading…"}),!i&&n.length===0&&c.jsx("div",{className:"template-picker-empty",children:"No templates yet. Create one to reuse pre-populated FIX messages."}),!i&&Object.entries(y).sort(([g],[b])=>g.localeCompare(b)).map(([g,b])=>c.jsxs("div",{className:"template-group",children:[c.jsx("div",{className:"template-group-title",children:g}),b.map(x=>c.jsxs("div",{className:"template-row",onClick:()=>{e(x),t()},children:[c.jsx("div",{className:"template-row-name",children:x.name}),c.jsxs("div",{className:"template-row-meta",children:[c.jsx("span",{className:"template-begin-string",children:x.begin_string}),c.jsxs("span",{className:"template-field-count",children:[Object.keys(x.fields).length," fields"]})]}),c.jsxs("div",{className:"template-row-actions",onClick:j=>j.stopPropagation(),children:[c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:j=>p(x,j),title:"Edit",children:"✎"}),c.jsx("button",{className:"btn btn-sm btn-danger",onClick:j=>h(x,j),title:"Delete",children:"✕"})]})]},x.id))]},g))]})]})})}function Kd(e){return`fixture_compose_${e}`}const y1=new Set(["8","9","10","34","49","56"]);function qd(e){const t=e.includes("")?"":"|";return e.split(t).filter(r=>r.includes("=")).map(r=>{const n=r.indexOf("=");return{tag:r.slice(0,n).trim(),value:r.slice(n+1)}}).filter(r=>r.tag!=="")}function b1({session:e,raw:t,onRawChange:r,onClose:n}){var T;const a=ne(N=>N.user),[i,o]=m.useState(!1),[s,l]=m.useState(null),[u,d]=m.useState(()=>a?jv(a.uid):{...da}),[f,h]=m.useState(!1),[p,v]=m.useState(!1),[y,g]=m.useState(!1);m.useEffect(()=>{if(a&&!t){const N=tt.get(Kd(a.uid));N&&r(N)}},[]);function b(N){const K=Object.entries(N.fields).filter(([,$])=>$!=="").map(([$,U])=>`${$}=${U}`).join("|");j(K)}function x(){return Object.fromEntries(qd(t).map(N=>[N.tag,N.value]))}function j(N){r(N),a&&tt.set(Kd(a.uid),N)}function S(N){d(N),a&&Sv(a.uid,N)}const _=t.trim()?qd(t):[],w=_.filter(N=>!y1.has(N.tag)),O=((T=_.find(N=>N.tag==="35"))==null?void 0:T.value)??"",P=!!O,A=P&&e.status==="LOGGED_ON";async function I(){if(A){o(!0),l(null);try{let N=t;if(u.autoId&&O){const K=Dc[O];if(K){const $=`${u.idPrefix}${u.idCounter}`;N=pa(N,K.tag,$),S({...u,idCounter:u.idCounter+1})}}u.autoTs&&(N=pa(N,"60",Ro())),N=Ov(N,u),u.evalInline&&(N=Cv(N)),N=Ev(N,u),await G.sessions.send(e.session_id,N,{noAutoTs:!u.autoTs})}catch(N){l(N.message??"Send failed")}finally{o(!1)}}}return c.jsxs("div",{className:"compose-pane",children:[c.jsx("textarea",{className:"compose-textarea",placeholder:`Paste raw FIX (pipe- or SOH-delimited)
36
+ */var Mo=m,NS=PS;function CS(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var ES=typeof Object.is=="function"?Object.is:CS,AS=NS.useSyncExternalStore,IS=Mo.useRef,kS=Mo.useEffect,TS=Mo.useMemo,DS=Mo.useDebugValue;fv.useSyncExternalStoreWithSelector=function(e,t,r,n,a){var i=IS(null);if(i.current===null){var o={hasValue:!1,value:null};i.current=o}else o=i.current;i=TS(function(){function l(p){if(!u){if(u=!0,d=p,p=n(p),a!==void 0&&o.hasValue){var v=o.value;if(a(v,p))return f=v}return f=p}if(v=f,ES(d,p))return v;var y=n(p);return a!==void 0&&a(v,y)?(d=p,v):(d=p,f=y)}var u=!1,d,f,h=r===void 0?null:r;return[function(){return l(t())},h===null?void 0:function(){return l(h())}]},[t,r,n,a]);var s=AS(e,i[0],i[1]);return kS(function(){o.hasValue=!0,o.value=s},[s]),DS(s),s};dv.exports=fv;var pv=dv.exports;const MS=_r(pv),vv={},{useDebugValue:RS}=Hp,{useSyncExternalStoreWithSelector:$S}=MS;let Ld=!1;const LS=e=>e;function FS(e,t=LS,r){(vv?"production":void 0)!=="production"&&r&&!Ld&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),Ld=!0);const n=$S(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return RS(n),n}const Fd=e=>{(vv?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?vS(e):e,r=(n,a)=>FS(t,n,a);return Object.assign(r,t),r},BS=e=>e?Fd(e):Fd,tt={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}},remove(e){try{localStorage.removeItem(e)}catch{}}};let Ks=0;const zS=tt.get("theme")??"dark",WS=tt.get("auth_token"),US=(()=>{try{const e=tt.get("auth_user");return e?JSON.parse(e):null}catch{return null}})(),ne=BS(e=>({sessions:{},messages:{},openTabs:[],activeTabId:null,theme:zS,_pendingStatus:{},scenarioRuns:{},messageRates:{},branding:null,setBranding:t=>e({branding:t}),token:WS,user:US,login:(t,r)=>{tt.set("auth_token",t),tt.set("auth_user",JSON.stringify(r)),e({token:t,user:r})},logout:()=>{tt.remove("auth_token"),tt.remove("auth_user"),e({token:null,user:null,sessions:{},messages:{},openTabs:[],activeTabId:null})},setSessions:t=>e(r=>{const n=Object.fromEntries(t.map(a=>[a.session_id,a]));for(const[a,i]of Object.entries(r._pendingStatus))n[a]&&(n[a]={...n[a],...i});return{sessions:n,_pendingStatus:{}}}),upsertSession:t=>e(r=>{const n=r.sessions[t.session_id];return(n==null?void 0:n.status_changed_at)!=null&&t.status_changed_at!=null&&n.status_changed_at>t.status_changed_at?{sessions:{...r.sessions,[t.session_id]:{...t,status:n.status,status_changed_at:n.status_changed_at,last_heartbeat_at:n.last_heartbeat_at}}}:{sessions:{...r.sessions,[t.session_id]:t}}}),removeSession:t=>e(r=>{const{[t]:n,...a}=r.sessions,{[t]:i,...o}=r.messages,s=r.openTabs.filter(u=>u!==t);let l=r.activeTabId;if(l===t){const u=r.openTabs.indexOf(t);l=s[u]??s[u-1]??null}return{sessions:a,messages:o,openTabs:s,activeTabId:l}}),updateSessionStatus:(t,r,n={})=>e(a=>{const i=a.sessions[t];return i?{sessions:{...a.sessions,[t]:{...i,status:r,...n}}}:{_pendingStatus:{...a._pendingStatus,[t]:{status:r,...n}}}}),updateLastHeartbeat:(t,r)=>e(n=>{const a=n.sessions[t];return a?{sessions:{...n.sessions,[t]:{...a,last_heartbeat_at:r}}}:{}}),openTab:t=>e(r=>({openTabs:r.openTabs.includes(t)?r.openTabs:[...r.openTabs,t],activeTabId:t})),closeTab:t=>e(r=>{const n=r.openTabs.filter(i=>i!==t);let a=r.activeTabId;if(a===t){const i=r.openTabs.indexOf(t);a=n[i]??n[i-1]??null}return{openTabs:n,activeTabId:a}}),setActiveTab:t=>e({activeTabId:t}),setMessages:(t,r)=>e(n=>({messages:{...n.messages,[t]:r.map(a=>({...a,_id:++Ks}))}})),prependMessages:(t,r)=>e(n=>{const a=n.messages[t]??[],i=r.map(o=>({...o,_id:++Ks}));return{messages:{...n.messages,[t]:[...i,...a]}}}),appendMessage:(t,r)=>e(n=>{const a=n.messages[t]??[],i={...r,_id:++Ks},o=[...a,i],s=2e3;return{messages:{...n.messages,[t]:o.length>s?o.slice(-s):o}}}),clearMessages:t=>e(r=>({messages:{...r.messages,[t]:[]}})),toggleTheme:()=>e(t=>{const r=t.theme==="dark"?"light":"dark";return tt.set("theme",r),{theme:r}}),setMessageRate:(t,r)=>e(n=>({messageRates:{...n.messageRates,[t]:{...r,at:Date.now()}}})),upsertScenarioRun:t=>e(r=>({scenarioRuns:{...r.scenarioRuns,[t.run_id]:t}})),updateScenarioStep:(t,r)=>e(n=>{const a=n.scenarioRuns[t];if(!a)return{};const i=[...a.steps],o=i.findIndex(s=>s.step_index===r.step_index);return o>=0?i[o]=r:i.push(r),{scenarioRuns:{...n.scenarioRuns,[t]:{...a,steps:i}}}}),completeScenarioRun:(t,r,n)=>e(a=>{const i=a.scenarioRuns[t];return i?{scenarioRuns:{...a.scenarioRuns,[t]:{...i,status:r,duration_ms:n}}}:{}})})),Tc="/api";async function X(e,t){const r=ne.getState().token,n={"Content-Type":"application/json"};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}${e}`,{headers:n,...t});if(a.status===401)throw ne.getState().logout(),window.location.href="/login",new Error("Session expired");if(!a.ok){const o=(await a.json().catch(()=>({detail:a.statusText}))).detail,s=Array.isArray(o)?o.map(l=>{const u=Array.isArray(l.loc)?l.loc.filter(d=>d!=="body").join("."):"";return u?`${u}: ${l.msg}`:l.msg??JSON.stringify(l)}).join("; "):o??a.statusText;throw new Error(s)}if(a.status!==204)return a.json()}const G={sessions:{list:()=>X("/sessions/"),create:e=>X("/sessions/",{method:"POST",body:JSON.stringify(e)}),get:e=>X(`/sessions/${e}`),update:(e,t)=>X(`/sessions/${e}`,{method:"PATCH",body:JSON.stringify(t)}),remove:e=>X(`/sessions/${e}`,{method:"DELETE"}),start:e=>X(`/sessions/${e}/start`,{method:"POST"}),stop:(e,t=!1)=>X(`/sessions/${e}/stop?force=${t}`,{method:"POST"}),send:(e,t,r)=>X(`/sessions/${e}/send`,{method:"POST",body:JSON.stringify({raw:t,no_auto_ts:(r==null?void 0:r.noAutoTs)??!1})}),import:e=>X("/sessions/import",{method:"POST",body:JSON.stringify(e)}),getSeqnums:e=>X(`/sessions/${e}/seqnums`),setSeqnums:(e,t)=>X(`/sessions/${e}/seqnums`,{method:"PATCH",body:JSON.stringify(t)})},messages:{list:(e,t)=>{const r=new URLSearchParams;return t!=null&&t.direction&&r.set("direction",t.direction),t!=null&&t.limit&&r.set("limit",String(t.limit)),(t==null?void 0:t.beforeId)!=null&&r.set("before_id",String(t.beforeId)),X(`/sessions/${e}/messages?${r}`)},clear:e=>X(`/sessions/${e}/messages`,{method:"DELETE"}),export:async(e,t)=>{const r=ne.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}/sessions/${e}/messages/export?fmt=${t}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=`${e}.${t}`,s.click(),URL.revokeObjectURL(o)}},admin:{users:{list:()=>X("/admin/users"),create:e=>X("/admin/users",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>X(`/admin/users/${e}`,{method:"DELETE"})},settings:{get:()=>X("/admin/settings"),update:e=>X("/admin/settings",{method:"PATCH",body:JSON.stringify(e)})},housekeeping:{get:()=>X("/admin/housekeeping"),update:e=>X("/admin/housekeeping",{method:"PATCH",body:JSON.stringify(e)}),runNow:()=>X("/admin/housekeeping/run",{method:"POST"})},branding:{get:()=>X("/admin/branding"),update:e=>X("/admin/branding",{method:"PATCH",body:JSON.stringify(e)})}},fixSpec:{messages:e=>X(`/fix-spec/messages?begin_string=${encodeURIComponent(e)}`),message:(e,t)=>X(`/fix-spec/messages/${encodeURIComponent(t)}?begin_string=${encodeURIComponent(e)}`)},templates:{list:()=>X("/templates"),create:e=>X("/templates",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/templates/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/templates/${e}`,{method:"DELETE"})},customTags:{list:()=>X("/custom-tags"),upsert:e=>X("/custom-tags",{method:"POST",body:JSON.stringify(e)}),delete:e=>X(`/custom-tags/${e}`,{method:"DELETE"})},specOverlay:{get:()=>X("/spec-overlay"),set:e=>X("/spec-overlay",{method:"PUT",body:JSON.stringify(e)})},scenarios:{list:()=>X("/scenarios"),create:e=>X("/scenarios",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/scenarios/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/scenarios/${e}`,{method:"DELETE"}),run:e=>X(`/scenarios/${e}/run`,{method:"POST"}),abort:e=>X(`/scenarios/runs/${e}`,{method:"DELETE"})},perf:{runs:{create:e=>X("/perf/runs",{method:"POST",body:JSON.stringify(e)}),list:()=>X("/perf/runs"),get:e=>X(`/perf/runs/${e}`),stop:e=>X(`/perf/runs/${e}`,{method:"DELETE"}),messages:(e,t)=>{const r=new URLSearchParams;return(t==null?void 0:t.limit)!=null&&r.set("limit",String(t.limit)),(t==null?void 0:t.offset)!=null&&r.set("offset",String(t.offset)),X(`/perf/runs/${e}/messages?${r}`)},scenarios:(e,t)=>{const r=new URLSearchParams;return(t==null?void 0:t.limit)!=null&&r.set("limit",String(t.limit)),(t==null?void 0:t.offset)!=null&&r.set("offset",String(t.offset)),X(`/perf/runs/${e}/scenarios?${r}`)},ticket:e=>X(`/perf/runs/${e}/ticket`,{method:"POST"}),export:(e,t)=>HS(`/perf/runs/${e}/export?kind=${t}`,`${e}_${t}.${t==="both"?"zip":"csv"}`)},configs:{list:()=>X("/perf/configs"),get:e=>X(`/perf/configs/${e}`),save:e=>X("/perf/configs",{method:"POST",body:JSON.stringify(e)}),delete:e=>X(`/perf/configs/${e}`,{method:"DELETE"})}}};async function HS(e,t){const r=ne.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Tc}${e}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=t,s.click(),URL.revokeObjectURL(o)}const GS=Object.freeze(Object.defineProperty({__proto__:null,api:G},Symbol.toStringTag,{value:"Module"})),ZS={1:"Account",6:"AvgPx",7:"BeginSeqNo",8:"BeginString",9:"BodyLength",10:"CheckSum",11:"ClOrdID",14:"CumQty",15:"Currency",17:"ExecID",18:"ExecInst",20:"ExecTransType",21:"HandlInst",22:"IDSource",29:"LastCapacity",30:"LastMkt",31:"LastPx",32:"LastShares",34:"MsgSeqNum",35:"MsgType",37:"OrderID",38:"OrderQty",39:"OrdStatus",40:"OrdType",41:"OrigClOrdID",44:"Price",48:"SecurityID",49:"SenderCompID",50:"SenderSubID",52:"SendingTime",54:"Side",55:"Symbol",56:"TargetCompID",57:"TargetSubID",58:"Text",59:"TimeInForce",60:"TransactTime",63:"SettlmntTyp",64:"FutSettDate",76:"ExecBroker",77:"OpenClose",98:"EncryptMethod",99:"StopPx",100:"ExDestination",102:"CxlRejReason",103:"OrdRejReason",108:"HeartBtInt",109:"ClientID",110:"MinQty",111:"MaxFloor",112:"TestReqID",115:"OnBehalfOfCompID",117:"QuoteID",122:"OrigSendingTime",126:"ExpireTime",131:"QuoteReqID",132:"BidPx",133:"OfferPx",134:"BidSize",135:"OfferSize",140:"PrevClosePx",141:"ResetSeqNumFlag",150:"ExecType",151:"LeavesQty",167:"SecurityType",200:"MaturityMonthYear",201:"PutOrCall",202:"StrikePrice",207:"SecurityExchange",210:"MaxShow",369:"LastMsgSeqNumProcessed",371:"RefTagID",372:"RefMsgType",373:"SessionRejectReason",553:"Username",554:"Password"},ki={};function gv(e){for(const t of e)ki[t.number]=t.name}function KS(){for(const e of Object.keys(ki))delete ki[Number(e)]}function Fr(e){const t=typeof e=="string"?parseInt(e,10):e;return ki[t]??ZS[t]??`Tag${t}`}const qS=3e3;function yv(){const e=m.useRef(null),{updateSessionStatus:t,appendMessage:r,upsertSession:n,updateLastHeartbeat:a,setMessageRate:i,upsertScenarioRun:o,updateScenarioStep:s,completeScenarioRun:l}=ne();m.useEffect(()=>{let u=!1,d;function f(){const h=window.location.protocol==="https:"?"wss:":"ws:",p=ne.getState().token,v=`${h}//${window.location.host}/ws`,y=p?new WebSocket(v,["bearer",p]):new WebSocket(v);e.current=y,y.onmessage=g=>{let b;try{b=JSON.parse(g.data)}catch{return}b.type!=="ping"&&(b.type==="session_status"?t(b.session_id,b.status,{last_sent_seq_num:b.last_sent_seq_num,last_recv_seq_num:b.last_recv_seq_num,status_changed_at:b.status_changed_at??void 0,last_heartbeat_at:b.last_heartbeat_at??void 0}):b.type==="message"?(r(b.session_id,{session_id:b.session_id,direction:b.direction,admin:b.admin,seq_num:b.seq_num,msg_type:b.msg_type,msg_type_name:b.msg_type_name,ts:b.ts,fields:b.fields,raw:b.raw}),b.msg_type==="0"&&a(b.session_id,Date.now()/1e3)):b.type==="message_agg"?i(b.session_id,{rate:b.rate,in:b.in,out:b.out,last_seq:b.last_seq}):b.type==="scenario_start"?o({run_id:b.run_id,scenario_id:b.scenario_id,scenario_name:b.scenario_name,status:"running",step_count:b.step_count,steps:[],started_at:Date.now()}):b.type==="scenario_step"?s(b.run_id,{step_index:b.step_index,label:b.label,status:b.status,error:b.error??void 0,duration_ms:b.duration_ms}):b.type==="scenario_complete"&&l(b.run_id,b.status,b.duration_ms))},y.onclose=()=>{u||(d=setTimeout(f,qS))},y.onerror=()=>{y.close()}}return f(),()=>{var h;u=!0,clearTimeout(d),(h=e.current)==null||h.close()}},[])}const YS={display_name:"",begin_string:"FIX.4.2",sender_comp_id:"",target_comp_id:"",connection_type:"initiator",host:"localhost",port:9876,heartbeat_interval:30,session_role:"generic",auto_start:!0,durable_seqnums:!0,log_messages:!0,validate_inbound:!1};function XS({onClose:e,onSubmit:t}){const[r,n]=m.useState(YS),[a,i]=m.useState(""),[o,s]=m.useState(!1),l=(d,f)=>n(h=>({...h,[d]:f}));async function u(d){if(d.preventDefault(),!r.sender_comp_id||!r.target_comp_id){i("SenderCompID and TargetCompID are required");return}i(""),s(!0);try{await t(r),e()}catch(f){i(f instanceof Error?f.message:String(f))}finally{s(!1)}}return c.jsx("div",{className:"modal-overlay",onClick:e,children:c.jsxs("div",{className:"modal",onClick:d=>d.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Add Session"}),c.jsx("button",{className:"btn-icon",onClick:e,children:"✕"})]}),c.jsxs("form",{onSubmit:u,children:[c.jsxs("div",{className:"form-grid",children:[c.jsx("label",{children:"Display Name"}),c.jsx("input",{value:r.display_name,onChange:d=>l("display_name",d.target.value),placeholder:"My Session"}),c.jsx("label",{children:"FIX Version"}),c.jsxs("select",{value:r.begin_string,onChange:d=>l("begin_string",d.target.value),children:[c.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),c.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),c.jsx("label",{children:"Connection Type"}),c.jsxs("select",{value:r.connection_type,onChange:d=>l("connection_type",d.target.value),children:[c.jsx("option",{value:"initiator",children:"Initiator"}),c.jsx("option",{value:"acceptor",children:"Acceptor"})]}),c.jsx("label",{children:"SenderCompID *"}),c.jsx("input",{value:r.sender_comp_id,onChange:d=>l("sender_comp_id",d.target.value),placeholder:"CLIENT",required:!0}),c.jsx("label",{children:"TargetCompID *"}),c.jsx("input",{value:r.target_comp_id,onChange:d=>l("target_comp_id",d.target.value),placeholder:"SERVER",required:!0}),r.connection_type==="initiator"&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Host"}),c.jsx("input",{value:r.host,onChange:d=>l("host",d.target.value)})]}),c.jsx("label",{children:"Port"}),c.jsx("input",{type:"number",value:r.port,onChange:d=>l("port",Number(d.target.value)),min:1,max:65535}),c.jsx("label",{children:"HeartBtInt (s)"}),c.jsx("input",{type:"number",value:r.heartbeat_interval,onChange:d=>l("heartbeat_interval",Number(d.target.value)),min:1}),c.jsx("label",{children:"Role"}),c.jsxs("select",{value:r.session_role,onChange:d=>l("session_role",d.target.value),children:[c.jsx("option",{value:"client",children:"Client — sends orders"}),c.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),c.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]}),c.jsx("label",{children:"Auto-start"}),c.jsx("input",{type:"checkbox",checked:r.auto_start,onChange:d=>l("auto_start",d.target.checked)}),c.jsx("label",{title:"Disables per-message fsync (durable_seqnums) and the message log — required for high-rate perf runs.",children:"Performance session"}),c.jsx("input",{type:"checkbox",checked:!r.durable_seqnums&&!r.log_messages,onChange:d=>{const f=d.target.checked;n(h=>({...h,durable_seqnums:!f,log_messages:!f}))}}),c.jsx("label",{title:"Validate inbound messages against the FIX spec and reject non-conforming ones (missing required fields, unknown MsgType), like a real counterparty. Off = permissive: repeating groups still decode, but nothing is auto-rejected.",children:"Validate inbound (conformant venue)"}),c.jsx("input",{type:"checkbox",checked:!!r.validate_inbound,onChange:d=>l("validate_inbound",d.target.checked)})]}),r.validate_inbound&&c.jsx("div",{className:"form-hint",children:"Conformant-venue mode: inbound app messages are validated against the FIX spec and non-conforming ones are rejected (Reject, 35=3). Leave off for permissive testing — repeating groups still decode correctly either way."}),!r.durable_seqnums&&!r.log_messages&&c.jsx("div",{className:"form-hint",children:"Performance mode: in-memory seqnums (no fsync) and no message log — fast, but messages won't appear in the session log and sequence numbers reset on restart."}),a&&c.jsx("div",{className:"error-msg",children:a}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{type:"button",className:"btn btn-secondary",onClick:e,children:"Cancel"}),c.jsx("button",{type:"submit",className:"btn btn-primary",disabled:o,children:o?"Adding…":"Add Session"})]})]})]})})}const VS="modulepreload",JS=function(e){return"/"+e},Bd={},QS=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),s=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));a=Promise.allSettled(r.map(l=>{if(l=JS(l),l in Bd)return;Bd[l]=!0;const u=l.endsWith(".css"),d=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${d}`))return;const f=document.createElement("link");if(f.rel=u?"stylesheet":VS,u||(f.as="script"),f.crossOrigin="",f.href=l,s&&f.setAttribute("nonce",s),document.head.appendChild(f),u)return new Promise((h,p)=>{f.addEventListener("load",h),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o}return a.then(o=>{for(const s of o||[])s.status==="rejected"&&i(s.reason);return t().catch(i)})};function e1({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState({display_name:e.display_name,begin_string:e.begin_string,sender_comp_id:e.sender_comp_id,target_comp_id:e.target_comp_id,connection_type:e.connection_type,host:e.host,port:e.port,heartbeat_interval:e.heartbeat_interval,reconnect_interval:e.reconnect_interval,use_file_log:e.use_file_log,start_time:e.start_time,end_time:e.end_time,reset_on_logon:e.reset_on_logon,reset_on_logout:e.reset_on_logout,session_role:e.session_role,auto_ack:e.auto_ack,auto_ack_delay_ms:e.auto_ack_delay_ms,auto_fill:e.auto_fill,auto_fill_delay_ms:e.auto_fill_delay_ms,validate_inbound:e.validate_inbound,data_dictionary_path:e.data_dictionary_path??""}),[i,o]=m.useState(""),[s,l]=m.useState(!1),[u,d]=m.useState(!1),f=ne(b=>b.user),h=(b,x)=>a(j=>({...j,[b]:x})),p=e.durable_seqnums===!1&&e.log_messages===!1,v=e.durable_seqnums!==!1&&e.log_messages!==!1,y=b=>b?"on":"off";async function g(b){b.preventDefault(),o(""),l(!0);try{const{api:x}=await QS(async()=>{const{api:_}=await Promise.resolve().then(()=>GS);return{api:_}},[]),j={...n,data_dictionary_path:n.data_dictionary_path||null},S=await x.sessions.update(e.session_id,j);r(S),t()}catch(x){o(x instanceof Error?x.message:String(x))}finally{l(!1)}}return c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal",onClick:b=>b.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Edit Session"}),c.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),c.jsxs("div",{className:`session-type-banner ${p?"perf":""}`,children:[c.jsx("span",{className:"session-type-tag",children:p?"⚡ Performance session":v?"Standard session":"Custom session"}),c.jsxs("span",{className:"session-type-detail",children:["durable seqnums: ",y(e.durable_seqnums)," · message log: ",y(e.log_messages)," · validate inbound: ",y(e.validate_inbound)]})]}),c.jsxs("form",{onSubmit:g,children:[c.jsxs("div",{className:"form-grid",children:[(f==null?void 0:f.role)==="platform_admin"&&e.owner_username&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Owner"}),c.jsx("span",{className:"owner-badge",style:{justifySelf:"start"},children:e.owner_username})]}),c.jsx("label",{children:"Display Name"}),c.jsx("input",{value:n.display_name,onChange:b=>h("display_name",b.target.value),placeholder:"My Session"}),c.jsx("label",{children:"FIX Version"}),c.jsxs("select",{value:n.begin_string,onChange:b=>h("begin_string",b.target.value),children:[c.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),c.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),c.jsx("label",{children:"Connection Type"}),c.jsxs("select",{value:n.connection_type,onChange:b=>h("connection_type",b.target.value),children:[c.jsx("option",{value:"initiator",children:"Initiator"}),c.jsx("option",{value:"acceptor",children:"Acceptor"})]}),c.jsx("label",{children:"SenderCompID *"}),c.jsx("input",{value:n.sender_comp_id,onChange:b=>h("sender_comp_id",b.target.value),required:!0}),c.jsx("label",{children:"TargetCompID *"}),c.jsx("input",{value:n.target_comp_id,onChange:b=>h("target_comp_id",b.target.value),required:!0}),n.connection_type==="initiator"&&c.jsxs(c.Fragment,{children:[c.jsx("label",{children:"Host"}),c.jsx("input",{value:n.host,onChange:b=>h("host",b.target.value)})]}),c.jsx("label",{children:"Port"}),c.jsx("input",{type:"number",value:n.port,onChange:b=>h("port",Number(b.target.value)),min:1,max:65535}),c.jsx("label",{children:"HeartBtInt (s)"}),c.jsx("input",{type:"number",value:n.heartbeat_interval,onChange:b=>h("heartbeat_interval",Number(b.target.value)),min:1}),c.jsx("label",{children:"Role"}),c.jsxs("select",{value:n.session_role,onChange:b=>h("session_role",b.target.value),children:[c.jsx("option",{value:"client",children:"Client — sends orders"}),c.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),c.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]})]}),n.session_role==="venue"&&c.jsxs("div",{className:"venue-auto-section",children:[c.jsx("div",{className:"venue-auto-title",children:"Auto-responses (venue)"}),c.jsxs("div",{className:"form-grid",children:[c.jsx("label",{children:"Auto-ack"}),c.jsxs("div",{className:"venue-auto-row",children:[c.jsx("input",{type:"checkbox",checked:n.auto_ack,onChange:b=>h("auto_ack",b.target.checked),title:"Send Execution Report (OrdStatus=New) on each inbound New Order Single"}),c.jsx("span",{className:"venue-auto-label",children:"delay"}),c.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_ack_delay_ms,onChange:b=>h("auto_ack_delay_ms",Number(b.target.value)),min:0,disabled:!n.auto_ack}),c.jsx("span",{className:"venue-auto-label",children:"ms"})]}),c.jsx("label",{children:"Auto-fill"}),c.jsxs("div",{className:"venue-auto-row",children:[c.jsx("input",{type:"checkbox",checked:n.auto_fill,onChange:b=>h("auto_fill",b.target.checked),title:"Send Execution Report (OrdStatus=Filled) on each inbound New Order Single"}),c.jsx("span",{className:"venue-auto-label",children:"delay"}),c.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_fill_delay_ms,onChange:b=>h("auto_fill_delay_ms",Number(b.target.value)),min:0,disabled:!n.auto_fill}),c.jsx("span",{className:"venue-auto-label",children:"ms"})]})]})]}),c.jsx("div",{style:{margin:"8px 0 0"},children:c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:()=>d(b=>!b),children:u?"▲ Hide advanced":"▼ Show advanced"})}),u&&c.jsxs("div",{className:"form-grid",style:{marginTop:8},children:[c.jsx("label",{children:"ReconnectInterval (s)"}),c.jsx("input",{type:"number",value:n.reconnect_interval,onChange:b=>h("reconnect_interval",Number(b.target.value)),min:1}),c.jsx("label",{children:"StartTime"}),c.jsx("input",{value:n.start_time,onChange:b=>h("start_time",b.target.value),placeholder:"00:00:00"}),c.jsx("label",{children:"EndTime"}),c.jsx("input",{value:n.end_time,onChange:b=>h("end_time",b.target.value),placeholder:"00:00:00"}),c.jsx("label",{children:"ResetOnLogon"}),c.jsx("input",{type:"checkbox",checked:n.reset_on_logon,onChange:b=>h("reset_on_logon",b.target.checked),title:"Reset sequence numbers to 1 on each Logon"}),c.jsx("label",{children:"ResetOnLogout"}),c.jsx("input",{type:"checkbox",checked:n.reset_on_logout,onChange:b=>h("reset_on_logout",b.target.checked),title:"Reset sequence numbers on Logout"}),c.jsx("label",{children:"Data Dictionary"}),c.jsx("input",{value:n.data_dictionary_path,onChange:b=>h("data_dictionary_path",b.target.value),placeholder:"(use bundled)"}),c.jsx("label",{children:"File Log"}),c.jsx("input",{type:"checkbox",checked:n.use_file_log,onChange:b=>h("use_file_log",b.target.checked)}),c.jsx("label",{title:"Validate inbound messages against the FIX spec and reject non-conforming ones (missing required fields, unknown MsgType), like a real counterparty. Off = permissive: repeating groups still decode, but nothing is auto-rejected. Takes effect on next start.",children:"Validate inbound"}),c.jsx("input",{type:"checkbox",checked:n.validate_inbound,onChange:b=>h("validate_inbound",b.target.checked),title:"Conformant-venue mode — applies on next session start"})]}),i&&c.jsx("div",{className:"error-msg",children:i}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{type:"button",className:"btn btn-secondary",onClick:t,children:"Cancel"}),c.jsx("button",{type:"submit",className:"btn btn-primary",disabled:s,children:s?"Saving…":"Save"})]})]})]})})}function t1({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState(""),[i,o]=m.useState(""),[s,l]=m.useState(!0),[u,d]=m.useState(!1),[f,h]=m.useState(null),p=!["STOPPED","ERROR"].includes(e.status),v=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;m.useEffect(()=>{G.sessions.getSeqnums(e.session_id).then(b=>{a(String(b.sender)),o(String(b.target)),l(!1)}).catch(b=>{h(b.message),l(!1)})},[e.session_id]);async function y(){const b=parseInt(n,10),x=parseInt(i,10);if(isNaN(b)||isNaN(x)||b<1||x<1){h("Sequence numbers must be ≥ 1");return}d(!0),h(null);try{await G.sessions.setSeqnums(e.session_id,{sender:b,target:x}),r(),t()}catch(j){h(j.message??"Failed to set seqnums")}finally{d(!1)}}function g(){a("1"),o("1")}return c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal",style:{width:340},onClick:b=>b.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsxs("span",{children:["Sequence Numbers — ",v]}),c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:t,children:"✕"})]}),c.jsxs("div",{className:"modal-body",children:[p&&c.jsx("div",{className:"seqnum-warning",children:"⚠ Session is running — changing seqnums will trigger a sequence reset with the counterparty."}),s?c.jsx("div",{style:{color:"var(--text2)",padding:"12px 0"},children:"Loading…"}):c.jsxs("div",{className:"form-grid",style:{"--label-w":"140px"},children:[c.jsx("label",{children:"Next TX (outgoing)"}),c.jsx("input",{type:"number",min:1,value:n,onChange:b=>a(b.target.value),disabled:u}),c.jsx("label",{children:"Next RX (incoming)"}),c.jsx("input",{type:"number",min:1,value:i,onChange:b=>o(b.target.value),disabled:u})]}),f&&c.jsx("div",{className:"error-msg",children:f})]}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:g,disabled:s||u,children:"Reset 1/1"}),c.jsx("div",{style:{flex:1}}),c.jsx("button",{className:"btn btn-sm btn-secondary",onClick:t,children:"Cancel"}),c.jsx("button",{className:"btn btn-sm btn-primary",onClick:y,disabled:s||u,children:u?"Applying…":"Apply"})]})]})})}const r1=["display_name","begin_string","sender_comp_id","target_comp_id","connection_type","host","port","heartbeat_interval","reconnect_interval","use_file_log","start_time","end_time","reset_on_logon","reset_on_logout","session_role","data_dictionary_path"];function bv(e){return Object.fromEntries(r1.map(t=>[t,e[t]]))}function xv(e,t){const r=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(r),a=document.createElement("a");a.href=n,a.download=t,a.click(),URL.revokeObjectURL(n)}const n1={LOGGED_ON:"#4ade80",CONNECTING:"#facc15",LISTENING:"#facc15",LOGGED_OUT:"#94a3b8",STOPPED:"#94a3b8",ERROR:"#f87171"};function a1({status:e}){return c.jsxs("span",{className:"status-badge",style:{color:n1[e]??"#94a3b8"},children:["● ",e]})}function zd(e){const t=Math.floor(e/60),r=e%60;return t>0?`${t}m ${r}s`:`${r}s`}function i1({session:e}){const[,t]=m.useState(0),r=e.status==="LOGGED_ON",n=e.connection_type==="initiator"&&["CONNECTING","LOGGED_OUT"].includes(e.status);m.useEffect(()=>{if(!r&&!n)return;const i=setInterval(()=>t(o=>o+1),1e3);return()=>clearInterval(i)},[r,n]);const a=Date.now()/1e3;if(r&&e.status_changed_at){const i=Math.floor(a-e.status_changed_at);let o=null;if(e.last_heartbeat_at){const s=Math.floor(a-e.last_heartbeat_at),l=s<2*e.heartbeat_interval?"var(--green)":s<3*e.heartbeat_interval?"var(--yellow)":"var(--red)";o=c.jsxs("span",{style:{color:l},children:["· HB ",zd(s)," ago"]})}return c.jsxs("div",{className:"session-status-details",children:[c.jsxs("span",{children:["Connected ",zd(i)]}),o]})}if(n&&e.status_changed_at){const i=a-e.status_changed_at,o=Math.ceil(e.reconnect_interval-i%e.reconnect_interval);return c.jsx("div",{className:"session-status-details",children:c.jsxs("span",{style:{color:"var(--text2)"},children:["Reconnecting in ",o,"s"]})})}return null}function o1({session:e,active:t,onClick:r,showOwner:n}){const{upsertSession:a,removeSession:i}=ne(),[o,s]=m.useState(!1),[l,u]=m.useState(!1),[d,f]=m.useState(!1),h=!["STOPPED","ERROR"].includes(e.status);async function p(){s(!0);try{const g=h?await G.sessions.stop(e.session_id):await G.sessions.start(e.session_id);a(g)}catch(g){console.error(g)}finally{s(!1)}}async function v(){confirm(`Remove session "${e.display_name||e.sender_comp_id}"?`)&&(await G.sessions.remove(e.session_id),i(e.session_id))}const y=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;return c.jsxs("div",{className:`session-card${t?" active":""}`,onClick:r,children:[c.jsx("div",{className:"session-card-name",children:y}),c.jsxs("div",{className:"session-card-meta",children:[e.begin_string," · ",e.connection_type,c.jsx("span",{className:`role-badge role-${e.session_role}`,children:e.session_role}),n&&e.owner_username&&c.jsx("span",{className:"owner-badge",children:e.owner_username})]}),c.jsx(a1,{status:e.status}),c.jsx(i1,{session:e}),c.jsxs("div",{className:"session-card-seqnums",children:[c.jsxs("span",{children:["↑",e.last_sent_seq_num]}),c.jsxs("span",{children:["↓",e.last_recv_seq_num]}),c.jsxs("span",{children:[e.message_count," msgs"]})]}),c.jsxs("div",{className:"session-card-actions",onClick:g=>g.stopPropagation(),children:[c.jsx("button",{className:`btn btn-sm ${h?"btn-stop":"btn-start"}`,onClick:p,disabled:o,children:h?"Stop":"Start"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>u(!0),disabled:h,title:h?"Stop session to edit":"Edit config",children:"Edit"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>f(!0),title:"Set sequence numbers",children:"Seq"}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>xv([bv(e)],`${y}.json`),title:"Export this session",children:"⬇"}),c.jsx("button",{className:"btn btn-sm btn-danger",onClick:v,children:"✕"})]}),l&&c.jsx(e1,{session:e,onClose:()=>u(!1),onSaved:g=>{a(g),u(!1)}}),d&&c.jsx(t1,{session:e,onClose:()=>f(!1),onSaved:async()=>{const g=await G.sessions.get(e.session_id);a(g)}})]})}const Wd="sessions_mine_only";function s1(){const{sessions:e,activeTabId:t,openTab:r,upsertSession:n,user:a}=ne(),[i,o]=m.useState(!1),[s,l]=m.useState(""),[u,d]=m.useState(""),[f,h]=m.useState(()=>tt.get(Wd)==="1"),p=m.useRef(null),v=(a==null?void 0:a.role)==="platform_admin";function y(_){tt.set(Wd,_?"1":"0"),h(_)}async function g(_){const w=await G.sessions.create({..._,auto_start:_.auto_start});n(w),r(w.session_id)}function b(){const _=Object.values(e);if(_.length===0)return;const w=new Date().toISOString().slice(0,10);xv(_.map(bv),`fixture-sessions-${w}.json`)}async function x(_){var O;const w=(O=_.target.files)==null?void 0:O[0];if(p.current&&(p.current.value="",!!w)){l(""),d("");try{const P=await w.text();let A=JSON.parse(P);Array.isArray(A)||(A=[A]);const I=await G.sessions.import(A);I.length===0?l("No sessions imported — file may be empty or all entries conflicted."):(I.forEach(T=>{n(T)}),d(`Imported ${I.length} of ${A.length} session${A.length!==1?"s":""}.`),setTimeout(()=>d(""),4e3))}catch(P){l(P instanceof Error?P.message:"Import failed")}}}const j=Object.values(e),S=v&&f?j.filter(_=>_.owner_username===(a==null?void 0:a.username)):j;return c.jsxs("div",{className:"sessions-panel",children:[c.jsxs("div",{className:"sessions-panel-header",children:[c.jsx("span",{children:"Sessions"}),c.jsxs("div",{className:"sessions-panel-header-actions",children:[c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:b,disabled:j.length===0,title:"Export all sessions to JSON",children:"⬇ Export"}),c.jsx("button",{className:"btn btn-ghost btn-sm",onClick:()=>{var _;return(_=p.current)==null?void 0:_.click()},title:"Import sessions from JSON",children:"⬆ Import"}),c.jsx("input",{ref:p,type:"file",accept:".json,application/json",style:{display:"none"},onChange:x}),c.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>o(!0),children:"+ Add"})]})]}),v&&c.jsxs("div",{className:"sessions-filter-row",children:[c.jsx("button",{className:`btn btn-sm ${f?"btn-ghost":"btn-active"}`,onClick:()=>y(!1),title:"Show all users’ sessions",children:"All"}),c.jsx("button",{className:`btn btn-sm ${f?"btn-active":"btn-ghost"}`,onClick:()=>y(!0),title:"Show only your sessions",children:"Mine"})]}),s&&c.jsx("div",{className:"import-feedback import-error",children:s}),u&&c.jsx("div",{className:"import-feedback import-ok",children:u}),c.jsxs("div",{className:"sessions-list",children:[S.length===0&&c.jsx("div",{className:"sessions-empty",children:j.length>0?'No sessions of yours. Switch to "All" to see other users’ sessions.':"No sessions. Add one to get started."}),S.map(_=>c.jsx(o1,{session:_,active:_.session_id===t,onClick:()=>r(_.session_id),showOwner:(a==null?void 0:a.role)==="platform_admin"},_.session_id))]}),i&&c.jsx(XS,{onClose:()=>o(!1),onSubmit:g})]})}const Dc={D:{tag:"11",name:"ClOrdID"},F:{tag:"11",name:"ClOrdID"},G:{tag:"11",name:"ClOrdID"},AB:{tag:"11",name:"ClOrdID"},V:{tag:"262",name:"MDReqID"},R:{tag:"131",name:"QuoteReqID"},S:{tag:"117",name:"QuoteID"},x:{tag:"320",name:"SecurityReqID"}},da={autoTs:!0,autoId:!0,idPrefix:"",idCounter:1,autoExpiry:!0,expiryOffset:1,expiryUnit:"days",evalInline:!0,genRules:[]};function wv(e){return`fixture_send_opts_${e}`}function jv(e){try{const t=JSON.parse(tt.get(wv(e))??"null");return t?{...da,...t}:{...da}}catch{return{...da}}}function Sv(e,t){tt.set(wv(e),JSON.stringify(t))}function Ud(e){return e.replace(/\x01/g,"|").replace(/\|$/,"")}function pa(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e?`${e}|${t}=${r}`:`${t}=${r}`}function Hd(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e}function Ro(e=new Date){const t=e.toISOString();return t.slice(0,10).replace(/-/g,"")+"-"+t.slice(11,19)}function _v(e=new Date){return e.toISOString().slice(0,10).replace(/-/g,"")}const l1={minutes:6e4,hours:36e5,days:864e5};function c1(e,t){return new Date(Date.now()+e*l1[t])}function Ov(e,t){if(!t.autoExpiry)return e;const r=c1(t.expiryOffset,t.expiryUnit);return e=Hd(e,"126",Ro(r)),e=Hd(e,"432",_v(r)),e}const u1="uuid() · random_str() / random_str(n) · random_int(a,b) · timestamp() · date()",Gd="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Pv(e){const t=new Uint8Array(e);return crypto.getRandomValues(t),t}function d1(){const e=Pv(16);e[6]=e[6]&15|64,e[8]=e[8]&63|128;const t=[...e].map(r=>r.toString(16).padStart(2,"0"));return`${t.slice(0,4).join("")}-${t.slice(4,6).join("")}-${t.slice(6,8).join("")}-${t.slice(8,10).join("")}-${t.slice(10,16).join("")}`}function f1(e){const t=Number.isFinite(e)&&e>0?Math.min(Math.floor(e),256):8;return[...Pv(t)].map(r=>Gd[r%Gd.length]).join("")}function h1(e,t){const r=Math.ceil(Math.min(e,t)),n=Math.floor(Math.max(e,t));return r+Math.floor(Math.random()*(n-r+1))}const m1=/^(\w+)\(([^)]*)\)$/;function Nv(e){const t=e.trim().match(m1);if(!t)return e;const r=t[1],n=t[2].trim()?t[2].split(",").map(a=>a.trim()):[];switch(r){case"uuid":return d1();case"random_str":return f1(n[0]!==void 0?Number(n[0]):8);case"random_int":{const a=Number(n[0]),i=Number(n[1]);return!Number.isFinite(a)||!Number.isFinite(i)?e:String(h1(a,i))}case"timestamp":return Ro();case"date":return _v();default:return e}}function Cv(e){const t=e.includes("")?"":"|";return e.split(t).map(r=>{const n=r.indexOf("=");if(n<0)return r;const a=r.slice(0,n),i=r.slice(n+1),o=Nv(i);return o===i?r:`${a}=${o}`}).join(t)}function Ev(e,t){for(const r of t.genRules){const n=r.tag.trim();n&&(e=pa(e,n,Nv(r.value)))}return e}function Av({opts:e,onChange:t,expanded:r,onToggle:n,msgType:a}){const i=a?Dc[a]:void 0;function o(f){t({...e,...f})}const s=`${e.idPrefix}${e.idCounter}`;function l(f,h){o({genRules:e.genRules.map((p,v)=>v===f?{...p,...h}:p)})}function u(){o({genRules:[...e.genRules,{tag:"",value:""}]})}function d(f){o({genRules:e.genRules.filter((h,p)=>p!==f)})}return c.jsxs("div",{className:"send-opts",children:[c.jsxs("button",{type:"button",className:"btn btn-sm btn-ghost send-opts-toggle",onClick:n,children:[r?"▲":"▶"," Send Options"]}),r&&c.jsxs("div",{className:"send-opts-body",children:[c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoTs,onChange:f=>o({autoTs:f.target.checked})}),"Auto TransactTime (tag 60)"]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoId,onChange:f=>o({autoId:f.target.checked})}),i?`Auto-generate ${i.name} (tag ${i.tag})`:a?`Auto-generate ID — no mapping for type ${a}`:"Auto-generate ID tag"]}),e.autoId&&c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("span",{className:"send-opts-label",children:"Prefix"}),c.jsx("input",{className:"send-opts-prefix",value:e.idPrefix,onChange:f=>o({idPrefix:f.target.value}),placeholder:"e.g. ORD",maxLength:20}),c.jsxs("span",{className:"send-opts-next",children:["Next: ",c.jsx("code",{children:s||e.idCounter})]})]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.autoExpiry,onChange:f=>o({autoExpiry:f.target.checked})}),"Auto expiry (tags 126 / 432, only if present)"]}),e.autoExpiry&&c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("span",{className:"send-opts-label",children:"Future offset"}),c.jsx("input",{className:"send-opts-prefix",type:"number",min:0,style:{width:64},value:e.expiryOffset,onChange:f=>o({expiryOffset:Number(f.target.value)})}),c.jsxs("select",{value:e.expiryUnit,onChange:f=>o({expiryUnit:f.target.value}),children:[c.jsx("option",{value:"minutes",children:"minutes"}),c.jsx("option",{value:"hours",children:"hours"}),c.jsx("option",{value:"days",children:"days"})]}),c.jsx("span",{className:"send-opts-next",children:"126 = future time · 432 = that date"})]}),c.jsxs("label",{className:"checkbox-label",children:[c.jsx("input",{type:"checkbox",checked:e.evalInline,onChange:f=>o({evalInline:f.target.checked})}),"Evaluate value generators in the message (uuid(), random_str(), …)"]}),c.jsxs("div",{className:"send-opts-gen",children:[c.jsx("div",{className:"send-opts-label",children:"Custom tag generators"}),e.genRules.map((f,h)=>c.jsxs("div",{className:"send-opts-id-row",children:[c.jsx("input",{className:"send-opts-prefix",style:{width:64},placeholder:"tag",value:f.tag,onChange:p=>l(h,{tag:p.target.value.replace(/[^0-9]/g,"")})}),c.jsx("span",{children:"="}),c.jsx("input",{className:"send-opts-prefix",style:{flex:1},placeholder:"uuid() / random_str(8) / literal",value:f.value,onChange:p=>l(h,{value:p.target.value})}),c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost btn-danger-ghost",onClick:()=>d(h),title:"Remove rule",children:"✕"})]},h)),c.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:u,children:"+ Add tag generator"}),c.jsxs("div",{className:"send-opts-next",style:{marginTop:4},children:["Generators: ",u1,". Rules set the tag on every send (insert or replace); literal values are sent as-is."]})]})]})]})}const p1=["FIX.4.2","FIX.4.4"];function v1(e){const t={};for(const r of e.split("|")){const n=r.indexOf("=");if(n<1)continue;const a=r.slice(0,n).trim(),i=r.slice(n+1).trim();a&&!isNaN(Number(a))&&(t[a]=i)}return t}function Zd(e){return Object.entries(e).filter(([,t])=>t!=="").map(([t,r])=>`${t}=${r}`).join("|")}function g1({fieldRef:e,value:t,onChange:r}){const n=String(e.tag||""),a=Object.keys(e.values).length>0;return c.jsxs("tr",{className:`tpl-field-row${e.required?" required":""}`,children:[c.jsx("td",{className:"tpl-field-tag",children:e.tag||"?"}),c.jsxs("td",{className:"tpl-field-name",children:[e.name,e.required&&c.jsx("span",{className:"tpl-req-badge",children:"req"})]}),c.jsx("td",{className:"tpl-field-value",children:a?c.jsxs("select",{className:"tpl-select",value:t,onChange:i=>r(n,i.target.value),children:[c.jsx("option",{value:"",children:"— pick —"}),Object.entries(e.values).map(([i,o])=>c.jsxs("option",{value:i,children:[i," – ",o.replace(/_/g," ")]},i))]}):c.jsx("input",{className:"tpl-input",type:"text",value:t,placeholder:e.type,onChange:i=>r(n,i.target.value)})})]})}function Mc({template:e,defaultBeginString:t="FIX.4.2",onSaved:r,onClose:n}){const[a,i]=m.useState("fields"),[o,s]=m.useState((e==null?void 0:e.name)??""),[l,u]=m.useState((e==null?void 0:e.begin_string)??t),[d,f]=m.useState((e==null?void 0:e.msg_type)??""),[h,p]=m.useState((e==null?void 0:e.msg_type_name)??""),[v,y]=m.useState((e==null?void 0:e.fields)??{}),[g,b]=m.useState(()=>Zd((e==null?void 0:e.fields)??{})),[x,j]=m.useState([]),[S,_]=m.useState(null),[w,O]=m.useState(!1),[P,A]=m.useState(!1),[I,T]=m.useState("");m.useEffect(()=>{G.fixSpec.messages(l).then(j).catch(()=>j([]))},[l]),m.useEffect(()=>{if(!d){_(null);return}O(!0),G.fixSpec.message(l,d).then(R=>{_(R),O(!1)}).catch(()=>{_(null),O(!1)})},[l,d]);function N(R,oe){y(re=>({...re,[R]:oe}))}function K(R){const oe=x.find(re=>re.msg_type===R);f(R),p((oe==null?void 0:oe.name)??R),R&&y(re=>({...re,35:R}))}function $(R){b(R);const oe=v1(R);if(y(oe),oe[35]&&oe[35]!==d){const re=oe[35],z=x.find(L=>L.msg_type===re);f(re),p((z==null?void 0:z.name)??re)}}function U(R){R==="raw"&&b(Zd(v)),i(R)}const k=new Set((S==null?void 0:S.fields.map(R=>String(R.tag)).filter(Boolean))??[]),M=Object.entries(v).filter(([R])=>!k.has(R)&&R!=="35"),[B,W]=m.useState(""),[V,le]=m.useState("");function Q(){!B||isNaN(Number(B))||(N(B,V),W(""),le(""))}async function ge(){if(!o.trim()){T("Template name is required");return}if(!d){T("Message type is required");return}A(!0),T("");try{const R=Object.fromEntries(Object.entries(v).filter(([,z])=>z!=="")),oe={name:o.trim(),msg_type:d,msg_type_name:h,begin_string:l,fields:R},re=e!=null&&e.id?await G.templates.update(e.id,oe):await G.templates.create(oe);r(re)}catch(R){T(R instanceof Error?R.message:"Save failed")}finally{A(!1)}}const we=x.filter(R=>R.category==="app"),ze=x.filter(R=>R.category==="admin");return c.jsx("div",{className:"modal-overlay",onClick:n,children:c.jsxs("div",{className:"modal tpl-form-modal",onClick:R=>R.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:e!=null&&e.id?"Edit Template":"New Template"}),c.jsx("button",{className:"btn-icon",onClick:n,children:"✕"})]}),c.jsxs("div",{className:"tpl-form-top",children:[c.jsxs("div",{className:"tpl-form-row",children:[c.jsx("label",{className:"tpl-label",children:"Name"}),c.jsx("input",{className:"tpl-input tpl-name-input",value:o,onChange:R=>s(R.target.value),placeholder:"e.g. Buy 100 AAPL",autoFocus:!0})]}),c.jsxs("div",{className:"tpl-form-row",children:[c.jsx("label",{className:"tpl-label",children:"FIX version"}),c.jsx("select",{className:"tpl-select",value:l,onChange:R=>u(R.target.value),children:p1.map(R=>c.jsx("option",{value:R,children:R},R))}),c.jsx("label",{className:"tpl-label",style:{marginLeft:12},children:"Message type"}),c.jsxs("select",{className:"tpl-select tpl-msgtype-select",value:d,onChange:R=>K(R.target.value),children:[c.jsx("option",{value:"",children:"— select —"}),we.length>0&&c.jsx("optgroup",{label:"Application",children:we.map(R=>c.jsxs("option",{value:R.msg_type,children:[R.name," (",R.msg_type,")"]},R.msg_type))}),ze.length>0&&c.jsx("optgroup",{label:"Admin",children:ze.map(R=>c.jsxs("option",{value:R.msg_type,children:[R.name," (",R.msg_type,")"]},R.msg_type))})]})]})]}),c.jsxs("div",{className:"analysis-tabs",style:{marginBottom:0},children:[c.jsx("button",{className:`analysis-tab-btn${a==="fields"?" active":""}`,onClick:()=>U("fields"),children:"Fields"}),c.jsx("button",{className:`analysis-tab-btn${a==="raw"?" active":""}`,onClick:()=>U("raw"),children:"Raw FIX"})]}),c.jsxs("div",{className:"tpl-form-body",children:[a==="fields"&&c.jsxs("div",{className:"tpl-fields-tab",children:[!d&&c.jsx("div",{className:"tpl-no-msgtype",children:"Select a message type above to see its field definitions."}),d&&w&&c.jsx("div",{className:"tpl-loading",children:"Loading fields…"}),d&&!w&&c.jsxs("table",{className:"tpl-field-table",children:[c.jsx("thead",{children:c.jsxs("tr",{children:[c.jsx("th",{children:"Tag"}),c.jsx("th",{children:"Field"}),c.jsx("th",{children:"Value"})]})}),c.jsxs("tbody",{children:[S==null?void 0:S.fields.map(R=>c.jsx(g1,{fieldRef:R,value:v[String(R.tag)]??"",onChange:N},`${R.tag}-${R.name}`)),M.length>0&&c.jsxs(c.Fragment,{children:[c.jsx("tr",{className:"tpl-section-divider",children:c.jsx("td",{colSpan:3,children:"Custom / extra fields"})}),M.map(([R,oe])=>c.jsxs("tr",{className:"tpl-field-row",children:[c.jsx("td",{className:"tpl-field-tag",children:R}),c.jsx("td",{className:"tpl-field-name",children:Fr(Number(R))}),c.jsx("td",{className:"tpl-field-value",children:c.jsx("input",{className:"tpl-input",value:oe,onChange:re=>N(R,re.target.value)})})]},R))]}),c.jsxs("tr",{className:"tpl-add-field-row",children:[c.jsx("td",{children:c.jsx("input",{className:"tpl-input tpl-add-tag",type:"number",placeholder:"tag",value:B,onChange:R=>W(R.target.value)})}),c.jsx("td",{className:"tpl-field-name",style:{color:"var(--text2)",fontSize:11},children:B&&!isNaN(Number(B))?Fr(Number(B)):"add field"}),c.jsxs("td",{className:"tpl-field-value",style:{display:"flex",gap:4},children:[c.jsx("input",{className:"tpl-input",placeholder:"value",value:V,onChange:R=>le(R.target.value),onKeyDown:R=>{R.key==="Enter"&&Q()}}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:Q,children:"+"})]})]})]})]})]}),a==="raw"&&c.jsxs("div",{className:"tpl-raw-tab",children:[c.jsx("textarea",{className:"tpl-raw-textarea",value:g,onChange:R=>$(R.target.value),placeholder:"35=D|49=CLIENT|56=VENUE|55=AAPL|54=1|38=100|40=2|44=100.00",spellCheck:!1}),Object.keys(v).length>0&&c.jsxs("div",{className:"tpl-raw-preview",children:[c.jsx("div",{className:"tpl-raw-preview-title",children:"Parsed fields"}),c.jsx("table",{className:"tpl-field-table tpl-preview-table",children:c.jsx("tbody",{children:Object.entries(v).map(([R,oe])=>c.jsxs("tr",{children:[c.jsx("td",{className:"tpl-field-tag",children:R}),c.jsx("td",{className:"tpl-field-name",children:Fr(Number(R))}),c.jsx("td",{className:"tpl-field-value",style:{color:"var(--text)"},children:oe})]},R))})})]})]})]}),I&&c.jsx("div",{className:"tpl-error",children:I}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{className:"btn btn-ghost",onClick:n,children:"Cancel"}),c.jsx("button",{className:"btn btn-primary",onClick:ge,disabled:P,children:P?"Saving…":"Save template"})]})]})})}function Iv({onSelect:e,onClose:t,defaultBeginString:r="FIX.4.2"}){const[n,a]=m.useState([]),[i,o]=m.useState(!0),[s,l]=m.useState(!1),[u,d]=m.useState(null);async function f(){o(!0);try{a(await G.templates.list())}finally{o(!1)}}m.useEffect(()=>{f()},[]);async function h(g,b){b.stopPropagation(),confirm(`Delete template "${g.name}"?`)&&(await G.templates.delete(g.id),a(x=>x.filter(j=>j.id!==g.id)))}function p(g,b){b.stopPropagation(),d(g),l(!0)}function v(g){l(!1),d(null),f()}const y=n.reduce((g,b)=>{const x=`${b.msg_type_name} (${b.msg_type})`;return(g[x]??(g[x]=[])).push(b),g},{});return s?c.jsx(Mc,{template:u??void 0,defaultBeginString:r,onSaved:v,onClose:()=>{l(!1),d(null)}}):c.jsx("div",{className:"modal-overlay",onClick:t,children:c.jsxs("div",{className:"modal template-picker-modal",onClick:g=>g.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsx("span",{children:"Templates"}),c.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),c.jsx("div",{className:"template-picker-toolbar",children:c.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>{d(null),l(!0)},children:"+ New template"})}),c.jsxs("div",{className:"template-picker-body",children:[i&&c.jsx("div",{className:"template-picker-empty",children:"Loading…"}),!i&&n.length===0&&c.jsx("div",{className:"template-picker-empty",children:"No templates yet. Create one to reuse pre-populated FIX messages."}),!i&&Object.entries(y).sort(([g],[b])=>g.localeCompare(b)).map(([g,b])=>c.jsxs("div",{className:"template-group",children:[c.jsx("div",{className:"template-group-title",children:g}),b.map(x=>c.jsxs("div",{className:"template-row",onClick:()=>{e(x),t()},children:[c.jsx("div",{className:"template-row-name",children:x.name}),c.jsxs("div",{className:"template-row-meta",children:[c.jsx("span",{className:"template-begin-string",children:x.begin_string}),c.jsxs("span",{className:"template-field-count",children:[Object.keys(x.fields).length," fields"]})]}),c.jsxs("div",{className:"template-row-actions",onClick:j=>j.stopPropagation(),children:[c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:j=>p(x,j),title:"Edit",children:"✎"}),c.jsx("button",{className:"btn btn-sm btn-danger",onClick:j=>h(x,j),title:"Delete",children:"✕"})]})]},x.id))]},g))]})]})})}function Kd(e){return`fixture_compose_${e}`}const y1=new Set(["8","9","10","34","49","56"]);function qd(e){const t=e.includes("")?"":"|";return e.split(t).filter(r=>r.includes("=")).map(r=>{const n=r.indexOf("=");return{tag:r.slice(0,n).trim(),value:r.slice(n+1)}}).filter(r=>r.tag!=="")}function b1({session:e,raw:t,onRawChange:r,onClose:n}){var T;const a=ne(N=>N.user),[i,o]=m.useState(!1),[s,l]=m.useState(null),[u,d]=m.useState(()=>a?jv(a.uid):{...da}),[f,h]=m.useState(!1),[p,v]=m.useState(!1),[y,g]=m.useState(!1);m.useEffect(()=>{if(a&&!t){const N=tt.get(Kd(a.uid));N&&r(N)}},[]);function b(N){const K=Object.entries(N.fields).filter(([,$])=>$!=="").map(([$,U])=>`${$}=${U}`).join("|");j(K)}function x(){return Object.fromEntries(qd(t).map(N=>[N.tag,N.value]))}function j(N){r(N),a&&tt.set(Kd(a.uid),N)}function S(N){d(N),a&&Sv(a.uid,N)}const _=t.trim()?qd(t):[],w=_.filter(N=>!y1.has(N.tag)),O=((T=_.find(N=>N.tag==="35"))==null?void 0:T.value)??"",P=!!O,A=P&&e.status==="LOGGED_ON";async function I(){if(A){o(!0),l(null);try{let N=t;if(u.autoId&&O){const K=Dc[O];if(K){const $=`${u.idPrefix}${u.idCounter}`;N=pa(N,K.tag,$),S({...u,idCounter:u.idCounter+1})}}u.autoTs&&(N=pa(N,"60",Ro())),N=Ov(N,u),u.evalInline&&(N=Cv(N)),N=Ev(N,u),await G.sessions.send(e.session_id,N,{noAutoTs:!u.autoTs})}catch(N){l(N.message??"Send failed")}finally{o(!1)}}}return c.jsxs("div",{className:"compose-pane",children:[c.jsx("textarea",{className:"compose-textarea",placeholder:`Paste raw FIX (pipe- or SOH-delimited)
37
37
  8=FIX.4.2|35=D|49=SENDER|56=TARGET|11=ORD1|55=AAPL|54=1|38=100|40=2|44=150.00`,value:t,onChange:N=>{j(N.target.value),l(null)},rows:4,spellCheck:!1}),w.length>0&&c.jsx("div",{className:"compose-fields",children:c.jsxs("table",{className:"compose-fields-table",children:[c.jsx("thead",{children:c.jsxs("tr",{children:[c.jsx("th",{children:"Tag"}),c.jsx("th",{children:"Value"})]})}),c.jsx("tbody",{children:w.map((N,K)=>c.jsxs("tr",{children:[c.jsx("td",{children:N.tag}),c.jsx("td",{children:N.value})]},K))})]})}),w.length>0&&c.jsxs("div",{className:"compose-managed-note",children:["FIXture sets: 49=",e.sender_comp_id," · 56=",e.target_comp_id," · 8, 9, 10, 34"]}),c.jsx(Av,{opts:u,onChange:S,expanded:f,onToggle:()=>h(N=>!N),msgType:O||void 0}),c.jsxs("div",{className:"compose-footer",children:[c.jsx("button",{className:"btn btn-sm btn-primary",onClick:I,disabled:!A||i,title:P?e.status!=="LOGGED_ON"?"Session must be logged on":void 0:"Message needs tag 35 (MsgType)",children:i?"Sending…":`Send on ${e.sender_comp_id}→${e.target_comp_id}`}),c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>v(!0),title:"Load a template",children:"Templates"}),t.trim()&&c.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>g(!0),title:"Save current message as a template",children:"Save as template"}),s&&c.jsx("span",{className:"compose-error",children:s}),c.jsx("button",{className:"btn btn-sm btn-ghost compose-close",onClick:n,children:"✕"})]}),p&&c.jsx(Iv,{defaultBeginString:e.begin_string,onSelect:b,onClose:()=>v(!1)}),y&&c.jsx(Mc,{defaultBeginString:e.begin_string,template:{id:"",name:"",msg_type:O,msg_type_name:"",begin_string:e.begin_string,fields:x()},onSaved:()=>g(!1),onClose:()=>g(!1)})]})}function x1({row:e,sessionId:t,onClose:r}){const n=ne(v=>v.user),[a,i]=m.useState(()=>n?jv(n.uid):{...da}),[o,s]=m.useState(!1),[l,u]=m.useState(""),[d,f]=m.useState(!1);function h(v){i(v),n&&Sv(n.uid,v)}async function p(){u(""),f(!0);try{let v=Ud(e.raw);if(a.autoId){const y=Dc[e.msg_type];if(y){const g=`${a.idPrefix}${a.idCounter}`;v=pa(v,y.tag,g),h({...a,idCounter:a.idCounter+1})}}a.autoTs&&(v=pa(v,"60",Ro())),v=Ov(v,a),a.evalInline&&(v=Cv(v)),v=Ev(v,a),await G.sessions.send(t,v,{noAutoTs:!a.autoTs}),r()}catch(v){u(v instanceof Error?v.message:String(v))}finally{f(!1)}}return c.jsx("div",{className:"modal-overlay",onClick:r,children:c.jsxs("div",{className:"modal",onClick:v=>v.stopPropagation(),children:[c.jsxs("div",{className:"modal-header",children:[c.jsxs("span",{children:["Resend — ",e.msg_type_name," (seq ",e.seq_num,")"]}),c.jsx("button",{className:"btn-icon",onClick:r,children:"✕"})]}),c.jsxs("div",{style:{padding:"12px 16px",display:"flex",flexDirection:"column",gap:10},children:[c.jsx("div",{className:"resend-raw",children:Ud(e.raw)}),c.jsx(Av,{opts:a,onChange:h,expanded:o,onToggle:()=>s(v=>!v),msgType:e.msg_type})]}),l&&c.jsx("div",{className:"error-msg",style:{margin:"0 16px 8px"},children:l}),c.jsxs("div",{className:"modal-footer",children:[c.jsx("button",{className:"btn btn-secondary",onClick:r,children:"Cancel"}),c.jsx("button",{className:"btn btn-primary",onClick:p,disabled:d,children:d?"Sending…":"Send"})]})]})})}function kv(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=kv(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}function ce(){for(var e,t,r=0,n="",a=arguments.length;r<a;r++)(e=arguments[r])&&(t=kv(e))&&(n&&(n+=" "),n+=t);return n}var w1=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function Rc(e){if(typeof e!="string")return!1;var t=w1;return t.includes(e)}var j1=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],S1=new Set(j1);function Tv(e){return typeof e!="string"?!1:S1.has(e)}function Dv(e){return typeof e=="string"&&e.startsWith("data-")}function Nt(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Tv(r)||Dv(r))&&(t[r]=e[r]);return t}function Ra(e){if(e==null)return null;if(m.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return Nt(t)}return typeof e=="object"&&!Array.isArray(e)?Nt(e):null}function Je(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Tv(r)||Dv(r)||Rc(r))&&(t[r]=e[r]);return t}function _1(e){return e==null?null:m.isValidElement(e)?Je(e.props):typeof e=="object"&&!Array.isArray(e)?Je(e):null}var O1=["children","width","height","viewBox","className","style","title","desc"];function Nl(){return Nl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Nl.apply(null,arguments)}function P1(e,t){if(e==null)return{};var r,n,a=N1(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function N1(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var $c=m.forwardRef((e,t)=>{var{children:r,width:n,height:a,viewBox:i,className:o,style:s,title:l,desc:u}=e,d=P1(e,O1),f=i||{width:n,height:a,x:0,y:0},h=ce("recharts-surface",o);return m.createElement("svg",Nl({},Je(d),{className:h,width:n,height:a,style:s,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),m.createElement("title",null,l),m.createElement("desc",null,u),r)}),C1=["children","className"];function Cl(){return Cl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Cl.apply(null,arguments)}function E1(e,t){if(e==null)return{};var r,n,a=A1(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function A1(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var lt=m.forwardRef((e,t)=>{var{children:r,className:n}=e,a=E1(e,C1),i=ce("recharts-layer",n);return m.createElement("g",Cl({className:i},Je(a),{ref:t}),r)}),Mv=m.createContext(null),I1=()=>m.useContext(Mv);function he(e){return function(){return e}}const Rv=Math.cos,Ti=Math.sin,It=Math.sqrt,Di=Math.PI,$o=2*Di,El=Math.PI,Al=2*El,Ir=1e-6,k1=Al-Ir;function $v(e){this._+=e[0];for(let t=1,r=e.length;t<r;++t)this._+=arguments[t]+e[t]}function T1(e){let t=Math.floor(e);if(!(t>=0))throw new Error(`invalid digits: ${e}`);if(t>15)return $v;const r=10**t;return function(n){this._+=n[0];for(let a=1,i=n.length;a<i;++a)this._+=Math.round(arguments[a]*r)/r+n[a]}}class D1{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=t==null?$v:T1(t)}moveTo(t,r){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,r){this._append`L${this._x1=+t},${this._y1=+r}`}quadraticCurveTo(t,r,n,a){this._append`Q${+t},${+r},${this._x1=+n},${this._y1=+a}`}bezierCurveTo(t,r,n,a,i,o){this._append`C${+t},${+r},${+n},${+a},${this._x1=+i},${this._y1=+o}`}arcTo(t,r,n,a,i){if(t=+t,r=+r,n=+n,a=+a,i=+i,i<0)throw new Error(`negative radius: ${i}`);let o=this._x1,s=this._y1,l=n-t,u=a-r,d=o-t,f=s-r,h=d*d+f*f;if(this._x1===null)this._append`M${this._x1=t},${this._y1=r}`;else if(h>Ir)if(!(Math.abs(f*l-u*d)>Ir)||!i)this._append`L${this._x1=t},${this._y1=r}`;else{let p=n-o,v=a-s,y=l*l+u*u,g=p*p+v*v,b=Math.sqrt(y),x=Math.sqrt(h),j=i*Math.tan((El-Math.acos((y+h-g)/(2*b*x)))/2),S=j/x,_=j/b;Math.abs(S-1)>Ir&&this._append`L${t+S*d},${r+S*f}`,this._append`A${i},${i},0,0,${+(f*p>d*v)},${this._x1=t+_*l},${this._y1=r+_*u}`}}arc(t,r,n,a,i,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(a),l=n*Math.sin(a),u=t+s,d=r+l,f=1^o,h=o?a-i:i-a;this._x1===null?this._append`M${u},${d}`:(Math.abs(this._x1-u)>Ir||Math.abs(this._y1-d)>Ir)&&this._append`L${u},${d}`,n&&(h<0&&(h=h%Al+Al),h>k1?this._append`A${n},${n},0,1,${f},${t-s},${r-l}A${n},${n},0,1,${f},${this._x1=u},${this._y1=d}`:h>Ir&&this._append`A${n},${n},0,${+(h>=El)},${f},${this._x1=t+n*Math.cos(i)},${this._y1=r+n*Math.sin(i)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function Lc(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new D1(t)}function Fc(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function Lv(e){this._context=e}Lv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function Lo(e){return new Lv(e)}function Fv(e){return e[0]}function Bv(e){return e[1]}function zv(e,t){var r=he(!0),n=null,a=Lo,i=null,o=Lc(s);e=typeof e=="function"?e:e===void 0?Fv:he(e),t=typeof t=="function"?t:t===void 0?Bv:he(t);function s(l){var u,d=(l=Fc(l)).length,f,h=!1,p;for(n==null&&(i=a(p=o())),u=0;u<=d;++u)!(u<d&&r(f=l[u],u,l))===h&&((h=!h)?i.lineStart():i.lineEnd()),h&&i.point(+e(f,u,l),+t(f,u,l));if(p)return i=null,p+""||null}return s.x=function(l){return arguments.length?(e=typeof l=="function"?l:he(+l),s):e},s.y=function(l){return arguments.length?(t=typeof l=="function"?l:he(+l),s):t},s.defined=function(l){return arguments.length?(r=typeof l=="function"?l:he(!!l),s):r},s.curve=function(l){return arguments.length?(a=l,n!=null&&(i=a(n)),s):a},s.context=function(l){return arguments.length?(l==null?n=i=null:i=a(n=l),s):n},s}function ai(e,t,r){var n=null,a=he(!0),i=null,o=Lo,s=null,l=Lc(u);e=typeof e=="function"?e:e===void 0?Fv:he(+e),t=typeof t=="function"?t:he(t===void 0?0:+t),r=typeof r=="function"?r:r===void 0?Bv:he(+r);function u(f){var h,p,v,y=(f=Fc(f)).length,g,b=!1,x,j=new Array(y),S=new Array(y);for(i==null&&(s=o(x=l())),h=0;h<=y;++h){if(!(h<y&&a(g=f[h],h,f))===b)if(b=!b)p=h,s.areaStart(),s.lineStart();else{for(s.lineEnd(),s.lineStart(),v=h-1;v>=p;--v)s.point(j[v],S[v]);s.lineEnd(),s.areaEnd()}b&&(j[h]=+e(g,h,f),S[h]=+t(g,h,f),s.point(n?+n(g,h,f):j[h],r?+r(g,h,f):S[h]))}if(x)return s=null,x+""||null}function d(){return zv().defined(a).curve(o).context(i)}return u.x=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),n=null,u):e},u.x0=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),u):e},u.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:he(+f),u):n},u.y=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),r=null,u):t},u.y0=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),u):t},u.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:he(+f),u):r},u.lineX0=u.lineY0=function(){return d().x(e).y(t)},u.lineY1=function(){return d().x(e).y(r)},u.lineX1=function(){return d().x(n).y(t)},u.defined=function(f){return arguments.length?(a=typeof f=="function"?f:he(!!f),u):a},u.curve=function(f){return arguments.length?(o=f,i!=null&&(s=o(i)),u):o},u.context=function(f){return arguments.length?(f==null?i=s=null:s=o(i=f),u):i},u}class Wv{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function M1(e){return new Wv(e,!0)}function R1(e){return new Wv(e,!1)}const Bc={draw(e,t){const r=It(t/Di);e.moveTo(r,0),e.arc(0,0,r,0,$o)}},$1={draw(e,t){const r=It(t/5)/2;e.moveTo(-3*r,-r),e.lineTo(-r,-r),e.lineTo(-r,-3*r),e.lineTo(r,-3*r),e.lineTo(r,-r),e.lineTo(3*r,-r),e.lineTo(3*r,r),e.lineTo(r,r),e.lineTo(r,3*r),e.lineTo(-r,3*r),e.lineTo(-r,r),e.lineTo(-3*r,r),e.closePath()}},Uv=It(1/3),L1=Uv*2,F1={draw(e,t){const r=It(t/L1),n=r*Uv;e.moveTo(0,-r),e.lineTo(n,0),e.lineTo(0,r),e.lineTo(-n,0),e.closePath()}},B1={draw(e,t){const r=It(t),n=-r/2;e.rect(n,n,r,r)}},z1=.8908130915292852,Hv=Ti(Di/10)/Ti(7*Di/10),W1=Ti($o/10)*Hv,U1=-Rv($o/10)*Hv,H1={draw(e,t){const r=It(t*z1),n=W1*r,a=U1*r;e.moveTo(0,-r),e.lineTo(n,a);for(let i=1;i<5;++i){const o=$o*i/5,s=Rv(o),l=Ti(o);e.lineTo(l*r,-s*r),e.lineTo(s*n-l*a,l*n+s*a)}e.closePath()}},qs=It(3),G1={draw(e,t){const r=-It(t/(qs*3));e.moveTo(0,r*2),e.lineTo(-qs*r,-r),e.lineTo(qs*r,-r),e.closePath()}},ht=-.5,mt=It(3)/2,Il=1/It(12),Z1=(Il/2+1)*3,K1={draw(e,t){const r=It(t/Z1),n=r/2,a=r*Il,i=n,o=r*Il+r,s=-i,l=o;e.moveTo(n,a),e.lineTo(i,o),e.lineTo(s,l),e.lineTo(ht*n-mt*a,mt*n+ht*a),e.lineTo(ht*i-mt*o,mt*i+ht*o),e.lineTo(ht*s-mt*l,mt*s+ht*l),e.lineTo(ht*n+mt*a,ht*a-mt*n),e.lineTo(ht*i+mt*o,ht*o-mt*i),e.lineTo(ht*s+mt*l,ht*l-mt*s),e.closePath()}};function q1(e,t){let r=null,n=Lc(a);e=typeof e=="function"?e:he(e||Bc),t=typeof t=="function"?t:he(t===void 0?64:+t);function a(){let i;if(r||(r=i=n()),e.apply(this,arguments).draw(r,+t.apply(this,arguments)),i)return r=null,i+""||null}return a.type=function(i){return arguments.length?(e=typeof i=="function"?i:he(i),a):e},a.size=function(i){return arguments.length?(t=typeof i=="function"?i:he(+i),a):t},a.context=function(i){return arguments.length?(r=i??null,a):r},a}function Mi(){}function Ri(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function Gv(e){this._context=e}Gv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Ri(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ri(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Y1(e){return new Gv(e)}function Zv(e){this._context=e}Zv.prototype={areaStart:Mi,areaEnd:Mi,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Ri(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function X1(e){return new Zv(e)}function Kv(e){this._context=e}Kv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Ri(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function V1(e){return new Kv(e)}function qv(e){this._context=e}qv.prototype={areaStart:Mi,areaEnd:Mi,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function J1(e){return new qv(e)}function Yd(e){return e<0?-1:1}function Xd(e,t,r){var n=e._x1-e._x0,a=t-e._x1,i=(e._y1-e._y0)/(n||a<0&&-0),o=(r-e._y1)/(a||n<0&&-0),s=(i*a+o*n)/(n+a);return(Yd(i)+Yd(o))*Math.min(Math.abs(i),Math.abs(o),.5*Math.abs(s))||0}function Vd(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function Ys(e,t,r){var n=e._x0,a=e._y0,i=e._x1,o=e._y1,s=(i-n)/3;e._context.bezierCurveTo(n+s,a+s*t,i-s,o-s*r,i,o)}function $i(e){this._context=e}$i.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Ys(this,this._t0,Vd(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,Ys(this,Vd(this,r=Xd(this,e,t)),r);break;default:Ys(this,this._t0,r=Xd(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function Yv(e){this._context=new Xv(e)}(Yv.prototype=Object.create($i.prototype)).point=function(e,t){$i.prototype.point.call(this,t,e)};function Xv(e){this._context=e}Xv.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,i){this._context.bezierCurveTo(t,e,n,r,i,a)}};function Q1(e){return new $i(e)}function e_(e){return new Yv(e)}function Vv(e){this._context=e}Vv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Jd(e),a=Jd(t),i=0,o=1;o<r;++i,++o)this._context.bezierCurveTo(n[0][i],a[0][i],n[1][i],a[1][i],e[o],t[o]);(this._line||this._line!==0&&r===1)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(e,t){this._x.push(+e),this._y.push(+t)}};function Jd(e){var t,r=e.length-1,n,a=new Array(r),i=new Array(r),o=new Array(r);for(a[0]=0,i[0]=2,o[0]=e[0]+2*e[1],t=1;t<r-1;++t)a[t]=1,i[t]=4,o[t]=4*e[t]+2*e[t+1];for(a[r-1]=2,i[r-1]=7,o[r-1]=8*e[r-1]+e[r],t=1;t<r;++t)n=a[t]/i[t-1],i[t]-=n,o[t]-=n*o[t-1];for(a[r-1]=o[r-1]/i[r-1],t=r-2;t>=0;--t)a[t]=(o[t]-a[t+1])/i[t];for(i[r-1]=(e[r]+a[r-1])/2,t=0;t<r-1;++t)i[t]=2*e[t+1]-a[t+1];return[a,i]}function t_(e){return new Vv(e)}function Fo(e,t){this._context=e,this._t=t}Fo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function r_(e){return new Fo(e,.5)}function n_(e){return new Fo(e,0)}function a_(e){return new Fo(e,1)}function Hr(e,t){if((o=e.length)>1)for(var r=1,n,a,i=e[t[0]],o,s=i.length;r<o;++r)for(a=i,i=e[t[r]],n=0;n<s;++n)i[n][1]+=i[n][0]=isNaN(a[n][1])?a[n][0]:a[n][1]}function kl(e){for(var t=e.length,r=new Array(t);--t>=0;)r[t]=t;return r}function i_(e,t){return e[t]}function o_(e){const t=[];return t.key=e,t}function s_(){var e=he([]),t=kl,r=Hr,n=i_;function a(i){var o=Array.from(e.apply(this,arguments),o_),s,l=o.length,u=-1,d;for(const f of i)for(s=0,++u;s<l;++s)(o[s][u]=[0,+n(f,o[s].key,u,i)]).data=f;for(s=0,d=Fc(t(o));s<l;++s)o[d[s]].index=s;return r(o,d),o}return a.keys=function(i){return arguments.length?(e=typeof i=="function"?i:he(Array.from(i)),a):e},a.value=function(i){return arguments.length?(n=typeof i=="function"?i:he(+i),a):n},a.order=function(i){return arguments.length?(t=i==null?kl:typeof i=="function"?i:he(Array.from(i)),a):t},a.offset=function(i){return arguments.length?(r=i??Hr,a):r},a}function l_(e,t){if((n=e.length)>0){for(var r,n,a=0,i=e[0].length,o;a<i;++a){for(o=r=0;r<n;++r)o+=e[r][a][1]||0;if(o)for(r=0;r<n;++r)e[r][a][1]/=o}Hr(e,t)}}function c_(e,t){if((a=e.length)>0){for(var r=0,n=e[t[0]],a,i=n.length;r<i;++r){for(var o=0,s=0;o<a;++o)s+=e[o][r][1]||0;n[r][1]+=n[r][0]=-s/2}Hr(e,t)}}function u_(e,t){if(!(!((o=e.length)>0)||!((i=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,i,o;n<i;++n){for(var s=0,l=0,u=0;s<o;++s){for(var d=e[t[s]],f=d[n][1]||0,h=d[n-1][1]||0,p=(f-h)/2,v=0;v<s;++v){var y=e[t[v]],g=y[n][1]||0,b=y[n-1][1]||0;p+=g-b}l+=f,u+=p*f}a[n-1][1]+=a[n-1][0]=r,l&&(r-=u/l)}a[n-1][1]+=a[n-1][0]=r,Hr(e,t)}}var Bo={},Jv={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==="__proto__"}e.isUnsafeProperty=t})(Jv);var zc={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){switch(typeof r){case"number":case"symbol":return!1;case"string":return r.includes(".")||r.includes("[")||r.includes("]")}}e.isDeepKey=t})(zc);var zo={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){var n;return typeof r=="string"||typeof r=="symbol"?r:Object.is((n=r==null?void 0:r.valueOf)==null?void 0:n.call(r),-0)?"-0":String(r)}e.toKey=t})(zo);var Wo={},Qv={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){if(r==null)return"";if(typeof r=="string")return r;if(Array.isArray(r))return r.map(t).join(",");const n=String(r);return n==="0"&&Object.is(Number(r),-0)?"-0":n}e.toString=t})(Qv);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Qv,r=zo;function n(a){if(Array.isArray(a))return a.map(r.toKey);if(typeof a=="symbol")return[a];a=t.toString(a);const i=[],o=a.length;if(o===0)return i;let s=0,l="",u="",d=!1;for(a.charCodeAt(0)===46&&(i.push(""),s++);s<o;){const f=a[s];u?f==="\\"&&s+1<o?(s++,l+=a[s]):f===u?u="":l+=f:d?f==='"'||f==="'"?u=f:f==="]"?(d=!1,i.push(l),l=""):l+=f:f==="["?(d=!0,l&&(i.push(l),l="")):f==="."?l&&(i.push(l),l=""):l+=f,s++}return l&&i.push(l),i}e.toPath=n})(Wo);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Jv,r=zc,n=zo,a=Wo;function i(s,l,u){if(s==null)return u;switch(typeof l){case"string":{if(t.isUnsafeProperty(l))return u;const d=s[l];return d===void 0?r.isDeepKey(l)?i(s,a.toPath(l),u):u:d}case"number":case"symbol":{typeof l=="number"&&(l=n.toKey(l));const d=s[l];return d===void 0?u:d}default:{if(Array.isArray(l))return o(s,l,u);if(Object.is(l==null?void 0:l.valueOf(),-0)?l="-0":l=String(l),t.isUnsafeProperty(l))return u;const d=s[l];return d===void 0?u:d}}}function o(s,l,u){if(l.length===0)return u;let d=s;for(let f=0;f<l.length;f++){if(d==null||t.isUnsafeProperty(l[f]))return u;d=d[l[f]]}return d===void 0?u:d}e.get=i})(Bo);var d_=Bo.get;const On=_r(d_);var f_=4;function gr(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:f_,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function _e(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return e.reduce((a,i,o)=>{var s=r[o-1];return typeof s=="string"?a+s+i:s!==void 0?a+gr(s)+i:a+i},"")}var rt=e=>e===0?0:e>0?1:-1,Ut=e=>typeof e=="number"&&e!=+e,Gr=e=>typeof e=="string"&&e.indexOf("%")===e.length-1,Z=e=>(typeof e=="number"||e instanceof Number)&&!Ut(e),Ht=e=>Z(e)||typeof e=="string",h_=0,va=e=>{var t=++h_;return"".concat(e||"").concat(t)},Ct=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Z(t)&&typeof t!="string")return n;var i;if(Gr(t)){if(r==null)return n;var o=t.indexOf("%");i=r*parseFloat(t.slice(0,o))/100}else i=+t;return Ut(i)&&(i=n),a&&r!=null&&i>r&&(i=r),i},eg=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;n<t;n++)if(!r[String(e[n])])r[String(e[n])]=!0;else return!0;return!1};function Oe(e,t,r){return Z(e)&&Z(t)?gr(e+r*(t-e)):t}function tg(e,t,r){if(!(!e||!e.length))return e.find(n=>n&&(typeof t=="function"?t(n):On(n,t))===r)}var xe=e=>e===null||typeof e>"u",$a=e=>xe(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function nt(e){return e!=null}function en(){}var m_=["type","size","sizeType"];function Tl(){return Tl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Tl.apply(null,arguments)}function Qd(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ef(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?Qd(Object(r),!0).forEach(function(n){p_(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Qd(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function p_(e,t,r){return(t=v_(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function v_(e){var t=g_(e,"string");return typeof t=="symbol"?t:t+""}function g_(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function y_(e,t){if(e==null)return{};var r,n,a=b_(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function b_(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var rg={symbolCircle:Bc,symbolCross:$1,symbolDiamond:F1,symbolSquare:B1,symbolStar:H1,symbolTriangle:G1,symbolWye:K1},x_=Math.PI/180,w_=e=>{var t="symbol".concat($a(e));return rg[t]||Bc},j_=(e,t,r)=>{if(t==="area")return e;switch(r){case"cross":return 5*e*e/9;case"diamond":return .5*e*e/Math.sqrt(3);case"square":return e*e;case"star":{var n=18*x_;return 1.25*e*e*(Math.tan(n)-Math.tan(n*2)*Math.tan(n)**2)}case"triangle":return Math.sqrt(3)*e*e/4;case"wye":return(21-10*Math.sqrt(3))*e*e/8;default:return Math.PI*e*e/4}},S_=(e,t)=>{rg["symbol".concat($a(e))]=t},Wc=e=>{var{type:t="circle",size:r=64,sizeType:n="area"}=e,a=y_(e,m_),i=ef(ef({},a),{},{type:t,size:r,sizeType:n}),o="circle";typeof t=="string"&&(o=t);var s=()=>{var h=w_(o),p=q1().type(h).size(j_(r,n,o)),v=p();if(v!==null)return v},{className:l,cx:u,cy:d}=i,f=Je(i);return Z(u)&&Z(d)&&Z(r)?m.createElement("path",Tl({},f,{className:ce("recharts-symbols",l),transform:"translate(".concat(u,", ").concat(d,")"),d:s()})):null};Wc.registerSymbol=S_;var ng=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Uc=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(m.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{Rc(a)&&typeof r[a]=="function"&&(n[a]=i=>r[a](r,i))}),n},__=(e,t,r)=>n=>(e(t,r,n),null),Uo=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var i=e[a];Rc(a)&&typeof i=="function"&&(n||(n={}),n[a]=__(i,t,r))}),n};function tf(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function O_(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?tf(Object(r),!0).forEach(function(n){P_(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):tf(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function P_(e,t,r){return(t=N_(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function N_(e){var t=C_(e,"string");return typeof t=="symbol"?t:t+""}function C_(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ge(e,t){var r=O_({},e),n=t,a=Object.keys(t),i=a.reduce((o,s)=>(o[s]===void 0&&n[s]!==void 0&&(o[s]=n[s]),o),r);return i}function Li(){return Li=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Li.apply(null,arguments)}function rf(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ag(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?rf(Object(r),!0).forEach(function(n){E_(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):rf(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function E_(e,t,r){return(t=A_(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function A_(e){var t=I_(e,"string");return typeof t=="symbol"?t:t+""}function I_(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var vt=32,k_={align:"center",iconSize:14,inactiveColor:"#ccc",layout:"horizontal",verticalAlign:"middle",labelStyle:{}};function T_(e){if(typeof e=="object"&&e!==null&&"strokeDasharray"in e)return String(e.strokeDasharray)}function D_(e){var{data:t,iconType:r,inactiveColor:n}=e,a=vt/2,i=vt/6,o=vt/3,s=t.inactive?n:t.color,l=r??t.type;if(l==="none")return null;if(l==="plainline")return m.createElement("line",{strokeWidth:4,fill:"none",stroke:s,strokeDasharray:T_(t.payload),x1:0,y1:a,x2:vt,y2:a,className:"recharts-legend-icon"});if(l==="line")return m.createElement("path",{strokeWidth:4,fill:"none",stroke:s,d:"M0,".concat(a,"h").concat(o,`
38
38
  A`).concat(i,",").concat(i,",0,1,1,").concat(2*o,",").concat(a,`
39
39
  H`).concat(vt,"M").concat(2*o,",").concat(a,`