@evomap/evolver 1.89.20 → 2.0.0-beta.0

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 (231) hide show
  1. package/README.md +27 -564
  2. package/bin/evolver-llm-proxy.js +3 -0
  3. package/bin/evolver-mcp.js +2 -0
  4. package/bin/evolver-proxy.js +3 -0
  5. package/bin/evolver.js +4 -0
  6. package/index.js +1 -3586
  7. package/package.json +32 -62
  8. package/CONTRIBUTING.md +0 -19
  9. package/LICENSE +0 -641
  10. package/README.ja-JP.md +0 -521
  11. package/README.ko-KR.md +0 -520
  12. package/README.zh-CN.md +0 -531
  13. package/SKILL.md +0 -365
  14. package/assets/cover.png +0 -0
  15. package/assets/gep/genes.seed.json +0 -496
  16. package/conformance/savings-core/constants.json +0 -30
  17. package/conformance/savings-core/golden-vectors.json +0 -333
  18. package/scripts/a2a_export.js +0 -63
  19. package/scripts/a2a_ingest.js +0 -79
  20. package/scripts/a2a_promote.js +0 -118
  21. package/scripts/analyze_by_skill.js +0 -121
  22. package/scripts/build_binaries.js +0 -479
  23. package/scripts/check-changelog.js +0 -166
  24. package/scripts/extract_log.js +0 -85
  25. package/scripts/generate_history.js +0 -75
  26. package/scripts/gep_append_event.js +0 -96
  27. package/scripts/gep_personality_report.js +0 -234
  28. package/scripts/human_report.js +0 -147
  29. package/scripts/recall-verify-report.js +0 -234
  30. package/scripts/recover_loop.js +0 -61
  31. package/scripts/refresh_stars_badge.js +0 -168
  32. package/scripts/seed-merchants.js +0 -91
  33. package/scripts/skill2recipes.js +0 -118
  34. package/scripts/suggest_version.js +0 -89
  35. package/scripts/validate-modules.js +0 -38
  36. package/scripts/validate-suite.js +0 -78
  37. package/skills/_meta/SKILL.md +0 -41
  38. package/skills/index.json +0 -14
  39. package/src/adapters/claudeCode.js +0 -194
  40. package/src/adapters/codex.js +0 -216
  41. package/src/adapters/cursor.js +0 -91
  42. package/src/adapters/hookAdapter.js +0 -469
  43. package/src/adapters/kiro.js +0 -195
  44. package/src/adapters/opencode.js +0 -326
  45. package/src/adapters/scripts/_lockPaths.js +0 -74
  46. package/src/adapters/scripts/_memoryFiltering.js +0 -35
  47. package/src/adapters/scripts/_runtimePaths.js +0 -440
  48. package/src/adapters/scripts/evolver-session-end.js +0 -321
  49. package/src/adapters/scripts/evolver-session-start.js +0 -587
  50. package/src/adapters/scripts/evolver-signal-detect.js +0 -98
  51. package/src/adapters/scripts/evolver-task-recall.js +0 -173
  52. package/src/atp/atpExecute.js +0 -283
  53. package/src/atp/atpTaskPickup.js +0 -233
  54. package/src/atp/autoBuyer.js +0 -382
  55. package/src/atp/autoDeliver.js +0 -215
  56. package/src/atp/cli.js +0 -354
  57. package/src/atp/cliAutobuyPrompt.js +0 -154
  58. package/src/atp/consumerAgent.js +0 -157
  59. package/src/atp/defaultHandler.js +0 -69
  60. package/src/atp/heartbeatSignalsHandler.js +0 -254
  61. package/src/atp/hubClient.js +0 -317
  62. package/src/atp/index.js +0 -38
  63. package/src/atp/merchantAgent.js +0 -118
  64. package/src/atp/protocol.js +0 -41
  65. package/src/atp/questionComposer.js +0 -133
  66. package/src/atp/serviceHelper.js +0 -92
  67. package/src/canary.js +0 -13
  68. package/src/config.js +0 -351
  69. package/src/evolve/guards.js +0 -1
  70. package/src/evolve/pipeline/collect.js +0 -1
  71. package/src/evolve/pipeline/dispatch.js +0 -1
  72. package/src/evolve/pipeline/enrich.js +0 -1
  73. package/src/evolve/pipeline/hub.js +0 -1
  74. package/src/evolve/pipeline/select.js +0 -1
  75. package/src/evolve/pipeline/signals.js +0 -1
  76. package/src/evolve/utils.js +0 -1
  77. package/src/evolve.js +0 -1
  78. package/src/experiment/agentRunner.js +0 -229
  79. package/src/experiment/cli.js +0 -159
  80. package/src/experiment/comparison.js +0 -233
  81. package/src/experiment/metrics.js +0 -75
  82. package/src/forceUpdate.js +0 -991
  83. package/src/gep/a2a.js +0 -173
  84. package/src/gep/a2aProtocol.js +0 -1
  85. package/src/gep/analyzer.js +0 -35
  86. package/src/gep/antiAbuseTelemetry.js +0 -1
  87. package/src/gep/assetCallLog.js +0 -197
  88. package/src/gep/assetStore.js +0 -723
  89. package/src/gep/assets.js +0 -36
  90. package/src/gep/autoDistillConv.js +0 -1
  91. package/src/gep/autoDistillLlm.js +0 -1
  92. package/src/gep/bridge.js +0 -138
  93. package/src/gep/candidateEval.js +0 -1
  94. package/src/gep/candidates.js +0 -1
  95. package/src/gep/claimNudge.js +0 -121
  96. package/src/gep/cliContracts.js +0 -1190
  97. package/src/gep/contentHash.js +0 -1
  98. package/src/gep/conversationDistiller.js +0 -1
  99. package/src/gep/conversationSniffer.js +0 -1
  100. package/src/gep/crypto.js +0 -1
  101. package/src/gep/curriculum.js +0 -1
  102. package/src/gep/deviceId.js +0 -1
  103. package/src/gep/directoryClient.js +0 -115
  104. package/src/gep/envFingerprint.js +0 -1
  105. package/src/gep/epigenetics.js +0 -1
  106. package/src/gep/execBridge.js +0 -1
  107. package/src/gep/executionTrace.js +0 -291
  108. package/src/gep/explore.js +0 -1
  109. package/src/gep/featureFlags.js +0 -121
  110. package/src/gep/gitOps.js +0 -265
  111. package/src/gep/hash.js +0 -1
  112. package/src/gep/hostErrorClassifier.js +0 -34
  113. package/src/gep/hubFetch.js +0 -1
  114. package/src/gep/hubReview.js +0 -1
  115. package/src/gep/hubSearch.js +0 -1
  116. package/src/gep/hubVerify.js +0 -1
  117. package/src/gep/idleScheduler.js +0 -400
  118. package/src/gep/issueReporter.js +0 -416
  119. package/src/gep/learningSignals.js +0 -1
  120. package/src/gep/llmReview.js +0 -92
  121. package/src/gep/localStateAwareness.js +0 -243
  122. package/src/gep/mailboxTransport.js +0 -119
  123. package/src/gep/memoryGraph.js +0 -1
  124. package/src/gep/memoryGraphAdapter.js +0 -1
  125. package/src/gep/mutation.js +0 -1
  126. package/src/gep/narrativeMemory.js +0 -1
  127. package/src/gep/oauthLogin.js +0 -181
  128. package/src/gep/openPRRegistry.js +0 -1
  129. package/src/gep/paths.js +0 -522
  130. package/src/gep/personality.js +0 -1
  131. package/src/gep/policyCheck.js +0 -1
  132. package/src/gep/portable.js +0 -103
  133. package/src/gep/privacyClient.js +0 -235
  134. package/src/gep/prompt.js +0 -1
  135. package/src/gep/questionGenerator.js +0 -518
  136. package/src/gep/recallInject.js +0 -1
  137. package/src/gep/recallVerifier.js +0 -1
  138. package/src/gep/reflection.js +0 -1
  139. package/src/gep/sanitize.js +0 -264
  140. package/src/gep/savingsCore.js +0 -1
  141. package/src/gep/schemas/capsule.js +0 -170
  142. package/src/gep/schemas/gene.js +0 -154
  143. package/src/gep/schemas/index.js +0 -8
  144. package/src/gep/schemas/protocol.js +0 -51
  145. package/src/gep/schemas/task.js +0 -74
  146. package/src/gep/selector.js +0 -1
  147. package/src/gep/selfPR.js +0 -469
  148. package/src/gep/signals.js +0 -776
  149. package/src/gep/skill2gep.js +0 -1056
  150. package/src/gep/skill2gepAudit.js +0 -303
  151. package/src/gep/skill2recipes.js +0 -511
  152. package/src/gep/skillDistiller.js +0 -1
  153. package/src/gep/skillPublisher.js +0 -358
  154. package/src/gep/solidify.js +0 -1
  155. package/src/gep/strategy.js +0 -1
  156. package/src/gep/taskReceiver.js +0 -575
  157. package/src/gep/tokenSavings.js +0 -1
  158. package/src/gep/trajectoryExport.js +0 -1
  159. package/src/gep/validationReport.js +0 -55
  160. package/src/gep/validator/index.js +0 -411
  161. package/src/gep/validator/reporter.js +0 -210
  162. package/src/gep/validator/sandboxExecutor.js +0 -480
  163. package/src/gep/validator/stakeBootstrap.js +0 -357
  164. package/src/gep/workspaceKeychain.js +0 -1
  165. package/src/ops/cleanup.js +0 -80
  166. package/src/ops/commentary.js +0 -60
  167. package/src/ops/health_check.js +0 -104
  168. package/src/ops/index.js +0 -11
  169. package/src/ops/innovation.js +0 -67
  170. package/src/ops/lifecycle.js +0 -798
  171. package/src/ops/self_repair.js +0 -76
  172. package/src/ops/skills_monitor.js +0 -147
  173. package/src/ops/trigger.js +0 -33
  174. package/src/proxy/clientSettings.js +0 -405
  175. package/src/proxy/envelope.js +0 -59
  176. package/src/proxy/extensions/dmHandler.js +0 -45
  177. package/src/proxy/extensions/sessionHandler.js +0 -141
  178. package/src/proxy/extensions/skillUpdater.js +0 -64
  179. package/src/proxy/extensions/traceControl.js +0 -1
  180. package/src/proxy/index.js +0 -1395
  181. package/src/proxy/inject.js +0 -1
  182. package/src/proxy/lifecycle/manager.js +0 -1568
  183. package/src/proxy/mailbox/state.js +0 -207
  184. package/src/proxy/mailbox/store.js +0 -590
  185. package/src/proxy/router/cache_passthrough.js +0 -26
  186. package/src/proxy/router/features.js +0 -84
  187. package/src/proxy/router/gemini_route.js +0 -154
  188. package/src/proxy/router/messages_route.js +0 -535
  189. package/src/proxy/router/model_router.js +0 -113
  190. package/src/proxy/router/models_route.js +0 -52
  191. package/src/proxy/router/ollama_route.js +0 -103
  192. package/src/proxy/router/responses_route.js +0 -170
  193. package/src/proxy/router/vertex_route.js +0 -110
  194. package/src/proxy/server/http.js +0 -363
  195. package/src/proxy/server/routes.js +0 -558
  196. package/src/proxy/server/settings.js +0 -115
  197. package/src/proxy/sync/engine.js +0 -179
  198. package/src/proxy/sync/inbound.js +0 -211
  199. package/src/proxy/sync/outbound.js +0 -320
  200. package/src/proxy/task/monitor.js +0 -131
  201. package/src/proxy/trace/extractor.js +0 -1
  202. package/src/proxy/trace/usage.js +0 -1
  203. package/src/webui/client/clientJs/assets.js +0 -111
  204. package/src/webui/client/clientJs/bootstrap.js +0 -92
  205. package/src/webui/client/clientJs/common.js +0 -77
  206. package/src/webui/client/clientJs/i18n.js +0 -366
  207. package/src/webui/client/clientJs/index.js +0 -35
  208. package/src/webui/client/clientJs/interactions.js +0 -351
  209. package/src/webui/client/clientJs/overview.js +0 -152
  210. package/src/webui/client/clientJs/personality.js +0 -285
  211. package/src/webui/client/clientJs/pipelines.js +0 -330
  212. package/src/webui/client/indexHtml.js +0 -221
  213. package/src/webui/client/static.js +0 -23
  214. package/src/webui/client/stylesCss.js +0 -639
  215. package/src/webui/client/vendor/README.md +0 -15
  216. package/src/webui/client/vendor/echarts.min.js +0 -45
  217. package/src/webui/index.js +0 -14
  218. package/src/webui/observer/assets.js +0 -146
  219. package/src/webui/observer/index.js +0 -37
  220. package/src/webui/observer/interactions.js +0 -127
  221. package/src/webui/observer/jsonl.js +0 -75
  222. package/src/webui/observer/paths.js +0 -46
  223. package/src/webui/observer/personality.js +0 -43
  224. package/src/webui/observer/pipelineEvents.js +0 -58
  225. package/src/webui/observer/redact.js +0 -63
  226. package/src/webui/observer/runs.js +0 -356
  227. package/src/webui/observer/safety.js +0 -57
  228. package/src/webui/observer/skills.js +0 -70
  229. package/src/webui/observer/status.js +0 -71
  230. package/src/webui/server/http.js +0 -138
  231. package/src/webui/server/routes.js +0 -41
