ziya 0.3.0__py3-none-any.whl → 0.3.2__py3-none-any.whl

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.

Potentially problematic release.


This version of ziya might be problematic. Click here for more details.

Files changed (73) hide show
  1. app/agents/agent.py +71 -73
  2. app/agents/direct_streaming.py +1 -1
  3. app/agents/prompts.py +1 -1
  4. app/agents/prompts_manager.py +14 -10
  5. app/agents/wrappers/google_direct.py +31 -1
  6. app/agents/wrappers/nova_tool_execution.py +2 -2
  7. app/agents/wrappers/nova_wrapper.py +1 -1
  8. app/agents/wrappers/ziya_bedrock.py +53 -31
  9. app/config/models_config.py +61 -20
  10. app/config/shell_config.py +5 -1
  11. app/extensions/prompt_extensions/claude_extensions.py +27 -5
  12. app/extensions/prompt_extensions/mcp_prompt_extensions.py +82 -56
  13. app/main.py +5 -3
  14. app/mcp/client.py +19 -10
  15. app/mcp/manager.py +68 -10
  16. app/mcp/tools.py +8 -9
  17. app/mcp_servers/shell_server.py +3 -3
  18. app/middleware/streaming.py +29 -41
  19. app/routes/file_validation.py +35 -0
  20. app/routes/mcp_routes.py +54 -8
  21. app/server.py +525 -614
  22. app/streaming_tool_executor.py +748 -137
  23. app/templates/asset-manifest.json +20 -20
  24. app/templates/index.html +1 -1
  25. app/templates/static/css/{main.0297bfee.css → main.e7109b49.css} +2 -2
  26. app/templates/static/css/main.e7109b49.css.map +1 -0
  27. app/templates/static/js/14386.65fcfe53.chunk.js +2 -0
  28. app/templates/static/js/14386.65fcfe53.chunk.js.map +1 -0
  29. app/templates/static/js/35589.0368973a.chunk.js +2 -0
  30. app/templates/static/js/35589.0368973a.chunk.js.map +1 -0
  31. app/templates/static/js/{50295.ab92f61b.chunk.js → 50295.90aca393.chunk.js} +3 -3
  32. app/templates/static/js/50295.90aca393.chunk.js.map +1 -0
  33. app/templates/static/js/55734.5f0fd567.chunk.js +2 -0
  34. app/templates/static/js/55734.5f0fd567.chunk.js.map +1 -0
  35. app/templates/static/js/58542.57fed736.chunk.js +2 -0
  36. app/templates/static/js/58542.57fed736.chunk.js.map +1 -0
  37. app/templates/static/js/{68418.2554bb1e.chunk.js → 68418.f7b4d2d9.chunk.js} +3 -3
  38. app/templates/static/js/68418.f7b4d2d9.chunk.js.map +1 -0
  39. app/templates/static/js/99948.b280eda0.chunk.js +2 -0
  40. app/templates/static/js/99948.b280eda0.chunk.js.map +1 -0
  41. app/templates/static/js/main.e075582c.js +3 -0
  42. app/templates/static/js/main.e075582c.js.map +1 -0
  43. app/utils/code_util.py +5 -2
  44. app/utils/context_cache.py +11 -0
  45. app/utils/conversation_filter.py +90 -0
  46. app/utils/custom_bedrock.py +43 -1
  47. app/utils/diff_utils/validation/validators.py +32 -22
  48. app/utils/file_cache.py +5 -3
  49. app/utils/precision_prompt_system.py +116 -0
  50. app/utils/streaming_optimizer.py +100 -0
  51. {ziya-0.3.0.dist-info → ziya-0.3.2.dist-info}/METADATA +3 -2
  52. {ziya-0.3.0.dist-info → ziya-0.3.2.dist-info}/RECORD +59 -55
  53. app/templates/static/css/main.0297bfee.css.map +0 -1
  54. app/templates/static/js/14386.567bf803.chunk.js +0 -2
  55. app/templates/static/js/14386.567bf803.chunk.js.map +0 -1
  56. app/templates/static/js/35589.278ecda2.chunk.js +0 -2
  57. app/templates/static/js/35589.278ecda2.chunk.js.map +0 -1
  58. app/templates/static/js/50295.ab92f61b.chunk.js.map +0 -1
  59. app/templates/static/js/55734.90d8bd52.chunk.js +0 -2
  60. app/templates/static/js/55734.90d8bd52.chunk.js.map +0 -1
  61. app/templates/static/js/58542.08fb5cf4.chunk.js +0 -2
  62. app/templates/static/js/58542.08fb5cf4.chunk.js.map +0 -1
  63. app/templates/static/js/68418.2554bb1e.chunk.js.map +0 -1
  64. app/templates/static/js/99948.71670e91.chunk.js +0 -2
  65. app/templates/static/js/99948.71670e91.chunk.js.map +0 -1
  66. app/templates/static/js/main.1d79eac2.js +0 -3
  67. app/templates/static/js/main.1d79eac2.js.map +0 -1
  68. /app/templates/static/js/{50295.ab92f61b.chunk.js.LICENSE.txt → 50295.90aca393.chunk.js.LICENSE.txt} +0 -0
  69. /app/templates/static/js/{68418.2554bb1e.chunk.js.LICENSE.txt → 68418.f7b4d2d9.chunk.js.LICENSE.txt} +0 -0
  70. /app/templates/static/js/{main.1d79eac2.js.LICENSE.txt → main.e075582c.js.LICENSE.txt} +0 -0
  71. {ziya-0.3.0.dist-info → ziya-0.3.2.dist-info}/WHEEL +0 -0
  72. {ziya-0.3.0.dist-info → ziya-0.3.2.dist-info}/entry_points.txt +0 -0
  73. {ziya-0.3.0.dist-info → ziya-0.3.2.dist-info}/licenses/LICENSE +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/js/35589.278ecda2.chunk.js","mappings":"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D,gBAAiB,CAChB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,MAED,iBAAkB,CACjB,MACA,MAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,6BAA8B,CAC7B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,mBAAoB,CACnB,KACA,OAED,sBAAuB,CACtB,KACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,KACA,OAED,uBAAwB,CACvB,KACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,uBAAwB,CACvB,MACA,MAED,0BAA2B,CAC1B,MACA,MAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,YAAa,CACZ,MACA,OAED,eAAgB,CACf,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,mBAAoB,CACnB,MACA,MAED,sBAAuB,CACtB,MACA,MAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,MAED,uBAAwB,CACvB,MACA,MAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,MAED,yBAA0B,CACzB,MACA,MAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,MAED,0BAA2B,CAC1B,MACA,MAED,cAAe,CACd,IACA,OAED,iBAAkB,CACjB,IACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MAED,kBAAmB,CAClB,MAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,YAAa,CACZ,MACA,OAED,eAAgB,CACf,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,wBAAyB,CACxB,KACA,OAED,2BAA4B,CAC3B,KACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,KAED,wBAAyB,CACxB,MACA,KAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,KACA,OAED,uBAAwB,CACvB,KACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,mCAAoC,CACnC,KACA,OAED,sCAAuC,CACtC,KACA,OAED,uCAAwC,CACvC,MACA,OAED,0CAA2C,CAC1C,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,KACA,MAED,yBAA0B,CACzB,KACA,MAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,MAED,qBAAsB,CACrB,KACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,aAAc,CACb,MACA,OAED,gBAAiB,CAChB,MACA,OAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,aAAc,CACb,KACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,gBAAiB,CAChB,KACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,KACA,OAED,kBAAmB,CAClB,KACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,KACA,OAED,sBAAuB,CACtB,KACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,6BAA8B,CAC7B,MACA,OAED,gCAAiC,CAChC,MACA,OAED,iCAAkC,CACjC,MACA,OAED,oCAAqC,CACpC,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,aAAc,CACb,MACA,OAED,gBAAiB,CAChB,MACA,OAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,YAAa,CACZ,MACA,OAED,eAAgB,CACf,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,6BAA8B,CAC7B,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,6BAA8B,CAC7B,MACA,OAED,gCAAiC,CAChC,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,aAAc,CACb,MACA,OAED,gBAAiB,CAChB,MACA,OAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,MAED,uBAAwB,CACvB,MACA,MAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,gBAAiB,CAChB,MACA,MAED,mBAAoB,CACnB,MACA,MAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,MAED,uBAAwB,CACvB,MACA,MAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,MAED,sBAAuB,CACtB,MACA,MAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,KACA,OAED,0BAA2B,CAC1B,KACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,eAAgB,CACf,KACA,OAED,kBAAmB,CAClB,KACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,KACA,OAED,yBAA0B,CACzB,KACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,gBAAiB,CAChB,MACA,MAED,mBAAoB,CACnB,MACA,MAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,gCAAiC,CAChC,MACA,MAED,mCAAoC,CACnC,MACA,MAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,KACA,MAED,sBAAuB,CACtB,KACA,MAED,0BAA2B,CAC1B,IACA,OAED,6BAA8B,CAC7B,IACA,OAED,8BAA+B,CAC9B,MACA,OAED,iCAAkC,CACjC,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,gBAAiB,CAChB,KACA,OAED,mBAAoB,CACnB,KACA,OAED,oBAAqB,CACpB,MACA,MAED,uBAAwB,CACvB,MACA,MAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,aAAc,CACb,KACA,OAED,gBAAiB,CAChB,KACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,eAAgB,CACf,KACA,OAED,kBAAmB,CAClB,KACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,MAED,4BAA6B,CAC5B,MACA,MAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,MAED,qBAAsB,CACrB,KACA,MAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,KAED,wBAAyB,CACxB,MACA,KAED,oBAAqB,CACpB,KACA,OAED,uBAAwB,CACvB,KACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,IACA,OAED,wBAAyB,CACxB,IACA,OAED,YAAa,CACZ,KACA,OAED,eAAgB,CACf,KACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,MAED,sBAAuB,CACtB,MACA,MAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,YAAa,CACZ,MACA,OAED,eAAgB,CACf,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,KACA,OAED,mBAAoB,CACnB,KACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,KACA,MAED,0BAA2B,CAC1B,KACA,MAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,6BAA8B,CAC7B,MACA,OAED,gCAAiC,CAChC,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,KACA,OAED,iBAAkB,CACjB,KACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,eAAgB,CACf,MACA,MAED,kBAAmB,CAClB,MACA,MAED,mBAAoB,CACnB,KACA,OAED,sBAAuB,CACtB,KACA,OAED,gBAAiB,CAChB,KACA,KAED,mBAAoB,CACnB,KACA,KAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,iBAAkB,CACjB,KACA,KAED,oBAAqB,CACpB,KACA,KAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,KACA,OAED,+BAAgC,CAC/B,KACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,iBAAkB,CACjB,MACA,MAED,oBAAqB,CACpB,MACA,MAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,MAED,4BAA6B,CAC5B,MACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,KACA,OAED,sBAAuB,CACtB,KACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,gBAAiB,CAChB,IACA,OAED,mBAAoB,CACnB,IACA,OAED,oBAAqB,CACpB,IACA,OAED,uBAAwB,CACvB,IACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,IACA,OAED,uBAAwB,CACvB,IACA,OAED,wBAAyB,CACxB,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,+BAAgC,CAC/B,MACA,OAED,gBAAiB,CAChB,MACA,MAED,mBAAoB,CACnB,MACA,MAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,IACA,OAED,qBAAsB,CACrB,IACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,MAED,qBAAsB,CACrB,MACA,MAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,eAAgB,CACf,MACA,MAED,kBAAmB,CAClB,MACA,MAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,qBAAsB,CACrB,KACA,OAED,wBAAyB,CACxB,KACA,OAED,yBAA0B,CACzB,MACA,OAED,4BAA6B,CAC5B,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,MAED,yBAA0B,CACzB,MACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,KACA,OAED,qBAAsB,CACrB,KACA,OAED,YAAa,CACZ,MACA,OAED,eAAgB,CACf,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,MAED,mBAAoB,CACnB,MACA,MAED,oBAAqB,CACpB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,MAED,yBAA0B,CACzB,MACA,MAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,MAED,sBAAuB,CACtB,MACA,MAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,uBAAwB,CACvB,MACA,OAED,0BAA2B,CAC1B,MACA,OAED,2BAA4B,CAC3B,MACA,OAED,8BAA+B,CAC9B,MACA,OAED,qBAAsB,CACrB,MACA,OAED,wBAAyB,CACxB,MACA,OAED,yBAA0B,CACzB,KACA,MAED,4BAA6B,CAC5B,KACA,MAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,KACA,MAED,sBAAuB,CACtB,KACA,MAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,KACA,OAED,kBAAmB,CAClB,KACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,gBAAiB,CAChB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,oBAAqB,CACpB,MACA,MAED,uBAAwB,CACvB,MACA,MAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,yBAA0B,CACzB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,iBAAkB,CACjB,MACA,OAED,oBAAqB,CACpB,MACA,OAED,qBAAsB,CACrB,MACA,MAED,wBAAyB,CACxB,MACA,MAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,eAAgB,CACf,MACA,OAED,kBAAmB,CAClB,MACA,OAED,mBAAoB,CACnB,MACA,OAED,sBAAuB,CACtB,MACA,OAED,cAAe,CACd,MACA,OAED,iBAAkB,CACjB,MACA,OAED,kBAAmB,CAClB,MACA,OAED,qBAAsB,CACrB,MACA,QAGF,SAAS05B,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAE75B,EAAK25B,GAC9B,OAAOjgB,QAAQ+e,UAAUqB,MAAK,KAC7B,IAAIr5B,EAAI,IAAIyX,MAAM,uBAAyByhB,EAAM,KAEjD,MADAl5B,EAAES,KAAO,mBACHT,CAAC,IAIT,IAAIs5B,EAAM/5B,EAAI25B,GAAM/e,EAAKmf,EAAI,GAC7B,OAAOrgB,QAAQC,IAAIogB,EAAI34B,MAAM,GAAGpB,IAAI45B,EAAoBn5B,IAAIq5B,MAAK,IACzDF,EAAoBnK,EAAE7U,EAAI,KAEnC,CACA8e,EAAoBnX,KAAO,IAAO5C,OAAO4C,KAAKviB,GAC9C05B,EAAoB9e,GAAK,MACzBof,EAAOC,QAAUP,C","sources":["components/DiffLine.tsx","utils/thinkingParser.ts","utils/fileOperationParser.ts","components/FileOperationRenderer.tsx","components/MarkdownRenderer.tsx","utils/toolCallParser.ts","utils/logUtils.ts","utils/prismLoader.ts","../node_modules/prismjs/components|/Users/vkrishnaprasad/personal_projects/ziya/frontend/node_modules/prismjs/components|lazy|/^/.//prism/-.*$/|chunkName: prism-lang.[request]|groupOptions: {}|namespace object"],"sourcesContent":["import React, { useState, useRef, useMemo, useLayoutEffect } from 'react';\nimport { loadPrismLanguage } from '../utils/prismLoader';\nimport { useTheme } from '../context/ThemeContext';\n\ninterface DiffLineProps {\n content: string;\n language: string;\n type: 'normal' | 'insert' | 'delete';\n oldLineNumber?: number;\n newLineNumber?: number;\n viewType: string;\n showLineNumbers?: boolean;\n similarity?: number;\n style?: React.CSSProperties;\n}\n\n// Add a cache for whitespace visualization\nconst whitespaceCache = new Map<string, string>();\n\nexport const DiffLine = React.memo(({\n content,\n language,\n type,\n oldLineNumber,\n newLineNumber,\n viewType,\n showLineNumbers = true,\n style\n}: DiffLineProps) => {\n\n // Memoize line numbers to prevent unnecessary re-renders\n const lineNumbers = useMemo(() => ({\n old: oldLineNumber,\n new: newLineNumber\n }), [oldLineNumber, newLineNumber]);\n\n const [highlighted, setHighlighted] = useState(content);\n const [isLoading, setIsLoading] = useState(true);\n const { isDarkMode } = useTheme();\n const [isHighlighting, setIsHighlighting] = useState(true);\n const languageLoadedRef = useRef(false);\n const lastGoodRenderRef = useRef<string | null>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Cache whitespace visualization results\n const visualizeWhitespace = (text: string): string => {\n // Use cache to avoid repeated processing\n const cacheKey = `${text}-${type}`;\n if (whitespaceCache.has(cacheKey)) {\n return whitespaceCache.get(cacheKey)!;\n }\n\n let result = '';\n\n // For completely empty or whitespace-only lines\n if (!text.trim()) {\n const markers = text.replace(/[ \\t]/g, c => c === ' ' ? '\\u2591' : '→');\n const wsClass = type === 'insert' ? 'ws-add' : type === 'delete' ? 'ws-delete' : 'ws-normal';\n return `<span class=\"token-line\">` +\n `<span class=\"ws-marker ${wsClass}\">${markers}</span>${text}` +\n `</span>`;\n }\n\n // For trailing whitespace\n const match = text.match(/^(.*?)([ \\t]+)$/);\n if (match) {\n const [_, baseText, trailingWs] = match;\n // Create the visual markers\n const markers = Array.from(trailingWs)\n .map(c => c === ' ' ? '\\u2591' : (c === '\\t' ? '→' : c))\n .join('');\n // Only apply markers if we're not inside a JSX/HTML tag\n if (language === 'jsx' || language === 'tsx') {\n const openBracket = baseText.lastIndexOf('<');\n const closeBracket = baseText.lastIndexOf('>');\n if (openBracket > closeBracket) {\n return text; // Inside a tag, don't mark whitespace\n }\n }\n const wsClass = type === 'insert' ? 'ws-add' : type === 'delete' ? 'ws-delete' : '';\n result = `${baseText}<span class=\"ws-marker ${wsClass}\">${markers}</span>${trailingWs}`;\n } else {\n result = text;\n }\n\n // Cache the result\n whitespaceCache.set(cacheKey, result);\n return result;\n };\n\n useLayoutEffect(() => {\n const highlightCode = async () => {\n setIsHighlighting(true);\n try {\n if (!languageLoadedRef.current) {\n try {\n await loadPrismLanguage(language || 'plaintext');\n } catch (e) {\n console.warn(`Failed to load language ${language}, falling back to plaintext:`, e);\n }\n }\n languageLoadedRef.current = true;\n\n if (!window.Prism || content.length <= 1) return;\n\n // If already has Prism tokens, use as-is\n if (content.includes('<span class=\"token')) {\n if (contentRef.current) {\n lastGoodRenderRef.current = content;\n setHighlighted(content);\n languageLoadedRef.current = true;\n contentRef.current.innerHTML = content;\n }\n setIsLoading(false);\n return;\n }\n\n // Handle whitespace-only lines before any other processing\n if (!content.trim()) {\n const rendered = visualizeWhitespace(content);\n if (contentRef.current && rendered !== lastGoodRenderRef.current) {\n contentRef.current.innerHTML = rendered;\n lastGoodRenderRef.current = rendered;\n }\n if (rendered !== highlighted) {\n setHighlighted(rendered);\n }\n return;\n }\n\n let code = content;\n\n // First get the actual content without the diff marker\n if (content.startsWith('+') || content.startsWith('-')) {\n code = content.slice(1); // Remove just the marker\n }\n\n // Highlight the code with Prism\n const grammar = window.Prism.languages[language] || window.Prism.languages.plaintext;\n let highlightedCode = window.Prism.highlight(code, grammar, language);\n\n // Apply whitespace visualization after syntax highlighting\n highlightedCode = visualizeWhitespace(highlightedCode);\n\n if (highlightedCode.includes('<span class=\"token')) {\n if (contentRef.current) {\n contentRef.current.innerHTML = highlightedCode;\n lastGoodRenderRef.current = highlightedCode;\n }\n setHighlighted(`${highlightedCode}`);\n return;\n }\n\n // If highlighting failed or produced no tokens, fallback to escaping\n const escapedCode = code.replace(/[<>]/g, c => ({\n '<': '&lt;',\n '>': '&gt;'\n })[c] || c);\n const rendered = `${escapedCode}`;\n if (contentRef.current && rendered !== lastGoodRenderRef.current) {\n lastGoodRenderRef.current = rendered;\n setHighlighted(visualizeWhitespace(rendered));\n contentRef.current.innerHTML = rendered;\n }\n\n // Wrap the highlighted code in a span to preserve Prism classes\n highlightedCode = `<span class=\"token-line\">${highlightedCode}</span>`;\n\n if (contentRef.current) {\n contentRef.current.innerHTML = highlightedCode;\n lastGoodRenderRef.current = highlightedCode;\n }\n setIsLoading(false);\n } catch (error) {\n console.error(`Failed to highlight ${language}:`, error);\n if (lastGoodRenderRef.current && contentRef.current && contentRef.current.innerHTML !== lastGoodRenderRef.current) {\n contentRef.current.innerHTML = lastGoodRenderRef.current;\n }\n } finally {\n setIsLoading(false);\n setIsHighlighting(false);\n }\n };\n\n highlightCode();\n return () => {\n languageLoadedRef.current = false;\n };\n }, [content, language, type, oldLineNumber, newLineNumber, highlighted]);\n\n // Define base styles that work for both light and dark modes\n const baseStyles: React.CSSProperties = {\n fontFamily: 'ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace',\n font: '12px/20px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace',\n whiteSpace: 'pre'\n };\n\n // Add theme-specific colors\n const themeStyles = isDarkMode ? {\n backgroundColor: type === 'insert' ? '#1a4d1a' :\n type === 'delete' ? '#4d1a1a' :\n 'transparent',\n color: type === 'insert' ? '#4afa4a' :\n type === 'delete' ? '#ff6b6b' :\n '#e6e6e6'\n } : {\n backgroundColor: type === 'insert' ? '#e6ffec' :\n type === 'delete' ? '#ffebe9' :\n 'transparent',\n color: type === 'insert' ? '#28a745' :\n type === 'delete' ? '#d73a49' :\n '#24292e'\n };\n\n // Common content style\n const contentStyle: React.CSSProperties = {\n visibility: isHighlighting ? 'hidden' : 'visible',\n whiteSpace: 'pre',\n minWidth: 'max-content',\n display: 'block',\n overflow: 'visible',\n ...(isLoading ? { ...baseStyles, ...themeStyles } : {}),\n ...(style || {})\n };\n\n if (viewType === 'split') {\n // Calculate column widths\n const gutterWidth = showLineNumbers ? '50px' : '0';\n const codeWidth = `calc(50% - ${showLineNumbers ? '50px' : '0px'})`;\n\n return (\n <tr className={`diff-line diff-line-${type}`} data-testid=\"diff-line\" data-line={String(type === 'delete' ? oldLineNumber || 1 : newLineNumber || 1)}>\n {/* Left gutter column */}\n <td\n className={`diff-gutter-col diff-gutter-old no-copy ${type === 'delete' ? 'diff-gutter-delete' : ''}`}\n style={{\n display: showLineNumbers ? 'table-cell' : 'none',\n width: gutterWidth,\n minWidth: gutterWidth,\n maxWidth: gutterWidth\n }}\n >\n {lineNumbers.old}\n </td>\n\n {/* Left code column */}\n <td\n className=\"diff-code diff-code-left\"\n style={{\n width: codeWidth,\n backgroundColor: type === 'delete' ? (isDarkMode ? '#4d1a1a' : '#ffebe9') : 'transparent'\n }}\n >\n {type !== 'insert' ? (\n <div\n className=\"diff-line-content token-container\"\n ref={contentRef}\n style={contentStyle}\n dangerouslySetInnerHTML={{ __html: lastGoodRenderRef.current || visualizeWhitespace(content || ' ') }} />\n ) : <div className=\"diff-code-placeholder\"> </div>}\n </td>\n\n {/* Right gutter column */}\n <td\n className={`diff-gutter-col diff-gutter-new no-copy ${type === 'insert' ? 'diff-gutter-insert' : ''}`}\n style={{\n display: showLineNumbers ? 'table-cell' : 'none',\n width: gutterWidth,\n minWidth: gutterWidth,\n maxWidth: gutterWidth\n }}\n >\n {lineNumbers.new}\n </td>\n\n {/* Right code column */}\n <td\n className=\"diff-code diff-code-right\"\n style={{\n width: codeWidth,\n backgroundColor: type === 'insert' ? (isDarkMode ? '#1a4d1a' : '#e6ffec') : 'transparent'\n }}\n >\n {type !== 'delete' ? (\n <div\n className=\"diff-line-content token-container\"\n ref={contentRef}\n style={contentStyle}\n dangerouslySetInnerHTML={{ __html: lastGoodRenderRef.current || visualizeWhitespace(content || ' ') }} />\n ) : <div className=\"diff-code-placeholder\"> </div>}\n </td>\n </tr>\n );\n }\n\n // Unified view\n return (\n <tr className={`diff-line diff-line-${type}`} data-testid=\"diff-line\" data-line={String(type === 'delete' ? oldLineNumber || 1 : newLineNumber || 1)}>\n {showLineNumbers && (\n <td className={`diff-gutter-col diff-gutter-old no-copy ${type === 'delete' ? 'diff-gutter-delete' : ''}`}>\n {lineNumbers.old}\n </td>\n )}\n {showLineNumbers && (\n <td className={`diff-gutter-col diff-gutter-new no-copy ${type === 'insert' ? 'diff-gutter-insert' : ''}`}>\n {lineNumbers.new}\n </td>\n )}\n <td\n className={`diff-code diff-code-${type}`}\n style={{\n backgroundColor: type === 'insert' ? (isDarkMode ? '#1a4d1a' : '#e6ffec') :\n type === 'delete' ? (isDarkMode ? '#4d1a1a' : '#ffebe9') : 'transparent',\n }}\n >\n <div\n className=\"diff-line-content token-container\"\n ref={contentRef}\n style={contentStyle}\n dangerouslySetInnerHTML={{ __html: lastGoodRenderRef.current || visualizeWhitespace(content || ' ') }} />\n </td>\n </tr>\n );\n}, (prev, next) => {\n // Only re-render if these props change\n return prev.content === next.content &&\n prev.type === next.type &&\n prev.showLineNumbers === next.showLineNumbers &&\n prev.viewType === next.viewType;\n});\n","/**\n * Frontend thinking content parser to handle <thinking-data> and <thinking> tags\n */\n\nexport interface ThinkingContent {\n content: string;\n}\n\nexport function parseThinkingContent(content: string): ThinkingContent | null {\n // Try thinking-data tags first (for deepseek-r1)\n let thinkingPattern = /<thinking-data>([\\s\\S]*?)<\\/thinking-data>/;\n let match = content.match(thinkingPattern);\n \n if (match) {\n return {\n content: match[1] // Don't trim to preserve formatting\n };\n }\n \n // Try thinking tags (for nova-pro)\n thinkingPattern = /<thinking>([\\s\\S]*?)<\\/thinking>/;\n match = content.match(thinkingPattern);\n \n if (match) {\n return {\n content: match[1] // Don't trim to preserve formatting\n };\n }\n \n return null;\n}\n\nexport function removeThinkingTags(content: string): string {\n // Remove both thinking-data and thinking blocks, preserving spacing\n return content\n .replace(/<thinking-data>[\\s\\S]*?<\\/thinking-data>\\s*/g, '')\n .replace(/<thinking>[\\s\\S]*?<\\/thinking>\\s*/g, '');\n}\n","export interface FileOperation {\n type: 'file_operation';\n file?: string;\n find?: string;\n change?: string;\n replace?: string;\n apply?: boolean;\n raw?: string;\n isValid: boolean;\n errors: string[];\n warnings: string[];\n}\n\nexport interface ParseResult {\n operations: FileOperation[];\n hasValidOperations: boolean;\n totalOperations: number;\n errors: string[];\n}\n\n// Common variations and typos we should handle\nconst TAG_VARIATIONS = {\n file: ['file', 'File', 'FILE', 'filename', 'path'],\n find: ['find', 'Find', 'FIND', 'search', 'locate'],\n change: ['change', 'Change', 'CHANGE', 'modify', 'edit'],\n replace: ['replace', 'Replace', 'REPLACE', 'substitute'],\n apply: ['apply', 'Apply', 'APPLY', 'execute', 'run']\n};\n\n// Regex patterns for different syntax variations\nconst PATTERNS = {\n // Standard: <file> content </file>\n standard: /<(file|find|change|replace|apply)>\\s*([\\s\\S]*?)\\s*<\\/\\1>/gi,\n\n // Self-closing: <file path=\"...\" />\n selfClosing: /<(file|find|change|replace|apply)(?:\\s+[^>]*)?\\s*\\/>/gi,\n\n // Attribute style: <file path=\"...\">\n withAttributes: /<(file|find|change|replace|apply)(?:\\s+([^>]*))?>([^<]*)<\\/\\1>/gi,\n\n // Malformed: missing closing tags, etc.\n malformed: /<(file|find|change|replace|apply)>\\s*([\\s\\S]*?)(?=<(?:file|find|change|replace|apply)|$)/gi\n};\n\nexport class FileOperationParser {\n private content: string;\n private operations: FileOperation[] = [];\n private errors: string[] = [];\n\n constructor(content: string) {\n this.content = content;\n }\n\n parse(): ParseResult {\n this.operations = [];\n this.errors = [];\n\n // First, try to detect complete operation blocks\n this.parseCompleteOperations();\n\n // Then, try to parse individual tags that might be malformed\n this.parseMalformedOperations();\n\n // Validate and clean up operations\n this.validateOperations();\n\n return {\n operations: this.operations,\n hasValidOperations: this.operations.some(op => op.isValid),\n totalOperations: this.operations.length,\n errors: this.errors\n };\n }\n\n private parseCompleteOperations(): void {\n // Look for complete operation sequences\n const operationBlocks = this.findOperationBlocks();\n\n for (const block of operationBlocks) {\n const operation = this.parseOperationBlock(block);\n if (operation) {\n this.operations.push(operation);\n }\n }\n }\n\n private findOperationBlocks(): string[] {\n const blocks: string[] = [];\n\n // Pattern to match <apply> blocks specifically\n const blockPattern = /<apply>\\s*([\\s\\S]*?)\\s*<\\/apply>/gi;\n\n let match;\n while ((match = blockPattern.exec(this.content)) !== null) {\n blocks.push(match[0]);\n }\n\n // If no apply blocks found, fall back to individual file operations\n if (blocks.length === 0) {\n const individualPattern = /<file[^>]*>[\\s\\S]*?<\\/file>/gi;\n while ((match = individualPattern.exec(this.content)) !== null) {\n blocks.push(match[0]);\n }\n }\n\n return blocks;\n }\n\n private parseOperationBlock(block: string): FileOperation | null {\n // Handle <apply> wrapper blocks\n const applyMatch = block.match(/<apply>\\s*([\\s\\S]*?)\\s*<\\/apply>/i);\n if (applyMatch) {\n const innerContent = applyMatch[1];\n const operation = this.parseInnerOperation(innerContent);\n if (operation) {\n operation.apply = true;\n operation.raw = block;\n return operation;\n }\n }\n \n // Handle direct operation blocks\n return this.parseInnerOperation(block);\n }\n\n private parseInnerOperation(content: string): FileOperation | null {\n const operation: FileOperation = {\n type: 'file_operation',\n raw: content,\n isValid: false,\n errors: [],\n warnings: []\n };\n\n // Extract each tag type from the block\n operation.file = this.extractTagContent(content, 'file');\n\n // Handle <change> wrapper with <find> and <replace> inside\n const changeContent = this.extractTagContent(content, 'change');\n if (changeContent) {\n operation.find = this.extractTagContent(changeContent, 'find');\n operation.replace = this.extractTagContent(changeContent, 'replace');\n } else {\n // Direct find/replace without change wrapper\n operation.find = this.extractTagContent(content, 'find');\n operation.replace = this.extractTagContent(content, 'replace');\n }\n \n const applyContent = this.extractTagContent(content, 'apply');\n operation.apply = this.parseApplyValue(applyContent);\n\n // Validate the operation\n this.validateOperation(operation);\n\n return operation;\n }\n\n private extractTagContent(content: string, tagName: string): string | undefined {\n // Try different variations of the tag name\n const variations = TAG_VARIATIONS[tagName] || [tagName];\n\n for (const variation of variations) {\n // Try standard pattern first\n const standardPattern = new RegExp(`<${variation}\\\\s*>\\\\s*([\\\\s\\\\S]*?)\\\\s*<\\\\/${variation}>`, 'i');\n const standardMatch = content.match(standardPattern);\n if (standardMatch) {\n return standardMatch[1].trim();\n }\n\n // Try self-closing with attributes\n const selfClosingPattern = new RegExp(`<${variation}\\\\s+([^>]*?)\\\\s*\\\\/>`, 'i');\n const selfClosingMatch = content.match(selfClosingPattern);\n if (selfClosingMatch) {\n return this.extractAttributeValue(selfClosingMatch[1]);\n }\n\n // Try with attributes\n const attrPattern = new RegExp(`<${variation}\\\\s+([^>]*?)>([^<]*)<\\\\/${variation}>`, 'i');\n const attrMatch = content.match(attrPattern);\n if (attrMatch) {\n const attrValue = this.extractAttributeValue(attrMatch[1]);\n const textContent = attrMatch[2].trim();\n return attrValue || textContent;\n }\n }\n\n return undefined;\n }\n\n private extractAttributeValue(attributes: string): string | undefined {\n // Look for common attribute patterns: path=\"...\", value=\"...\", content=\"...\"\n const patterns = [\n /(?:path|value|content|src|href)\\s*=\\s*[\"']([^\"']*?)[\"']/i,\n /[\"']([^\"']*?)[\"']/ // Any quoted value\n ];\n\n for (const pattern of patterns) {\n const match = attributes.match(pattern);\n if (match) {\n return match[1];\n }\n }\n\n return attributes.trim();\n }\n\n private parseApplyValue(content: string | undefined): boolean {\n if (!content) return false;\n\n const normalized = content.toLowerCase().trim();\n return ['true', 'yes', '1', 'apply', 'execute', 'run'].includes(normalized);\n }\n\n private parseMalformedOperations(): void {\n // Look for individual tags that might be part of incomplete operations\n const tags = ['file', 'find', 'change', 'replace', 'apply'];\n\n for (const tag of tags) {\n const pattern = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)(?=<(?:${tags.join('|')})|$)`, 'gi');\n let match;\n\n while ((match = pattern.exec(this.content)) !== null) {\n // Check if this tag is already part of a complete operation\n const isPartOfComplete = this.operations.some(op =>\n op.raw && op.raw.includes(match[0])\n );\n\n if (!isPartOfComplete) {\n const operation: FileOperation = {\n type: 'file_operation',\n raw: match[0],\n isValid: false,\n errors: [`Incomplete operation: found ${tag} tag without complete operation sequence`],\n warnings: []\n };\n\n operation[tag] = match[1].trim();\n this.operations.push(operation);\n }\n }\n }\n }\n\n private validateOperation(operation: FileOperation): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check for required fields\n if (!operation.file) {\n errors.push('Missing file specification');\n }\n\n // Validate operation type\n const hasFind = !!operation.find;\n const hasChange = !!operation.change;\n const hasReplace = !!operation.replace;\n\n if (hasFind && hasReplace && !hasChange) {\n // Find and replace operation - valid\n } else if (hasChange && !hasFind && !hasReplace) {\n // Change operation - valid but might need more context\n warnings.push('Change operation without find/replace - ensure the change is clearly specified');\n } else if (hasFind && hasChange && hasReplace) {\n // All three - might be redundant\n warnings.push('Operation has find, change, and replace - this might be redundant');\n } else if (!hasFind && !hasChange && !hasReplace) {\n errors.push('No operation specified - need at least one of: find, change, or replace');\n }\n\n // Validate file path\n if (operation.file) {\n if (operation.file.includes('..')) {\n errors.push('File path contains \"..\" - potential security risk');\n }\n if (operation.file.startsWith('/')) {\n warnings.push('Absolute file path detected - ensure this is intended');\n }\n }\n\n // Check for potentially dangerous operations\n if (operation.find && operation.find.length > 10000) {\n warnings.push('Very large find content - this might cause performance issues');\n }\n if (operation.replace && operation.replace.length > 10000) {\n warnings.push('Very large replace content - this might cause performance issues');\n }\n\n operation.errors = errors;\n operation.warnings = warnings;\n operation.isValid = errors.length === 0;\n }\n\n private validateOperations(): void {\n // Cross-validate operations\n const fileOperations = new Map<string, FileOperation[]>();\n\n // Group operations by file\n for (const op of this.operations) {\n if (op.file) {\n if (!fileOperations.has(op.file)) {\n fileOperations.set(op.file, []);\n }\n fileOperations.get(op.file)!.push(op);\n }\n }\n\n // Check for conflicting operations on the same file\n for (const [file, ops] of fileOperations) {\n if (ops.length > 1) {\n for (const op of ops) {\n op.warnings.push(`Multiple operations detected for file: ${file}`);\n }\n }\n }\n }\n\n // Static method for quick detection\n static containsFileOperations(content: string): boolean {\n const quickPattern = /<apply>\\s*<file[^>]*>/i;\n return quickPattern.test(content);\n }\n\n // Static method for safe extraction\n static extractSafely(content: string): ParseResult {\n const parser = new FileOperationParser(content);\n return parser.parse();\n }\n}\n\n// Utility functions for the markdown renderer\nexport function detectFileOperationSyntax(content: string): boolean {\n return content.includes('<apply>') && content.includes('<file>');\n}\n\nexport function parseFileOperations(content: string): ParseResult {\n return FileOperationParser.extractSafely(content);\n}\n\n// Safety wrapper for rendering\nexport function renderFileOperationSafely(content: string): {\n shouldRender: boolean;\n operations: FileOperation[];\n safeContent: string;\n warnings: string[];\n} {\n if (!detectFileOperationSyntax(content)) {\n return {\n shouldRender: false,\n operations: [],\n safeContent: content,\n warnings: []\n };\n }\n\n const parseResult = parseFileOperations(content);\n const warnings: string[] = [];\n\n // Check for security concerns\n const hasSecurityRisks = parseResult.operations.some(op =>\n op.errors.some(error => error.includes('security risk'))\n );\n\n if (hasSecurityRisks) {\n warnings.push('Security risks detected in file operations');\n }\n\n // Create safe content by escaping potentially dangerous operations\n let safeContent = content;\n for (const op of parseResult.operations) {\n if (!op.isValid || op.errors.length > 0) {\n // Escape invalid operations\n safeContent = safeContent.replace(op.raw || '',\n `<!-- INVALID FILE OPERATION: ${op.errors.join(', ')} -->\\n\\`\\`\\`\\n${op.raw}\\n\\`\\`\\``\n );\n }\n }\n\n return {\n shouldRender: parseResult.hasValidOperations,\n operations: parseResult.operations,\n safeContent,\n warnings: [...parseResult.errors, ...warnings]\n };\n}\n","import React, { useState } from 'react';\nimport { Alert, Button, Card, Collapse, Space, Tag, Typography } from 'antd';\nimport {\n FileOutlined,\n SearchOutlined,\n EditOutlined,\n SwapOutlined,\n PlayCircleOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined\n} from '@ant-design/icons';\nimport { FileOperation, parseFileOperations } from '../utils/fileOperationParser';\nimport { useTheme } from '../context/ThemeContext';\n\nconst { Panel } = Collapse;\nconst { Text, Paragraph } = Typography;\n\ninterface FileOperationRendererProps {\n content: string;\n enableApply?: boolean;\n}\n\nexport const FileOperationRenderer: React.FC<FileOperationRendererProps> = ({\n content,\n enableApply = false\n}) => {\n const { isDarkMode } = useTheme();\n const [appliedOperations, setAppliedOperations] = useState<Set<string>>(new Set());\n\n const parseResult = parseFileOperations(content);\n\n if (!parseResult.hasValidOperations) {\n return (\n <Alert\n type=\"warning\"\n message=\"Invalid File Operations Detected\"\n description={\n <div>\n <p>The content contains file operation syntax but has errors:</p>\n <ul>\n {parseResult.errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n }\n showIcon\n />\n );\n }\n\n const handleApplyOperation = async (operation: FileOperation) => {\n if (!operation.file || !enableApply) return;\n\n try {\n // Convert to diff format for the existing apply-changes API\n const diffContent = createDiffFromOperation(operation);\n\n const response = await fetch('/api/apply-changes', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n diff: diffContent,\n filePath: operation.file\n }),\n });\n\n if (response.ok) {\n setAppliedOperations(prev => new Set([...prev, operation.raw || '']));\n }\n } catch (error) {\n console.error('Error applying file operation:', error);\n }\n };\n\n const createDiffFromOperation = (operation: FileOperation): string => {\n // Convert file operation to unified diff format\n if (operation.find && operation.replace) {\n return `--- a/${operation.file}\n+++ b/${operation.file}\n@@ -1,1 +1,1 @@\n-${operation.find}\n+${operation.replace}`;\n }\n\n if (operation.change) {\n return `--- a/${operation.file}\n+++ b/${operation.file}\n@@ -1,1 +1,1 @@\n+${operation.change}`;\n }\n\n return '';\n };\n\n const getOperationIcon = (operation: FileOperation) => {\n if (operation.find && operation.replace) return <SwapOutlined />;\n if (operation.find) return <SearchOutlined />;\n if (operation.change) return <EditOutlined />;\n return <FileOutlined />;\n };\n\n const getOperationTitle = (operation: FileOperation) => {\n if (operation.find && operation.replace) return 'Find & Replace';\n if (operation.find) return 'Find';\n if (operation.change) return 'Change';\n return 'File Operation';\n };\n\n const renderOperation = (operation: FileOperation, index: number) => {\n const isApplied = appliedOperations.has(operation.raw || '');\n\n return (\n <Card\n key={index}\n size=\"small\"\n title={\n <Space>\n {getOperationIcon(operation)}\n <Text strong>{getOperationTitle(operation)}</Text>\n {operation.file && <Tag color=\"blue\">{operation.file}</Tag>}\n {operation.isValid ? (\n <CheckCircleOutlined style={{ color: '#52c41a' }} />\n ) : (\n <CloseCircleOutlined style={{ color: '#ff4d4f' }} />\n )}\n </Space>\n }\n extra={\n enableApply && operation.isValid && !isApplied && (\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleApplyOperation(operation)}\n >\n Apply\n </Button>\n )\n }\n style={{ marginBottom: 16 }}\n >\n {/* Operation Details */}\n <Collapse ghost>\n <Panel header=\"Operation Details\" key=\"details\">\n {operation.find && (\n <div style={{ marginBottom: 8 }}>\n <Text strong>Find:</Text>\n <Paragraph\n code\n copyable\n style={{\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n padding: 8,\n marginTop: 4\n }}\n >\n {operation.find}\n </Paragraph>\n </div>\n )}\n\n {operation.replace && (\n <div style={{ marginBottom: 8 }}>\n <Text strong>Replace:</Text>\n <Paragraph\n code\n copyable\n style={{\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n padding: 8,\n marginTop: 4\n }}\n >\n {operation.replace}\n </Paragraph>\n </div>\n )}\n\n {operation.change && (\n <div style={{ marginBottom: 8 }}>\n <Text strong>Change:</Text>\n <Paragraph\n code\n copyable\n style={{\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n padding: 8,\n marginTop: 4\n }}\n >\n {operation.change}\n </Paragraph>\n </div>\n )}\n </Panel>\n </Collapse>\n\n {/* Warnings and Errors */}\n {operation.warnings.length > 0 && (\n <Alert\n type=\"warning\"\n message=\"Warnings\"\n description={\n <ul>\n {operation.warnings.map((warning, i) => (\n <li key={i}>{warning}</li>\n ))}\n </ul>\n }\n showIcon\n style={{ marginTop: 8 }}\n />\n )}\n\n {operation.errors.length > 0 && (\n <Alert\n type=\"error\"\n message=\"Errors\"\n description={\n <ul>\n {operation.errors.map((error, i) => (\n <li key={i}>{error}</li>\n ))}\n </ul>\n }\n showIcon\n style={{ marginTop: 8 }}\n />\n )}\n\n {isApplied && (\n <Alert\n type=\"success\"\n message=\"Operation Applied\"\n showIcon\n style={{ marginTop: 8 }}\n />\n )}\n </Card>\n );\n };\n\n return (\n <div className=\"file-operation-renderer\">\n <Alert\n type=\"info\"\n message={`Found ${parseResult.totalOperations} file operation(s)`}\n style={{ marginBottom: 16 }}\n showIcon\n />\n\n {parseResult.operations.map(renderOperation)}\n\n {parseResult.errors.length > 0 && (\n <Alert\n type=\"error\"\n message=\"Parser Errors\"\n description={\n <ul>\n {parseResult.errors.map((error, i) => (\n <li key={i}>{error}</li>\n ))}\n </ul>\n }\n showIcon\n />\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, memo, useMemo, useCallback, useRef, useId } from 'react';\nimport 'prismjs/themes/prism.css';\nimport { marked, Tokens } from 'marked';\nimport { Alert, Button, message, Tooltip } from 'antd';\nimport { parseDiff, tokenize } from 'react-diff-view';\nimport 'react-diff-view/style/index.css';\nimport { DiffLine } from './DiffLine';\nimport 'prismjs/themes/prism-tomorrow.css'; // Add dark theme support\nimport { D3Renderer } from './D3Renderer';\nimport { useChatContext } from '../context/ChatContext';\nimport { parseToolCall, formatToolCallForDisplay } from '../utils/toolCallParser';\nimport { parseThinkingContent, removeThinkingTags } from '../utils/thinkingParser';\nimport { useFolderContext } from '../context/FolderContext';\nimport {\n SplitCellsOutlined, NumberOutlined, EyeOutlined, FileTextOutlined,\n CheckCircleOutlined, CloseCircleOutlined, CheckOutlined\n} from '@ant-design/icons';\nimport 'prismjs/themes/prism.css';\nimport { loadPrismLanguage } from '../utils/prismLoader';\nimport { useTheme } from '../context/ThemeContext';\nimport type * as PrismType from 'prismjs';\nimport { detectFileOperationSyntax, renderFileOperationSafely } from '../utils/fileOperationParser';\nimport { FileOperationRenderer } from './FileOperationRenderer';\nimport { isDebugLoggingEnabled, debugLog } from '../utils/logUtils';\nimport 'katex/dist/katex.min.css';\nimport { restartStreamWithEnhancedContext } from '../apis/chatApi';\n\n// Thinking component for DeepSeek reasoning content\nconst ThinkingBlock: React.FC<{ children: React.ReactNode; isDarkMode: boolean; isStreaming?: boolean }> = ({ children, isDarkMode, isStreaming = false }) => {\n // Start expanded during streaming, collapsed when done\n const [isExpanded, setIsExpanded] = useState(isStreaming);\n const thinkingRenderedRef = useRef(false);\n\n return (\n <div className={`thinking-block ${isDarkMode ? 'dark' : 'light'}`} style={{\n border: `1px solid ${isDarkMode ? '#444' : '#ddd'}`,\n borderRadius: '8px',\n margin: '12px 0',\n backgroundColor: isDarkMode ? '#1a1a1a' : '#f8f9fa'\n }}>\n <div\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n padding: '8px 12px',\n cursor: 'pointer',\n borderBottom: isExpanded ? `1px solid ${isDarkMode ? '#444' : '#ddd'}` : 'none',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: isDarkMode ? '#888' : '#666'\n }}\n >\n <span>{isExpanded ? '▼' : '▶'}</span>\n <span>🤔 Thinking...</span>\n </div>\n {isExpanded && (\n <div style={{\n padding: '12px',\n fontSize: '13px',\n fontFamily: 'monospace',\n color: isDarkMode ? '#ccc' : '#555',\n whiteSpace: 'pre-wrap'\n }}>\n {children}\n </div>\n )}\n </div>\n );\n};\n\n// Define the status interface\ninterface HunkStatus {\n applied: boolean;\n alreadyApplied?: boolean;\n reason: string;\n}\n\n// Define the status type returned from the API\ninterface ApiHunkStatus {\n status: 'succeeded' | 'failed' | 'already_applied';\n stage?: string;\n error_details?: any;\n}\n\n// Create a global event bus for hunk status updates\nconst hunkStatusEventBus = new EventTarget();\nconst HUNK_STATUS_EVENT = 'hunkStatusUpdate';\n// Add a global set to track processed window events\nconst processedWindowEvents = new Set<string>();\n\n// Add a map to track which request ID corresponds to which diff element\nconst diffRequestMap = new Map<string, string>();\n\ninterface ApplyChangesButtonProps {\n diff: string;\n filePath: string;\n fileIndex: number;\n diffElementId: string;\n enabled: boolean;\n isStreaming?: boolean;\n setHunkStatuses?: (updater: (prev: Map<string, HunkStatus>) => Map<string, HunkStatus>) => void;\n}\n\ninterface ToolBlockProps {\n toolName: string;\n content: string;\n isDarkMode: boolean;\n}\n\nconst ToolBlock: React.FC<ToolBlockProps> = ({ toolName, content, isDarkMode }) => {\n // Check if this is a security error from shell command blocking\n let isSecurityError = content.includes('🚫 SECURITY BLOCK') ||\n content.includes('Command not allowed') ||\n content.includes('COMMAND BLOCKED');\n\n let securityErrorMessage = content;\n\n // Check if content is a JSON error object from MCP server\n if (content.includes(\"'error': True\") && content.includes('SECURITY BLOCK')) {\n try {\n // Extract the message from the JSON-like string\n const messageMatch = content.match(/'message': \"([^\"]+)\"/);\n if (messageMatch) {\n let message = messageMatch[1].replace(/\\\\n/g, '\\n');\n // Remove the redundant \"🚫 SECURITY BLOCK:\" prefix since we show it in the title\n message = message.replace(/^🚫 SECURITY BLOCK:\\s*/, '');\n securityErrorMessage = message;\n isSecurityError = true;\n }\n } catch (e) {\n // If parsing fails, use original content\n }\n }\n\n // Check if this is an MCP tool error\n const isMCPError = content.includes('MCP Tool Error') ||\n content.includes('MCP Resource Error');\n\n // If this is a security error, render it with special styling\n if (isSecurityError) {\n return (\n <Alert\n message=\"🚫 Command Blocked\"\n description={securityErrorMessage}\n type=\"warning\"\n showIcon\n style={{ margin: '16px 0', border: '2px solid #faad14', whiteSpace: 'pre-line' }}\n />\n );\n }\n\n if (isMCPError) {\n return (\n <Alert\n message=\"MCP External Error\"\n description={content}\n />\n );\n }\n\n const isShellCommand = toolName === 'mcp_run_shell_command';\n\n // Clean up content by removing any literal tool markers\n const cleanContent = content\n .replace(/^```tool:mcp_\\w+\\s*\\n?/gm, '')\n .replace(/\\n?```\\s*$/gm, '')\n .replace(/^```tool:mcp_\\w+\\s*/gm, '')\n .replace(/```$/gm, '')\n .trim();\n\n // Color scheme based on tool type\n const getToolColors = () => {\n if (isShellCommand) {\n return {\n bg: isDarkMode ? '#0f1419' : '#f8f9fa',\n border: isDarkMode ? '#1e2328' : '#e9ecef',\n headerBg: isDarkMode ? '#1e2328' : '#e9ecef',\n headerText: isDarkMode ? '#7dd3fc' : '#0369a1',\n contentText: isDarkMode ? '#e2e8f0' : '#1e293b'\n };\n } else {\n return {\n bg: isDarkMode ? '#1a1a2e' : '#f0f4f8',\n border: isDarkMode ? '#2d2d44' : '#cbd5e0',\n headerBg: isDarkMode ? '#2d2d44' : '#cbd5e0',\n headerText: isDarkMode ? '#a78bfa' : '#6b46c1',\n contentText: isDarkMode ? '#e2e8f0' : '#1e293b'\n };\n }\n };\n\n const colors = getToolColors();\n\n return (\n <div style={{\n backgroundColor: colors.bg,\n border: `2px solid ${colors.border}`,\n borderRadius: '12px',\n margin: '16px 0',\n overflow: 'hidden',\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", monospace',\n fontSize: '14px',\n boxShadow: isDarkMode\n ? '0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2)'\n : '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)'\n }}>\n <div style={{\n backgroundColor: colors.headerBg,\n padding: '8px 16px',\n borderBottom: `1px solid ${colors.border}`,\n color: colors.headerText,\n fontWeight: 'bold',\n fontSize: '12px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px'\n }}>\n {isShellCommand ? '🔧 Shell Command' : `🛠️ ${toolName.replace('mcp_', '')}`}\n </div>\n <pre style={{\n margin: 0,\n padding: '16px',\n color: colors.contentText,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word'\n }}>\n {cleanContent}\n </pre>\n </div>\n );\n};\n\n\nexport type RenderPath = 'full' | 'prismOnly' | 'diffOnly' | 'raw';\n\n// Define the Change types to match react-diff-view's internal types\ntype ChangeType = 'normal' | 'insert' | 'delete';\n\ninterface BaseChange {\n content: string;\n type: ChangeType;\n isInsert?: boolean;\n isDelete?: boolean;\n isNormal?: boolean;\n lineNumber?: number;\n oldLineNumber?: number;\n newLineNumber?: number;\n}\n\n// Define our own Hunk interface to match react-diff-view's structure\ninterface BaseHunk {\n content: string;\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n changes: BaseChange[];\n isPlain?: boolean;\n oldLineNumber?: number;\n newLineNumber?: number;\n}\n\n// Define our extended hunk type that includes status\ninterface ExtendedHunk extends BaseHunk {\n status?: HunkStatus;\n}\n\ninterface BaseToken {\n type: string;\n raw?: string;\n}\n\ninterface TokenWithText extends BaseToken {\n text: string;\n lang?: string;\n tokens?: TokenWithText[];\n task?: boolean;\n checked?: boolean;\n toolName?: string;\n}\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n type?: 'graphviz' | 'code';\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\ndeclare global {\n interface Window {\n Prism: typeof PrismType;\n diffElementPaths?: Map<string, string>;\n diffViewType?: 'unified' | 'split';\n diffShowLineNumbers?: boolean;\n diffDisplayMode?: 'raw' | 'pretty';\n hunkStatusRegistry: Map<string, Map<string, HunkStatus>>;\n }\n}\n\ntype ErrorType = 'graphviz' | 'code' | 'unknown';\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState> {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n componentDidCatch(error, errorInfo) {\n const errorType: ErrorType = this.props.type || 'unknown';\n console.error(`${errorType} rendering error:`, error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.type === 'graphviz') {\n return this.props.fallback || (\n <div>Something went wrong rendering the diagram.</div>\n );\n }\n if (this.props.type === 'code') {\n return this.props.fallback || (\n <pre><code>Error rendering code block</code></pre>\n );\n }\n return (\n <div>Something went wrong rendering the diagram.</div>\n );\n }\n\n return this.props.children;\n }\n}\n\nexport const DisplayModes = ['raw', 'pretty'] as const;\nexport type DisplayMode = typeof DisplayModes[number];\nexport interface DiffViewProps {\n diff: string;\n viewType: 'split' | 'unified';\n initialDisplayMode: DisplayMode;\n showLineNumbers: boolean;\n fileIndex?: number;\n elementId: string;\n forceRender?: boolean;\n}\n\ninterface DiffControlsProps {\n displayMode: 'raw' | 'pretty';\n viewType: 'split' | 'unified';\n showLineNumbers: boolean;\n onDisplayModeChange: (mode: 'raw' | 'pretty') => void;\n onViewTypeChange: (type: 'split' | 'unified') => void;\n onLineNumbersChange: (show: boolean) => void;\n fileTitle?: string;\n}\n\nconst DiffControls = memo(({\n displayMode,\n viewType,\n showLineNumbers,\n fileTitle,\n onDisplayModeChange,\n onViewTypeChange,\n onLineNumbersChange\n}: DiffControlsProps) => {\n const { isDarkMode } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n\n const handleDisplayModeChange = (value: any) => {\n const newMode = value as DisplayMode;\n onDisplayModeChange(newMode);\n };\n\n return (\n <div\n className=\"diff-view-controls\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n backgroundColor: isDarkMode ? '#1f1f1f' : '#fafafa',\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'center',\n width: '100%',\n padding: '4px 8px',\n gap: '8px',\n borderBottom: `1px solid ${isDarkMode ? '#303030' : '#e8e8e8'}`,\n opacity: isHovered ? 1 : 0.7,\n transition: 'opacity 0.3s ease',\n zIndex: 10\n }}>\n <div style={{\n flex: 1,\n textAlign: 'left',\n fontWeight: 'bold',\n fontSize: '14px',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}>{fileTitle}</div>\n {displayMode === 'pretty' && (\n <>\n <Tooltip title={showLineNumbers ? \"Hide Line Numbers\" : \"Show Line Numbers\"}>\n <Button\n type={showLineNumbers ? \"primary\" : \"default\"}\n size=\"small\"\n icon={<NumberOutlined />}\n onClick={() => onLineNumbersChange(!showLineNumbers)}\n style={{\n padding: '0 8px',\n minWidth: '32px',\n height: '24px'\n }}\n />\n </Tooltip>\n </>\n )}\n {/* Unified/Split view toggle button - only show in pretty mode */}\n {displayMode === 'pretty' && (\n <Tooltip title={viewType === 'unified' ? \"Split View\" : \"Unified View\"}>\n <Button\n type={viewType === 'split' ? \"primary\" : \"default\"}\n size=\"small\"\n icon={<SplitCellsOutlined />}\n onClick={() => {\n const newViewType = viewType === 'unified' ? 'split' : 'unified';\n window.diffViewType = newViewType;\n onViewTypeChange(newViewType);\n }}\n style={{\n padding: '0 8px',\n minWidth: '32px',\n height: '24px',\n marginRight: '8px'\n }}\n />\n </Tooltip>\n )}\n <Tooltip title={displayMode === 'raw' ? \"Switch to Pretty View\" : \"Switch to Raw View\"}>\n <Button\n type=\"default\"\n size=\"small\"\n icon={displayMode === 'raw' ? <EyeOutlined /> : <FileTextOutlined />}\n onClick={() => {\n const newMode = displayMode === 'pretty' ? 'raw' : 'pretty';\n window.diffDisplayMode = newMode;\n handleDisplayModeChange(newMode);\n }}\n style={{\n padding: '0 8px',\n minWidth: '32px',\n height: '24px'\n }}\n />\n </Tooltip>\n </div>\n );\n});\n\n// Helper function to extract all file paths from a diff\nconst extractAllFilesFromDiff = (diffContent: string): string[] => {\n const files: string[] = [];\n const lines = diffContent.split('\\n');\n\n for (const line of lines) {\n // Extract from git diff headers\n const gitMatch = line.match(/diff --git a\\/(.*?) b\\/(.*?)$/);\n if (gitMatch) {\n const newPath = gitMatch[2];\n const oldPath = gitMatch[1];\n if (newPath !== '/dev/null') files.push(newPath);\n if (oldPath !== '/dev/null' && oldPath !== newPath) files.push(oldPath);\n }\n\n // Extract from unified diff headers as backup\n const minusMatch = line.match(/^--- a\\/(.+)$/);\n if (minusMatch && !minusMatch[1].includes('/dev/null')) {\n files.push(minusMatch[1]);\n }\n\n const plusMatch = line.match(/^\\+\\+\\+ b\\/(.+)$/);\n if (plusMatch && !plusMatch[1].includes('/dev/null')) {\n files.push(plusMatch[1]);\n }\n }\n\n return [...new Set(files)]; // Remove duplicates\n};\n\n// Function to check if files are in current context - do this locally!\nconst checkFilesInContext = (filePaths: string[], currentFiles: string[] = []): { missingFiles: string[], availableFiles: string[] } => {\n const missingFiles: string[] = [];\n const availableFiles: string[] = [];\n \n for (const filePath of filePaths) {\n // Clean up the file path (remove a/ or b/ prefixes from git diffs)\n let cleanPath = filePath.trim();\n if (cleanPath.startsWith('a/') || cleanPath.startsWith('b/')) {\n cleanPath = cleanPath.substring(2);\n }\n \n // Check if the file is in the current selected context\n const isInContext = currentFiles.some(currentFile => \n currentFile === cleanPath || \n cleanPath.startsWith(currentFile + '/') ||\n (currentFile.endsWith('/') && cleanPath.startsWith(currentFile))\n );\n \n if (isInContext) {\n availableFiles.push(cleanPath);\n } else {\n missingFiles.push(cleanPath);\n }\n }\n \n console.log('🔄 CONTEXT_ENHANCEMENT: Local check result:', { filePaths, currentFiles: currentFiles.slice(0, 5), missingFiles, availableFiles });\n return { missingFiles, availableFiles };\n};\n\nDiffControls.displayName = 'DiffControls';\n\nconst extractSingleFileDiff = (fullDiff: string, filePath: string): string => {\n // If the diff doesn't contain multiple files, return it as is\n if (!fullDiff.includes(\"diff --git\") || fullDiff.indexOf(\"diff --git\") === fullDiff.lastIndexOf(\"diff --git\")) {\n return fullDiff;\n }\n\n try {\n // Split the diff into sections by diff --git headers\n const lines: string[] = fullDiff.split('\\n');\n const result: string[] = [];\n\n // Clean up file path for matching\n const cleanFilePath = filePath.replace(/^[ab]\\//, '');\n\n let inTargetFile = false;\n let collectingHunk = false;\n let currentHunkHeader: string | null = null;\n let currentHunkContent: string[] = [];\n\n // Process each line\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const nextLine = i < lines.length - 1 ? lines[i + 1] : '';\n\n // Check for file header\n if (line.startsWith('diff --git')) {\n // If we were collecting a hunk, add it to the result\n if (collectingHunk && inTargetFile && currentHunkHeader !== null) {\n result.push(currentHunkHeader);\n result.push(...currentHunkContent);\n }\n\n // Reset state for new file\n collectingHunk = false;\n currentHunkHeader = null;\n currentHunkContent = [];\n inTargetFile = false;\n\n // Check if this is our target file\n const fileMatch = line.match(/diff --git a\\/(.*?) b\\/(.*?)$/);\n if (fileMatch) {\n const oldPath = fileMatch[1];\n const newPath = fileMatch[2];\n\n // Check if this file matches our target by exact path\n if (oldPath === cleanFilePath || newPath === cleanFilePath ||\n oldPath.endsWith(`/${cleanFilePath}`) || newPath.endsWith(`/${cleanFilePath}`)) {\n inTargetFile = true;\n result.push(line);\n\n // Also check the next line for index info\n if (nextLine.startsWith('index ')) {\n result.push(nextLine);\n i++; // Skip this line in the next iteration\n }\n } else {\n inTargetFile = false;\n\n // Log for debugging\n console.debug(`Skipping file: old=${oldPath}, new=${newPath}, target=${cleanFilePath}`);\n }\n }\n }\n // If we're in the target file, collect all headers and content\n else if (inTargetFile) {\n // File headers (index, ---, +++)\n if (line.startsWith('index ') || line.startsWith('--- ') || line.startsWith('+++ ')) {\n result.push(line);\n }\n // Hunk header\n else if (line.startsWith('@@ ')) {\n // If we were collecting a previous hunk, add it to the result\n if (collectingHunk && currentHunkHeader !== null) {\n result.push(currentHunkHeader);\n result.push(...currentHunkContent);\n }\n\n // Start collecting a new hunk\n collectingHunk = true;\n currentHunkHeader = line;\n currentHunkContent = [];\n }\n // Hunk content (context, additions, deletions)\n else if (collectingHunk && (line.startsWith(' ') || line.startsWith('+') || line.startsWith('-') || line.startsWith('\\\\'))) {\n currentHunkContent.push(line);\n }\n // Empty lines within a hunk\n else if (collectingHunk && line.trim() === '') {\n currentHunkContent.push(line);\n }\n }\n }\n\n // Log the extraction results\n console.debug(`Extracted diff for ${filePath}:`, {\n targetFileFound: inTargetFile || result.length > 0,\n extractedLines: result.length\n });\n // Add the last hunk if we were collecting one\n if (collectingHunk && inTargetFile && currentHunkHeader !== null) {\n result.push(currentHunkHeader!);\n result.push(...currentHunkContent);\n }\n\n // If we found our target file, return the extracted diff\n if (result.length > 0) {\n return result.join('\\n').trim();\n }\n\n // If we didn't find the target file, return the original diff\n console.warn(`Could not find file ${cleanFilePath} in the diff`);\n return fullDiff;\n\n } catch (error) {\n console.error(\"Error extracting single file diff:\", error);\n return fullDiff.trim(); // Return the full diff as a fallback\n }\n};\n\n// Helper function to fix Haiku-style diffs that are missing unified diff headers\nconst fixHaikuStyleDiff = (diff: string): string => {\n const lines = diff.split('\\n');\n const result: string[] = [];\n\n // Extract file path from git header\n const gitHeaderMatch = lines[0].match(/diff --git a\\/(.*?) b\\/(.*?)$/);\n if (!gitHeaderMatch) {\n return diff; // Can't fix without git header\n }\n\n const filePath = gitHeaderMatch[2] || gitHeaderMatch[1];\n\n // Add git header\n result.push(lines[0]);\n\n // Add missing unified diff headers\n result.push(`--- a/${filePath}`);\n result.push(`+++ b/${filePath}`);\n\n // Process the rest of the lines\n let i = 1;\n while (i < lines.length) {\n const line = lines[i];\n\n // Skip any existing headers that might be malformed\n if (line.startsWith('---') || line.startsWith('+++') || line.startsWith('index ')) {\n i++;\n continue;\n }\n\n // Handle hunk headers - fix incomplete ones\n if (line.startsWith('@@')) {\n // Check if this is a Haiku-style incomplete hunk header\n const hunkMatch = line.match(/^@@\\s+-(\\d+),(\\d+)\\s+\\+(\\d+),(\\d+)\\s+@@(.*)$/);\n if (hunkMatch) {\n result.push(line);\n } else {\n // Try to fix malformed hunk headers\n const partialMatch = line.match(/^@@\\s+-(\\d+),?\\s*(\\d*)\\s+\\+?(\\d+),?\\s*(\\d*)\\s*@@?(.*)$/);\n if (partialMatch) {\n const [, oldStart, oldCount, newStart, newCount, context] = partialMatch;\n const fixedLine = `@@ -${oldStart},${oldCount || '1'} +${newStart},${newCount || '1'} @@${context || ''}`;\n result.push(fixedLine);\n } else {\n result.push(line);\n }\n }\n } else {\n // Regular content line - preserve as is\n result.push(line);\n }\n\n i++;\n }\n\n const fixedDiff = result.join('\\n');\n console.log('🔧 Fixed Haiku-style diff:', fixedDiff.substring(0, 200) + '...');\n return fixedDiff;\n};\n\n// Helper function to check if this is a deletion diff\nconst isDeletionDiff = (content: string) => {\n return content.includes('diff --git') &&\n content.includes('/dev/null') &&\n content.includes('deleted file mode') &&\n content.includes('--- a/') &&\n content.includes('+++ /dev/null');\n};\n\nconst normalizeGitDiff = (diff: string): string => {\n // because LLMs tend to ignore instructions and get lazy\n if (diff.startsWith('diff --git') || diff.match(/^---\\s+\\S+/m) || diff.includes('/dev/null') ||\n diff.match(/^@@\\s+-\\d+/m)) {\n const lines: string[] = diff.split('\\n');\n const normalizedLines: string[] = [];\n\n // Check if this is a properly formatted diff\n const hasDiffHeaders = lines.some(line =>\n (line.startsWith('---') || line.startsWith('+++'))\n ) && (\n lines.some(line => line.startsWith('--- a/') || line.startsWith('+++ b/')) ||\n lines.some(line => line.startsWith('--- /dev/null')) // Support new file diffs\n );\n const hasHunkHeader = lines.some(line =>\n /^@@\\s+-\\d+,?\\d*\\s+\\+\\d+,?\\d*\\s+@@/.test(line) ||\n /^@@\\s+-\\d+,\\d+\\s+\\+\\d+,\\d+\\s+@@/.test(line) ||\n /^@@\\s+-\\d+,\\d+\\s+@@/.test(line)\n );\n\n // Check for Haiku-style diffs that have git headers but missing unified diff headers\n const hasGitHeader = lines.some(line => line.startsWith('diff --git'));\n const hasHunkHeaders = lines.some(line => line.startsWith('@@'));\n\n if ((hasDiffHeaders && hasHunkHeader) || (hasGitHeader && hasHunkHeaders && !hasDiffHeaders)) {\n // Handle Haiku-style diffs that are missing unified diff headers\n if (hasGitHeader && hasHunkHeaders && !hasDiffHeaders) {\n return fixHaikuStyleDiff(diff);\n }\n return diff; // Return original diff if it's properly formatted\n }\n\n // Extract file path from unified diff headers if present\n let filePath = '';\n for (const line of lines) {\n const unifiedMatch = line.match(/^(?:---|\\+\\+\\+)\\s+(?:[ab]\\/)?(.+)$/);\n if (unifiedMatch) {\n filePath = unifiedMatch[1];\n break;\n }\n }\n\n // If no path found from unified headers, try git diff header\n if (!filePath) {\n const gitMatch = lines[0].match(/diff --git a\\/(.*?) b\\/(.*?)$/);\n if (gitMatch && gitMatch[1]) {\n filePath = gitMatch[1];\n }\n }\n\n if (!filePath) {\n return diff; // Return original if we can't parse the git diff line\n }\n\n // If we have a diff --git line but missing proper headers, add them\n if (!hasDiffHeaders) {\n // Insert headers after the diff --git line\n lines.splice(1, 0,\n `--- a/${filePath}`,\n `+++ b/${filePath}`\n );\n }\n\n let addCount = 0;\n let removeCount = 0;\n let contextCount = 0;\n\n // Always keep the diff --git line\n normalizedLines.push(lines[0]);\n\n // Count lines and collect content\n const contentLines = lines.slice(1).filter(line => {\n if (line.startsWith('diff --git') || line.startsWith('index ')) {\n return false;\n }\n if (line.startsWith('---') || line.startsWith('+++')) {\n return false;\n }\n if (line.startsWith('@@')) {\n // Normalize hunk headers with leading zeros or incomplete format\n const normalizedHunk = line.replace(/^@@\\s+-0*(\\d+),?(\\d*)\\s+\\+?0*(\\d+),?(\\d*)\\s*@@?.*$/,\n (match, oldStart, oldCount, newStart, newCount) => {\n const oldLines = oldCount || '1';\n const newLines = newCount || '1';\n return `@@ -${oldStart},${oldLines} +${newStart},${newLines} @@`;\n });\n return normalizedHunk !== line; // Only include if we normalized it\n }\n if (line.startsWith('---') || line.startsWith('+++')) {\n return false;\n }\n if (line.startsWith('@@')) {\n // Keep hunk headers\n return true;\n }\n // Check for +/- anywhere in the leading whitespace\n const trimmed = line.trimStart();\n if (trimmed.startsWith('+')) {\n addCount++;\n return true;\n }\n if (trimmed.startsWith('-')) {\n removeCount++;\n return true;\n }\n // Handle case where +/- might be preceded by spaces\n const indentMatch = line.match(/^[\\s]*([-+])/);\n if (indentMatch) {\n if (indentMatch[1] === '+') addCount++;\n if (indentMatch[1] === '-') removeCount++;\n return true;\n }\n if (line.trim().length > 0) {\n contextCount++;\n return true;\n }\n if (line.trim().length === 0) {\n contextCount++;\n return true;\n }\n return false;\n });\n\n // Find and normalize any hunk headers in the content\n const normalizedContentLines = contentLines.map(line => {\n if (line.startsWith('@@')) {\n return line.replace(/^@@\\s+-0*(\\d+),?(\\d*)\\s+\\+?0*(\\d+),?(\\d*)\\s*@@?.*$/,\n (match, oldStart, oldCount, newStart, newCount) => {\n const oldLines = oldCount || '1';\n const newLines = newCount || '1';\n return `@@ -${oldStart},${oldLines} +${newStart},${newLines} @@`;\n });\n }\n return line;\n });\n\n // Add hunk header\n const existingHunkHeaders = normalizedContentLines.filter(line => line.startsWith('@@'));\n if (existingHunkHeaders.length > 0) {\n normalizedLines.push(...existingHunkHeaders);\n } else {\n normalizedLines.push(`@@ -1,${removeCount + contextCount} +1,${addCount + contextCount} @@`);\n }\n\n // Add content lines, preserving +/- and adding spaces for context\n normalizedContentLines.filter(line => !line.startsWith('@@')).forEach(line => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('+') || trimmed.startsWith('-')) {\n // For indented +/- lines, preserve only the content indentation\n const marker = trimmed[0];\n const content = trimmed.slice(1);\n normalizedLines.push(`${marker}${content}`);\n } else {\n // Handle case where +/- might be preceded by spaces\n const indentMatch = line.match(/^[\\s]*([-+])(.*)/);\n if (indentMatch) {\n normalizedLines.push(`${indentMatch[1]}${indentMatch[2]}`);\n } else {\n normalizedLines.push(` ${line.trim()}`);\n }\n }\n });\n\n return normalizedLines.join('\\n');\n }\n return diff;\n};\n\nconst DiffView: React.FC<DiffViewProps> = ({ diff, viewType, initialDisplayMode, showLineNumbers, elementId, fileIndex }) => {\n const [isLoading, setIsLoading] = useState(true);\n const [tokenizedHunks, setTokenizedHunks] = useState<any>(null);\n const { isDarkMode } = useTheme();\n const parsedFilesRef = useRef<any[]>([]);\n const [parseError, setParseError] = useState<boolean>(false);\n const lastValidDiffRef = useRef<string | null>(null);\n const { isStreaming: isGlobalStreaming } = useChatContext();\n const [instanceHunkStatusMap, setInstanceHunkStatusMap] = useState<Map<string, HunkStatus>>(new Map());\n const [statusUpdateCounter, setStatusUpdateCounter] = useState<number>(0);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [displayMode, setDisplayMode] = useState<DisplayMode>(window.diffDisplayMode || 'pretty'); // Use window setting\n const diffRef = useRef<string>(diff);\n const forceRenderRef = useRef<boolean>(false);\n\n // Use a stable ID that doesn't change on re-renders\n const diffId = useRef<string>(elementId || `diff-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`).current;\n\n // Flag to prevent rendering during streaming\n const isStreamingRef = useRef<boolean>(false);\n // Store the diff in a ref to avoid unnecessary re-renders\n useEffect(() => {\n diffRef.current = diff;\n }, [diff]);\n\n // Force render during streaming\n useEffect(() => {\n forceRenderRef.current = isGlobalStreaming;\n return () => { forceRenderRef.current = false; };\n }, [isGlobalStreaming]);\n\n // Initialize global registry if needed\n useEffect(() => {\n // Initialize the global registry if it doesn't exist\n window.diffElementPaths = window.diffElementPaths || new Map();\n window.hunkStatusRegistry = window.hunkStatusRegistry || new Map();\n\n }, []);\n\n // Listen for hunk status updates\n useEffect(() => {\n const handleStatusUpdate = (event: Event) => {\n if (!isStreamingRef.current) {\n console.log(\"DiffView received hunk status update event\");\n setStatusUpdateCounter(prev => prev + 1);\n }\n };\n hunkStatusEventBus.addEventListener(HUNK_STATUS_EVENT, handleStatusUpdate);\n\n return () => {\n hunkStatusEventBus.removeEventListener(HUNK_STATUS_EVENT, handleStatusUpdate);\n };\n }, []);\n\n // Function to update hunk statuses from API response\n const updateHunkStatuses = useCallback((hunkStatuses: Record<string, any>, targetDiffId: string = diffId, force: boolean = false) => {\n if (!hunkStatuses) return;\n if (!diff) return;\n console.log(`Updating hunk statuses for ${targetDiffId} (we are ${diffId})`, hunkStatuses);\n\n try {\n const files = parseDiff(diff);\n files.forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n // Create a key for this hunk\n const hunkKey = `0-${hunkIndex}`;\n\n // Get the hunk ID (1-based)\n const hunkId = hunkIndex + 1;\n\n // Check if we have status for this hunk\n if (hunkStatuses[hunkId]) {\n const status = hunkStatuses[hunkId];\n console.log(`Updating status for hunk #${hunkId}:`, status);\n // Update the status in our local map\n setInstanceHunkStatusMap(prev => {\n const newMap = new Map(prev);\n\n // Also update the global registry\n if (!window.hunkStatusRegistry.has(diffId)) {\n window.hunkStatusRegistry.set(diffId, new Map());\n }\n const registryMap = window.hunkStatusRegistry.get(diffId);\n if (registryMap) {\n registryMap.set(hunkKey, newMap.get(hunkKey) as HunkStatus);\n\n // Only trigger re-render if not streaming or if forced\n if (!isStreamingRef.current || force) setStatusUpdateCounter(prev => prev + 1);\n }\n\n newMap.set(hunkKey, {\n applied: status.status === 'succeeded' || status.status === 'already_applied',\n alreadyApplied: status.status === 'already_applied',\n reason: status.status === 'failed'\n ? 'Failed in ' + status.stage + ' stage'\n : status.status === 'already_applied'\n ? 'Already applied'\n : 'Successfully applied'\n });\n return newMap;\n });\n // Update will happen in the renderHunks function\n };\n });\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error(\"Error updating hunk statuses:\", errorMsg);\n }\n }, [diff, diffId]);\n\n // Listen for window-level hunk status updates with data, but don't update during streaming\n useEffect(() => {\n const handleWindowStatusUpdate = (event: CustomEvent) => {\n if (!event.detail) return;\n console.log(\"DiffView received window hunk status update with data:\", event.detail);\n\n // Check if this update is for our diff element\n let isForThisDiff = false;\n\n // Also check if the request ID maps to our diff ID\n if (event.detail.requestId && diffRequestMap.get(event.detail.requestId) === diffId || event.detail.targetDiffElementId === diffId) {\n isForThisDiff = true;\n console.log(`direct match for diffId ${diffId}`);\n\n // Apply the hunk statuses directly to our component state\n if (event.detail.hunkStatuses) {\n Object.entries(event.detail.hunkStatuses).forEach(([hunkId, status]) => {\n updateHunkStatuses({ [hunkId]: status }, diffId);\n });\n }\n\n // If not a match, skip processing\n if (!isForThisDiff) {\n console.log(`Ignoring event for diff ${event.detail.targetDiffElementId || event.detail.requestId || 'unknown'}, we are ${diffId}`);\n return;\n }\n\n // Call updateHunkStatuses with the provided data\n // Only update if not streaming or if this is a completion event\n const isCompletionEvent = event.detail.isCompletionEvent === true;\n updateHunkStatuses(event.detail.hunkStatuses || {}, diffId, isCompletionEvent);\n\n // Force re-render only if not streaming or if this is a completion event\n if (!isStreamingRef.current || isCompletionEvent) {\n setStatusUpdateCounter(prev => prev + 1);\n }\n };\n\n window.addEventListener('hunkStatusUpdate', handleWindowStatusUpdate as EventListener);\n\n return () => {\n window.removeEventListener('hunkStatusUpdate', handleWindowStatusUpdate as EventListener);\n };\n }\n }, [updateHunkStatuses, diffId]);\n\n\n // detect language from file path\n const detectLanguage = (filePath: string): string => {\n if (!filePath) return 'plaintext';\n const extension = filePath.split('.').pop()?.toLowerCase();\n const languageMap: { [key: string]: string } = {\n 'js': 'javascript',\n 'jsx': 'javascript',\n 'ts': 'typescript',\n 'tsx': 'typescript',\n 'swift': 'swift',\n 'objectivec': 'objectivec',\n 'objc': 'objectivec',\n 'metal': 'c',\n 'py': 'python',\n 'rb': 'ruby',\n 'php': 'php',\n 'java': 'java',\n 'go': 'go',\n 'rs': 'rust',\n 'cpp': 'cpp',\n 'c': 'c',\n 'cs': 'csharp',\n 'css': 'css',\n 'html': 'markup',\n 'xml': 'markup',\n 'md': 'markdown'\n };\n return languageMap[extension || ''] || 'plaintext';\n };\n\n useEffect(() => {\n const parseAndSetFiles = () => {\n try {\n const normalizedDiff = normalizeGitDiff(diff);\n let parsedFiles = parseDiff(normalizedDiff);\n\n // After all parsing attempts, check if we have valid, renderable files/hunks\n if (!parsedFiles || parsedFiles.length === 0 ||\n !parsedFiles[0].hunks || parsedFiles[0].hunks.length === 0) {\n // If not, it's effectively a parse error for rich rendering purposes\n if (process.env.NODE_ENV === 'development') {\n console.warn('DiffView - Parse failed: No valid files/hunks found');\n }\n setParseError(true);\n parsedFilesRef.current = []; // Ensure ref is also empty\n } else {\n parsedFilesRef.current = parsedFiles;\n setParseError(false);\n }\n\n // If we have a unified diff without git headers, try to extract the file path\n if (parsedFiles.length > 0 && !parsedFiles[0].oldPath && !parsedFiles[0].newPath) {\n const lines = diff.split('\\n');\n for (const line of lines) {\n if (line.startsWith('--- a/')) {\n parsedFiles[0].oldPath = line.substring(6);\n } else if (line.startsWith('--- /dev/null')) {\n // This is a new file diff - set type but leave oldPath undefined\n // so the \"Create:\" label will be shown\n parsedFiles[0].type = 'add';\n } else if (line.startsWith('+++ b/')) {\n parsedFiles[0].newPath = line.substring(6);\n break;\n }\n }\n }\n\n // Special handling for deletion diffs\n if (parsedFiles.length === 0 && isDeletionDiff(diff)) {\n const match = diff.match(/--- a\\/(.*)\\n/);\n if (match) {\n const filePath = match[1];\n parsedFiles = [{\n type: 'delete',\n oldPath: filePath,\n newPath: '/dev/null',\n oldRevision: 'HEAD',\n newRevision: '0000000',\n oldEndingNewLine: true,\n newEndingNewLine: true,\n oldMode: '100644',\n newMode: '000000',\n similarity: 0,\n hunks: [{\n content: diff,\n oldStart: 1,\n oldLines: diff.split('\\n').filter(line => line.startsWith('-')).length,\n newStart: 0,\n newLines: 0,\n changes: diff.split('\\n')\n .filter(line => !line.match(/^(diff --git|index|---|^\\+\\+\\+)/))\n .map((line, index: number) => ({\n type: 'delete' as const,\n content: line.slice(1),\n isDelete: true,\n isInsert: false,\n isNormal: false,\n lineNumber: index + 1,\n oldLineNumber: index + 1,\n newLineNumber: undefined\n }))\n }]\n }];\n }\n }\n // Check if we have valid, renderable hunks\n if (parsedFiles && parsedFiles.length > 0 && parsedFiles[0].hunks && parsedFiles[0].hunks.length > 0) {\n // We have a valid diff structure - update the reference and clear parse error\n parsedFilesRef.current = parsedFiles;\n lastValidDiffRef.current = diff; // Store this as our last valid diff\n setParseError(false);\n } else if (lastValidDiffRef.current && isGlobalStreaming) {\n // During streaming, if parsing fails but we have a previous valid state, keep using it\n setParseError(false); // Don't set parse error - we'll use the last valid state\n } else {\n // No valid previous state and current parse failed - set parse error\n setParseError(true);\n parsedFilesRef.current = [];\n }\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.error('DiffView - ParseDiff error:', error);\n console.error('DiffView - Failed diff content:', diff.substring(0, 200) + '...');\n }\n setErrorMessage(error instanceof Error ? error.message : String(error));\n console.error('Error parsing diff:', error);\n\n // If we're streaming and have a previous valid state, keep using it\n if (lastValidDiffRef.current && isGlobalStreaming) {\n setParseError(false);\n } else {\n // Otherwise set parse error\n setParseError(true);\n parsedFilesRef.current = [];\n }\n }\n };\n parseAndSetFiles();\n }, [diff, isGlobalStreaming]);\n\n // tokenize hunks\n useEffect(() => {\n const tokenizeHunks = async (hunks: any[], filePath: string) => {\n if (!hunks || hunks.length === 0) {\n setIsLoading(false);\n return;\n }\n setIsLoading(true);\n const language = detectLanguage(filePath);\n try {\n // always load basic languages first\n await Promise.all([\n loadPrismLanguage('markup'),\n loadPrismLanguage('clike'),\n loadPrismLanguage(language)\n ]);\n\n // If parseError is true (e.g. because it's streaming and incomplete),\n // we don't need to tokenize for the rich view.\n if (parseError) {\n setIsLoading(false);\n return;\n }\n\n // Verify Prism is properly initialized\n if (!window.Prism?.languages?.[language]) {\n console.warn(`Prism language ${language} not available, falling back to plain text`);\n // Try without syntax highlighting\n const tokens = tokenize(hunks, {\n highlight: true,\n refractor: window.Prism,\n language: 'plaintext'\n });\n setTokenizedHunks(tokens);\n } else {\n // Try with the detected language\n setTokenizedHunks(null);\n }\n } catch (error: unknown) {\n console.warn(`Error during tokenization for ${language}:`, error);\n setTokenizedHunks(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Only tokenize if not in parseError state and we have hunks\n if (!parseError && parsedFilesRef.current?.[0]?.hunks?.length > 0) {\n const file = parsedFilesRef.current[0];\n tokenizeHunks(file.hunks, file.newPath || file.oldPath);\n } else {\n setIsLoading(false); // Not loading if we will render raw or have no hunks\n }\n }, [diff, parseError]); // Re-tokenize if diff changes or parseError state changes\n\n const renderHunks = (hunks: any[], filePath: string, fileIndex: number) => {\n\n const tableClassName = `diff-table ${viewType === 'split' ? 'diff-table-split' : 'diff-table-unified'}`;\n\n if (!hunks || hunks.length === 0) {\n return <div className=\"diff-empty-hunks\">No changes found in this diff.</div>;\n }\n\n return (\n <table className={tableClassName}>\n <colgroup>\n {viewType === 'split' ? (\n <>\n {showLineNumbers && <col\n className=\"diff-gutter-col\"\n style={{ width: '50px', minWidth: '50px' }}\n />}\n <col\n className=\"diff-code-col\"\n style={{ width: 'calc(50% - 50px)' }}\n />\n {showLineNumbers && <col\n className=\"diff-gutter-col\"\n style={{ width: '50px', minWidth: '50px' }}\n />}\n <col\n className=\"diff-code-col\"\n style={{ width: 'calc(50% - 50px)' }}\n />\n </>\n ) : (\n <React.Fragment>\n {showLineNumbers && <col className=\"diff-gutter-col\" style={{ width: '50px', minWidth: '50px' }} />}\n {showLineNumbers && <col className=\"diff-gutter-col\" style={{ width: '50px', minWidth: '50px' }} />}\n <col style={{ width: 'auto' }} />\n </React.Fragment>\n )}\n </colgroup>\n <tbody>\n {hunks.map((hunk, hunkIndex) => {\n const previousHunk = hunkIndex > 0 ? (hunks[hunkIndex - 1] as ExtendedHunk) : null;\n const linesBetween = previousHunk ?\n hunk.oldStart - (previousHunk.oldStart + previousHunk.oldLines) : 0;\n const showEllipsis = displayMode === 'pretty' &&\n previousHunk;\n const ellipsisText = linesBetween <= 0 ? '...' :\n linesBetween === 1 ?\n '... (1 line)' :\n `... (${linesBetween} lines)`;\n\n // Get hunk status if available\n // Create a stable key for this hunk\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n const status = instanceHunkStatusMap.get(hunkKey);\n const isApplied = status?.applied;\n const statusReason = status?.reason || '';\n const isAlreadyApplied = status?.alreadyApplied;\n\n // Add visual indicator for hunk status\n const hunkStatusIndicator = status && (\n <span style={{\n color: isApplied ? '#52c41a' : '#ff4d4f',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n marginLeft: '8px'\n }}>\n {isApplied ?\n isAlreadyApplied ?\n <><CheckCircleOutlined style={{ color: '#faad14' }} /> Already Applied</> :\n <><CheckCircleOutlined style={{ color: '#52c41a' }} /> Applied</> :\n <><CloseCircleOutlined /> Failed: {statusReason}</>\n }\n </span>\n );\n\n return (\n <React.Fragment key={`${fileIndex}-${hunkIndex}`}>\n {/* Add a hunk header with status-based styling */}\n {status && (\n <tr className=\"hunk-status-header\">\n <td colSpan={viewType === 'split' ? 4 : 3} style={{\n padding: 0,\n borderLeft: `3px solid ${isApplied ?\n (isAlreadyApplied ? '#faad14' : '#52c41a') :\n '#ff4d4f'}`,\n backgroundColor: isApplied ?\n (isAlreadyApplied ? 'rgba(250, 173, 20, 0.05)' : 'rgba(82, 196, 26, 0.05)') :\n 'rgba(255, 77, 79, 0.05)'\n }}></td>\n </tr>)}\n {showEllipsis && (\n <tr id={`hunk-${fileIndex}-${hunkIndex}`} data-diff-id={elementId}>\n <td\n colSpan={viewType === 'split' ? 4 : 3}\n className=\"diff-ellipsis\"\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '4px 8px'\n }}\n >\n <span>{ellipsisText}</span>\n {hunkStatusIndicator}\n </td>\n </tr>\n )}\n <tr className=\"hunk-content-wrapper\">\n <td colSpan={viewType === 'split' ? 4 : 3} style={{\n padding: 0,\n border: status ? `1px solid ${isApplied ?\n (isAlreadyApplied ? '#faad14' : '#52c41a') :\n '#ff4d4f'}` : 'none',\n borderLeft: status ? `3px solid ${isApplied ?\n (isAlreadyApplied ? '#faad14' : '#52c41a') :\n '#ff4d4f'}` : 'none',\n borderRadius: '3px',\n overflow: 'visible'\n }}>\n <table className=\"diff\" style={{ width: '100%', borderCollapse: 'collapse' }}><tbody>\n {renderContent(hunk, filePath, status, fileIndex, hunkIndex)}\n </tbody></table>\n </td>\n </tr>\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n );\n };\n\n // Handle parse error case\n if (parseError) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('DiffView - Rendering fallback due to parse error');\n }\n return (\n <div>\n <div style={{\n backgroundColor: isDarkMode ? '#2d2d2d' : '#f8f8f8',\n padding: '8px 12px',\n borderRadius: '4px 4px 0 0',\n fontSize: '12px',\n color: isDarkMode ? '#888' : '#666',\n borderBottom: '1px solid ' + (isDarkMode ? '#404040' : '#e1e4e8')\n }}>\n 📄 Diff (fallback rendering - parsing failed)\n </div>\n <pre data-testid=\"diff-parse-error\" style={{\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n color: isDarkMode ? '#e6e6e6' : 'inherit',\n padding: '16px',\n borderRadius: '0 0 4px 4px',\n margin: 0,\n overflow: 'auto',\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", monospace',\n fontSize: '13px',\n lineHeight: '1.45'\n }}>\n <code>{diff}</code>\n </pre>\n </div>\n );\n }\n\n\n const renderContent = (hunk: any, filePath: string, status?: any, fileIndex?: number, hunkIndex?: number): JSX.Element[] => {\n\n // Define base style for rows\n const rowStyle: React.CSSProperties = {};\n\n return hunk.changes && hunk.changes.map((change: any, i: number) => {\n // Apply the status-based styling to each row\n const style = { ...rowStyle };\n\n // Ensure change has proper line numbers\n if (!change.oldLineNumber && !change.newLineNumber) {\n // Calculate line numbers based on hunk start and position in changes array\n const normalChangesBeforeThis = hunk.changes\n .slice(0, i)\n .filter(c => c.type === 'normal' || c.type === change.type).length;\n\n if (change.type === 'normal' || change.type === 'delete') {\n change.oldLineNumber = hunk.oldStart + normalChangesBeforeThis;\n }\n if (change.type === 'normal' || change.type === 'insert') {\n change.newLineNumber = hunk.newStart + normalChangesBeforeThis;\n }\n }\n\n // Add additional styling for specific change types and ensure line numbers are set\n if (change.type === 'insert') {\n style.backgroundColor = status?.applied ? (status?.alreadyApplied ? 'rgba(250, 173, 20, 0.1)' : 'rgba(82, 196, 26, 0.1)') : style.backgroundColor;\n } else if (change.type === 'delete') {\n style.backgroundColor = status?.applied ? (status?.alreadyApplied ? 'rgba(250, 173, 20, 0.1)' : 'rgba(82, 196, 26, 0.1)') : style.backgroundColor;\n }\n\n let oldLine = undefined;\n let newLine = undefined;\n\n if (showLineNumbers) {\n oldLine = (change.type === 'normal' || change.type === 'delete') ? change.oldLineNumber || change.lineNumber : undefined;\n if (change.type === 'delete' && !oldLine) {\n // Ensure delete lines always have an old line number\n oldLine = change.lineNumber;\n }\n\n if (change.type === 'insert' && !newLine) {\n // Ensure insert lines always have a new line number\n newLine = change.lineNumber;\n }\n newLine = (change.type === 'normal' || change.type === 'insert') ? change.newLineNumber || change.lineNumber : undefined;\n }\n\n // Add an ID to the first row of each hunk for scrolling\n const rowProps: any = {};\n if (i === 0 && fileIndex !== undefined && hunkIndex !== undefined) {\n rowProps.id = `hunk-${fileIndex}-${hunkIndex}`;\n }\n\n return (\n <DiffLine\n key={i}\n content={change.content}\n language={detectLanguage(filePath)}\n viewType={viewType}\n type={change.type}\n oldLineNumber={oldLine}\n newLineNumber={newLine}\n showLineNumbers={showLineNumbers}\n similarity={change.similarity}\n style={style}\n {...rowProps}\n />\n );\n });\n };\n\n // Define theme-specific styles\n const darkModeStyles = {\n addition: {\n background: '#1a4d1a',\n color: '#c6e6c6'\n },\n deletion: {\n background: '#4d1a1a',\n color: '#e6c6c6'\n },\n gutter: {\n background: '#161b22',\n color: '#8b949e'\n },\n content: {\n background: '#1f1f1f',\n color: '#e6e6e6'\n }\n };\n\n const lightModeStyles = {\n addition: {\n background: '#e6ffec',\n color: '#24292e'\n },\n deletion: {\n background: '#ffebe9',\n color: '#24292e'\n },\n gutter: {\n background: '#f6f8fa',\n color: '#57606a'\n },\n content: {\n background: '#ffffff',\n color: '#24292e'\n }\n };\n\n const styles = `\n .hunk-status-bar {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap; \n margin-top: 4px;\n margin: 0 auto 0 0;\n padding: 0 8px;\n }\n \n .hunk-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n \n .hunk-status-dot.pending {\n background-color: #8c8c8c;\n }\n \n .diff-header {\n background-color: ${isDarkMode ? '#1f1f1f' : '#f6f8fa'};\n padding: 0px 16px 12px;\n }\n \n .diff-header-content {\n margin-top: 4px;\n position: sticky;\n left: 0;\n right: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n box-sizing: border-box;\n }\n \n .diff-header-content b {\n color: ${isDarkMode ? '#e6e6e6' : '#24292e'};\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-right: 16px;\n }\n \n .hunk-status-header {\n height: 0;\n overflow: hidden;\n }\n \n .hunk-status-bar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n margin: 0 auto 0 0;\n padding: 0 8px;\n }\n \n .hunk-content-wrapper {\n margin-bottom: 12px;\n margin-top: 4px;\n }\n \n .hunk-status-indicator {\n display: inline-flex !important;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 28px !important;\n line-height: 28px !important;\n vertical-align: middle;\n margin: 0 2px;\n border-radius: 4px;\n cursor: pointer;\n }\n \n .hunk-status-indicator:hover {\n background-color: ${isDarkMode ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'};\n overflow: hidden;\n text-overflow: ellipsis;\n margin-right: 16px;\n }\n `;\n\n const renderFile = (file: any, fileIndex: number) => {\n\n const tableClassName = `diff-table ${viewType === 'split' ? 'diff-table-split' : 'diff-table-unified'}`;\n\n return (\n <div\n key={`diff-file-${fileIndex}-${elementId}`}\n className={`diff-view smaller-diff-view ${viewType === 'split' ? 'diff-view-split' : 'diff-view-unified'}`}\n style={{\n backgroundColor: currentTheme.content.background,\n color: currentTheme.content.color\n }}\n >\n <div className=\"diff-header\" style={{ padding: '8px 16px 12px' }}>\n <div className=\"diff-header-content\" style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <span className=\"hunk-status-bar\">\n {file.hunks.map((hunk, hunkIndex) => {\n // Get the hunk status if available\n // Create a stable key for this hunk\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n const status = instanceHunkStatusMap.get(hunkKey);\n const hunkId = hunkIndex + 1;\n // Use the elementId to make the hunk reference unique across multiple diffs\n const hunkRef = `hunk-${fileIndex}-${hunkIndex}`;\n\n let statusIcon;\n let statusColor = '#8c8c8c';\n let statusTooltip;\n\n if (!status) {\n // Pending status \n statusIcon = <div className=\"hunk-status-dot pending\" />;\n statusTooltip = `Hunk #${hunkId}: Pending`;\n } else if (status.applied) {\n if (status.alreadyApplied) {\n // Already applied status\n statusIcon = <CheckCircleOutlined style={{ color: '#faad14' }} />;\n statusColor = '#faad14'; // Orange for already applied\n statusTooltip = `Hunk #${hunkId}: Already applied`;\n } else {\n // Successfully applied status\n statusIcon = <CheckCircleOutlined style={{ color: '#52c41a' }} />;\n statusColor = '#52c41a'; // Green\n statusTooltip = `Hunk #${hunkId}: Successfully applied`;\n }\n } else {\n // Failed status\n statusIcon = <CloseCircleOutlined style={{ color: '#ff4d4f' }} />;\n statusColor = '#ff4d4f'; // Red\n statusTooltip = `Hunk #${hunkId}: Failed - ${status.reason}`;\n }\n\n return (\n <Tooltip key={hunkId} title={statusTooltip}>\n <div\n className=\"hunk-status-indicator\"\n style={{\n display: 'inline-flex',\n height: '28px !important',\n lineHeight: '28px !important',\n verticalAlign: 'middle',\n marginTop: '4px',\n backgroundColor: isDarkMode ? 'rgba(0,0,0,0.2)' : 'rgba(0,0,0,0.05)',\n color: statusColor,\n border: `1px solid ${statusColor}`,\n // Add a subtle border to match the hunk styling\n boxShadow: status ? `0 0 0 1px ${statusColor}` : 'none'\n }}\n onClick={() => {\n // Create a more specific selector that includes the diff element ID\n // to ensure we're targeting the correct hunk in the correct diff\n const diffContainer = document.getElementById(`diff-view-wrapper-${elementId}`);\n const hunkElement = diffContainer ?\n diffContainer.querySelector(`#${hunkRef}`) :\n document.getElementById(hunkRef);\n if (hunkElement) {\n hunkElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }}\n >\n {status ? statusIcon : hunkId}\n </div>\n </Tooltip>\n );\n })}\n </span>\n\n <div className=\"header-right\">\n {!['delete'].includes(file.type) &&\n <ApplyChangesButton\n diff={diff}\n fileIndex={fileIndex}\n diffElementId={elementId}\n filePath={file.newPath || file.oldPath}\n isStreaming={isGlobalStreaming}\n setHunkStatuses={setInstanceHunkStatusMap}\n enabled={window.enableCodeApply === 'true'}\n />\n }\n </div>\n </div>\n </div>\n <div className=\"diff-content-wrapper\" style={{\n position: 'relative',\n overflowY: 'hidden'\n }} id={`diff-content-${elementId}`}>\n <div className=\"diff-content\">\n {viewType === 'unified' && file.hunks.map((hunk: ExtendedHunk, hunkIndex: number) => {\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n const status = instanceHunkStatusMap.get(hunkKey);\n const isApplied = status?.applied;\n const isAlreadyApplied = status?.alreadyApplied;\n const statusReason = status?.reason || '';\n\n // Create the status indicator component\n const hunkStatusIndicator = status && (\n <span style={{\n color: isApplied ? (isAlreadyApplied ? '#faad14' : '#52c41a') : '#ff4d4f',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n marginLeft: '8px'\n }}>\n {isApplied ?\n isAlreadyApplied ?\n <><CheckCircleOutlined style={{ color: '#faad14' }} /> Already Applied</> :\n <><CheckCircleOutlined style={{ color: '#52c41a' }} /> Applied</> :\n <><CloseCircleOutlined /> Failed: {statusReason}</>\n }\n </span>\n );\n\n\n // Calculate lines between hunks for ellipsis display\n const previousHunk = hunkIndex > 0 ? (file.hunks[hunkIndex - 1] as ExtendedHunk) : null;\n const linesBetween = previousHunk ?\n hunk.oldStart - (previousHunk.oldStart + previousHunk.oldLines) : 0;\n const showEllipsis = displayMode === 'pretty' && previousHunk;\n const ellipsisText = linesBetween <= 0 ? '...' :\n linesBetween === 1 ? '... (1 line)' : `... (${linesBetween} lines)`;\n\n return (\n <div\n key={`hunk-wrapper-${fileIndex}-${hunkIndex}-${elementId}`}\n className=\"hunk-scroll-container\"\n style={{\n overflowX: 'auto',\n marginBottom: '1em',\n border: status ?\n `1px solid ${isApplied ? (isAlreadyApplied ? '#faad14' : '#52c41a') : '#ff4d4f'}` :\n '1px dashed rgba(128,128,128,0.3)'\n }}\n >\n {/* Add a hidden ellipsis for the first hunk to ensure status has a place to go */}\n {hunkIndex === 0 && (\n <div id={`hunk-${fileIndex}-${hunkIndex}`} data-diff-id={elementId} className=\"diff-ellipsis\" style={{ display: 'none' }}></div>\n )}\n\n {/* Add a status-based styling row if status is available */}\n {status && (\n <div className=\"hunk-status-header\" style={{\n padding: 0,\n borderLeft: `3px solid ${isApplied ?\n (isAlreadyApplied ? '#faad14' : '#52c41a') :\n '#ff4d4f'}`,\n backgroundColor: isApplied ?\n (isAlreadyApplied ? 'rgba(250, 173, 20, 0.05)' : 'rgba(82, 196, 26, 0.05)') :\n 'rgba(255, 77, 79, 0.05)'\n }}></div>\n )}\n\n {/* Show ellipsis between hunks with proper jump anchor */}\n {showEllipsis && (\n <div\n id={`hunk-${fileIndex}-${hunkIndex}`}\n data-diff-id={elementId}\n className=\"diff-ellipsis\"\n style={{\n padding: '4px 8px',\n color: isDarkMode ? '#8b949e' : '#57606a',\n backgroundColor: isDarkMode ? '#161b22' : '#f6f8fa',\n borderBottom: '1px solid ' + (isDarkMode ? '#30363d' : '#d8dee4'),\n fontSize: '12px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <span>{ellipsisText}</span>\n {hunkStatusIndicator}\n </div>\n )}\n\n {/* Add jump anchor for first hunk or when no ellipsis */}\n {!showEllipsis && (\n <div\n id={`hunk-${fileIndex}-${hunkIndex}`}\n data-diff-id={elementId}\n style={{ display: 'none' }}\n ></div>\n )}\n\n <table className=\"diff-table diff-table-hunk diff-table-unified-hunk\">\n <colgroup>\n {showLineNumbers && <col className=\"diff-gutter-col\" style={{ width: '50px', minWidth: '50px' }} />}\n {showLineNumbers && <col className=\"diff-gutter-col\" style={{ width: '50px', minWidth: '50px' }} />}\n <col style={{ width: 'auto' }} />\n </colgroup>\n <tbody>\n {renderContent(hunk, file.newPath || file.oldPath, status, fileIndex, hunkIndex)}\n </tbody>\n </table>\n </div>\n );\n })}\n\n {viewType === 'split' && (\n // Split view still uses the original renderHunks which renders a single table for the file\n // as its TDs handle their own scrolling.\n <table className={tableClassName}>\n {/* ... colgroup for split view ... */}\n <tbody>\n {renderHunks( // renderHunks for split view will iterate through hunks and create TRs\n file.hunks,\n file.newPath || file.oldPath,\n fileIndex\n )}\n </tbody>\n </table>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n const currentTheme = isDarkMode ? darkModeStyles : lightModeStyles;\n return (\n <div className=\"diff-files-container\">\n <style key={`diff-styles-${diffId}`}>{styles}</style>\n {parsedFilesRef.current.map((file, fileIndex) =>\n renderFile(file, fileIndex)\n )}\n </div>\n );\n};\n\n/**\n * Check if a diff is complete and ready for application\n */\nconst isDiffComplete = (diffContent: string, isStreaming: boolean): boolean => {\n if (!diffContent || !diffContent.trim()) return false;\n\n // If not streaming, assume diff is complete\n if (!isStreaming) return true;\n\n // For streaming diffs, check if they have the essential structure\n const lines = diffContent.split('\\n');\n const hasGitHeader = lines.some(line => line.startsWith('diff --git'));\n const hasFileHeaders = lines.some(line => line.startsWith('---')) &&\n lines.some(line => line.startsWith('+++'));\n const hasHunkHeader = lines.some(line => line.match(/^@@\\s+-\\d+/));\n const hasContent = lines.some(line => line.match(/^[+-\\s]/));\n\n // Check if the diff ends properly (not cut off mid-hunk)\n const lastNonEmptyLine = lines.filter(line => line.trim()).pop() || '';\n const endsAbruptly = lastNonEmptyLine.startsWith('@@') ||\n lastNonEmptyLine.match(/^[+-]/) &&\n !lines.slice(-3).some(line => line.trim() === '');\n\n // A complete diff should have header structure and not end abruptly\n const hasMinimalStructure = hasGitHeader && hasFileHeaders && hasHunkHeader && hasContent;\n const isStructurallyComplete = hasMinimalStructure && !endsAbruptly;\n\n return isStructurallyComplete;\n};\n\nconst ApplyChangesButton: React.FC<ApplyChangesButtonProps> = ({ diff, filePath, fileIndex, diffElementId, enabled, isStreaming = false, setHunkStatuses }) => {\n const [isApplied, setIsApplied] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [instanceHunkStatusMap, setInstanceHunkStatusMap] = useState<Map<string, HunkStatus>>(new Map());\n const statusUpdateCounterRef = useRef<number>(0);\n const isStreamingRef = useRef<boolean>(false);\n const appliedRef = useRef<boolean>(false);\n const buttonInstanceId = useRef(`button-${diffElementId}-${Date.now()}`).current;\n\n // Track processed request IDs to prevent infinite update loops\n const processedRequestIds = useRef(new Set<string>());\n\n // Check if the diff is complete and ready for application\n const diffComplete = useMemo(() => {\n return isDiffComplete(diff, isStreaming);\n }, [diff, isStreaming]);\n\n const shouldDisableButton = isApplied || isProcessing || (isStreaming && !diffComplete);\n const buttonId = useId();\n // Define a function to trigger diff updates\n const triggerDiffUpdate = (hunkStatuses: Record<string, any> | null = null, requestId: string | null = null, diffElementId: string | null = null) => {\n\n // Also dispatch a window event for backward compatibility\n console.log(`Triggering diff update event with statuses for request ${requestId}:`, hunkStatuses);\n\n // Prevent duplicate updates for the same request ID\n if (requestId && processedRequestIds.current.has(requestId)) {\n console.log(`Skipping duplicate update for already processed request: ${requestId}`);\n return;\n }\n if (requestId) processedRequestIds.current.add(requestId);\n\n const customEvent = new CustomEvent('hunkStatusUpdate', {\n detail: {\n requestId,\n hunkStatuses,\n filePath,\n isCompletionEvent: true, // Flag to indicate this is a completion event\n targetDiffElementId: diffElementId // Add the target diff element ID\n }\n });\n window.dispatchEvent(customEvent);\n };\n\n // Check if we're in a streaming state\n useEffect(() => {\n const checkStreamingState = () => {\n const streamingElements = document.querySelectorAll('.streaming-content');\n isStreamingRef.current = streamingElements.length > 0;\n };\n\n // Check immediately\n checkStreamingState();\n\n // Set up a mutation observer to detect streaming state changes\n const observer = new MutationObserver(checkStreamingState);\n observer.observe(document.body, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleApplyChanges = async () => {\n if (appliedRef.current) return;\n appliedRef.current = true;\n\n // Use our stable request ID for this specific diff application\n const requestId = `${Date.now()}`;\n\n // Extract the actual diff content\n setIsProcessing(true);\n const cleanDiff = (() => {\n console.log('Pre-fetch diff content for file:', filePath);\n // Log the incoming diff content\n console.debug('Raw diff content:', {\n processing: true,\n elementId: diffElementId,\n length: diff.length,\n firstLine: diff.split('\\n')[0],\n totalLines: diff.split('\\n').length,\n fullContent: diff\n });\n\n // Store the file path for this diff element ID for later matching\n if (diffElementId) {\n window.diffElementPaths = window.diffElementPaths || new Map();\n window.diffElementPaths.set(diffElementId, filePath);\n }\n\n // If it's already a raw diff, extract only the relevant file's diff if multipart\n if (diff.startsWith('diff --git')) {\n const singleFileDiff = extractSingleFileDiff(diff, filePath);\n console.debug('Extracted single file diff:', {\n filePath,\n diffLength: singleFileDiff.length\n });\n return singleFileDiff.trim();\n }\n\n // Otherwise extract diff from markdown code block\n const diffMatch = diff.match(/```diff\\n([\\s\\S]*?)```(?:\\s|$)/);\n console.log('Diff match result:', {\n found: Boolean(diffMatch),\n groups: diffMatch ? diffMatch.length : 0,\n\n matchContent: diffMatch ? {\n fullMatch: diffMatch[0],\n diffContent: diffMatch[1],\n } : null\n });\n if (diffMatch) {\n return diffMatch[1].trim();\n }\n\n // If we extracted a diff from markdown and it's a multi-file diff,\n // extract only the relevant file's diff\n if (diffMatch) {\n const diffContent = diffMatch[1] as string;\n if (diffContent.includes('diff --git') && diffContent.indexOf('diff --git') !== diffContent.lastIndexOf('diff --git')) {\n const extractedDiff = diffContent.trim();\n const singleFileDiff = extractSingleFileDiff(extractedDiff, filePath);\n return singleFileDiff;\n }\n }\n\n // Fallback to original content\n return diff.trim();\n })();\n\n // Log the processed diff content\n console.log(`Processed diff content for ${diffElementId}:`, {\n length: cleanDiff.length,\n lines: cleanDiff.split('\\n').length,\n firstLine: cleanDiff.split('\\n')[0],\n lastLine: cleanDiff.split('\\n').slice(-1)[0],\n fullContent: cleanDiff,\n truncated: cleanDiff.length < diff.length\n });\n\n // Log the actual request body\n const requestBody = JSON.stringify({\n diff: cleanDiff,\n filePath: filePath.trim(),\n requestId: requestId, elementId: diffElementId // Use the full, unique diffElementId\n });\n console.log('Request body:', requestBody);\n\n\n console.log(`Applying changes for diff ${diffElementId} with request ID ${requestId}, button instance: ${buttonInstanceId}`);\n const requestBodyParsed = JSON.parse(requestBody);\n console.log('Parsed request body diff length:', requestBodyParsed.diff.split('\\n').length);\n\n try {\n console.log('About to send fetch request with body length:', cleanDiff.length);\n console.log('Request body:', {\n diff: cleanDiff.substring(0, 100) + '...',\n filePath: filePath.trim(),\n requestId: requestId, elementId: diffElementId, buttonInstanceId\n });\n\n const response = await fetch('/api/apply-changes', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n diff: cleanDiff,\n elementId: diffElementId, // Use the original element ID consistently\n filePath: filePath.trim(),\n buttonInstanceId, // Add the button instance ID for more precise matching\n requestId: requestId\n }),\n });\n\n // Log the actual sent data\n const sentData = await response.clone().json();\n console.log('Actually sent to server:', sentData);\n console.log('Apply changes response:', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries([...response.headers.entries()]),\n ok: response.ok\n });\n\n if (response.ok || response.status === 207) {\n const data = await response.json();\n console.log('Apply changes response data:', data);\n console.log('Response data structure:', {\n rawData: JSON.stringify(data),\n status: data.status,\n message: data.message || 'No message provided',\n requestId: data.request_id,\n hasRequestId: !!data.request_id,\n diffElementId: diffElementId,\n mappingAdded: data.request_id ? diffRequestMap.set(data.request_id, diffElementId) : false,\n buttonInstanceId,\n hasDetails: !!data.details || !!data.hunk_statuses,\n detailsKeys: data.details ? Object.keys(data.details) : [],\n succeeded: data.details?.succeeded,\n failed: data.details?.failed,\n hunkStatuses: data.details?.hunk_statuses\n });\n\n // Store the mapping between request ID and diff element ID\n if (data.request_id) {\n diffRequestMap.set(data.request_id, diffElementId);\n console.log(`Mapped request ${data.request_id} to diff element ${diffElementId} (button ${buttonInstanceId})`);\n }\n\n // Check if ANY hunks succeeded before marking as applied\n const hasSuccessfulHunks = data.details?.succeeded?.length > 0;\n console.log('Has successful hunks:', hasSuccessfulHunks);\n console.log('Succeeded hunks:', data.details?.succeeded || []);\n\n if (data.status === 'success') {\n console.log('Processing success status');\n setIsApplied(true); // Complete success\n // Update hunk statuses for successful application\n // Check if we have detailed hunk statuses in the response\n if (data.details?.hunk_statuses) {\n const hunkStatuses = data.hunk_statuses || data.details?.hunk_statuses || {};\n const files = parseDiff(cleanDiff);\n files.forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n // The hunk IDs in the response are 1-based, but our hunkIndex is 0-based\n console.log(`Processing hunk status for request ${data.request_id}, hunk #${hunkIndex + 1}`);\n const hunkId = hunkIndex + 1;\n const hunkStatus = hunkStatuses[hunkId];\n\n if (hunkStatus) {\n console.log(`Setting status for hunk #${hunkId} with key ${hunkKey}:`, hunkStatus);\n if (typeof setHunkStatuses === 'function') {\n console.log('Calling setHunkStatuses function');\n\n setHunkStatuses((prev: Map<string, HunkStatus>) => {\n const newMap = new Map(prev);\n newMap.set(hunkKey, {\n applied: hunkStatus.status === 'succeeded' || hunkStatus.status === 'already_applied',\n alreadyApplied: hunkStatus.status === 'already_applied',\n reason: hunkStatus.status === 'succeeded' ?\n 'Successfully applied' :\n hunkStatus.status === 'already_applied' ? 'Already applied' : 'Failed'\n } as HunkStatus);\n\n // Also update the global registry\n if (window.hunkStatusRegistry) {\n if (!window.hunkStatusRegistry.has(diffElementId)) {\n window.hunkStatusRegistry.set(diffElementId, new Map());\n }\n const registryMap = window.hunkStatusRegistry.get(diffElementId)!;\n registryMap.set(hunkKey, newMap.get(hunkKey) as HunkStatus);\n }\n return newMap;\n });\n // Default to success if not found in hunk_statuses\n\n const isAlreadyApplied = hunkStatus.status === 'already_applied';\n\n if (setHunkStatuses) {\n setHunkStatuses((prev: Map<string, HunkStatus>) => {\n const newMap = new Map(prev);\n newMap.set(hunkKey, {\n applied: true,\n reason: isAlreadyApplied ? 'Already applied' : 'Successfully applied',\n alreadyApplied: isAlreadyApplied\n } as HunkStatus);\n\n // Also update the global registry\n if (window.hunkStatusRegistry) {\n if (!window.hunkStatusRegistry.has(diffElementId)) {\n window.hunkStatusRegistry.set(diffElementId, new Map());\n }\n const registryMap = window.hunkStatusRegistry.get(diffElementId)!;\n registryMap.set(hunkKey, { applied: true, reason: isAlreadyApplied ? 'Already applied' : 'Successfully applied', alreadyApplied: isAlreadyApplied });\n }\n return newMap;\n });\n // Force a re-render by updating the status update counter\n statusUpdateCounterRef.current += 1;\n }\n }\n }\n });\n });\n } else {\n console.log('Setting success status for all hunks (no detailed statuses)');\n const files = parseDiff(cleanDiff);\n files.forEach((file, fileIndex) => {\n console.log(`Setting status for file hunks (${diffElementId}):`, file.hunks.length);\n file.hunks.forEach((hunk, hunkIndex) => {\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n setInstanceHunkStatusMap(prev => {\n const newMap = new Map(prev);\n newMap.set(hunkKey, {\n applied: true,\n reason: 'Successfully applied',\n alreadyApplied: false\n });\n return newMap;\n });\n });\n });\n }\n triggerDiffUpdate(data.details?.hunk_statuses || {}, data.request_id, diffElementId);\n\n message.success(`Changes applied successfully to ${filePath}`);\n } else if (data.status === 'partial') {\n console.log('Processing partial status');\n // Only mark as applied if at least one hunk succeeded\n setIsApplied(hasSuccessfulHunks);\n console.log('Setting isApplied to:', hasSuccessfulHunks);\n\n // Handle the new format with hunk_statuses\n parseDiff(cleanDiff).forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n console.log(`Processing hunk #${hunkIndex + 1} status`);\n // Create a stable key for this hunk\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n // Get the hunk status from the response\n // The hunk IDs in the response are 1-based, but our hunkIndex is 0-based\n const hunkId = hunkIndex + 1;\n const hunkStatus = data.details?.hunk_statuses?.[hunkId];\n\n if (hunkStatus) {\n console.log(`Setting status for hunk #${hunkId} with key ${hunkKey}:`, hunkStatus);\n instanceHunkStatusMap.set(hunkKey, {\n applied: hunkStatus.status === 'succeeded' || hunkStatus.status === 'already_applied',\n alreadyApplied: hunkStatus.status === 'already_applied',\n reason: hunkStatus.status === 'failed'\n ? 'Failed in ' + hunkStatus.stage + ' stage'\n : 'Successfully applied'\n });\n } else {\n // Fallback if we can't find the specific hunk status\n // Check if this hunk ID is in the failed list from the API response\n const isInSucceededList = data.details?.succeeded?.includes(hunkId);\n const isAlreadyAppliedList = data.details?.already_applied?.includes(hunkId);\n const isInFailedList = data.details?.failed?.includes(hunkId);\n\n // Log this for debugging\n console.log(`Fallback status for hunk #${hunkId}: success=${isInSucceededList}, already=${isAlreadyAppliedList}, failed=${isInFailedList}`);\n\n instanceHunkStatusMap.set(hunkKey, {\n applied: isInSucceededList || isAlreadyAppliedList,\n alreadyApplied: isAlreadyAppliedList,\n reason: isInFailedList ? 'Failed to apply' : 'Successfully applied'\n });\n }\n // Force a re-render to update the UI\n statusUpdateCounterRef.current++;\n return;\n });\n });\n console.log('Hunk statuses updated, triggering update');\n triggerDiffUpdate(data.details?.hunk_statuses || {}, data.request_id, diffElementId);\n\n // Show partial success message with failed hunks\n message.warning({\n content: (\n <div>\n <p>{data.message}</p>\n {data.details?.failed && data.details.failed.length > 0 && (\n <div>\n <p>Failed hunks:</p>\n <ul style={{ marginTop: '8px', paddingLeft: '20px', listStyle: 'none' }}>\n {data.details.failed.map((hunkId, index) => {\n const hunkStatus = data.details?.hunk_statuses?.[hunkId];\n return (\n <li key={index}>\n <CloseCircleOutlined style={{ color: '#ff4d4f', marginRight: '8px' }} />\n {`Hunk #${hunkId} failed`}\n {hunkStatus ? ` in ${hunkStatus.stage || 'unknown'} stage` : ''}\n {hunkStatus?.error_details ? `: ${JSON.stringify(hunkStatus.error_details)}` : ''}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n ),\n duration: 10 // Show for 10 seconds since there's more to read\n });\n } else if (data.status === 'error') {\n console.log('Processing error status');\n // Handle error status (all hunks failed)\n setIsApplied(false);\n console.log('Setting isApplied to false due to error status');\n\n // Mark all hunks as failed\n parseDiff(cleanDiff).forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n console.log(`Setting failed status for hunk #${hunkIndex + 1}`);\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n const hunkId = hunkIndex + 1;\n const hunkStatus = data.details?.hunk_statuses?.[hunkId];\n\n instanceHunkStatusMap.set(hunkKey, {\n applied: false,\n reason: hunkStatus?.stage\n ? 'Failed in ' + (hunkStatus.stage || 'unknown') + ' stage'\n : 'Failed to apply'\n });\n });\n });\n console.log('Failed statuses set, triggering update for error');\n triggerDiffUpdate(data.details?.hunk_statuses || null, data.request_id, diffElementId);\n\n // Show error message\n message.error({\n content: (\n <div>\n <p>\n <CloseCircleOutlined style={{ color: '#ff4d4f', marginRight: '8px' }} />\n {data.message || 'All hunks failed to apply'}\n </p>\n {data.details?.failed && data.details.failed.length > 0 && (\n <div>\n <p>Failed hunks:</p>\n <ul style={{ marginTop: '8px', paddingLeft: '20px', listStyle: 'none' }}>\n {data.details.failed.map((hunkId, index) => {\n const hunkStatus = data.details?.hunk_statuses?.[hunkId];\n return (\n <li key={index}>\n <CloseCircleOutlined style={{ color: '#ff4d4f', marginRight: '8px' }} />\n {`Hunk #${hunkId} failed`}\n {hunkStatus ? ` in ${hunkStatus.stage || 'unknown'} stage` : ''}\n\n {/* Update the hunk status in our map to ensure UI is consistent with message */}\n {(() => { instanceHunkStatusMap.set(`0-${hunkId - 1}`, { applied: false, reason: hunkStatus?.error_details?.error || 'Failed to apply' }); return null; })()}\n\n {hunkStatus?.error_details ? `: ${JSON.stringify(hunkStatus.error_details)}` : ''}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n triggerDiffUpdate({}, data.request_id);\n </div>\n ),\n duration: 10\n });\n } else {\n console.log('Unknown status:', data.status);\n message.warning(`Unknown status: ${data.status}`);\n }\n } else {\n try {\n // Parse the error response\n const errorData = await response.json().catch(() => ({}));\n\n // Mark all hunks as failed when we get a global error\n if (response.status === 422 || errorData.status === 'error') {\n // Parse the diff to get the number of hunks\n try {\n const files = parseDiff(cleanDiff);\n files.forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n const errorMessage = errorData.detail?.message || errorData.message || errorData.detail || 'Failed to apply changes';\n\n // Update the hunk status to failed\n if (typeof setHunkStatuses === 'function') {\n setHunkStatuses((prev: Map<string, HunkStatus>) => {\n const newMap = new Map(prev);\n newMap.set(hunkKey, {\n applied: false,\n reason: `Error: ${errorMessage}`\n });\n return newMap;\n });\n }\n });\n });\n } catch (parseError) {\n console.error('Error parsing diff for error propagation:', parseError);\n }\n }\n\n console.log('Apply changes error response:', {\n status: response.status,\n errorData,\n errorDataKeys: Object.keys(errorData),\n detail: errorData.detail,\n detailType: typeof errorData.detail,\n message: errorData.message || errorData.detail?.message,\n hasDetails: !!errorData.details,\n detailsKeys: errorData.details ? Object.keys(errorData.details) : [],\n });\n\n // Check if the error response contains a status field\n if (errorData.detail && errorData.detail.status === 'error') {\n console.log('Processing error status from error response');\n setIsApplied(false);\n\n // Mark all hunks as failed\n parseDiff(cleanDiff).forEach((file, fileIndex) => {\n file.hunks.forEach((hunk, hunkIndex) => {\n const hunkKey = `${fileIndex}-${hunkIndex}`;\n console.log(`Setting error status for hunk #${hunkIndex + 1}`);\n instanceHunkStatusMap.set(hunkKey, {\n applied: false,\n reason: 'Failed to apply'\n });\n });\n });\n triggerDiffUpdate(null, errorData.request_id, diffElementId);\n console.log('Error statuses set, triggering update');\n }\n\n message.error({\n content: (\n <div>\n <p>\n <CloseCircleOutlined style={{ color: '#ff4d4f', marginRight: '8px' }} />\n {errorData.detail?.message || errorData.message || errorData.detail || 'Failed to apply changes'}\n </p>\n {errorData.detail?.summary && <p>{errorData.detail.summary}</p>}\n {errorData.details?.failed && errorData.details.failed.length > 0 && (\n <div>\n <p>Failed hunks:</p>\n <ul style={{ marginTop: '8px', paddingLeft: '20px', listStyle: 'none' }}>\n {errorData.details.failed.map((hunkId, index) => {\n const hunkStatus = errorData.details?.hunk_statuses?.[hunkId];\n return (\n <li key={index}>\n <CloseCircleOutlined style={{ color: '#ff4d4f', marginRight: '8px' }} />\n {`Hunk #${hunkId} failed`}\n {hunkStatus ? ` in ${hunkStatus.stage || 'unknown'} stage` : ''}\n {hunkStatus?.error_details ? `: ${JSON.stringify(hunkStatus.error_details)}` : ''}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n ),\n duration: 5\n });\n } catch (parseError) {\n console.error('Error parsing error response:', parseError);\n message.error('Failed to apply changes');\n }\n }\n } catch (error: unknown) {\n console.error('Error applying changes:', error);\n console.error('Error type:', typeof error);\n console.error('Error properties:', Object.keys(error as object));\n message.error({\n content: 'Error applying changes: ' + (error instanceof Error ? error.message : String(error)),\n key: 'apply-changes-error',\n duration: 5\n });\n } finally {\n setIsProcessing(false);\n }\n };\n\n // Listen for hunk status updates from the server\n useEffect(() => {\n const handleHunkStatusUpdate = (e: CustomEvent) => {\n if (!e.detail) return;\n\n const eventButtonInstanceId = e.detail.buttonInstanceId;\n\n\n // Only process events targeted at this specific diff element\n if (e.detail.targetDiffElementId && e.detail.targetDiffElementId !== diffElementId) {\n return; // Skip events not meant for this instance\n }\n if (!e.detail) return;\n\n // Set a timeout to remove this event from the processed set after a short delay\n const eventKey = `${e.detail.requestId || ''}-${e.detail.targetDiffElementId || ''}`;\n setTimeout(() => processedWindowEvents.delete(eventKey), 500);\n\n const targetDiffElementIdFromMap = diffRequestMap.get(e.detail.requestId)?.replace(/^diff-/, 'diff-view-');\n let isRelevantUpdate = false;\n\n // Create a unique key for this event to prevent duplicate processing\n // Skip if we've already processed this exact event\n if (processedWindowEvents.has(eventKey)) {\n console.debug(`Skipping already processed window event: ${eventKey}`);\n return;\n }\n\n // Log the event and our identifiers for debugging\n console.log(`Checking if update matches our element: target=${e.detail.targetDiffElementId}, ours=${diffElementId}, buttonId=${buttonInstanceId}`);\n\n // Only accept exact matches for our element ID\n if ((e.detail.targetDiffElementId === diffElementId) &&\n (!e.detail.filePath || e.detail.filePath === filePath)) {\n isRelevantUpdate = true;\n }\n\n // Otherwise check if the request ID maps to our element ID via the map\n else if (targetDiffElementIdFromMap === diffElementId && (!e.detail.filePath || e.detail.filePath === filePath)) {\n isRelevantUpdate = true;\n }\n\n // Check if the button instance ID matches\n if (eventButtonInstanceId === buttonInstanceId) {\n isRelevantUpdate = true;\n }\n\n // Log the matching attempt - this helps us debug\n console.log(`ApplyChangesButton ${diffElementId}: Matching update. Event target: ${e.detail.targetDiffElementId}, Mapped target: ${targetDiffElementIdFromMap}, Button: ${eventButtonInstanceId}/${buttonInstanceId}, Match: ${isRelevantUpdate}`);\n\n\n if (!isRelevantUpdate) {\n // This update is for a different diff element or file, ignore it\n console.log(`Ignoring update for ${e.detail.targetDiffElementId || 'unknown'} (we are ${diffElementId})`);\n return; // Exit early if not relevant\n }\n\n // Mark this event as processed\n isRelevantUpdate = true;\n\n console.log(`Received hunk status update for diff ${diffElementId} (request ${e.detail.requestId}, button ${eventButtonInstanceId || 'unknown'}, isRelevant=${isRelevantUpdate}):`, e.detail.hunkStatuses);\n\n // Process and update the status for each hunk\n if (e.detail.hunkStatuses && isRelevantUpdate) {\n Object.entries(e.detail.hunkStatuses).forEach(([hunkId, status]) => {\n const hunkIndex = parseInt(hunkId, 10) - 1; // Convert 1-based to 0-based \n const hunkKey = `${fileIndex}-${hunkIndex}`;\n if (typeof setHunkStatuses === 'function') {\n setHunkStatuses((prev: Map<string, HunkStatus>) => {\n const newMap = new Map(prev);\n newMap.set(hunkKey, {\n applied: (status as ApiHunkStatus).status === 'succeeded' || (status as ApiHunkStatus).status === 'already_applied',\n alreadyApplied: (status as ApiHunkStatus).status === 'already_applied',\n reason: (status as ApiHunkStatus).status === 'failed' ? 'Failed in ' + ((status as ApiHunkStatus).stage || 'unknown') + ' stage' : 'Successfully applied'\n } as HunkStatus);\n return newMap;\n });\n }\n // Force a re-render to update the UI\n statusUpdateCounterRef.current += 1;\n });\n }\n }\n window.addEventListener('hunkStatusUpdate', handleHunkStatusUpdate as EventListener);\n return () => window.removeEventListener('hunkStatusUpdate', handleHunkStatusUpdate as EventListener);\n }, [diffElementId, filePath, setHunkStatuses, fileIndex]);\n\n // Clear processed request IDs when component unmounts\n useEffect(() => {\n return () => processedRequestIds.current.clear();\n }, []);\n\n return enabled ? (\n <Button\n onClick={handleApplyChanges}\n disabled={shouldDisableButton}\n loading={isProcessing}\n type={isApplied ? \"default\" : \"primary\"}\n style={{ marginLeft: '8px' }} id={`apply-changes-${buttonId}`}\n icon={<CheckOutlined />}\n >\n Apply Changes\n </Button>\n ) : null;\n};\n\nconst hasText = (token: any): token is TokenWithText => {\n return 'text' in token;\n};\n\nconst isCodeToken = (token: TokenWithText): token is TokenWithText & { lang?: string } => {\n return token.type === 'code' && 'text' in token;\n};\n\ninterface DiffTokenProps {\n token: TokenWithText;\n index: number;\n enableCodeApply: boolean;\n isDarkMode: boolean;\n isStreaming?: boolean;\n}\n\nconst DiffToken = memo(({ token, index, enableCodeApply, isDarkMode }: DiffTokenProps): JSX.Element => {\n const { isStreaming, streamingConversations, currentConversationId,\n currentMessages, addMessageToConversation, setStreamedContentMap,\n removeStreamingConversation, setIsStreaming } = useChatContext();\n const { checkedKeys, addFilesToContext } = useFolderContext();\n // Generate a unique ID once when the component mounts\n const [diffId] = useState(() =>\n `diff-${Math.random().toString(36).substring(2, 9)}-${Date.now()}`);\n const contentRef = useRef<string | null>(null);\n const [isCheckingFiles, setIsCheckingFiles] = useState(false);\n const hasCheckedFilesRef = useRef(false);\n const checkTimeoutRef = useRef<NodeJS.Timeout>();\n const [needsContextEnhancement, setNeedsContextEnhancement] = useState(false);\n const [missingFilesList, setMissingFilesList] = useState<string[]>([]);\n const lastTokenLengthRef = useRef(0);\n const hasCheckedAfterStreamingRef = useRef(false);\n\n // Check for missing files after streaming completes if we haven't checked yet\n useEffect(() => {\n if (!streamingConversations.has(currentConversationId) &&\n !hasCheckedAfterStreamingRef.current &&\n !hasCheckedFilesRef.current &&\n token.text.includes('diff --git')) {\n\n console.log('🔄 CONTEXT_ENHANCEMENT: Checking after streaming completed');\n hasCheckedAfterStreamingRef.current = true;\n\n const checkAfterStreaming = async () => {\n const referencedFiles = extractAllFilesFromDiff(token.text);\n console.log('🔄 CONTEXT_ENHANCEMENT: Files extracted from diff:', referencedFiles);\n if (referencedFiles.length > 0) {\n const currentFiles = Array.from(checkedKeys).map(String);\n const response = checkFilesInContext(referencedFiles, currentFiles);\n console.log('🔄 CONTEXT_ENHANCEMENT: API response after streaming for files', referencedFiles, ':', response);\n if (response.missingFiles.length > 0) {\n await addFilesToContext(response.missingFiles);\n setMissingFilesList(response.missingFiles);\n setNeedsContextEnhancement(true);\n console.log('🔄 CONTEXT_ENHANCEMENT: Set overlay after streaming for missing files:', response.missingFiles);\n }\n }\n };\n\n checkAfterStreaming();\n }\n }, [streamingConversations, currentConversationId, token.text, addFilesToContext]);\n\n // Debounced check function\n const debouncedCheck = useCallback((checkFn: () => Promise<void>) => {\n if (checkTimeoutRef.current) clearTimeout(checkTimeoutRef.current);\n checkTimeoutRef.current = setTimeout(checkFn, 500); // Wait 500ms for diff to stabilize\n }, []);\n\n // Check if referenced files are in context when diff is rendered during streaming\n useEffect(() => {\n const checkMissingFiles = async () => {\n if (!token.text || hasCheckedFilesRef.current || isCheckingFiles) return;\n\n // Check streaming state more comprehensively\n const isCurrentlyStreaming = streamingConversations.has(currentConversationId);\n\n // Only log when we actually find something interesting\n if (!isCurrentlyStreaming) return;\n\n // Only check during active streaming to avoid interrupting completed responses\n if (!isCurrentlyStreaming) {\n return;\n }\n\n const referencedFiles = extractAllFilesFromDiff(token.text);\n if (referencedFiles.length === 0) return;\n\n console.log('🔄 CONTEXT_ENHANCEMENT: Checking files in diff:', referencedFiles);\n\n // Mark as checked BEFORE doing the work to prevent race conditions\n hasCheckedFilesRef.current = true;\n setIsCheckingFiles(true);\n \n try {\n const currentFiles = Array.from(checkedKeys).map(String);\n const response = checkFilesInContext(referencedFiles, currentFiles);\n console.log('🔄 CONTEXT_ENHANCEMENT: API response:', response);\n const { missingFiles } = response;\n\n if (missingFiles.length > 0) {\n console.log('🔄 CONTEXT_ENHANCEMENT: Missing files detected:', missingFiles);\n\n // Add files to context using the proper context method\n await addFilesToContext(missingFiles);\n\n // Instead of interrupting, show enhancement overlay\n setMissingFilesList(missingFiles);\n setNeedsContextEnhancement(true);\n } else {\n console.log('🔄 CONTEXT_ENHANCEMENT: No missing files found, all referenced files are already in context');\n }\n } catch (error) {\n console.error('Error checking missing files:', error);\n } finally {\n setIsCheckingFiles(false);\n }\n };\n\n // Only trigger if token content has significantly grown (to avoid spam)\n const currentLength = token.text.length;\n const lengthGrowth = currentLength - lastTokenLengthRef.current;\n lastTokenLengthRef.current = currentLength;\n\n // Only check if content has grown significantly or if streaming completed\n if (lengthGrowth > 200 || !streamingConversations.has(currentConversationId)) {\n if (streamingConversations.has(currentConversationId)) {\n debouncedCheck(checkMissingFiles);\n } else if (!hasCheckedFilesRef.current) {\n } else if (!hasCheckedFilesRef.current) {\n checkMissingFiles();\n }\n }\n }, [token.text.length, currentConversationId, streamingConversations, isCheckingFiles]);\n\n // Restart stream with enhanced context\n const restartStreamWithFiles = async (addedFiles: string[]) => {\n try {\n console.log('🔄 CONTEXT_ENHANCEMENT: Starting stream restart process');\n\n // First, explicitly abort the current stream\n document.dispatchEvent(new CustomEvent('abortStream', {\n detail: { conversationId: currentConversationId }\n }));\n\n // Wait a moment for the stream to be aborted\n await new Promise(resolve => setTimeout(resolve, 200));\n\n // Use the imported function\n const allCurrentFiles = Array.from(checkedKeys).map(String);\n console.log('🔄 CONTEXT_ENHANCEMENT: Restarting with files:', { added: addedFiles, total: allCurrentFiles.length });\n await restartStreamWithEnhancedContext(currentConversationId, addedFiles, allCurrentFiles);\n\n // Show subtle notification\n message.info({\n content: `Added missing files: ${addedFiles.join(', ')}. Restarting with enhanced context...`,\n duration: 3,\n key: `context-enhanced-${currentConversationId}`\n });\n } catch (error) {\n console.error('Error restarting stream with enhanced context:', error);\n console.error('🔄 CONTEXT_ENHANCEMENT: Failed to restart stream:', error);\n\n // Show fallback message\n message.warning({\n content: `Added files to context: ${addedFiles.join(', ')}. Please retry your request to use the enhanced context.`,\n duration: 8,\n key: `context-enhanced-fallback-${currentConversationId}`\n });\n\n // Reset the checking state so the diff can render normally\n setIsCheckingFiles(false);\n }\n };\n\n // Reset check flag when conversation changes\n useEffect(() => {\n hasCheckedFilesRef.current = false;\n hasCheckedAfterStreamingRef.current = false;\n setNeedsContextEnhancement(false);\n setMissingFilesList([]);\n // Clear any pending timeouts\n if (checkTimeoutRef.current) {\n clearTimeout(checkTimeoutRef.current);\n }\n return () => {\n if (checkTimeoutRef.current) clearTimeout(checkTimeoutRef.current);\n };\n }, [currentConversationId]);\n\n // Clean up any MATH_INLINE expansions that might have slipped through\n const cleanedText = useMemo(() => {\n if (!token.text) return '';\n // Replace any MATH_INLINE expansions with their original form\n return token.text.replace(/⟨MATH_INLINE:(\\d+)⟩/g, '$$1');\n }, [token.text]);\n\n // Store the content in a ref to avoid re-renders\n useEffect(() => {\n if (!contentRef.current || contentRef.current !== cleanedText) {\n contentRef.current = cleanedText;\n }\n }, [currentConversationId]);\n\n // Function to retry with enhanced context\n const retryWithEnhancedContext = async () => {\n setNeedsContextEnhancement(false);\n try {\n const allCurrentFiles = Array.from(checkedKeys).map(String);\n await restartStreamWithEnhancedContext(currentConversationId, missingFilesList, allCurrentFiles);\n\n message.success({\n content: `Retrying with enhanced context including: ${missingFilesList.join(', ')}`,\n duration: 3,\n key: `context-retry-${currentConversationId}`\n });\n } catch (error) {\n console.error('Error retrying with enhanced context:', error);\n message.error('Failed to retry with enhanced context. Please try your request again.');\n }\n };\n\n // Show context enhancement overlay when files are missing\n const contextEnhancementOverlay = (isCheckingFiles || needsContextEnhancement) ? (\n <div style={{\n position: 'relative', width: '100%', \n backgroundColor: needsContextEnhancement ? 'rgba(255,193,7,0.9)' : 'rgba(0,0,0,0.7)', \n color: needsContextEnhancement ? '#000' : 'white',\n padding: '12px', textAlign: 'center',\n borderRadius: '4px'\n }}>\n {isCheckingFiles ? (\n '🔄 Checking context...'\n ) : needsContextEnhancement ? (\n <div>\n <div style={{ marginBottom: '8px' }}>\n ⚠️ This diff references files not in context: <strong>{missingFilesList.join(', ')}</strong>\n </div>\n <Button \n type=\"primary\" \n size=\"small\" \n onClick={retryWithEnhancedContext}\n style={{ backgroundColor: '#52c41a', borderColor: '#52c41a' }}\n >\n Retry with Enhanced Context\n </Button>\n </div>\n ) : null}\n </div>\n ) : null;\n\n\n return (\n <div>\n {contextEnhancementOverlay}\n <DiffViewWrapper\n token={{ ...token, text: cleanedText }}\n index={index}\n elementId={diffId}\n enableCodeApply={enableCodeApply}\n isStreaming={isStreaming}\n />\n </div>\n );\n});\n\ninterface DiffViewWrapperProps {\n token: TokenWithText;\n enableCodeApply: boolean;\n isStreaming?: boolean;\n forceRender?: boolean;\n index?: number;\n elementId?: string;\n}\n\nconst DiffViewWrapper = memo(({ token, enableCodeApply, index, elementId }: DiffViewWrapperProps) => {\n const [viewType, setViewType] = useState<'unified' | 'split'>(window.diffViewType || 'unified');\n const [showLineNumbers, setShowLineNumbers] = useState<boolean>(window.diffShowLineNumbers || false);\n const [displayMode, setDisplayMode] = useState<DisplayMode>(window.diffDisplayMode || 'pretty');\n const [isVisible, setIsVisible] = useState<boolean>(true);\n const [currentContent, setCurrentContent] = useState<string>(token.text || '');\n const lastValidDiffRef = useRef<string | null>(null);\n const { isStreaming: isGlobalStreaming } = useChatContext();\n const { isDarkMode } = useTheme();\n const initialFileTitleRef = useRef<string | null>(null);\n const stableElementIdRef = useRef(elementId);\n const isStreamingRef = useRef<boolean>(false);\n const streamingContentRef = useRef<string>(token.text || '');\n const parseTimeoutRef = useRef<number | null>(null);\n // Track component visibility\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Extract file title early from the diff content, even during streaming\n const extractFileTitle = useCallback((diffContent: string): string => {\n if (!diffContent) return '';\n\n const lines = diffContent.split('\\n');\n\n // Look for git diff header\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n const match = line.match(/diff --git a\\/(.*?) b\\/(.*?)$/);\n if (match) {\n return match[2] || match[1]; // Prefer new path, fallback to old path\n }\n }\n // Look for unified diff headers\n if (line.startsWith('+++ b/')) {\n return line.substring(6);\n }\n if (line.startsWith('--- a/')) {\n return line.substring(6);\n }\n }\n\n return 'Unknown file';\n }, []);\n\n useEffect(() => {\n const observer = new IntersectionObserver(([entry]) => {\n setIsVisible(entry.isIntersecting);\n }, { threshold: 0.01, rootMargin: '200px 0px' });\n\n if (containerRef.current) {\n observer.observe(containerRef.current);\n }\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Cleanup async operations\n useEffect(() => {\n return () => {\n if (parseTimeoutRef.current) {\n clearTimeout(parseTimeoutRef.current);\n }\n };\n }, []);\n\n // Ensure window settings are synced with initial state\n useEffect(() => {\n // Sync window settings with component state\n if (window.diffViewType && window.diffViewType !== viewType) {\n setViewType(window.diffViewType);\n }\n if (window.diffShowLineNumbers !== undefined && window.diffShowLineNumbers !== showLineNumbers) {\n window.diffViewType = viewType;\n }\n }, [token, viewType]);\n\n // Update content when token text changes (for streaming)\n useEffect(() => {\n if (isGlobalStreaming) {\n streamingContentRef.current = token.text || '';\n // Queue the update to allow multiple chunks to arrive\n if (parseTimeoutRef.current) {\n window.clearTimeout(parseTimeoutRef.current);\n }\n parseTimeoutRef.current = null;\n\n parseTimeoutRef.current = window.setTimeout(() => {\n setCurrentContent(token.text || '');\n parseTimeoutRef.current = null;\n }, 10); // Adjust debounce time as needed\n } else {\n setCurrentContent(token.text || '');\n streamingContentRef.current = token.text || '';\n }\n }, [token.text, isGlobalStreaming]);\n\n // Maintain last valid parsed diff\n const parsedFilesRef = useRef<any[]>([]);\n\n useEffect(() => {\n try {\n const parsed = parseDiff(normalizeGitDiff(currentContent));\n if (parsed.length > 0) {\n parsedFilesRef.current = parsed;\n lastValidDiffRef.current = currentContent;\n }\n } catch (error) {\n // Use last valid parse if available\n if (lastValidDiffRef.current) {\n try {\n parsedFilesRef.current = parseDiff(normalizeGitDiff(lastValidDiffRef.current));\n } catch (e) { }\n }\n }\n }, [currentContent]);\n\n // Get file title immediately, even during streaming\n const fileTitle = useMemo(() => {\n const extractedTitle = extractFileTitle(currentContent);\n\n // Store the first non-empty title we extract\n if (extractedTitle && extractedTitle !== 'Unknown file' && !initialFileTitleRef.current) {\n initialFileTitleRef.current = extractedTitle;\n }\n\n // During streaming, use the initial title if current extraction fails\n return (isGlobalStreaming && initialFileTitleRef.current) ? initialFileTitleRef.current : extractedTitle;\n }, [currentContent, extractFileTitle, isGlobalStreaming]);\n\n // Track streaming state in a ref to avoid re-renders\n useEffect(() => {\n isStreamingRef.current = isGlobalStreaming;\n return () => { isStreamingRef.current = false; };\n }, [isGlobalStreaming]);\n\n if (!hasText(token)) {\n return <div>Loading content...</div>;\n }\n\n if (!isCodeToken(token)) {\n return null;\n }\n\n // If we're streaming and have any parsed files, always show them\n if ((isGlobalStreaming) && parsedFilesRef.current.length > 0) {\n // Keep rendering even when not visible to maintain state\n if (!isVisible && !isGlobalStreaming) return null; // Always render during streaming\n\n return (\n <div>\n <DiffControls\n fileTitle={parsedFilesRef.current?.[0] ? parsedFilesRef.current[0].oldPath || parsedFilesRef.current[0].newPath || '' : ''}\n displayMode={displayMode}\n viewType={viewType}\n showLineNumbers={showLineNumbers}\n onDisplayModeChange={setDisplayMode}\n onViewTypeChange={setViewType}\n onLineNumbersChange={setShowLineNumbers}\n />\n <div id={`diff-view-${index || 0}`}>\n {parsedFilesRef.current.map((file, fileIndex) => (\n <DiffView\n key={`file-${fileIndex}`}\n diff={streamingContentRef.current || lastValidDiffRef.current || ''}\n viewType={viewType}\n initialDisplayMode={displayMode}\n showLineNumbers={showLineNumbers}\n fileIndex={fileIndex}\n elementId={`${stableElementIdRef.current}-file-${fileIndex}`}\n />\n ))}\n </div>\n </div>\n );\n }\n\n const diffText = currentContent; // Use the state variable for streaming support\n\n return (\n <div id={`diff-view-wrapper-${stableElementIdRef.current}`}>\n <DiffControls\n displayMode={displayMode}\n viewType={viewType}\n showLineNumbers={showLineNumbers && !isStreamingRef.current}\n onDisplayModeChange={setDisplayMode}\n onViewTypeChange={setViewType}\n onLineNumbersChange={setShowLineNumbers}\n fileTitle={fileTitle}\n />\n <div\n ref={containerRef}\n className=\"diff-container\"\n id={`diff-view-wrapper-${stableElementIdRef.current}`}\n style={{\n // overflowX: viewType === 'split' ? 'auto' : 'hidden',\n /* maxWidth: '100%' */\n }}>\n {(displayMode as DisplayMode) === 'raw' ? (\n <pre className=\"diff-raw-block\" style={{\n padding: '16px',\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n color: isDarkMode ? '#e6e6e6' : 'inherit' // Add theme text color\n }}>\n <code>{diffText}</code>\n </pre>\n ) : (\n <DiffView\n diff={diffText}\n viewType={viewType}\n initialDisplayMode={displayMode}\n key={stableElementIdRef.current}\n forceRender={isGlobalStreaming} // Force render during streaming\n elementId={stableElementIdRef.current!}\n showLineNumbers={showLineNumbers}\n />\n )}\n </div>\n </div>\n );\n}, (prev, next) => !next.forceRender && prev.token.text === next.token.text && prev.enableCodeApply === next.enableCodeApply);\n\ninterface CodeBlockProps {\n token: TokenWithText;\n index: number;\n}\n\nconst CodeBlock: React.FC<CodeBlockProps> = ({ token, index }) => {\n const tokenRef = useRef<TokenWithText>(token);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Stable reference to prevent unnecessary re-renders\n const stableToken = useMemo(() => token, [token.text, token.lang, token.type]);\n\n const [isLanguageLoaded, setIsLanguageLoaded] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n const { isDarkMode } = useTheme();\n const [prismInstance, setPrismInstance] = useState<typeof PrismType | null>(null);\n const [debugInfo, setDebugInfo] = useState<any>({});\n const renderCountRef = useRef(0);\n\n const { isStreaming: isGlobalStreaming } = useChatContext();\n\n // Normalize the language identifier\n const normalizedLang = useMemo(() => {\n if (!token.lang) return 'plaintext';\n // Map 'typescript jsx' to 'tsx' since we know tsx highlighting works\n if (token.lang === 'typescript jsx') {\n return 'tsx';\n }\n return token.lang;\n }, [token.lang]);\n\n // Get the highlighted code callback \n const getHighlightedCode = useCallback((content: string): string => {\n // Ensure content is a string\n const codeToHighlight = typeof content === 'string' ? content : '';\n\n // If not loaded yet, or no content, return escaped text\n if (!isLanguageLoaded || !prismInstance || !codeToHighlight) {\n return codeToHighlight.replace(/</g, '<').replace(/>/g, '>');\n }\n\n // Get the grammar, fallback to plaintext if specific language not found\n const grammar = prismInstance.languages[normalizedLang] || prismInstance.languages.plaintext;\n\n if (!grammar) {\n console.warn(`Grammar not found for ${normalizedLang}, rendering plain text.`);\n // Fallback to basic escaping if even plaintext grammar is missing (shouldn't happen)\n return codeToHighlight.replace(/</g, '<').replace(/>/g, '>');\n }\n\n try {\n // Perform the highlighting\n return prismInstance.highlight(codeToHighlight, grammar, normalizedLang);\n } catch (error) {\n console.warn(`Highlighting failed for language ${normalizedLang}:`, error);\n // Fallback to basic escaping on highlighting error\n return codeToHighlight.replace(/</g, '<').replace(/>/g, '>');\n }\n }, [normalizedLang, isLanguageLoaded, prismInstance]);\n\n // Function to highlight code and update DOM directly\n const highlightCodeIfNeeded = useCallback(() => {\n if (!contentRef.current || !isLanguageLoaded || !prismInstance) return;\n\n const content = tokenRef.current.text || '';\n const highlighted = getHighlightedCode(content);\n\n // Only update DOM if content has changed\n if (contentRef.current.innerHTML !== highlighted) {\n contentRef.current.innerHTML = highlighted;\n contentRef.current.style.visibility = 'visible';\n // Debug log for streaming updates\n if (content.endsWith('\\n') || content.includes('```')) {\n console.debug('Streaming code update:', {\n language: normalizedLang,\n contentLength: content.length,\n isPartial: content.endsWith('\\n')\n });\n }\n }\n }, [getHighlightedCode, isLanguageLoaded, normalizedLang, prismInstance]);\n\n // Store token in ref to avoid unnecessary re-renders\n useEffect(() => {\n // Only update if content actually changed\n if (tokenRef.current.text !== token.text || tokenRef.current.lang !== token.lang) {\n tokenRef.current = token;\n if (contentRef.current) highlightCodeIfNeeded();\n }\n }, [token.text, token.lang, highlightCodeIfNeeded]);\n\n // Remove the effect that was causing continuous re-renders\n /*\n useEffect(() => {\n tokenRef.current = token;\n if (contentRef.current) highlightCodeIfNeeded();\n }, [token, highlightCodeIfNeeded]);\n */\n\n useEffect(() => {\n if (token.lang !== undefined && !prismInstance) {\n const loadLanguage = async () => {\n setIsLanguageLoaded(false);\n try {\n console.debug('CodeBlock language info:', {\n originalLang: token.lang,\n effectiveLang: getEffectiveLang(token.lang),\n tokenType: token.type,\n prismLoaded: Boolean(window.Prism),\n availableLanguages: window.Prism ? Object.keys(window.Prism.languages) : [],\n tokenContent: token.text.substring(0, 100) + '...'\n });\n // Load language and get Prism instance\n await loadPrismLanguage(normalizedLang);\n setPrismInstance(window.Prism);\n const effectiveLang = getEffectiveLang(token.lang);\n setDebugInfo({\n loadedLang: token.lang,\n prismAvailable: Boolean(window.Prism),\n languagesAfterLoad: window.Prism ? Object.keys(window.Prism.languages) : [],\n grammarAvailable: window.Prism?.languages[effectiveLang] ? true : false\n });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n setLoadError(`Error loading language ${normalizedLang}: ${errorMessage}`);\n console.error(`Error loading language ${normalizedLang}:`, error);\n } finally {\n setIsLanguageLoaded(true);\n }\n };\n loadLanguage();\n } else {\n setIsLanguageLoaded(true);\n }\n }, [normalizedLang]);\n\n // Check if this should be a tool block instead\n if (token.lang?.startsWith('tool:')) {\n const toolName = token.lang.substring(5);\n console.log('🔧 CodeBlock redirecting to ToolBlock:', toolName);\n return <ToolBlock toolName={toolName} content={token.text || ''} isDarkMode={isDarkMode} />;\n }\n\n // Remove debug logging that was causing performance overhead\n\n // Get the effective language for highlighting\n const getEffectiveLang = (rawLang: string | undefined): string => {\n if (!rawLang) return 'plaintext';\n if (rawLang === 'typescript jsx') return 'tsx';\n return rawLang;\n };\n\n const highlightedHtml = getHighlightedCode(tokenRef.current.text || '');\n\n if (!isLanguageLoaded) {\n return (\n <pre style={{\n visibility: isGlobalStreaming ? 'visible' : 'hidden',\n padding: '16px',\n borderRadius: '6px',\n overflow: 'auto',\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n border: `1px solid ${isDarkMode ? '#303030' : '#e1e4e8'}`\n }}>\n <code>{token.text}</code>\n </pre>\n );\n }\n\n // Only escape if the content isn't already escaped\n return (\n <ErrorBoundary type=\"code\">\n <pre\n style={{\n padding: '16px',\n borderRadius: '6px',\n overflow: 'auto',\n visibility: 'visible',\n backgroundColor: isDarkMode ? '#1f1f1f' : '#f6f8fa',\n border: `1px solid ${isDarkMode ? '#303030' : '#e1e4e8'}`\n }}\n className={`language-${normalizedLang}`}\n >\n <code\n style={{\n textShadow: 'none',\n visibility: 'visible',\n color: isDarkMode ? '#e6e6e6' : '#24292e'\n }}\n ref={contentRef}\n dangerouslySetInnerHTML={{ __html: highlightedHtml }}\n />\n </pre>\n </ErrorBoundary>\n );\n};\n\n// Define the possible determined types\ntype DeterminedTokenType = 'diff' | 'graphviz' | 'vega-lite' |\n 'd3' | 'mermaid' | 'file-operation' | 'tool' |\n 'code' | 'html' | 'text' | 'list' | 'table' | 'escape' | 'math' |\n 'paragraph' | 'heading' | 'hr' | 'blockquote' | 'space' |\n 'codespan' | 'strong' | 'em' | 'del' | 'link' | 'image' |\n 'br' | 'list_item' |\n 'unknown';\n\n// Track last log timestamp to prevent excessive logging\nlet lastLogTimestamp = 0;\n\n// Helper function to determine the definitive type of a token\nfunction determineTokenType(token: Tokens.Generic | TokenWithText): DeterminedTokenType {\n const tokenType = token.type as string;\n\n // 1. Prioritize content-based detection for diffs, regardless of lang tag\n if (tokenType === 'code' && 'text' in token && typeof token.text === 'string') {\n const text = token.text;\n\n // Check first few lines for diff markers\n const linesToCheck = text.split('\\n').slice(0, 5);\n\n const hasGitHeader = linesToCheck.some(line => line.trim().startsWith('diff --git '));\n const hasMinusHeader = linesToCheck.some(line => line.trim().startsWith('--- a/'));\n const hasPlusHeader = linesToCheck.some(line => line.trim().startsWith('+++ b/'));\n const hasHunkHeader = linesToCheck.some(line => {\n const trimmed = line.trim();\n return trimmed.startsWith('@@') && trimmed.match(/^@@\\s+-\\d+/);\n });\n const diffMarkersFound = [hasGitHeader, hasMinusHeader, hasPlusHeader, hasHunkHeader].filter(Boolean).length;\n\n // More lenient check for diff --git, allowing it not to be the very first thing\n const containsDiffGit = text.includes('diff --git');\n\n // Only log when debug logging is enabled\n if (isDebugLoggingEnabled() && false) {\n debugLog('Diff markers analysis:', {\n hasGitHeader,\n hasMinusHeader,\n hasPlusHeader,\n hasHunkHeader,\n diffMarkersFound,\n containsDiffGit,\n shouldBeDiff: containsDiffGit || diffMarkersFound >= 2\n });\n }\n\n if (containsDiffGit || diffMarkersFound >= 2) {\n if (isDebugLoggingEnabled()) {\n debugLog('DETECTED AS DIFF (content-based)');\n }\n return 'diff';\n }\n }\n\n // 2. Handle Code Blocks with explicit lang tags\n if (tokenType === 'code' && 'lang' in token && typeof token.lang === 'string' && token.lang) {\n const lang = token.lang.toLowerCase().trim();\n\n // Only log when debug logging is enabled and only for debugging specific issues\n if (isDebugLoggingEnabled() && false) {\n debugLog('Processing code block with lang:', lang);\n debugLog('determineTokenType - Code block with lang:', lang, 'tokenType:', tokenType);\n debugLog('Code block detected with lang:', lang, 'content preview:', (token as TokenWithText).text?.substring(0, 50));\n }\n\n // Check for MCP tool blocks first\n if (lang.startsWith('tool:mcp_')) {\n const toolName = lang.substring(5); // Remove 'tool:' prefix to get 'mcp_...'\n (token as TokenWithText).toolName = toolName;\n // Only log when debug logging is enabled\n if (isDebugLoggingEnabled()) {\n debugLog('MCP tool block detected:', toolName);\n }\n return 'tool';\n }\n if (lang.startsWith('tool:')) {\n const toolName = lang.substring(5); // Remove 'tool:' prefix\n (token as TokenWithText).toolName = toolName;\n // Only log when debug logging is enabled\n if (isDebugLoggingEnabled()) {\n debugLog('Tool block detected:', toolName);\n }\n return 'tool';\n }\n\n // Check for JSON code blocks that might contain Vega-Lite specs\n if (lang === 'json' && 'text' in token && typeof token.text === 'string') {\n const text = token.text.trim();\n if (text.startsWith('{') && (text.includes('\"$schema\"') || text.includes('\"mark\"'))) {\n try {\n const parsed = JSON.parse(text);\n if (parsed.$schema?.includes('vega-lite') ||\n (parsed.mark && (parsed.encoding || parsed.data)) ||\n (parsed.data && (parsed.mark || parsed.layer || parsed.concat || parsed.facet || parsed.repeat))) {\n return 'vega-lite';\n }\n } catch (error) {\n // Not valid JSON, continue with other checks\n }\n }\n }\n\n if (lang === 'mermaid') return 'mermaid'; // Check mermaid FIRST\n if (lang === 'diff') {\n console.log('✅ MarkdownRenderer - DETECTED AS DIFF (lang tag)');\n return 'diff';\n }\n if (lang === 'graphviz' || lang === 'dot') return 'graphviz';\n if (lang === 'vega-lite' || lang === 'vegalite') return 'vega-lite';\n if (lang === 'vega-lite') return 'vega-lite';\n if (lang === 'd3') return 'd3';\n // If it has a specific lang tag but isn't special, it's 'code'\n return 'code';\n }\n\n // 2. Content-based detection for code blocks *without* specific lang tags\n if (tokenType === 'code' && 'text' in token && typeof token.text === 'string') {\n const text = token.text;\n const trimmedText = text.trim();\n\n // Enhanced tool block detection by content\n // Look for tool block markers that might have been missed by lang detection\n if (trimmedText.startsWith('```tool:mcp_') ||\n trimmedText.includes('```tool:mcp_') ||\n (trimmedText.startsWith('$ ') && trimmedText.length > 10) ||\n trimmedText.match(/^[A-Z_]+:\\s*\\S+/) || // Environment variables or command outputs\n trimmedText.includes('🔧') ||\n trimmedText.includes('🛠️')) {\n\n // Try to extract tool name from content\n const toolMatch = trimmedText.match(/```?tool:(mcp_\\w+)/);\n const toolName = toolMatch ? toolMatch[1] : 'mcp_run_shell_command';\n (token as TokenWithText).toolName = toolName;\n (token as TokenWithText).lang = `tool:${toolName}`;\n return 'tool';\n }\n }\n\n if (tokenType === 'code' && 'text' in token && typeof token.text === 'string') {\n const text = token.text;\n const trimmedText = text.trim();\n\n // Check for tool blocks by content if lang detection failed\n if (trimmedText.startsWith('$ ') || trimmedText.includes('🔧') || trimmedText.includes('🛠️')) {\n // This might be a tool result that wasn't properly tagged\n console.log('Potential tool content detected without proper lang tag:', trimmedText.substring(0, 50));\n // Try to infer tool type from content\n (token as TokenWithText).toolName = trimmedText.startsWith('$ ') ? 'mcp_run_shell_command' : 'unknown_tool';\n return 'tool';\n }\n\n // Check for Vega-Lite JSON specifications with better error handling\n if (trimmedText.startsWith('{')) {\n try {\n const parsed = JSON.parse(trimmedText);\n // Check for Vega-Lite schema or typical Vega-Lite structure\n if (parsed.$schema?.includes('vega-lite') ||\n (parsed.mark && (parsed.encoding || parsed.data)) ||\n (parsed.data && (parsed.mark || parsed.layer || parsed.concat || parsed.facet || parsed.repeat))) {\n return 'vega-lite';\n }\n } catch (error) {\n // Not valid JSON, continue with other checks\n console.debug(\"JSON parse failed for potential Vega-Lite:\", error);\n }\n }\n\n // Check if this is a diff block by looking for diff marker\n if (text.startsWith('diff') || text.includes('\\ndiff')) {\n return 'diff';\n }\n\n // Check for file operations (apply blocks)\n if (text.includes('<apply>') && text.includes('</apply>')) {\n return 'file-operation';\n }\n\n // Strict Graphviz check\n // Look for 'digraph' or 'graph' followed by an identifier and '{'\n // Allows for optional whitespace and comments before the opening brace\n const graphvizRegex = /^\\s*(?:strict\\s+)?(digraph|graph)\\s+\\w*\\s*\\{/i;\n if (graphvizRegex.test(trimmedText)) {\n return 'graphviz';\n }\n // Fallback for simpler cases (might be less reliable)\n if (trimmedText.startsWith('digraph') ||\n (trimmedText.startsWith('graph') && trimmedText.match(/^graph\\s+\\w*\\s*\\{/))) {\n return 'graphviz';\n }\n // Check for diff content more robustly within the first few lines\n const linesToCheck = text.split('\\n').slice(0, 5); // Check first 5 lines for diff markers\n const hasGitHeader = linesToCheck.some(line => line.trim().startsWith('diff --git '));\n const hasMinusHeader = linesToCheck.some(line => line.trim().startsWith('--- a/'));\n const hasPlusHeader = linesToCheck.some(line => line.trim().startsWith('+++ b/'));\n const hasHunkHeader = linesToCheck.some(line => {\n const trimmed = line.trim();\n return trimmed.startsWith('@@') && trimmed.match(/^@@\\s+-\\d+/);\n });\n\n // Check for common valid diff starting patterns\n // Require at least two characteristic lines for content-based detection\n const diffMarkersFound = [hasGitHeader, hasMinusHeader, hasPlusHeader, hasHunkHeader].filter(Boolean).length;\n if (diffMarkersFound >= 2) {\n return 'diff';\n }\n // If no special content detected, treat as generic code\n return 'code';\n }\n\n // 3. Map other standard marked token types directly\n // Add more types from marked.Tokens here as needed\n const knownTypes: DeterminedTokenType[] = [\n 'paragraph', 'heading', 'hr', 'blockquote', 'list', 'list_item', 'table', 'escape',\n 'html', 'text', 'space', 'codespan', 'strong', 'em', 'del', 'link',\n 'image', 'br'\n ];\n if (knownTypes.includes(tokenType as DeterminedTokenType)) {\n return tokenType as DeterminedTokenType;\n }\n\n // Fallback for unknown types\n console.warn(\"Unknown token type encountered:\", tokenType, token);\n return 'unknown';\n}\n\n// Helper function to decode HTML entities using the browser's capabilities\nconst decodeHtmlEntities = (text: string): string => {\n if (typeof document === 'undefined') {\n // Basic fallback for server-side or environments without DOM\n return text.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/\"/g, '\"').replace(/'/g, \"'\");\n }\n\n // Use a more controlled approach to avoid false entity decoding\n // Only decode known HTML entities to prevent issues like ¶m becoming ¶m\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&#39;/g, \"'\")\n .replace(/&#x27;/g, \"'\")\n .replace(/&#x60;/g, '`')\n .replace(/&#x3D;/g, '=')\n .replace(/&nbsp;/g, ' ')\n .replace(/&copy;/g, '©')\n .replace(/&reg;/g, '®')\n .replace(/&trade;/g, '™');\n};\n\nconst renderTokens = (tokens: (Tokens.Generic | TokenWithText)[], enableCodeApply: boolean, isDarkMode: boolean, isSubRender: boolean = false, isStreaming: boolean = false, thinkingContentRef?: React.MutableRefObject<string>): React.ReactNode => {\n // Only log when debug logging is enabled and not too frequently\n const shouldLog = isDebugLoggingEnabled() &&\n (Date.now() - lastLogTimestamp > 10000);\n\n if (shouldLog && tokens.length > 0) {\n lastLogTimestamp = Date.now();\n debugLog(`Processing ${tokens.length} tokens`);\n }\n\n return tokens.map((token, index) => {\n const previousToken = index > 0 ? tokens[index - 1] : null;\n // Determine the definitive type for rendering\n const determinedType = determineTokenType(token);\n const tokenWithText = token as TokenWithText; // Helper cast\n\n // Only log tool tokens when debug logging is enabled\n if (isDebugLoggingEnabled() &&\n index === 0 &&\n (token as any).lang?.startsWith('tool:')) {\n debugLog(`Tool token detected: ${(token as any).lang}`);\n }\n\n // Override code detection if this token follows a tool token\n if (determinedType === 'code' && previousToken) {\n const prevTokenWithText = previousToken as TokenWithText;\n if (prevTokenWithText.toolName || (prevTokenWithText.lang && prevTokenWithText.lang.startsWith('tool:'))) {\n // This token follows a tool - check if it should really be treated as regular text/paragraph\n if (!tokenWithText.text?.startsWith('```') && !tokenWithText.text?.startsWith(' ')) {\n // Force this to be treated as markdown instead of code\n return (\n <div key={index}>\n <MarkdownRenderer\n markdown={tokenWithText.text || ''}\n enableCodeApply={enableCodeApply}\n isStreaming={isStreaming}\n />\n </div>\n );\n }\n }\n }\n\n try {\n switch (determinedType) {\n case 'diff':\n // Only log when debug logging is enabled and only for debugging\n if (isDebugLoggingEnabled() && false) {\n debugLog('Rendering DIFF token');\n }\n const rawDiffText = tokenWithText.text || '';\n // Apply cleaning specific to diff content AFTER decoding\n const cleanedDiff = cleanDiffContent(rawDiffText);\n // Ensure lang is set to 'diff' for the component\n const diffToken = { ...tokenWithText, text: cleanedDiff, lang: 'diff' };\n // Only log when debug logging is enabled and only for debugging\n if (isDebugLoggingEnabled() && false) {\n debugLog('Created diffToken:', {\n hasText: !!diffToken.text,\n textLength: diffToken.text?.length,\n lang: diffToken.lang,\n textPreview: diffToken.text?.substring(0, 100) + '...'\n });\n }\n\n // Check if this is a multi-file diff and not already a sub-render\n if (!isSubRender) {\n const fileDiffs = splitMultiFileDiffs(cleanedDiff);\n if (fileDiffs.length > 1) {\n console.log('🎨 MarkdownRenderer - Rendering multi-file diff');\n return renderMultiFileDiff(diffToken, index, enableCodeApply, isDarkMode);\n }\n }\n\n // Only log when debug logging is enabled and only for debugging\n if (isDebugLoggingEnabled() && false) {\n debugLog('Rendering single DiffToken component');\n }\n return <DiffToken key={index} token={diffToken} index={index} enableCodeApply={enableCodeApply} isDarkMode={isDarkMode} />;\n\n case 'file-operation':\n if (!hasText(tokenWithText) || !tokenWithText.text?.trim()) return null;\n\n const safetyResult = renderFileOperationSafely(tokenWithText.text);\n if (safetyResult.shouldRender) {\n return (\n <FileOperationRenderer\n key={index}\n content={tokenWithText.text}\n enableApply={enableCodeApply}\n />\n );\n }\n // Fall through to code block if invalid\n return <CodeBlock token={{ ...tokenWithText, text: safetyResult.safeContent, lang: 'xml' }} index={index} />;\n\n case 'graphviz':\n if (!hasText(tokenWithText) || !tokenWithText.text?.trim()) return null;\n return (\n <D3Renderer\n spec={{\n type: 'graphviz',\n isStreaming: isStreaming,\n definition: token.text,\n isMarkdownBlockClosed: true,\n timestamp: Date.now(), // Add timestamp to force re-renders\n forceRender: true // Force render even if incomplete\n }}\n type=\"d3\" isStreaming={isStreaming}\n />\n );\n case 'mermaid':\n if (!hasText(tokenWithText) || !tokenWithText.text?.trim()) return null;\n // Only log when debug logging is enabled and only for debugging\n if (isDebugLoggingEnabled() && false) {\n debugLog(`CREATING MERMAID SPEC:`, { text: tokenWithText.text.substring(0, 100) });\n }\n // Pass the definition directly to D3Renderer, which will use the mermaidPlugin\n // We need a spec object that the mermaidPlugin can handle with streaming flag\n const mermaidSpec = {\n type: 'mermaid',\n definition: tokenWithText.text,\n isStreaming: isStreaming,\n isMarkdownBlockClosed: true,\n timestamp: Date.now(), // Add timestamp to force re-renders\n forceRender: true // Force render even if incomplete\n };\n console.log(`🎯 CALLING D3RENDERER WITH MERMAID SPEC:`, mermaidSpec);\n return <D3Renderer key={index} spec={mermaidSpec} type=\"d3\" isStreaming={isStreaming} />;\n case 'vega-lite':\n if (!hasText(tokenWithText)) return null;\n\n let vegaLiteSpec: any;\n try {\n // Parse the JSON specification\n const parsedSpec = JSON.parse(tokenWithText.text);\n\n // Create the spec object for D3Renderer\n vegaLiteSpec = {\n type: 'vega-lite',\n ...parsedSpec, // Spread the parsed JSON\n isStreaming: isStreaming,\n forceRender: true\n };\n\n } catch (error) {\n // If parsing fails, treat as definition string\n vegaLiteSpec = {\n type: 'vega-lite',\n definition: tokenWithText.text,\n isStreaming: isStreaming,\n forceRender: true\n };\n }\n\n return (\n <D3Renderer\n key={index}\n spec={vegaLiteSpec}\n type=\"d3\"\n isStreaming={isStreaming}\n />\n );\n\n case 'tool':\n if (!hasText(tokenWithText) || !tokenWithText.toolName) {\n console.warn('Tool token missing toolName or text:', { hasText: hasText(tokenWithText), toolName: tokenWithText.toolName });\n return null;\n }\n\n // Check for security errors in tool output and render them prominently\n const isSecurityError = tokenWithText.text && (\n tokenWithText.text.includes('🚫 SECURITY BLOCK') ||\n tokenWithText.text.includes('Command not allowed') ||\n tokenWithText.text.includes('COMMAND BLOCKED') ||\n (tokenWithText.text.includes(\"'error': True\") && tokenWithText.text.includes('SECURITY BLOCK'))\n );\n\n if (isSecurityError) {\n // Extract the actual message from Python dict format\n let errorMessage = tokenWithText.text;\n const pythonDictMatch = tokenWithText.text.match(/\\{'error': True, 'message': \"([^\"]*(?:\\\\.[^\"]*)*)\"/);\n if (pythonDictMatch) {\n errorMessage = pythonDictMatch[1].replace(/\\\\n/g, '\\n').replace(/^🚫 SECURITY BLOCK:\\s*/, '');\n }\n return (\n <Alert key={index} message=\"🚫 Command Blocked\" description={errorMessage} type=\"warning\" showIcon style={{ margin: '16px 0', border: '2px solid #faad14', whiteSpace: 'pre-line' }} />\n );\n }\n\n // Only log successful tool rendering when debug logging is enabled\n if (isDebugLoggingEnabled()) {\n debugLog('Successfully rendering tool block:', { toolName: tokenWithText.toolName, contentLength: tokenWithText.text?.length });\n }\n return (\n <ToolBlock key={index} toolName={tokenWithText.toolName} content={tokenWithText.text} isDarkMode={isDarkMode} />\n );\n\n case 'd3':\n if (!hasText(tokenWithText)) return null;\n return (\n <D3Renderer key={index} spec={tokenWithText.text} type=\"d3\" isStreaming={isStreaming} />\n );\n\n case 'code':\n if (!isCodeToken(tokenWithText)) return null; // Type guard\n\n // Skip empty code blocks\n if (!tokenWithText.text || tokenWithText.text.trim() === '') {\n console.log('Skipping empty code block');\n return null;\n }\n\n // Add safety check for tool blocks that might have slipped through\n if (tokenWithText.lang?.startsWith('tool:')) {\n console.error('CRITICAL ERROR: Tool block reached code case!', { lang: tokenWithText.lang, determinedType });\n // Force redirect to tool rendering\n return <ToolBlock key={index} toolName={tokenWithText.lang.substring(5)} content={tokenWithText.text} isDarkMode={isDarkMode} />;\n }\n\n // Check for file operations first\n if (detectFileOperationSyntax(tokenWithText.text)) {\n const safetyResult = renderFileOperationSafely(tokenWithText.text);\n\n if (safetyResult.shouldRender) {\n return (\n <FileOperationRenderer\n key={index}\n content={tokenWithText.text}\n enableApply={enableCodeApply}\n />\n );\n } else {\n // Render as safe code block with warnings\n return (\n <div key={index}>\n {safetyResult.warnings.length > 0 && (\n <Alert\n type=\"warning\"\n message=\"File Operation Warnings\"\n description={safetyResult.warnings.join(', ')}\n style={{ marginBottom: 8 }}\n />\n )}\n <CodeBlock token={{ ...tokenWithText, text: safetyResult.safeContent }} index={index} />\n </div>\n );\n }\n }\n\n const rawCodeText = decodeHtmlEntities(tokenWithText.text || '');\n // Pass the original lang tag (or plaintext) for highlighting\n const codeToken = { ...tokenWithText, text: rawCodeText, lang: tokenWithText.lang || 'plaintext' };\n // Decode HTML entities before passing to CodeBlock\n const decodedToken = {\n ...codeToken,\n text: decodeHtmlEntities(codeToken.text)\n };\n return <CodeBlock key={index} token={decodedToken} index={index} />;\n\n // --- Handle Standard Markdown Elements ---\n case 'paragraph':\n // Render paragraph, processing inline tokens recursively\n const pTokens = (token as Tokens.Paragraph).tokens || [];\n\n // Check if any paragraph content has inline math\n const paragraphContent = pTokens.map(t => (t as TokenWithText).text || '').join('');\n if (paragraphContent.includes('⟨MATH_INLINE:')) {\n const parts = paragraphContent.split(/(⟨MATH_INLINE:[^⟩]*⟩)/);\n return <p key={index}>{parts.map((part, i) => {\n if (part.startsWith('⟨MATH_INLINE:')) {\n const math = part.replace('⟨MATH_INLINE:', '').replace('⟩', '').trim();\n return <MathRenderer key={i} math={math} displayMode={false} />;\n }\n return part || null;\n })}</p>;\n }\n\n // Filter out empty text tokens that might remain after processing\n const filteredPTokens = pTokens.filter(t => t.type !== 'text' || (t as TokenWithText).text.trim() !== '');\n if (filteredPTokens.length === 0) return null; // Don't render empty paragraphs\n return <p key={index}>{renderTokens(filteredPTokens, enableCodeApply, isDarkMode, isSubRender, isStreaming, thinkingContentRef)}</p>;\n\n case 'list':\n // Render list, processing items recursively\n const listToken = token as Tokens.List;\n const ListTag = listToken.ordered ? 'ol' : 'ul';\n return (\n <ListTag key={index} start={listToken.ordered ? (listToken.start || 1) : undefined}>\n {listToken.items.map((item, itemIndex) => (\n // Render list items using the 'list_item' case below\n <React.Fragment key={itemIndex}>\n {renderTokens([item], enableCodeApply, isDarkMode, isSubRender, isStreaming, thinkingContentRef)}\n </React.Fragment>\n ))}\n </ListTag>\n );\n\n case 'list_item':\n const listItemToken = token as Tokens.ListItem;\n\n const itemContent = renderTokens(listItemToken.tokens || [], enableCodeApply, isDarkMode, isSubRender, isStreaming, thinkingContentRef);\n\n // Handle task list items\n if (listItemToken.task) {\n return (\n <li key={index} style={{ listStyle: 'none' }}>\n <input\n type=\"checkbox\"\n checked={listItemToken.checked}\n id={`task-checkbox-${index}-${Math.random().toString(36).substring(2, 9)}`}\n name={`task-checkbox-${index}`}\n readOnly\n style={{ marginRight: '0.5em', verticalAlign: 'middle' }}\n />\n {itemContent}\n </li>\n );\n }\n // Regular list item\n return <li key={index}>{itemContent}</li>;\n\n case 'table':\n const tableToken = token as Tokens.Table;\n return (\n <table key={index} style={{ borderCollapse: 'collapse', width: '100%', marginBottom: '1em' }}>\n <thead>\n <tr>\n {tableToken.header.map((cell, cellIndex) => (\n <th key={cellIndex} style={{ borderBottom: '2px solid #ddd', padding: '8px', textAlign: tableToken.align[cellIndex] || 'left' }}>\n {renderTokens(cell.tokens || [{ type: 'text', text: cell.text }], enableCodeApply, isDarkMode)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {tableToken.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <td key={cellIndex} style={{ border: '1px solid #ddd', padding: '8px', textAlign: tableToken.align[cellIndex] || 'left' }}>\n {renderTokens(cell.tokens || [], enableCodeApply, isDarkMode)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n\n case 'html':\n if (!hasText(tokenWithText)) return null;\n\n // Handle thinking blocks - check for thinking-data tags\n if (tokenWithText.text.includes('thinking-wrapper') || tokenWithText.text.match(/<thinking-data>([\\s\\S]*?)<\\/thinking-data>/)) {\n console.log('🤔 Detected thinking-data tag in HTML token:', tokenWithText.text.substring(0, 100));\n const match = tokenWithText.text.match(/<thinking-data>([\\s\\S]*?)<\\/thinking-data>/);\n if (match) {\n const content = match[1];\n console.log('🤔 Extracted thinking content:', content.substring(0, 50) + '...');\n console.log('🤔 Returning ThinkingBlock component');\n return <ThinkingBlock key={index} isDarkMode={isDarkMode} isStreaming={isStreaming}>{content}</ThinkingBlock>;\n }\n }\n\n // Be cautious with dangerouslySetInnerHTML\n\n // List of known/safe HTML tags that we want to actually render as HTML\n const knownHtmlTags = [\n 'div', 'span', 'p', 'br', 'hr', 'strong', 'em', 'b', 'i', 'u', 's',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'ul', 'ol', 'li', 'dl', 'dt', 'dd',\n 'table', 'thead', 'tbody', 'tr', 'th', 'td',\n 'a', 'img', 'video', 'audio',\n 'blockquote', 'pre', 'code',\n 'details', 'summary',\n 'math', 'mi', 'mo', 'mn', 'mrow', 'mfrac', 'msup', 'msub', 'msubsup', 'msqrt', 'mroot',\n 'thinking-data'\n\n ];\n\n // Check if the HTML content contains only known tags\n const htmlContent = tokenWithText.text;\n\n // Check if this is a MathML element and render it inline\n if (htmlContent.match(/^<(math|mi|mo|mn|mrow|mfrac|msup|msub|msubsup|msqrt|mroot)/)) {\n const mathWithNamespace = htmlContent.includes('xmlns=')\n ? htmlContent\n : htmlContent.replace('<math', '<math xmlns=\"http://www.w3.org/1998/Math/MathML\"');\n return <span key={index} dangerouslySetInnerHTML={{ __html: mathWithNamespace }} />;\n }\n\n // Check if this is a wrapped MathML block\n if (htmlContent.includes('class=\"mathml-block\"')) {\n return <div key={index} dangerouslySetInnerHTML={{ __html: htmlContent }} />;\n }\n\n // Check for KATEX/LATEX math expressions\n if (htmlContent.includes('MATH_DISPLAY:')) {\n const mathMatch = htmlContent.match(/MATH_DISPLAY:([^<]*)/s);\n if (mathMatch) return <MathRenderer key={index} math={mathMatch[1]} displayMode={true} />;\n }\n if (htmlContent.includes('MATH_INLINE:')) {\n const mathMatch = htmlContent.match(/MATH_INLINE:([^<]*)/s);\n if (mathMatch) return <MathRenderer key={index} math={mathMatch[1]} displayMode={false} />;\n }\n\n if (htmlContent.includes('class=\"math-inline-span\"') && htmlContent.includes('MATH_INLINE:')) {\n const mathMatch = htmlContent.match(/MATH_INLINE:([^<]*)/);\n if (mathMatch) return <MathRenderer key={index} math={mathMatch[1]} displayMode={false} />;\n }\n\n const tagMatches = htmlContent.match(/<\\/?([a-zA-Z][a-zA-Z0-9]*)\\b[^>]*>/g);\n\n if (tagMatches) {\n const hasUnknownTags = tagMatches.some(tag => {\n const tagName = tag.match(/<\\/?([a-zA-Z][a-zA-Z0-9]*)/)?.[1]?.toLowerCase();\n return tagName && !knownHtmlTags.includes(tagName);\n });\n\n if (hasUnknownTags) {\n // If there are unknown tags, render as literal text\n return <span key={index}>{htmlContent}</span>;\n }\n }\n\n // If all tags are known, render as HTML\n return <div key={index} dangerouslySetInnerHTML={{ __html: decodeHtmlEntities(htmlContent) }} />;\n\n case 'text':\n if (!hasText(tokenWithText)) return null;\n let decodedText = decodeHtmlEntities(tokenWithText.text);\n\n // Handle thinking block tokens\n if (decodedText.startsWith('THINKING_MARKER')) {\n const thinkingContent = thinkingContentRef?.current || '';\n return <ThinkingBlock key={index} isDarkMode={isDarkMode} isStreaming={isStreaming}>{thinkingContent}</ThinkingBlock>;\n }\n\n // Handle math expressions in text tokens\n if (decodedText.includes('⟨MATH_INLINE:')) {\n // const mathMatch = decodedText.match(/MATH_DISPLAY:([^<]*)/s);\n // if (mathMatch) return <MathRenderer key={index} math={mathMatch[1]} displayMode={true} />;\n const parts = decodedText.split(/(⟨MATH_INLINE:[^⟩]*⟩)/);\n return (\n <>\n {parts.map((part, i) => {\n if (part.startsWith('⟨MATH_INLINE:')) {\n const math = part.replace('⟨MATH_INLINE:', '').replace('⟩', '').trim();\n return <MathRenderer key={i} math={math} displayMode={false} />;\n }\n return part || null;\n })}\n </>\n );\n }\n\n // Check if this 'text' token has nested inline tokens (like strong, em, etc.)\n if (tokenWithText.tokens && tokenWithText.tokens.length > 0) {\n // If it has nested tokens, render them recursively\n return <>{renderTokens(tokenWithText.tokens, enableCodeApply, isDarkMode)}</>;\n } else {\n // Otherwise, just render the decoded text content (use fragment)\n return <>{decodedText}</>; // Use fragment to avoid extra spans\n }\n\n // --- Handle Inline Markdown Elements (Recursively) ---\n case 'strong':\n return <strong key={index}>{renderTokens((token as Tokens.Strong).tokens || [], enableCodeApply, isDarkMode)}</strong>;\n case 'em':\n return <em key={index}>{renderTokens((token as Tokens.Em).tokens || [], enableCodeApply, isDarkMode)}</em>;\n case 'codespan':\n if (!hasText(tokenWithText)) return null;\n const decodedCode = decodeHtmlEntities(tokenWithText.text);\n // Basic escaping for codespan content\n return <code key={index} dangerouslySetInnerHTML={{ __html: decodedCode }} />;\n case 'br':\n return <br key={index} />;\n case 'del':\n return <del key={index}>{renderTokens((token as Tokens.Del).tokens || [], enableCodeApply, isDarkMode)}</del>;\n\n case 'link':\n const linkToken = token as Tokens.Link;\n return <a key={index} href={linkToken.href} title={linkToken.title ?? undefined}>{renderTokens(linkToken.tokens || [], enableCodeApply, isDarkMode)}</a>;\n\n case 'escape':\n if (!hasText(tokenWithText)) return null;\n return <>{decodeHtmlEntities(tokenWithText.text || '')}</>;\n\n case 'image':\n const imageToken = token as Tokens.Image;\n // Check if href is a valid URL or path before rendering\n const imageHref = imageToken.href || '';\n // Skip rendering if href is empty or contains template literals\n if (!imageHref || imageHref.includes('{') || imageHref.includes('}')) {\n console.warn('Invalid image URL detected:', imageHref);\n return <span key={index}>[Invalid image: {imageToken.text || 'No description'}]</span>;\n }\n // Only render valid image URLs\n return <img key={index} src={imageHref} alt={imageToken.text || ''} title={imageToken.title ?? undefined} />;\n\n // --- Other Block Types ---\n case 'heading':\n const headingToken = token as Tokens.Heading;\n const Tag = `h${headingToken.depth}` as keyof JSX.IntrinsicElements;\n return <Tag key={index}>{renderTokens(headingToken.tokens || [], enableCodeApply, isDarkMode)}</Tag>;\n case 'hr':\n return <hr key={index} />;\n case 'blockquote':\n return <blockquote key={index}>{renderTokens((token as Tokens.Blockquote).tokens || [], enableCodeApply, isDarkMode)}</blockquote>;\n case 'space': // Usually ignored\n return null;\n\n // --- Fallback ---\n case 'unknown':\n default:\n console.warn(\"Unhandled token type in renderTokens switch:\", token.type, token);\n // Attempt to render raw text if available\n return hasText(tokenWithText) ? <span key={index}>{decodeHtmlEntities(tokenWithText.text || '')}</span> : null;\n }\n } catch (error) {\n console.error(`Error rendering token index ${index} (type: ${token.type}):`, error);\n // Fallback for errors during rendering a specific token\n return <div key={index} style={{ color: 'red' }}>[Error rendering content]</div>;\n }\n });\n};\n\n// Function to split multi-file diffs into separate diffs\nconst splitMultiFileDiffs = (diffText: string): string[] => {\n if (!diffText) return [];\n\n // Regular expression to match the start of a new file diff\n const fileHeaderRegex = /^diff --git .*$/m;\n\n // If the diff doesn't start with a proper header, return it as is\n if (!diffText.match(fileHeaderRegex)) {\n return [diffText];\n }\n\n const fileDiffs: string[] = [];\n let currentDiff = '';\n let lines = diffText.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // If we find a new file header and we already have content,\n // save the current diff and start a new one\n if (line.match(fileHeaderRegex) && currentDiff) {\n fileDiffs.push(currentDiff);\n currentDiff = line;\n } else {\n // Add the line to the current diff\n currentDiff = currentDiff ? `${currentDiff}\\n${line}` : line;\n }\n }\n\n // Add the last diff if there's any content\n if (currentDiff) {\n fileDiffs.push(currentDiff);\n }\n\n return fileDiffs;\n};\n\n// Function to handle multi-file diffs with proper recursive rendering\nconst renderMultiFileDiff = (token: TokenWithText, index: number, enableCodeApply: boolean, isDarkMode: boolean): JSX.Element => {\n // Split the diff into separate file diffs\n const fileDiffs = splitMultiFileDiffs(token.text);\n\n // If there's only one diff or splitting failed, render as a single diff\n if (fileDiffs.length <= 1) {\n return (\n <DiffToken\n key={index}\n token={{ ...token, text: token.text.trim() }}\n index={index}\n enableCodeApply={enableCodeApply}\n isDarkMode={isDarkMode}\n />\n );\n }\n\n // Render each file diff as a complete component with its own controls\n return (\n <div key={index} className=\"multi-file-diff\">\n {fileDiffs.map((diffContent, fileIndex) => {\n // Create a stable key for each file diff\n const stableKey = `diff-${index}-file-${fileIndex}`;\n\n // Wrap each diff in markdown code block syntax for proper rendering\n const wrappedDiff = `\\`\\`\\`diff\\n${diffContent}\\n\\`\\`\\``;\n\n return (\n <div key={stableKey} className=\"multi-file-diff-container\" style={{ marginBottom: '20px' }}>\n {/* Use a separate MarkdownRenderer instance for each file diff */}\n <MarkdownRenderer\n markdown={wrappedDiff}\n enableCodeApply={enableCodeApply}\n forceRender={true}\n // isMarkdownBlockClosed will be true by default for sub-renders if they get a complete diff\n isSubRender={true}\n />\n </div>\n );\n })}\n </div>\n );\n};\n\ninterface MarkdownRendererProps {\n markdown: string;\n isStreaming?: boolean;\n enableCodeApply: boolean;\n forceRender?: boolean;\n isSubRender?: boolean; // Add flag to prevent infinite recursion\n}\n\n// Configure marked options\nconst markedOptions = {\n gfm: true,\n breaks: false,\n pedantic: false\n};\n\n// Math rendering component\nconst MathRenderer: React.FC<{ math: string; displayMode: boolean }> = ({ math, displayMode }) => {\n const katex = require('katex');\n\n try {\n const html = katex.renderToString(math, {\n displayMode,\n throwOnError: false,\n strict: false\n });\n\n return displayMode ?\n <div className=\"math-display\" dangerouslySetInnerHTML={{ __html: html }} /> :\n <span className=\"math-inline\" dangerouslySetInnerHTML={{ __html: html }} />;\n } catch (error) {\n console.warn('KaTeX rendering error:', error);\n return displayMode ?\n <div className=\"math-error\">Math Error: {math}</div> :\n <span className=\"math-error\">Math Error: {math}</span>;\n }\n};\n\n/**\n * Detects and normalizes indented diff blocks that Gemini sometimes produces\n * @param content The markdown content to process\n * @returns Normalized content with indented diffs fixed\n */\nconst normalizeIndentedDiffs = (content: string): string => {\n const lines = content.split('\\n');\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Look for indented diff headers (common patterns from Gemini)\n const indentedDiffMatch = line.match(/^(\\s{4,})```diff$/);\n if (indentedDiffMatch) {\n const indentLevel = indentedDiffMatch[1].length;\n console.log(`Found indented diff block with ${indentLevel} spaces of indentation`);\n\n // Add the diff header without indentation\n result.push('```diff');\n i++;\n\n // Process the diff content, removing the same amount of indentation\n while (i < lines.length) {\n const diffLine = lines[i];\n\n // Check for end of diff block\n if (diffLine.match(/^\\s*```\\s*$/)) {\n result.push('```');\n i++;\n break;\n }\n\n // Remove the indentation from diff content lines\n if (diffLine.startsWith(' '.repeat(indentLevel))) {\n // Remove exactly the same amount of indentation as the opening ```diff\n const normalizedLine = diffLine.substring(indentLevel);\n result.push(normalizedLine);\n } else if (diffLine.trim() === '') {\n // Preserve empty lines\n result.push('');\n } else {\n // Line has less indentation than expected - might be end of block or malformed\n result.push(diffLine);\n }\n i++;\n }\n } else {\n result.push(line);\n i++;\n }\n }\n\n return result.join('\\n');\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = memo(({ markdown, enableCodeApply, isStreaming: externalStreaming = false, forceRender = false, isSubRender = false }) => {\n const { isStreaming } = useChatContext();\n const { isDarkMode } = useTheme();\n\n // All refs declared at the top to ensure they're in scope for useMemo\n const previousTokensRef = useRef<(Tokens.Generic | TokenWithText)[]>([]);\n const parseTimeoutRef = useRef<NodeJS.Timeout>();\n const markdownRef = useRef<string>(markdown);\n const thinkingRenderedRef = useRef(false);\n const thinkingContentRef = useRef<string>('');\n const [forceRenderKey, setForceRenderKey] = useState(0);\n\n // State for the tokens that are currently displayed with stable reference\n const [displayTokens, setDisplayTokens] = useState<(Tokens.Generic | TokenWithText)[]>([]);\n const isStreamingState = isStreaming;\n\n // Memoize the parsing of markdown into tokens.\n // This is critical for stability - we need to ensure tokens don't change unnecessarily\n const lexedTokens = useMemo(() => {\n if (!markdown?.trim()) {\n clearTimeout(parseTimeoutRef.current);\n return previousTokensRef.current.length > 0 ? previousTokensRef.current : [];\n }\n\n try {\n // Reset thinking refs only when content actually shrinks (indicating a new message)\n // Don't reset when content is just growing during streaming\n if (markdownRef.current && markdown.length < markdownRef.current.length) {\n thinkingRenderedRef.current = false;\n thinkingContentRef.current = '';\n }\n markdownRef.current = markdown;\n // During streaming, if we already have a diff being rendered, keep it stable\n let processedMarkdown = markdown;\n\n // Pre-process indented diff blocks before any other processing\n processedMarkdown = normalizeIndentedDiffs(processedMarkdown);\n\n // Don't process empty or whitespace-only markdown during streaming\n if (isStreamingState && (!processedMarkdown || processedMarkdown.trim() === '')) {\n return previousTokensRef.current.length > 0 ? previousTokensRef.current : [];\n }\n\n // Pre-process tool calls to handle both <n> and <name> formats\n const toolCallMatch = parseToolCall(processedMarkdown);\n if (toolCallMatch) {\n // Replace the tool call with a formatted display version\n const formattedToolCall = formatToolCallForDisplay(toolCallMatch);\n processedMarkdown = processedMarkdown.replace(\n /<TOOL_SENTINEL>[\\s\\S]*?<\\/TOOL_SENTINEL>/,\n formattedToolCall\n );\n }\n\n // Pre-process thinking content to extract and handle separately (only once)\n if (!thinkingRenderedRef.current) {\n const thinkingMatch = parseThinkingContent(processedMarkdown);\n if (thinkingMatch) {\n // Store thinking content in ref IMMEDIATELY\n thinkingContentRef.current = thinkingMatch.content;\n thinkingRenderedRef.current = true;\n // Remove thinking tags from main content\n processedMarkdown = removeThinkingTags(processedMarkdown);\n // Add simple marker at the beginning\n processedMarkdown = `THINKING_MARKER\\n\\n${processedMarkdown}`;\n }\n } else {\n // Remove thinking tags from subsequent renders\n processedMarkdown = removeThinkingTags(processedMarkdown);\n }\n\n // Pre-process tool blocks to clean up literal inclusions\n processedMarkdown = processedMarkdown.replace(\n /```tool:(mcp_\\w+)\\s*```tool:(mcp_\\w+)/g,\n '```tool:$1'\n );\n processedMarkdown = processedMarkdown.replace(\n /^```tool:(mcp_\\w+)\\s*$/gm,\n '```tool:$1'\n );\n\n // First check if this is a diff or code block that shouldn't have math processing\n const isDiff = processedMarkdown.includes('diff --git') ||\n (processedMarkdown.includes('```diff') && processedMarkdown.includes('+++')) ||\n (processedMarkdown.match(/^---\\s+\\S+/m) && processedMarkdown.match(/^\\+\\+\\+\\s+\\S+/m));\n\n const hasCodeBlocks = processedMarkdown.includes('```');\n\n // Only process math expressions if this doesn't look like a diff\n if (!isDiff) {\n // Split the markdown into code blocks and non-code blocks\n const segments = processedMarkdown.split(/(```[\\s\\S]*?```)/g);\n\n // Process each segment separately\n processedMarkdown = segments.map((segment, index) => {\n // Skip math processing for code blocks (odd indices in the split)\n if (index % 2 === 1 && segment.startsWith('```')) {\n return segment;\n }\n\n // Process math only in non-code segments\n let processed = segment;\n\n // Handle display math $$...$$\n processed = processed.replace(\n /\\$\\$([\\s\\S]+?)\\$\\$/g,\n '\\n<div class=\"math-display-block\">MATH_DISPLAY:$1</div>\\n'\n );\n\n // Handle inline math $...$\n processed = processed.replace(\n /\\$([^⟩]+?)\\$/g,\n (match, p1) => {\n // Skip processing if this looks like a regex replacement ($1, $2, etc.)\n if (/^\\d+$/.test(p1.trim())) {\n return match; // Keep $1, $2, etc. as is\n }\n\n // Skip processing if this is inside code-like contexts\n const surroundingText = match.substring(0, 50) + match.substring(match.length - 50);\n if (surroundingText.includes('replace(') ||\n surroundingText.includes('processedDef') ||\n surroundingText.includes('regex')) {\n return match; // Keep as is in code contexts\n }\n\n // Only treat as math if it contains LaTeX commands or mathematical symbols\n const hasLatex = /\\\\[a-zA-Z]+/.test(p1); // \\frac, \\sqrt, \\alpha, etc.\n const hasMathSymbols = /[∫∑∏√∞≠≤≥±∓∈∉⊂⊃∪∩αβγδεζηθικλμνξοπρστυφχψω]/.test(p1);\n return (hasLatex || hasMathSymbols) ? `⟨MATH_INLINE:${p1.trim()}⟩` : match;\n }\n );\n\n return processed;\n }).join('');\n }\n\n // Pre-process MathML blocks to prevent fragmentation\n const mathMLRegex = /<math[^>]*>[\\s\\S]*?<\\/math>/gi;\n const mathMLBlocks = processedMarkdown.match(mathMLRegex);\n\n if (mathMLBlocks) {\n mathMLBlocks.forEach((mathBlock, index) => {\n // Add namespace if missing and wrap in a way that preserves it as a single token\n const mathWithNamespace = mathBlock.includes('xmlns=')\n ? mathBlock\n : mathBlock.replace('<math', '<math xmlns=\"http://www.w3.org/1998/Math/MathML\"');\n\n // Replace with a placeholder that won't be fragmented\n processedMarkdown = processedMarkdown.replace(mathBlock, `<div class=\"mathml-block\">${mathWithNamespace}</div>`);\n });\n }\n\n const lexedTokens = marked.lexer(processedMarkdown, markedOptions);\n return lexedTokens as (Tokens.Generic | TokenWithText)[] || [];\n } catch (error) {\n // Don't create fallback code blocks for empty content\n if (!markdown || markdown.trim() === '') {\n return [];\n }\n console.error(\"Error lexing markdown:\", error);\n // Fallback to rendering the raw markdown in a code block on error\n return [{ type: 'code', lang: 'text', text: markdown }] as TokenWithText[];\n }\n }, [markdown, externalStreaming, isStreamingState]);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => clearTimeout(parseTimeoutRef.current);\n }, []);\n\n // Update tokens state when the memoized tokens change\n useEffect(() => {\n // Always update immediately for live streaming\n if (lexedTokens.length > 0) {\n previousTokensRef.current = lexedTokens;\n setDisplayTokens(lexedTokens);\n }\n }, [lexedTokens]); // Remove streaming state dependency for immediate updates\n\n // Only memoize the rendered content when not streaming or when streaming completes\n const renderedContent = useMemo(() => {\n return renderTokens(displayTokens, enableCodeApply, isDarkMode, isSubRender, isStreaming, thinkingContentRef);\n }, [displayTokens, enableCodeApply, isDarkMode, forceRender, isSubRender, forceRenderKey]); // Use forceRenderKey to trigger re-renders\n\n const isMultiFileDiff = markdown?.includes('diff --git') && markdown.split('diff --git').length > 2;\n return isMultiFileDiff && !isSubRender && displayTokens.length === 1 && displayTokens[0].type === 'code' && (displayTokens[0] as TokenWithText).lang === 'diff' ?\n renderMultiFileDiff(displayTokens[0] as TokenWithText, 0, enableCodeApply, isDarkMode) :\n\n <div>{renderedContent}</div>;\n}, (prevProps, nextProps) => prevProps.markdown === nextProps.markdown && prevProps.enableCodeApply === nextProps.enableCodeApply);\n// Note: forceRender prop is intentionally not included in the memo comparison to ensure re-rendering during streaming\n\nconst cleanDiffContent = (content: string): string => {\n const lines = content.split('\\n');\n const cleanedLines = lines.map(line => {\n // Preserve diff headers unchanged\n if (line.startsWith('diff --git') ||\n line.startsWith('index ') ||\n line.startsWith('--- ') ||\n line.startsWith('+++ ') ||\n line.startsWith('@@ ')) {\n return line;\n }\n\n // Fix any MATH_INLINE expansions that might have slipped through\n // This handles cases like $1 in regex replacements being converted to ⟨MATH_INLINE:1⟩\n if (line.includes('⟨MATH_INLINE:')) {\n // Replace ⟨MATH_INLINE:1⟩ with $1, ⟨MATH_INLINE:2⟩ with $2, etc.\n line = line.replace(/⟨MATH_INLINE:(\\d+)⟩/g, '$$1');\n }\n\n // Handle offset diff format lines\n // Pattern: optional leading spaces + optional +/- + [number + optional modifier] + space + content\n // Examples: [001 ], [002+], [003*], [004,+], +[005 ], -[006 ]\n const offsetMatch = line.match(/^(\\s*)([+-]?)?\\[(\\d+)([+*,\\s]*)\\]\\s(.*)⟩/);\n if (offsetMatch) {\n const [_, leadingSpace, diffMarker, lineNum, modifier, content] = offsetMatch;\n\n // Determine the actual diff marker based on the modifier or explicit marker\n let actualMarker = '';\n if (diffMarker) {\n // Explicit +/- before the bracket\n actualMarker = diffMarker;\n } else if (modifier.includes('+')) {\n // [NNN+] format - addition\n actualMarker = '+';\n } else if (modifier.includes('*')) {\n // [NNN*] format - modification (treat as context)\n actualMarker = ' ';\n } else {\n // [NNN ] format - context line\n actualMarker = ' ';\n }\n\n return `${actualMarker}${content}`;\n }\n\n // Handle lines that might have been partially processed or malformed\n const simpleOffsetMatch = line.match(/^\\s*\\[(\\d+)[+*\\s]*\\]\\s*(.*)$/);\n if (simpleOffsetMatch) {\n const [_, lineNum, content] = simpleOffsetMatch;\n return ` ${content}`;\n }\n\n // Return line unchanged if no offset format detected\n return line;\n });\n return cleanedLines.join('\\n');\n};\n\nexport default MarkdownRenderer;\n","/**\n * Frontend tool call parser to handle both <n> and <name> formats\n */\n\nexport interface ToolCall {\n toolName: string;\n arguments: Record<string, any>;\n}\n\nexport function parseToolCall(content: string): ToolCall | null {\n // Handle <name> format\n const namePattern = /<TOOL_SENTINEL>\\s*<name>([^<]+)<\\/name>\\s*<arguments>\\s*(\\{.*?\\})\\s*<\\/arguments>\\s*<\\/TOOL_SENTINEL>/s;\n let match = content.match(namePattern);\n \n if (match) {\n try {\n return {\n toolName: match[1].trim(),\n arguments: JSON.parse(match[2])\n };\n } catch (e) {\n console.warn('Failed to parse tool arguments:', e);\n }\n }\n \n // Handle <n> format\n const nPattern = /<TOOL_SENTINEL>\\s*<n>([^<]+)<\\/n>\\s*<arguments>\\s*(\\{.*?\\})\\s*<\\/arguments>\\s*<\\/TOOL_SENTINEL>/s;\n match = content.match(nPattern);\n \n if (match) {\n try {\n return {\n toolName: match[1].trim(),\n arguments: JSON.parse(match[2])\n };\n } catch (e) {\n console.warn('Failed to parse tool arguments:', e);\n }\n }\n \n return null;\n}\n\nexport function formatToolCallForDisplay(toolCall: ToolCall): string {\n const args = JSON.stringify(toolCall.arguments, null, 2);\n return `🔧 **${toolCall.toolName}**\\n\\`\\`\\`json\\n${args}\\n\\`\\`\\``;\n}\n","/**\n * Logging utilities for Ziya\n */\n\n// Import the environment check function using ES6 syntax\nimport { isDebugMode } from './envSetup';\n\n/**\n * Check if debug logging should be enabled\n * Returns true if:\n * 1. NODE_ENV is 'development' OR\n * 2. ZIYA_LOG_LEVEL is set to 'DEBUG'\n */\nexport const isDebugLoggingEnabled = (): boolean => {\n return false; // Temporarily disabled to clean up console\n};\n\n/**\n * Debug log function that only logs when debug logging is enabled\n */\nexport const debugLog = (message: string, ...args: any[]): void => {\n if (isDebugLoggingEnabled()) {\n console.debug(`[ZIYA DEBUG] ${message}`, ...args);\n }\n};\n\n/**\n * Info log function\n */\nexport const infoLog = (message: string, ...args: any[]): void => {\n console.log(`[ZIYA INFO] ${message}`, ...args);\n};\n\n/**\n * Warning log function\n */\nexport const warnLog = (message: string, ...args: any[]): void => {\n console.warn(`[ZIYA WARN] ${message}`, ...args);\n};\n\n/**\n * Error log function\n */\nexport const errorLog = (message: string, ...args: any[]): void => {\n console.error(`[ZIYA ERROR] ${message}`, ...args);\n};\n","import 'prismjs/themes/prism.css';\nimport 'prismjs/plugins/show-invisibles/prism-show-invisibles';\nimport 'prismjs/components/prism-core';\n\n// Track loaded languages to avoid duplicate loading\nconst loadedLanguages = new Set(['plaintext']); // Mark plaintext as loaded by default\n\n// Map of common file extensions to Prism language names\nconst languageMap: { [key: string]: string } = {\n js: 'javascript',\n javascript: 'javascript',\n jsx: 'jsx',\n ts: 'typescript',\n tsx: 'tsx',\n py: 'python',\n rb: 'ruby',\n 'ruby': 'ruby',\n 'typescript jsx': 'tsx',\n 'typescript-jsx': 'tsx',\n java: 'java',\n cpp: 'cpp',\n c: 'clike',\n cs: 'csharp',\n go: 'go',\n rs: 'rust',\n php: 'php',\n objectivec: 'objectivec',\n objc: 'objectivec',\n 'objective-c': 'objectivec',\n swift: 'swift',\n metal: 'c', // Metal Shading Language is C-based, use C highlighting\n sh: 'bash',\n 'bash': 'bash',\n 'shell': 'bash',\n yml: 'yaml',\n yaml: 'yaml',\n json: 'json',\n md: 'markdown',\n sql: 'sql',\n plist: 'markup', // Property lists are XML-based\n xml: 'markup',\n dockerfile: 'docker',\n diff: 'diff',\n 'markup': 'markup',\n 'html': 'markup'\n};\n\n// Define Prism interface\ninterface PrismToken {\n type: string;\n content: string | PrismToken[];\n}\n\ninterface PrismStatic {\n highlight(text: string, grammar: any, language: string): string;\n tokenize(text: string, grammar: any): PrismToken[];\n languages: { [key: string]: any };\n hooks: {\n all: { [key: string]: Array<(...args: any[]) => void> };\n add(name: string, callback: (...args: any[]) => void): void;\n };\n};\n\nlet prismInstance: PrismStatic | null = null;\nlet initializationPromise: Promise<PrismStatic | null> | null = null;\nlet loadingPromises: { [key: string]: Promise<void> | undefined } = {};\n\nconst loadPrismCore = async (): Promise<PrismStatic | null> => {\n if (!prismInstance) {\n if (!initializationPromise) {\n initializationPromise = (async () => {\n try {\n // First, load Prism core\n const Prism = await import(/* webpackChunkName: \"prism-core\" */ 'prismjs/components/prism-core');\n\n if (Prism.default) {\n const instance = Prism.default as unknown as PrismStatic;\n\n // Initialize core properties\n instance.languages = instance.languages || {};\n // Initialize plaintext grammar if not already present\n if (!instance.languages.plaintext) {\n instance.languages.plaintext = { text: /[\\s\\S]+/ };\n }\n\n // Make Prism globally available\n (window as any).Prism = instance;\n prismInstance = instance;\n\n // Initialize core languages\n await import('prismjs/components/prism-clike');\n await import('prismjs/components/prism-markup');\n await import('prismjs/components/prism-markup-templating');\n await import('prismjs/components/prism-javascript');\n return instance;\n }\n return null;\n } catch (error) {\n console.error('Failed to initialize Prism:', error);\n return null;\n }\n })();\n }\n prismInstance = await initializationPromise;\n }\n return prismInstance;\n}\n\n// Track attempted language loads to prevent duplicate attempts\nconst attemptedLoads = new Set<string>();\n\nexport const loadPrismLanguage = async (language: string): Promise<void> => {\n // If we're already loading this language, return the existing promise\n const existingPromise = loadingPromises[language];\n if (existingPromise) {\n return existingPromise;\n }\n\n // Map the language name to its Prism.js equivalent if needed\n const mappedLanguage = languageMap[language] || language;\n\n // Special handling for plaintext - it's always available\n if (mappedLanguage === 'plaintext') {\n return Promise.resolve();\n }\n\n // Check if we've already attempted to load this language\n if (attemptedLoads.has(mappedLanguage)) {\n return Promise.resolve();\n }\n\n // Check if either the original language or mapped language is already loaded\n if (loadedLanguages.has(language) || loadedLanguages.has(mappedLanguage)) {\n console.debug(`Skipping already loaded language: ${mappedLanguage}`);\n return Promise.resolve();\n }\n\n const prism = await loadPrismCore();\n if (!prism) {\n const error = new Error('Failed to load Prism core');\n console.error(error);\n return;\n }\n\n // Special handling for \"typescript jsx\" format\n if (language.includes(' ')) {\n const normalized = language.replace(' ', '-');\n await loadPrismLanguage(languageMap[normalized] || normalized);\n return;\n }\n\n attemptedLoads.add(mappedLanguage);\n console.debug(`Loading language: ${mappedLanguage}`);\n\n // Create a loading promise for this language\n loadingPromises[language] = (async () => {\n try {\n // Always ensure core languages are loaded first\n if (!window.Prism?.languages?.javascript ||\n Object.keys(window.Prism?.languages?.javascript || {}).length === 0) {\n await import('prismjs/components/prism-clike');\n await import('prismjs/components/prism-javascript');\n }\n // Handle TypeScript-specific dependencies\n switch (mappedLanguage) {\n case 'jsx': {\n // Ensure markup and javascript are loaded first\n await Promise.all([\n import('prismjs/components/prism-markup'),\n import('prismjs/components/prism-javascript')\n ]);\n await import('prismjs/components/prism-jsx');\n if (!window.Prism.languages.jsx) {\n window.Prism.languages.jsx = window.Prism.languages.extend('markup', window.Prism.languages.javascript);\n }\n break;\n }\n case 'typescript':\n if (!window.Prism?.languages?.typescript ||\n Object.keys(window.Prism?.languages?.typescript || {}).length === 0) {\n await import('prismjs/components/prism-typescript');\n }\n break;\n case 'csharp': {\n await import('prismjs/components/prism-clike');\n await import('prismjs/components/prism-csharp');\n break;\n }\n case 'javascript': {\n await import('prismjs/components/prism-jsx');\n break;\n }\n case 'clike': {\n if (!window.Prism?.languages?.clike) {\n await import('prismjs/components/prism-clike');\n }\n break;\n }\n case 'typsecript jsx':\n case 'tsx': {\n // Load all required dependencies for TSX\n await Promise.all([\n import('prismjs/components/prism-markup'),\n import('prismjs/components/prism-javascript'),\n import('prismjs/components/prism-typescript'),\n import('prismjs/components/prism-jsx')\n ]);\n // Configure TSX grammar by extending TypeScript and JSX\n if (window.Prism && !window.Prism.languages.tsx) {\n window.Prism.languages.tsx = window.Prism.languages.extend('typescript', window.Prism.languages.jsx);\n loadedLanguages.add('typescript jsx'); // Mark both versions as loaded\n }\n break;\n }\n case 'python': {\n // Python-specific dependencies\n if (!prism.languages.clike || Object.keys(prism.languages.clike).length === 0) {\n await import('prismjs/components/prism-clike');\n }\n await import('prismjs/components/prism-markup-templating');\n await import('prismjs/components/prism-python');\n loadedLanguages.add('python');\n break;\n }\n case 'swift': {\n // Swift-specific dependencies\n if (!prism.languages.clike || Object.keys(prism.languages.clike).length === 0) {\n await import('prismjs/components/prism-clike');\n }\n await import('prismjs/components/prism-swift');\n break;\n }\n case 'objectivec': {\n // Objective-C specific dependencies\n if (!prism.languages.clike || Object.keys(prism.languages.clike).length === 0) {\n await import('prismjs/components/prism-clike');\n }\n await import('prismjs/components/prism-objectivec');\n // Also mark objc and objective-c as loaded\n loadedLanguages.add('objc');\n loadedLanguages.add('objective-c');\n break;\n }\n case 'cpp': {\n // C++ specific dependencies\n await import('prismjs/components/prism-clike');\n await import('prismjs/components/prism-cpp');\n break;\n }\n default:\n if (mappedLanguage !== 'plaintext') try {\n // Load other languages directly\n await import(/* webpackChunkName: \"prism-lang.[request]\" */ `prismjs/components/prism-${mappedLanguage}`);\n if (!window.Prism?.languages?.[mappedLanguage]) {\n throw new Error(`Language ${mappedLanguage} (${language}) failed to load`);\n }\n } catch (error) {\n console.warn(`Failed to load language ${mappedLanguage}:`, error);\n throw error;\n }\n break;\n }\n // Mark both the original language and its mapped version as loaded\n loadedLanguages.add(language);\n if (mappedLanguage !== language) {\n loadedLanguages.add(mappedLanguage);\n }\n } catch (error: any) {\n console.error(`Failed to load language: ${mappedLanguage} (${language})`, error);\n // Set up plaintext fallback\n if (!prism || !prism.languages.plaintext) {\n prism.languages.plaintext = {\n text: /[\\s\\S]+/\n };\n }\n } finally {\n // Clean up the loading promise\n delete loadingPromises[language];\n }\n\n })();\n return loadingPromises[language];\n};\n\n// Helper to check if a language is loaded\nexport const isLanguageLoaded = (language: string): boolean => {\n const mappedLanguage = languageMap[language] || language;\n return prismInstance?.languages[mappedLanguage] !== undefined;\n};\n","var map = {\n\t\"./prism-abap\": [\n\t\t5265,\n\t\t89453\n\t],\n\t\"./prism-abap.js\": [\n\t\t5265,\n\t\t89453\n\t],\n\t\"./prism-abap.min\": [\n\t\t44595,\n\t\t15430\n\t],\n\t\"./prism-abap.min.js\": [\n\t\t44595,\n\t\t15430\n\t],\n\t\"./prism-abnf\": [\n\t\t80804,\n\t\t80958\n\t],\n\t\"./prism-abnf.js\": [\n\t\t80804,\n\t\t80958\n\t],\n\t\"./prism-abnf.min\": [\n\t\t15734,\n\t\t59381\n\t],\n\t\"./prism-abnf.min.js\": [\n\t\t15734,\n\t\t59381\n\t],\n\t\"./prism-actionscript\": [\n\t\t50966,\n\t\t36204\n\t],\n\t\"./prism-actionscript.js\": [\n\t\t50966,\n\t\t36204\n\t],\n\t\"./prism-actionscript.min\": [\n\t\t4296,\n\t\t47943\n\t],\n\t\"./prism-actionscript.min.js\": [\n\t\t4296,\n\t\t47943\n\t],\n\t\"./prism-ada\": [\n\t\t86383,\n\t\t98661\n\t],\n\t\"./prism-ada.js\": [\n\t\t86383,\n\t\t98661\n\t],\n\t\"./prism-ada.min\": [\n\t\t63217,\n\t\t71198\n\t],\n\t\"./prism-ada.min.js\": [\n\t\t63217,\n\t\t71198\n\t],\n\t\"./prism-agda\": [\n\t\t99084,\n\t\t78834\n\t],\n\t\"./prism-agda.js\": [\n\t\t99084,\n\t\t78834\n\t],\n\t\"./prism-agda.min\": [\n\t\t4318,\n\t\t88049\n\t],\n\t\"./prism-agda.min.js\": [\n\t\t4318,\n\t\t88049\n\t],\n\t\"./prism-al\": [\n\t\t36954,\n\t\t40348\n\t],\n\t\"./prism-al.js\": [\n\t\t36954,\n\t\t40348\n\t],\n\t\"./prism-al.min\": [\n\t\t80628,\n\t\t49303\n\t],\n\t\"./prism-al.min.js\": [\n\t\t80628,\n\t\t49303\n\t],\n\t\"./prism-antlr4\": [\n\t\t25790,\n\t\t99764\n\t],\n\t\"./prism-antlr4.js\": [\n\t\t25790,\n\t\t99764\n\t],\n\t\"./prism-antlr4.min\": [\n\t\t25648,\n\t\t76399\n\t],\n\t\"./prism-antlr4.min.js\": [\n\t\t25648,\n\t\t76399\n\t],\n\t\"./prism-apacheconf\": [\n\t\t38667,\n\t\t27803\n\t],\n\t\"./prism-apacheconf.js\": [\n\t\t38667,\n\t\t27803\n\t],\n\t\"./prism-apacheconf.min\": [\n\t\t87141,\n\t\t49552\n\t],\n\t\"./prism-apacheconf.min.js\": [\n\t\t87141,\n\t\t49552\n\t],\n\t\"./prism-apex\": [\n\t\t29463,\n\t\t51903\n\t],\n\t\"./prism-apex.js\": [\n\t\t29463,\n\t\t51903\n\t],\n\t\"./prism-apex.min\": [\n\t\t27385,\n\t\t87164\n\t],\n\t\"./prism-apex.min.js\": [\n\t\t27385,\n\t\t87164\n\t],\n\t\"./prism-apl\": [\n\t\t43768,\n\t\t4940\n\t],\n\t\"./prism-apl.js\": [\n\t\t43768,\n\t\t4940\n\t],\n\t\"./prism-apl.min\": [\n\t\t58898,\n\t\t21863\n\t],\n\t\"./prism-apl.min.js\": [\n\t\t58898,\n\t\t21863\n\t],\n\t\"./prism-applescript\": [\n\t\t54596,\n\t\t74764\n\t],\n\t\"./prism-applescript.js\": [\n\t\t54596,\n\t\t74764\n\t],\n\t\"./prism-applescript.min\": [\n\t\t46262,\n\t\t74535\n\t],\n\t\"./prism-applescript.min.js\": [\n\t\t46262,\n\t\t74535\n\t],\n\t\"./prism-aql\": [\n\t\t41237,\n\t\t26423\n\t],\n\t\"./prism-aql.js\": [\n\t\t41237,\n\t\t26423\n\t],\n\t\"./prism-aql.min\": [\n\t\t18028,\n\t\t66036\n\t],\n\t\"./prism-aql.min.js\": [\n\t\t18028,\n\t\t66036\n\t],\n\t\"./prism-arduino\": [\n\t\t58507,\n\t\t65901\n\t],\n\t\"./prism-arduino.js\": [\n\t\t58507,\n\t\t65901\n\t],\n\t\"./prism-arduino.min\": [\n\t\t14885,\n\t\t61958\n\t],\n\t\"./prism-arduino.min.js\": [\n\t\t14885,\n\t\t61958\n\t],\n\t\"./prism-arff\": [\n\t\t35628,\n\t\t69174\n\t],\n\t\"./prism-arff.js\": [\n\t\t35628,\n\t\t69174\n\t],\n\t\"./prism-arff.min\": [\n\t\t40030,\n\t\t58765\n\t],\n\t\"./prism-arff.min.js\": [\n\t\t40030,\n\t\t58765\n\t],\n\t\"./prism-armasm\": [\n\t\t39910,\n\t\t76468\n\t],\n\t\"./prism-armasm.js\": [\n\t\t39910,\n\t\t76468\n\t],\n\t\"./prism-armasm.min\": [\n\t\t70360,\n\t\t19279\n\t],\n\t\"./prism-armasm.min.js\": [\n\t\t70360,\n\t\t19279\n\t],\n\t\"./prism-arturo\": [\n\t\t86540,\n\t\t77838\n\t],\n\t\"./prism-arturo.js\": [\n\t\t86540,\n\t\t77838\n\t],\n\t\"./prism-arturo.min\": [\n\t\t95294,\n\t\t46469\n\t],\n\t\"./prism-arturo.min.js\": [\n\t\t95294,\n\t\t46469\n\t],\n\t\"./prism-asciidoc\": [\n\t\t69672,\n\t\t35438\n\t],\n\t\"./prism-asciidoc.js\": [\n\t\t69672,\n\t\t35438\n\t],\n\t\"./prism-asciidoc.min\": [\n\t\t80898,\n\t\t14725\n\t],\n\t\"./prism-asciidoc.min.js\": [\n\t\t80898,\n\t\t14725\n\t],\n\t\"./prism-asm6502\": [\n\t\t71919,\n\t\t5449\n\t],\n\t\"./prism-asm6502.js\": [\n\t\t71919,\n\t\t5449\n\t],\n\t\"./prism-asm6502.min\": [\n\t\t20017,\n\t\t50058\n\t],\n\t\"./prism-asm6502.min.js\": [\n\t\t20017,\n\t\t50058\n\t],\n\t\"./prism-asmatmel\": [\n\t\t9087,\n\t\t33023\n\t],\n\t\"./prism-asmatmel.js\": [\n\t\t9087,\n\t\t33023\n\t],\n\t\"./prism-asmatmel.min\": [\n\t\t51265,\n\t\t45212\n\t],\n\t\"./prism-asmatmel.min.js\": [\n\t\t51265,\n\t\t45212\n\t],\n\t\"./prism-aspnet\": [\n\t\t58076,\n\t\t36362\n\t],\n\t\"./prism-aspnet.js\": [\n\t\t58076,\n\t\t36362\n\t],\n\t\"./prism-aspnet.min\": [\n\t\t89070,\n\t\t45641\n\t],\n\t\"./prism-aspnet.min.js\": [\n\t\t89070,\n\t\t45641\n\t],\n\t\"./prism-autohotkey\": [\n\t\t55562,\n\t\t74364\n\t],\n\t\"./prism-autohotkey.js\": [\n\t\t55562,\n\t\t74364\n\t],\n\t\"./prism-autohotkey.min\": [\n\t\t76740,\n\t\t28055\n\t],\n\t\"./prism-autohotkey.min.js\": [\n\t\t76740,\n\t\t28055\n\t],\n\t\"./prism-autoit\": [\n\t\t60009,\n\t\t50661\n\t],\n\t\"./prism-autoit.js\": [\n\t\t60009,\n\t\t50661\n\t],\n\t\"./prism-autoit.min\": [\n\t\t77099,\n\t\t37790\n\t],\n\t\"./prism-autoit.min.js\": [\n\t\t77099,\n\t\t37790\n\t],\n\t\"./prism-avisynth\": [\n\t\t70191,\n\t\t61895\n\t],\n\t\"./prism-avisynth.js\": [\n\t\t70191,\n\t\t61895\n\t],\n\t\"./prism-avisynth.min\": [\n\t\t69169,\n\t\t80100\n\t],\n\t\"./prism-avisynth.min.js\": [\n\t\t69169,\n\t\t80100\n\t],\n\t\"./prism-avro-idl\": [\n\t\t84265,\n\t\t11241\n\t],\n\t\"./prism-avro-idl.js\": [\n\t\t84265,\n\t\t11241\n\t],\n\t\"./prism-avro-idl.min\": [\n\t\t41323,\n\t\t21450\n\t],\n\t\"./prism-avro-idl.min.js\": [\n\t\t41323,\n\t\t21450\n\t],\n\t\"./prism-awk\": [\n\t\t12402,\n\t\t26174\n\t],\n\t\"./prism-awk.js\": [\n\t\t12402,\n\t\t26174\n\t],\n\t\"./prism-awk.min\": [\n\t\t70604,\n\t\t64213\n\t],\n\t\"./prism-awk.min.js\": [\n\t\t70604,\n\t\t64213\n\t],\n\t\"./prism-bash\": [\n\t\t76149,\n\t\t90113\n\t],\n\t\"./prism-bash.js\": [\n\t\t76149,\n\t\t90113\n\t],\n\t\"./prism-bash.min\": [\n\t\t47564,\n\t\t33218\n\t],\n\t\"./prism-bash.min.js\": [\n\t\t47564,\n\t\t33218\n\t],\n\t\"./prism-basic\": [\n\t\t10861,\n\t\t33059\n\t],\n\t\"./prism-basic.js\": [\n\t\t10861,\n\t\t33059\n\t],\n\t\"./prism-basic.min\": [\n\t\t66231,\n\t\t61432\n\t],\n\t\"./prism-basic.min.js\": [\n\t\t66231,\n\t\t61432\n\t],\n\t\"./prism-batch\": [\n\t\t59251,\n\t\t49397\n\t],\n\t\"./prism-batch.js\": [\n\t\t59251,\n\t\t49397\n\t],\n\t\"./prism-batch.min\": [\n\t\t36077,\n\t\t36590\n\t],\n\t\"./prism-batch.min.js\": [\n\t\t36077,\n\t\t36590\n\t],\n\t\"./prism-bbcode\": [\n\t\t55694,\n\t\t34152\n\t],\n\t\"./prism-bbcode.js\": [\n\t\t55694,\n\t\t34152\n\t],\n\t\"./prism-bbcode.min\": [\n\t\t75776,\n\t\t62603\n\t],\n\t\"./prism-bbcode.min.js\": [\n\t\t75776,\n\t\t62603\n\t],\n\t\"./prism-bbj\": [\n\t\t26593,\n\t\t25171\n\t],\n\t\"./prism-bbj.js\": [\n\t\t26593,\n\t\t25171\n\t],\n\t\"./prism-bbj.min\": [\n\t\t96099,\n\t\t59720\n\t],\n\t\"./prism-bbj.min.js\": [\n\t\t96099,\n\t\t59720\n\t],\n\t\"./prism-bicep\": [\n\t\t60464,\n\t\t26692\n\t],\n\t\"./prism-bicep.js\": [\n\t\t60464,\n\t\t26692\n\t],\n\t\"./prism-bicep.min\": [\n\t\t5258,\n\t\t85023\n\t],\n\t\"./prism-bicep.min.js\": [\n\t\t5258,\n\t\t85023\n\t],\n\t\"./prism-birb\": [\n\t\t35994,\n\t\t58420\n\t],\n\t\"./prism-birb.js\": [\n\t\t35994,\n\t\t58420\n\t],\n\t\"./prism-birb.min\": [\n\t\t69492,\n\t\t42607\n\t],\n\t\"./prism-birb.min.js\": [\n\t\t69492,\n\t\t42607\n\t],\n\t\"./prism-bison\": [\n\t\t19748,\n\t\t59036\n\t],\n\t\"./prism-bison.js\": [\n\t\t19748,\n\t\t59036\n\t],\n\t\"./prism-bison.min\": [\n\t\t44694,\n\t\t16599\n\t],\n\t\"./prism-bison.min.js\": [\n\t\t44694,\n\t\t16599\n\t],\n\t\"./prism-bnf\": [\n\t\t68457,\n\t\t24059\n\t],\n\t\"./prism-bnf.js\": [\n\t\t68457,\n\t\t24059\n\t],\n\t\"./prism-bnf.min\": [\n\t\t87723,\n\t\t71472\n\t],\n\t\"./prism-bnf.min.js\": [\n\t\t87723,\n\t\t71472\n\t],\n\t\"./prism-bqn\": [\n\t\t90534,\n\t\t44534\n\t],\n\t\"./prism-bqn.js\": [\n\t\t90534,\n\t\t44534\n\t],\n\t\"./prism-bqn.min\": [\n\t\t64248,\n\t\t65837\n\t],\n\t\"./prism-bqn.min.js\": [\n\t\t64248,\n\t\t65837\n\t],\n\t\"./prism-brainfuck\": [\n\t\t67952,\n\t\t62080\n\t],\n\t\"./prism-brainfuck.js\": [\n\t\t67952,\n\t\t62080\n\t],\n\t\"./prism-brainfuck.min\": [\n\t\t57482,\n\t\t18403\n\t],\n\t\"./prism-brainfuck.min.js\": [\n\t\t57482,\n\t\t18403\n\t],\n\t\"./prism-brightscript\": [\n\t\t40736,\n\t\t2234\n\t],\n\t\"./prism-brightscript.js\": [\n\t\t40736,\n\t\t2234\n\t],\n\t\"./prism-brightscript.min\": [\n\t\t16378,\n\t\t66457\n\t],\n\t\"./prism-brightscript.min.js\": [\n\t\t16378,\n\t\t66457\n\t],\n\t\"./prism-bro\": [\n\t\t80366,\n\t\t99806\n\t],\n\t\"./prism-bro.js\": [\n\t\t80366,\n\t\t99806\n\t],\n\t\"./prism-bro.min\": [\n\t\t10016,\n\t\t77717\n\t],\n\t\"./prism-bro.min.js\": [\n\t\t10016,\n\t\t77717\n\t],\n\t\"./prism-bsl\": [\n\t\t17214,\n\t\t41170\n\t],\n\t\"./prism-bsl.js\": [\n\t\t17214,\n\t\t41170\n\t],\n\t\"./prism-bsl.min\": [\n\t\t23792,\n\t\t64273\n\t],\n\t\"./prism-bsl.min.js\": [\n\t\t23792,\n\t\t64273\n\t],\n\t\"./prism-c\": [\n\t\t47646,\n\t\t92130\n\t],\n\t\"./prism-c.js\": [\n\t\t47646,\n\t\t92130\n\t],\n\t\"./prism-c.min\": [\n\t\t83088,\n\t\t24641\n\t],\n\t\"./prism-c.min.js\": [\n\t\t83088,\n\t\t24641\n\t],\n\t\"./prism-cfscript\": [\n\t\t38833,\n\t\t5929\n\t],\n\t\"./prism-cfscript.js\": [\n\t\t38833,\n\t\t5929\n\t],\n\t\"./prism-cfscript.min\": [\n\t\t36947,\n\t\t30506\n\t],\n\t\"./prism-cfscript.min.js\": [\n\t\t36947,\n\t\t30506\n\t],\n\t\"./prism-chaiscript\": [\n\t\t91233,\n\t\t58289\n\t],\n\t\"./prism-chaiscript.js\": [\n\t\t91233,\n\t\t58289\n\t],\n\t\"./prism-chaiscript.min\": [\n\t\t56579,\n\t\t73842\n\t],\n\t\"./prism-chaiscript.min.js\": [\n\t\t56579,\n\t\t73842\n\t],\n\t\"./prism-cil\": [\n\t\t22215,\n\t\t86985\n\t],\n\t\"./prism-cil.js\": [\n\t\t22215,\n\t\t86985\n\t],\n\t\"./prism-cil.min\": [\n\t\t71369,\n\t\t39658\n\t],\n\t\"./prism-cil.min.js\": [\n\t\t71369,\n\t\t39658\n\t],\n\t\"./prism-cilkc\": [\n\t\t32838,\n\t\t76899\n\t],\n\t\"./prism-cilkc.js\": [\n\t\t32838,\n\t\t76899\n\t],\n\t\"./prism-cilkc.min\": [\n\t\t62811,\n\t\t4920\n\t],\n\t\"./prism-cilkc.min.js\": [\n\t\t62811,\n\t\t4920\n\t],\n\t\"./prism-cilkcpp\": [\n\t\t59497,\n\t\t36923\n\t],\n\t\"./prism-cilkcpp.js\": [\n\t\t59497,\n\t\t36923\n\t],\n\t\"./prism-cilkcpp.min\": [\n\t\t81387,\n\t\t2704\n\t],\n\t\"./prism-cilkcpp.min.js\": [\n\t\t81387,\n\t\t2704\n\t],\n\t\"./prism-clike\": [\n\t\t83241,\n\t\t53383\n\t],\n\t\"./prism-clike.js\": [\n\t\t83241,\n\t\t53383\n\t],\n\t\"./prism-clike.min\": [\n\t\t20843,\n\t\t46628\n\t],\n\t\"./prism-clike.min.js\": [\n\t\t20843,\n\t\t46628\n\t],\n\t\"./prism-clojure\": [\n\t\t3847,\n\t\t25941\n\t],\n\t\"./prism-clojure.js\": [\n\t\t3847,\n\t\t25941\n\t],\n\t\"./prism-clojure.min\": [\n\t\t88873,\n\t\t29102\n\t],\n\t\"./prism-clojure.min.js\": [\n\t\t88873,\n\t\t29102\n\t],\n\t\"./prism-cmake\": [\n\t\t83540,\n\t\t58644\n\t],\n\t\"./prism-cmake.js\": [\n\t\t83540,\n\t\t58644\n\t],\n\t\"./prism-cmake.min\": [\n\t\t72678,\n\t\t66607\n\t],\n\t\"./prism-cmake.min.js\": [\n\t\t72678,\n\t\t66607\n\t],\n\t\"./prism-cobol\": [\n\t\t82404,\n\t\t32720\n\t],\n\t\"./prism-cobol.js\": [\n\t\t82404,\n\t\t32720\n\t],\n\t\"./prism-cobol.min\": [\n\t\t35862,\n\t\t47539\n\t],\n\t\"./prism-cobol.min.js\": [\n\t\t35862,\n\t\t47539\n\t],\n\t\"./prism-coffeescript\": [\n\t\t27296,\n\t\t95070\n\t],\n\t\"./prism-coffeescript.js\": [\n\t\t27296,\n\t\t95070\n\t],\n\t\"./prism-coffeescript.min\": [\n\t\t72794,\n\t\t30869\n\t],\n\t\"./prism-coffeescript.min.js\": [\n\t\t72794,\n\t\t30869\n\t],\n\t\"./prism-concurnas\": [\n\t\t37587,\n\t\t14457\n\t],\n\t\"./prism-concurnas.js\": [\n\t\t37587,\n\t\t14457\n\t],\n\t\"./prism-concurnas.min\": [\n\t\t33805,\n\t\t88858\n\t],\n\t\"./prism-concurnas.min.js\": [\n\t\t33805,\n\t\t88858\n\t],\n\t\"./prism-cooklang\": [\n\t\t53603,\n\t\t43199\n\t],\n\t\"./prism-cooklang.js\": [\n\t\t53603,\n\t\t43199\n\t],\n\t\"./prism-cooklang.min\": [\n\t\t31357,\n\t\t4540\n\t],\n\t\"./prism-cooklang.min.js\": [\n\t\t31357,\n\t\t4540\n\t],\n\t\"./prism-coq\": [\n\t\t302,\n\t\t20506\n\t],\n\t\"./prism-coq.js\": [\n\t\t302,\n\t\t20506\n\t],\n\t\"./prism-coq.min\": [\n\t\t49408,\n\t\t97209\n\t],\n\t\"./prism-coq.min.js\": [\n\t\t49408,\n\t\t97209\n\t],\n\t\"./prism-core\": [\n\t\t6136\n\t],\n\t\"./prism-core.js\": [\n\t\t6136\n\t],\n\t\"./prism-core.min\": [\n\t\t48274,\n\t\t21493\n\t],\n\t\"./prism-core.min.js\": [\n\t\t48274,\n\t\t21493\n\t],\n\t\"./prism-cpp\": [\n\t\t63782,\n\t\t49234\n\t],\n\t\"./prism-cpp.js\": [\n\t\t63782,\n\t\t49234\n\t],\n\t\"./prism-cpp.min\": [\n\t\t62808,\n\t\t84113\n\t],\n\t\"./prism-cpp.min.js\": [\n\t\t62808,\n\t\t84113\n\t],\n\t\"./prism-crystal\": [\n\t\t30001,\n\t\t35095\n\t],\n\t\"./prism-crystal.js\": [\n\t\t30001,\n\t\t35095\n\t],\n\t\"./prism-crystal.min\": [\n\t\t17139,\n\t\t43412\n\t],\n\t\"./prism-crystal.min.js\": [\n\t\t17139,\n\t\t43412\n\t],\n\t\"./prism-csharp\": [\n\t\t34036,\n\t\t83914\n\t],\n\t\"./prism-csharp.js\": [\n\t\t34036,\n\t\t83914\n\t],\n\t\"./prism-csharp.min\": [\n\t\t80102,\n\t\t25993\n\t],\n\t\"./prism-csharp.min.js\": [\n\t\t80102,\n\t\t25993\n\t],\n\t\"./prism-cshtml\": [\n\t\t82500,\n\t\t7398\n\t],\n\t\"./prism-cshtml.js\": [\n\t\t82500,\n\t\t7398\n\t],\n\t\"./prism-cshtml.min\": [\n\t\t49846,\n\t\t22077\n\t],\n\t\"./prism-cshtml.min.js\": [\n\t\t49846,\n\t\t22077\n\t],\n\t\"./prism-csp\": [\n\t\t68889,\n\t\t27911\n\t],\n\t\"./prism-csp.js\": [\n\t\t68889,\n\t\t27911\n\t],\n\t\"./prism-csp.min\": [\n\t\t65467,\n\t\t26756\n\t],\n\t\"./prism-csp.min.js\": [\n\t\t65467,\n\t\t26756\n\t],\n\t\"./prism-css\": [\n\t\t50944,\n\t\t21548\n\t],\n\t\"./prism-css-extras\": [\n\t\t97397,\n\t\t71380\n\t],\n\t\"./prism-css-extras.js\": [\n\t\t97397,\n\t\t71380\n\t],\n\t\"./prism-css-extras.min\": [\n\t\t73948,\n\t\t36207\n\t],\n\t\"./prism-css-extras.min.js\": [\n\t\t73948,\n\t\t36207\n\t],\n\t\"./prism-css.js\": [\n\t\t50944,\n\t\t21548\n\t],\n\t\"./prism-css.min\": [\n\t\t95450,\n\t\t39431\n\t],\n\t\"./prism-css.min.js\": [\n\t\t95450,\n\t\t39431\n\t],\n\t\"./prism-csv\": [\n\t\t76147,\n\t\t31697\n\t],\n\t\"./prism-csv.js\": [\n\t\t76147,\n\t\t31697\n\t],\n\t\"./prism-csv.min\": [\n\t\t13165,\n\t\t76402\n\t],\n\t\"./prism-csv.min.js\": [\n\t\t13165,\n\t\t76402\n\t],\n\t\"./prism-cue\": [\n\t\t29204,\n\t\t71164\n\t],\n\t\"./prism-cue.js\": [\n\t\t29204,\n\t\t71164\n\t],\n\t\"./prism-cue.min\": [\n\t\t12294,\n\t\t81527\n\t],\n\t\"./prism-cue.min.js\": [\n\t\t12294,\n\t\t81527\n\t],\n\t\"./prism-cypher\": [\n\t\t61128,\n\t\t84250\n\t],\n\t\"./prism-cypher.js\": [\n\t\t61128,\n\t\t84250\n\t],\n\t\"./prism-cypher.min\": [\n\t\t28098,\n\t\t5689\n\t],\n\t\"./prism-cypher.min.js\": [\n\t\t28098,\n\t\t5689\n\t],\n\t\"./prism-d\": [\n\t\t38143,\n\t\t30557\n\t],\n\t\"./prism-d.js\": [\n\t\t38143,\n\t\t30557\n\t],\n\t\"./prism-d.min\": [\n\t\t77825,\n\t\t48822\n\t],\n\t\"./prism-d.min.js\": [\n\t\t77825,\n\t\t48822\n\t],\n\t\"./prism-dart\": [\n\t\t21846,\n\t\t91900\n\t],\n\t\"./prism-dart.js\": [\n\t\t21846,\n\t\t91900\n\t],\n\t\"./prism-dart.min\": [\n\t\t25672,\n\t\t14391\n\t],\n\t\"./prism-dart.min.js\": [\n\t\t25672,\n\t\t14391\n\t],\n\t\"./prism-dataweave\": [\n\t\t37581,\n\t\t25763\n\t],\n\t\"./prism-dataweave.js\": [\n\t\t37581,\n\t\t25763\n\t],\n\t\"./prism-dataweave.min\": [\n\t\t93783,\n\t\t82808\n\t],\n\t\"./prism-dataweave.min.js\": [\n\t\t93783,\n\t\t82808\n\t],\n\t\"./prism-dax\": [\n\t\t58058,\n\t\t71714\n\t],\n\t\"./prism-dax.js\": [\n\t\t58058,\n\t\t71714\n\t],\n\t\"./prism-dax.min\": [\n\t\t3044,\n\t\t16705\n\t],\n\t\"./prism-dax.min.js\": [\n\t\t3044,\n\t\t16705\n\t],\n\t\"./prism-dhall\": [\n\t\t86464,\n\t\t54956\n\t],\n\t\"./prism-dhall.js\": [\n\t\t86464,\n\t\t54956\n\t],\n\t\"./prism-dhall.min\": [\n\t\t70586,\n\t\t96711\n\t],\n\t\"./prism-dhall.min.js\": [\n\t\t70586,\n\t\t96711\n\t],\n\t\"./prism-diff\": [\n\t\t11632,\n\t\t92426\n\t],\n\t\"./prism-diff.js\": [\n\t\t11632,\n\t\t92426\n\t],\n\t\"./prism-diff.min\": [\n\t\t82922,\n\t\t89513\n\t],\n\t\"./prism-diff.min.js\": [\n\t\t82922,\n\t\t89513\n\t],\n\t\"./prism-django\": [\n\t\t94444,\n\t\t22974\n\t],\n\t\"./prism-django.js\": [\n\t\t94444,\n\t\t22974\n\t],\n\t\"./prism-django.min\": [\n\t\t67582,\n\t\t3765\n\t],\n\t\"./prism-django.min.js\": [\n\t\t67582,\n\t\t3765\n\t],\n\t\"./prism-dns-zone-file\": [\n\t\t5110,\n\t\t10938\n\t],\n\t\"./prism-dns-zone-file.js\": [\n\t\t5110,\n\t\t10938\n\t],\n\t\"./prism-dns-zone-file.min\": [\n\t\t16872,\n\t\t22521\n\t],\n\t\"./prism-dns-zone-file.min.js\": [\n\t\t16872,\n\t\t22521\n\t],\n\t\"./prism-docker\": [\n\t\t72775,\n\t\t88563\n\t],\n\t\"./prism-docker.js\": [\n\t\t72775,\n\t\t88563\n\t],\n\t\"./prism-docker.min\": [\n\t\t34345,\n\t\t22248\n\t],\n\t\"./prism-docker.min.js\": [\n\t\t34345,\n\t\t22248\n\t],\n\t\"./prism-dot\": [\n\t\t40672,\n\t\t57684\n\t],\n\t\"./prism-dot.js\": [\n\t\t40672,\n\t\t57684\n\t],\n\t\"./prism-dot.min\": [\n\t\t6586,\n\t\t44911\n\t],\n\t\"./prism-dot.min.js\": [\n\t\t6586,\n\t\t44911\n\t],\n\t\"./prism-ebnf\": [\n\t\t21984,\n\t\t45322\n\t],\n\t\"./prism-ebnf.js\": [\n\t\t21984,\n\t\t45322\n\t],\n\t\"./prism-ebnf.min\": [\n\t\t27770,\n\t\t68937\n\t],\n\t\"./prism-ebnf.min.js\": [\n\t\t27770,\n\t\t68937\n\t],\n\t\"./prism-editorconfig\": [\n\t\t93964,\n\t\t47974\n\t],\n\t\"./prism-editorconfig.js\": [\n\t\t93964,\n\t\t47974\n\t],\n\t\"./prism-editorconfig.min\": [\n\t\t43550,\n\t\t44157\n\t],\n\t\"./prism-editorconfig.min.js\": [\n\t\t43550,\n\t\t44157\n\t],\n\t\"./prism-eiffel\": [\n\t\t65184,\n\t\t44330\n\t],\n\t\"./prism-eiffel.js\": [\n\t\t65184,\n\t\t44330\n\t],\n\t\"./prism-eiffel.min\": [\n\t\t15386,\n\t\t233\n\t],\n\t\"./prism-eiffel.min.js\": [\n\t\t15386,\n\t\t233\n\t],\n\t\"./prism-ejs\": [\n\t\t52807,\n\t\t17273\n\t],\n\t\"./prism-ejs.js\": [\n\t\t52807,\n\t\t17273\n\t],\n\t\"./prism-ejs.min\": [\n\t\t31817,\n\t\t78394\n\t],\n\t\"./prism-ejs.min.js\": [\n\t\t31817,\n\t\t78394\n\t],\n\t\"./prism-elixir\": [\n\t\t12244,\n\t\t61618\n\t],\n\t\"./prism-elixir.js\": [\n\t\t12244,\n\t\t61618\n\t],\n\t\"./prism-elixir.min\": [\n\t\t21062,\n\t\t40113\n\t],\n\t\"./prism-elixir.min.js\": [\n\t\t21062,\n\t\t40113\n\t],\n\t\"./prism-elm\": [\n\t\t30527,\n\t\t56997\n\t],\n\t\"./prism-elm.js\": [\n\t\t30527,\n\t\t56997\n\t],\n\t\"./prism-elm.min\": [\n\t\t49633,\n\t\t9310\n\t],\n\t\"./prism-elm.min.js\": [\n\t\t49633,\n\t\t9310\n\t],\n\t\"./prism-erb\": [\n\t\t90456,\n\t\t74376\n\t],\n\t\"./prism-erb.js\": [\n\t\t90456,\n\t\t74376\n\t],\n\t\"./prism-erb.min\": [\n\t\t52370,\n\t\t62699\n\t],\n\t\"./prism-erb.min.js\": [\n\t\t52370,\n\t\t62699\n\t],\n\t\"./prism-erlang\": [\n\t\t84384,\n\t\t85874\n\t],\n\t\"./prism-erlang.js\": [\n\t\t84384,\n\t\t85874\n\t],\n\t\"./prism-erlang.min\": [\n\t\t89370,\n\t\t93649\n\t],\n\t\"./prism-erlang.min.js\": [\n\t\t89370,\n\t\t93649\n\t],\n\t\"./prism-etlua\": [\n\t\t64258,\n\t\t28730\n\t],\n\t\"./prism-etlua.js\": [\n\t\t64258,\n\t\t28730\n\t],\n\t\"./prism-etlua.min\": [\n\t\t1660,\n\t\t22137\n\t],\n\t\"./prism-etlua.min.js\": [\n\t\t1660,\n\t\t22137\n\t],\n\t\"./prism-excel-formula\": [\n\t\t35959,\n\t\t12729\n\t],\n\t\"./prism-excel-formula.js\": [\n\t\t35959,\n\t\t12729\n\t],\n\t\"./prism-excel-formula.min\": [\n\t\t84665,\n\t\t54330\n\t],\n\t\"./prism-excel-formula.min.js\": [\n\t\t84665,\n\t\t54330\n\t],\n\t\"./prism-factor\": [\n\t\t35844,\n\t\t12158\n\t],\n\t\"./prism-factor.js\": [\n\t\t35844,\n\t\t12158\n\t],\n\t\"./prism-factor.min\": [\n\t\t49078,\n\t\t14901\n\t],\n\t\"./prism-factor.min.js\": [\n\t\t49078,\n\t\t14901\n\t],\n\t\"./prism-false\": [\n\t\t52724,\n\t\t68124\n\t],\n\t\"./prism-false.js\": [\n\t\t52724,\n\t\t68124\n\t],\n\t\"./prism-false.min\": [\n\t\t45798,\n\t\t93495\n\t],\n\t\"./prism-false.min.js\": [\n\t\t45798,\n\t\t93495\n\t],\n\t\"./prism-firestore-security-rules\": [\n\t\t8711,\n\t\t50531\n\t],\n\t\"./prism-firestore-security-rules.js\": [\n\t\t8711,\n\t\t50531\n\t],\n\t\"./prism-firestore-security-rules.min\": [\n\t\t20905,\n\t\t18552\n\t],\n\t\"./prism-firestore-security-rules.min.js\": [\n\t\t20905,\n\t\t18552\n\t],\n\t\"./prism-flow\": [\n\t\t88995,\n\t\t98307\n\t],\n\t\"./prism-flow.js\": [\n\t\t88995,\n\t\t98307\n\t],\n\t\"./prism-flow.min\": [\n\t\t47293,\n\t\t62680\n\t],\n\t\"./prism-flow.min.js\": [\n\t\t47293,\n\t\t62680\n\t],\n\t\"./prism-fortran\": [\n\t\t93329,\n\t\t80179\n\t],\n\t\"./prism-fortran.js\": [\n\t\t93329,\n\t\t80179\n\t],\n\t\"./prism-fortran.min\": [\n\t\t5843,\n\t\t4488\n\t],\n\t\"./prism-fortran.min.js\": [\n\t\t5843,\n\t\t4488\n\t],\n\t\"./prism-fsharp\": [\n\t\t18977,\n\t\t65941\n\t],\n\t\"./prism-fsharp.js\": [\n\t\t18977,\n\t\t65941\n\t],\n\t\"./prism-fsharp.min\": [\n\t\t88752,\n\t\t31406\n\t],\n\t\"./prism-fsharp.min.js\": [\n\t\t88752,\n\t\t31406\n\t],\n\t\"./prism-ftl\": [\n\t\t40201,\n\t\t65335\n\t],\n\t\"./prism-ftl.js\": [\n\t\t40201,\n\t\t65335\n\t],\n\t\"./prism-ftl.min\": [\n\t\t7147,\n\t\t4148\n\t],\n\t\"./prism-ftl.min.js\": [\n\t\t7147,\n\t\t4148\n\t],\n\t\"./prism-gap\": [\n\t\t61703,\n\t\t48209\n\t],\n\t\"./prism-gap.js\": [\n\t\t61703,\n\t\t48209\n\t],\n\t\"./prism-gap.min\": [\n\t\t70217,\n\t\t14610\n\t],\n\t\"./prism-gap.min.js\": [\n\t\t70217,\n\t\t14610\n\t],\n\t\"./prism-gcode\": [\n\t\t77927,\n\t\t50589\n\t],\n\t\"./prism-gcode.js\": [\n\t\t77927,\n\t\t50589\n\t],\n\t\"./prism-gcode.min\": [\n\t\t47497,\n\t\t31894\n\t],\n\t\"./prism-gcode.min.js\": [\n\t\t47497,\n\t\t31894\n\t],\n\t\"./prism-gdscript\": [\n\t\t49959,\n\t\t12699\n\t],\n\t\"./prism-gdscript.js\": [\n\t\t49959,\n\t\t12699\n\t],\n\t\"./prism-gdscript.min\": [\n\t\t20041,\n\t\t32528\n\t],\n\t\"./prism-gdscript.min.js\": [\n\t\t20041,\n\t\t32528\n\t],\n\t\"./prism-gedcom\": [\n\t\t20198,\n\t\t45920\n\t],\n\t\"./prism-gedcom.js\": [\n\t\t20198,\n\t\t45920\n\t],\n\t\"./prism-gedcom.min\": [\n\t\t33368,\n\t\t86883\n\t],\n\t\"./prism-gedcom.min.js\": [\n\t\t33368,\n\t\t86883\n\t],\n\t\"./prism-gettext\": [\n\t\t39612,\n\t\t34764\n\t],\n\t\"./prism-gettext.js\": [\n\t\t39612,\n\t\t34764\n\t],\n\t\"./prism-gettext.min\": [\n\t\t55630,\n\t\t18631\n\t],\n\t\"./prism-gettext.min.js\": [\n\t\t55630,\n\t\t18631\n\t],\n\t\"./prism-gherkin\": [\n\t\t50389,\n\t\t45995\n\t],\n\t\"./prism-gherkin.js\": [\n\t\t50389,\n\t\t45995\n\t],\n\t\"./prism-gherkin.min\": [\n\t\t42239,\n\t\t77536\n\t],\n\t\"./prism-gherkin.min.js\": [\n\t\t42239,\n\t\t77536\n\t],\n\t\"./prism-git\": [\n\t\t86827,\n\t\t42605\n\t],\n\t\"./prism-git.js\": [\n\t\t86827,\n\t\t42605\n\t],\n\t\"./prism-git.min\": [\n\t\t18981,\n\t\t44166\n\t],\n\t\"./prism-git.min.js\": [\n\t\t18981,\n\t\t44166\n\t],\n\t\"./prism-glsl\": [\n\t\t39871,\n\t\t61647\n\t],\n\t\"./prism-glsl.js\": [\n\t\t39871,\n\t\t61647\n\t],\n\t\"./prism-glsl.min\": [\n\t\t82977,\n\t\t33804\n\t],\n\t\"./prism-glsl.min.js\": [\n\t\t82977,\n\t\t33804\n\t],\n\t\"./prism-gml\": [\n\t\t64175,\n\t\t74169\n\t],\n\t\"./prism-gml.js\": [\n\t\t64175,\n\t\t74169\n\t],\n\t\"./prism-gml.min\": [\n\t\t16881,\n\t\t92666\n\t],\n\t\"./prism-gml.min.js\": [\n\t\t16881,\n\t\t92666\n\t],\n\t\"./prism-gn\": [\n\t\t92278,\n\t\t29612\n\t],\n\t\"./prism-gn.js\": [\n\t\t92278,\n\t\t29612\n\t],\n\t\"./prism-gn.min\": [\n\t\t70056,\n\t\t2599\n\t],\n\t\"./prism-gn.min.js\": [\n\t\t70056,\n\t\t2599\n\t],\n\t\"./prism-go\": [\n\t\t4117,\n\t\t94005\n\t],\n\t\"./prism-go-module\": [\n\t\t89750,\n\t\t88382\n\t],\n\t\"./prism-go-module.js\": [\n\t\t89750,\n\t\t88382\n\t],\n\t\"./prism-go-module.min\": [\n\t\t26152,\n\t\t93973\n\t],\n\t\"./prism-go-module.min.js\": [\n\t\t26152,\n\t\t93973\n\t],\n\t\"./prism-go.js\": [\n\t\t4117,\n\t\t94005\n\t],\n\t\"./prism-go.min\": [\n\t\t33439,\n\t\t35758\n\t],\n\t\"./prism-go.min.js\": [\n\t\t33439,\n\t\t35758\n\t],\n\t\"./prism-gradle\": [\n\t\t11692,\n\t\t63454\n\t],\n\t\"./prism-gradle.js\": [\n\t\t11692,\n\t\t63454\n\t],\n\t\"./prism-gradle.min\": [\n\t\t20830,\n\t\t98773\n\t],\n\t\"./prism-gradle.min.js\": [\n\t\t20830,\n\t\t98773\n\t],\n\t\"./prism-graphql\": [\n\t\t56734,\n\t\t69946\n\t],\n\t\"./prism-graphql.js\": [\n\t\t56734,\n\t\t69946\n\t],\n\t\"./prism-graphql.min\": [\n\t\t64880,\n\t\t39033\n\t],\n\t\"./prism-graphql.min.js\": [\n\t\t64880,\n\t\t39033\n\t],\n\t\"./prism-groovy\": [\n\t\t46497,\n\t\t34641\n\t],\n\t\"./prism-groovy.js\": [\n\t\t46497,\n\t\t34641\n\t],\n\t\"./prism-groovy.min\": [\n\t\t95491,\n\t\t44018\n\t],\n\t\"./prism-groovy.min.js\": [\n\t\t95491,\n\t\t44018\n\t],\n\t\"./prism-haml\": [\n\t\t20601,\n\t\t60701\n\t],\n\t\"./prism-haml.js\": [\n\t\t20601,\n\t\t60701\n\t],\n\t\"./prism-haml.min\": [\n\t\t68475,\n\t\t59670\n\t],\n\t\"./prism-haml.min.js\": [\n\t\t68475,\n\t\t59670\n\t],\n\t\"./prism-handlebars\": [\n\t\t92503,\n\t\t80779\n\t],\n\t\"./prism-handlebars.js\": [\n\t\t92503,\n\t\t80779\n\t],\n\t\"./prism-handlebars.min\": [\n\t\t64153,\n\t\t46848\n\t],\n\t\"./prism-handlebars.min.js\": [\n\t\t64153,\n\t\t46848\n\t],\n\t\"./prism-haskell\": [\n\t\t31151,\n\t\t84809\n\t],\n\t\"./prism-haskell.js\": [\n\t\t31151,\n\t\t84809\n\t],\n\t\"./prism-haskell.min\": [\n\t\t85905,\n\t\t39914\n\t],\n\t\"./prism-haskell.min.js\": [\n\t\t85905,\n\t\t39914\n\t],\n\t\"./prism-haxe\": [\n\t\t58823,\n\t\t47039\n\t],\n\t\"./prism-haxe.js\": [\n\t\t58823,\n\t\t47039\n\t],\n\t\"./prism-haxe.min\": [\n\t\t75913,\n\t\t27100\n\t],\n\t\"./prism-haxe.min.js\": [\n\t\t75913,\n\t\t27100\n\t],\n\t\"./prism-hcl\": [\n\t\t14688,\n\t\t68708\n\t],\n\t\"./prism-hcl.js\": [\n\t\t14688,\n\t\t68708\n\t],\n\t\"./prism-hcl.min\": [\n\t\t53658,\n\t\t91327\n\t],\n\t\"./prism-hcl.min.js\": [\n\t\t53658,\n\t\t91327\n\t],\n\t\"./prism-hlsl\": [\n\t\t66820,\n\t\t96046\n\t],\n\t\"./prism-hlsl.js\": [\n\t\t66820,\n\t\t96046\n\t],\n\t\"./prism-hlsl.min\": [\n\t\t67030,\n\t\t28933\n\t],\n\t\"./prism-hlsl.min.js\": [\n\t\t67030,\n\t\t28933\n\t],\n\t\"./prism-hoon\": [\n\t\t4827,\n\t\t45983\n\t],\n\t\"./prism-hoon.js\": [\n\t\t4827,\n\t\t45983\n\t],\n\t\"./prism-hoon.min\": [\n\t\t16437,\n\t\t96892\n\t],\n\t\"./prism-hoon.min.js\": [\n\t\t16437,\n\t\t96892\n\t],\n\t\"./prism-hpkp\": [\n\t\t16252,\n\t\t78382\n\t],\n\t\"./prism-hpkp.js\": [\n\t\t16252,\n\t\t78382\n\t],\n\t\"./prism-hpkp.min\": [\n\t\t65262,\n\t\t92101\n\t],\n\t\"./prism-hpkp.min.js\": [\n\t\t65262,\n\t\t92101\n\t],\n\t\"./prism-hsts\": [\n\t\t68503,\n\t\t84367\n\t],\n\t\"./prism-hsts.js\": [\n\t\t68503,\n\t\t84367\n\t],\n\t\"./prism-hsts.min\": [\n\t\t6233,\n\t\t79532\n\t],\n\t\"./prism-hsts.min.js\": [\n\t\t6233,\n\t\t79532\n\t],\n\t\"./prism-http\": [\n\t\t84155,\n\t\t69203\n\t],\n\t\"./prism-http.js\": [\n\t\t84155,\n\t\t69203\n\t],\n\t\"./prism-http.min\": [\n\t\t40341,\n\t\t25832\n\t],\n\t\"./prism-http.min.js\": [\n\t\t40341,\n\t\t25832\n\t],\n\t\"./prism-ichigojam\": [\n\t\t42704,\n\t\t61052\n\t],\n\t\"./prism-ichigojam.js\": [\n\t\t42704,\n\t\t61052\n\t],\n\t\"./prism-ichigojam.min\": [\n\t\t62602,\n\t\t68151\n\t],\n\t\"./prism-ichigojam.min.js\": [\n\t\t62602,\n\t\t68151\n\t],\n\t\"./prism-icon\": [\n\t\t65894,\n\t\t74420\n\t],\n\t\"./prism-icon.js\": [\n\t\t65894,\n\t\t74420\n\t],\n\t\"./prism-icon.min\": [\n\t\t63224,\n\t\t69135\n\t],\n\t\"./prism-icon.min.js\": [\n\t\t63224,\n\t\t69135\n\t],\n\t\"./prism-icu-message-format\": [\n\t\t42340,\n\t\t31174\n\t],\n\t\"./prism-icu-message-format.js\": [\n\t\t42340,\n\t\t31174\n\t],\n\t\"./prism-icu-message-format.min\": [\n\t\t48086,\n\t\t18045\n\t],\n\t\"./prism-icu-message-format.min.js\": [\n\t\t48086,\n\t\t18045\n\t],\n\t\"./prism-idris\": [\n\t\t78858,\n\t\t68914\n\t],\n\t\"./prism-idris.js\": [\n\t\t78858,\n\t\t68914\n\t],\n\t\"./prism-idris.min\": [\n\t\t28452,\n\t\t79985\n\t],\n\t\"./prism-idris.min.js\": [\n\t\t28452,\n\t\t79985\n\t],\n\t\"./prism-iecst\": [\n\t\t11431,\n\t\t52209\n\t],\n\t\"./prism-iecst.js\": [\n\t\t11431,\n\t\t52209\n\t],\n\t\"./prism-iecst.min\": [\n\t\t34505,\n\t\t75826\n\t],\n\t\"./prism-iecst.min.js\": [\n\t\t34505,\n\t\t75826\n\t],\n\t\"./prism-ignore\": [\n\t\t25569,\n\t\t26029\n\t],\n\t\"./prism-ignore.js\": [\n\t\t25569,\n\t\t26029\n\t],\n\t\"./prism-ignore.min\": [\n\t\t70467,\n\t\t4198\n\t],\n\t\"./prism-ignore.min.js\": [\n\t\t70467,\n\t\t4198\n\t],\n\t\"./prism-inform7\": [\n\t\t13485,\n\t\t29771\n\t],\n\t\"./prism-inform7.js\": [\n\t\t13485,\n\t\t29771\n\t],\n\t\"./prism-inform7.min\": [\n\t\t43127,\n\t\t74304\n\t],\n\t\"./prism-inform7.min.js\": [\n\t\t43127,\n\t\t74304\n\t],\n\t\"./prism-ini\": [\n\t\t17009,\n\t\t31123\n\t],\n\t\"./prism-ini.js\": [\n\t\t17009,\n\t\t31123\n\t],\n\t\"./prism-ini.min\": [\n\t\t1267,\n\t\t80264\n\t],\n\t\"./prism-ini.min.js\": [\n\t\t1267,\n\t\t80264\n\t],\n\t\"./prism-io\": [\n\t\t56959,\n\t\t53087\n\t],\n\t\"./prism-io.js\": [\n\t\t56959,\n\t\t53087\n\t],\n\t\"./prism-io.min\": [\n\t\t68257,\n\t\t3292\n\t],\n\t\"./prism-io.min.js\": [\n\t\t68257,\n\t\t3292\n\t],\n\t\"./prism-j\": [\n\t\t46581,\n\t\t42963\n\t],\n\t\"./prism-j.js\": [\n\t\t46581,\n\t\t42963\n\t],\n\t\"./prism-j.min\": [\n\t\t73055,\n\t\t50472\n\t],\n\t\"./prism-j.min.js\": [\n\t\t73055,\n\t\t50472\n\t],\n\t\"./prism-java\": [\n\t\t66043,\n\t\t98587\n\t],\n\t\"./prism-java.js\": [\n\t\t66043,\n\t\t98587\n\t],\n\t\"./prism-java.min\": [\n\t\t59701,\n\t\t36176\n\t],\n\t\"./prism-java.min.js\": [\n\t\t59701,\n\t\t36176\n\t],\n\t\"./prism-javadoc\": [\n\t\t17381,\n\t\t2867\n\t],\n\t\"./prism-javadoc.js\": [\n\t\t17381,\n\t\t2867\n\t],\n\t\"./prism-javadoc.min\": [\n\t\t89231,\n\t\t39624\n\t],\n\t\"./prism-javadoc.min.js\": [\n\t\t89231,\n\t\t39624\n\t],\n\t\"./prism-javadoclike\": [\n\t\t21970,\n\t\t22774\n\t],\n\t\"./prism-javadoclike.js\": [\n\t\t21970,\n\t\t22774\n\t],\n\t\"./prism-javadoclike.min\": [\n\t\t23340,\n\t\t33261\n\t],\n\t\"./prism-javadoclike.min.js\": [\n\t\t23340,\n\t\t33261\n\t],\n\t\"./prism-javascript\": [\n\t\t53636,\n\t\t86274\n\t],\n\t\"./prism-javascript.js\": [\n\t\t53636,\n\t\t86274\n\t],\n\t\"./prism-javascript.min\": [\n\t\t77782,\n\t\t10497\n\t],\n\t\"./prism-javascript.min.js\": [\n\t\t77782,\n\t\t10497\n\t],\n\t\"./prism-javastacktrace\": [\n\t\t65334,\n\t\t94696\n\t],\n\t\"./prism-javastacktrace.js\": [\n\t\t65334,\n\t\t94696\n\t],\n\t\"./prism-javastacktrace.min\": [\n\t\t87400,\n\t\t53291\n\t],\n\t\"./prism-javastacktrace.min.js\": [\n\t\t87400,\n\t\t53291\n\t],\n\t\"./prism-jexl\": [\n\t\t81794,\n\t\t62352\n\t],\n\t\"./prism-jexl.js\": [\n\t\t81794,\n\t\t62352\n\t],\n\t\"./prism-jexl.min\": [\n\t\t37052,\n\t\t35315\n\t],\n\t\"./prism-jexl.min.js\": [\n\t\t37052,\n\t\t35315\n\t],\n\t\"./prism-jolie\": [\n\t\t51068,\n\t\t72388\n\t],\n\t\"./prism-jolie.js\": [\n\t\t51068,\n\t\t72388\n\t],\n\t\"./prism-jolie.min\": [\n\t\t26766,\n\t\t61823\n\t],\n\t\"./prism-jolie.min.js\": [\n\t\t26766,\n\t\t61823\n\t],\n\t\"./prism-jq\": [\n\t\t19242,\n\t\t40944\n\t],\n\t\"./prism-jq.js\": [\n\t\t19242,\n\t\t40944\n\t],\n\t\"./prism-jq.min\": [\n\t\t72932,\n\t\t2739\n\t],\n\t\"./prism-jq.min.js\": [\n\t\t72932,\n\t\t2739\n\t],\n\t\"./prism-js-extras\": [\n\t\t61890,\n\t\t97390\n\t],\n\t\"./prism-js-extras.js\": [\n\t\t61890,\n\t\t97390\n\t],\n\t\"./prism-js-extras.min\": [\n\t\t81276,\n\t\t91205\n\t],\n\t\"./prism-js-extras.min.js\": [\n\t\t81276,\n\t\t91205\n\t],\n\t\"./prism-js-templates\": [\n\t\t65070,\n\t\t97908\n\t],\n\t\"./prism-js-templates.js\": [\n\t\t65070,\n\t\t97908\n\t],\n\t\"./prism-js-templates.min\": [\n\t\t24352,\n\t\t67055\n\t],\n\t\"./prism-js-templates.min.js\": [\n\t\t24352,\n\t\t67055\n\t],\n\t\"./prism-jsdoc\": [\n\t\t90660,\n\t\t16312\n\t],\n\t\"./prism-jsdoc.js\": [\n\t\t90660,\n\t\t16312\n\t],\n\t\"./prism-jsdoc.min\": [\n\t\t74102,\n\t\t18427\n\t],\n\t\"./prism-jsdoc.min.js\": [\n\t\t74102,\n\t\t18427\n\t],\n\t\"./prism-json\": [\n\t\t30337,\n\t\t59613\n\t],\n\t\"./prism-json.js\": [\n\t\t30337,\n\t\t59613\n\t],\n\t\"./prism-json.min\": [\n\t\t22851,\n\t\t27606\n\t],\n\t\"./prism-json.min.js\": [\n\t\t22851,\n\t\t27606\n\t],\n\t\"./prism-json5\": [\n\t\t35346,\n\t\t59018\n\t],\n\t\"./prism-json5.js\": [\n\t\t35346,\n\t\t59018\n\t],\n\t\"./prism-json5.min\": [\n\t\t40236,\n\t\t8585\n\t],\n\t\"./prism-json5.min.js\": [\n\t\t40236,\n\t\t8585\n\t],\n\t\"./prism-jsonp\": [\n\t\t61981,\n\t\t96663\n\t],\n\t\"./prism-jsonp.js\": [\n\t\t61981,\n\t\t96663\n\t],\n\t\"./prism-jsonp.min\": [\n\t\t51367,\n\t\t64052\n\t],\n\t\"./prism-jsonp.min.js\": [\n\t\t51367,\n\t\t64052\n\t],\n\t\"./prism-jsstacktrace\": [\n\t\t83065,\n\t\t91297\n\t],\n\t\"./prism-jsstacktrace.js\": [\n\t\t83065,\n\t\t91297\n\t],\n\t\"./prism-jsstacktrace.min\": [\n\t\t66139,\n\t\t94114\n\t],\n\t\"./prism-jsstacktrace.min.js\": [\n\t\t66139,\n\t\t94114\n\t],\n\t\"./prism-jsx\": [\n\t\t73994,\n\t\t75454\n\t],\n\t\"./prism-jsx.js\": [\n\t\t73994,\n\t\t75454\n\t],\n\t\"./prism-jsx.min\": [\n\t\t96324,\n\t\t87061\n\t],\n\t\"./prism-jsx.min.js\": [\n\t\t96324,\n\t\t87061\n\t],\n\t\"./prism-julia\": [\n\t\t84982,\n\t\t2282\n\t],\n\t\"./prism-julia.js\": [\n\t\t84982,\n\t\t2282\n\t],\n\t\"./prism-julia.min\": [\n\t\t24744,\n\t\t87113\n\t],\n\t\"./prism-julia.min.js\": [\n\t\t24744,\n\t\t87113\n\t],\n\t\"./prism-keepalived\": [\n\t\t63985,\n\t\t41961\n\t],\n\t\"./prism-keepalived.js\": [\n\t\t63985,\n\t\t41961\n\t],\n\t\"./prism-keepalived.min\": [\n\t\t78803,\n\t\t86346\n\t],\n\t\"./prism-keepalived.min.js\": [\n\t\t78803,\n\t\t86346\n\t],\n\t\"./prism-keyman\": [\n\t\t67654,\n\t\t33060\n\t],\n\t\"./prism-keyman.js\": [\n\t\t67654,\n\t\t33060\n\t],\n\t\"./prism-keyman.min\": [\n\t\t50968,\n\t\t77215\n\t],\n\t\"./prism-keyman.min.js\": [\n\t\t50968,\n\t\t77215\n\t],\n\t\"./prism-kotlin\": [\n\t\t68906,\n\t\t48104\n\t],\n\t\"./prism-kotlin.js\": [\n\t\t68906,\n\t\t48104\n\t],\n\t\"./prism-kotlin.min\": [\n\t\t43684,\n\t\t69003\n\t],\n\t\"./prism-kotlin.min.js\": [\n\t\t43684,\n\t\t69003\n\t],\n\t\"./prism-kumir\": [\n\t\t64679,\n\t\t80141\n\t],\n\t\"./prism-kumir.js\": [\n\t\t64679,\n\t\t80141\n\t],\n\t\"./prism-kumir.min\": [\n\t\t80169,\n\t\t96262\n\t],\n\t\"./prism-kumir.min.js\": [\n\t\t80169,\n\t\t96262\n\t],\n\t\"./prism-kusto\": [\n\t\t70863,\n\t\t24529\n\t],\n\t\"./prism-kusto.js\": [\n\t\t70863,\n\t\t24529\n\t],\n\t\"./prism-kusto.min\": [\n\t\t34545,\n\t\t38962\n\t],\n\t\"./prism-kusto.min.js\": [\n\t\t34545,\n\t\t38962\n\t],\n\t\"./prism-latex\": [\n\t\t32991,\n\t\t17781\n\t],\n\t\"./prism-latex.js\": [\n\t\t32991,\n\t\t17781\n\t],\n\t\"./prism-latex.min\": [\n\t\t92385,\n\t\t2734\n\t],\n\t\"./prism-latex.min.js\": [\n\t\t92385,\n\t\t2734\n\t],\n\t\"./prism-latte\": [\n\t\t77605,\n\t\t19151\n\t],\n\t\"./prism-latte.js\": [\n\t\t77605,\n\t\t19151\n\t],\n\t\"./prism-latte.min\": [\n\t\t21743,\n\t\t83084\n\t],\n\t\"./prism-latte.min.js\": [\n\t\t21743,\n\t\t83084\n\t],\n\t\"./prism-less\": [\n\t\t69486,\n\t\t34844\n\t],\n\t\"./prism-less.js\": [\n\t\t69486,\n\t\t34844\n\t],\n\t\"./prism-less.min\": [\n\t\t47616,\n\t\t8535\n\t],\n\t\"./prism-less.min.js\": [\n\t\t47616,\n\t\t8535\n\t],\n\t\"./prism-lilypond\": [\n\t\t86616,\n\t\t28378\n\t],\n\t\"./prism-lilypond.js\": [\n\t\t86616,\n\t\t28378\n\t],\n\t\"./prism-lilypond.min\": [\n\t\t6866,\n\t\t88697\n\t],\n\t\"./prism-lilypond.min.js\": [\n\t\t6866,\n\t\t88697\n\t],\n\t\"./prism-linker-script\": [\n\t\t63130,\n\t\t57578\n\t],\n\t\"./prism-linker-script.js\": [\n\t\t63130,\n\t\t57578\n\t],\n\t\"./prism-linker-script.min\": [\n\t\t47476,\n\t\t15145\n\t],\n\t\"./prism-linker-script.min.js\": [\n\t\t47476,\n\t\t15145\n\t],\n\t\"./prism-liquid\": [\n\t\t49115,\n\t\t15011\n\t],\n\t\"./prism-liquid.js\": [\n\t\t49115,\n\t\t15011\n\t],\n\t\"./prism-liquid.min\": [\n\t\t7349,\n\t\t51640\n\t],\n\t\"./prism-liquid.min.js\": [\n\t\t7349,\n\t\t51640\n\t],\n\t\"./prism-lisp\": [\n\t\t48679,\n\t\t83075\n\t],\n\t\"./prism-lisp.js\": [\n\t\t48679,\n\t\t83075\n\t],\n\t\"./prism-lisp.min\": [\n\t\t56777,\n\t\t54232\n\t],\n\t\"./prism-lisp.min.js\": [\n\t\t56777,\n\t\t54232\n\t],\n\t\"./prism-livescript\": [\n\t\t20558,\n\t\t26828\n\t],\n\t\"./prism-livescript.js\": [\n\t\t20558,\n\t\t26828\n\t],\n\t\"./prism-livescript.min\": [\n\t\t17792,\n\t\t68199\n\t],\n\t\"./prism-livescript.min.js\": [\n\t\t17792,\n\t\t68199\n\t],\n\t\"./prism-llvm\": [\n\t\t9618,\n\t\t10120\n\t],\n\t\"./prism-llvm.js\": [\n\t\t9618,\n\t\t10120\n\t],\n\t\"./prism-llvm.min\": [\n\t\t87980,\n\t\t39307\n\t],\n\t\"./prism-llvm.min.js\": [\n\t\t87980,\n\t\t39307\n\t],\n\t\"./prism-log\": [\n\t\t54545,\n\t\t51863\n\t],\n\t\"./prism-log.js\": [\n\t\t54545,\n\t\t51863\n\t],\n\t\"./prism-log.min\": [\n\t\t51123,\n\t\t86740\n\t],\n\t\"./prism-log.min.js\": [\n\t\t51123,\n\t\t86740\n\t],\n\t\"./prism-lolcode\": [\n\t\t79933,\n\t\t35579\n\t],\n\t\"./prism-lolcode.js\": [\n\t\t79933,\n\t\t35579\n\t],\n\t\"./prism-lolcode.min\": [\n\t\t1287,\n\t\t88624\n\t],\n\t\"./prism-lolcode.min.js\": [\n\t\t1287,\n\t\t88624\n\t],\n\t\"./prism-lua\": [\n\t\t42237,\n\t\t25391\n\t],\n\t\"./prism-lua.js\": [\n\t\t42237,\n\t\t25391\n\t],\n\t\"./prism-lua.min\": [\n\t\t21095,\n\t\t69836\n\t],\n\t\"./prism-lua.min.js\": [\n\t\t21095,\n\t\t69836\n\t],\n\t\"./prism-magma\": [\n\t\t23349,\n\t\t2142\n\t],\n\t\"./prism-magma.js\": [\n\t\t23349,\n\t\t2142\n\t],\n\t\"./prism-magma.min\": [\n\t\t43612,\n\t\t72949\n\t],\n\t\"./prism-magma.min.js\": [\n\t\t43612,\n\t\t72949\n\t],\n\t\"./prism-makefile\": [\n\t\t43839,\n\t\t51967\n\t],\n\t\"./prism-makefile.js\": [\n\t\t43839,\n\t\t51967\n\t],\n\t\"./prism-makefile.min\": [\n\t\t34145,\n\t\t56412\n\t],\n\t\"./prism-makefile.min.js\": [\n\t\t34145,\n\t\t56412\n\t],\n\t\"./prism-markdown\": [\n\t\t38486,\n\t\t54448\n\t],\n\t\"./prism-markdown.js\": [\n\t\t38486,\n\t\t54448\n\t],\n\t\"./prism-markdown.min\": [\n\t\t20008,\n\t\t93171\n\t],\n\t\"./prism-markdown.min.js\": [\n\t\t20008,\n\t\t93171\n\t],\n\t\"./prism-markup\": [\n\t\t15575,\n\t\t29003\n\t],\n\t\"./prism-markup-templating\": [\n\t\t64377,\n\t\t88179\n\t],\n\t\"./prism-markup-templating.js\": [\n\t\t64377,\n\t\t88179\n\t],\n\t\"./prism-markup-templating.min\": [\n\t\t95515,\n\t\t8904\n\t],\n\t\"./prism-markup-templating.min.js\": [\n\t\t95515,\n\t\t8904\n\t],\n\t\"./prism-markup.js\": [\n\t\t15575,\n\t\t29003\n\t],\n\t\"./prism-markup.min\": [\n\t\t55897,\n\t\t95072\n\t],\n\t\"./prism-markup.min.js\": [\n\t\t55897,\n\t\t95072\n\t],\n\t\"./prism-mata\": [\n\t\t54014,\n\t\t78944\n\t],\n\t\"./prism-mata.js\": [\n\t\t54014,\n\t\t78944\n\t],\n\t\"./prism-mata.min\": [\n\t\t75792,\n\t\t70179\n\t],\n\t\"./prism-mata.min.js\": [\n\t\t75792,\n\t\t70179\n\t],\n\t\"./prism-matlab\": [\n\t\t78510,\n\t\t25408\n\t],\n\t\"./prism-matlab.js\": [\n\t\t78510,\n\t\t25408\n\t],\n\t\"./prism-matlab.min\": [\n\t\t55936,\n\t\t42723\n\t],\n\t\"./prism-matlab.min.js\": [\n\t\t55936,\n\t\t42723\n\t],\n\t\"./prism-maxscript\": [\n\t\t88650,\n\t\t24014\n\t],\n\t\"./prism-maxscript.js\": [\n\t\t88650,\n\t\t24014\n\t],\n\t\"./prism-maxscript.min\": [\n\t\t90372,\n\t\t12133\n\t],\n\t\"./prism-maxscript.min.js\": [\n\t\t90372,\n\t\t12133\n\t],\n\t\"./prism-mel\": [\n\t\t62565,\n\t\t87463\n\t],\n\t\"./prism-mel.js\": [\n\t\t62565,\n\t\t87463\n\t],\n\t\"./prism-mel.min\": [\n\t\t20303,\n\t\t65156\n\t],\n\t\"./prism-mel.min.js\": [\n\t\t20303,\n\t\t65156\n\t],\n\t\"./prism-mermaid\": [\n\t\t55820,\n\t\t48044\n\t],\n\t\"./prism-mermaid.js\": [\n\t\t55820,\n\t\t48044\n\t],\n\t\"./prism-mermaid.min\": [\n\t\t40318,\n\t\t14791\n\t],\n\t\"./prism-mermaid.min.js\": [\n\t\t40318,\n\t\t14791\n\t],\n\t\"./prism-metafont\": [\n\t\t98123,\n\t\t92651\n\t],\n\t\"./prism-metafont.js\": [\n\t\t98123,\n\t\t92651\n\t],\n\t\"./prism-metafont.min\": [\n\t\t76645,\n\t\t46816\n\t],\n\t\"./prism-metafont.min.js\": [\n\t\t76645,\n\t\t46816\n\t],\n\t\"./prism-mizar\": [\n\t\t90388,\n\t\t17376\n\t],\n\t\"./prism-mizar.js\": [\n\t\t90388,\n\t\t17376\n\t],\n\t\"./prism-mizar.min\": [\n\t\t19110,\n\t\t91427\n\t],\n\t\"./prism-mizar.min.js\": [\n\t\t19110,\n\t\t91427\n\t],\n\t\"./prism-mongodb\": [\n\t\t16185,\n\t\t88559\n\t],\n\t\"./prism-mongodb.js\": [\n\t\t16185,\n\t\t88559\n\t],\n\t\"./prism-mongodb.min\": [\n\t\t82491,\n\t\t86892\n\t],\n\t\"./prism-mongodb.min.js\": [\n\t\t82491,\n\t\t86892\n\t],\n\t\"./prism-monkey\": [\n\t\t31838,\n\t\t31868\n\t],\n\t\"./prism-monkey.js\": [\n\t\t31838,\n\t\t31868\n\t],\n\t\"./prism-monkey.min\": [\n\t\t2800,\n\t\t64471\n\t],\n\t\"./prism-monkey.min.js\": [\n\t\t2800,\n\t\t64471\n\t],\n\t\"./prism-moonscript\": [\n\t\t94101,\n\t\t1909\n\t],\n\t\"./prism-moonscript.js\": [\n\t\t94101,\n\t\t1909\n\t],\n\t\"./prism-moonscript.min\": [\n\t\t66303,\n\t\t10926\n\t],\n\t\"./prism-moonscript.min.js\": [\n\t\t66303,\n\t\t10926\n\t],\n\t\"./prism-n1ql\": [\n\t\t65383,\n\t\t81931\n\t],\n\t\"./prism-n1ql.js\": [\n\t\t65383,\n\t\t81931\n\t],\n\t\"./prism-n1ql.min\": [\n\t\t33033,\n\t\t24640\n\t],\n\t\"./prism-n1ql.min.js\": [\n\t\t33033,\n\t\t24640\n\t],\n\t\"./prism-n4js\": [\n\t\t99454,\n\t\t18288\n\t],\n\t\"./prism-n4js.js\": [\n\t\t99454,\n\t\t18288\n\t],\n\t\"./prism-n4js.min\": [\n\t\t4336,\n\t\t1107\n\t],\n\t\"./prism-n4js.min.js\": [\n\t\t4336,\n\t\t1107\n\t],\n\t\"./prism-nand2tetris-hdl\": [\n\t\t292,\n\t\t37156\n\t],\n\t\"./prism-nand2tetris-hdl.js\": [\n\t\t292,\n\t\t37156\n\t],\n\t\"./prism-nand2tetris-hdl.min\": [\n\t\t82230,\n\t\t45311\n\t],\n\t\"./prism-nand2tetris-hdl.min.js\": [\n\t\t82230,\n\t\t45311\n\t],\n\t\"./prism-naniscript\": [\n\t\t83968,\n\t\t88750\n\t],\n\t\"./prism-naniscript.js\": [\n\t\t83968,\n\t\t88750\n\t],\n\t\"./prism-naniscript.min\": [\n\t\t59162,\n\t\t87301\n\t],\n\t\"./prism-naniscript.min.js\": [\n\t\t59162,\n\t\t87301\n\t],\n\t\"./prism-nasm\": [\n\t\t91734,\n\t\t10136\n\t],\n\t\"./prism-nasm.js\": [\n\t\t91734,\n\t\t10136\n\t],\n\t\"./prism-nasm.min\": [\n\t\t91048,\n\t\t43131\n\t],\n\t\"./prism-nasm.min.js\": [\n\t\t91048,\n\t\t43131\n\t],\n\t\"./prism-neon\": [\n\t\t29987,\n\t\t95827\n\t],\n\t\"./prism-neon.js\": [\n\t\t29987,\n\t\t95827\n\t],\n\t\"./prism-neon.min\": [\n\t\t40093,\n\t\t27464\n\t],\n\t\"./prism-neon.min.js\": [\n\t\t40093,\n\t\t27464\n\t],\n\t\"./prism-nevod\": [\n\t\t35657,\n\t\t15219\n\t],\n\t\"./prism-nevod.js\": [\n\t\t35657,\n\t\t15219\n\t],\n\t\"./prism-nevod.min\": [\n\t\t30379,\n\t\t81896\n\t],\n\t\"./prism-nevod.min.js\": [\n\t\t30379,\n\t\t81896\n\t],\n\t\"./prism-nginx\": [\n\t\t29919,\n\t\t13089\n\t],\n\t\"./prism-nginx.js\": [\n\t\t29919,\n\t\t13089\n\t],\n\t\"./prism-nginx.min\": [\n\t\t77793,\n\t\t85442\n\t],\n\t\"./prism-nginx.min.js\": [\n\t\t77793,\n\t\t85442\n\t],\n\t\"./prism-nim\": [\n\t\t27567,\n\t\t82249\n\t],\n\t\"./prism-nim.js\": [\n\t\t27567,\n\t\t82249\n\t],\n\t\"./prism-nim.min\": [\n\t\t67921,\n\t\t27242\n\t],\n\t\"./prism-nim.min.js\": [\n\t\t67921,\n\t\t27242\n\t],\n\t\"./prism-nix\": [\n\t\t75124,\n\t\t77172\n\t],\n\t\"./prism-nix.js\": [\n\t\t75124,\n\t\t77172\n\t],\n\t\"./prism-nix.min\": [\n\t\t64678,\n\t\t83023\n\t],\n\t\"./prism-nix.min.js\": [\n\t\t64678,\n\t\t83023\n\t],\n\t\"./prism-nsis\": [\n\t\t40136,\n\t\t34986\n\t],\n\t\"./prism-nsis.js\": [\n\t\t40136,\n\t\t34986\n\t],\n\t\"./prism-nsis.min\": [\n\t\t88738,\n\t\t53577\n\t],\n\t\"./prism-nsis.min.js\": [\n\t\t88738,\n\t\t53577\n\t],\n\t\"./prism-objectivec\": [\n\t\t47819,\n\t\t12703\n\t],\n\t\"./prism-objectivec.js\": [\n\t\t47819,\n\t\t12703\n\t],\n\t\"./prism-objectivec.min\": [\n\t\t10021,\n\t\t79516\n\t],\n\t\"./prism-objectivec.min.js\": [\n\t\t10021,\n\t\t79516\n\t],\n\t\"./prism-ocaml\": [\n\t\t3891,\n\t\t90333\n\t],\n\t\"./prism-ocaml.js\": [\n\t\t3891,\n\t\t90333\n\t],\n\t\"./prism-ocaml.min\": [\n\t\t68525,\n\t\t4310\n\t],\n\t\"./prism-ocaml.min.js\": [\n\t\t68525,\n\t\t4310\n\t],\n\t\"./prism-odin\": [\n\t\t89603,\n\t\t31455\n\t],\n\t\"./prism-odin.js\": [\n\t\t89603,\n\t\t31455\n\t],\n\t\"./prism-odin.min\": [\n\t\t80669,\n\t\t72380\n\t],\n\t\"./prism-odin.min.js\": [\n\t\t80669,\n\t\t72380\n\t],\n\t\"./prism-opencl\": [\n\t\t82512,\n\t\t85446\n\t],\n\t\"./prism-opencl.js\": [\n\t\t82512,\n\t\t85446\n\t],\n\t\"./prism-opencl.min\": [\n\t\t73098,\n\t\t8157\n\t],\n\t\"./prism-opencl.min.js\": [\n\t\t73098,\n\t\t8157\n\t],\n\t\"./prism-openqasm\": [\n\t\t30837,\n\t\t32049\n\t],\n\t\"./prism-openqasm.js\": [\n\t\t30837,\n\t\t32049\n\t],\n\t\"./prism-openqasm.min\": [\n\t\t54591,\n\t\t80818\n\t],\n\t\"./prism-openqasm.min.js\": [\n\t\t54591,\n\t\t80818\n\t],\n\t\"./prism-oz\": [\n\t\t9522,\n\t\t50592\n\t],\n\t\"./prism-oz.js\": [\n\t\t9522,\n\t\t50592\n\t],\n\t\"./prism-oz.min\": [\n\t\t75596,\n\t\t88291\n\t],\n\t\"./prism-oz.min.js\": [\n\t\t75596,\n\t\t88291\n\t],\n\t\"./prism-parigp\": [\n\t\t87734,\n\t\t54616\n\t],\n\t\"./prism-parigp.js\": [\n\t\t87734,\n\t\t54616\n\t],\n\t\"./prism-parigp.min\": [\n\t\t90952,\n\t\t4027\n\t],\n\t\"./prism-parigp.min.js\": [\n\t\t90952,\n\t\t4027\n\t],\n\t\"./prism-parser\": [\n\t\t91504,\n\t\t9690\n\t],\n\t\"./prism-parser.js\": [\n\t\t91504,\n\t\t9690\n\t],\n\t\"./prism-parser.min\": [\n\t\t94474,\n\t\t2777\n\t],\n\t\"./prism-parser.min.js\": [\n\t\t94474,\n\t\t2777\n\t],\n\t\"./prism-pascal\": [\n\t\t90447,\n\t\t22395\n\t],\n\t\"./prism-pascal.js\": [\n\t\t90447,\n\t\t22395\n\t],\n\t\"./prism-pascal.min\": [\n\t\t4721,\n\t\t33200\n\t],\n\t\"./prism-pascal.min.js\": [\n\t\t4721,\n\t\t33200\n\t],\n\t\"./prism-pascaligo\": [\n\t\t94562,\n\t\t33546\n\t],\n\t\"./prism-pascaligo.js\": [\n\t\t94562,\n\t\t33546\n\t],\n\t\"./prism-pascaligo.min\": [\n\t\t72604,\n\t\t41353\n\t],\n\t\"./prism-pascaligo.min.js\": [\n\t\t72604,\n\t\t41353\n\t],\n\t\"./prism-pcaxis\": [\n\t\t16259,\n\t\t59907\n\t],\n\t\"./prism-pcaxis.js\": [\n\t\t16259,\n\t\t59907\n\t],\n\t\"./prism-pcaxis.min\": [\n\t\t32029,\n\t\t3736\n\t],\n\t\"./prism-pcaxis.min.js\": [\n\t\t32029,\n\t\t3736\n\t],\n\t\"./prism-peoplecode\": [\n\t\t59433,\n\t\t33669\n\t],\n\t\"./prism-peoplecode.js\": [\n\t\t59433,\n\t\t33669\n\t],\n\t\"./prism-peoplecode.min\": [\n\t\t37579,\n\t\t56574\n\t],\n\t\"./prism-peoplecode.min.js\": [\n\t\t37579,\n\t\t56574\n\t],\n\t\"./prism-perl\": [\n\t\t8374,\n\t\t13500\n\t],\n\t\"./prism-perl.js\": [\n\t\t8374,\n\t\t13500\n\t],\n\t\"./prism-perl.min\": [\n\t\t21544,\n\t\t47223\n\t],\n\t\"./prism-perl.min.js\": [\n\t\t21544,\n\t\t47223\n\t],\n\t\"./prism-php\": [\n\t\t87523,\n\t\t78841\n\t],\n\t\"./prism-php-extras\": [\n\t\t63819,\n\t\t59763\n\t],\n\t\"./prism-php-extras.js\": [\n\t\t63819,\n\t\t59763\n\t],\n\t\"./prism-php-extras.min\": [\n\t\t67589,\n\t\t1608\n\t],\n\t\"./prism-php-extras.min.js\": [\n\t\t67589,\n\t\t1608\n\t],\n\t\"./prism-php.js\": [\n\t\t87523,\n\t\t78841\n\t],\n\t\"./prism-php.min\": [\n\t\t2845,\n\t\t6554\n\t],\n\t\"./prism-php.min.js\": [\n\t\t2845,\n\t\t6554\n\t],\n\t\"./prism-phpdoc\": [\n\t\t58221,\n\t\t74693\n\t],\n\t\"./prism-phpdoc.js\": [\n\t\t58221,\n\t\t74693\n\t],\n\t\"./prism-phpdoc.min\": [\n\t\t42935,\n\t\t446\n\t],\n\t\"./prism-phpdoc.min.js\": [\n\t\t42935,\n\t\t446\n\t],\n\t\"./prism-plant-uml\": [\n\t\t3869,\n\t\t57647\n\t],\n\t\"./prism-plant-uml.js\": [\n\t\t3869,\n\t\t57647\n\t],\n\t\"./prism-plant-uml.min\": [\n\t\t20679,\n\t\t31916\n\t],\n\t\"./prism-plant-uml.min.js\": [\n\t\t20679,\n\t\t31916\n\t],\n\t\"./prism-plsql\": [\n\t\t76715,\n\t\t68037\n\t],\n\t\"./prism-plsql.js\": [\n\t\t76715,\n\t\t68037\n\t],\n\t\"./prism-plsql.min\": [\n\t\t80741,\n\t\t58462\n\t],\n\t\"./prism-plsql.min.js\": [\n\t\t80741,\n\t\t58462\n\t],\n\t\"./prism-powerquery\": [\n\t\t44472,\n\t\t71546\n\t],\n\t\"./prism-powerquery.js\": [\n\t\t44472,\n\t\t71546\n\t],\n\t\"./prism-powerquery.min\": [\n\t\t76178,\n\t\t19289\n\t],\n\t\"./prism-powerquery.min.js\": [\n\t\t76178,\n\t\t19289\n\t],\n\t\"./prism-powershell\": [\n\t\t8466,\n\t\t99852\n\t],\n\t\"./prism-powershell.js\": [\n\t\t8466,\n\t\t99852\n\t],\n\t\"./prism-powershell.min\": [\n\t\t51244,\n\t\t58247\n\t],\n\t\"./prism-powershell.min.js\": [\n\t\t51244,\n\t\t58247\n\t],\n\t\"./prism-processing\": [\n\t\t13540,\n\t\t39542\n\t],\n\t\"./prism-processing.js\": [\n\t\t13540,\n\t\t39542\n\t],\n\t\"./prism-processing.min\": [\n\t\t23318,\n\t\t64877\n\t],\n\t\"./prism-processing.min.js\": [\n\t\t23318,\n\t\t64877\n\t],\n\t\"./prism-prolog\": [\n\t\t13084,\n\t\t52050\n\t],\n\t\"./prism-prolog.js\": [\n\t\t13084,\n\t\t52050\n\t],\n\t\"./prism-prolog.min\": [\n\t\t53134,\n\t\t12209\n\t],\n\t\"./prism-prolog.min.js\": [\n\t\t53134,\n\t\t12209\n\t],\n\t\"./prism-promql\": [\n\t\t32280,\n\t\t39458\n\t],\n\t\"./prism-promql.js\": [\n\t\t32280,\n\t\t39458\n\t],\n\t\"./prism-promql.min\": [\n\t\t18706,\n\t\t21761\n\t],\n\t\"./prism-promql.min.js\": [\n\t\t18706,\n\t\t21761\n\t],\n\t\"./prism-properties\": [\n\t\t14194,\n\t\t72648\n\t],\n\t\"./prism-properties.js\": [\n\t\t14194,\n\t\t72648\n\t],\n\t\"./prism-properties.min\": [\n\t\t60908,\n\t\t76075\n\t],\n\t\"./prism-properties.min.js\": [\n\t\t60908,\n\t\t76075\n\t],\n\t\"./prism-protobuf\": [\n\t\t64368,\n\t\t29214\n\t],\n\t\"./prism-protobuf.js\": [\n\t\t64368,\n\t\t29214\n\t],\n\t\"./prism-protobuf.min\": [\n\t\t93802,\n\t\t57973\n\t],\n\t\"./prism-protobuf.min.js\": [\n\t\t93802,\n\t\t57973\n\t],\n\t\"./prism-psl\": [\n\t\t11960,\n\t\t58636\n\t],\n\t\"./prism-psl.js\": [\n\t\t11960,\n\t\t58636\n\t],\n\t\"./prism-psl.min\": [\n\t\t81618,\n\t\t7399\n\t],\n\t\"./prism-psl.min.js\": [\n\t\t81618,\n\t\t7399\n\t],\n\t\"./prism-pug\": [\n\t\t48867,\n\t\t28509\n\t],\n\t\"./prism-pug.js\": [\n\t\t48867,\n\t\t28509\n\t],\n\t\"./prism-pug.min\": [\n\t\t89757,\n\t\t66262\n\t],\n\t\"./prism-pug.min.js\": [\n\t\t89757,\n\t\t66262\n\t],\n\t\"./prism-puppet\": [\n\t\t90973,\n\t\t57593\n\t],\n\t\"./prism-puppet.js\": [\n\t\t90973,\n\t\t57593\n\t],\n\t\"./prism-puppet.min\": [\n\t\t94951,\n\t\t53946\n\t],\n\t\"./prism-puppet.min.js\": [\n\t\t94951,\n\t\t53946\n\t],\n\t\"./prism-pure\": [\n\t\t34413,\n\t\t60781\n\t],\n\t\"./prism-pure.js\": [\n\t\t34413,\n\t\t60781\n\t],\n\t\"./prism-pure.min\": [\n\t\t68663,\n\t\t58950\n\t],\n\t\"./prism-pure.min.js\": [\n\t\t68663,\n\t\t58950\n\t],\n\t\"./prism-purebasic\": [\n\t\t65527,\n\t\t40181\n\t],\n\t\"./prism-purebasic.js\": [\n\t\t65527,\n\t\t40181\n\t],\n\t\"./prism-purebasic.min\": [\n\t\t55865,\n\t\t73665\n\t],\n\t\"./prism-purebasic.min.js\": [\n\t\t55865,\n\t\t73665\n\t],\n\t\"./prism-purescript\": [\n\t\t32386,\n\t\t10264\n\t],\n\t\"./prism-purescript.js\": [\n\t\t32386,\n\t\t10264\n\t],\n\t\"./prism-purescript.min\": [\n\t\t54876,\n\t\t54395\n\t],\n\t\"./prism-purescript.min.js\": [\n\t\t54876,\n\t\t54395\n\t],\n\t\"./prism-python\": [\n\t\t83817,\n\t\t29505\n\t],\n\t\"./prism-python.js\": [\n\t\t83817,\n\t\t29505\n\t],\n\t\"./prism-python.min\": [\n\t\t299,\n\t\t38530\n\t],\n\t\"./prism-python.min.js\": [\n\t\t299,\n\t\t38530\n\t],\n\t\"./prism-q\": [\n\t\t5732,\n\t\t26368\n\t],\n\t\"./prism-q.js\": [\n\t\t5732,\n\t\t26368\n\t],\n\t\"./prism-q.min\": [\n\t\t92246,\n\t\t70627\n\t],\n\t\"./prism-q.min.js\": [\n\t\t92246,\n\t\t70627\n\t],\n\t\"./prism-qml\": [\n\t\t47969,\n\t\t13651\n\t],\n\t\"./prism-qml.js\": [\n\t\t47969,\n\t\t13651\n\t],\n\t\"./prism-qml.min\": [\n\t\t32931,\n\t\t70920\n\t],\n\t\"./prism-qml.min.js\": [\n\t\t32931,\n\t\t70920\n\t],\n\t\"./prism-qore\": [\n\t\t26194,\n\t\t76856\n\t],\n\t\"./prism-qore.js\": [\n\t\t26194,\n\t\t76856\n\t],\n\t\"./prism-qore.min\": [\n\t\t49612,\n\t\t8059\n\t],\n\t\"./prism-qore.min.js\": [\n\t\t49612,\n\t\t8059\n\t],\n\t\"./prism-qsharp\": [\n\t\t64726,\n\t\t49404\n\t],\n\t\"./prism-qsharp.js\": [\n\t\t64726,\n\t\t49404\n\t],\n\t\"./prism-qsharp.min\": [\n\t\t29992,\n\t\t3255\n\t],\n\t\"./prism-qsharp.min.js\": [\n\t\t29992,\n\t\t3255\n\t],\n\t\"./prism-r\": [\n\t\t53613,\n\t\t16379\n\t],\n\t\"./prism-r.js\": [\n\t\t53613,\n\t\t16379\n\t],\n\t\"./prism-r.min\": [\n\t\t97399,\n\t\t20688\n\t],\n\t\"./prism-r.min.js\": [\n\t\t97399,\n\t\t20688\n\t],\n\t\"./prism-racket\": [\n\t\t97718,\n\t\t53389\n\t],\n\t\"./prism-racket.js\": [\n\t\t97718,\n\t\t53389\n\t],\n\t\"./prism-racket.min\": [\n\t\t90411,\n\t\t24838\n\t],\n\t\"./prism-racket.min.js\": [\n\t\t90411,\n\t\t24838\n\t],\n\t\"./prism-reason\": [\n\t\t16687,\n\t\t67559\n\t],\n\t\"./prism-reason.js\": [\n\t\t16687,\n\t\t67559\n\t],\n\t\"./prism-reason.min\": [\n\t\t9553,\n\t\t32356\n\t],\n\t\"./prism-reason.min.js\": [\n\t\t9553,\n\t\t32356\n\t],\n\t\"./prism-regex\": [\n\t\t15752,\n\t\t81084\n\t],\n\t\"./prism-regex.js\": [\n\t\t15752,\n\t\t81084\n\t],\n\t\"./prism-regex.min\": [\n\t\t80546,\n\t\t36151\n\t],\n\t\"./prism-regex.min.js\": [\n\t\t80546,\n\t\t36151\n\t],\n\t\"./prism-rego\": [\n\t\t79592,\n\t\t68406\n\t],\n\t\"./prism-rego.js\": [\n\t\t79592,\n\t\t68406\n\t],\n\t\"./prism-rego.min\": [\n\t\t40418,\n\t\t48685\n\t],\n\t\"./prism-rego.min.js\": [\n\t\t40418,\n\t\t48685\n\t],\n\t\"./prism-renpy\": [\n\t\t8561,\n\t\t37787\n\t],\n\t\"./prism-renpy.js\": [\n\t\t8561,\n\t\t37787\n\t],\n\t\"./prism-renpy.min\": [\n\t\t75987,\n\t\t91472\n\t],\n\t\"./prism-renpy.min.js\": [\n\t\t75987,\n\t\t91472\n\t],\n\t\"./prism-rescript\": [\n\t\t19133,\n\t\t30045\n\t],\n\t\"./prism-rescript.js\": [\n\t\t19133,\n\t\t30045\n\t],\n\t\"./prism-rescript.min\": [\n\t\t45959,\n\t\t40278\n\t],\n\t\"./prism-rescript.min.js\": [\n\t\t45959,\n\t\t40278\n\t],\n\t\"./prism-rest\": [\n\t\t88421,\n\t\t71321\n\t],\n\t\"./prism-rest.js\": [\n\t\t88421,\n\t\t71321\n\t],\n\t\"./prism-rest.min\": [\n\t\t44975,\n\t\t25658\n\t],\n\t\"./prism-rest.min.js\": [\n\t\t44975,\n\t\t25658\n\t],\n\t\"./prism-rip\": [\n\t\t84336,\n\t\t54848\n\t],\n\t\"./prism-rip.js\": [\n\t\t84336,\n\t\t54848\n\t],\n\t\"./prism-rip.min\": [\n\t\t4650,\n\t\t51363\n\t],\n\t\"./prism-rip.min.js\": [\n\t\t4650,\n\t\t51363\n\t],\n\t\"./prism-roboconf\": [\n\t\t54697,\n\t\t76733\n\t],\n\t\"./prism-roboconf.js\": [\n\t\t54697,\n\t\t76733\n\t],\n\t\"./prism-roboconf.min\": [\n\t\t4587,\n\t\t9558\n\t],\n\t\"./prism-roboconf.min.js\": [\n\t\t4587,\n\t\t9558\n\t],\n\t\"./prism-robotframework\": [\n\t\t53307,\n\t\t17319\n\t],\n\t\"./prism-robotframework.js\": [\n\t\t53307,\n\t\t17319\n\t],\n\t\"./prism-robotframework.min\": [\n\t\t33589,\n\t\t33988\n\t],\n\t\"./prism-robotframework.min.js\": [\n\t\t33589,\n\t\t33988\n\t],\n\t\"./prism-ruby\": [\n\t\t73955,\n\t\t14595\n\t],\n\t\"./prism-ruby.js\": [\n\t\t73955,\n\t\t14595\n\t],\n\t\"./prism-ruby.min\": [\n\t\t77437,\n\t\t67896\n\t],\n\t\"./prism-ruby.min.js\": [\n\t\t77437,\n\t\t67896\n\t],\n\t\"./prism-rust\": [\n\t\t59765,\n\t\t90345\n\t],\n\t\"./prism-rust.js\": [\n\t\t59765,\n\t\t90345\n\t],\n\t\"./prism-rust.min\": [\n\t\t14879,\n\t\t25642\n\t],\n\t\"./prism-rust.min.js\": [\n\t\t14879,\n\t\t25642\n\t],\n\t\"./prism-sas\": [\n\t\t4694,\n\t\t51590\n\t],\n\t\"./prism-sas.js\": [\n\t\t4694,\n\t\t51590\n\t],\n\t\"./prism-sas.min\": [\n\t\t90792,\n\t\t83517\n\t],\n\t\"./prism-sas.min.js\": [\n\t\t90792,\n\t\t83517\n\t],\n\t\"./prism-sass\": [\n\t\t33565,\n\t\t7769\n\t],\n\t\"./prism-sass.js\": [\n\t\t33565,\n\t\t7769\n\t],\n\t\"./prism-sass.min\": [\n\t\t7143,\n\t\t96506\n\t],\n\t\"./prism-sass.min.js\": [\n\t\t7143,\n\t\t96506\n\t],\n\t\"./prism-scala\": [\n\t\t2426,\n\t\t667\n\t],\n\t\"./prism-scala.js\": [\n\t\t2426,\n\t\t667\n\t],\n\t\"./prism-scala.min\": [\n\t\t48535,\n\t\t56080\n\t],\n\t\"./prism-scala.min.js\": [\n\t\t48535,\n\t\t56080\n\t],\n\t\"./prism-scheme\": [\n\t\t7056,\n\t\t146\n\t],\n\t\"./prism-scheme.js\": [\n\t\t7056,\n\t\t146\n\t],\n\t\"./prism-scheme.min\": [\n\t\t70122,\n\t\t84401\n\t],\n\t\"./prism-scheme.min.js\": [\n\t\t70122,\n\t\t84401\n\t],\n\t\"./prism-scss\": [\n\t\t88287,\n\t\t64399\n\t],\n\t\"./prism-scss.js\": [\n\t\t88287,\n\t\t64399\n\t],\n\t\"./prism-scss.min\": [\n\t\t14113,\n\t\t34604\n\t],\n\t\"./prism-scss.min.js\": [\n\t\t14113,\n\t\t34604\n\t],\n\t\"./prism-shell-session\": [\n\t\t87048,\n\t\t65204\n\t],\n\t\"./prism-shell-session.js\": [\n\t\t87048,\n\t\t65204\n\t],\n\t\"./prism-shell-session.min\": [\n\t\t6530,\n\t\t84079\n\t],\n\t\"./prism-shell-session.min.js\": [\n\t\t6530,\n\t\t84079\n\t],\n\t\"./prism-smali\": [\n\t\t31699,\n\t\t15525\n\t],\n\t\"./prism-smali.js\": [\n\t\t31699,\n\t\t15525\n\t],\n\t\"./prism-smali.min\": [\n\t\t31213,\n\t\t85278\n\t],\n\t\"./prism-smali.min.js\": [\n\t\t31213,\n\t\t85278\n\t],\n\t\"./prism-smalltalk\": [\n\t\t91730,\n\t\t38786\n\t],\n\t\"./prism-smalltalk.js\": [\n\t\t91730,\n\t\t38786\n\t],\n\t\"./prism-smalltalk.min\": [\n\t\t51884,\n\t\t54145\n\t],\n\t\"./prism-smalltalk.min.js\": [\n\t\t51884,\n\t\t54145\n\t],\n\t\"./prism-smarty\": [\n\t\t26675,\n\t\t15047\n\t],\n\t\"./prism-smarty.js\": [\n\t\t26675,\n\t\t15047\n\t],\n\t\"./prism-smarty.min\": [\n\t\t97677,\n\t\t71268\n\t],\n\t\"./prism-smarty.min.js\": [\n\t\t97677,\n\t\t71268\n\t],\n\t\"./prism-sml\": [\n\t\t47579,\n\t\t28197\n\t],\n\t\"./prism-sml.js\": [\n\t\t47579,\n\t\t28197\n\t],\n\t\"./prism-sml.min\": [\n\t\t19861,\n\t\t99294\n\t],\n\t\"./prism-sml.min.js\": [\n\t\t19861,\n\t\t99294\n\t],\n\t\"./prism-solidity\": [\n\t\t66574,\n\t\t67412\n\t],\n\t\"./prism-solidity.js\": [\n\t\t66574,\n\t\t67412\n\t],\n\t\"./prism-solidity.min\": [\n\t\t36288,\n\t\t66927\n\t],\n\t\"./prism-solidity.min.js\": [\n\t\t36288,\n\t\t66927\n\t],\n\t\"./prism-solution-file\": [\n\t\t78443,\n\t\t69129\n\t],\n\t\"./prism-solution-file.js\": [\n\t\t78443,\n\t\t69129\n\t],\n\t\"./prism-solution-file.min\": [\n\t\t27749,\n\t\t10762\n\t],\n\t\"./prism-solution-file.min.js\": [\n\t\t27749,\n\t\t10762\n\t],\n\t\"./prism-soy\": [\n\t\t40534,\n\t\t17077\n\t],\n\t\"./prism-soy.js\": [\n\t\t40534,\n\t\t17077\n\t],\n\t\"./prism-soy.min\": [\n\t\t92520,\n\t\t7329\n\t],\n\t\"./prism-soy.min.js\": [\n\t\t92520,\n\t\t7329\n\t],\n\t\"./prism-sparql\": [\n\t\t69262,\n\t\t2572\n\t],\n\t\"./prism-sparql.js\": [\n\t\t69262,\n\t\t2572\n\t],\n\t\"./prism-sparql.min\": [\n\t\t15200,\n\t\t62343\n\t],\n\t\"./prism-sparql.min.js\": [\n\t\t15200,\n\t\t62343\n\t],\n\t\"./prism-splunk-spl\": [\n\t\t98496,\n\t\t34670\n\t],\n\t\"./prism-splunk-spl.js\": [\n\t\t98496,\n\t\t34670\n\t],\n\t\"./prism-splunk-spl.min\": [\n\t\t95482,\n\t\t3077\n\t],\n\t\"./prism-splunk-spl.min.js\": [\n\t\t95482,\n\t\t3077\n\t],\n\t\"./prism-sqf\": [\n\t\t37593,\n\t\t15211\n\t],\n\t\"./prism-sqf.js\": [\n\t\t37593,\n\t\t15211\n\t],\n\t\"./prism-sqf.min\": [\n\t\t74011,\n\t\t91328\n\t],\n\t\"./prism-sqf.min.js\": [\n\t\t74011,\n\t\t91328\n\t],\n\t\"./prism-sql\": [\n\t\t15775,\n\t\t11425\n\t],\n\t\"./prism-sql.js\": [\n\t\t15775,\n\t\t11425\n\t],\n\t\"./prism-sql.min\": [\n\t\t75745,\n\t\t76354\n\t],\n\t\"./prism-sql.min.js\": [\n\t\t75745,\n\t\t76354\n\t],\n\t\"./prism-squirrel\": [\n\t\t35568,\n\t\t34870\n\t],\n\t\"./prism-squirrel.js\": [\n\t\t35568,\n\t\t34870\n\t],\n\t\"./prism-squirrel.min\": [\n\t\t81834,\n\t\t33165\n\t],\n\t\"./prism-squirrel.min.js\": [\n\t\t81834,\n\t\t33165\n\t],\n\t\"./prism-stan\": [\n\t\t75655,\n\t\t72467\n\t],\n\t\"./prism-stan.js\": [\n\t\t75655,\n\t\t72467\n\t],\n\t\"./prism-stan.min\": [\n\t\t2633,\n\t\t82824\n\t],\n\t\"./prism-stan.min.js\": [\n\t\t2633,\n\t\t82824\n\t],\n\t\"./prism-stata\": [\n\t\t39374,\n\t\t15362\n\t],\n\t\"./prism-stata.js\": [\n\t\t39374,\n\t\t15362\n\t],\n\t\"./prism-stata.min\": [\n\t\t76320,\n\t\t34497\n\t],\n\t\"./prism-stata.min.js\": [\n\t\t76320,\n\t\t34497\n\t],\n\t\"./prism-stylus\": [\n\t\t35841,\n\t\t27609\n\t],\n\t\"./prism-stylus.js\": [\n\t\t35841,\n\t\t27609\n\t],\n\t\"./prism-stylus.min\": [\n\t\t1411,\n\t\t11834\n\t],\n\t\"./prism-stylus.min.js\": [\n\t\t1411,\n\t\t11834\n\t],\n\t\"./prism-supercollider\": [\n\t\t63680,\n\t\t25892\n\t],\n\t\"./prism-supercollider.js\": [\n\t\t63680,\n\t\t25892\n\t],\n\t\"./prism-supercollider.min\": [\n\t\t13613,\n\t\t12319\n\t],\n\t\"./prism-supercollider.min.js\": [\n\t\t13613,\n\t\t12319\n\t],\n\t\"./prism-swift\": [\n\t\t684,\n\t\t35100\n\t],\n\t\"./prism-swift.js\": [\n\t\t684,\n\t\t35100\n\t],\n\t\"./prism-swift.min\": [\n\t\t830,\n\t\t77495\n\t],\n\t\"./prism-swift.min.js\": [\n\t\t830,\n\t\t77495\n\t],\n\t\"./prism-systemd\": [\n\t\t17384,\n\t\t15700\n\t],\n\t\"./prism-systemd.js\": [\n\t\t17384,\n\t\t15700\n\t],\n\t\"./prism-systemd.min\": [\n\t\t83394,\n\t\t65359\n\t],\n\t\"./prism-systemd.min.js\": [\n\t\t83394,\n\t\t65359\n\t],\n\t\"./prism-t4-cs\": [\n\t\t78274,\n\t\t62006\n\t],\n\t\"./prism-t4-cs.js\": [\n\t\t78274,\n\t\t62006\n\t],\n\t\"./prism-t4-cs.min\": [\n\t\t892,\n\t\t18253\n\t],\n\t\"./prism-t4-cs.min.js\": [\n\t\t892,\n\t\t18253\n\t],\n\t\"./prism-t4-templating\": [\n\t\t70493,\n\t\t59179\n\t],\n\t\"./prism-t4-templating.js\": [\n\t\t70493,\n\t\t59179\n\t],\n\t\"./prism-t4-templating.min\": [\n\t\t77351,\n\t\t26560\n\t],\n\t\"./prism-t4-templating.min.js\": [\n\t\t77351,\n\t\t26560\n\t],\n\t\"./prism-t4-vb\": [\n\t\t69468,\n\t\t3108\n\t],\n\t\"./prism-t4-vb.js\": [\n\t\t69468,\n\t\t3108\n\t],\n\t\"./prism-t4-vb.min\": [\n\t\t88430,\n\t\t39615\n\t],\n\t\"./prism-t4-vb.min.js\": [\n\t\t88430,\n\t\t39615\n\t],\n\t\"./prism-tap\": [\n\t\t27970,\n\t\t72986\n\t],\n\t\"./prism-tap.js\": [\n\t\t27970,\n\t\t72986\n\t],\n\t\"./prism-tap.min\": [\n\t\t44924,\n\t\t23513\n\t],\n\t\"./prism-tap.min.js\": [\n\t\t44924,\n\t\t23513\n\t],\n\t\"./prism-tcl\": [\n\t\t26292,\n\t\t29048\n\t],\n\t\"./prism-tcl.js\": [\n\t\t26292,\n\t\t29048\n\t],\n\t\"./prism-tcl.min\": [\n\t\t966,\n\t\t52731\n\t],\n\t\"./prism-tcl.min.js\": [\n\t\t966,\n\t\t52731\n\t],\n\t\"./prism-textile\": [\n\t\t39634,\n\t\t52786\n\t],\n\t\"./prism-textile.js\": [\n\t\t39634,\n\t\t52786\n\t],\n\t\"./prism-textile.min\": [\n\t\t86124,\n\t\t12337\n\t],\n\t\"./prism-textile.min.js\": [\n\t\t86124,\n\t\t12337\n\t],\n\t\"./prism-toml\": [\n\t\t36571,\n\t\t32323\n\t],\n\t\"./prism-toml.js\": [\n\t\t36571,\n\t\t32323\n\t],\n\t\"./prism-toml.min\": [\n\t\t34069,\n\t\t39896\n\t],\n\t\"./prism-toml.min.js\": [\n\t\t34069,\n\t\t39896\n\t],\n\t\"./prism-tremor\": [\n\t\t14330,\n\t\t61400\n\t],\n\t\"./prism-tremor.js\": [\n\t\t14330,\n\t\t61400\n\t],\n\t\"./prism-tremor.min\": [\n\t\t90836,\n\t\t42299\n\t],\n\t\"./prism-tremor.min.js\": [\n\t\t90836,\n\t\t42299\n\t],\n\t\"./prism-tsx\": [\n\t\t88456,\n\t\t46172\n\t],\n\t\"./prism-tsx.js\": [\n\t\t88456,\n\t\t46172\n\t],\n\t\"./prism-tsx.min\": [\n\t\t2594,\n\t\t58967\n\t],\n\t\"./prism-tsx.min.js\": [\n\t\t2594,\n\t\t58967\n\t],\n\t\"./prism-tt2\": [\n\t\t45365,\n\t\t60283\n\t],\n\t\"./prism-tt2.js\": [\n\t\t45365,\n\t\t60283\n\t],\n\t\"./prism-tt2.min\": [\n\t\t95199,\n\t\t4432\n\t],\n\t\"./prism-tt2.min.js\": [\n\t\t95199,\n\t\t4432\n\t],\n\t\"./prism-turtle\": [\n\t\t19201,\n\t\t20121\n\t],\n\t\"./prism-turtle.js\": [\n\t\t19201,\n\t\t20121\n\t],\n\t\"./prism-turtle.min\": [\n\t\t4771,\n\t\t41818\n\t],\n\t\"./prism-turtle.min.js\": [\n\t\t4771,\n\t\t41818\n\t],\n\t\"./prism-twig\": [\n\t\t79914,\n\t\t6308\n\t],\n\t\"./prism-twig.js\": [\n\t\t79914,\n\t\t6308\n\t],\n\t\"./prism-twig.min\": [\n\t\t30020,\n\t\t86687\n\t],\n\t\"./prism-twig.min.js\": [\n\t\t30020,\n\t\t86687\n\t],\n\t\"./prism-typescript\": [\n\t\t47932,\n\t\t44930\n\t],\n\t\"./prism-typescript.js\": [\n\t\t47932,\n\t\t44930\n\t],\n\t\"./prism-typescript.min\": [\n\t\t30574,\n\t\t91745\n\t],\n\t\"./prism-typescript.min.js\": [\n\t\t30574,\n\t\t91745\n\t],\n\t\"./prism-typoscript\": [\n\t\t3554,\n\t\t56244\n\t],\n\t\"./prism-typoscript.js\": [\n\t\t3554,\n\t\t56244\n\t],\n\t\"./prism-typoscript.min\": [\n\t\t59676,\n\t\t82351\n\t],\n\t\"./prism-typoscript.min.js\": [\n\t\t59676,\n\t\t82351\n\t],\n\t\"./prism-unrealscript\": [\n\t\t62003,\n\t\t93375\n\t],\n\t\"./prism-unrealscript.js\": [\n\t\t62003,\n\t\t93375\n\t],\n\t\"./prism-unrealscript.min\": [\n\t\t58765,\n\t\t58012\n\t],\n\t\"./prism-unrealscript.min.js\": [\n\t\t58765,\n\t\t58012\n\t],\n\t\"./prism-uorazor\": [\n\t\t44447,\n\t\t50553\n\t],\n\t\"./prism-uorazor.js\": [\n\t\t44447,\n\t\t50553\n\t],\n\t\"./prism-uorazor.min\": [\n\t\t92097,\n\t\t1978\n\t],\n\t\"./prism-uorazor.min.js\": [\n\t\t92097,\n\t\t1978\n\t],\n\t\"./prism-uri\": [\n\t\t37337,\n\t\t29643\n\t],\n\t\"./prism-uri.js\": [\n\t\t37337,\n\t\t29643\n\t],\n\t\"./prism-uri.min\": [\n\t\t7035,\n\t\t53024\n\t],\n\t\"./prism-uri.min.js\": [\n\t\t7035,\n\t\t53024\n\t],\n\t\"./prism-v\": [\n\t\t35857,\n\t\t35391\n\t],\n\t\"./prism-v.js\": [\n\t\t35857,\n\t\t35391\n\t],\n\t\"./prism-v.min\": [\n\t\t28115,\n\t\t32988\n\t],\n\t\"./prism-v.min.js\": [\n\t\t28115,\n\t\t32988\n\t],\n\t\"./prism-vala\": [\n\t\t41497,\n\t\t48969\n\t],\n\t\"./prism-vala.js\": [\n\t\t41497,\n\t\t48969\n\t],\n\t\"./prism-vala.min\": [\n\t\t44603,\n\t\t42442\n\t],\n\t\"./prism-vala.min.js\": [\n\t\t44603,\n\t\t42442\n\t],\n\t\"./prism-vbnet\": [\n\t\t55244,\n\t\t9672\n\t],\n\t\"./prism-vbnet.js\": [\n\t\t55244,\n\t\t9672\n\t],\n\t\"./prism-vbnet.min\": [\n\t\t16382,\n\t\t15467\n\t],\n\t\"./prism-vbnet.min.js\": [\n\t\t16382,\n\t\t15467\n\t],\n\t\"./prism-velocity\": [\n\t\t89108,\n\t\t75954\n\t],\n\t\"./prism-velocity.js\": [\n\t\t89108,\n\t\t75954\n\t],\n\t\"./prism-velocity.min\": [\n\t\t50342,\n\t\t50449\n\t],\n\t\"./prism-velocity.min.js\": [\n\t\t50342,\n\t\t50449\n\t],\n\t\"./prism-verilog\": [\n\t\t47773,\n\t\t52555\n\t],\n\t\"./prism-verilog.js\": [\n\t\t47773,\n\t\t52555\n\t],\n\t\"./prism-verilog.min\": [\n\t\t92423,\n\t\t6400\n\t],\n\t\"./prism-verilog.min.js\": [\n\t\t92423,\n\t\t6400\n\t],\n\t\"./prism-vhdl\": [\n\t\t52445,\n\t\t25261\n\t],\n\t\"./prism-vhdl.js\": [\n\t\t52445,\n\t\t25261\n\t],\n\t\"./prism-vhdl.min\": [\n\t\t64391,\n\t\t4294\n\t],\n\t\"./prism-vhdl.min.js\": [\n\t\t64391,\n\t\t4294\n\t],\n\t\"./prism-vim\": [\n\t\t51751,\n\t\t27697\n\t],\n\t\"./prism-vim.js\": [\n\t\t51751,\n\t\t27697\n\t],\n\t\"./prism-vim.min\": [\n\t\t57193,\n\t\t81074\n\t],\n\t\"./prism-vim.min.js\": [\n\t\t57193,\n\t\t81074\n\t],\n\t\"./prism-visual-basic\": [\n\t\t17012,\n\t\t80610\n\t],\n\t\"./prism-visual-basic.js\": [\n\t\t17012,\n\t\t80610\n\t],\n\t\"./prism-visual-basic.min\": [\n\t\t70553,\n\t\t37313\n\t],\n\t\"./prism-visual-basic.min.js\": [\n\t\t70553,\n\t\t37313\n\t],\n\t\"./prism-warpscript\": [\n\t\t94954,\n\t\t55884\n\t],\n\t\"./prism-warpscript.js\": [\n\t\t94954,\n\t\t55884\n\t],\n\t\"./prism-warpscript.min\": [\n\t\t8964,\n\t\t3079\n\t],\n\t\"./prism-warpscript.min.js\": [\n\t\t8964,\n\t\t3079\n\t],\n\t\"./prism-wasm\": [\n\t\t27723,\n\t\t40987\n\t],\n\t\"./prism-wasm.js\": [\n\t\t27723,\n\t\t40987\n\t],\n\t\"./prism-wasm.min\": [\n\t\t3781,\n\t\t1264\n\t],\n\t\"./prism-wasm.min.js\": [\n\t\t3781,\n\t\t1264\n\t],\n\t\"./prism-web-idl\": [\n\t\t81123,\n\t\t43169\n\t],\n\t\"./prism-web-idl.js\": [\n\t\t81123,\n\t\t43169\n\t],\n\t\"./prism-web-idl.min\": [\n\t\t44829,\n\t\t99714\n\t],\n\t\"./prism-web-idl.min.js\": [\n\t\t44829,\n\t\t99714\n\t],\n\t\"./prism-wgsl\": [\n\t\t97870,\n\t\t49944\n\t],\n\t\"./prism-wgsl.js\": [\n\t\t97870,\n\t\t49944\n\t],\n\t\"./prism-wgsl.min\": [\n\t\t18976,\n\t\t53307\n\t],\n\t\"./prism-wgsl.min.js\": [\n\t\t18976,\n\t\t53307\n\t],\n\t\"./prism-wiki\": [\n\t\t1503,\n\t\t45935\n\t],\n\t\"./prism-wiki.js\": [\n\t\t1503,\n\t\t45935\n\t],\n\t\"./prism-wiki.min\": [\n\t\t46369,\n\t\t59212\n\t],\n\t\"./prism-wiki.min.js\": [\n\t\t46369,\n\t\t59212\n\t],\n\t\"./prism-wolfram\": [\n\t\t18019,\n\t\t82537\n\t],\n\t\"./prism-wolfram.js\": [\n\t\t18019,\n\t\t82537\n\t],\n\t\"./prism-wolfram.min\": [\n\t\t74973,\n\t\t91626\n\t],\n\t\"./prism-wolfram.min.js\": [\n\t\t74973,\n\t\t91626\n\t],\n\t\"./prism-wren\": [\n\t\t92441,\n\t\t72025\n\t],\n\t\"./prism-wren.js\": [\n\t\t92441,\n\t\t72025\n\t],\n\t\"./prism-wren.min\": [\n\t\t76699,\n\t\t54202\n\t],\n\t\"./prism-wren.min.js\": [\n\t\t76699,\n\t\t54202\n\t],\n\t\"./prism-xeora\": [\n\t\t23978,\n\t\t48262\n\t],\n\t\"./prism-xeora.js\": [\n\t\t23978,\n\t\t48262\n\t],\n\t\"./prism-xeora.min\": [\n\t\t32164,\n\t\t4253\n\t],\n\t\"./prism-xeora.min.js\": [\n\t\t32164,\n\t\t4253\n\t],\n\t\"./prism-xml-doc\": [\n\t\t14129,\n\t\t28703\n\t],\n\t\"./prism-xml-doc.js\": [\n\t\t14129,\n\t\t28703\n\t],\n\t\"./prism-xml-doc.min\": [\n\t\t26707,\n\t\t48732\n\t],\n\t\"./prism-xml-doc.min.js\": [\n\t\t26707,\n\t\t48732\n\t],\n\t\"./prism-xojo\": [\n\t\t21197,\n\t\t73125\n\t],\n\t\"./prism-xojo.js\": [\n\t\t21197,\n\t\t73125\n\t],\n\t\"./prism-xojo.min\": [\n\t\t94903,\n\t\t45630\n\t],\n\t\"./prism-xojo.min.js\": [\n\t\t94903,\n\t\t45630\n\t],\n\t\"./prism-xquery\": [\n\t\t38559,\n\t\t17019\n\t],\n\t\"./prism-xquery.js\": [\n\t\t38559,\n\t\t17019\n\t],\n\t\"./prism-xquery.min\": [\n\t\t78497,\n\t\t9584\n\t],\n\t\"./prism-xquery.min.js\": [\n\t\t78497,\n\t\t9584\n\t],\n\t\"./prism-yaml\": [\n\t\t30104,\n\t\t77406\n\t],\n\t\"./prism-yaml.js\": [\n\t\t30104,\n\t\t77406\n\t],\n\t\"./prism-yaml.min\": [\n\t\t72978,\n\t\t75221\n\t],\n\t\"./prism-yaml.min.js\": [\n\t\t72978,\n\t\t75221\n\t],\n\t\"./prism-yang\": [\n\t\t60466,\n\t\t14984\n\t],\n\t\"./prism-yang.js\": [\n\t\t60466,\n\t\t14984\n\t],\n\t\"./prism-yang.min\": [\n\t\t31276,\n\t\t74219\n\t],\n\t\"./prism-yang.min.js\": [\n\t\t31276,\n\t\t74219\n\t],\n\t\"./prism-zig\": [\n\t\t93789,\n\t\t32199\n\t],\n\t\"./prism-zig.js\": [\n\t\t93789,\n\t\t32199\n\t],\n\t\"./prism-zig.min\": [\n\t\t10407,\n\t\t11108\n\t],\n\t\"./prism-zig.min.js\": [\n\t\t10407,\n\t\t11108\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(() => {\n\t\treturn __webpack_require__.t(id, 7 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 50652;\nmodule.exports = webpackAsyncContext;"],"names":["whitespaceCache","Map","DiffLine","React","_ref","content","language","type","oldLineNumber","newLineNumber","viewType","showLineNumbers","style","lineNumbers","useMemo","old","new","highlighted","setHighlighted","useState","isLoading","setIsLoading","isDarkMode","useTheme","isHighlighting","setIsHighlighting","languageLoadedRef","useRef","lastGoodRenderRef","contentRef","visualizeWhitespace","text","cacheKey","concat","has","get","result","trim","markers","replace","c","match","_","baseText","trailingWs","Array","from","map","join","lastIndexOf","wsClass","set","useLayoutEffect","async","current","loadPrismLanguage","e","console","warn","window","Prism","length","includes","innerHTML","rendered","code","startsWith","slice","grammar","languages","plaintext","highlightedCode","highlight","escapedCode","error","highlightCode","themeStyles","backgroundColor","color","contentStyle","_objectSpread","visibility","whiteSpace","minWidth","display","overflow","fontFamily","font","gutterWidth","codeWidth","_jsxs","className","String","children","_jsx","width","maxWidth","ref","dangerouslySetInnerHTML","__html","prev","next","removeThinkingTags","TAG_VARIATIONS","file","find","change","apply","FileOperationParser","constructor","operations","errors","this","parse","parseCompleteOperations","parseMalformedOperations","validateOperations","hasValidOperations","some","op","isValid","totalOperations","operationBlocks","findOperationBlocks","block","operation","parseOperationBlock","push","blocks","blockPattern","exec","individualPattern","applyMatch","innerContent","parseInnerOperation","raw","warnings","extractTagContent","changeContent","applyContent","parseApplyValue","validateOperation","tagName","variations","variation","standardPattern","RegExp","standardMatch","selfClosingPattern","selfClosingMatch","extractAttributeValue","attrPattern","attrMatch","attrValue","textContent","attributes","patterns","pattern","normalized","toLowerCase","tags","tag","hasFind","hasChange","hasReplace","fileOperations","ops","containsFileOperations","test","extractSafely","detectFileOperationSyntax","parseFileOperations","renderFileOperationSafely","shouldRender","safeContent","parseResult","Panel","Collapse","Text","Paragraph","Typography","FileOperationRenderer","enableApply","appliedOperations","setAppliedOperations","Set","Alert","message","description","index","showIcon","createDiffFromOperation","getOperationIcon","SwapOutlined","SearchOutlined","EditOutlined","FileOutlined","getOperationTitle","marginBottom","renderOperation","isApplied","Card","size","title","Space","strong","Tag","CheckCircleOutlined","CloseCircleOutlined","extra","Button","icon","PlayCircleOutlined","onClick","diffContent","fetch","method","headers","body","JSON","stringify","diff","filePath","ok","handleApplyOperation","ghost","header","copyable","padding","marginTop","warning","i","ThinkingBlock","isStreaming","isExpanded","setIsExpanded","border","borderRadius","margin","cursor","borderBottom","alignItems","gap","fontSize","hunkStatusEventBus","EventTarget","HUNK_STATUS_EVENT","processedWindowEvents","diffRequestMap","ToolBlock","_ref2","toolName","isSecurityError","securityErrorMessage","messageMatch","isMCPError","isShellCommand","cleanContent","colors","bg","headerBg","headerText","contentText","boxShadow","fontWeight","textTransform","letterSpacing","wordBreak","ErrorBoundary","props","super","state","hasError","getDerivedStateFromError","componentDidCatch","errorInfo","errorType","render","fallback","DisplayModes","DiffControls","memo","_ref3","displayMode","fileTitle","onDisplayModeChange","onViewTypeChange","onLineNumbersChange","isHovered","setIsHovered","onMouseEnter","onMouseLeave","justifyContent","opacity","transition","zIndex","flex","textAlign","textOverflow","_Fragment","Tooltip","NumberOutlined","height","SplitCellsOutlined","newViewType","diffViewType","marginRight","EyeOutlined","FileTextOutlined","newMode","diffDisplayMode","extractAllFilesFromDiff","files","lines","split","line","gitMatch","newPath","oldPath","minusMatch","plusMatch","checkFilesInContext","filePaths","currentFiles","arguments","undefined","missingFiles","availableFiles","cleanPath","substring","currentFile","endsWith","log","displayName","extractSingleFileDiff","fullDiff","indexOf","cleanFilePath","inTargetFile","collectingHunk","currentHunkHeader","currentHunkContent","nextLine","fileMatch","debug","targetFileFound","extractedLines","normalizeGitDiff","normalizedLines","hasDiffHeaders","hasHunkHeader","hasGitHeader","hasHunkHeaders","gitHeaderMatch","partialMatch","oldStart","oldCount","newStart","newCount","context","fixedLine","fixedDiff","fixHaikuStyleDiff","unifiedMatch","splice","addCount","removeCount","contextCount","normalizedContentLines","filter","oldLines","newLines","trimmed","trimStart","indentMatch","existingHunkHeaders","forEach","marker","DiffView","_ref4","initialDisplayMode","elementId","fileIndex","tokenizedHunks","setTokenizedHunks","parsedFilesRef","parseError","setParseError","lastValidDiffRef","isGlobalStreaming","useChatContext","instanceHunkStatusMap","setInstanceHunkStatusMap","statusUpdateCounter","setStatusUpdateCounter","errorMessage","setErrorMessage","setDisplayMode","diffRef","forceRenderRef","diffId","Date","now","Math","random","toString","isStreamingRef","useEffect","diffElementPaths","hunkStatusRegistry","handleStatusUpdate","event","addEventListener","removeEventListener","updateHunkStatuses","useCallback","hunkStatuses","targetDiffId","force","parseDiff","hunks","hunk","hunkIndex","hunkKey","hunkId","status","newMap","registryMap","applied","alreadyApplied","reason","stage","errorMsg","Error","detectLanguage","_filePath$split$pop","pop","parseAndSetFiles","normalizedDiff","parsedFiles","oldRevision","newRevision","oldEndingNewLine","newEndingNewLine","oldMode","similarity","changes","isDelete","isInsert","isNormal","lineNumber","process","_parsedFilesRef$curre","_parsedFilesRef$curre2","_parsedFilesRef$curre3","_window$Prism","_window$Prism$languag","Promise","all","tokens","tokenize","refractor","tokenizeHunks","renderHunks","tableClassName","previousHunk","linesBetween","showEllipsis","ellipsisText","statusReason","isAlreadyApplied","hunkStatusIndicator","marginLeft","colSpan","borderLeft","id","borderCollapse","renderContent","lineHeight","rowStyle","normalChangesBeforeThis","oldLine","newLine","rowProps","styles","currentTheme","addition","background","deletion","gutter","renderFile","hunkRef","statusIcon","statusTooltip","statusColor","verticalAlign","diffContainer","document","getElementById","hunkElement","querySelector","scrollIntoView","behavior","ApplyChangesButton","diffElementId","setHunkStatuses","enabled","enableCodeApply","position","overflowY","overflowX","_ref6","setIsApplied","isProcessing","setIsProcessing","statusUpdateCounterRef","appliedRef","buttonInstanceId","processedRequestIds","diffComplete","isDiffComplete","hasFileHeaders","hasContent","lastNonEmptyLine","endsAbruptly","shouldDisableButton","buttonId","useId","triggerDiffUpdate","requestId","add","customEvent","CustomEvent","detail","isCompletionEvent","targetDiffElementId","dispatchEvent","checkStreamingState","streamingElements","querySelectorAll","observer","MutationObserver","observe","childList","subtree","disconnect","handleHunkStatusUpdate","_diffRequestMap$get","eventButtonInstanceId","eventKey","setTimeout","delete","targetDiffElementIdFromMap","isRelevantUpdate","Object","entries","_ref7","parseInt","clear","cleanDiff","processing","firstLine","totalLines","fullContent","singleFileDiff","diffLength","diffMatch","found","Boolean","groups","matchContent","fullMatch","extractedDiff","lastLine","truncated","requestBody","requestBodyParsed","response","sentData","clone","json","statusText","fromEntries","_data$details","_data$details2","_data$details3","_data$details4","_data$details4$succee","_data$details5","data","rawData","request_id","hasRequestId","mappingAdded","hasDetails","details","hunk_statuses","detailsKeys","keys","succeeded","failed","hasSuccessfulHunks","_data$details6","_data$details8","_data$details7","hunkStatus","success","_data$details13","_data$details14","_data$details9","_data$details9$hunk_s","_data$details10","_data$details10$succe","_data$details11","_data$details11$alrea","_data$details12","_data$details12$faile","isInSucceededList","isAlreadyAppliedList","already_applied","isInFailedList","paddingLeft","listStyle","_data$details15","_data$details15$hunk_","error_details","duration","_data$details17","_data$details18","_data$details16","_data$details16$hunk_","_data$details19","_data$details19$hunk_","_hunkStatus$error_det","_errorData$detail2","_errorData$detail3","_errorData$detail4","_errorData$details","errorData","catch","_errorData$detail","errorDataKeys","detailType","summary","_errorData$details2","_errorData$details2$h","key","disabled","loading","CheckOutlined","hasText","token","isCodeToken","DiffToken","_ref8","streamingConversations","currentConversationId","currentMessages","addMessageToConversation","setStreamedContentMap","removeStreamingConversation","setIsStreaming","checkedKeys","addFilesToContext","useFolderContext","isCheckingFiles","setIsCheckingFiles","hasCheckedFilesRef","checkTimeoutRef","needsContextEnhancement","setNeedsContextEnhancement","missingFilesList","setMissingFilesList","lastTokenLengthRef","hasCheckedAfterStreamingRef","referencedFiles","checkAfterStreaming","debouncedCheck","checkFn","clearTimeout","checkMissingFiles","isCurrentlyStreaming","currentLength","lengthGrowth","cleanedText","contextEnhancementOverlay","allCurrentFiles","restartStreamWithEnhancedContext","borderColor","DiffViewWrapper","_ref9","setViewType","setShowLineNumbers","diffShowLineNumbers","isVisible","setIsVisible","currentContent","setCurrentContent","initialFileTitleRef","stableElementIdRef","streamingContentRef","parseTimeoutRef","containerRef","extractFileTitle","IntersectionObserver","_ref10","entry","isIntersecting","threshold","rootMargin","parsed","extractedTitle","_parsedFilesRef$curre4","diffText","forceRender","CodeBlock","_ref11","_token$lang","tokenRef","isLanguageLoaded","setIsLanguageLoaded","lang","loadError","setLoadError","prismInstance","setPrismInstance","debugInfo","setDebugInfo","normalizedLang","getHighlightedCode","codeToHighlight","highlightCodeIfNeeded","contentLength","isPartial","_window$Prism2","originalLang","effectiveLang","getEffectiveLang","tokenType","prismLoaded","availableLanguages","tokenContent","loadedLang","prismAvailable","languagesAfterLoad","grammarAvailable","loadLanguage","rawLang","highlightedHtml","textShadow","lastLogTimestamp","decodeHtmlEntities","renderTokens","isSubRender","thinkingContentRef","isDebugLoggingEnabled","debugLog","_lang","_tokenWithText$text3","_tokenWithText$text4","_tokenWithText$text5","_tokenWithText$lang","_linkToken$title","_imageToken$title","previousToken","determinedType","linesToCheck","diffMarkersFound","containsDiffGit","_parsed$$schema","$schema","mark","encoding","layer","facet","repeat","trimmedText","toolMatch","_parsed$$schema2","determineTokenType","tokenWithText","prevTokenWithText","_tokenWithText$text","_tokenWithText$text2","MarkdownRenderer","markdown","rawDiffText","cleanedDiff","cleanDiffContent","diffToken","splitMultiFileDiffs","renderMultiFileDiff","safetyResult","D3Renderer","spec","definition","isMarkdownBlockClosed","timestamp","mermaidSpec","vegaLiteSpec","parsedSpec","pythonDictMatch","_tokenWithText$text6","rawCodeText","codeToken","decodedToken","pTokens","paragraphContent","t","parts","part","math","MathRenderer","filteredPTokens","listToken","ListTag","ordered","start","items","item","itemIndex","listItemToken","itemContent","task","checked","name","readOnly","tableToken","cell","cellIndex","align","rows","row","rowIndex","knownHtmlTags","htmlContent","mathWithNamespace","mathMatch","tagMatches","hasUnknownTags","_tag$match","_tag$match$","decodedText","thinkingContent","decodedCode","linkToken","href","imageToken","imageHref","src","alt","headingToken","depth","fileHeaderRegex","fileDiffs","currentDiff","stableKey","wrappedDiff","markedOptions","gfm","breaks","pedantic","_ref12","katex","require","html","renderToString","throwOnError","strict","_ref13","externalStreaming","previousTokensRef","markdownRef","thinkingRenderedRef","forceRenderKey","setForceRenderKey","displayTokens","setDisplayTokens","isStreamingState","lexedTokens","processedMarkdown","indentedDiffMatch","indentLevel","diffLine","normalizedLine","normalizeIndentedDiffs","toolCallMatch","parseToolCall","formattedToolCall","toolCall","args","formatToolCallForDisplay","thinkingMatch","thinkingPattern","parseThinkingContent","isDiff","segments","segment","processed","p1","surroundingText","hasLatex","hasMathSymbols","mathMLRegex","mathMLBlocks","mathBlock","marked","lexer","renderedContent","prevProps","nextProps","offsetMatch","leadingSpace","diffMarker","lineNum","modifier","actualMarker","simpleOffsetMatch","_len","_key","loadedLanguages","languageMap","js","javascript","jsx","ts","tsx","py","rb","java","cpp","cs","go","rs","php","objectivec","objc","swift","metal","sh","yml","yaml","md","sql","plist","xml","dockerfile","initializationPromise","loadingPromises","attemptedLoads","existingPromise","mappedLanguage","resolve","prism","default","instance","loadPrismCore","_window$Prism3","_window$Prism3$langua","_window$Prism4","_window$Prism4$langua","_window$Prism2$langua","extend","typescript","_window$Prism5","_window$Prism5$langua","clike","_window$Prism6","_window$Prism6$langua","webpackAsyncContext","req","__webpack_require__","o","then","ids","module","exports"],"sourceRoot":""}