ziya 0.1.48__py3-none-any.whl → 0.1.49__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.
- app/agents/agent.py +326 -64
- app/agents/prompts.py +44 -18
- app/main.py +3 -11
- app/server.py +205 -16
- app/utils/code_util.py +1090 -255
- app/utils/file_cache.py +180 -0
- app/utils/file_state_manager.py +204 -0
- app/utils/file_utils.py +34 -0
- app/utils/logging_utils.py +19 -7
- pyproject.toml +7 -7
- templates/asset-manifest.json +1236 -6
- templates/index.html +1 -1
- templates/static/css/14386.485ec235.chunk.css +2 -0
- templates/static/css/14386.485ec235.chunk.css.map +1 -0
- templates/static/css/18884.afc680c7.chunk.css +2 -0
- templates/static/css/18884.afc680c7.chunk.css.map +1 -0
- templates/static/css/40036.f1973587.chunk.css +2 -0
- templates/static/css/40036.f1973587.chunk.css.map +1 -0
- templates/static/css/71078.afc680c7.chunk.css +2 -0
- templates/static/css/71078.afc680c7.chunk.css.map +1 -0
- templates/static/css/99948.485ec235.chunk.css +2 -0
- templates/static/css/99948.485ec235.chunk.css.map +1 -0
- templates/static/css/{main.f447c982.css → main.87f30840.css} +3 -3
- templates/static/css/main.87f30840.css.map +1 -0
- templates/static/js/14386.977217e3.chunk.js +2 -0
- templates/static/js/14386.977217e3.chunk.js.map +1 -0
- templates/static/js/23416.c33f07ab.chunk.js +3 -0
- templates/static/js/23416.c33f07ab.chunk.js.LICENSE.txt +14 -0
- templates/static/js/23416.c33f07ab.chunk.js.map +1 -0
- templates/static/js/35112.d7a417f9.chunk.js +2 -0
- templates/static/js/35112.d7a417f9.chunk.js.map +1 -0
- templates/static/js/3799.fedb612f.chunk.js +2 -0
- templates/static/js/3799.fedb612f.chunk.js.map +1 -0
- templates/static/js/40036.b241027e.chunk.js +2 -0
- templates/static/js/40036.b241027e.chunk.js.map +1 -0
- templates/static/js/42046.98dd49b5.chunk.js +2 -0
- templates/static/js/42046.98dd49b5.chunk.js.map +1 -0
- templates/static/js/46907.4a730107.chunk.js +2 -0
- templates/static/js/46907.4a730107.chunk.js.map +1 -0
- templates/static/js/53653.56c7ad1f.chunk.js +3 -0
- templates/static/js/53653.56c7ad1f.chunk.js.LICENSE.txt +11 -0
- templates/static/js/53653.56c7ad1f.chunk.js.map +1 -0
- templates/static/js/64754.cf383335.chunk.js +2 -0
- templates/static/js/64754.cf383335.chunk.js.map +1 -0
- templates/static/js/71078.a4da4bc6.chunk.js +2 -0
- templates/static/js/71078.a4da4bc6.chunk.js.map +1 -0
- templates/static/js/79218.4f700779.chunk.js +3 -0
- templates/static/js/79218.4f700779.chunk.js.LICENSE.txt +8 -0
- templates/static/js/79218.4f700779.chunk.js.map +1 -0
- templates/static/js/88261.33450351.chunk.js +3 -0
- templates/static/js/88261.33450351.chunk.js.LICENSE.txt +1 -0
- templates/static/js/88261.33450351.chunk.js.map +1 -0
- templates/static/js/96603.863a8f96.chunk.js +2 -0
- templates/static/js/96603.863a8f96.chunk.js.map +1 -0
- templates/static/js/97902.75670155.chunk.js +3 -0
- templates/static/js/97902.75670155.chunk.js.LICENSE.txt +3 -0
- templates/static/js/97902.75670155.chunk.js.map +1 -0
- templates/static/js/99948.37907198.chunk.js +2 -0
- templates/static/js/99948.37907198.chunk.js.map +1 -0
- templates/static/js/main.ee8b3c96.js +3 -0
- templates/static/js/main.ee8b3c96.js.LICENSE.txt +121 -0
- templates/static/js/main.ee8b3c96.js.map +1 -0
- templates/static/js/prism-lang.prism-abap-min.f6d3b9da.chunk.js +2 -0
- templates/static/js/prism-lang.prism-abap-min.f6d3b9da.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-abap.e39ba0c4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-abap.e39ba0c4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-abnf-min.be45e0bb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-abnf-min.be45e0bb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-abnf.a30eb087.chunk.js +2 -0
- templates/static/js/prism-lang.prism-abnf.a30eb087.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-actionscript-min.2646eea4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-actionscript-min.2646eea4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-actionscript.a5543070.chunk.js +2 -0
- templates/static/js/prism-lang.prism-actionscript.a5543070.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ada-min.83858f38.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ada-min.83858f38.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ada.a177152a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ada.a177152a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-agda-min.ced2fa9c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-agda-min.ced2fa9c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-agda.89472d62.chunk.js +2 -0
- templates/static/js/prism-lang.prism-agda.89472d62.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-al-min.b3d74ecd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-al-min.b3d74ecd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-al.e313cf4c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-al.e313cf4c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-antlr4-min.e10940a9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-antlr4-min.e10940a9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-antlr4.9e943719.chunk.js +2 -0
- templates/static/js/prism-lang.prism-antlr4.9e943719.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apacheconf-min.19c2f6b6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apacheconf-min.19c2f6b6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apacheconf.64bfa640.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apacheconf.64bfa640.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apex-min.a8abc6f3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apex-min.a8abc6f3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apex.085d7c1c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apex.085d7c1c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apl-min.93215e18.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apl-min.93215e18.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-apl.e528a12f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-apl.e528a12f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-applescript-min.5be9040c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-applescript-min.5be9040c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-applescript.e8d14c94.chunk.js +2 -0
- templates/static/js/prism-lang.prism-applescript.e8d14c94.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-aql-min.13e86cf9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-aql-min.13e86cf9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-aql.fd2231eb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-aql.fd2231eb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arduino-min.c47a6232.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arduino-min.c47a6232.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arduino.1164efcc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arduino.1164efcc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arff-min.4c56a19f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arff-min.4c56a19f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arff.4ebfcacb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arff.4ebfcacb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-armasm-min.12fb172d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-armasm-min.12fb172d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-armasm.ea580233.chunk.js +2 -0
- templates/static/js/prism-lang.prism-armasm.ea580233.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arturo-min.45067586.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arturo-min.45067586.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-arturo.09387589.chunk.js +2 -0
- templates/static/js/prism-lang.prism-arturo.09387589.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asciidoc-min.54fdb298.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asciidoc-min.54fdb298.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asciidoc.ade35498.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asciidoc.ade35498.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asm6502-min.05003efc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asm6502-min.05003efc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asm6502.cf8397ef.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asm6502.cf8397ef.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asmatmel-min.1034d5fa.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asmatmel-min.1034d5fa.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-asmatmel.c83259cf.chunk.js +2 -0
- templates/static/js/prism-lang.prism-asmatmel.c83259cf.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-aspnet-min.f8ee6969.chunk.js +2 -0
- templates/static/js/prism-lang.prism-aspnet-min.f8ee6969.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-aspnet.2de5abc4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-aspnet.2de5abc4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-autohotkey-min.0ec6c7db.chunk.js +2 -0
- templates/static/js/prism-lang.prism-autohotkey-min.0ec6c7db.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-autohotkey.ef0bead7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-autohotkey.ef0bead7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-autoit-min.3272cce9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-autoit-min.3272cce9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-autoit.8eaf4e34.chunk.js +2 -0
- templates/static/js/prism-lang.prism-autoit.8eaf4e34.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-avisynth-min.830802b8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-avisynth-min.830802b8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-avisynth.4b1f7b5a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-avisynth.4b1f7b5a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-avro-idl-min.21c25e52.chunk.js +2 -0
- templates/static/js/prism-lang.prism-avro-idl-min.21c25e52.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-avro-idl.be76da0f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-avro-idl.be76da0f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-awk-min.2dc8f888.chunk.js +2 -0
- templates/static/js/prism-lang.prism-awk-min.2dc8f888.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-awk.6cc5619b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-awk.6cc5619b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bash-min.93d917c0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bash-min.93d917c0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bash.22f04791.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bash.22f04791.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-basic-min.b74dcdce.chunk.js +2 -0
- templates/static/js/prism-lang.prism-basic-min.b74dcdce.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-basic.252e7c5e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-basic.252e7c5e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-batch-min.49f824e1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-batch-min.49f824e1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-batch.861d6904.chunk.js +2 -0
- templates/static/js/prism-lang.prism-batch.861d6904.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bbcode-min.dc82ccb4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bbcode-min.dc82ccb4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bbcode.788ac57c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bbcode.788ac57c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bbj-min.3bd7aa0c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bbj-min.3bd7aa0c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bbj.0d6e0829.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bbj.0d6e0829.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bicep-min.d41caf79.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bicep-min.d41caf79.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bicep.e539462e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bicep.e539462e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-birb-min.c7505d66.chunk.js +2 -0
- templates/static/js/prism-lang.prism-birb-min.c7505d66.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-birb.dd2e4fbe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-birb.dd2e4fbe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bison-min.d6195df9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bison-min.d6195df9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bison.e88e738b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bison.e88e738b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bnf-min.c0a250e5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bnf-min.c0a250e5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bnf.c90e48bd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bnf.c90e48bd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bqn-min.515efd48.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bqn-min.515efd48.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bqn.82147115.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bqn.82147115.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-brainfuck-min.cb567b27.chunk.js +2 -0
- templates/static/js/prism-lang.prism-brainfuck-min.cb567b27.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-brainfuck.d06a4876.chunk.js +2 -0
- templates/static/js/prism-lang.prism-brainfuck.d06a4876.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-brightscript-min.cc9ff383.chunk.js +2 -0
- templates/static/js/prism-lang.prism-brightscript-min.cc9ff383.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-brightscript.886c8b0e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-brightscript.886c8b0e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bro-min.a7705ef5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bro-min.a7705ef5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bro.bb844ef6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bro.bb844ef6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bsl-min.c05607fa.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bsl-min.c05607fa.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-bsl.cb0d8b8e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-bsl.cb0d8b8e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-c-min.ff401bb0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-c-min.ff401bb0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-c.2a99d5a7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-c.2a99d5a7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cfscript-min.689b87bc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cfscript-min.689b87bc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cfscript.d4479056.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cfscript.d4479056.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-chaiscript-min.d2509267.chunk.js +2 -0
- templates/static/js/prism-lang.prism-chaiscript-min.d2509267.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-chaiscript.05ad9b29.chunk.js +2 -0
- templates/static/js/prism-lang.prism-chaiscript.05ad9b29.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cil-min.ccfb903b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cil-min.ccfb903b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cil.dc934ae3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cil.dc934ae3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cilkc-min.3cba448d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cilkc-min.3cba448d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cilkc.1d201a62.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cilkc.1d201a62.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cilkcpp-min.e365877d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cilkcpp-min.e365877d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cilkcpp.2845fa02.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cilkcpp.2845fa02.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-clike-min.fd4fad58.chunk.js +2 -0
- templates/static/js/prism-lang.prism-clike-min.fd4fad58.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-clike.2e23872e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-clike.2e23872e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-clojure-min.63ea9802.chunk.js +2 -0
- templates/static/js/prism-lang.prism-clojure-min.63ea9802.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-clojure.68bf9e7b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-clojure.68bf9e7b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cmake-min.38c99576.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cmake-min.38c99576.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cmake.7f3bcf4e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cmake.7f3bcf4e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cobol-min.d6b81edd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cobol-min.d6b81edd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cobol.8721387e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cobol.8721387e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-coffeescript-min.947a236c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-coffeescript-min.947a236c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-coffeescript.b2f63762.chunk.js +2 -0
- templates/static/js/prism-lang.prism-coffeescript.b2f63762.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-concurnas-min.9c863189.chunk.js +2 -0
- templates/static/js/prism-lang.prism-concurnas-min.9c863189.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-concurnas.7ba94772.chunk.js +2 -0
- templates/static/js/prism-lang.prism-concurnas.7ba94772.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cooklang-min.d5431edc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cooklang-min.d5431edc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cooklang.d7e57149.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cooklang.d7e57149.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-coq-min.54aea999.chunk.js +2 -0
- templates/static/js/prism-lang.prism-coq-min.54aea999.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-coq.516120ff.chunk.js +2 -0
- templates/static/js/prism-lang.prism-coq.516120ff.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-core-min.d629bc31.chunk.js +2 -0
- templates/static/js/prism-lang.prism-core-min.d629bc31.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cpp-min.f901498f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cpp-min.f901498f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cpp.e242b3db.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cpp.e242b3db.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-crystal-min.7aa72335.chunk.js +2 -0
- templates/static/js/prism-lang.prism-crystal-min.7aa72335.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-crystal.07beea27.chunk.js +2 -0
- templates/static/js/prism-lang.prism-crystal.07beea27.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csharp-min.94fc9a8a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csharp-min.94fc9a8a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csharp.b22340e8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csharp.b22340e8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cshtml-min.17ef6b0e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cshtml-min.17ef6b0e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cshtml.2ebe3316.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cshtml.2ebe3316.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csp-min.a3dc0b52.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csp-min.a3dc0b52.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csp.feee146b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csp.feee146b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-css-extras-min.57821a36.chunk.js +2 -0
- templates/static/js/prism-lang.prism-css-extras-min.57821a36.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-css-extras.47c3b0b5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-css-extras.47c3b0b5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-css-min.759304dd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-css-min.759304dd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-css.921fab65.chunk.js +2 -0
- templates/static/js/prism-lang.prism-css.921fab65.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csv-min.9f92b0a3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csv-min.9f92b0a3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-csv.106521a9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-csv.106521a9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cue-min.8c80801e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cue-min.8c80801e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cue.10f4a797.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cue.10f4a797.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cypher-min.38cb7c95.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cypher-min.38cb7c95.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-cypher.ac1bc1d8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-cypher.ac1bc1d8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-d-min.b9dd31c7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-d-min.b9dd31c7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-d.b6bad9a8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-d.b6bad9a8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dart-min.18bf8b60.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dart-min.18bf8b60.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dart.c740bbcd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dart.c740bbcd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dataweave-min.e192996e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dataweave-min.e192996e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dataweave.57a80476.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dataweave.57a80476.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dax-min.bc545e08.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dax-min.bc545e08.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dax.567edeb8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dax.567edeb8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dhall-min.72020560.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dhall-min.72020560.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dhall.f88692ff.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dhall.f88692ff.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-diff-min.950c35a3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-diff-min.950c35a3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-diff.0c15ea49.chunk.js +2 -0
- templates/static/js/prism-lang.prism-diff.0c15ea49.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-django-min.f5b598ee.chunk.js +2 -0
- templates/static/js/prism-lang.prism-django-min.f5b598ee.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-django.27744486.chunk.js +2 -0
- templates/static/js/prism-lang.prism-django.27744486.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dns-zone-file-min.3ae5b817.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dns-zone-file-min.3ae5b817.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dns-zone-file.a0c6af49.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dns-zone-file.a0c6af49.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-docker-min.2c6fc93a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-docker-min.2c6fc93a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-docker.ba6b7215.chunk.js +2 -0
- templates/static/js/prism-lang.prism-docker.ba6b7215.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dot-min.d41aabc3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dot-min.d41aabc3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-dot.fe036884.chunk.js +2 -0
- templates/static/js/prism-lang.prism-dot.fe036884.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ebnf-min.8d6d151d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ebnf-min.8d6d151d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ebnf.aa81548c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ebnf.aa81548c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-editorconfig-min.36c897da.chunk.js +2 -0
- templates/static/js/prism-lang.prism-editorconfig-min.36c897da.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-editorconfig.51543530.chunk.js +2 -0
- templates/static/js/prism-lang.prism-editorconfig.51543530.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-eiffel-min.e20a8530.chunk.js +2 -0
- templates/static/js/prism-lang.prism-eiffel-min.e20a8530.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-eiffel.41eb5d28.chunk.js +2 -0
- templates/static/js/prism-lang.prism-eiffel.41eb5d28.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ejs-min.155459ca.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ejs-min.155459ca.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ejs.11379371.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ejs.11379371.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-elixir-min.6f047337.chunk.js +2 -0
- templates/static/js/prism-lang.prism-elixir-min.6f047337.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-elixir.0d23e23e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-elixir.0d23e23e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-elm-min.274929c3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-elm-min.274929c3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-elm.cf68a4c0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-elm.cf68a4c0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-erb-min.bb7efbf0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-erb-min.bb7efbf0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-erb.e9fd8406.chunk.js +2 -0
- templates/static/js/prism-lang.prism-erb.e9fd8406.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-erlang-min.3913fe3d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-erlang-min.3913fe3d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-erlang.58222cdb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-erlang.58222cdb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-etlua-min.02b18aa7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-etlua-min.02b18aa7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-etlua.db223dd2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-etlua.db223dd2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-excel-formula-min.b28db6c2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-excel-formula-min.b28db6c2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-excel-formula.72545e03.chunk.js +2 -0
- templates/static/js/prism-lang.prism-excel-formula.72545e03.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-factor-min.756d979b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-factor-min.756d979b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-factor.ed942522.chunk.js +2 -0
- templates/static/js/prism-lang.prism-factor.ed942522.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-false-min.0974a341.chunk.js +2 -0
- templates/static/js/prism-lang.prism-false-min.0974a341.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-false.3c1d28a5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-false.3c1d28a5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-firestore-security-rules-min.f94f4b97.chunk.js +2 -0
- templates/static/js/prism-lang.prism-firestore-security-rules-min.f94f4b97.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-firestore-security-rules.bb6f749f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-firestore-security-rules.bb6f749f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-flow-min.263e730d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-flow-min.263e730d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-flow.43fdcbd4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-flow.43fdcbd4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-fortran-min.c8a28aa9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-fortran-min.c8a28aa9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-fortran.3f5d2665.chunk.js +2 -0
- templates/static/js/prism-lang.prism-fortran.3f5d2665.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-fsharp-min.1bf286d0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-fsharp-min.1bf286d0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-fsharp.27f46321.chunk.js +2 -0
- templates/static/js/prism-lang.prism-fsharp.27f46321.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ftl-min.47ac2ebf.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ftl-min.47ac2ebf.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ftl.c725f271.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ftl.c725f271.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gap-min.6948cc68.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gap-min.6948cc68.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gap.1da8e392.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gap.1da8e392.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gcode-min.e8d37109.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gcode-min.e8d37109.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gcode.58450e81.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gcode.58450e81.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gdscript-min.0fe5ef79.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gdscript-min.0fe5ef79.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gdscript.644e2a66.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gdscript.644e2a66.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gedcom-min.efa74e49.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gedcom-min.efa74e49.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gedcom.1a6d0df2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gedcom.1a6d0df2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gettext-min.676210f9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gettext-min.676210f9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gettext.ba3b0a34.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gettext.ba3b0a34.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gherkin-min.18833e5c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gherkin-min.18833e5c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gherkin.c6a2dec9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gherkin.c6a2dec9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-git-min.39b09969.chunk.js +2 -0
- templates/static/js/prism-lang.prism-git-min.39b09969.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-git.ce336a64.chunk.js +2 -0
- templates/static/js/prism-lang.prism-git.ce336a64.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-glsl-min.60e79472.chunk.js +2 -0
- templates/static/js/prism-lang.prism-glsl-min.60e79472.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-glsl.5d9e40cc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-glsl.5d9e40cc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gml-min.2dd32b15.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gml-min.2dd32b15.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gml.512211eb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gml.512211eb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gn-min.b6e9994f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gn-min.b6e9994f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gn.3dddbe9c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gn.3dddbe9c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-go-min.c572edba.chunk.js +2 -0
- templates/static/js/prism-lang.prism-go-min.c572edba.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-go-module-min.fe059f76.chunk.js +2 -0
- templates/static/js/prism-lang.prism-go-module-min.fe059f76.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-go-module.f2c35343.chunk.js +2 -0
- templates/static/js/prism-lang.prism-go-module.f2c35343.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-go.f71d0910.chunk.js +2 -0
- templates/static/js/prism-lang.prism-go.f71d0910.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gradle-min.fdb17762.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gradle-min.fdb17762.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-gradle.b65d2340.chunk.js +2 -0
- templates/static/js/prism-lang.prism-gradle.b65d2340.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-graphql-min.c49f3590.chunk.js +2 -0
- templates/static/js/prism-lang.prism-graphql-min.c49f3590.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-graphql.8d6cb858.chunk.js +2 -0
- templates/static/js/prism-lang.prism-graphql.8d6cb858.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-groovy-min.e6308daa.chunk.js +2 -0
- templates/static/js/prism-lang.prism-groovy-min.e6308daa.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-groovy.cbf3df06.chunk.js +2 -0
- templates/static/js/prism-lang.prism-groovy.cbf3df06.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haml-min.2e211fa2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haml-min.2e211fa2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haml.b79fa76b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haml.b79fa76b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-handlebars-min.5fda0071.chunk.js +2 -0
- templates/static/js/prism-lang.prism-handlebars-min.5fda0071.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-handlebars.15a03269.chunk.js +2 -0
- templates/static/js/prism-lang.prism-handlebars.15a03269.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haskell-min.743195c8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haskell-min.743195c8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haskell.27832c7c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haskell.27832c7c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haxe-min.aeba83e1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haxe-min.aeba83e1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-haxe.764896bd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-haxe.764896bd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hcl-min.b1c65ad8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hcl-min.b1c65ad8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hcl.15f30dc5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hcl.15f30dc5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hlsl-min.fc91ad33.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hlsl-min.fc91ad33.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hlsl.37c8e85f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hlsl.37c8e85f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hoon-min.51ebff9c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hoon-min.51ebff9c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hoon.31ca42d7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hoon.31ca42d7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hpkp-min.b458562b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hpkp-min.b458562b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hpkp.75f17b69.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hpkp.75f17b69.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hsts-min.2ae1e1de.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hsts-min.2ae1e1de.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-hsts.ad2de606.chunk.js +2 -0
- templates/static/js/prism-lang.prism-hsts.ad2de606.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-http-min.ad650fea.chunk.js +2 -0
- templates/static/js/prism-lang.prism-http-min.ad650fea.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-http.83c7381a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-http.83c7381a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ichigojam-min.70a16b18.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ichigojam-min.70a16b18.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ichigojam.ced37238.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ichigojam.ced37238.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-icon-min.6390fa1b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-icon-min.6390fa1b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-icon.1c95fe9a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-icon.1c95fe9a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-icu-message-format-min.c143e2dd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-icu-message-format-min.c143e2dd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-icu-message-format.c107a4ad.chunk.js +2 -0
- templates/static/js/prism-lang.prism-icu-message-format.c107a4ad.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-idris-min.37660abf.chunk.js +2 -0
- templates/static/js/prism-lang.prism-idris-min.37660abf.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-idris.f4b09da2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-idris.f4b09da2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-iecst-min.812d4a74.chunk.js +2 -0
- templates/static/js/prism-lang.prism-iecst-min.812d4a74.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-iecst.f9989790.chunk.js +2 -0
- templates/static/js/prism-lang.prism-iecst.f9989790.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ignore-min.d3a41156.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ignore-min.d3a41156.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ignore.335a137b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ignore.335a137b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-inform7-min.599a543f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-inform7-min.599a543f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-inform7.f94b6e9c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-inform7.f94b6e9c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ini-min.0bd38edd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ini-min.0bd38edd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ini.327bf041.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ini.327bf041.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-io-min.b0704eb9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-io-min.b0704eb9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-io.94ea7141.chunk.js +2 -0
- templates/static/js/prism-lang.prism-io.94ea7141.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-j-min.7824ee6a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-j-min.7824ee6a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-j.28358225.chunk.js +2 -0
- templates/static/js/prism-lang.prism-j.28358225.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-java-min.746794b9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-java-min.746794b9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-java.afc042e4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-java.afc042e4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javadoc-min.8d401352.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javadoc-min.8d401352.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javadoc.20844397.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javadoc.20844397.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javadoclike-min.6231c7c7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javadoclike-min.6231c7c7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javadoclike.46523b97.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javadoclike.46523b97.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javascript-min.da684c96.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javascript-min.da684c96.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javascript.067de2d5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javascript.067de2d5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javastacktrace-min.e193df83.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javastacktrace-min.e193df83.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-javastacktrace.71bc6414.chunk.js +2 -0
- templates/static/js/prism-lang.prism-javastacktrace.71bc6414.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jexl-min.fe2ad901.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jexl-min.fe2ad901.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jexl.789932eb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jexl.789932eb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jolie-min.f3166ea4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jolie-min.f3166ea4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jolie.c2c35e8d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jolie.c2c35e8d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jq-min.7ee05fa6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jq-min.7ee05fa6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jq.66e92f60.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jq.66e92f60.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-js-extras-min.914370ee.chunk.js +2 -0
- templates/static/js/prism-lang.prism-js-extras-min.914370ee.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-js-extras.0d324e5e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-js-extras.0d324e5e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-js-templates-min.25bd69c7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-js-templates-min.25bd69c7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-js-templates.7df73cbc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-js-templates.7df73cbc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsdoc-min.b5c1a957.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsdoc-min.b5c1a957.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsdoc.b9878b49.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsdoc.b9878b49.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-json-min.eb7ed7e5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-json-min.eb7ed7e5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-json.66c7b006.chunk.js +2 -0
- templates/static/js/prism-lang.prism-json.66c7b006.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-json5-min.5aa59492.chunk.js +2 -0
- templates/static/js/prism-lang.prism-json5-min.5aa59492.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-json5.8a3d3c6a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-json5.8a3d3c6a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsonp-min.0b247549.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsonp-min.0b247549.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsonp.f17fc6cc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsonp.f17fc6cc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsstacktrace-min.e2b92805.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsstacktrace-min.e2b92805.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsstacktrace.6c5f50f4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsstacktrace.6c5f50f4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsx-min.6a0b1bba.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsx-min.6a0b1bba.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-jsx.24c9a5ea.chunk.js +2 -0
- templates/static/js/prism-lang.prism-jsx.24c9a5ea.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-julia-min.14a95223.chunk.js +2 -0
- templates/static/js/prism-lang.prism-julia-min.14a95223.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-julia.752566b7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-julia.752566b7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-keepalived-min.e9b783c8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-keepalived-min.e9b783c8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-keepalived.869caf58.chunk.js +2 -0
- templates/static/js/prism-lang.prism-keepalived.869caf58.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-keyman-min.1be52fc9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-keyman-min.1be52fc9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-keyman.f973c00f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-keyman.f973c00f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kotlin-min.7fbecdf6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kotlin-min.7fbecdf6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kotlin.cb0aa18e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kotlin.cb0aa18e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kumir-min.8671853f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kumir-min.8671853f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kumir.caf4815a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kumir.caf4815a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kusto-min.440692b6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kusto-min.440692b6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-kusto.16750127.chunk.js +2 -0
- templates/static/js/prism-lang.prism-kusto.16750127.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-latex-min.231e73c9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-latex-min.231e73c9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-latex.a52b5582.chunk.js +2 -0
- templates/static/js/prism-lang.prism-latex.a52b5582.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-latte-min.045104dd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-latte-min.045104dd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-latte.80c8e304.chunk.js +2 -0
- templates/static/js/prism-lang.prism-latte.80c8e304.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-less-min.a5e2284b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-less-min.a5e2284b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-less.48f5f982.chunk.js +2 -0
- templates/static/js/prism-lang.prism-less.48f5f982.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lilypond-min.f5dcfab7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lilypond-min.f5dcfab7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lilypond.3a28a8d8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lilypond.3a28a8d8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-linker-script-min.9abfeaf9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-linker-script-min.9abfeaf9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-linker-script.e55ecfeb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-linker-script.e55ecfeb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-liquid-min.3413cae5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-liquid-min.3413cae5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-liquid.41e5e081.chunk.js +2 -0
- templates/static/js/prism-lang.prism-liquid.41e5e081.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lisp-min.62a51474.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lisp-min.62a51474.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lisp.fd93779f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lisp.fd93779f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-livescript-min.43325730.chunk.js +2 -0
- templates/static/js/prism-lang.prism-livescript-min.43325730.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-livescript.13577a29.chunk.js +2 -0
- templates/static/js/prism-lang.prism-livescript.13577a29.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-llvm-min.b421daf5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-llvm-min.b421daf5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-llvm.4e0ee5cb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-llvm.4e0ee5cb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-log-min.f7eac1f6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-log-min.f7eac1f6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-log.2f9f930e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-log.2f9f930e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lolcode-min.e4aae47f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lolcode-min.e4aae47f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lolcode.e3df3c09.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lolcode.e3df3c09.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lua-min.48df0f01.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lua-min.48df0f01.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-lua.d1797f23.chunk.js +2 -0
- templates/static/js/prism-lang.prism-lua.d1797f23.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-magma-min.f6d85152.chunk.js +2 -0
- templates/static/js/prism-lang.prism-magma-min.f6d85152.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-magma.9ebba92b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-magma.9ebba92b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-makefile-min.bb1b1c1b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-makefile-min.bb1b1c1b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-makefile.e9e524b0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-makefile.e9e524b0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markdown-min.da04eca2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markdown-min.da04eca2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markdown.4ff5b11c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markdown.4ff5b11c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markup-min.707fa0d3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markup-min.707fa0d3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markup-templating-min.2e1499ac.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markup-templating-min.2e1499ac.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markup-templating.ad9c4fa4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markup-templating.ad9c4fa4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-markup.bb17b142.chunk.js +2 -0
- templates/static/js/prism-lang.prism-markup.bb17b142.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mata-min.1ce39616.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mata-min.1ce39616.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mata.c45e1c73.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mata.c45e1c73.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-matlab-min.5d79975c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-matlab-min.5d79975c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-matlab.abe963df.chunk.js +2 -0
- templates/static/js/prism-lang.prism-matlab.abe963df.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-maxscript-min.056931c5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-maxscript-min.056931c5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-maxscript.04352a9d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-maxscript.04352a9d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mel-min.77b1563b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mel-min.77b1563b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mel.a7c2161e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mel.a7c2161e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mermaid-min.235ac98f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mermaid-min.235ac98f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mermaid.ae6cf068.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mermaid.ae6cf068.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-metafont-min.18572292.chunk.js +2 -0
- templates/static/js/prism-lang.prism-metafont-min.18572292.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-metafont.28e7e134.chunk.js +2 -0
- templates/static/js/prism-lang.prism-metafont.28e7e134.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mizar-min.3520146c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mizar-min.3520146c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mizar.7bbde71b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mizar.7bbde71b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mongodb-min.1ebea930.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mongodb-min.1ebea930.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-mongodb.42c6759b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-mongodb.42c6759b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-monkey-min.c587dd2b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-monkey-min.c587dd2b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-monkey.09e7fd9e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-monkey.09e7fd9e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-moonscript-min.ef5cd0fe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-moonscript-min.ef5cd0fe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-moonscript.08bf2206.chunk.js +2 -0
- templates/static/js/prism-lang.prism-moonscript.08bf2206.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-n1ql-min.87bdcc49.chunk.js +2 -0
- templates/static/js/prism-lang.prism-n1ql-min.87bdcc49.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-n1ql.98760078.chunk.js +2 -0
- templates/static/js/prism-lang.prism-n1ql.98760078.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-n4js-min.6fbcedef.chunk.js +2 -0
- templates/static/js/prism-lang.prism-n4js-min.6fbcedef.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-n4js.5370b944.chunk.js +2 -0
- templates/static/js/prism-lang.prism-n4js.5370b944.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nand2tetris-hdl-min.bc9e8cc4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nand2tetris-hdl-min.bc9e8cc4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nand2tetris-hdl.3ec27498.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nand2tetris-hdl.3ec27498.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-naniscript-min.2a4d2e26.chunk.js +2 -0
- templates/static/js/prism-lang.prism-naniscript-min.2a4d2e26.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-naniscript.bb16b5f3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-naniscript.bb16b5f3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nasm-min.bbea424d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nasm-min.bbea424d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nasm.0934991e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nasm.0934991e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-neon-min.f1103bd5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-neon-min.f1103bd5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-neon.6f17d108.chunk.js +2 -0
- templates/static/js/prism-lang.prism-neon.6f17d108.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nevod-min.aa57eaa6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nevod-min.aa57eaa6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nevod.7e9eea02.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nevod.7e9eea02.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nginx-min.c78d1167.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nginx-min.c78d1167.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nginx.3084a116.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nginx.3084a116.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nim-min.041a46d6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nim-min.041a46d6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nim.83667ea3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nim.83667ea3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nix-min.2711e56c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nix-min.2711e56c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nix.0095737c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nix.0095737c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nsis-min.409b04bb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nsis-min.409b04bb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-nsis.7b3a8423.chunk.js +2 -0
- templates/static/js/prism-lang.prism-nsis.7b3a8423.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-objectivec-min.73ff0bfc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-objectivec-min.73ff0bfc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-objectivec.212fdc6f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-objectivec.212fdc6f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ocaml-min.5fe31bd0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ocaml-min.5fe31bd0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ocaml.7e69c02f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ocaml.7e69c02f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-odin-min.434dfea9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-odin-min.434dfea9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-odin.95d25af4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-odin.95d25af4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-opencl-min.1a1d1e75.chunk.js +2 -0
- templates/static/js/prism-lang.prism-opencl-min.1a1d1e75.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-opencl.75bd9d1c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-opencl.75bd9d1c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-openqasm-min.58400273.chunk.js +2 -0
- templates/static/js/prism-lang.prism-openqasm-min.58400273.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-openqasm.33fc71f4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-openqasm.33fc71f4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-oz-min.62eb2f85.chunk.js +2 -0
- templates/static/js/prism-lang.prism-oz-min.62eb2f85.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-oz.b01a4b07.chunk.js +2 -0
- templates/static/js/prism-lang.prism-oz.b01a4b07.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-parigp-min.9f8edd2b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-parigp-min.9f8edd2b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-parigp.8613be48.chunk.js +2 -0
- templates/static/js/prism-lang.prism-parigp.8613be48.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-parser-min.a03633dc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-parser-min.a03633dc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-parser.be152df5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-parser.be152df5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pascal-min.18294099.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pascal-min.18294099.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pascal.0f0ea939.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pascal.0f0ea939.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pascaligo-min.890b2126.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pascaligo-min.890b2126.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pascaligo.d6799c75.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pascaligo.d6799c75.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pcaxis-min.335cfdb6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pcaxis-min.335cfdb6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pcaxis.c29cac71.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pcaxis.c29cac71.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-peoplecode-min.4639e347.chunk.js +2 -0
- templates/static/js/prism-lang.prism-peoplecode-min.4639e347.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-peoplecode.0f4f4265.chunk.js +2 -0
- templates/static/js/prism-lang.prism-peoplecode.0f4f4265.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-perl-min.1f6104eb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-perl-min.1f6104eb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-perl.74c2be3b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-perl.74c2be3b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-php-extras-min.cf65cb04.chunk.js +2 -0
- templates/static/js/prism-lang.prism-php-extras-min.cf65cb04.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-php-extras.2737d254.chunk.js +2 -0
- templates/static/js/prism-lang.prism-php-extras.2737d254.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-php-min.8f54fe81.chunk.js +2 -0
- templates/static/js/prism-lang.prism-php-min.8f54fe81.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-php.1eec6e9f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-php.1eec6e9f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-phpdoc-min.6067ec7a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-phpdoc-min.6067ec7a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-phpdoc.2870f158.chunk.js +2 -0
- templates/static/js/prism-lang.prism-phpdoc.2870f158.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-plant-uml-min.d86737b0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-plant-uml-min.d86737b0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-plant-uml.ef75482b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-plant-uml.ef75482b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-plsql-min.a0dd122e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-plsql-min.a0dd122e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-plsql.da10fc6d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-plsql.da10fc6d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-powerquery-min.bc2067ab.chunk.js +2 -0
- templates/static/js/prism-lang.prism-powerquery-min.bc2067ab.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-powerquery.c60f7c38.chunk.js +2 -0
- templates/static/js/prism-lang.prism-powerquery.c60f7c38.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-powershell-min.b0265d38.chunk.js +2 -0
- templates/static/js/prism-lang.prism-powershell-min.b0265d38.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-powershell.1445cd48.chunk.js +2 -0
- templates/static/js/prism-lang.prism-powershell.1445cd48.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-processing-min.bc2540c3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-processing-min.bc2540c3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-processing.035ea667.chunk.js +2 -0
- templates/static/js/prism-lang.prism-processing.035ea667.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-prolog-min.fb4b9a79.chunk.js +2 -0
- templates/static/js/prism-lang.prism-prolog-min.fb4b9a79.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-prolog.bb2c5272.chunk.js +2 -0
- templates/static/js/prism-lang.prism-prolog.bb2c5272.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-promql-min.9646da0a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-promql-min.9646da0a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-promql.abf08253.chunk.js +2 -0
- templates/static/js/prism-lang.prism-promql.abf08253.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-properties-min.fee5d65f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-properties-min.fee5d65f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-properties.010918af.chunk.js +2 -0
- templates/static/js/prism-lang.prism-properties.010918af.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-protobuf-min.63e69574.chunk.js +2 -0
- templates/static/js/prism-lang.prism-protobuf-min.63e69574.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-protobuf.19123c74.chunk.js +2 -0
- templates/static/js/prism-lang.prism-protobuf.19123c74.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-psl-min.a244c98d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-psl-min.a244c98d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-psl.cb00a93f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-psl.cb00a93f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pug-min.f5d4aa1a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pug-min.f5d4aa1a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pug.6b10387c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pug.6b10387c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-puppet-min.4c1f6aa7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-puppet-min.4c1f6aa7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-puppet.ef52ad7c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-puppet.ef52ad7c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pure-min.857be82f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pure-min.857be82f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-pure.0c7d2a18.chunk.js +2 -0
- templates/static/js/prism-lang.prism-pure.0c7d2a18.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-purebasic-min.8c10b08d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-purebasic-min.8c10b08d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-purebasic.4c787c6b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-purebasic.4c787c6b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-purescript-min.8066c6b1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-purescript-min.8066c6b1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-purescript.f9970c7d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-purescript.f9970c7d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-python-min.0bc604c2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-python-min.0bc604c2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-python.4b6baa55.chunk.js +2 -0
- templates/static/js/prism-lang.prism-python.4b6baa55.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-q-min.b7182dfa.chunk.js +2 -0
- templates/static/js/prism-lang.prism-q-min.b7182dfa.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-q.ded7eb21.chunk.js +2 -0
- templates/static/js/prism-lang.prism-q.ded7eb21.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qml-min.4749a93a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qml-min.4749a93a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qml.78184977.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qml.78184977.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qore-min.cb501642.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qore-min.cb501642.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qore.33cad9ac.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qore.33cad9ac.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qsharp-min.1c8c9a02.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qsharp-min.1c8c9a02.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-qsharp.4cac4916.chunk.js +2 -0
- templates/static/js/prism-lang.prism-qsharp.4cac4916.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-r-min.9d91dbd3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-r-min.9d91dbd3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-r.12a023c7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-r.12a023c7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-racket-min.6ee79af0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-racket-min.6ee79af0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-racket.7a2b727e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-racket.7a2b727e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-reason-min.81717e7e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-reason-min.81717e7e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-reason.787eefa0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-reason.787eefa0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-regex-min.29bf020d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-regex-min.29bf020d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-regex.3972ce06.chunk.js +2 -0
- templates/static/js/prism-lang.prism-regex.3972ce06.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rego-min.433e558e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rego-min.433e558e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rego.156e3dcb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rego.156e3dcb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-renpy-min.af09fc83.chunk.js +2 -0
- templates/static/js/prism-lang.prism-renpy-min.af09fc83.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-renpy.4b4780a8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-renpy.4b4780a8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rescript-min.8693c431.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rescript-min.8693c431.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rescript.3f8d2e5e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rescript.3f8d2e5e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rest-min.2f6e679c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rest-min.2f6e679c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rest.891635c9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rest.891635c9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rip-min.7f699925.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rip-min.7f699925.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rip.eebb0be0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rip.eebb0be0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-roboconf-min.02a1c9e6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-roboconf-min.02a1c9e6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-roboconf.1976c61e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-roboconf.1976c61e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-robotframework-min.74691ea5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-robotframework-min.74691ea5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-robotframework.ea8dd129.chunk.js +2 -0
- templates/static/js/prism-lang.prism-robotframework.ea8dd129.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ruby-min.bd383425.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ruby-min.bd383425.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-ruby.2256a65b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-ruby.2256a65b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rust-min.29d74468.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rust-min.29d74468.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-rust.86773fa4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-rust.86773fa4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sas-min.4ce37728.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sas-min.4ce37728.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sas.b299dd1c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sas.b299dd1c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sass-min.950a53c0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sass-min.950a53c0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sass.a0b28a01.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sass.a0b28a01.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scala-min.5db3b94b.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scala-min.5db3b94b.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scala.4ba1ea05.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scala.4ba1ea05.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scheme-min.f38c116e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scheme-min.f38c116e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scheme.ab33d3fb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scheme.ab33d3fb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scss-min.c2c60ea7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scss-min.c2c60ea7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-scss.65f18dd0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-scss.65f18dd0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-shell-session-min.7ec9e8fe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-shell-session-min.7ec9e8fe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-shell-session.ab189baf.chunk.js +2 -0
- templates/static/js/prism-lang.prism-shell-session.ab189baf.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smali-min.19745053.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smali-min.19745053.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smali.bc175747.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smali.bc175747.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smalltalk-min.1d36db97.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smalltalk-min.1d36db97.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smalltalk.b6059f66.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smalltalk.b6059f66.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smarty-min.4d531407.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smarty-min.4d531407.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-smarty.72e1bd5f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-smarty.72e1bd5f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sml-min.6460ab86.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sml-min.6460ab86.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sml.4e29415d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sml.4e29415d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-solidity-min.93b00ca4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-solidity-min.93b00ca4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-solidity.59878700.chunk.js +2 -0
- templates/static/js/prism-lang.prism-solidity.59878700.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-solution-file-min.058a407f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-solution-file-min.058a407f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-solution-file.b2d426a5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-solution-file.b2d426a5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-soy-min.286b0cde.chunk.js +2 -0
- templates/static/js/prism-lang.prism-soy-min.286b0cde.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-soy.cbf1f08c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-soy.cbf1f08c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sparql-min.2e21b2fe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sparql-min.2e21b2fe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sparql.b924db23.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sparql.b924db23.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-splunk-spl-min.422a38fe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-splunk-spl-min.422a38fe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-splunk-spl.13446336.chunk.js +2 -0
- templates/static/js/prism-lang.prism-splunk-spl.13446336.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sqf-min.fa379436.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sqf-min.fa379436.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sqf.b9d387a5.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sqf.b9d387a5.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sql-min.318853bb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sql-min.318853bb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-sql.e6625625.chunk.js +2 -0
- templates/static/js/prism-lang.prism-sql.e6625625.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-squirrel-min.5736a54d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-squirrel-min.5736a54d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-squirrel.15a6c5b8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-squirrel.15a6c5b8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stan-min.ee4e1c95.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stan-min.ee4e1c95.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stan.8f0f2f32.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stan.8f0f2f32.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stata-min.c5321f2e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stata-min.c5321f2e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stata.2c5c7170.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stata.2c5c7170.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stylus-min.f39a3f28.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stylus-min.f39a3f28.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-stylus.c05f795f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-stylus.c05f795f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-supercollider-min.d88afae3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-supercollider-min.d88afae3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-supercollider.568ec355.chunk.js +2 -0
- templates/static/js/prism-lang.prism-supercollider.568ec355.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-swift-min.ff9ad682.chunk.js +2 -0
- templates/static/js/prism-lang.prism-swift-min.ff9ad682.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-swift.dd8516d2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-swift.dd8516d2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-systemd-min.fbc68512.chunk.js +2 -0
- templates/static/js/prism-lang.prism-systemd-min.fbc68512.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-systemd.55e07172.chunk.js +2 -0
- templates/static/js/prism-lang.prism-systemd.55e07172.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-cs-min.042974dd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-cs-min.042974dd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-cs.62d00e56.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-cs.62d00e56.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-templating-min.7cd1a4f8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-templating-min.7cd1a4f8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-templating.f15a41b1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-templating.f15a41b1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-vb-min.7c9fbd5c.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-vb-min.7c9fbd5c.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-t4-vb.c2b3c9cc.chunk.js +2 -0
- templates/static/js/prism-lang.prism-t4-vb.c2b3c9cc.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tap-min.7e0fffd9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tap-min.7e0fffd9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tap.68d719c2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tap.68d719c2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tcl-min.5247eae9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tcl-min.5247eae9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tcl.dba56ac3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tcl.dba56ac3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-textile-min.fd44c489.chunk.js +2 -0
- templates/static/js/prism-lang.prism-textile-min.fd44c489.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-textile.d66eff02.chunk.js +2 -0
- templates/static/js/prism-lang.prism-textile.d66eff02.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-toml-min.3b693bc2.chunk.js +2 -0
- templates/static/js/prism-lang.prism-toml-min.3b693bc2.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-toml.8106d51f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-toml.8106d51f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tremor-min.40b6b460.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tremor-min.40b6b460.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tremor.c54737d1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tremor.c54737d1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tsx-min.df8f5052.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tsx-min.df8f5052.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tsx.4bc64bfd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tsx.4bc64bfd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tt2-min.652a9b04.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tt2-min.652a9b04.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-tt2.688b595a.chunk.js +2 -0
- templates/static/js/prism-lang.prism-tt2.688b595a.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-turtle-min.0689dfc6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-turtle-min.0689dfc6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-turtle.169ad2e1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-turtle.169ad2e1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-twig-min.d801c19d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-twig-min.d801c19d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-twig.70bb63f3.chunk.js +2 -0
- templates/static/js/prism-lang.prism-twig.70bb63f3.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-typescript-min.22b7217d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-typescript-min.22b7217d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-typescript.b960b87f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-typescript.b960b87f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-typoscript-min.19ba7aab.chunk.js +2 -0
- templates/static/js/prism-lang.prism-typoscript-min.19ba7aab.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-typoscript.b47cbfeb.chunk.js +2 -0
- templates/static/js/prism-lang.prism-typoscript.b47cbfeb.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-unrealscript-min.0063b0fd.chunk.js +2 -0
- templates/static/js/prism-lang.prism-unrealscript-min.0063b0fd.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-unrealscript.9f97da34.chunk.js +2 -0
- templates/static/js/prism-lang.prism-unrealscript.9f97da34.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-uorazor-min.d2dc8f62.chunk.js +2 -0
- templates/static/js/prism-lang.prism-uorazor-min.d2dc8f62.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-uorazor.141f2dbe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-uorazor.141f2dbe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-uri-min.91b7fb32.chunk.js +2 -0
- templates/static/js/prism-lang.prism-uri-min.91b7fb32.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-uri.ffb09261.chunk.js +2 -0
- templates/static/js/prism-lang.prism-uri.ffb09261.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-v-min.e795fc52.chunk.js +2 -0
- templates/static/js/prism-lang.prism-v-min.e795fc52.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-v.56e172c6.chunk.js +2 -0
- templates/static/js/prism-lang.prism-v.56e172c6.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vala-min.adf10709.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vala-min.adf10709.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vala.89ed1c33.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vala.89ed1c33.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vbnet-min.c05eb1c4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vbnet-min.c05eb1c4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vbnet.0ae31e08.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vbnet.0ae31e08.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-velocity-min.8f5479af.chunk.js +2 -0
- templates/static/js/prism-lang.prism-velocity-min.8f5479af.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-velocity.17a11a92.chunk.js +2 -0
- templates/static/js/prism-lang.prism-velocity.17a11a92.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-verilog-min.7361f391.chunk.js +2 -0
- templates/static/js/prism-lang.prism-verilog-min.7361f391.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-verilog.384c7842.chunk.js +2 -0
- templates/static/js/prism-lang.prism-verilog.384c7842.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vhdl-min.777ce3d9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vhdl-min.777ce3d9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vhdl.c34a850e.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vhdl.c34a850e.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vim-min.d755e765.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vim-min.d755e765.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-vim.0053bf55.chunk.js +2 -0
- templates/static/js/prism-lang.prism-vim.0053bf55.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-visual-basic-min.ef8bda02.chunk.js +2 -0
- templates/static/js/prism-lang.prism-visual-basic-min.ef8bda02.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-visual-basic.d8bbd4c0.chunk.js +2 -0
- templates/static/js/prism-lang.prism-visual-basic.d8bbd4c0.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-warpscript-min.a8a0c273.chunk.js +2 -0
- templates/static/js/prism-lang.prism-warpscript-min.a8a0c273.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-warpscript.501297a4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-warpscript.501297a4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wasm-min.220de8e9.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wasm-min.220de8e9.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wasm.b9dc0162.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wasm.b9dc0162.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-web-idl-min.56af0018.chunk.js +2 -0
- templates/static/js/prism-lang.prism-web-idl-min.56af0018.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-web-idl.5b1b4d69.chunk.js +2 -0
- templates/static/js/prism-lang.prism-web-idl.5b1b4d69.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wgsl-min.6c0a8576.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wgsl-min.6c0a8576.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wgsl.aec58ed4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wgsl.aec58ed4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wiki-min.6b9cf9ef.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wiki-min.6b9cf9ef.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wiki.aa2a3b55.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wiki.aa2a3b55.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wolfram-min.56285306.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wolfram-min.56285306.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wolfram.17e0a73d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wolfram.17e0a73d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wren-min.4ec162a7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wren-min.4ec162a7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-wren.1315d3b1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-wren.1315d3b1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xeora-min.8bce37c4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xeora-min.8bce37c4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xeora.9e8becc8.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xeora.9e8becc8.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xml-doc-min.10302a21.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xml-doc-min.10302a21.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xml-doc.aec98047.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xml-doc.aec98047.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xojo-min.8037f23f.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xojo-min.8037f23f.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xojo.7e297a7d.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xojo.7e297a7d.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xquery-min.87645abe.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xquery-min.87645abe.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-xquery.eb87b7ac.chunk.js +2 -0
- templates/static/js/prism-lang.prism-xquery.eb87b7ac.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-yaml-min.0c8d7aa1.chunk.js +2 -0
- templates/static/js/prism-lang.prism-yaml-min.0c8d7aa1.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-yaml.9492abe7.chunk.js +2 -0
- templates/static/js/prism-lang.prism-yaml.9492abe7.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-yang-min.69aeb249.chunk.js +2 -0
- templates/static/js/prism-lang.prism-yang-min.69aeb249.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-yang.abdc0f44.chunk.js +2 -0
- templates/static/js/prism-lang.prism-yang.abdc0f44.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-zig-min.752935a4.chunk.js +2 -0
- templates/static/js/prism-lang.prism-zig-min.752935a4.chunk.js.map +1 -0
- templates/static/js/prism-lang.prism-zig.7d37c247.chunk.js +2 -0
- templates/static/js/prism-lang.prism-zig.7d37c247.chunk.js.map +1 -0
- {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/METADATA +9 -8
- ziya-0.1.49.dist-info/RECORD +1276 -0
- app/utils/llm_constants.py +0 -34
- templates/static/css/main.f447c982.css.map +0 -1
- templates/static/js/main.cb581e8d.js +0 -3
- templates/static/js/main.cb581e8d.js.LICENSE.txt +0 -129
- templates/static/js/main.cb581e8d.js.map +0 -1
- ziya-0.1.48.dist-info/RECORD +0 -39
- {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/LICENSE +0 -0
- {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/WHEEL +0 -0
- {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/entry_points.txt +0 -0
app/utils/code_util.py
CHANGED
|
@@ -1,310 +1,1145 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import subprocess
|
|
3
|
-
|
|
3
|
+
import json
|
|
4
|
+
from io import StringIO
|
|
4
5
|
import time
|
|
6
|
+
from typing import Dict, Optional, Union, List, Tuple, Any
|
|
7
|
+
import whatthepatch
|
|
5
8
|
import re
|
|
9
|
+
from app.utils.logging_utils import logger
|
|
10
|
+
import difflib
|
|
11
|
+
|
|
12
|
+
MIN_CONFIDENCE = 0.75 # what confidence level we cut off forced diff apply after fuzzy match
|
|
6
13
|
|
|
7
|
-
|
|
14
|
+
class PatchApplicationError(Exception):
|
|
15
|
+
"""Custom exception for patch application failures"""
|
|
16
|
+
def __init__(self, message: str, details: Dict):
|
|
17
|
+
super().__init__(message)
|
|
18
|
+
self.details = details
|
|
8
19
|
|
|
9
|
-
def
|
|
20
|
+
def clean_input_diff(diff_content: str) -> str:
|
|
10
21
|
"""
|
|
11
|
-
|
|
22
|
+
Initial cleanup of diff content before parsing, with strict hunk enforcement:
|
|
23
|
+
- Once we've read old_count '-' lines and new_count '+' lines, we end the hunk
|
|
24
|
+
and ignore extra '-'/'+' lines until the next hunk or file header.
|
|
25
|
+
- Preserves original logic for skipping content after triple backticks, decoding '\\n', etc.
|
|
26
|
+
|
|
27
|
+
This typically resolves leftover lines in:
|
|
28
|
+
- 'function_collision' (extra blank line at end)
|
|
29
|
+
- 'single_line_replace' (keeping the old line)
|
|
30
|
+
|
|
31
|
+
Because once we’ve consumed the declared minus/plus lines, further minus/plus lines
|
|
32
|
+
can't sneak into the final patch.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
logger.debug(diff_content)
|
|
36
|
+
|
|
37
|
+
result_lines = []
|
|
38
|
+
|
|
39
|
+
# Remove any content after triple backticks
|
|
40
|
+
if '```' in diff_content:
|
|
41
|
+
diff_content = diff_content.split('```')[0]
|
|
42
|
+
|
|
43
|
+
# Split into lines for processing
|
|
44
|
+
lines = diff_content.splitlines()
|
|
45
|
+
|
|
46
|
+
# Track the current file and hunk state
|
|
47
|
+
current_file = None
|
|
48
|
+
in_hunk = False
|
|
49
|
+
skip_until_next_file = False
|
|
50
|
+
|
|
51
|
+
# For the strict hunk approach
|
|
52
|
+
old_count = 0
|
|
53
|
+
new_count = 0
|
|
54
|
+
minus_seen = 0
|
|
55
|
+
plus_seen = 0
|
|
56
|
+
|
|
57
|
+
def reset_hunk_state():
|
|
58
|
+
nonlocal in_hunk, old_count, new_count, minus_seen, plus_seen
|
|
59
|
+
in_hunk = False
|
|
60
|
+
old_count = 0
|
|
61
|
+
new_count = 0
|
|
62
|
+
minus_seen = 0
|
|
63
|
+
plus_seen = 0
|
|
64
|
+
|
|
65
|
+
import re
|
|
66
|
+
|
|
67
|
+
for line in lines:
|
|
68
|
+
# Reset skip flag on new file header
|
|
69
|
+
if line.startswith('diff --git'):
|
|
70
|
+
skip_until_next_file = False
|
|
71
|
+
current_file = None
|
|
72
|
+
reset_hunk_state()
|
|
73
|
+
result_lines.append(line)
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
# Track file paths
|
|
77
|
+
if line.startswith('--- '):
|
|
78
|
+
parts = line.split(' ', 1)
|
|
79
|
+
if len(parts) > 1:
|
|
80
|
+
current_file = parts[1]
|
|
81
|
+
else:
|
|
82
|
+
current_file = None
|
|
83
|
+
result_lines.append(line)
|
|
84
|
+
continue
|
|
85
|
+
|
|
86
|
+
if line.startswith('+++ '):
|
|
87
|
+
result_lines.append(line)
|
|
88
|
+
continue
|
|
89
|
+
|
|
90
|
+
# Hunk header
|
|
91
|
+
if line.startswith('@@'):
|
|
92
|
+
# Close out any prior hunk
|
|
93
|
+
reset_hunk_state()
|
|
94
|
+
in_hunk = True
|
|
95
|
+
skip_until_next_file = False
|
|
96
|
+
|
|
97
|
+
result_lines.append(line) # Keep the hunk header
|
|
98
|
+
|
|
99
|
+
# Parse the line to find old_count/new_count
|
|
100
|
+
match = re.match(r'^@@ -\d+(?:,(\d+))? \+\d+(?:,(\d+))? @@', line)
|
|
101
|
+
if match:
|
|
102
|
+
old_count = int(match.group(2)) if match.group(2) else 1
|
|
103
|
+
new_count = int(match.group(2)) if match.group(2) else 1
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
if skip_until_next_file:
|
|
107
|
+
# We skip lines until next file/hunk
|
|
108
|
+
continue
|
|
109
|
+
|
|
110
|
+
# If we're inside a hunk, apply the strict approach
|
|
111
|
+
if in_hunk:
|
|
112
|
+
# Check if we've already read all minus and plus lines
|
|
113
|
+
done_minus = (minus_seen >= old_count)
|
|
114
|
+
done_plus = (plus_seen >= new_count)
|
|
115
|
+
|
|
116
|
+
if line.startswith('-'):
|
|
117
|
+
if not done_minus:
|
|
118
|
+
minus_seen += 1
|
|
119
|
+
result_lines.append(line)
|
|
120
|
+
else:
|
|
121
|
+
# We have enough minus lines => ignore it
|
|
122
|
+
logger.debug(f"[clean_input_diff] ignoring extra '-' line: {line.rstrip()}")
|
|
123
|
+
continue
|
|
12
124
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
125
|
+
if line.startswith('+'):
|
|
126
|
+
if not done_plus:
|
|
127
|
+
plus_seen += 1
|
|
128
|
+
result_lines.append(line)
|
|
129
|
+
else:
|
|
130
|
+
# We have enough plus lines => ignore it
|
|
131
|
+
logger.debug(f"[clean_input_diff] ignoring extra '+' line: {line.rstrip()}")
|
|
132
|
+
continue
|
|
16
133
|
|
|
17
|
-
|
|
18
|
-
|
|
134
|
+
if line.startswith(' '):
|
|
135
|
+
# context lines are always okay
|
|
136
|
+
result_lines.append(line)
|
|
137
|
+
continue
|
|
19
138
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
139
|
+
# If we get here and it's not -, +, or space => presumably hunk is done
|
|
140
|
+
reset_hunk_state()
|
|
141
|
+
result_lines.append(line)
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
# If not in a hunk, just pass the line along
|
|
145
|
+
result_lines.append(line)
|
|
146
|
+
|
|
147
|
+
# End of loop
|
|
148
|
+
return '\n'.join(result_lines)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def normalize_diff(diff_content: str) -> str:
|
|
152
|
+
"""
|
|
153
|
+
Normalize a diff using whatthepatch for proper parsing and reconstruction.
|
|
154
|
+
Handles incomplete hunks, context issues, and line count mismatches.
|
|
24
155
|
"""
|
|
156
|
+
logger.debug("Normalizing diff with whatthepatch")
|
|
157
|
+
try:
|
|
158
|
+
# Extract headers and hunk headers from original diff
|
|
159
|
+
diff_lines = diff_content.splitlines()
|
|
160
|
+
result = []
|
|
161
|
+
i = 0
|
|
162
|
+
while i < len(diff_lines):
|
|
163
|
+
line = diff_lines[i]
|
|
164
|
+
if line.startswith(('diff --git', 'index', '--- ', '+++ ')):
|
|
165
|
+
result.append(line)
|
|
166
|
+
elif line.startswith('@@'):
|
|
167
|
+
result.append(line)
|
|
168
|
+
i += 1
|
|
169
|
+
lines_seen = 0
|
|
170
|
+
while i < len(diff_lines) and diff_lines[i].startswith((' ', '+', '-')):
|
|
171
|
+
result.append(diff_lines[i])
|
|
172
|
+
i += 1
|
|
173
|
+
continue
|
|
174
|
+
i += 1
|
|
25
175
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
176
|
+
return '\n'.join(result) + '\n'
|
|
177
|
+
except Exception as e:
|
|
178
|
+
logger.error(f"Error normalizing diff: {str(e)}")
|
|
179
|
+
return diff_content
|
|
180
|
+
|
|
181
|
+
def is_new_file_creation(diff_lines: List[str]) -> bool:
|
|
182
|
+
"""Determine if a diff represents a new file creation."""
|
|
183
|
+
if not diff_lines:
|
|
184
|
+
return False
|
|
29
185
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
186
|
+
logger.debug(f"Analyzing diff lines for new file creation ({len(diff_lines)} lines):")
|
|
187
|
+
for i, line in enumerate(diff_lines[:10]):
|
|
188
|
+
logger.debug(f"Line {i}: {line[:100]}") # Log first 100 chars of each line
|
|
33
189
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
190
|
+
# Look for any indication this is a new file
|
|
191
|
+
for i, line in enumerate(diff_lines[:10]):
|
|
192
|
+
# Case 1: Standard git diff new file
|
|
193
|
+
if line.startswith('@@ -0,0'):
|
|
194
|
+
logger.debug("Detected new file from zero hunk marker")
|
|
195
|
+
return True
|
|
196
|
+
|
|
197
|
+
# Case 2: Empty source file indicator
|
|
198
|
+
if line == '--- /dev/null':
|
|
199
|
+
logger.debug("Detected new file from /dev/null source")
|
|
200
|
+
return True
|
|
201
|
+
|
|
202
|
+
# Case 3: New file mode
|
|
203
|
+
if 'new file mode' in line:
|
|
204
|
+
logger.debug("Detected new file from mode marker")
|
|
205
|
+
return True
|
|
39
206
|
|
|
207
|
+
logger.debug("No new file indicators found")
|
|
208
|
+
return False
|
|
209
|
+
def create_new_file(git_diff: str, base_dir: str) -> None:
|
|
210
|
+
"""Create a new file from a git diff."""
|
|
211
|
+
logger.info(f"Processing new file diff with length: {len(git_diff)} bytes")
|
|
212
|
+
|
|
40
213
|
try:
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
logger.info(f"Executing command: {' '.join(cmd)}")
|
|
44
|
-
result = subprocess.run(cmd, capture_output=True, text=True, cwd=user_codebase_dir, check=True)
|
|
214
|
+
# Parse the diff content
|
|
215
|
+
diff_lines = git_diff.splitlines()
|
|
45
216
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
217
|
+
# Find the file path line
|
|
218
|
+
file_path = None
|
|
219
|
+
for line in diff_lines:
|
|
220
|
+
if line.startswith('diff --git'):
|
|
221
|
+
file_path = line.split(' b/')[-1]
|
|
222
|
+
break
|
|
223
|
+
# Extract the file path from the diff --git line
|
|
224
|
+
full_path = os.path.join(base_dir, file_path)
|
|
49
225
|
|
|
226
|
+
# Create directory if it doesn't exist
|
|
227
|
+
os.makedirs(os.path.dirname(full_path), exist_ok=True)
|
|
228
|
+
|
|
229
|
+
# Extract the content (everything after the @@ line)
|
|
230
|
+
content_lines = []
|
|
231
|
+
|
|
232
|
+
in_content = False
|
|
233
|
+
for line in diff_lines:
|
|
234
|
+
if in_content and line.startswith('+'):
|
|
235
|
+
content_lines.append(line[1:])
|
|
236
|
+
elif line.startswith('@@'):
|
|
237
|
+
in_content = True
|
|
238
|
+
# Write the content
|
|
239
|
+
content = '\n'.join(content_lines)
|
|
240
|
+
with open(full_path, 'w', encoding='utf-8') as f:
|
|
241
|
+
f.write(content)
|
|
242
|
+
if not content.endswith('\n'):
|
|
243
|
+
f.write('\n')
|
|
244
|
+
logger.info(f"Successfully created new file: {file_path}")
|
|
50
245
|
except Exception as e:
|
|
51
|
-
logger.error(f"Error
|
|
246
|
+
logger.error(f"Error creating new file: {str(e)}, diff content: {git_diff[:200]}")
|
|
52
247
|
raise
|
|
53
|
-
|
|
54
|
-
|
|
248
|
+
|
|
249
|
+
def inspect_line_content(file_path: str, line_number: int, context: int = 5) -> Dict[str, Any]:
|
|
250
|
+
"""Inspect the content around a specific line number."""
|
|
251
|
+
try:
|
|
252
|
+
with open(file_path, 'r') as f:
|
|
253
|
+
lines = f.readlines()
|
|
254
|
+
|
|
255
|
+
start = max(0, line_number - context - 1)
|
|
256
|
+
end = min(len(lines), line_number + context)
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
'lines': {
|
|
260
|
+
i+1: {
|
|
261
|
+
'content': lines[i],
|
|
262
|
+
'hex': ' '.join(f'{ord(c):02x}' for c in lines[i])
|
|
263
|
+
}
|
|
264
|
+
for i in range(start, end)
|
|
265
|
+
},
|
|
266
|
+
'line_endings': {
|
|
267
|
+
'total_lines': len(lines),
|
|
268
|
+
'endings': {
|
|
269
|
+
'CRLF': sum(1 for line in lines if line.endswith('\r\n')),
|
|
270
|
+
'LF': sum(1 for line in lines if line.endswith('\n') and not line.endswith('\r\n')),
|
|
271
|
+
'CR': sum(1 for line in lines if line.endswith('\r') and not line.endswith('\r\n')),
|
|
272
|
+
'none': sum(1 for line in lines if not line.endswith('\n') and not line.endswith('\r'))
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
except Exception as e:
|
|
277
|
+
logger.error(f"Error inspecting line content: {e}")
|
|
278
|
+
return {'error': str(e)}
|
|
279
|
+
|
|
280
|
+
def analyze_diff_failure(diff: str, file_path: str, error_output: str) -> Dict[str, Any]:
|
|
281
|
+
"""Analyze why a diff failed to apply and provide diagnostic information."""
|
|
282
|
+
try:
|
|
283
|
+
# Remove line number if present in file_path
|
|
284
|
+
clean_path = file_path.split(':')[0] if file_path else None
|
|
285
|
+
file_content = open(clean_path, 'r').read() if clean_path else ""
|
|
286
|
+
|
|
287
|
+
# Parse with unidiff for better analysis
|
|
288
|
+
try:
|
|
289
|
+
patch_analysis = {
|
|
290
|
+
'files': 0,
|
|
291
|
+
'hunks': 0,
|
|
292
|
+
'additions': 0,
|
|
293
|
+
'deletions': 0
|
|
294
|
+
}
|
|
295
|
+
except Exception as e:
|
|
296
|
+
patch_analysis = {'parse_error': str(e)}
|
|
297
|
+
|
|
298
|
+
# Extract context from error
|
|
299
|
+
context_lines = []
|
|
300
|
+
if 'while searching for:' in error_output:
|
|
301
|
+
context_section = error_output.split('while searching for:')[1]
|
|
302
|
+
context_section = context_section.split('error:')[0] if 'error:' in context_section else context_section
|
|
303
|
+
context_lines = [line.strip() for line in context_section.splitlines() if line.strip()]
|
|
304
|
+
|
|
305
|
+
analysis = {
|
|
306
|
+
'patch_analysis': patch_analysis,
|
|
307
|
+
'context_lines': context_lines,
|
|
308
|
+
'file_state': {
|
|
309
|
+
'exists': os.path.exists(clean_path),
|
|
310
|
+
'size': os.path.getsize(clean_path) if os.path.exists(clean_path) else None,
|
|
311
|
+
'line_count': len(file_content.splitlines()) if file_content else 0
|
|
312
|
+
},
|
|
313
|
+
'error_details': error_output
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if context_lines:
|
|
317
|
+
# Try to locate context in file
|
|
318
|
+
file_lines = file_content.splitlines()
|
|
319
|
+
for i in range(len(file_lines)):
|
|
320
|
+
if i + len(context_lines) <= len(file_lines):
|
|
321
|
+
if all(file_lines[i+j].strip() == context_lines[j].strip()
|
|
322
|
+
for j in range(len(context_lines))):
|
|
323
|
+
analysis['context_found'] = {
|
|
324
|
+
'line_number': i + 1,
|
|
325
|
+
'surrounding_lines': file_lines[max(0, i-2):i+len(context_lines)+2]
|
|
326
|
+
}
|
|
327
|
+
break
|
|
328
|
+
|
|
329
|
+
return analysis
|
|
330
|
+
|
|
331
|
+
except Exception as e:
|
|
332
|
+
logger.error(f"Error analyzing diff: {str(e)}")
|
|
333
|
+
return {'error': str(e)}
|
|
334
|
+
|
|
335
|
+
def fix_hunk_context(lines: List[str]) -> List[str]:
|
|
336
|
+
"""
|
|
337
|
+
Fix hunk headers to match actual content.
|
|
338
|
+
Returns corrected lines.
|
|
339
|
+
"""
|
|
340
|
+
result = []
|
|
341
|
+
i = 0
|
|
342
|
+
while i < len(lines):
|
|
343
|
+
line = lines[i]
|
|
344
|
+
if not line.startswith('@@'):
|
|
345
|
+
result.append(line)
|
|
346
|
+
i += 1
|
|
347
|
+
continue
|
|
348
|
+
# Found a hunk header
|
|
349
|
+
match = re.match(r'^@@ -(\d+),(\d+) \+(\d+),(\d+) @@', line)
|
|
350
|
+
if not match:
|
|
351
|
+
result.append(line)
|
|
352
|
+
i += 1
|
|
353
|
+
continue
|
|
354
|
+
# Count actual lines in the hunk
|
|
355
|
+
old_count = 0
|
|
356
|
+
new_count = 0
|
|
357
|
+
hunk_lines = []
|
|
358
|
+
i += 1
|
|
359
|
+
while i < len(lines) and not lines[i].startswith('@@'):
|
|
360
|
+
if lines[i].startswith('-'):
|
|
361
|
+
old_count += 1
|
|
362
|
+
elif lines[i].startswith('+'):
|
|
363
|
+
new_count += 1
|
|
364
|
+
elif lines[i].startswith(' '):
|
|
365
|
+
old_count += 1
|
|
366
|
+
new_count += 1
|
|
367
|
+
hunk_lines.append(lines[i])
|
|
368
|
+
i += 1
|
|
369
|
+
# Add corrected hunk header and lines
|
|
370
|
+
result.append(f'@@ -{match.group(1)},{old_count} +{match.group(3)},{new_count} @@')
|
|
371
|
+
result.extend(hunk_lines)
|
|
372
|
+
return result
|
|
373
|
+
|
|
374
|
+
def normalize_whitespace_in_diff(diff_lines: List[str]) -> List[str]:
|
|
375
|
+
"""
|
|
376
|
+
Normalize both leading and trailing whitespace in diff content while preserving
|
|
377
|
+
essential indentation. Returns cleaned lines.
|
|
378
|
+
"""
|
|
379
|
+
result = []
|
|
380
|
+
i = 0
|
|
381
|
+
while i < len(diff_lines):
|
|
382
|
+
line = diff_lines[i]
|
|
383
|
+
# Keep all header lines
|
|
384
|
+
if line.startswith(('diff --git', 'index', '---', '+++', '@@')):
|
|
385
|
+
result.append(line)
|
|
386
|
+
i += 1
|
|
387
|
+
continue
|
|
388
|
+
# For content lines, normalize whitespace while preserving indentation
|
|
389
|
+
if line.startswith(('+', '-', ' ')):
|
|
390
|
+
prefix = line[0] # Save the diff marker (+, -, or space)
|
|
391
|
+
content = line[1:] # Get the actual content
|
|
392
|
+
|
|
393
|
+
# Normalize the content while preserving essential indentation
|
|
394
|
+
normalized = content.rstrip() # Remove trailing whitespace
|
|
395
|
+
if normalized:
|
|
396
|
+
# Count leading spaces for indentation
|
|
397
|
+
indent = len(content) - len(content.lstrip())
|
|
398
|
+
# Reconstruct the line with normalized whitespace
|
|
399
|
+
result.append(f"{prefix}{' ' * indent}{normalized.lstrip()}")
|
|
400
|
+
i += 1
|
|
401
|
+
return result
|
|
55
402
|
|
|
56
403
|
def correct_git_diff(git_diff: str, original_file_path: str) -> str:
|
|
57
404
|
"""
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
# Check if this is a new file creation
|
|
88
|
-
if lines and lines[0].startswith('diff --git a/dev/null'):
|
|
89
|
-
is_new_file = True
|
|
90
|
-
# Check if 'new file mode 100644' is present in the first few lines
|
|
91
|
-
has_file_mode = any('new file mode 100' in line for line in lines[:3])
|
|
92
|
-
if not has_file_mode:
|
|
93
|
-
# Insert the missing line after the first line
|
|
94
|
-
mode_line = 'new file mode 100644'
|
|
95
|
-
lines.insert(1, mode_line)
|
|
96
|
-
logger.info(f"Added missing '{mode_line}' to new file diff")
|
|
97
|
-
|
|
98
|
-
original_content = []
|
|
99
|
-
|
|
100
|
-
if not is_new_file:
|
|
405
|
+
Correct a git diff using unidiff for parsing and validation.
|
|
406
|
+
Maintains compatibility with existing function signature.
|
|
407
|
+
"""
|
|
408
|
+
logger.info(f"Processing diff for {original_file_path}")
|
|
409
|
+
|
|
410
|
+
try:
|
|
411
|
+
|
|
412
|
+
# Clean up the diff content first
|
|
413
|
+
cleaned_diff = clean_input_diff(git_diff)
|
|
414
|
+
|
|
415
|
+
# Extract headers from original diff
|
|
416
|
+
diff_lines = git_diff.splitlines()
|
|
417
|
+
headers = []
|
|
418
|
+
for line in diff_lines:
|
|
419
|
+
if line.startswith(('diff --git', 'index', '--- ', '+++ ')):
|
|
420
|
+
headers.append(line)
|
|
421
|
+
elif line.startswith('@@'):
|
|
422
|
+
break
|
|
423
|
+
|
|
424
|
+
# Check for new file creation
|
|
425
|
+
if is_new_file_creation(diff_lines):
|
|
426
|
+
logger.info(f"Detected new file creation for {original_file_path}")
|
|
427
|
+
return cleaned_diff
|
|
428
|
+
|
|
429
|
+
# Modify hunk headers to be more lenient about line counts
|
|
430
|
+
lines = cleaned_diff.splitlines()
|
|
431
|
+
modified_lines = fix_hunk_context(lines)
|
|
432
|
+
|
|
433
|
+
logger.info(f"Normalizing diff with whatthepatch")
|
|
101
434
|
try:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
f"
|
|
107
|
-
|
|
108
|
-
|
|
435
|
+
# Parse and normalize with whatthepatch
|
|
436
|
+
try:
|
|
437
|
+
parsed_patches = list(whatthepatch.parse_patch(cleaned_diff))
|
|
438
|
+
except ValueError as e:
|
|
439
|
+
logger.warning(f"whatthepatch parsing error: {str(e)}")
|
|
440
|
+
return cleaned_diff
|
|
441
|
+
|
|
442
|
+
if not parsed_patches:
|
|
443
|
+
logger.warning("No valid patches found in diff")
|
|
444
|
+
return cleaned_diff
|
|
445
|
+
|
|
446
|
+
# Reconstruct normalized diff
|
|
447
|
+
result = headers # start with original headers
|
|
448
|
+
|
|
449
|
+
# Extract original hunks
|
|
450
|
+
original_hunks = []
|
|
451
|
+
current_hunk = []
|
|
452
|
+
for line in cleaned_diff.splitlines():
|
|
453
|
+
if line.startswith('@@'):
|
|
454
|
+
if current_hunk:
|
|
455
|
+
original_hunks.append(current_hunk)
|
|
456
|
+
current_hunk = [line]
|
|
457
|
+
elif current_hunk and line.startswith(('+', '-', ' ')):
|
|
458
|
+
current_hunk.append(line)
|
|
459
|
+
if current_hunk:
|
|
460
|
+
original_hunks.append(current_hunk)
|
|
461
|
+
# Process each hunk while preserving structure
|
|
462
|
+
for hunk in original_hunks:
|
|
463
|
+
hunk_header = hunk[0]
|
|
464
|
+
match = re.match(r'^@@ -(\d+),\d+ \+(\d+),\d+ @@', hunk_header)
|
|
465
|
+
if not match:
|
|
466
|
+
continue
|
|
467
|
+
old_start = int(match.group(1))
|
|
468
|
+
new_start = int(match.group(2))
|
|
469
|
+
# Count actual changes in this hunk
|
|
470
|
+
old_count = sum(1 for line in hunk[1:] if line.startswith(' ') or line.startswith('-'))
|
|
471
|
+
new_count = sum(1 for line in hunk[1:] if line.startswith(' ') or line.startswith('+'))
|
|
472
|
+
# Output corrected hunk
|
|
473
|
+
result.append(f"@@ -{old_start},{old_count} +{new_start},{new_count} @@")
|
|
474
|
+
result.extend(hunk[1:])
|
|
475
|
+
normalized_diff = '\n'.join(result) + '\n'
|
|
476
|
+
logger.info(f"Successfully normalized diff")
|
|
477
|
+
return normalized_diff
|
|
109
478
|
|
|
110
|
-
|
|
111
|
-
|
|
479
|
+
except Exception as e:
|
|
480
|
+
logger.error(f"Error normalizing diff: {str(e)}")
|
|
481
|
+
raise
|
|
482
|
+
|
|
483
|
+
except Exception as e:
|
|
484
|
+
logger.error(f"Error correcting diff: {str(e)}")
|
|
485
|
+
raise
|
|
112
486
|
|
|
113
|
-
|
|
114
|
-
|
|
487
|
+
def apply_system_patch(diff_content: str, target_dir: str) -> bool:
|
|
488
|
+
"""
|
|
489
|
+
Apply patch using system patch command.
|
|
490
|
+
Returns True if successful, False otherwise.
|
|
491
|
+
"""
|
|
492
|
+
logger.info("Attempting to apply with system patch command...")
|
|
493
|
+
try:
|
|
494
|
+
# Debug: Log the exact content we're sending to patch
|
|
495
|
+
logger.info("Patch input content:")
|
|
496
|
+
logger.info(diff_content)
|
|
497
|
+
# Ensure we have string input and encode it just once
|
|
498
|
+
if isinstance(diff_content, bytes):
|
|
499
|
+
diff_content = diff_content.decode('utf-8')
|
|
500
|
+
result = subprocess.run(
|
|
501
|
+
['patch', '-p1', '--forward', '--ignore-whitespace', '--verbose'],
|
|
502
|
+
input=diff_content,
|
|
503
|
+
cwd=target_dir,
|
|
504
|
+
capture_output=True,
|
|
505
|
+
text=True,
|
|
506
|
+
timeout=10
|
|
507
|
+
)
|
|
115
508
|
|
|
509
|
+
logger.debug(f"Patch command output: stdout={result.stdout}, stderr={result.stderr}")
|
|
116
510
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
511
|
+
# If any hunks were successfully applied, we need to modify the diff
|
|
512
|
+
if result and 'Hunk #1 succeeded' in result.stderr:
|
|
513
|
+
logger.debug("Some hunks succeeded, extracting remaining hunks")
|
|
514
|
+
git_diff = extract_remaining_hunks(git_diff, patch_result.stderr)
|
|
515
|
+
logger.info(f"Patch stdout: {result.stdout}")
|
|
516
|
+
logger.info(f"Patch stderr: {result.stderr}")
|
|
517
|
+
success = result.returncode == 0
|
|
518
|
+
logger.info(f"Patch {'succeeded' if success else 'failed'} with return code {result.returncode}")
|
|
519
|
+
return success, result
|
|
520
|
+
except Exception as e:
|
|
521
|
+
logger.error(f"System patch error output: {str(e)}")
|
|
522
|
+
logger.error(f"System patch failed: {str(e)}")
|
|
523
|
+
return False
|
|
120
524
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
525
|
+
def validate_and_fix_diff(diff_content: str) -> str:
|
|
526
|
+
"""
|
|
527
|
+
Validate diff format and ensure it has all required components.
|
|
528
|
+
Fixes common issues with LLM-generated diffs.
|
|
529
|
+
"""
|
|
530
|
+
logger.info("Validating and fixing diff format")
|
|
126
531
|
|
|
127
|
-
|
|
128
|
-
|
|
532
|
+
# Split into lines while preserving empty lines
|
|
533
|
+
lines = diff_content.splitlines(True)
|
|
534
|
+
result = []
|
|
535
|
+
in_hunk = False
|
|
129
536
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
corrected_lines.append(line)
|
|
136
|
-
line_index += 1
|
|
137
|
-
|
|
138
|
-
# Join the corrected lines back into a string
|
|
139
|
-
corrected_diff = '\n'.join(corrected_lines)
|
|
140
|
-
return corrected_diff
|
|
141
|
-
|
|
142
|
-
def _find_correct_old_start_line(original_content: list, hunk_lines: list) -> int:
|
|
143
|
-
"""
|
|
144
|
-
Finds the correct starting line number in the original file by matching context and deleted lines.
|
|
145
|
-
|
|
146
|
-
Parameters:
|
|
147
|
-
original_content (list): List of lines from the original file
|
|
148
|
-
hunk_lines (list): List of lines in the current hunk
|
|
149
|
-
|
|
150
|
-
Returns:
|
|
151
|
-
int: The correct 1-based line number where the hunk should start in the original file
|
|
152
|
-
|
|
153
|
-
The function works by:
|
|
154
|
-
1. Extracting context and deleted lines from the hunk (ignoring added lines)
|
|
155
|
-
2. Creating a pattern from these lines
|
|
156
|
-
3. Finding where this pattern matches in the original file
|
|
157
|
-
4. Converting the matching position to a 1-based line number
|
|
158
|
-
"""
|
|
159
|
-
# Extract context and deleted lines from the hunk
|
|
160
|
-
if not original_content:
|
|
161
|
-
# Creating a new file, should start with @@ -0,0 +1,N @@
|
|
162
|
-
return 0
|
|
163
|
-
|
|
164
|
-
if len(hunk_lines) < 3:
|
|
165
|
-
error_msg = (
|
|
166
|
-
f"Invalid git diff format: Expected at least 2 lines in the hunk, but got {len(hunk_lines)} lines.\n"
|
|
167
|
-
+ "Hunk content:\n{}".format('\n'.join(hunk_lines)))
|
|
168
|
-
logger.error(error_msg)
|
|
169
|
-
raise RuntimeError("Invalid git diff format.")
|
|
170
|
-
|
|
171
|
-
context_and_deleted = []
|
|
172
|
-
for line in hunk_lines:
|
|
173
|
-
if line.startswith(' ') or line.startswith('-'):
|
|
174
|
-
# Remove the prefix character
|
|
175
|
-
context_and_deleted.append(line[1:])
|
|
176
|
-
|
|
177
|
-
if not context_and_deleted:
|
|
178
|
-
error_msg = (
|
|
179
|
-
"Invalid git diff format: No context or deleted lines found in the hunk.\n"
|
|
180
|
-
"Each hunk must contain at least one context line (starting with space) "
|
|
181
|
-
"or deleted line (starting with '-').\n"
|
|
182
|
-
"Hunk content:\n{}".format('\n'.join(hunk_lines)))
|
|
183
|
-
raise RuntimeError(error_msg)
|
|
184
|
-
|
|
185
|
-
# Search for the pattern in the original file
|
|
186
|
-
pattern_length = len(context_and_deleted)
|
|
187
|
-
for i in range(len(original_content) - pattern_length + 1):
|
|
188
|
-
matches = True
|
|
189
|
-
for j in range(pattern_length):
|
|
190
|
-
if j >= len(context_and_deleted):
|
|
191
|
-
break
|
|
192
|
-
if i + j >= len(original_content) or original_content[i + j] != context_and_deleted[j]:
|
|
193
|
-
matches = False
|
|
194
|
-
break
|
|
195
|
-
if matches:
|
|
196
|
-
# Found the correct position git diff start with 1.
|
|
197
|
-
return i + 1
|
|
537
|
+
for i, line in enumerate(lines):
|
|
538
|
+
# Preserve all header lines exactly
|
|
539
|
+
if line.startswith(('diff --git', '--- ', '+++ ')):
|
|
540
|
+
result.append(line)
|
|
541
|
+
continue
|
|
198
542
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
"Please ensure the diff is generated against the correct version of the file."
|
|
205
|
-
)
|
|
206
|
-
logger.error(error_msg)
|
|
207
|
-
raise RuntimeError(error_msg)
|
|
543
|
+
# Handle hunk headers
|
|
544
|
+
if line.startswith('@@'):
|
|
545
|
+
in_hunk = True
|
|
546
|
+
result.append(line)
|
|
547
|
+
continue
|
|
208
548
|
|
|
209
|
-
|
|
549
|
+
# Handle hunk content
|
|
550
|
+
if in_hunk:
|
|
551
|
+
if not line.startswith((' ', '+', '-', '\n')):
|
|
552
|
+
# End of hunk reached
|
|
553
|
+
in_hunk = False
|
|
554
|
+
if not line.endswith('\n'):
|
|
555
|
+
result.append('\n') # Ensure proper line ending
|
|
556
|
+
else:
|
|
557
|
+
result.append(line)
|
|
558
|
+
continue
|
|
559
|
+
|
|
560
|
+
# Add any non-hunk lines
|
|
561
|
+
if not in_hunk:
|
|
562
|
+
result.append(line)
|
|
563
|
+
|
|
564
|
+
# Ensure the diff ends with a newline
|
|
565
|
+
if result and not result[-1].endswith('\n'):
|
|
566
|
+
result.append('\n')
|
|
567
|
+
|
|
568
|
+
return ''.join(result)
|
|
569
|
+
|
|
570
|
+
def prepare_unified_diff(diff_content: str) -> str:
|
|
571
|
+
"""
|
|
572
|
+
Convert a git diff to a simple unified diff format that the patch command expects.
|
|
210
573
|
"""
|
|
211
|
-
|
|
212
|
-
|
|
574
|
+
logger.info("Preparing unified diff")
|
|
575
|
+
result = []
|
|
576
|
+
lines = diff_content.splitlines()
|
|
577
|
+
|
|
578
|
+
# Find the actual file paths
|
|
579
|
+
i = 0
|
|
580
|
+
in_hunk = False
|
|
581
|
+
while i < len(lines):
|
|
582
|
+
line = lines[i]
|
|
583
|
+
|
|
584
|
+
# Keep header lines exactly as they are
|
|
585
|
+
if line.startswith(('diff --git', 'index')):
|
|
586
|
+
result.append(line)
|
|
587
|
+
i += 1
|
|
588
|
+
continue
|
|
589
|
+
|
|
590
|
+
# File paths
|
|
591
|
+
if line.startswith('--- '):
|
|
592
|
+
result.append(line)
|
|
593
|
+
i += 1
|
|
594
|
+
continue
|
|
595
|
+
if line.startswith('+++ '):
|
|
596
|
+
result.append(line)
|
|
597
|
+
i += 1
|
|
598
|
+
continue
|
|
599
|
+
|
|
600
|
+
# Hunk header
|
|
601
|
+
if line.startswith('@@ '):
|
|
602
|
+
in_hunk = True
|
|
603
|
+
result.append(line)
|
|
604
|
+
i += 1
|
|
605
|
+
continue
|
|
606
|
+
|
|
607
|
+
# Hunk content
|
|
608
|
+
if in_hunk:
|
|
609
|
+
if line.startswith((' ', '+', '-')):
|
|
610
|
+
result.append(line)
|
|
611
|
+
elif not line.strip(): # Empty line within hunk
|
|
612
|
+
result.append(' ' + line) # Add context marker for empty lines
|
|
613
|
+
else:
|
|
614
|
+
in_hunk = False # End of hunk reached
|
|
615
|
+
i += 1
|
|
616
|
+
continue
|
|
617
|
+
|
|
618
|
+
i += 1
|
|
213
619
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
original_content (list): List of lines from the original file.
|
|
620
|
+
# Ensure exactly one newline at the end
|
|
621
|
+
while result and not result[-1].strip():
|
|
622
|
+
result.pop()
|
|
623
|
+
result.append('') # Add single newline at end
|
|
219
624
|
|
|
220
|
-
|
|
221
|
-
tuple:
|
|
222
|
-
- corrected_hunk_header (str): The corrected hunk header.
|
|
223
|
-
- hunk_lines (list): The list of lines in the hunk (excluding the hunk header).
|
|
224
|
-
- end_index (int): The index in lines after the hunk.
|
|
225
|
-
- line_offset (int): The line offset caused by this hunk (to adjust future hunks).
|
|
625
|
+
return '\n'.join(result)
|
|
226
626
|
|
|
227
|
-
|
|
228
|
-
|
|
627
|
+
|
|
628
|
+
def remove_reject_file_if_exists(file_path: str):
|
|
629
|
+
"""
|
|
630
|
+
Remove .rej file if it exists, to clean up after partial patch attempts.
|
|
631
|
+
"""
|
|
632
|
+
rej_file = file_path + '.rej'
|
|
633
|
+
if os.path.exists(rej_file):
|
|
634
|
+
try:
|
|
635
|
+
os.remove(rej_file)
|
|
636
|
+
logger.info(f"Removed reject file: {rej_file}")
|
|
637
|
+
except OSError as e:
|
|
638
|
+
logger.warning(f"Could not remove reject file {rej_file}: {e}")
|
|
639
|
+
|
|
640
|
+
class PatchApplicationError(Exception):
|
|
641
|
+
pass
|
|
642
|
+
|
|
643
|
+
def apply_diff_with_difflib(file_path: str, diff_content: str) -> None:
|
|
644
|
+
"""
|
|
645
|
+
Forced-hybrid approach that also throws PatchApplicationError if we cannot
|
|
646
|
+
match a chunk with at least minimal confidence or if the minus lines do not match
|
|
647
|
+
in strict mode. No silent fails.
|
|
648
|
+
|
|
649
|
+
1) Read 'file_path' lines.
|
|
650
|
+
2) parse hunks with parse_unified_diff_exact_plus(diff_content, file_path)
|
|
651
|
+
3) For each hunk, do Phase A or Phase B, forcibly remove old_count lines.
|
|
652
|
+
4) If we can't match, raise PatchApplicationError.
|
|
653
|
+
5) Write result back to 'file_path'.
|
|
654
|
+
"""
|
|
655
|
+
|
|
656
|
+
# 1) read the original lines
|
|
657
|
+
try:
|
|
658
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
659
|
+
original_lines = f.readlines()
|
|
660
|
+
except FileNotFoundError:
|
|
661
|
+
original_lines = []
|
|
662
|
+
|
|
663
|
+
# 2) apply forced-hybrid logic with error throwing
|
|
664
|
+
final_lines = apply_diff_with_difflib_hybrid_forced(file_path, diff_content, original_lines)
|
|
665
|
+
|
|
666
|
+
# 3) write result
|
|
667
|
+
with open(file_path, 'w', encoding='utf-8') as f:
|
|
668
|
+
f.writelines(final_lines)
|
|
669
|
+
|
|
670
|
+
logger.info(f"Successfully applied forced-hybrid diff (with exceptions on mismatch) to {file_path}.")
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
def apply_diff_with_difflib_hybrid_forced(file_path: str, diff_content: str, original_lines: list[str]) -> list[str]:
|
|
674
|
+
# parse hunks
|
|
675
|
+
hunks = parse_unified_diff_exact_plus(diff_content, file_path)
|
|
676
|
+
stripped_original = [ln.rstrip('\n') for ln in original_lines]
|
|
677
|
+
|
|
678
|
+
offset = 0
|
|
679
|
+
for hunk_idx, h in enumerate(hunks, start=1):
|
|
680
|
+
old_start = h['old_start']
|
|
681
|
+
old_count = h['old_count']
|
|
682
|
+
new_lines = h['new_lines']
|
|
683
|
+
old_block = h['old_block']
|
|
684
|
+
|
|
685
|
+
logger.debug(f"\n--- Hunk #{hunk_idx} => -{old_start},{old_count} +{h['new_start']},{h['new_count']}, new_lines={len(new_lines)}")
|
|
686
|
+
|
|
687
|
+
# Phase A: strict check
|
|
688
|
+
remove_pos = (old_start - 1) + offset
|
|
689
|
+
remove_pos = clamp(remove_pos, 0, len(stripped_original))
|
|
690
|
+
strict_ok = False
|
|
691
|
+
|
|
692
|
+
# see if we have enough lines
|
|
693
|
+
if remove_pos + old_count <= len(stripped_original):
|
|
694
|
+
file_slice = stripped_original[remove_pos : remove_pos + old_count]
|
|
695
|
+
# Compare to the first old_count lines from old_block
|
|
696
|
+
if len(old_block) >= old_count:
|
|
697
|
+
old_block_minus = old_block[:old_count] # The lines we think are removed
|
|
698
|
+
if file_slice == old_block_minus:
|
|
699
|
+
strict_ok = True
|
|
700
|
+
logger.debug(f"Hunk #{hunk_idx}: strict match at pos={remove_pos}")
|
|
701
|
+
else:
|
|
702
|
+
logger.debug(f"Hunk #{hunk_idx}: strict match failed at pos={remove_pos}")
|
|
703
|
+
else:
|
|
704
|
+
logger.debug(f"Hunk #{hunk_idx}: old_block is smaller than old_count => strict match not possible")
|
|
705
|
+
|
|
706
|
+
if not strict_ok:
|
|
707
|
+
# Phase B: fuzzy
|
|
708
|
+
logger.debug(f"Hunk #{hunk_idx}: Attempting fuzzy near line {remove_pos}")
|
|
709
|
+
best_pos, best_ratio = find_best_chunk_position(stripped_original, old_block, remove_pos)
|
|
710
|
+
if best_ratio < MIN_CONFIDENCE:
|
|
711
|
+
# Raise error if ratio is too low
|
|
712
|
+
msg = (f"Hunk #{hunk_idx} => low confidence match (ratio={best_ratio:.2f}) near {remove_pos}, "
|
|
713
|
+
f"can't safely apply chunk. Failing.")
|
|
714
|
+
logger.error(msg)
|
|
715
|
+
raise PatchApplicationError(msg)
|
|
716
|
+
logger.debug(f"Hunk #{hunk_idx}: fuzzy best pos={best_pos}, ratio={best_ratio:.2f}")
|
|
717
|
+
remove_pos = best_pos
|
|
718
|
+
|
|
719
|
+
# forcibly remove old_count lines at remove_pos
|
|
720
|
+
remove_pos = clamp(remove_pos, 0, len(stripped_original))
|
|
721
|
+
end_remove = remove_pos + old_count
|
|
722
|
+
total_lines = len(stripped_original)
|
|
723
|
+
if end_remove > total_lines:
|
|
724
|
+
# Adjust old_count if we're near the end of file
|
|
725
|
+
old_count = total_lines - remove_pos
|
|
726
|
+
msg = (f"Hunk #{hunk_idx} => not enough lines to remove. "
|
|
727
|
+
f"Wanted to remove {old_count} at pos={remove_pos}, but file len={len(stripped_original)}. Failing.")
|
|
728
|
+
logger.error(msg)
|
|
729
|
+
raise PatchApplicationError(msg)
|
|
730
|
+
|
|
731
|
+
logger.debug(f"Hunk #{hunk_idx}: Removing lines {remove_pos}:{end_remove} from file")
|
|
732
|
+
for i in range(remove_pos, end_remove):
|
|
733
|
+
logger.debug(f" - {stripped_original[i]!r}")
|
|
734
|
+
del stripped_original[remove_pos:end_remove]
|
|
735
|
+
|
|
736
|
+
# Insert new_lines
|
|
737
|
+
logger.debug(f"Hunk #{hunk_idx}: Inserting {len(new_lines)} lines at pos={remove_pos}")
|
|
738
|
+
for i, ln in enumerate(new_lines):
|
|
739
|
+
logger.debug(f" + {ln!r}")
|
|
740
|
+
stripped_original.insert(remove_pos + i, ln)
|
|
741
|
+
|
|
742
|
+
net_change = len(new_lines) - old_count
|
|
743
|
+
offset += net_change
|
|
744
|
+
|
|
745
|
+
# done all hunks
|
|
746
|
+
final_lines = [ln + '\n' for ln in stripped_original]
|
|
747
|
+
return final_lines
|
|
748
|
+
|
|
749
|
+
def strip_leading_dotslash(rel_path: str) -> str:
|
|
750
|
+
"""
|
|
751
|
+
Remove leading '../' or './' segments from the relative path
|
|
752
|
+
so it matches patch lines that are always 'frontend/...', not '../frontend/...'.
|
|
753
|
+
"""
|
|
754
|
+
import re
|
|
755
|
+
# Repeatedly strip leading '../' or './'
|
|
756
|
+
pattern = re.compile(r'^\.\.?/')
|
|
757
|
+
while pattern.match(rel_path):
|
|
758
|
+
rel_path = rel_path[rel_path.index('/')+1:]
|
|
759
|
+
return rel_path
|
|
760
|
+
|
|
761
|
+
def parse_unified_diff_exact_plus(diff_content: str, target_file: str) -> list[dict]:
|
|
762
|
+
"""
|
|
763
|
+
Same logic: we gather old_block and new_lines. If we can't parse anything, we return an empty list.
|
|
764
|
+
The calling code might handle that or raise an error if no hunks are found.
|
|
229
765
|
"""
|
|
766
|
+
import re
|
|
767
|
+
lines = diff_content.splitlines()
|
|
768
|
+
hunks = []
|
|
769
|
+
current_hunk = None
|
|
770
|
+
in_hunk = False
|
|
771
|
+
skip_file = True
|
|
772
|
+
|
|
773
|
+
# fixme: import ziya project directory if specified on invocation cli
|
|
774
|
+
rel_path = os.path.relpath(target_file, os.getcwd())
|
|
775
|
+
rel_path = strip_leading_dotslash(rel_path)
|
|
776
|
+
|
|
777
|
+
def close_hunk():
|
|
778
|
+
nonlocal current_hunk, in_hunk
|
|
779
|
+
if current_hunk:
|
|
780
|
+
hunks.append(current_hunk)
|
|
781
|
+
current_hunk = None
|
|
782
|
+
in_hunk = False
|
|
783
|
+
|
|
784
|
+
i = 0
|
|
785
|
+
while i < len(lines):
|
|
786
|
+
line = lines[i]
|
|
787
|
+
logger.debug(f"parse_unified_diff_exact_plus => line[{i}]: {line!r}")
|
|
788
|
+
|
|
789
|
+
if line.startswith('diff --git'):
|
|
790
|
+
i += 1
|
|
791
|
+
continue
|
|
230
792
|
|
|
231
|
-
|
|
793
|
+
if line.startswith(('--- ', '+++ ')):
|
|
794
|
+
i += 1
|
|
795
|
+
continue
|
|
232
796
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
797
|
+
if line.startswith('@@ '):
|
|
798
|
+
close_hunk()
|
|
799
|
+
match = re.match(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@.*$', line)
|
|
800
|
+
if match:
|
|
801
|
+
old_start = int(match.group(1))
|
|
802
|
+
# Validate line numbers
|
|
803
|
+
if old_start < 1:
|
|
804
|
+
logger.warning(f"Invalid hunk header - old_start ({old_start}) < 1")
|
|
805
|
+
old_start = 1
|
|
806
|
+
|
|
807
|
+
# Use default of 1 for count if not specified
|
|
808
|
+
old_count = int(match.group(2)) if match.group(2) else 1
|
|
809
|
+
|
|
810
|
+
new_start = int(match.group(3))
|
|
811
|
+
new_count = int(match.group(4)) if match.group(4) else 1
|
|
812
|
+
current_hunk = {
|
|
813
|
+
'old_start': old_start,
|
|
814
|
+
'old_count': old_count,
|
|
815
|
+
'new_start': new_start,
|
|
816
|
+
'new_count': new_count,
|
|
817
|
+
'old_block': [],
|
|
818
|
+
'new_lines': []
|
|
819
|
+
}
|
|
820
|
+
in_hunk = True
|
|
821
|
+
hunks.append(current_hunk)
|
|
822
|
+
i += 1
|
|
823
|
+
continue
|
|
236
824
|
|
|
237
|
-
|
|
238
|
-
|
|
825
|
+
if in_hunk and current_hunk:
|
|
826
|
+
if line.startswith('-'):
|
|
827
|
+
text = line[1:].rstrip('\n')
|
|
828
|
+
current_hunk['old_block'].append(text)
|
|
829
|
+
elif line.startswith('+'):
|
|
830
|
+
text = line[1:].rstrip('\n')
|
|
831
|
+
current_hunk['new_lines'].append(text)
|
|
832
|
+
else:
|
|
833
|
+
# context => belongs to both old_block & new_lines
|
|
834
|
+
text = line[1:].rstrip('\n') if line.startswith(' ') else line.rstrip('\n')
|
|
835
|
+
current_hunk['old_block'].append(text)
|
|
836
|
+
current_hunk['new_lines'].append(text)
|
|
837
|
+
i += 1
|
|
239
838
|
|
|
240
|
-
|
|
839
|
+
close_hunk()
|
|
840
|
+
if len(hunks) == 0:
|
|
841
|
+
raise PatchApplicationError(f"No hunks found in diff for {target_file}", {
|
|
842
|
+
'status': 'no_hunks_found',
|
|
843
|
+
'details': f"Target file path: {target_file}\nDiff content:\n{diff_content[:500]}..."
|
|
844
|
+
})
|
|
845
|
+
return hunks
|
|
241
846
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
847
|
+
|
|
848
|
+
def find_best_chunk_position(file_lines: list[str], old_block: list[str], approximate_line: int) -> tuple[int, float]:
|
|
849
|
+
"""
|
|
850
|
+
Return (best_pos, best_ratio). If best_ratio < MIN_CONFIDENCE, we raise or handle outside.
|
|
851
|
+
"""
|
|
852
|
+
block_str = '\n'.join(old_block)
|
|
853
|
+
file_len = len(file_lines)
|
|
854
|
+
block_len = len(old_block)
|
|
855
|
+
|
|
856
|
+
# search +/- 20 lines
|
|
857
|
+
search_start = max(0, approximate_line - 20)
|
|
858
|
+
search_end = min(file_len - block_len + 1, approximate_line + 20)
|
|
859
|
+
if search_end < search_start:
|
|
860
|
+
search_start = 0
|
|
861
|
+
search_end = max(0, file_len - block_len + 1)
|
|
862
|
+
|
|
863
|
+
best_pos = approximate_line
|
|
864
|
+
best_ratio = 0.0
|
|
865
|
+
import difflib
|
|
866
|
+
matcher = difflib.SequenceMatcher(None)
|
|
867
|
+
|
|
868
|
+
for pos in range(search_start, search_end + 1):
|
|
869
|
+
window = file_lines[pos:pos+block_len]
|
|
870
|
+
window_str = '\n'.join(window)
|
|
871
|
+
matcher.set_seqs(block_str, window_str)
|
|
872
|
+
ratio = matcher.ratio()
|
|
873
|
+
if ratio > best_ratio:
|
|
874
|
+
best_ratio = ratio
|
|
875
|
+
best_pos = pos
|
|
876
|
+
if best_ratio > 0.98:
|
|
246
877
|
break
|
|
878
|
+
|
|
879
|
+
logger.debug(f"find_best_chunk_position => best ratio={best_ratio:.2f} at pos={best_pos}, approximate_line={approximate_line}")
|
|
880
|
+
return best_pos, best_ratio
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
def clamp(value: int, low: int, high: int) -> int:
|
|
884
|
+
"""Simple clamp utility to ensure we stay in range."""
|
|
885
|
+
return max(low, min(high, value))
|
|
886
|
+
|
|
887
|
+
class HunkData:
|
|
888
|
+
"""
|
|
889
|
+
Stores data for a single hunk in the unified diff: header, start_line, old_lines, new_lines, etc.
|
|
890
|
+
Also includes optional context fields if needed (context_before, context_after).
|
|
891
|
+
"""
|
|
892
|
+
def __init__(self, header='', start_line=1, old_lines=None, new_lines=None,
|
|
893
|
+
context_before=None, context_after=None):
|
|
894
|
+
self.header = header
|
|
895
|
+
self.start_line = start_line
|
|
896
|
+
self.old_lines = old_lines or []
|
|
897
|
+
self.new_lines = new_lines or []
|
|
898
|
+
self.context_before = context_before or []
|
|
899
|
+
self.context_after = context_after or []
|
|
900
|
+
|
|
901
|
+
def __repr__(self):
|
|
902
|
+
return (f"<HunkData start_line={self.start_line} "
|
|
903
|
+
f"old={len(self.old_lines)} new={len(self.new_lines)}>")
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
##########################################################
|
|
907
|
+
# 2) FIND SECTION BOUNDS
|
|
908
|
+
##########################################################
|
|
909
|
+
|
|
910
|
+
def parse_unified_diff(diff_content: str) -> List[HunkData]:
|
|
911
|
+
# ...
|
|
912
|
+
# Return a list of HunkData. Or use your existing parser logic:
|
|
913
|
+
lines = diff_content.splitlines()
|
|
914
|
+
hunks: List[HunkData] = []
|
|
915
|
+
in_hunk = False
|
|
916
|
+
current_hunk = None
|
|
917
|
+
|
|
918
|
+
for line in lines:
|
|
919
|
+
if line.startswith(('diff --git', 'index ', 'new file mode', '--- ', '+++ ')):
|
|
920
|
+
continue
|
|
921
|
+
if line.startswith('@@'):
|
|
922
|
+
# close old hunk if any
|
|
923
|
+
if in_hunk and current_hunk:
|
|
924
|
+
hunks.append(current_hunk)
|
|
925
|
+
current_hunk = HunkData(header=line, start_line=1)
|
|
926
|
+
match = re.match(r'^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@', line)
|
|
927
|
+
if match:
|
|
928
|
+
current_hunk.start_line = int(match.group(1))
|
|
929
|
+
else:
|
|
930
|
+
logger.warning(f"Invalid hunk header: {line}")
|
|
931
|
+
in_hunk = True
|
|
932
|
+
continue
|
|
933
|
+
|
|
934
|
+
if in_hunk and current_hunk:
|
|
935
|
+
if line.startswith('+'):
|
|
936
|
+
current_hunk.new_lines.append(line[1:])
|
|
937
|
+
elif line.startswith('-'):
|
|
938
|
+
current_hunk.old_lines.append(line[1:])
|
|
939
|
+
else:
|
|
940
|
+
# Context line
|
|
941
|
+
content = line[1:] if line.startswith(' ') else line
|
|
942
|
+
current_hunk.old_lines.append(content)
|
|
943
|
+
current_hunk.new_lines.append(content)
|
|
247
944
|
else:
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
# Find the correct start_line_old by matching context and deleted lines
|
|
252
|
-
start_line_old = _find_correct_old_start_line(original_content, hunk_lines)
|
|
253
|
-
|
|
254
|
-
# Calculate counts for the hunk lines
|
|
255
|
-
for hunk_line in hunk_lines:
|
|
256
|
-
if hunk_line.startswith('+') and not hunk_line.startswith('+++'):
|
|
257
|
-
actual_count_new += 1
|
|
258
|
-
elif hunk_line.startswith('-') and not hunk_line.startswith('---'):
|
|
259
|
-
actual_count_old += 1
|
|
260
|
-
else:
|
|
261
|
-
# Context line (unchanged line)
|
|
262
|
-
actual_count_old += 1
|
|
263
|
-
actual_count_new += 1
|
|
264
|
-
|
|
265
|
-
# Special handling for new file creation
|
|
266
|
-
if start_line_old == 0:
|
|
267
|
-
# For new files:
|
|
268
|
-
# count_old should be 0
|
|
269
|
-
actual_count_old = 0
|
|
270
|
-
corrected_start_line_new = 1
|
|
271
|
-
else:
|
|
272
|
-
# For existing files, adjust start_line_new considering previous line offsets
|
|
273
|
-
corrected_start_line_new = start_line_old + cumulative_line_offset
|
|
945
|
+
# Lines outside hunks
|
|
946
|
+
pass
|
|
274
947
|
|
|
275
|
-
|
|
276
|
-
|
|
948
|
+
if in_hunk and current_hunk:
|
|
949
|
+
hunks.append(current_hunk)
|
|
277
950
|
|
|
278
|
-
|
|
279
|
-
corrected_hunk_header = _format_hunk_header(
|
|
280
|
-
start_line_old, actual_count_old, corrected_start_line_new, actual_count_new
|
|
281
|
-
)
|
|
951
|
+
return hunks
|
|
282
952
|
|
|
283
|
-
|
|
953
|
+
class PatchApplicationError(Exception):
|
|
954
|
+
def __init__(self, msg, details=None):
|
|
955
|
+
super().__init__(msg)
|
|
956
|
+
self.details = details or {}
|
|
284
957
|
|
|
285
|
-
|
|
958
|
+
|
|
959
|
+
|
|
960
|
+
def find_section_bounds(
|
|
961
|
+
pos: int,
|
|
962
|
+
lines: List[str],
|
|
963
|
+
is_header: bool = False,
|
|
964
|
+
hunk_header: str = ''
|
|
965
|
+
) -> Tuple[int, int, Optional[str]]:
|
|
966
|
+
"""
|
|
967
|
+
This reproduces the logic in your snippet for scanning backward or forward
|
|
968
|
+
to find function definitions, used to identify the nearest “section” or function.
|
|
286
969
|
"""
|
|
287
|
-
|
|
970
|
+
logger.debug(f"[find_section_bounds] pos={pos}, total lines={len(lines)}")
|
|
288
971
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
start_new (int): Starting line number in the new file.
|
|
293
|
-
count_new (int): Number of lines in the hunk in the new file.
|
|
972
|
+
if not lines:
|
|
973
|
+
logger.debug("Empty file, return trivial bounds.")
|
|
974
|
+
return 0, 0, None
|
|
294
975
|
|
|
295
|
-
|
|
296
|
-
|
|
976
|
+
# Basic fallback if we can’t find anything
|
|
977
|
+
if pos >= len(lines):
|
|
978
|
+
pos = len(lines) - 1
|
|
297
979
|
|
|
298
|
-
|
|
299
|
-
|
|
980
|
+
# For demonstration, we search backward for “def ”
|
|
981
|
+
start = pos
|
|
982
|
+
while start >= 0 and not lines[start].lstrip().startswith('def '):
|
|
983
|
+
start -= 1
|
|
984
|
+
if start < 0:
|
|
985
|
+
# No function found, fallback
|
|
986
|
+
return 0, len(lines), None
|
|
300
987
|
|
|
301
|
-
|
|
988
|
+
# That’s presumably the start of the function
|
|
989
|
+
section_name = extract_function_name(lines[start])
|
|
990
|
+
end = start + 1
|
|
991
|
+
while end < len(lines) and not lines[end].lstrip().startswith('def '):
|
|
992
|
+
end += 1
|
|
993
|
+
|
|
994
|
+
logger.debug(f"[find_section_bounds] Found function {section_name}, range={start}-{end}")
|
|
995
|
+
return start, end, section_name
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
def extract_function_name(line: str) -> str:
|
|
999
|
+
"""
|
|
1000
|
+
Helper to parse 'def something(...)' from a line and return 'something'.
|
|
1001
|
+
"""
|
|
1002
|
+
line = line.strip()
|
|
1003
|
+
if not line.startswith('def '):
|
|
1004
|
+
return ''
|
|
1005
|
+
# e.g., def foo(bar):
|
|
1006
|
+
after_def = line[4:].split('(')[0]
|
|
1007
|
+
return after_def.strip()
|
|
1008
|
+
|
|
1009
|
+
def use_git_to_apply_code_diff(git_diff: str, file_path: str) -> None:
|
|
302
1010
|
"""
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
1011
|
+
Apply a git diff to the user's codebase.
|
|
1012
|
+
Main entry point for patch application.
|
|
1013
|
+
"""
|
|
1014
|
+
logger.info("Starting diff application process...")
|
|
1015
|
+
logger.debug("Original diff content:")
|
|
1016
|
+
logger.debug(git_diff)
|
|
1017
|
+
|
|
1018
|
+
# Correct the diff using existing functionality
|
|
1019
|
+
if file_path:
|
|
1020
|
+
git_diff = correct_git_diff(git_diff, file_path)
|
|
1021
|
+
else:
|
|
1022
|
+
raise ValueError("Could not determine target file path")
|
|
1023
|
+
|
|
1024
|
+
user_codebase_dir = os.environ.get("ZIYA_USER_CODEBASE_DIR")
|
|
1025
|
+
if not user_codebase_dir:
|
|
1026
|
+
raise ValueError("ZIYA_USER_CODEBASE_DIR environment variable is not set")
|
|
1027
|
+
|
|
1028
|
+
# Split into lines for analysis
|
|
1029
|
+
diff_lines = git_diff.splitlines()
|
|
1030
|
+
|
|
1031
|
+
# Extract target file path first
|
|
1032
|
+
file_path = None
|
|
1033
|
+
for line in diff_lines:
|
|
1034
|
+
if line.startswith('diff --git'):
|
|
1035
|
+
_, _, path = line.partition(' b/')
|
|
1036
|
+
file_path = os.path.join(user_codebase_dir, path)
|
|
1037
|
+
break
|
|
1038
|
+
|
|
1039
|
+
# Handle new file creation
|
|
1040
|
+
if is_new_file_creation(diff_lines):
|
|
1041
|
+
create_new_file(git_diff, user_codebase_dir)
|
|
1042
|
+
return
|
|
1043
|
+
|
|
1044
|
+
try:
|
|
1045
|
+
# Try system patch first
|
|
1046
|
+
logger.debug("About to run patch command with:")
|
|
1047
|
+
logger.debug(f"CWD: {user_codebase_dir}")
|
|
1048
|
+
logger.debug(f"Input length: {len(git_diff)} bytes")
|
|
1049
|
+
patch_result = subprocess.run(
|
|
1050
|
+
['patch', '-p1', '--forward', '--ignore-whitespace', '-i', '-'],
|
|
1051
|
+
input=git_diff,
|
|
1052
|
+
cwd=user_codebase_dir,
|
|
1053
|
+
capture_output=True,
|
|
1054
|
+
text=True,
|
|
1055
|
+
timeout=10
|
|
1056
|
+
)
|
|
1057
|
+
logger.debug("Patch command completed with:")
|
|
1058
|
+
logger.debug(f"stdout: {patch_result.stdout}")
|
|
1059
|
+
logger.debug(f"stderr: {patch_result.stderr}")
|
|
1060
|
+
|
|
1061
|
+
if patch_result.returncode == 0:
|
|
1062
|
+
logger.info("System patch succeeded")
|
|
1063
|
+
return
|
|
1064
|
+
elif patch_result.returncode == 2: # Patch failed but gave output
|
|
1065
|
+
logger.warning("System patch failed but provided output")
|
|
1066
|
+
|
|
1067
|
+
# If patch fails, try git apply
|
|
1068
|
+
logger.warning("System patch failed, trying git apply...")
|
|
1069
|
+
timestamp = int(time.time() * 1000)
|
|
1070
|
+
temp_file = os.path.join(user_codebase_dir, f'temp_{timestamp}.diff')
|
|
1071
|
+
|
|
1072
|
+
try:
|
|
1073
|
+
with open(temp_file, 'w', newline='\n') as f:
|
|
1074
|
+
f.write(git_diff)
|
|
1075
|
+
|
|
1076
|
+
git_result = subprocess.run(
|
|
1077
|
+
['git', 'apply', '--verbose', '--ignore-whitespace',
|
|
1078
|
+
'--ignore-space-change', '--whitespace=nowarn',
|
|
1079
|
+
'--reject', temp_file],
|
|
1080
|
+
cwd=user_codebase_dir,
|
|
1081
|
+
capture_output=True,
|
|
1082
|
+
text=True
|
|
1083
|
+
)
|
|
1084
|
+
|
|
1085
|
+
if git_result.returncode == 0:
|
|
1086
|
+
logger.info("Git apply succeeded")
|
|
1087
|
+
return
|
|
1088
|
+
|
|
1089
|
+
if 'patch does not apply' not in git_result.stderr:
|
|
1090
|
+
git_diff = extract_remaining_hunks(git_diff, git_result.stderr)
|
|
1091
|
+
|
|
1092
|
+
# If both patch and git apply fail, try difflib
|
|
1093
|
+
logger.warning("Git apply failed, trying difflib...")
|
|
1094
|
+
try:
|
|
1095
|
+
apply_diff_with_difflib(file_path, git_diff)
|
|
1096
|
+
except PatchApplicationError as e:
|
|
1097
|
+
if 'available_lines' in e.details:
|
|
1098
|
+
logger.warning(
|
|
1099
|
+
f"Not enough lines in file to apply patch. "
|
|
1100
|
+
f"Requested {e.details['requested_lines']} lines at position {e.details['position']}, "
|
|
1101
|
+
f"but only {e.details['available_lines']} lines available after that position."
|
|
1102
|
+
)
|
|
1103
|
+
elif e.details.get('status') == 'partial':
|
|
1104
|
+
logger.warning(f"Partial success: {e.details.get('summary', '')}")
|
|
1105
|
+
# Re-raise to let the endpoint handle the partial success
|
|
1106
|
+
raise
|
|
1107
|
+
else:
|
|
1108
|
+
logger.error(f"Failed to apply changes: {str(e)}")
|
|
1109
|
+
raise
|
|
1110
|
+
logger.info("Difflib apply succeeded")
|
|
1111
|
+
return
|
|
1112
|
+
|
|
1113
|
+
finally:
|
|
1114
|
+
if os.path.exists(temp_file):
|
|
1115
|
+
os.remove(temp_file)
|
|
1116
|
+
except Exception as e:
|
|
1117
|
+
logger.error(f"Error applying patch: {str(e)}")
|
|
1118
|
+
raise
|
|
1119
|
+
|
|
1120
|
+
def extract_remaining_hunks(git_diff: str, patch_output: str) -> str:
|
|
1121
|
+
"""Extract hunks that weren't successfully applied."""
|
|
1122
|
+
logger.debug("Extracting remaining hunks from diff")
|
|
1123
|
+
|
|
1124
|
+
# Parse the original diff into hunks
|
|
1125
|
+
lines = git_diff.splitlines()
|
|
1126
|
+
hunks = []
|
|
1127
|
+
current_hunk = []
|
|
1128
|
+
|
|
1129
|
+
for line in lines:
|
|
1130
|
+
if line.startswith('@@'):
|
|
1131
|
+
if current_hunk:
|
|
1132
|
+
hunks.append(current_hunk)
|
|
1133
|
+
current_hunk = [line]
|
|
1134
|
+
elif current_hunk is not None:
|
|
1135
|
+
current_hunk.append(line)
|
|
1136
|
+
|
|
1137
|
+
if current_hunk:
|
|
1138
|
+
hunks.append(current_hunk)
|
|
1139
|
+
|
|
1140
|
+
# Filter out successfully applied hunks
|
|
1141
|
+
remaining_hunks = [hunk for i, hunk in enumerate(hunks, 1)
|
|
1142
|
+
if f'Hunk #{i} succeeded' not in patch_output]
|
|
1143
|
+
|
|
1144
|
+
return '\n'.join(sum(remaining_hunks, []))
|
|
1145
|
+
|