@@ -1 +0,0 @@
1
- const _0x58eb33=_0x14eb;(function(_0x396d74,_0x316e95){const _0x52ca02=_0x14eb,_0x3cb9d5=_0x396d74();while(!![]){try{const _0x246a24=-parseInt(_0x52ca02(0xce,'\x52\x26\x4e\x5d'))/(0x15b1+0xb1f+0x25*-0xe3)*(parseInt(_0x52ca02(0x101,'\x5a\x62\x71\x49'))/(-0x2037*0x1+0x271+0x1dc8))+-parseInt(_0x52ca02(0x111,'\x32\x5d\x35\x68'))/(-0x131e+-0x4d5+0x17f6)*(parseInt(_0x52ca02(0xae,'\x28\x50\x74\x70'))/(-0x28*-0x25+-0xd*0x275+0x1a2d*0x1))+parseInt(_0x52ca02(0xc9,'\x5d\x5d\x28\x39'))/(-0x190c+-0x237c*-0x1+0x379*-0x3)*(parseInt(_0x52ca02(0xfb,'\x6e\x53\x5d\x53'))/(0x29*0x35+0xf99+0x181*-0x10))+-parseInt(_0x52ca02(0xf0,'\x65\x35\x4a\x48'))/(-0x32*-0x56+-0x6fa+-0x9cb)+parseInt(_0x52ca02(0xc0,'\x5a\x62\x71\x49'))/(0x2090+-0x247a+0x3f2)+-parseInt(_0x52ca02(0xd9,'\x6e\x53\x5d\x53'))/(0x443*0x1+0x8*-0x202+0xbd6)*(parseInt(_0x52ca02(0x113,'\x73\x62\x68\x5d'))/(-0x1*0x4ef+-0x13f7+0x18f0))+-parseInt(_0x52ca02(0xfa,'\x53\x75\x26\x70'))/(0x1*0x1a8d+-0xfd6*-0x2+0x2*-0x1d17)*(-parseInt(_0x52ca02(0xa4,'\x71\x38\x74\x4b'))/(0x6ee*0x5+0x1e37+0x159b*-0x3));if(_0x246a24===_0x316e95)break;else _0x3cb9d5['push'](_0x3cb9d5['shift']());}catch(_0x136c54){_0x3cb9d5['push'](_0x3cb9d5['shift']());}}}(_0x3c1f,-0x4*-0x5441+0x1708f+0x807e*-0x1));const _0x31fc3a=(function(){const _0x3d385d=_0x14eb,_0x129a25={'\x61\x72\x77\x51\x4d':function(_0x532df6,_0x4b7674){return _0x532df6===_0x4b7674;},'\x6e\x75\x4d\x48\x6a':_0x3d385d(0x10e,'\x28\x50\x74\x70'),'\x73\x79\x61\x77\x50':function(_0x1a6741,_0x34ddea){return _0x1a6741*_0x34ddea;},'\x4f\x62\x4b\x74\x68':function(_0x2aef17,_0x1a120d){return _0x2aef17(_0x1a120d);}};let _0x4d3825=!![];return function(_0x1a4458,_0x3bde21){const _0xc5ee60={'\x44\x67\x77\x78\x41':function(_0x2dc4de,_0x21ed50){const _0x2bd59f=_0x14eb;return _0x129a25[_0x2bd59f(0xbb,'\x5a\x62\x71\x49')](_0x2dc4de,_0x21ed50);},'\x65\x64\x45\x4a\x62':function(_0x3b4996,_0x5327bf){const _0x440906=_0x14eb;return _0x129a25[_0x440906(0xfe,'\x67\x42\x68\x75')](_0x3b4996,_0x5327bf);}},_0x2f3e88=_0x4d3825?function(){const _0x379cb6=_0x14eb;if(_0x3bde21){if(_0x129a25['\x61\x72\x77\x51\x4d'](_0x129a25[_0x379cb6(0xe9,'\x26\x64\x69\x37')],_0x129a25[_0x379cb6(0xc7,'\x6c\x52\x71\x34')])){const _0x349728=_0x3bde21[_0x379cb6(0xb4,'\x73\x62\x68\x5d')](_0x1a4458,arguments);return _0x3bde21=null,_0x349728;}else{const _0xfbd242=_0x4bd276&&(_0x3a5a9c[_0x379cb6(0xac,'\x46\x23\x47\x48')+'\x70']||_0x2b9751[_0x379cb6(0xe8,'\x35\x25\x46\x40')+_0x379cb6(0x117,'\x71\x38\x74\x4b')]);if(_0xfbd242){const _0x174091=_0x162291['\x70\x61\x72\x73\x65'](_0xfbd242);if(_0x5c7cbf[_0x379cb6(0x10c,'\x4e\x26\x45\x56')](_0x174091))return _0x174091;}if(_0x28d492&&_0x553cc7[_0x379cb6(0xef,'\x32\x61\x6a\x4e')](_0x22b87e(_0x4a28aa[_0x379cb6(0xb2,'\x73\x62\x68\x5d')+'\x74'])))return _0xc5ee60[_0x379cb6(0xd3,'\x55\x6b\x53\x29')](_0xc5ee60['\x65\x64\x45\x4a\x62'](_0x32c1f2,_0xfb931c[_0x379cb6(0xaf,'\x6e\x53\x5d\x53')+'\x74']),-0x3d*0x27+0x20b+0xb28);return null;}}}:function(){};return _0x4d3825=![],_0x2f3e88;};}()),_0x36f4b7=_0x31fc3a(this,function(){const _0x4897cd=_0x14eb,_0x40b2e1={};_0x40b2e1[_0x4897cd(0x130,'\x4d\x71\x40\x7a')]=_0x4897cd(0xca,'\x35\x25\x46\x40')+_0x4897cd(0x10f,'\x6c\x52\x71\x34');const _0x574d9c=_0x40b2e1;return _0x36f4b7[_0x4897cd(0xdc,'\x4e\x26\x45\x56')]()[_0x4897cd(0x114,'\x28\x50\x74\x70')](_0x4897cd(0x10a,'\x52\x26\x4e\x5d')+_0x4897cd(0x103,'\x5a\x62\x71\x49'))[_0x4897cd(0xc2,'\x61\x65\x5b\x4e')]()['\x63\x6f\x6e\x73\x74\x72\x75\x63'+_0x4897cd(0xc5,'\x68\x56\x46\x61')](_0x36f4b7)[_0x4897cd(0x12c,'\x32\x61\x6a\x4e')](_0x574d9c[_0x4897cd(0xd8,'\x5d\x5d\x28\x39')]);});_0x36f4b7();'use strict';const _0x138a5c=require('\x66\x73'),{resolveTraceFile:_0xce7c3d,resolveEvomapNodeSecret:_0x26c872,decryptTraceEnvelope:_0x2b9c97}=require(_0x58eb33(0x12d,'\x61\x65\x5b\x4e')+_0x58eb33(0xc1,'\x28\x50\x74\x70')),_0x5679e3={};_0x5679e3[_0x58eb33(0xbc,'\x58\x5e\x41\x26')+'\x6b\x65\x6e\x73']=0x0,_0x5679e3[_0x58eb33(0xa7,'\x5d\x5d\x28\x39')+_0x58eb33(0xbd,'\x34\x52\x66\x4f')]=0x0,_0x5679e3[_0x58eb33(0xbf,'\x47\x6b\x52\x24')+_0x58eb33(0xe3,'\x65\x47\x58\x6e')]=0x0,_0x5679e3[_0x58eb33(0xff,'\x32\x61\x6a\x4e')]=0x0,_0x5679e3[_0x58eb33(0xde,'\x32\x5d\x35\x68')]=![];const _0x3233d4=Object[_0x58eb33(0xf5,'\x78\x71\x29\x35')](_0x5679e3);function _0x3c1f(){const _0x23ef59=['\x57\x51\x52\x63\x52\x47\x4f\x74\x64\x71','\x57\x35\x6e\x6b\x57\x34\x52\x63\x49\x75\x4b','\x76\x31\x56\x64\x55\x43\x6f\x76\x78\x57','\x73\x74\x57\x68\x57\x36\x6d\x45','\x57\x35\x33\x63\x47\x43\x6b\x59\x46\x67\x74\x64\x55\x68\x6c\x64\x4b\x71','\x57\x4f\x39\x6c\x63\x43\x6b\x31\x68\x53\x6b\x49\x64\x78\x4b\x49\x76\x65\x44\x4e','\x67\x63\x4c\x4a\x71\x4b\x30','\x57\x52\x6c\x64\x4c\x74\x70\x64\x4b\x4c\x34','\x57\x51\x2f\x64\x55\x38\x6b\x4f\x57\x36\x39\x68','\x57\x35\x70\x64\x4a\x73\x68\x63\x4d\x38\x6b\x50','\x66\x38\x6f\x6e\x77\x76\x56\x63\x4a\x43\x6b\x6a','\x77\x4d\x74\x64\x4f\x6d\x6f\x51','\x6d\x53\x6f\x2b\x57\x35\x57\x6f\x57\x37\x61','\x6e\x38\x6f\x6a\x57\x36\x79\x73\x57\x36\x78\x64\x4b\x43\x6f\x42\x57\x51\x61','\x57\x51\x79\x4d\x57\x35\x48\x32\x42\x53\x6f\x37\x69\x61\x43','\x57\x4f\x70\x63\x4a\x78\x70\x64\x49\x73\x76\x4b\x57\x51\x58\x73\x57\x4f\x72\x58\x57\x4f\x53\x6d\x57\x36\x71','\x57\x51\x68\x63\x4b\x67\x4a\x64\x4f\x6d\x6f\x70\x79\x73\x7a\x64\x57\x36\x52\x64\x52\x5a\x5a\x63\x48\x71','\x57\x4f\x6a\x66\x57\x37\x5a\x64\x47\x6d\x6f\x4a','\x78\x62\x34\x6a\x57\x37\x71\x6b','\x57\x35\x48\x54\x78\x38\x6f\x55\x57\x34\x71','\x57\x35\x46\x63\x4b\x38\x6b\x79\x45\x78\x4b','\x6a\x72\x4b\x6d\x57\x35\x4f\x51\x57\x4f\x56\x63\x56\x6d\x6f\x4e','\x57\x34\x78\x63\x53\x53\x6f\x66\x77\x58\x76\x6b\x7a\x63\x69','\x57\x4f\x4c\x70\x77\x38\x6f\x4b\x74\x6d\x6f\x62\x65\x76\x57','\x57\x35\x2f\x63\x4f\x38\x6b\x53\x70\x61','\x6f\x53\x6b\x34\x78\x4a\x30\x61','\x57\x50\x66\x33\x41\x30\x30\x72\x57\x52\x75\x43','\x72\x68\x64\x64\x4b\x53\x6f\x62\x75\x47\x56\x64\x53\x77\x4f','\x57\x50\x33\x64\x55\x43\x6f\x62\x43\x73\x58\x76\x73\x74\x75','\x57\x34\x4f\x79\x77\x43\x6f\x4d\x42\x43\x6f\x2f\x6d\x68\x34','\x76\x32\x70\x64\x48\x43\x6f\x74\x71\x57','\x44\x43\x6f\x45\x67\x4e\x54\x42\x6c\x53\x6f\x38\x57\x35\x6d','\x57\x37\x6a\x33\x46\x43\x6f\x50\x57\x35\x47\x66\x6b\x71\x38','\x66\x59\x6e\x68\x72\x65\x54\x32\x6b\x53\x6b\x53','\x79\x31\x42\x64\x51\x43\x6f\x7a\x69\x47','\x57\x36\x43\x4b\x46\x38\x6b\x6a\x57\x36\x38','\x57\x37\x48\x48\x57\x4f\x43\x37','\x6c\x78\x66\x37\x63\x53\x6f\x30','\x57\x52\x70\x64\x52\x48\x70\x63\x55\x65\x47\x32\x41\x61','\x57\x35\x30\x2b\x76\x6d\x6b\x6e\x57\x37\x71','\x57\x37\x6e\x68\x75\x74\x74\x64\x50\x4b\x71\x75\x7a\x71','\x57\x36\x79\x57\x72\x6d\x6b\x55\x57\x35\x54\x5a','\x57\x4f\x53\x7a\x57\x35\x4c\x4f\x43\x61','\x57\x52\x6c\x63\x56\x4a\x53\x75\x6d\x48\x5a\x63\x50\x43\x6b\x77','\x57\x52\x4b\x6a\x70\x59\x47','\x6c\x43\x6b\x32\x68\x48\x61\x59','\x6d\x53\x6f\x31\x57\x34\x65\x79\x57\x36\x57','\x61\x43\x6f\x31\x57\x37\x6c\x64\x55\x53\x6b\x42','\x46\x73\x4f\x4f\x57\x34\x47\x69','\x57\x35\x47\x71\x43\x38\x6b\x4c\x57\x36\x4b','\x57\x4f\x57\x33\x57\x50\x42\x64\x55\x59\x4c\x2b\x57\x51\x2f\x64\x4d\x62\x44\x66\x6f\x6d\x6b\x61','\x57\x4f\x44\x4a\x78\x75\x71','\x57\x51\x6d\x38\x46\x57\x35\x52','\x57\x50\x58\x4e\x71\x75\x72\x70','\x6c\x38\x6f\x55\x77\x38\x6f\x71\x57\x35\x57','\x6e\x59\x79\x77\x57\x37\x43\x65','\x43\x43\x6f\x66\x6f\x72\x69\x57\x57\x4f\x4f\x65\x57\x52\x79','\x57\x34\x6c\x64\x53\x74\x74\x63\x4b\x47','\x57\x35\x66\x61\x7a\x4d\x53\x33','\x57\x52\x65\x63\x73\x49\x4a\x64\x53\x4d\x65\x67\x72\x47','\x61\x43\x6f\x59\x74\x4e\x4a\x63\x48\x71','\x57\x52\x65\x73\x72\x47\x4a\x64\x50\x67\x43','\x6a\x32\x62\x30\x57\x4f\x69','\x79\x33\x2f\x64\x54\x53\x6f\x6e\x6b\x61','\x57\x50\x37\x63\x49\x43\x6f\x32\x71\x38\x6f\x52\x57\x35\x57\x6a\x57\x37\x4b','\x57\x34\x46\x63\x4c\x38\x6b\x76\x7a\x32\x4e\x64\x55\x71','\x42\x6d\x6b\x69\x57\x37\x43\x64\x57\x37\x33\x64\x51\x53\x6f\x6a\x57\x51\x57','\x57\x34\x54\x64\x74\x67\x53\x54\x57\x52\x4b\x58\x57\x4f\x30','\x70\x6d\x6f\x39\x43\x6d\x6f\x70\x57\x34\x4f','\x57\x52\x6c\x63\x48\x73\x4f\x58\x6d\x61','\x45\x4e\x4a\x64\x52\x38\x6f\x37\x62\x62\x34','\x57\x37\x58\x59\x6c\x59\x68\x64\x4d\x75\x52\x63\x4b\x71\x69','\x57\x52\x31\x39\x64\x43\x6f\x59\x57\x50\x6d\x59\x64\x38\x6b\x2b','\x57\x4f\x2f\x63\x4a\x4e\x78\x64\x48\x73\x62\x55\x57\x34\x6a\x51\x57\x51\x44\x61\x57\x4f\x65\x2f','\x69\x71\x71\x4f\x57\x36\x71\x74\x57\x4f\x42\x64\x50\x53\x6f\x75','\x6f\x6d\x6b\x35\x57\x4f\x46\x63\x56\x57','\x57\x52\x34\x50\x69\x49\x74\x64\x4d\x31\x74\x63\x52\x59\x4f','\x63\x75\x44\x52\x67\x53\x6f\x6c\x57\x37\x7a\x70\x57\x4f\x4f','\x6f\x65\x6d\x65\x6d\x58\x69','\x74\x71\x38\x72\x43\x65\x78\x63\x56\x6d\x6b\x76\x76\x57','\x57\x51\x61\x54\x71\x73\x6e\x6b\x57\x50\x61\x61\x66\x61','\x57\x51\x44\x4a\x68\x6d\x6f\x56\x57\x4f\x30\x54\x44\x38\x6f\x58\x42\x53\x6f\x36\x57\x50\x66\x4c','\x57\x37\x70\x64\x4b\x64\x74\x63\x55\x43\x6b\x6b\x6e\x61\x66\x52','\x57\x35\x54\x4f\x72\x4b\x30\x71','\x6e\x38\x6b\x6e\x57\x36\x70\x63\x54\x30\x75\x42\x57\x36\x30\x48','\x57\x51\x65\x66\x71\x48\x56\x64\x53\x32\x4f\x33\x44\x61','\x57\x34\x6c\x64\x4c\x5a\x75','\x57\x51\x6d\x68\x76\x58\x42\x64\x56\x47','\x57\x4f\x52\x63\x4e\x43\x6b\x43\x57\x4f\x39\x4d\x69\x5a\x64\x63\x47\x6d\x6b\x72\x67\x68\x52\x64\x50\x71','\x68\x38\x6b\x48\x71\x49\x71\x61','\x57\x37\x48\x31\x45\x68\x70\x63\x4a\x63\x78\x64\x51\x4a\x46\x63\x55\x4b\x56\x64\x47\x67\x4a\x64\x53\x57','\x64\x31\x7a\x68\x66\x53\x6f\x67\x57\x36\x53','\x6d\x38\x6f\x79\x44\x6d\x6f\x54\x57\x37\x42\x63\x47\x38\x6f\x32\x6a\x71','\x57\x52\x57\x64\x6a\x38\x6f\x6d\x57\x36\x57\x4e\x66\x64\x75\x35\x57\x34\x56\x63\x48\x6d\x6f\x64','\x57\x4f\x46\x64\x53\x38\x6f\x4d\x42\x58\x69','\x57\x52\x70\x64\x4d\x53\x6b\x59\x57\x37\x44\x42\x6c\x47\x78\x64\x4e\x57','\x64\x31\x39\x69\x68\x43\x6f\x77','\x57\x36\x76\x51\x44\x43\x6f\x2b\x57\x36\x4f\x46\x66\x48\x6d','\x75\x32\x33\x64\x47\x38\x6f\x62\x73\x4a\x68\x64\x4f\x75\x71','\x57\x34\x33\x63\x56\x6d\x6b\x31\x69\x68\x75\x6f\x7a\x72\x52\x63\x50\x66\x53\x42\x57\x51\x69','\x57\x36\x65\x36\x76\x57','\x6e\x53\x6f\x69\x57\x34\x65\x70\x57\x37\x56\x64\x53\x43\x6f\x67\x57\x51\x47','\x57\x35\x66\x7a\x7a\x67\x65\x4d\x57\x50\x4b\x32\x57\x4f\x43','\x68\x43\x6f\x6d\x41\x67\x52\x63\x54\x71','\x6a\x6d\x6f\x71\x57\x36\x34','\x57\x34\x57\x73\x41\x38\x6f\x32\x77\x43\x6f\x2f\x6d\x4e\x57','\x57\x52\x30\x39\x57\x36\x66\x78\x41\x61','\x62\x43\x6f\x70\x45\x43\x6f\x38','\x46\x65\x65\x55\x57\x34\x75\x57\x57\x4f\x4a\x64\x52\x38\x6f\x4a','\x57\x51\x75\x7a\x6e\x53\x6f\x41\x57\x37\x79\x2b\x46\x68\x75','\x71\x59\x75\x67\x57\x36\x75\x6c','\x61\x67\x53\x75\x6b\x5a\x79','\x61\x30\x7a\x69\x65\x53\x6f\x72\x57\x37\x50\x46\x57\x51\x34','\x42\x6d\x6f\x70\x61\x77\x58\x61\x46\x38\x6b\x4b\x57\x4f\x52\x63\x50\x38\x6b\x41\x75\x61','\x57\x35\x74\x63\x54\x53\x6f\x31','\x70\x48\x61\x55\x57\x36\x43\x64','\x6b\x43\x6b\x6f\x70\x74\x47\x6a\x57\x50\x75\x50\x57\x51\x65','\x6c\x43\x6b\x78\x71\x63\x79\x76','\x57\x4f\x62\x73\x45\x57\x44\x65','\x57\x4f\x38\x34\x57\x50\x5a\x64\x53\x73\x57\x57\x57\x4f\x2f\x64\x4a\x4a\x7a\x34\x6b\x47','\x57\x36\x78\x64\x51\x74\x4a\x63\x51\x38\x6b\x35','\x57\x35\x52\x64\x54\x67\x64\x64\x56\x6d\x6b\x37','\x57\x37\x66\x72\x57\x50\x69\x56\x57\x37\x47','\x6a\x5a\x4b\x6c\x57\x35\x47\x6b','\x57\x51\x68\x63\x4d\x32\x64\x64\x51\x53\x6f\x69\x41\x76\x58\x49\x57\x37\x52\x64\x48\x71\x70\x63\x54\x77\x30','\x66\x43\x6f\x30\x57\x35\x53\x33\x57\x34\x65','\x57\x34\x38\x55\x57\x36\x43\x6d\x57\x36\x6d\x78\x46\x43\x6f\x57','\x63\x4a\x39\x73\x77\x76\x44\x32\x6d\x6d\x6b\x55','\x75\x75\x68\x64\x47\x43\x6f\x56\x7a\x57','\x57\x36\x33\x64\x4a\x62\x70\x63\x48\x67\x38\x48\x76\x6d\x6b\x43','\x57\x51\x6d\x54\x57\x36\x76\x4c\x76\x57','\x68\x43\x6b\x41\x57\x52\x46\x64\x4c\x43\x6b\x68','\x6f\x43\x6f\x56\x75\x4b\x33\x63\x50\x71','\x57\x34\x68\x63\x4f\x38\x6f\x35\x57\x4f\x43','\x57\x35\x54\x67\x6a\x43\x6f\x42','\x57\x4f\x6e\x54\x76\x4c\x4c\x7a','\x6f\x57\x75\x36\x57\x51\x57','\x6d\x67\x6e\x37\x69\x43\x6f\x32','\x78\x6d\x6b\x4a\x61\x4d\x46\x63\x48\x61','\x57\x36\x35\x64\x45\x38\x6b\x76\x57\x51\x4c\x59\x6d\x58\x30','\x57\x34\x74\x64\x4f\x66\x2f\x64\x48\x38\x6b\x30','\x57\x52\x74\x63\x55\x61\x4b\x6e\x6b\x71\x68\x63\x4a\x53\x6b\x68'];_0x3c1f=function(){return _0x23ef59;};return _0x3c1f();}function _0x34cc50(_0x30700e){const _0x1ee3e5=_0x58eb33,_0x80ce55={'\x6c\x73\x54\x54\x42':function(_0x1f48f5,_0x458e6a){return _0x1f48f5*_0x458e6a;},'\x48\x6b\x71\x51\x4c':function(_0x20f109,_0x4d4c24){return _0x20f109(_0x4d4c24);}},_0x19c36a=_0x30700e&&(_0x30700e['\x74\x69\x6d\x65\x73\x74\x61\x6d'+'\x70']||_0x30700e[_0x1ee3e5(0xb2,'\x73\x62\x68\x5d')+_0x1ee3e5(0x124,'\x53\x75\x26\x70')]);if(_0x19c36a){const _0x3b3e67=Date[_0x1ee3e5(0xd2,'\x52\x26\x4e\x5d')](_0x19c36a);if(Number[_0x1ee3e5(0x116,'\x4d\x71\x40\x7a')](_0x3b3e67))return _0x3b3e67;}if(_0x30700e&&Number[_0x1ee3e5(0x107,'\x5a\x62\x71\x49')](Number(_0x30700e[_0x1ee3e5(0xcd,'\x34\x52\x66\x4f')+'\x74'])))return _0x80ce55[_0x1ee3e5(0xc4,'\x78\x71\x29\x35')](_0x80ce55[_0x1ee3e5(0x112,'\x28\x50\x74\x70')](Number,_0x30700e[_0x1ee3e5(0x106,'\x47\x6b\x52\x24')+'\x74']),0x7*-0x17b+0x3*0x201+-0x421*-0x2);return null;}function _0x14eb(_0x4a73b1,_0x1e6687){_0x4a73b1=_0x4a73b1-(0x7cb+-0x6b*-0x47+-0x935*0x4);const _0x420ca3=_0x3c1f();let _0x233a7b=_0x420ca3[_0x4a73b1];if(_0x14eb['\x65\x79\x6e\x63\x73\x59']===undefined){var _0xda8f49=function(_0x4edc0a){const _0x59ee8e='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x171e3f='',_0x54c6bf='',_0x3d7094=_0x171e3f+_0xda8f49,_0x562738=(''+function(){return 0x1ed5+-0x26ed+-0x4*-0x206;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0xdb*0x11+-0xbfe+0x1a8a);for(let _0x277cb0=0xa5f+0x765+-0x6*0x2f6,_0x3b5d26,_0x39fb6f,_0x396da8=-0xb04+-0x2005*-0x1+-0x1501;_0x39fb6f=_0x4edc0a['\x63\x68\x61\x72\x41\x74'](_0x396da8++);~_0x39fb6f&&(_0x3b5d26=_0x277cb0%(0x1b01+-0x1789*-0x1+0x1*-0x3286)?_0x3b5d26*(-0x8bb*0x3+-0x14f0+0x2f61)+_0x39fb6f:_0x39fb6f,_0x277cb0++%(-0x1b0f*0x1+-0x8*-0x125+-0x1*-0x11eb))?_0x171e3f+=_0x562738||_0x3d7094['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x396da8+(-0x1*0x1da7+0x2*0x2d7+0x1803))-(-0x1269*-0x1+-0xed7+0x8*-0x71)!==-0x2203+-0x7a*-0x5+0x1fa1?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x1af7+0x1*-0xfd2+-0x362*0x3&_0x3b5d26>>(-(0xe60+0x1d25+-0x2b83)*_0x277cb0&-0x5*0x4eb+0x8a9+0x7fa*0x2)):_0x277cb0:-0x1*-0x2117+0x24a7+0x9e*-0x71){_0x39fb6f=_0x59ee8e['\x69\x6e\x64\x65\x78\x4f\x66'](_0x39fb6f);}for(let _0x27e626=-0x2*-0x12df+-0x153f+0x29*-0x67,_0x594b9a=_0x171e3f['\x6c\x65\x6e\x67\x74\x68'];_0x27e626<_0x594b9a;_0x27e626++){_0x54c6bf+='\x25'+('\x30\x30'+_0x171e3f['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x27e626)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x3*-0xc64+-0x16df+0x3c1b))['\x73\x6c\x69\x63\x65'](-(-0x1*-0x445+0x2148+0x1*-0x258b));}return decodeURIComponent(_0x54c6bf);};const _0x283441=function(_0x2b706e,_0x2110dd){let _0xef6179=[],_0x3db645=0x2340+0x1845+-0x3b85,_0x58d708,_0x450838='';_0x2b706e=_0xda8f49(_0x2b706e);let _0x14daac;for(_0x14daac=-0xc1f+0x5ab*0x5+-0x1038;_0x14daac<-0x73a*-0x5+-0x3*-0x121+-0x2685;_0x14daac++){_0xef6179[_0x14daac]=_0x14daac;}for(_0x14daac=-0x1f48+-0x1ac+0x20f4;_0x14daac<0x9a2+0xb2d*-0x2+0xdb8;_0x14daac++){_0x3db645=(_0x3db645+_0xef6179[_0x14daac]+_0x2110dd['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x14daac%_0x2110dd['\x6c\x65\x6e\x67\x74\x68']))%(-0xe7*0x17+-0x113c+0x26fd),_0x58d708=_0xef6179[_0x14daac],_0xef6179[_0x14daac]=_0xef6179[_0x3db645],_0xef6179[_0x3db645]=_0x58d708;}_0x14daac=0x591+0x158d+-0x216*0xd,_0x3db645=0x99a*0x2+-0x822+-0xd*0xda;for(let _0xc7526a=-0xad5+0x1e7*-0xb+0x1e*0x10f;_0xc7526a<_0x2b706e['\x6c\x65\x6e\x67\x74\x68'];_0xc7526a++){_0x14daac=(_0x14daac+(0xab2+-0x1*0xf27+-0x1*-0x476))%(-0x13*-0x10d+0x1af*-0x7+-0x72e),_0x3db645=(_0x3db645+_0xef6179[_0x14daac])%(-0x279+0x1bc4+-0x9*0x2b3),_0x58d708=_0xef6179[_0x14daac],_0xef6179[_0x14daac]=_0xef6179[_0x3db645],_0xef6179[_0x3db645]=_0x58d708,_0x450838+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x2b706e['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0xc7526a)^_0xef6179[(_0xef6179[_0x14daac]+_0xef6179[_0x3db645])%(-0x1a*-0x1b+0xbd*0x29+-0x2003)]);}return _0x450838;};_0x14eb['\x6f\x75\x4b\x7a\x6d\x61']=_0x283441,_0x14eb['\x59\x4f\x72\x47\x76\x6e']={},_0x14eb['\x65\x79\x6e\x63\x73\x59']=!![];}const _0x4152ed=_0x420ca3[0x7f9+0x38*-0x28+-0xc7*-0x1],_0x30922e=_0x4a73b1+_0x4152ed,_0x5bfd89=_0x14eb['\x59\x4f\x72\x47\x76\x6e'][_0x30922e];if(!_0x5bfd89){if(_0x14eb['\x70\x42\x50\x69\x59\x49']===undefined){const _0x2243c6=function(_0x4e068f){this['\x71\x6f\x73\x64\x7a\x6e']=_0x4e068f,this['\x6e\x55\x4e\x70\x4c\x74']=[0x4a1+-0x1d39+-0x1899*-0x1,-0x412+0x2*-0xfef+0x23f0,0x76*-0x26+0xb40*0x2+-0x1d*0x2c],this['\x50\x7a\x62\x46\x45\x41']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x4a\x57\x7a\x42\x43\x43']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x67\x4a\x4b\x78\x52\x52']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x2243c6['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x51\x7a\x66\x6b\x73\x41']=function(){const _0x1b4da3=new RegExp(this['\x4a\x57\x7a\x42\x43\x43']+this['\x67\x4a\x4b\x78\x52\x52']),_0x5d12c0=_0x1b4da3['\x74\x65\x73\x74'](this['\x50\x7a\x62\x46\x45\x41']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x6e\x55\x4e\x70\x4c\x74'][0x7*-0x142+-0x1b9b+-0x246a*-0x1]:--this['\x6e\x55\x4e\x70\x4c\x74'][0x36*-0x3a+-0x5f5+0x1231];return this['\x53\x66\x52\x49\x61\x70'](_0x5d12c0);},_0x2243c6['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x53\x66\x52\x49\x61\x70']=function(_0x132015){if(!Boolean(~_0x132015))return _0x132015;return this['\x48\x77\x4d\x77\x41\x4d'](this['\x71\x6f\x73\x64\x7a\x6e']);},_0x2243c6['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x48\x77\x4d\x77\x41\x4d']=function(_0x112408){for(let _0x28f84a=0x35*-0x59+-0x7c6+0x1a33,_0x43d217=this['\x6e\x55\x4e\x70\x4c\x74']['\x6c\x65\x6e\x67\x74\x68'];_0x28f84a<_0x43d217;_0x28f84a++){this['\x6e\x55\x4e\x70\x4c\x74']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x43d217=this['\x6e\x55\x4e\x70\x4c\x74']['\x6c\x65\x6e\x67\x74\x68'];}return _0x112408(this['\x6e\x55\x4e\x70\x4c\x74'][-0x7*0x592+0x1053+0x16ab]);},(''+function(){return 0x247a+0x20e8+-0x4562;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0x191+0x1*-0x2613+0x27a5)&&new _0x2243c6(_0x14eb)['\x51\x7a\x66\x6b\x73\x41'](),_0x14eb['\x70\x42\x50\x69\x59\x49']=!![];}_0x233a7b=_0x14eb['\x6f\x75\x4b\x7a\x6d\x61'](_0x233a7b,_0x1e6687),_0x14eb['\x59\x4f\x72\x47\x76\x6e'][_0x30922e]=_0x233a7b;}else _0x233a7b=_0x5bfd89;return _0x233a7b;}function _0x361f49(_0xad2094={}){const _0x382b3d=_0x58eb33,_0xaa9edd={'\x70\x4d\x72\x46\x72':function(_0x268474,_0x477573,_0x5760a4){return _0x268474(_0x477573,_0x5760a4);},'\x42\x64\x43\x64\x43':function(_0x5f422e){return _0x5f422e();},'\x42\x57\x70\x71\x70':_0x382b3d(0xa5,'\x28\x50\x74\x70')+_0x382b3d(0x129,'\x48\x35\x57\x28'),'\x45\x75\x58\x45\x47':function(_0x523b13){return _0x523b13();},'\x76\x43\x76\x4f\x41':_0x382b3d(0xe5,'\x5d\x5d\x28\x39'),'\x70\x52\x53\x63\x65':function(_0x370642,_0x36e85a){return _0x370642===_0x36e85a;},'\x4d\x45\x56\x79\x51':_0x382b3d(0x115,'\x6c\x52\x71\x34'),'\x6d\x4b\x65\x41\x55':_0x382b3d(0xcb,'\x48\x35\x57\x28'),'\x6a\x4b\x67\x50\x45':function(_0x9a1be,_0x6270a2){return _0x9a1be!==_0x6270a2;},'\x53\x6b\x4b\x6c\x6c':function(_0x277a74,_0x4744c7){return _0x277a74!==_0x4744c7;},'\x69\x73\x56\x6f\x52':_0x382b3d(0xf2,'\x46\x35\x36\x7a'),'\x75\x4f\x6a\x6d\x68':_0x382b3d(0x11f,'\x41\x32\x30\x59'),'\x79\x57\x4a\x63\x62':_0x382b3d(0xda,'\x61\x65\x5b\x4e'),'\x55\x4a\x48\x68\x71':_0x382b3d(0xdf,'\x6c\x52\x71\x34'),'\x67\x4e\x6c\x68\x70':function(_0x643c7b,_0x3129e4,_0xdc875d){return _0x643c7b(_0x3129e4,_0xdc875d);},'\x71\x63\x77\x6e\x51':'\x75\x43\x55\x6d\x55','\x51\x4a\x6e\x46\x49':_0x382b3d(0xb8,'\x34\x52\x66\x4f'),'\x50\x57\x56\x52\x53':function(_0x189c5c,_0x1fe3b5){return _0x189c5c(_0x1fe3b5);},'\x6a\x43\x4c\x69\x55':function(_0x534996,_0x320f2c){return _0x534996==_0x320f2c;},'\x75\x4b\x69\x73\x47':function(_0x12821e,_0x90e4f){return _0x12821e<_0x90e4f;},'\x79\x58\x4c\x4f\x53':function(_0x40fecc,_0x2b1fda){return _0x40fecc>_0x2b1fda;},'\x73\x59\x45\x43\x68':function(_0x1c3d09,_0x101278){return _0x1c3d09||_0x101278;},'\x48\x50\x6e\x73\x52':function(_0xaaebb9,_0x27b9bc){return _0xaaebb9+_0x27b9bc;}},_0x31a1dc=_0xad2094&&_0xad2094[_0x382b3d(0xc3,'\x34\x6c\x64\x50')]!=null?Date[_0x382b3d(0xcc,'\x67\x24\x7a\x68')](_0xad2094[_0x382b3d(0xa9,'\x71\x38\x74\x4b')]):NaN,_0x2edb95={..._0x3233d4};if(!Number[_0x382b3d(0xaa,'\x34\x52\x66\x4f')](_0x31a1dc))return _0x2edb95;const _0xb3a7bc=_0xad2094&&_0xad2094[_0x382b3d(0xf9,'\x6c\x52\x71\x34')]!=null&&Number[_0x382b3d(0xd1,'\x36\x65\x4e\x75')](Date[_0x382b3d(0xd0,'\x5d\x5d\x28\x39')](_0xad2094[_0x382b3d(0x12b,'\x51\x41\x47\x5d')]))?Date[_0x382b3d(0x109,'\x47\x6b\x52\x24')](_0xad2094[_0x382b3d(0xf8,'\x61\x65\x5b\x4e')]):Date['\x6e\x6f\x77']();let _0x463e5c;try{if(_0x382b3d(0xab,'\x67\x24\x7a\x68')!==_0x382b3d(0xf4,'\x6e\x53\x5d\x53')){const _0x10ea87=_0xaa9edd[_0x382b3d(0xee,'\x48\x35\x57\x28')](_0xce7c3d),_0x47983e={..._0x3233d4};if(!_0x138a5c['\x65\x78\x69\x73\x74\x73\x53\x79'+'\x6e\x63'](_0x10ea87))return _0x47983e;_0x463e5c=_0x138a5c[_0x382b3d(0xbe,'\x67\x42\x68\x75')+_0x382b3d(0xc8,'\x2a\x69\x6b\x42')](_0x10ea87,_0xaa9edd[_0x382b3d(0xdd,'\x47\x6b\x52\x24')]);}else _0x5099cc=_0x1c6190[_0x382b3d(0xd6,'\x26\x64\x69\x37')](_0xd71e2d);}catch(_0x5afabe){const _0x457ed9={..._0x3233d4};return _0x457ed9;}let _0x5375ad=null;try{if(_0xaa9edd[_0x382b3d(0x119,'\x61\x65\x5b\x4e')](_0xaa9edd[_0x382b3d(0x110,'\x34\x52\x66\x4f')],_0xaa9edd[_0x382b3d(0x11c,'\x28\x50\x74\x70')]))_0x5375ad=_0x26c872();else{const _0x389646={..._0x905da5};return _0x389646;}}catch(_0x2bbf3b){_0xaa9edd[_0x382b3d(0x118,'\x36\x65\x4e\x75')]!==_0xaa9edd[_0x382b3d(0xec,'\x74\x32\x54\x34')]?_0x413bc6=_0xaa9edd[_0x382b3d(0x127,'\x78\x71\x29\x35')](_0x534302,_0x1bc8fd,_0x690f8):_0x5375ad=null;}let _0x5c638d=0x19bf+-0x4a0+-0x151f,_0x392298=0x218d+-0xb62+-0xe3*0x19,_0x1fc063=0x1f06+-0xb*0x386+0x7bc;for(const _0x2b2d3e of _0x463e5c[_0x382b3d(0x125,'\x34\x6c\x64\x50')]('\x0a')){if(_0xaa9edd[_0x382b3d(0xd7,'\x78\x31\x4e\x2a')](_0x382b3d(0xed,'\x47\x6b\x52\x24'),_0x382b3d(0xf7,'\x61\x65\x5b\x4e'))){const _0x37722f=_0xaa9edd['\x42\x64\x43\x64\x43'](_0x2288dc),_0xf3e20={..._0x403c5d};if(!_0x45b42b[_0x382b3d(0x10b,'\x67\x42\x68\x75')+'\x6e\x63'](_0x37722f))return _0xf3e20;_0x14022f=_0x4628c7[_0x382b3d(0x108,'\x65\x35\x4a\x48')+_0x382b3d(0xf6,'\x23\x44\x2a\x31')](_0x37722f,_0x382b3d(0xa8,'\x61\x6b\x33\x25'));}else{const _0x550d5b=_0x2b2d3e[_0x382b3d(0xe2,'\x72\x7a\x78\x6e')]();if(!_0x550d5b)continue;let _0x51e72d;try{_0xaa9edd[_0x382b3d(0xfc,'\x6e\x36\x56\x32')](_0x382b3d(0xf1,'\x4e\x26\x45\x56'),_0xaa9edd['\x69\x73\x56\x6f\x52'])?_0x51e72d=JSON[_0x382b3d(0x120,'\x4e\x34\x64\x56')](_0x550d5b):_0x4485ee=null;}catch(_0x822475){if(_0xaa9edd[_0x382b3d(0x12f,'\x2a\x69\x6b\x42')](_0xaa9edd[_0x382b3d(0xf3,'\x58\x5e\x41\x26')],_0x382b3d(0x12a,'\x23\x44\x2a\x31')))return _0x39649d[_0x382b3d(0xc6,'\x65\x35\x4a\x48')]()[_0x382b3d(0x131,'\x23\x44\x2a\x31')]('\x28\x28\x28\x2e\x2b\x29\x2b\x29'+'\x2b\x29\x2b\x24')['\x74\x6f\x53\x74\x72\x69\x6e\x67']()[_0x382b3d(0xdb,'\x24\x68\x64\x6f')+_0x382b3d(0xb3,'\x53\x75\x26\x70')](_0xf38103)[_0x382b3d(0x128,'\x73\x62\x68\x5d')](vxyeWo[_0x382b3d(0xb6,'\x52\x26\x4e\x5d')]);else continue;}if(_0x51e72d&&_0x51e72d[_0x382b3d(0xb9,'\x2a\x69\x6b\x42')+'\x64']){if(_0xaa9edd[_0x382b3d(0x122,'\x5d\x5d\x28\x39')]!==_0xaa9edd['\x55\x4a\x48\x68\x71']){if(!_0x5375ad)continue;try{_0x51e72d=_0xaa9edd[_0x382b3d(0x104,'\x52\x26\x4e\x5d')](_0x2b9c97,_0x51e72d,_0x5375ad);}catch(_0x4b879f){if(_0xaa9edd[_0x382b3d(0x10d,'\x23\x44\x2a\x31')](_0xaa9edd[_0x382b3d(0x11b,'\x48\x35\x57\x28')],_0xaa9edd[_0x382b3d(0xeb,'\x4d\x71\x40\x7a')]))_0x42aafa=_0xaa9edd[_0x382b3d(0xee,'\x48\x35\x57\x28')](_0x62d440);else continue;}}else{const _0x36b5a4=_0x4044b2['\x70\x61\x72\x73\x65'](_0x502077);if(_0x377551[_0x382b3d(0xb1,'\x45\x45\x51\x30')](_0x36b5a4))return _0x36b5a4;}}if(!_0x51e72d||_0xaa9edd['\x6a\x4b\x67\x50\x45'](typeof _0x51e72d,_0xaa9edd[_0x382b3d(0x11a,'\x68\x56\x46\x61')]))continue;const _0x1b4523=_0xaa9edd[_0x382b3d(0xe6,'\x34\x52\x66\x4f')](_0x34cc50,_0x51e72d);if(_0xaa9edd[_0x382b3d(0xe7,'\x55\x38\x24\x51')](_0x1b4523,null)||_0xaa9edd[_0x382b3d(0xd5,'\x6e\x53\x5d\x53')](_0x1b4523,_0x31a1dc)||_0xaa9edd[_0x382b3d(0x121,'\x2a\x69\x6b\x42')](_0x1b4523,_0xb3a7bc))continue;const _0x860a8f=_0xaa9edd[_0x382b3d(0xfd,'\x48\x35\x57\x28')](Number,_0x51e72d[_0x382b3d(0x100,'\x41\x59\x6a\x5a')+_0x382b3d(0x11e,'\x4e\x34\x64\x56')]),_0x3ff309=_0xaa9edd[_0x382b3d(0xe0,'\x61\x6b\x33\x25')](Number,_0x51e72d[_0x382b3d(0xea,'\x4d\x71\x40\x7a')+_0x382b3d(0xe4,'\x4e\x34\x64\x56')]),_0x108a5b=Number[_0x382b3d(0xad,'\x41\x32\x30\x59')](_0x860a8f)&&_0xaa9edd[_0x382b3d(0xb0,'\x34\x6c\x64\x50')](_0x860a8f,0x1da8+-0x7c+-0xe96*0x2),_0x5ea4f2=Number[_0x382b3d(0x12e,'\x34\x6c\x64\x50')](_0x3ff309)&&_0x3ff309>0x1*0x3e6+-0xf3+-0x2f3;if(_0x108a5b)_0x5c638d+=_0x860a8f;if(_0x5ea4f2)_0x392298+=_0x3ff309;if(_0xaa9edd['\x73\x59\x45\x43\x68'](_0x108a5b,_0x5ea4f2))_0x1fc063+=0x1*0x29e+0x456+-0x6f3;}}const _0x410813={..._0x3233d4};if(_0x1fc063===-0x1*0x14e5+-0x20fc*-0x1+0x26b*-0x5)return _0x410813;return{'\x69\x6e\x70\x75\x74\x5f\x74\x6f\x6b\x65\x6e\x73':_0x5c638d,'\x6f\x75\x74\x70\x75\x74\x5f\x74\x6f\x6b\x65\x6e\x73':_0x392298,'\x74\x6f\x74\x61\x6c\x5f\x74\x6f\x6b\x65\x6e\x73':_0xaa9edd[_0x382b3d(0xe1,'\x78\x71\x29\x35')](_0x5c638d,_0x392298),'\x63\x61\x6c\x6c\x73':_0x1fc063,'\x6d\x65\x61\x73\x75\x72\x65\x64':!![]};}const _0x169c35={};_0x169c35[_0x58eb33(0x126,'\x73\x62\x68\x5d')+_0x58eb33(0xcf,'\x72\x7a\x78\x6e')]=_0x361f49,module['\x65\x78\x70\x6f\x72\x74\x73']=_0x169c35;
@@ -1,111 +0,0 @@
1
- 'use strict';
2
-
3
- exports.assetsJs = `
4
- function renderGenesTable(data) {
5
- return '<table class="data-table"><thead><tr>' +
6
- '<th>' + esc(t('assets.col.id')) + '</th>' +
7
- '<th>' + esc(t('assets.col.category')) + '</th>' +
8
- '<th>' + esc(t('assets.col.signals')) + '</th>' +
9
- '<th>' + esc(t('assets.col.strategy')) + '</th>' +
10
- '<th>' + esc(t('assets.col.validation')) + '</th>' +
11
- '</tr></thead><tbody>' +
12
- data.map((g) => '<tr><td><strong>' + esc(g.id) + '</strong></td>' +
13
- '<td><span class="pill ' + esc(g.category) + '">' + esc(g.category) + '</span></td>' +
14
- '<td>' + pillList(g.signals_match || [], 'signal') + '</td>' +
15
- '<td><details><summary>' + (g.strategy?.length || 0) + ' ' + esc(t('assets.steps')) + '</summary><ol class="reason-list">' + (g.strategy || []).map(s => '<li>' + esc(s) + '</li>').join('') + '</ol></details></td>' +
16
- '<td><details><summary>' + (g.validation?.length || 0) + ' ' + esc(t('assets.cmds')) + '</summary><ul class="reason-list">' + (g.validation || []).map(s => '<li><code>' + esc(s) + '</code></li>').join('') + '</ul></details></td>' +
17
- '</tr>').join('') +
18
- '</tbody></table>';
19
- }
20
-
21
- function renderCapsulesTable(data) {
22
- if (!data.length) return '<p class="muted">' + esc(t('assets.empty.capsules')) + '</p>';
23
- return '<table class="data-table"><thead><tr>' +
24
- '<th>' + esc(t('assets.col.id')) + '</th>' +
25
- '<th>' + esc(t('assets.col.gene')) + '</th>' +
26
- '<th>' + esc(t('assets.col.outcome')) + '</th>' +
27
- '<th>' + esc(t('assets.col.confidence')) + '</th>' +
28
- '<th>' + esc(t('assets.col.blast')) + '</th>' +
29
- '</tr></thead><tbody>' +
30
- data.map((c) => '<tr><td><strong>' + esc(c.id) + '</strong></td><td>' + esc(c.gene || '-') + '</td>' +
31
- '<td><span class="status-indicator ' + getStatusClass(c.outcome?.status) + '"></span>' + esc(tStatus(c.outcome?.status) || '-') + '</td>' +
32
- '<td>' + esc(c.confidence ?? '-') + '</td>' +
33
- '<td>' + esc((c.blast_radius?.files ?? '-') + '/' + (c.blast_radius?.lines ?? '-')) + '</td>' +
34
- '</tr>').join('') +
35
- '</tbody></table>';
36
- }
37
-
38
- function renderEventsList(data) {
39
- if (!data.length) return '<p class="muted">' + t('assets.empty.events') + '</p>';
40
- return '<ul class="event-list">' + data.map((e) => '<li>' +
41
- '<div><strong>' + esc(e.id || '-') + '</strong> <span class="muted small">' + esc(formatTime(e.timestamp || e.created_at)) + '</span></div>' +
42
- '<div>' + esc(t('assets.events.signals')) + pillList(e.signals || e.signals_matched || [], 'signal') + '</div>' +
43
- '<div>' + esc(t('assets.events.genes')) + pillList(e.genes_used || [], '') + '</div>' +
44
- '<div>' + esc(t('assets.events.outcome')) + '<span class="status-indicator ' + getStatusClass(e.outcome?.status) + '"></span>' + esc(tStatus(e.outcome?.status) || '-') + '</div>' +
45
- '</li>').join('') + '</ul>';
46
- }
47
-
48
- function renderCandidatesTable(data) {
49
- if (!data.length) return '<p class="muted">' + esc(t('assets.empty.candidates')) + '</p>';
50
- return '<table class="data-table"><thead><tr>' +
51
- '<th>' + esc(t('assets.col.source')) + '</th>' +
52
- '<th>' + esc(t('assets.col.assetId')) + '</th>' +
53
- '<th>' + esc(t('assets.col.score')) + '</th>' +
54
- '<th>' + esc(t('assets.col.time')) + '</th>' +
55
- '</tr></thead><tbody>' +
56
- data.map((c) => '<tr><td>' + esc(c.source || c.source_node_id || '-') + '</td>' +
57
- '<td><code>' + esc(c.asset_id || c.id || '-') + '</code></td>' +
58
- '<td>' + esc(c.score ?? '-') + '</td>' +
59
- '<td>' + esc(formatTime(c.timestamp)) + '</td></tr>').join('') +
60
- '</tbody></table>';
61
- }
62
-
63
- function renderCallsTable(data) {
64
- if (!data.length) return '<p class="muted">' + esc(t('assets.empty.calls')) + '</p>';
65
- return '<table class="data-table"><thead><tr>' +
66
- '<th>' + esc(t('assets.col.time')) + '</th>' +
67
- '<th>' + esc(t('assets.col.action')) + '</th>' +
68
- '<th>' + esc(t('assets.col.asset')) + '</th>' +
69
- '<th>' + esc(t('assets.col.run')) + '</th>' +
70
- '<th>' + esc(t('assets.col.score')) + '</th>' +
71
- '</tr></thead><tbody>' +
72
- data.map((c) => '<tr><td>' + esc(formatTime(c.timestamp)) + '</td>' +
73
- '<td><span class="pill ' + esc(c.action) + '">' + esc(tAction(c.action)) + '</span></td>' +
74
- '<td><code>' + esc(c.asset_id || '-') + '</code></td>' +
75
- '<td>' + esc(c.run_id || '-') + '</td>' +
76
- '<td>' + esc(c.score ?? '-') + '</td></tr>').join('') +
77
- '</tbody></table>';
78
- }
79
-
80
- const ASSET_RENDERERS = {
81
- genes: renderGenesTable,
82
- capsules: renderCapsulesTable,
83
- events: renderEventsList,
84
- candidates: renderCandidatesTable,
85
- calls: renderCallsTable,
86
- };
87
-
88
- const ASSET_ENDPOINTS = {
89
- genes: '/webui/assets/genes',
90
- capsules: '/webui/assets/capsules',
91
- events: '/webui/assets/events',
92
- candidates: '/webui/assets/candidates',
93
- calls: '/webui/assets/calls',
94
- };
95
-
96
- async function loadAsset(kind) {
97
- state.currentAsset = kind;
98
- $('asset-list').innerHTML = '<p class="muted">' + esc(t('common.loading')) + '</p>';
99
- document.querySelectorAll('.asset-tab').forEach((b) => b.classList.toggle('active', b.getAttribute('data-asset') === kind));
100
- try {
101
- const result = await api(ASSET_ENDPOINTS[kind] + '?limit=200');
102
- const renderer = ASSET_RENDERERS[kind];
103
- const total = result.pagination?.totalItems ?? (result.data || []).length;
104
- $('asset-list').innerHTML =
105
- '<div class="muted small" style="margin-bottom:12px">' + total + ' ' + esc(t('assets.records')) + '</div>' +
106
- renderer(result.data || []);
107
- } catch (err) {
108
- $('asset-list').innerHTML = '<p class="status-failed">' + esc(t('common.failedPrefix')) + esc(err.message) + '</p>';
109
- }
110
- }
111
- `;
@@ -1,92 +0,0 @@
1
- 'use strict';
2
-
3
- exports.bootstrapJs = `
4
- const TAB_TITLE_KEYS = {
5
- overview: 'nav.overview',
6
- pipelines: 'nav.pipelines',
7
- assets: 'nav.assets',
8
- interactions: 'nav.interactions',
9
- personality: 'nav.personality',
10
- };
11
-
12
- function activateTab(tab) {
13
- state.currentTab = tab;
14
- document.querySelectorAll('.tab').forEach((b) => b.classList.toggle('active', b.getAttribute('data-tab') === tab));
15
- document.querySelectorAll('.view').forEach((v) => v.classList.toggle('active', v.getAttribute('data-view') === tab));
16
- const title = document.getElementById('topbar-title');
17
- if (title && TAB_TITLE_KEYS[tab]) {
18
- title.setAttribute('data-i18n', TAB_TITLE_KEYS[tab]);
19
- title.textContent = t(TAB_TITLE_KEYS[tab]);
20
- }
21
- setTimeout(() => Object.values(state.charts).forEach((c) => c.resize && c.resize()), 50);
22
- // Reload current tab so it works after toggleTheme/toggleLocale has
23
- // disposed all chart instances (otherwise switching back to Overview
24
- // would show empty chart slots).
25
- if (tab === 'overview') loadOverview();
26
- if (tab === 'pipelines') loadPipelines();
27
- if (tab === 'assets') loadAsset(state.currentAsset);
28
- if (tab === 'interactions') loadInteractions();
29
- if (tab === 'personality') loadPersonality();
30
- }
31
-
32
- async function refresh() {
33
- if (state.currentTab === 'overview') return loadOverview();
34
- if (state.currentTab === 'pipelines') return loadPipelines();
35
- if (state.currentTab === 'assets') return loadAsset(state.currentAsset);
36
- if (state.currentTab === 'interactions') return loadInteractions();
37
- if (state.currentTab === 'personality') return loadPersonality();
38
- }
39
-
40
- function disposeAllCharts() {
41
- for (const id of Object.keys(state.charts)) {
42
- state.charts[id].dispose && state.charts[id].dispose();
43
- delete state.charts[id];
44
- }
45
- }
46
-
47
- function toggleTheme() {
48
- const root = document.documentElement;
49
- const next = root.classList.contains('dark') ? 'light' : 'dark';
50
- root.classList.toggle('dark', next === 'dark');
51
- try { localStorage.setItem('evolver-theme', next); } catch (_) {}
52
- // ECharts colors are baked at init time, so dispose + re-render the
53
- // active tab so chart text/axes pick up the new palette.
54
- disposeAllCharts();
55
- refresh();
56
- }
57
-
58
- function syncLocaleGlyph() {
59
- const glyph = document.querySelector('#locale-toggle .locale-glyph');
60
- if (!glyph) return;
61
- // Glyph shows the *target* locale (what you'll switch to), matching
62
- // common bilingual UI conventions (e.g. evox-desktop).
63
- glyph.textContent = getLocale() === 'zh' ? 'EN' : '中';
64
- }
65
-
66
- function toggleLocale() {
67
- const next = getLocale() === 'zh' ? 'en' : 'zh';
68
- setLocale(next);
69
- applyI18nDom();
70
- syncLocaleGlyph();
71
- // Charts contain locale-baked labels (axis names, legends, tooltips
72
- // built from t() calls), so dispose + re-render to pick up the new
73
- // strings. Same pattern as toggleTheme.
74
- disposeAllCharts();
75
- refresh();
76
- }
77
-
78
- // Initial paint — set glyph + apply translations to the static markup.
79
- syncLocaleGlyph();
80
- applyI18nDom();
81
-
82
- document.querySelectorAll('.tab').forEach((b) => b.addEventListener('click', () => activateTab(b.getAttribute('data-tab'))));
83
- document.querySelectorAll('.asset-tab').forEach((b) => b.addEventListener('click', () => loadAsset(b.getAttribute('data-asset'))));
84
- $('refresh').addEventListener('click', refresh);
85
- const themeBtn = $('theme-toggle');
86
- if (themeBtn) themeBtn.addEventListener('click', toggleTheme);
87
- const localeBtn = $('locale-toggle');
88
- if (localeBtn) localeBtn.addEventListener('click', toggleLocale);
89
- window.addEventListener('resize', () => Object.values(state.charts).forEach((c) => c.resize && c.resize()));
90
- window.loadRun = loadRun;
91
- loadOverview();
92
- `;
@@ -1,77 +0,0 @@
1
- 'use strict';
2
-
3
- exports.commonJs = `
4
- const state = { selectedRunId: null, charts: {}, currentTab: 'overview', currentAsset: 'genes' };
5
- const $ = (id) => document.getElementById(id);
6
-
7
- async function api(path) {
8
- const res = await fetch(path);
9
- const body = await res.json();
10
- if (!res.ok) throw new Error(body.error?.message || 'Request failed');
11
- return body;
12
- }
13
-
14
- function isDarkMode() {
15
- // .dark on <html> is the single source of truth. THEME_INIT_SCRIPT
16
- // runs synchronously in <head> before any client JS executes and
17
- // already resolves the explicit (localStorage 'evolver-theme'
18
- // light/dark) vs implicit (system: matchMedia) cases into the class.
19
- // Falling back to matchMedia here would re-introduce the OS
20
- // preference *after* the user explicitly toggled to light on a
21
- // dark-OS system, so chartTextColor() would return light text on a
22
- // light background and ECharts axis labels would be near-invisible.
23
- return document.documentElement.classList.contains('dark');
24
- }
25
-
26
- function chartTextColor() {
27
- return isDarkMode() ? '#c7d0d9' : '#5c6975';
28
- }
29
-
30
- function ensureChart(id) {
31
- const el = document.getElementById(id);
32
- if (!el) return null;
33
- if (!state.charts[id]) state.charts[id] = echarts.init(el);
34
- return state.charts[id];
35
- }
36
-
37
- function getStatusClass(status) {
38
- if (status === 'success' || status === 'completed') return 'status-success';
39
- if (status === 'running' || status === 'pending') return 'status-running';
40
- if (status === 'failed') return 'status-failed';
41
- if (status === 'blocked' || status === 'review_pending') return 'status-blocked';
42
- if (status === 'abandoned') return 'status-abandoned';
43
- if (status === 'selected') return 'status-running';
44
- return 'status-skipped';
45
- }
46
-
47
- function kv(rows) {
48
- return '<dl>' + rows.map(([k, v]) => '<dt>' + esc(k) + '</dt><dd>' + esc(format(v)) + '</dd>').join('') + '</dl>';
49
- }
50
-
51
- function esc(value) {
52
- return String(value ?? '').replace(/[&<>"']/g, (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[ch]));
53
- }
54
-
55
- function format(value) {
56
- if (value === null || value === undefined || value === '') return '-';
57
- if (typeof value === 'object') return JSON.stringify(value);
58
- // Round non-integer numbers to 4 decimals to drop float noise like
59
- // 0.7499999999999999 -> 0.75 without losing meaningful precision.
60
- if (typeof value === 'number' && Number.isFinite(value) && !Number.isInteger(value)) {
61
- return Number(value.toFixed(4));
62
- }
63
- return value;
64
- }
65
-
66
- function formatTime(value) {
67
- if (!value) return '-';
68
- const t = new Date(value);
69
- if (isNaN(t.getTime()) || t.getTime() === 0) return '-';
70
- return t.toLocaleString();
71
- }
72
-
73
- function pillList(items, kind) {
74
- if (!items || !items.length) return '<span class="muted">none</span>';
75
- return items.map((item) => '<span class="pill ' + (kind || '') + '">' + esc(item) + '</span>').join(' ');
76
- }
77
- `;