notebook 7.4.4__py3-none-any.whl → 7.4.5__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 notebook might be problematic. Click here for more details.

Files changed (131) hide show
  1. notebook/_version.py +1 -1
  2. notebook/static/{132.9f8c8540fc63a49a9d74.js → 132.bbe0fd1e86fe078554cf.js} +2 -2
  3. notebook/static/{132.9f8c8540fc63a49a9d74.js.map → 132.bbe0fd1e86fe078554cf.js.map} +1 -1
  4. notebook/static/{1584.fa41c8f3ce855db5cab4.js → 1584.5e136a9d8643093bc7e9.js} +2 -2
  5. notebook/static/{1584.fa41c8f3ce855db5cab4.js.map → 1584.5e136a9d8643093bc7e9.js.map} +1 -1
  6. notebook/static/{1650.afa95e6a11189688bc0d.js → 1650.43e49e4c78755f921679.js} +4 -4
  7. notebook/static/{1650.afa95e6a11189688bc0d.js.map → 1650.43e49e4c78755f921679.js.map} +1 -1
  8. notebook/static/{1684.12280f8470722e2e1bdd.js → 1684.72557761abcc7d3f021b.js} +5 -5
  9. notebook/static/{1684.12280f8470722e2e1bdd.js.map → 1684.72557761abcc7d3f021b.js.map} +1 -1
  10. notebook/static/{1715.a61bcde14ed0fff41d06.js → 1715.eb47d8a8fb23246d8368.js} +2 -2
  11. notebook/static/{1715.a61bcde14ed0fff41d06.js.map → 1715.eb47d8a8fb23246d8368.js.map} +1 -1
  12. notebook/static/{2913.ae7fccede5f85a45ab8f.js → 2913.274b19d8f201991f4a69.js} +3 -3
  13. notebook/static/{2913.ae7fccede5f85a45ab8f.js.map → 2913.274b19d8f201991f4a69.js.map} +1 -1
  14. notebook/static/{2955.d8fd055f03b878034fe4.js → 2955.199d6b7c6b5d8531cad7.js} +302 -47
  15. notebook/static/2955.199d6b7c6b5d8531cad7.js.map +1 -0
  16. notebook/static/{3146.8a7a657d9a66a9f5d3c4.js → 3146.f98fbe7d5b55224f0160.js} +3 -3
  17. notebook/static/{3146.8a7a657d9a66a9f5d3c4.js.map → 3146.f98fbe7d5b55224f0160.js.map} +1 -1
  18. notebook/static/{3197.679087d3d6e90032272a.js → 3197.132cf892d4ef38649b32.js} +3 -3
  19. notebook/static/{3197.679087d3d6e90032272a.js.map → 3197.132cf892d4ef38649b32.js.map} +1 -1
  20. notebook/static/{3619.22c7d8abf7febc282c79.js → 3619.2e4bf80097f9890aef49.js} +2 -2
  21. notebook/static/{3619.22c7d8abf7febc282c79.js.map → 3619.2e4bf80097f9890aef49.js.map} +1 -1
  22. notebook/static/{3768.2ac0d5c2a3fec16d1571.js → 3768.0b6995cb2c93a75f2359.js} +19 -19
  23. notebook/static/{7302.d78f81cccff1a175f9e0.js.map → 3768.0b6995cb2c93a75f2359.js.map} +1 -1
  24. notebook/static/{4276.aa39300c806a420e8c6e.js → 4276.2edc46f98f304de431b0.js} +3 -3
  25. notebook/static/{4276.aa39300c806a420e8c6e.js.map → 4276.2edc46f98f304de431b0.js.map} +1 -1
  26. notebook/static/{4382.b125e3c487c540303bd8.js → 4382.c317254086f1ae2d605a.js} +3 -3
  27. notebook/static/{4382.b125e3c487c540303bd8.js.map → 4382.c317254086f1ae2d605a.js.map} +1 -1
  28. notebook/static/{4430.1661db8ba0104d6baef2.js → 4430.879d60462da8c4629a70.js} +2 -2
  29. notebook/static/{4430.1661db8ba0104d6baef2.js.map → 4430.879d60462da8c4629a70.js.map} +1 -1
  30. notebook/static/{4588.7618f6b98796be928f8c.js → 4588.46b592131684aa708905.js} +3 -3
  31. notebook/static/{4588.7618f6b98796be928f8c.js.map → 4588.46b592131684aa708905.js.map} +1 -1
  32. notebook/static/{4645.998914768dd63f7e3b6a.js → 4645.9017711a4d52533bd2ae.js} +5 -5
  33. notebook/static/{4645.998914768dd63f7e3b6a.js.map → 4645.9017711a4d52533bd2ae.js.map} +1 -1
  34. notebook/static/{4837.a9ef53721ea86ce81edf.js → 4837.2a30feab2693717d3d43.js} +3 -3
  35. notebook/static/{4837.a9ef53721ea86ce81edf.js.map → 4837.2a30feab2693717d3d43.js.map} +1 -1
  36. notebook/static/{4926.07f857be253dfe2d9b64.js → 4926.7f42350f683b70d59456.js} +3 -3
  37. notebook/static/{4926.07f857be253dfe2d9b64.js.map → 4926.7f42350f683b70d59456.js.map} +1 -1
  38. notebook/static/{5135.b7b086e4e6f05e7e005d.js → 5135.1cde65c1d79a0adc262d.js} +11 -11
  39. notebook/static/{5135.b7b086e4e6f05e7e005d.js.map → 5135.1cde65c1d79a0adc262d.js.map} +1 -1
  40. notebook/static/{5573.bb30245305dc034dfc1d.js → 5573.38e0610ea3d6d9b005b5.js} +17 -17
  41. notebook/static/{5573.bb30245305dc034dfc1d.js.map → 5573.38e0610ea3d6d9b005b5.js.map} +1 -1
  42. notebook/static/{5601.66a1a7b62201a024a7c3.js → 5601.ffda77b468bc8b17a221.js} +5 -5
  43. notebook/static/{5601.66a1a7b62201a024a7c3.js.map → 5601.ffda77b468bc8b17a221.js.map} +1 -1
  44. notebook/static/{5850.65dd0d81b5948c463df4.js → 5850.30a4d9a000a79095dcff.js} +3 -3
  45. notebook/static/{5850.65dd0d81b5948c463df4.js.map → 5850.30a4d9a000a79095dcff.js.map} +1 -1
  46. notebook/static/{6271.7ad87d1f14b9d74742ec.js → 6271.809bc8c9941039275a30.js} +3 -3
  47. notebook/static/{6271.7ad87d1f14b9d74742ec.js.map → 6271.809bc8c9941039275a30.js.map} +1 -1
  48. notebook/static/{6345.d502d596db3228f46015.js → 6345.348b6265ddf3713ab5d6.js} +5 -5
  49. notebook/static/{6345.d502d596db3228f46015.js.map → 6345.348b6265ddf3713ab5d6.js.map} +1 -1
  50. notebook/static/{2283.b2d8643ec28ab13849b3.js → 6653.6525abafd19e7997f79c.js} +2 -2
  51. notebook/static/{2283.b2d8643ec28ab13849b3.js.map → 6653.6525abafd19e7997f79c.js.map} +1 -1
  52. notebook/static/{7302.d78f81cccff1a175f9e0.js → 7302.3f668970091842fbc9ca.js} +19 -19
  53. notebook/static/{3768.2ac0d5c2a3fec16d1571.js.map → 7302.3f668970091842fbc9ca.js.map} +1 -1
  54. notebook/static/{7450.c047a6b002d188bafd58.js → 7450.beacefc07c8e386709fa.js} +2 -2
  55. notebook/static/{7450.c047a6b002d188bafd58.js.map → 7450.beacefc07c8e386709fa.js.map} +1 -1
  56. notebook/static/{7866.b49b1018f43def5a8f30.js → 7866.b73df9c77816d05d6784.js} +3 -3
  57. notebook/static/{7866.b49b1018f43def5a8f30.js.map → 7866.b73df9c77816d05d6784.js.map} +1 -1
  58. notebook/static/{7906.487df198bc7b2617234f.js → 7906.c3e50e3c279ee95b5b0c.js} +3 -3
  59. notebook/static/{7906.487df198bc7b2617234f.js.map → 7906.c3e50e3c279ee95b5b0c.js.map} +1 -1
  60. notebook/static/{7995.45be6443b704da1daafc.js → 7995.8f35600b7ffffa34c89b.js} +3 -3
  61. notebook/static/{7995.45be6443b704da1daafc.js.map → 7995.8f35600b7ffffa34c89b.js.map} +1 -1
  62. notebook/static/{5261.f12a52481f4cee8ba676.js → 8313.45ac616d61cf717bff16.js} +152 -148
  63. notebook/static/8313.45ac616d61cf717bff16.js.map +1 -0
  64. notebook/static/{8579.d62567e04de2f4dfcdce.js → 8579.973518a0960b2b927064.js} +14 -14
  65. notebook/static/{8579.d62567e04de2f4dfcdce.js.map → 8579.973518a0960b2b927064.js.map} +1 -1
  66. notebook/static/{8781.33cace3f177efaaab2ae.js → 8781.3f87f07359077c3a8a85.js} +60 -60
  67. notebook/static/{8781.33cace3f177efaaab2ae.js.map → 8781.3f87f07359077c3a8a85.js.map} +1 -1
  68. notebook/static/{8875.af28a3c042114a6f93aa.js → 8875.0604966d624b3656aa1c.js} +4 -4
  69. notebook/static/{8875.af28a3c042114a6f93aa.js.map → 8875.0604966d624b3656aa1c.js.map} +1 -1
  70. notebook/static/{9068.53ce96460d0830da310f.js → 9068.d8c4c8fa34c89c710d15.js} +3 -3
  71. notebook/static/{9068.53ce96460d0830da310f.js.map → 9068.d8c4c8fa34c89c710d15.js.map} +1 -1
  72. notebook/static/{9380.392ac30e0b6842ae2b78.js → 9380.b2ee26fa1e359ebe5fb8.js} +5 -5
  73. notebook/static/{9380.392ac30e0b6842ae2b78.js.map → 9380.b2ee26fa1e359ebe5fb8.js.map} +1 -1
  74. notebook/static/{9799.3d54e01276f72cee9ada.js → 9799.f8f37b03cc4afc27f8f0.js} +2 -2
  75. notebook/static/{9799.3d54e01276f72cee9ada.js.map → 9799.f8f37b03cc4afc27f8f0.js.map} +1 -1
  76. notebook/static/main.e99dd4f880b24bc94403.js +1180 -0
  77. notebook/static/main.e99dd4f880b24bc94403.js.map +1 -0
  78. notebook/static/{notebook_core.5321b49dd3857d00ab82.js → notebook_core.e0fcfe0884f9e1166813.js} +974 -893
  79. notebook/static/{notebook_core.5321b49dd3857d00ab82.js.map → notebook_core.e0fcfe0884f9e1166813.js.map} +1 -1
  80. notebook/static/third-party-licenses.json +104 -104
  81. notebook/templates/consoles.html +1 -1
  82. notebook/templates/edit.html +1 -1
  83. notebook/templates/error.html +1 -1
  84. notebook/templates/notebooks.html +1 -1
  85. notebook/templates/terminals.html +1 -1
  86. notebook/templates/tree.html +1 -1
  87. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/package.json.orig +14 -14
  88. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/documentsearch-extension/package.json.orig +4 -4
  89. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/help-extension/package.json.orig +6 -6
  90. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/package.json.orig +9 -9
  91. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/tree-extension/package.json.orig +15 -15
  92. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/package.json +11 -11
  93. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/schemas/@jupyter-notebook/lab-extension/package.json.orig +10 -10
  94. notebook-7.4.5.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/261.ed6f8abd5781e8d11deb.js +1 -0
  95. notebook-7.4.4.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/568.0143b064f4b09edb4d20.js → notebook-7.4.5.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/568.5e057f374374b68b6acf.js +1 -1
  96. notebook-7.4.5.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/928.fb1e84fb9063ca0568af.js +1 -0
  97. notebook-7.4.4.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/93.eae3497dd223d842d198.js → notebook-7.4.5.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/93.c48a681bb3e8043bbbd7.js +1 -1
  98. notebook-7.4.5.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/remoteEntry.7e3d7768845089ad5f5f.js +1 -0
  99. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/third-party-licenses.json +2 -2
  100. {notebook-7.4.4.dist-info → notebook-7.4.5.dist-info}/METADATA +2 -2
  101. {notebook-7.4.4.dist-info → notebook-7.4.5.dist-info}/RECORD +124 -124
  102. notebook/static/2955.d8fd055f03b878034fe4.js.map +0 -1
  103. notebook/static/5261.f12a52481f4cee8ba676.js.map +0 -1
  104. notebook/static/main.58cb79c84cf80ba7b6ed.js +0 -1180
  105. notebook/static/main.58cb79c84cf80ba7b6ed.js.map +0 -1
  106. notebook-7.4.4.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/557.2f882aef2c303890736d.js +0 -1
  107. notebook-7.4.4.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/928.7e52f03b261ea07bcb3d.js +0 -1
  108. notebook-7.4.4.data/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/remoteEntry.da0f2149411be83933cb.js +0 -1
  109. {notebook-7.4.4.data → notebook-7.4.5.data}/data/etc/jupyter/jupyter_server_config.d/notebook.json +0 -0
  110. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/applications/jupyter-notebook.desktop +0 -0
  111. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/icons/hicolor/scalable/apps/notebook.svg +0 -0
  112. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/menus.json +0 -0
  113. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/pages.json +0 -0
  114. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/shell.json +0 -0
  115. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/title.json +0 -0
  116. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/top.json +0 -0
  117. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/application-extension/zen.json +0 -0
  118. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/help-extension/open.json +0 -0
  119. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/checkpoints.json +0 -0
  120. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/edit-notebook-metadata.json +0 -0
  121. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/full-width-notebook.json +0 -0
  122. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/kernel-logo.json +0 -0
  123. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/notebook-extension/scroll-output.json +0 -0
  124. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/tree-extension/file-actions.json +0 -0
  125. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/lab/schemas/@jupyter-notebook/tree-extension/widget.json +0 -0
  126. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/schemas/@jupyter-notebook/lab-extension/interface-switcher.json +0 -0
  127. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/schemas/@jupyter-notebook/lab-extension/launch-tree.json +0 -0
  128. {notebook-7.4.4.data → notebook-7.4.5.data}/data/share/jupyter/labextensions/@jupyter-notebook/lab-extension/static/style.js +0 -0
  129. {notebook-7.4.4.dist-info → notebook-7.4.5.dist-info}/WHEEL +0 -0
  130. {notebook-7.4.4.dist-info → notebook-7.4.5.dist-info}/entry_points.txt +0 -0
  131. {notebook-7.4.4.dist-info → notebook-7.4.5.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"8313.45ac616d61cf717bff16.js?v=45ac616d61cf717bff16","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA6G;AACqG;AAC1L;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8DAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,sBAAsB,gEAAa;AACnC,8BAA8B,gEAAa;AAC3C;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;;AAE5D,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,0DAAG,YAAY,kDAAkD;AACjF,cAAc,0DAAG;AACjB;AACA;AACA,uCAAuC;AACvC;AACA,gCAAgC,iCAAiC;AACjE;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK,EAAE,0DAAG,8DAA8D,0DAAG,aAAa,oCAAoC,4BAA4B,0DAAG;AAC3J;AACA;AACA,4BAA4B,iCAAiC;AAC7D;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8DAAe;AACvC;AACA,8CAA8C,wDAAU,kCAAkC,aAAa;AACvG;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb;AACA,kCAAkC,0DAAW;AAC7C,iCAAiC,yDAAU;AAC3C,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,kBAAkB,uDAAS;AAC3B,CAAC;AACD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0DAAQ;AACxB;AACA;AACA;AACA,yBAAyB,0DAAW;AACpC,wBAAwB,SAAS;AACjC,gBAAgB,0DAAQ;AACxB;AACA;AACA;AACA;AACA;AACA,iCAAiC,wDAAU;AAC3C;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,oDAAK;AAC1C;AACA,eAAe,gEAAa;AAC5B;AACA;AACA;AACA,SAAS;AACT;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAU,QAAQ,4BAA4B;AAC7E,mCAAmC,wDAAU,QAAQ,mDAAmD;AACxG;AACA;AACA,kEAAkE,2DAAY;AAC9E,wEAAwE,2DAAY;AACpF;AACA;AACA;AACA,oDAAoD,2DAAY;AAChE,gDAAgD,2DAAY;AAC5D;AACA,sCAAsC,wDAAU;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,mBAAmB,wDAAU;AAC7B;AACA;AACA;AACA,uBAAuB,wDAAU;AACjC;AACA;AACA,uBAAuB,wDAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wDAAU;AACjC;AACA,8DAA8D;AAC9D;AACA;AACA;AACA,2BAA2B,wDAAU;AACrC;AACA;AACA;AACA;AACA,2BAA2B,wDAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAU;AACzC;AACA;AACA;AACA,eAAe,wDAAU;AACzB;AACA,CAAC;AACD;AACA,CAAC;AACD,kCAAkC,wDAAU;AAC5C,4BAA4B,8BAA8B;AAC1D,4CAA4C;AAC5C,CAAC;AACD;AACA,sBAAsB,iBAAiB;AACvC,UAAU,YAAY;AACtB,iBAAiB,8DAAe,kEAAkE,8DAAe;AACjH;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA,UAAU,eAAe;AACzB;AACA,wGAAwG;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD,UAAU,SAAS;AACnB;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,8DAAe;AAC3D,iBAAiB,wDAAU;AAC3B,KAAK;AACL;AACA;;AAEA,uCAAuC,oDAAK;AAC5C;AACA,eAAe,gEAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wDAAU;AAC9C,SAAS;AACT;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAW,UAAU,YAAY;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,2DAAY;AAC3E,0DAA0D,2DAAY;AACtE,yDAAyD,2DAAY;AACrE,6DAA6D,2DAAY;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,qBAAqB,mEAAgB;AACrC;AACA;AACA,4BAA4B,mEAAgB;AAC5C;AACA;AACA;AACA,8DAA8D,2DAAY;AAC1E,gEAAgE,2DAAY;AAC5E,mFAAmF,2DAAY;AAC/F,uFAAuF,2DAAY;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0DAAW;AAC/C,iCAAiC,0DAAW;AAC5C,iCAAiC,yDAAU;AAC3C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,kBAAkB,uDAAS;AAC3B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAU,QAAQ,yBAAyB,oCAAoC,wDAAU,QAAQ,iDAAiD;AACjL,uCAAuC,wDAAU;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA,mBAAmB,wDAAU;AAC7B,cAAc,OAAO;AACrB,0BAA0B,8DAAe;AACzC,wEAAwE,OAAO;AAC/E,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D,UAAU,KAAK;AACf;AACA;AACA;AACA,oBAAoB,8DAAe;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,yDAAyD,OAAO;AAChE,UAAU,QAAQ,UAAU,OAAO;AACnC;AACA;AACA;AACA,oBAAoB,8DAAe;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,0DAA0D,OAAO;AACjE;AACA;AACA;AACA;AACA,mBAAmB,8DAAe,wBAAwB,8DAAe;AACzE;AACA,KAAK;AACL;AACA,CAAC;AACD;AACA;AACA;AACA,kCAAkC,iBAAiB;AACnD;AACA;AACA;AACA,UAAU,WAAW;AACrB;AACA,0EAA0E,iBAAiB;AAC3F;AACA;AACA;AACA;AACA,oBAAoB,8DAAe;AACnC;AACA;AACA,mBAAmB,8DAAe;AAClC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,wDAAwD,OAAO;AAC/D,UAAU,QAAQ,UAAU,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mDAAmD;AAC1E;AACA,qBAAqB,wDAAU;AAC/B;AACA;AACA;AACA,oBAAoB,8DAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA,cAAc,WAAW;AACzB,iBAAiB;AACjB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,iBAAiB,wDAAU;AAC3B;AACA,KAAK;AACL;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,0DAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,wFAAwF,0DAAW;AACnG,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0DAAQ;AACxB;AACA;AACA,oBAAoB,gCAAgC;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,kEAAkE;AACxE,MAAM,mGAAmG;AACzG,MAAM,sGAAsG;AAC5G,MAAM,oEAAoE;AAC1E,MAAM,iDAAiD;AACvD,MAAM,iCAAiC;AACvC,MAAM,+DAA+D;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B,0DAAG;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,yBAAyB,0DAAG;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,uBAAuB,0DAAG;AAC1B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,yBAAyB,0DAAG;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,0DAAG,aAAa,mDAAmD;AACtF;AACA,mBAAmB,0DAAG,UAAU,uDAAuD;AACvF;AACA;AACA;AACA;AACA,YAAY,0DAAG;AACf,YAAY,0DAAG;AACf,YAAY,0DAAG;AACf;AACA,gBAAgB,0DAAG;AACnB;AACA;AACA;AACA;AACA,YAAY,0DAAG;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,iCAAiC,mCAAmC;AACpE;AACA;AACA;AACA,YAAY,kEAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,gBAAgB;AAChB;AACA,gCAAgC;AAChC;AACA,uBAAuB;AACvB,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,kCAAkC;AACxE;AACA;AACA;AACA;AACA;AACA,WAAW,wDAAU,gBAAgB,mCAAmC,IAAI,MAAM,EAAE,8BAA8B,EAAE,YAAY;AAChI;AACA,+BAA+B,wDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL,gCAAgC,8BAA8B;AAC9D,+BAA+B,8BAA8B;AAC7D,yCAAyC,8BAA8B;AACvE,wCAAwC;AACxC,CAAC;AACD;AACA;AACA,iBAAiB,mDAAI;AACrB;AACA;;AAEgT;;;;;;;;;;;ACluCjS;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,sBAAsB;AAC/B;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ,IAAI;AACJ;AACA,IAAI;AACJ,oBAAoB,kBAAkB;AACtC,IAAI;AACJ;AACA;AACA","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/@codemirror/search/dist/index.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/crelt/index.js"],"sourcesContent":["import { showPanel, EditorView, getPanel, Decoration, ViewPlugin, runScopeHandlers } from '@codemirror/view';\nimport { codePointAt, fromCodePoint, codePointSize, StateEffect, StateField, EditorSelection, Facet, combineConfig, CharCategory, RangeSetBuilder, Prec, EditorState, findClusterBreak } from '@codemirror/state';\nimport elt from 'crelt';\n\nconst basicNormalize = typeof String.prototype.normalize == \"function\"\n ? x => x.normalize(\"NFKD\") : x => x;\n/**\nA search cursor provides an iterator over text matches in a\ndocument.\n*/\nclass SearchCursor {\n /**\n Create a text cursor. The query is the search string, `from` to\n `to` provides the region to search.\n \n When `normalize` is given, it will be called, on both the query\n string and the content it is matched against, before comparing.\n You can, for example, create a case-insensitive search by\n passing `s => s.toLowerCase()`.\n \n Text is always normalized with\n [`.normalize(\"NFKD\")`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)\n (when supported).\n */\n constructor(text, query, from = 0, to = text.length, normalize, test) {\n this.test = test;\n /**\n The current match (only holds a meaningful value after\n [`next`](https://codemirror.net/6/docs/ref/#search.SearchCursor.next) has been called and when\n `done` is false).\n */\n this.value = { from: 0, to: 0 };\n /**\n Whether the end of the iterated region has been reached.\n */\n this.done = false;\n this.matches = [];\n this.buffer = \"\";\n this.bufferPos = 0;\n this.iter = text.iterRange(from, to);\n this.bufferStart = from;\n this.normalize = normalize ? x => normalize(basicNormalize(x)) : basicNormalize;\n this.query = this.normalize(query);\n }\n peek() {\n if (this.bufferPos == this.buffer.length) {\n this.bufferStart += this.buffer.length;\n this.iter.next();\n if (this.iter.done)\n return -1;\n this.bufferPos = 0;\n this.buffer = this.iter.value;\n }\n return codePointAt(this.buffer, this.bufferPos);\n }\n /**\n Look for the next match. Updates the iterator's\n [`value`](https://codemirror.net/6/docs/ref/#search.SearchCursor.value) and\n [`done`](https://codemirror.net/6/docs/ref/#search.SearchCursor.done) properties. Should be called\n at least once before using the cursor.\n */\n next() {\n while (this.matches.length)\n this.matches.pop();\n return this.nextOverlapping();\n }\n /**\n The `next` method will ignore matches that partially overlap a\n previous match. This method behaves like `next`, but includes\n such matches.\n */\n nextOverlapping() {\n for (;;) {\n let next = this.peek();\n if (next < 0) {\n this.done = true;\n return this;\n }\n let str = fromCodePoint(next), start = this.bufferStart + this.bufferPos;\n this.bufferPos += codePointSize(next);\n let norm = this.normalize(str);\n if (norm.length)\n for (let i = 0, pos = start;; i++) {\n let code = norm.charCodeAt(i);\n let match = this.match(code, pos, this.bufferPos + this.bufferStart);\n if (i == norm.length - 1) {\n if (match) {\n this.value = match;\n return this;\n }\n break;\n }\n if (pos == start && i < str.length && str.charCodeAt(i) == code)\n pos++;\n }\n }\n }\n match(code, pos, end) {\n let match = null;\n for (let i = 0; i < this.matches.length; i += 2) {\n let index = this.matches[i], keep = false;\n if (this.query.charCodeAt(index) == code) {\n if (index == this.query.length - 1) {\n match = { from: this.matches[i + 1], to: end };\n }\n else {\n this.matches[i]++;\n keep = true;\n }\n }\n if (!keep) {\n this.matches.splice(i, 2);\n i -= 2;\n }\n }\n if (this.query.charCodeAt(0) == code) {\n if (this.query.length == 1)\n match = { from: pos, to: end };\n else\n this.matches.push(1, pos);\n }\n if (match && this.test && !this.test(match.from, match.to, this.buffer, this.bufferStart))\n match = null;\n return match;\n }\n}\nif (typeof Symbol != \"undefined\")\n SearchCursor.prototype[Symbol.iterator] = function () { return this; };\n\nconst empty = { from: -1, to: -1, match: /*@__PURE__*//.*/.exec(\"\") };\nconst baseFlags = \"gm\" + (/x/.unicode == null ? \"\" : \"u\");\n/**\nThis class is similar to [`SearchCursor`](https://codemirror.net/6/docs/ref/#search.SearchCursor)\nbut searches for a regular expression pattern instead of a plain\nstring.\n*/\nclass RegExpCursor {\n /**\n Create a cursor that will search the given range in the given\n document. `query` should be the raw pattern (as you'd pass it to\n `new RegExp`).\n */\n constructor(text, query, options, from = 0, to = text.length) {\n this.text = text;\n this.to = to;\n this.curLine = \"\";\n /**\n Set to `true` when the cursor has reached the end of the search\n range.\n */\n this.done = false;\n /**\n Will contain an object with the extent of the match and the\n match object when [`next`](https://codemirror.net/6/docs/ref/#search.RegExpCursor.next)\n sucessfully finds a match.\n */\n this.value = empty;\n if (/\\\\[sWDnr]|\\n|\\r|\\[\\^/.test(query))\n return new MultilineRegExpCursor(text, query, options, from, to);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.iter = text.iter();\n let startLine = text.lineAt(from);\n this.curLineStart = startLine.from;\n this.matchPos = toCharEnd(text, from);\n this.getLine(this.curLineStart);\n }\n getLine(skip) {\n this.iter.next(skip);\n if (this.iter.lineBreak) {\n this.curLine = \"\";\n }\n else {\n this.curLine = this.iter.value;\n if (this.curLineStart + this.curLine.length > this.to)\n this.curLine = this.curLine.slice(0, this.to - this.curLineStart);\n this.iter.next();\n }\n }\n nextLine() {\n this.curLineStart = this.curLineStart + this.curLine.length + 1;\n if (this.curLineStart > this.to)\n this.curLine = \"\";\n else\n this.getLine(0);\n }\n /**\n Move to the next match, if there is one.\n */\n next() {\n for (let off = this.matchPos - this.curLineStart;;) {\n this.re.lastIndex = off;\n let match = this.matchPos <= this.to && this.re.exec(this.curLine);\n if (match) {\n let from = this.curLineStart + match.index, to = from + match[0].length;\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n if (from == this.curLineStart + this.curLine.length)\n this.nextLine();\n if ((from < to || from > this.value.to) && (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n return this;\n }\n off = this.matchPos - this.curLineStart;\n }\n else if (this.curLineStart + this.curLine.length < this.to) {\n this.nextLine();\n off = 0;\n }\n else {\n this.done = true;\n return this;\n }\n }\n }\n}\nconst flattened = /*@__PURE__*/new WeakMap();\n// Reusable (partially) flattened document strings\nclass FlattenedDoc {\n constructor(from, text) {\n this.from = from;\n this.text = text;\n }\n get to() { return this.from + this.text.length; }\n static get(doc, from, to) {\n let cached = flattened.get(doc);\n if (!cached || cached.from >= to || cached.to <= from) {\n let flat = new FlattenedDoc(from, doc.sliceString(from, to));\n flattened.set(doc, flat);\n return flat;\n }\n if (cached.from == from && cached.to == to)\n return cached;\n let { text, from: cachedFrom } = cached;\n if (cachedFrom > from) {\n text = doc.sliceString(from, cachedFrom) + text;\n cachedFrom = from;\n }\n if (cached.to < to)\n text += doc.sliceString(cached.to, to);\n flattened.set(doc, new FlattenedDoc(cachedFrom, text));\n return new FlattenedDoc(from, text.slice(from - cachedFrom, to - cachedFrom));\n }\n}\nclass MultilineRegExpCursor {\n constructor(text, query, options, from, to) {\n this.text = text;\n this.to = to;\n this.done = false;\n this.value = empty;\n this.matchPos = toCharEnd(text, from);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /* Chunk.Base */));\n }\n chunkEnd(pos) {\n return pos >= this.to ? this.to : this.text.lineAt(pos).to;\n }\n next() {\n for (;;) {\n let off = this.re.lastIndex = this.matchPos - this.flat.from;\n let match = this.re.exec(this.flat.text);\n // Skip empty matches directly after the last match\n if (match && !match[0] && match.index == off) {\n this.re.lastIndex = off + 1;\n match = this.re.exec(this.flat.text);\n }\n if (match) {\n let from = this.flat.from + match.index, to = from + match[0].length;\n // If a match goes almost to the end of a noncomplete chunk, try\n // again, since it'll likely be able to match more\n if ((this.flat.to >= this.to || match.index + match[0].length <= this.flat.text.length - 10) &&\n (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n return this;\n }\n }\n if (this.flat.to == this.to) {\n this.done = true;\n return this;\n }\n // Grow the flattened doc\n this.flat = FlattenedDoc.get(this.text, this.flat.from, this.chunkEnd(this.flat.from + this.flat.text.length * 2));\n }\n }\n}\nif (typeof Symbol != \"undefined\") {\n RegExpCursor.prototype[Symbol.iterator] = MultilineRegExpCursor.prototype[Symbol.iterator] =\n function () { return this; };\n}\nfunction validRegExp(source) {\n try {\n new RegExp(source, baseFlags);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction toCharEnd(text, pos) {\n if (pos >= text.length)\n return pos;\n let line = text.lineAt(pos), next;\n while (pos < line.to && (next = line.text.charCodeAt(pos - line.from)) >= 0xDC00 && next < 0xE000)\n pos++;\n return pos;\n}\n\nfunction createLineDialog(view) {\n let line = String(view.state.doc.lineAt(view.state.selection.main.head).number);\n let input = elt(\"input\", { class: \"cm-textfield\", name: \"line\", value: line });\n let dom = elt(\"form\", {\n class: \"cm-gotoLine\",\n onkeydown: (event) => {\n if (event.keyCode == 27) { // Escape\n event.preventDefault();\n view.dispatch({ effects: dialogEffect.of(false) });\n view.focus();\n }\n else if (event.keyCode == 13) { // Enter\n event.preventDefault();\n go();\n }\n },\n onsubmit: (event) => {\n event.preventDefault();\n go();\n }\n }, elt(\"label\", view.state.phrase(\"Go to line\"), \": \", input), \" \", elt(\"button\", { class: \"cm-button\", type: \"submit\" }, view.state.phrase(\"go\")), elt(\"button\", {\n name: \"close\",\n onclick: () => {\n view.dispatch({ effects: dialogEffect.of(false) });\n view.focus();\n },\n \"aria-label\": view.state.phrase(\"close\"),\n type: \"button\"\n }, [\"×\"]));\n function go() {\n let match = /^([+-])?(\\d+)?(:\\d+)?(%)?$/.exec(input.value);\n if (!match)\n return;\n let { state } = view, startLine = state.doc.lineAt(state.selection.main.head);\n let [, sign, ln, cl, percent] = match;\n let col = cl ? +cl.slice(1) : 0;\n let line = ln ? +ln : startLine.number;\n if (ln && percent) {\n let pc = line / 100;\n if (sign)\n pc = pc * (sign == \"-\" ? -1 : 1) + (startLine.number / state.doc.lines);\n line = Math.round(state.doc.lines * pc);\n }\n else if (ln && sign) {\n line = line * (sign == \"-\" ? -1 : 1) + startLine.number;\n }\n let docLine = state.doc.line(Math.max(1, Math.min(state.doc.lines, line)));\n let selection = EditorSelection.cursor(docLine.from + Math.max(0, Math.min(col, docLine.length)));\n view.dispatch({\n effects: [dialogEffect.of(false), EditorView.scrollIntoView(selection.from, { y: 'center' })],\n selection,\n });\n view.focus();\n }\n return { dom };\n}\nconst dialogEffect = /*@__PURE__*/StateEffect.define();\nconst dialogField = /*@__PURE__*/StateField.define({\n create() { return true; },\n update(value, tr) {\n for (let e of tr.effects)\n if (e.is(dialogEffect))\n value = e.value;\n return value;\n },\n provide: f => showPanel.from(f, val => val ? createLineDialog : null)\n});\n/**\nCommand that shows a dialog asking the user for a line number, and\nwhen a valid position is provided, moves the cursor to that line.\n\nSupports line numbers, relative line offsets prefixed with `+` or\n`-`, document percentages suffixed with `%`, and an optional\ncolumn position by adding `:` and a second number after the line\nnumber.\n*/\nconst gotoLine = view => {\n let panel = getPanel(view, createLineDialog);\n if (!panel) {\n let effects = [dialogEffect.of(true)];\n if (view.state.field(dialogField, false) == null)\n effects.push(StateEffect.appendConfig.of([dialogField, baseTheme$1]));\n view.dispatch({ effects });\n panel = getPanel(view, createLineDialog);\n }\n if (panel)\n panel.dom.querySelector(\"input\").select();\n return true;\n};\nconst baseTheme$1 = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-gotoLine\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& label\": { fontSize: \"80%\" },\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\", bottom: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: \"0\"\n }\n }\n});\n\nconst defaultHighlightOptions = {\n highlightWordAroundCursor: false,\n minSelectionLength: 1,\n maxMatches: 100,\n wholeWords: false\n};\nconst highlightConfig = /*@__PURE__*/Facet.define({\n combine(options) {\n return combineConfig(options, defaultHighlightOptions, {\n highlightWordAroundCursor: (a, b) => a || b,\n minSelectionLength: Math.min,\n maxMatches: Math.min\n });\n }\n});\n/**\nThis extension highlights text that matches the selection. It uses\nthe `\"cm-selectionMatch\"` class for the highlighting. When\n`highlightWordAroundCursor` is enabled, the word at the cursor\nitself will be highlighted with `\"cm-selectionMatch-main\"`.\n*/\nfunction highlightSelectionMatches(options) {\n let ext = [defaultTheme, matchHighlighter];\n if (options)\n ext.push(highlightConfig.of(options));\n return ext;\n}\nconst matchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch\" });\nconst mainMatchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch cm-selectionMatch-main\" });\n// Whether the characters directly outside the given positions are non-word characters\nfunction insideWordBoundaries(check, state, from, to) {\n return (from == 0 || check(state.sliceDoc(from - 1, from)) != CharCategory.Word) &&\n (to == state.doc.length || check(state.sliceDoc(to, to + 1)) != CharCategory.Word);\n}\n// Whether the characters directly at the given positions are word characters\nfunction insideWord(check, state, from, to) {\n return check(state.sliceDoc(from, from + 1)) == CharCategory.Word\n && check(state.sliceDoc(to - 1, to)) == CharCategory.Word;\n}\nconst matchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.decorations = this.getDeco(view);\n }\n update(update) {\n if (update.selectionSet || update.docChanged || update.viewportChanged)\n this.decorations = this.getDeco(update.view);\n }\n getDeco(view) {\n let conf = view.state.facet(highlightConfig);\n let { state } = view, sel = state.selection;\n if (sel.ranges.length > 1)\n return Decoration.none;\n let range = sel.main, query, check = null;\n if (range.empty) {\n if (!conf.highlightWordAroundCursor)\n return Decoration.none;\n let word = state.wordAt(range.head);\n if (!word)\n return Decoration.none;\n check = state.charCategorizer(range.head);\n query = state.sliceDoc(word.from, word.to);\n }\n else {\n let len = range.to - range.from;\n if (len < conf.minSelectionLength || len > 200)\n return Decoration.none;\n if (conf.wholeWords) {\n query = state.sliceDoc(range.from, range.to); // TODO: allow and include leading/trailing space?\n check = state.charCategorizer(range.head);\n if (!(insideWordBoundaries(check, state, range.from, range.to) &&\n insideWord(check, state, range.from, range.to)))\n return Decoration.none;\n }\n else {\n query = state.sliceDoc(range.from, range.to);\n if (!query)\n return Decoration.none;\n }\n }\n let deco = [];\n for (let part of view.visibleRanges) {\n let cursor = new SearchCursor(state.doc, query, part.from, part.to);\n while (!cursor.next().done) {\n let { from, to } = cursor.value;\n if (!check || insideWordBoundaries(check, state, from, to)) {\n if (range.empty && from <= range.from && to >= range.to)\n deco.push(mainMatchDeco.range(from, to));\n else if (from >= range.to || to <= range.from)\n deco.push(matchDeco.range(from, to));\n if (deco.length > conf.maxMatches)\n return Decoration.none;\n }\n }\n }\n return Decoration.set(deco);\n }\n}, {\n decorations: v => v.decorations\n});\nconst defaultTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-selectionMatch\": { backgroundColor: \"#99ff7780\" },\n \".cm-searchMatch .cm-selectionMatch\": { backgroundColor: \"transparent\" }\n});\n// Select the words around the cursors.\nconst selectWord = ({ state, dispatch }) => {\n let { selection } = state;\n let newSel = EditorSelection.create(selection.ranges.map(range => state.wordAt(range.head) || EditorSelection.cursor(range.head)), selection.mainIndex);\n if (newSel.eq(selection))\n return false;\n dispatch(state.update({ selection: newSel }));\n return true;\n};\n// Find next occurrence of query relative to last cursor. Wrap around\n// the document if there are no more matches.\nfunction findNextOccurrence(state, query) {\n let { main, ranges } = state.selection;\n let word = state.wordAt(main.head), fullWord = word && word.from == main.from && word.to == main.to;\n for (let cycled = false, cursor = new SearchCursor(state.doc, query, ranges[ranges.length - 1].to);;) {\n cursor.next();\n if (cursor.done) {\n if (cycled)\n return null;\n cursor = new SearchCursor(state.doc, query, 0, Math.max(0, ranges[ranges.length - 1].from - 1));\n cycled = true;\n }\n else {\n if (cycled && ranges.some(r => r.from == cursor.value.from))\n continue;\n if (fullWord) {\n let word = state.wordAt(cursor.value.from);\n if (!word || word.from != cursor.value.from || word.to != cursor.value.to)\n continue;\n }\n return cursor.value;\n }\n }\n}\n/**\nSelect next occurrence of the current selection. Expand selection\nto the surrounding word when the selection is empty.\n*/\nconst selectNextOccurrence = ({ state, dispatch }) => {\n let { ranges } = state.selection;\n if (ranges.some(sel => sel.from === sel.to))\n return selectWord({ state, dispatch });\n let searchedText = state.sliceDoc(ranges[0].from, ranges[0].to);\n if (state.selection.ranges.some(r => state.sliceDoc(r.from, r.to) != searchedText))\n return false;\n let range = findNextOccurrence(state, searchedText);\n if (!range)\n return false;\n dispatch(state.update({\n selection: state.selection.addRange(EditorSelection.range(range.from, range.to), false),\n effects: EditorView.scrollIntoView(range.to)\n }));\n return true;\n};\n\nconst searchConfigFacet = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n top: false,\n caseSensitive: false,\n literal: false,\n regexp: false,\n wholeWord: false,\n createPanel: view => new SearchPanel(view),\n scrollToMatch: range => EditorView.scrollIntoView(range)\n });\n }\n});\n/**\nAdd search state to the editor configuration, and optionally\nconfigure the search extension.\n([`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) will automatically\nenable this if it isn't already on).\n*/\nfunction search(config) {\n return config ? [searchConfigFacet.of(config), searchExtensions] : searchExtensions;\n}\n/**\nA search query. Part of the editor's search state.\n*/\nclass SearchQuery {\n /**\n Create a query object.\n */\n constructor(config) {\n this.search = config.search;\n this.caseSensitive = !!config.caseSensitive;\n this.literal = !!config.literal;\n this.regexp = !!config.regexp;\n this.replace = config.replace || \"\";\n this.valid = !!this.search && (!this.regexp || validRegExp(this.search));\n this.unquoted = this.unquote(this.search);\n this.wholeWord = !!config.wholeWord;\n }\n /**\n @internal\n */\n unquote(text) {\n return this.literal ? text :\n text.replace(/\\\\([nrt\\\\])/g, (_, ch) => ch == \"n\" ? \"\\n\" : ch == \"r\" ? \"\\r\" : ch == \"t\" ? \"\\t\" : \"\\\\\");\n }\n /**\n Compare this query to another query.\n */\n eq(other) {\n return this.search == other.search && this.replace == other.replace &&\n this.caseSensitive == other.caseSensitive && this.regexp == other.regexp &&\n this.wholeWord == other.wholeWord;\n }\n /**\n @internal\n */\n create() {\n return this.regexp ? new RegExpQuery(this) : new StringQuery(this);\n }\n /**\n Get a search cursor for this query, searching through the given\n range in the given state.\n */\n getCursor(state, from = 0, to) {\n let st = state.doc ? state : EditorState.create({ doc: state });\n if (to == null)\n to = st.doc.length;\n return this.regexp ? regexpCursor(this, st, from, to) : stringCursor(this, st, from, to);\n }\n}\nclass QueryType {\n constructor(spec) {\n this.spec = spec;\n }\n}\nfunction stringCursor(spec, state, from, to) {\n return new SearchCursor(state.doc, spec.unquoted, from, to, spec.caseSensitive ? undefined : x => x.toLowerCase(), spec.wholeWord ? stringWordTest(state.doc, state.charCategorizer(state.selection.main.head)) : undefined);\n}\nfunction stringWordTest(doc, categorizer) {\n return (from, to, buf, bufPos) => {\n if (bufPos > from || bufPos + buf.length < to) {\n bufPos = Math.max(0, from - 2);\n buf = doc.sliceString(bufPos, Math.min(doc.length, to + 2));\n }\n return (categorizer(charBefore(buf, from - bufPos)) != CharCategory.Word ||\n categorizer(charAfter(buf, from - bufPos)) != CharCategory.Word) &&\n (categorizer(charAfter(buf, to - bufPos)) != CharCategory.Word ||\n categorizer(charBefore(buf, to - bufPos)) != CharCategory.Word);\n };\n}\nclass StringQuery extends QueryType {\n constructor(spec) {\n super(spec);\n }\n nextMatch(state, curFrom, curTo) {\n let cursor = stringCursor(this.spec, state, curTo, state.doc.length).nextOverlapping();\n if (cursor.done) {\n let end = Math.min(state.doc.length, curFrom + this.spec.unquoted.length);\n cursor = stringCursor(this.spec, state, 0, end).nextOverlapping();\n }\n return cursor.done || cursor.value.from == curFrom && cursor.value.to == curTo ? null : cursor.value;\n }\n // Searching in reverse is, rather than implementing an inverted search\n // cursor, done by scanning chunk after chunk forward.\n prevMatchInRange(state, from, to) {\n for (let pos = to;;) {\n let start = Math.max(from, pos - 10000 /* FindPrev.ChunkSize */ - this.spec.unquoted.length);\n let cursor = stringCursor(this.spec, state, start, pos), range = null;\n while (!cursor.nextOverlapping().done)\n range = cursor.value;\n if (range)\n return range;\n if (start == from)\n return null;\n pos -= 10000 /* FindPrev.ChunkSize */;\n }\n }\n prevMatch(state, curFrom, curTo) {\n let found = this.prevMatchInRange(state, 0, curFrom);\n if (!found)\n found = this.prevMatchInRange(state, Math.max(0, curTo - this.spec.unquoted.length), state.doc.length);\n return found && (found.from != curFrom || found.to != curTo) ? found : null;\n }\n getReplacement(_result) { return this.spec.unquote(this.spec.replace); }\n matchAll(state, limit) {\n let cursor = stringCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = stringCursor(this.spec, state, Math.max(0, from - this.spec.unquoted.length), Math.min(to + this.spec.unquoted.length, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\nfunction regexpCursor(spec, state, from, to) {\n return new RegExpCursor(state.doc, spec.search, {\n ignoreCase: !spec.caseSensitive,\n test: spec.wholeWord ? regexpWordTest(state.charCategorizer(state.selection.main.head)) : undefined\n }, from, to);\n}\nfunction charBefore(str, index) {\n return str.slice(findClusterBreak(str, index, false), index);\n}\nfunction charAfter(str, index) {\n return str.slice(index, findClusterBreak(str, index));\n}\nfunction regexpWordTest(categorizer) {\n return (_from, _to, match) => !match[0].length ||\n (categorizer(charBefore(match.input, match.index)) != CharCategory.Word ||\n categorizer(charAfter(match.input, match.index)) != CharCategory.Word) &&\n (categorizer(charAfter(match.input, match.index + match[0].length)) != CharCategory.Word ||\n categorizer(charBefore(match.input, match.index + match[0].length)) != CharCategory.Word);\n}\nclass RegExpQuery extends QueryType {\n nextMatch(state, curFrom, curTo) {\n let cursor = regexpCursor(this.spec, state, curTo, state.doc.length).next();\n if (cursor.done)\n cursor = regexpCursor(this.spec, state, 0, curFrom).next();\n return cursor.done ? null : cursor.value;\n }\n prevMatchInRange(state, from, to) {\n for (let size = 1;; size++) {\n let start = Math.max(from, to - size * 10000 /* FindPrev.ChunkSize */);\n let cursor = regexpCursor(this.spec, state, start, to), range = null;\n while (!cursor.next().done)\n range = cursor.value;\n if (range && (start == from || range.from > start + 10))\n return range;\n if (start == from)\n return null;\n }\n }\n prevMatch(state, curFrom, curTo) {\n return this.prevMatchInRange(state, 0, curFrom) ||\n this.prevMatchInRange(state, curTo, state.doc.length);\n }\n getReplacement(result) {\n return this.spec.unquote(this.spec.replace).replace(/\\$([$&]|\\d+)/g, (m, i) => {\n if (i == \"&\")\n return result.match[0];\n if (i == \"$\")\n return \"$\";\n for (let l = i.length; l > 0; l--) {\n let n = +i.slice(0, l);\n if (n > 0 && n < result.match.length)\n return result.match[n] + i.slice(l);\n }\n return m;\n });\n }\n matchAll(state, limit) {\n let cursor = regexpCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /* RegExp.HighlightMargin */), Math.min(to + 250 /* RegExp.HighlightMargin */, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\n/**\nA state effect that updates the current search query. Note that\nthis only has an effect if the search state has been initialized\n(by including [`search`](https://codemirror.net/6/docs/ref/#search.search) in your configuration or\nby running [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) at least\nonce).\n*/\nconst setSearchQuery = /*@__PURE__*/StateEffect.define();\nconst togglePanel = /*@__PURE__*/StateEffect.define();\nconst searchState = /*@__PURE__*/StateField.define({\n create(state) {\n return new SearchState(defaultQuery(state).create(), null);\n },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery))\n value = new SearchState(effect.value.create(), value.panel);\n else if (effect.is(togglePanel))\n value = new SearchState(value.query, effect.value ? createSearchPanel : null);\n }\n return value;\n },\n provide: f => showPanel.from(f, val => val.panel)\n});\n/**\nGet the current search query from an editor state.\n*/\nfunction getSearchQuery(state) {\n let curState = state.field(searchState, false);\n return curState ? curState.query.spec : defaultQuery(state);\n}\n/**\nQuery whether the search panel is open in the given editor state.\n*/\nfunction searchPanelOpen(state) {\n var _a;\n return ((_a = state.field(searchState, false)) === null || _a === void 0 ? void 0 : _a.panel) != null;\n}\nclass SearchState {\n constructor(query, panel) {\n this.query = query;\n this.panel = panel;\n }\n}\nconst matchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch\" }), selectedMatchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch cm-searchMatch-selected\" });\nconst searchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.decorations = this.highlight(view.state.field(searchState));\n }\n update(update) {\n let state = update.state.field(searchState);\n if (state != update.startState.field(searchState) || update.docChanged || update.selectionSet || update.viewportChanged)\n this.decorations = this.highlight(state);\n }\n highlight({ query, panel }) {\n if (!panel || !query.spec.valid)\n return Decoration.none;\n let { view } = this;\n let builder = new RangeSetBuilder();\n for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {\n let { from, to } = ranges[i];\n while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /* RegExp.HighlightMargin */)\n to = ranges[++i].to;\n query.highlight(view.state, from, to, (from, to) => {\n let selected = view.state.selection.ranges.some(r => r.from == from && r.to == to);\n builder.add(from, to, selected ? selectedMatchMark : matchMark);\n });\n }\n return builder.finish();\n }\n}, {\n decorations: v => v.decorations\n});\nfunction searchCommand(f) {\n return view => {\n let state = view.state.field(searchState, false);\n return state && state.query.spec.valid ? f(view, state) : openSearchPanel(view);\n };\n}\n/**\nOpen the search panel if it isn't already open, and move the\nselection to the first match after the current main selection.\nWill wrap around to the start of the document when it reaches the\nend.\n*/\nconst findNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { to } = view.state.selection.main;\n let next = query.nextMatch(view.state, to, to);\n if (!next)\n return false;\n let selection = EditorSelection.single(next.from, next.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, next), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nMove the selection to the previous instance of the search query,\nbefore the current main selection. Will wrap past the start\nof the document to start searching at the end again.\n*/\nconst findPrevious = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from } = state.selection.main;\n let prev = query.prevMatch(state, from, from);\n if (!prev)\n return false;\n let selection = EditorSelection.single(prev.from, prev.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, prev), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nSelect all instances of the search query.\n*/\nconst selectMatches = /*@__PURE__*/searchCommand((view, { query }) => {\n let ranges = query.matchAll(view.state, 1000);\n if (!ranges || !ranges.length)\n return false;\n view.dispatch({\n selection: EditorSelection.create(ranges.map(r => EditorSelection.range(r.from, r.to))),\n userEvent: \"select.search.matches\"\n });\n return true;\n});\n/**\nSelect all instances of the currently selected text.\n*/\nconst selectSelectionMatches = ({ state, dispatch }) => {\n let sel = state.selection;\n if (sel.ranges.length > 1 || sel.main.empty)\n return false;\n let { from, to } = sel.main;\n let ranges = [], main = 0;\n for (let cur = new SearchCursor(state.doc, state.sliceDoc(from, to)); !cur.next().done;) {\n if (ranges.length > 1000)\n return false;\n if (cur.value.from == from)\n main = ranges.length;\n ranges.push(EditorSelection.range(cur.value.from, cur.value.to));\n }\n dispatch(state.update({\n selection: EditorSelection.create(ranges, main),\n userEvent: \"select.search.matches\"\n }));\n return true;\n};\n/**\nReplace the current match of the search query.\n*/\nconst replaceNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from, to } = state.selection.main;\n if (state.readOnly)\n return false;\n let match = query.nextMatch(state, from, from);\n if (!match)\n return false;\n let next = match;\n let changes = [], selection, replacement;\n let effects = [];\n if (next.from == from && next.to == to) {\n replacement = state.toText(query.getReplacement(next));\n changes.push({ from: next.from, to: next.to, insert: replacement });\n next = query.nextMatch(state, next.from, next.to);\n effects.push(EditorView.announce.of(state.phrase(\"replaced match on line $\", state.doc.lineAt(from).number) + \".\"));\n }\n if (next) {\n let off = changes.length == 0 || changes[0].from >= match.to ? 0 : match.to - match.from - replacement.length;\n selection = EditorSelection.single(next.from - off, next.to - off);\n effects.push(announceMatch(view, next));\n effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main, view));\n }\n view.dispatch({\n changes, selection, effects,\n userEvent: \"input.replace\"\n });\n return true;\n});\n/**\nReplace all instances of the search query with the given\nreplacement.\n*/\nconst replaceAll = /*@__PURE__*/searchCommand((view, { query }) => {\n if (view.state.readOnly)\n return false;\n let changes = query.matchAll(view.state, 1e9).map(match => {\n let { from, to } = match;\n return { from, to, insert: query.getReplacement(match) };\n });\n if (!changes.length)\n return false;\n let announceText = view.state.phrase(\"replaced $ matches\", changes.length) + \".\";\n view.dispatch({\n changes,\n effects: EditorView.announce.of(announceText),\n userEvent: \"input.replace.all\"\n });\n return true;\n});\nfunction createSearchPanel(view) {\n return view.state.facet(searchConfigFacet).createPanel(view);\n}\nfunction defaultQuery(state, fallback) {\n var _a, _b, _c, _d, _e;\n let sel = state.selection.main;\n let selText = sel.empty || sel.to > sel.from + 100 ? \"\" : state.sliceDoc(sel.from, sel.to);\n if (fallback && !selText)\n return fallback;\n let config = state.facet(searchConfigFacet);\n return new SearchQuery({\n search: ((_a = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _a !== void 0 ? _a : config.literal) ? selText : selText.replace(/\\n/g, \"\\\\n\"),\n caseSensitive: (_b = fallback === null || fallback === void 0 ? void 0 : fallback.caseSensitive) !== null && _b !== void 0 ? _b : config.caseSensitive,\n literal: (_c = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _c !== void 0 ? _c : config.literal,\n regexp: (_d = fallback === null || fallback === void 0 ? void 0 : fallback.regexp) !== null && _d !== void 0 ? _d : config.regexp,\n wholeWord: (_e = fallback === null || fallback === void 0 ? void 0 : fallback.wholeWord) !== null && _e !== void 0 ? _e : config.wholeWord\n });\n}\nfunction getSearchInput(view) {\n let panel = getPanel(view, createSearchPanel);\n return panel && panel.dom.querySelector(\"[main-field]\");\n}\nfunction selectSearchInput(view) {\n let input = getSearchInput(view);\n if (input && input == view.root.activeElement)\n input.select();\n}\n/**\nMake sure the search panel is open and focused.\n*/\nconst openSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (state && state.panel) {\n let searchInput = getSearchInput(view);\n if (searchInput && searchInput != view.root.activeElement) {\n let query = defaultQuery(view.state, state.query.spec);\n if (query.valid)\n view.dispatch({ effects: setSearchQuery.of(query) });\n searchInput.focus();\n searchInput.select();\n }\n }\n else {\n view.dispatch({ effects: [\n togglePanel.of(true),\n state ? setSearchQuery.of(defaultQuery(view.state, state.query.spec)) : StateEffect.appendConfig.of(searchExtensions)\n ] });\n }\n return true;\n};\n/**\nClose the search panel.\n*/\nconst closeSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (!state || !state.panel)\n return false;\n let panel = getPanel(view, createSearchPanel);\n if (panel && panel.dom.contains(view.root.activeElement))\n view.focus();\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n/**\nDefault search-related key bindings.\n\n - Mod-f: [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel)\n - F3, Mod-g: [`findNext`](https://codemirror.net/6/docs/ref/#search.findNext)\n - Shift-F3, Shift-Mod-g: [`findPrevious`](https://codemirror.net/6/docs/ref/#search.findPrevious)\n - Mod-Alt-g: [`gotoLine`](https://codemirror.net/6/docs/ref/#search.gotoLine)\n - Mod-d: [`selectNextOccurrence`](https://codemirror.net/6/docs/ref/#search.selectNextOccurrence)\n*/\nconst searchKeymap = [\n { key: \"Mod-f\", run: openSearchPanel, scope: \"editor search-panel\" },\n { key: \"F3\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Mod-g\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Escape\", run: closeSearchPanel, scope: \"editor search-panel\" },\n { key: \"Mod-Shift-l\", run: selectSelectionMatches },\n { key: \"Mod-Alt-g\", run: gotoLine },\n { key: \"Mod-d\", run: selectNextOccurrence, preventDefault: true },\n];\nclass SearchPanel {\n constructor(view) {\n this.view = view;\n let query = this.query = view.state.field(searchState).query.spec;\n this.commit = this.commit.bind(this);\n this.searchField = elt(\"input\", {\n value: query.search,\n placeholder: phrase(view, \"Find\"),\n \"aria-label\": phrase(view, \"Find\"),\n class: \"cm-textfield\",\n name: \"search\",\n form: \"\",\n \"main-field\": \"true\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.replaceField = elt(\"input\", {\n value: query.replace,\n placeholder: phrase(view, \"Replace\"),\n \"aria-label\": phrase(view, \"Replace\"),\n class: \"cm-textfield\",\n name: \"replace\",\n form: \"\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.caseField = elt(\"input\", {\n type: \"checkbox\",\n name: \"case\",\n form: \"\",\n checked: query.caseSensitive,\n onchange: this.commit\n });\n this.reField = elt(\"input\", {\n type: \"checkbox\",\n name: \"re\",\n form: \"\",\n checked: query.regexp,\n onchange: this.commit\n });\n this.wordField = elt(\"input\", {\n type: \"checkbox\",\n name: \"word\",\n form: \"\",\n checked: query.wholeWord,\n onchange: this.commit\n });\n function button(name, onclick, content) {\n return elt(\"button\", { class: \"cm-button\", name, onclick, type: \"button\" }, content);\n }\n this.dom = elt(\"div\", { onkeydown: (e) => this.keydown(e), class: \"cm-search\" }, [\n this.searchField,\n button(\"next\", () => findNext(view), [phrase(view, \"next\")]),\n button(\"prev\", () => findPrevious(view), [phrase(view, \"previous\")]),\n button(\"select\", () => selectMatches(view), [phrase(view, \"all\")]),\n elt(\"label\", null, [this.caseField, phrase(view, \"match case\")]),\n elt(\"label\", null, [this.reField, phrase(view, \"regexp\")]),\n elt(\"label\", null, [this.wordField, phrase(view, \"by word\")]),\n ...view.state.readOnly ? [] : [\n elt(\"br\"),\n this.replaceField,\n button(\"replace\", () => replaceNext(view), [phrase(view, \"replace\")]),\n button(\"replaceAll\", () => replaceAll(view), [phrase(view, \"replace all\")])\n ],\n elt(\"button\", {\n name: \"close\",\n onclick: () => closeSearchPanel(view),\n \"aria-label\": phrase(view, \"close\"),\n type: \"button\"\n }, [\"×\"])\n ]);\n }\n commit() {\n let query = new SearchQuery({\n search: this.searchField.value,\n caseSensitive: this.caseField.checked,\n regexp: this.reField.checked,\n wholeWord: this.wordField.checked,\n replace: this.replaceField.value,\n });\n if (!query.eq(this.query)) {\n this.query = query;\n this.view.dispatch({ effects: setSearchQuery.of(query) });\n }\n }\n keydown(e) {\n if (runScopeHandlers(this.view, e, \"search-panel\")) {\n e.preventDefault();\n }\n else if (e.keyCode == 13 && e.target == this.searchField) {\n e.preventDefault();\n (e.shiftKey ? findPrevious : findNext)(this.view);\n }\n else if (e.keyCode == 13 && e.target == this.replaceField) {\n e.preventDefault();\n replaceNext(this.view);\n }\n }\n update(update) {\n for (let tr of update.transactions)\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery) && !effect.value.eq(this.query))\n this.setQuery(effect.value);\n }\n }\n setQuery(query) {\n this.query = query;\n this.searchField.value = query.search;\n this.replaceField.value = query.replace;\n this.caseField.checked = query.caseSensitive;\n this.reField.checked = query.regexp;\n this.wordField.checked = query.wholeWord;\n }\n mount() {\n this.searchField.select();\n }\n get pos() { return 80; }\n get top() { return this.view.state.facet(searchConfigFacet).top; }\n}\nfunction phrase(view, phrase) { return view.state.phrase(phrase); }\nconst AnnounceMargin = 30;\nconst Break = /[\\s\\.,:;?!]/;\nfunction announceMatch(view, { from, to }) {\n let line = view.state.doc.lineAt(from), lineEnd = view.state.doc.lineAt(to).to;\n let start = Math.max(line.from, from - AnnounceMargin), end = Math.min(lineEnd, to + AnnounceMargin);\n let text = view.state.sliceDoc(start, end);\n if (start != line.from) {\n for (let i = 0; i < AnnounceMargin; i++)\n if (!Break.test(text[i + 1]) && Break.test(text[i])) {\n text = text.slice(i);\n break;\n }\n }\n if (end != lineEnd) {\n for (let i = text.length - 1; i > text.length - AnnounceMargin; i--)\n if (!Break.test(text[i - 1]) && Break.test(text[i])) {\n text = text.slice(0, i);\n break;\n }\n }\n return EditorView.announce.of(`${view.state.phrase(\"current match\")}. ${text} ${view.state.phrase(\"on line\")} ${line.number}.`);\n}\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-search\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: 0,\n margin: 0\n },\n \"& input, & button, & label\": {\n margin: \".2em .6em .2em 0\"\n },\n \"& input[type=checkbox]\": {\n marginRight: \".2em\"\n },\n \"& label\": {\n fontSize: \"80%\",\n whiteSpace: \"pre\"\n }\n },\n \"&light .cm-searchMatch\": { backgroundColor: \"#ffff0054\" },\n \"&dark .cm-searchMatch\": { backgroundColor: \"#00ffff8a\" },\n \"&light .cm-searchMatch-selected\": { backgroundColor: \"#ff6a0054\" },\n \"&dark .cm-searchMatch-selected\": { backgroundColor: \"#ff00ff8a\" }\n});\nconst searchExtensions = [\n searchState,\n /*@__PURE__*/Prec.low(searchHighlighter),\n baseTheme\n];\n\nexport { RegExpCursor, SearchCursor, SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, gotoLine, highlightSelectionMatches, openSearchPanel, replaceAll, replaceNext, search, searchKeymap, searchPanelOpen, selectMatches, selectNextOccurrence, selectSelectionMatches, setSearchQuery };\n","export default function crelt() {\n var elt = arguments[0]\n if (typeof elt == \"string\") elt = document.createElement(elt)\n var i = 1, next = arguments[1]\n if (next && typeof next == \"object\" && next.nodeType == null && !Array.isArray(next)) {\n for (var name in next) if (Object.prototype.hasOwnProperty.call(next, name)) {\n var value = next[name]\n if (typeof value == \"string\") elt.setAttribute(name, value)\n else if (value != null) elt[name] = value\n }\n i++\n }\n for (; i < arguments.length; i++) add(elt, arguments[i])\n return elt\n}\n\nfunction add(elt, child) {\n if (typeof child == \"string\") {\n elt.appendChild(document.createTextNode(child))\n } else if (child == null) {\n } else if (child.nodeType != null) {\n elt.appendChild(child)\n } else if (Array.isArray(child)) {\n for (var i = 0; i < child.length; i++) add(elt, child[i])\n } else {\n throw new RangeError(\"Unsupported child node: \" + child)\n }\n}\n"],"names":[],"sourceRoot":""}
@@ -8,33 +8,33 @@ __webpack_require__.r(__webpack_exports__);
8
8
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9
9
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
10
10
  /* harmony export */ });
11
- /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6646);
11
+ /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25949);
12
12
  /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__);
13
- /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11922);
13
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6803);
14
14
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
15
- /* harmony import */ var _jupyterlab_console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64190);
15
+ /* harmony import */ var _jupyterlab_console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(52263);
16
16
  /* harmony import */ var _jupyterlab_console__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_console__WEBPACK_IMPORTED_MODULE_2__);
17
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(64275);
17
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24474);
18
18
  /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__);
19
- /* harmony import */ var _jupyterlab_docmanager__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(23925);
19
+ /* harmony import */ var _jupyterlab_docmanager__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(78099);
20
20
  /* harmony import */ var _jupyterlab_docmanager__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_docmanager__WEBPACK_IMPORTED_MODULE_4__);
21
- /* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(81728);
21
+ /* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1978);
22
22
  /* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_5__);
23
- /* harmony import */ var _jupyterlab_mainmenu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(81369);
23
+ /* harmony import */ var _jupyterlab_mainmenu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(23024);
24
24
  /* harmony import */ var _jupyterlab_mainmenu__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_mainmenu__WEBPACK_IMPORTED_MODULE_6__);
25
- /* harmony import */ var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(41338);
25
+ /* harmony import */ var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(81089);
26
26
  /* harmony import */ var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_7__);
27
- /* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(49531);
27
+ /* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(51680);
28
28
  /* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_8__);
29
- /* harmony import */ var _jupyterlab_translation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(25830);
29
+ /* harmony import */ var _jupyterlab_translation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(38202);
30
30
  /* harmony import */ var _jupyterlab_translation__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_translation__WEBPACK_IMPORTED_MODULE_9__);
31
- /* harmony import */ var _jupyter_notebook_application__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(43223);
31
+ /* harmony import */ var _jupyter_notebook_application__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(83189);
32
32
  /* harmony import */ var _jupyter_notebook_application__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_jupyter_notebook_application__WEBPACK_IMPORTED_MODULE_10__);
33
- /* harmony import */ var _jupyter_notebook_ui_components__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(61646);
33
+ /* harmony import */ var _jupyter_notebook_ui_components__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(24546);
34
34
  /* harmony import */ var _jupyter_notebook_ui_components__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_jupyter_notebook_ui_components__WEBPACK_IMPORTED_MODULE_11__);
35
35
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(5406);
36
36
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_12__);
37
- /* harmony import */ var _lumino_disposable__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(38302);
37
+ /* harmony import */ var _lumino_disposable__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(16727);
38
38
  /* harmony import */ var _lumino_disposable__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_lumino_disposable__WEBPACK_IMPORTED_MODULE_13__);
39
39
  /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(60920);
40
40
  /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_14__);
@@ -1003,4 +1003,4 @@ const plugins = [
1003
1003
  /***/ })
1004
1004
 
1005
1005
  }]);
1006
- //# sourceMappingURL=8579.d62567e04de2f4dfcdce.js.map?v=d62567e04de2f4dfcdce
1006
+ //# sourceMappingURL=8579.973518a0960b2b927064.js.map?v=973518a0960b2b927064
@@ -1 +1 @@
1
- {"version":3,"file":"8579.d62567e04de2f4dfcdce.js?v=d62567e04de2f4dfcdce","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAC8G;AACO;AAClE;AACiB;AACI;AACf;AACR;AAC+F;AACjF;AACO;AACwF;AAChG;AACV;AACoB;AACzB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAU,EAAE,gEAAW;AACtC;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAU;AACxB;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAU;AAClC;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA,yBAAyB,oDAAM,GAAG,MAAM;AACxC,QAAQ,yEAAW;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,qCAAqC,SAAS;AAC9C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO,EAAE,oEAAgB;AACxC,eAAe,yEAAgB;AAC/B;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,0BAA0B,gCAAgC;AAC1D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAS;AACxB;AACA;AACA;AACA;AACA,qBAAqB,6DAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAM;AAC/B,kBAAkB,0DAAQ;AAC1B;AACA,sCAAsC,WAAW;AACjD,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gEAAW;AAC1B,eAAe,iEAAe;AAC9B;AACA;AACA,wBAAwB,6DAAU;AAClC;AACA;AACA;AACA,4BAA4B,yDAAM;AAClC,aAAa;AACb,SAAS;AACT,qBAAqB,6DAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yDAAM;AACtC;AACA,aAAa;AACb,SAAS;AACT;AACA,8BAA8B,+CAA+C;AAC7E,8BAA8B,gDAAgD;AAC9E;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+EAAmB;AACjC;AACA,eAAe,qFAAyB;AACxC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oEAAe;AAC7B;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,UAAU;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uEAAmB;AACjC;AACA,QAAQ,oEAAgB;AACxB,QAAQ,oEAAgB;AACxB,QAAQ,4DAAU;AAClB,QAAQ,mEAAe;AACvB,QAAQ,gEAAW;AACnB,QAAQ,+EAAmB;AAC3B;AACA;AACA,mFAAmF,mEAAc;AACjG,2GAA2G,qFAAyB;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gBAAgB;AACrD;AACA,wCAAwC,6DAAU;AAClD;AACA,oCAAoC,yDAAM;AAC1C;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA,mBAAmB,sEAAkB;AACrC,8BAA8B,6EAAyB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0EAAc;AAC5B,eAAe,yEAAgB;AAC/B;AACA,mCAAmC,yEAAa;AAChD,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAa;AAC3B;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mEAAkB;AAC7C;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAU;AACxB;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,WAAW;AAC1C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc;AAC7B;AACA;AACA;AACA,mCAAmC,6DAAY;AAC/C;AACA;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mEAAc;AACtD;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,oEAAgB,EAAE,4DAAO,EAAE,wEAAsB;AAChE;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA,mCAAmC,oDAAM,GAAG,MAAM;AAClD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,mEAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,mBAAmB;AACnF,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,oEAAY;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,MAAM,GAAG,QAAQ;AACzD;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,yEAAgB,EAAE,iEAAe;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,8BAA8B,iDAAiD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,2DAAS,EAAE,iEAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kDAAI,GAAG,wBAAwB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,4EAAgB;AAC7D;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO;AACtB,cAAc,oEAAe;AAC7B;AACA,gBAAgB,WAAW;AAC3B,wBAAwB,8DAAa;AACrC,6BAA6B,+DAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,yDAAM;AACpC;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe,6DAAU,wBAAwB;AACpF,aAAa;AACb,SAAS;AACT,kCAAkC,uDAAuD;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mEAAkB;AACtC;AACA,SAAS;AACT,iBAAiB;AACjB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO;AACtB,cAAc,qEAAgB;AAC9B;AACA;AACA,6BAA6B,6DAAU;AACvC,6BAA6B,yDAAM,MAAM,6DAAU,sCAAsC,yDAAM;AAC/F,wCAAwC,mBAAmB;AAC3D;AACA,gBAAgB,6DAAU;AAC1B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gEAAW;AAC1B,eAAe,iEAAe,EAAE,0EAAc;AAC9C;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,iDAAiD;AAC/E;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,OAAO,EAAC","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../packages/application-extension/lib/index.js"],"sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nimport { ILabStatus, IRouter, ITreePathUpdater, JupyterFrontEnd, JupyterLab, } from '@jupyterlab/application';\nimport { DOMUtils, ICommandPalette, ISanitizer, ISplashScreen, IToolbarWidgetRegistry, } from '@jupyterlab/apputils';\nimport { ConsolePanel } from '@jupyterlab/console';\nimport { PageConfig, PathExt, URLExt } from '@jupyterlab/coreutils';\nimport { IDocumentManager, renameDialog } from '@jupyterlab/docmanager';\nimport { DocumentWidget } from '@jupyterlab/docregistry';\nimport { IMainMenu } from '@jupyterlab/mainmenu';\nimport { ILatexTypesetter, IMarkdownParser, IRenderMimeRegistry, RenderMimeRegistry, standardRendererFactories, } from '@jupyterlab/rendermime';\nimport { ISettingRegistry } from '@jupyterlab/settingregistry';\nimport { ITranslator, nullTranslator } from '@jupyterlab/translation';\nimport { NotebookApp, NotebookShell, INotebookShell, SidePanelPalette, INotebookPathOpener, defaultNotebookPathOpener, } from '@jupyter-notebook/application';\nimport { jupyterIcon } from '@jupyter-notebook/ui-components';\nimport { PromiseDelegate } from '@lumino/coreutils';\nimport { DisposableDelegate, DisposableSet, } from '@lumino/disposable';\nimport { Menu, Widget } from '@lumino/widgets';\n/**\n * A regular expression to match path to notebooks and documents\n */\nconst TREE_PATTERN = new RegExp('/(notebooks|edit)/(.*)');\n/**\n * A regular expression to suppress the file extension from display for .ipynb files.\n */\nconst STRIP_IPYNB = /\\.ipynb$/;\n/**\n * The JupyterLab document manager plugin id.\n */\nconst JUPYTERLAB_DOCMANAGER_PLUGIN_ID = '@jupyterlab/docmanager-extension:plugin';\n/**\n * The command IDs used by the application plugin.\n */\nvar CommandIDs;\n(function (CommandIDs) {\n /**\n * Duplicate the current document and open the new document\n */\n CommandIDs.duplicate = 'application:duplicate';\n /**\n * Handle local links\n */\n CommandIDs.handleLink = 'application:handle-local-link';\n /**\n * Toggle Top Bar visibility\n */\n CommandIDs.toggleTop = 'application:toggle-top';\n /**\n * Toggle side panel visibility\n */\n CommandIDs.togglePanel = 'application:toggle-panel';\n /**\n * Toggle the Zen mode\n */\n CommandIDs.toggleZen = 'application:toggle-zen';\n /**\n * Open JupyterLab\n */\n CommandIDs.openLab = 'application:open-lab';\n /**\n * Open the tree page.\n */\n CommandIDs.openTree = 'application:open-tree';\n /**\n * Rename the current document\n */\n CommandIDs.rename = 'application:rename';\n /**\n * Resolve tree path\n */\n CommandIDs.resolveTree = 'application:resolve-tree';\n})(CommandIDs || (CommandIDs = {}));\n/**\n * Check if the application is dirty before closing the browser tab.\n */\nconst dirty = {\n id: '@jupyter-notebook/application-extension:dirty',\n description: 'Check if the application is dirty before closing the browser tab.',\n autoStart: true,\n requires: [ILabStatus, ITranslator],\n activate: (app, status, translator) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${dirty.id} must be activated in Jupyter Notebook.`);\n }\n const trans = translator.load('notebook');\n const message = trans.__('Are you sure you want to exit Jupyter Notebook?\\n\\nAny unsaved changes will be lost.');\n window.addEventListener('beforeunload', (event) => {\n if (app.status.isDirty) {\n return (event.returnValue = message);\n }\n });\n },\n};\n/**\n * The application info.\n */\nconst info = {\n id: '@jupyter-notebook/application-extension:info',\n autoStart: true,\n provides: JupyterLab.IInfo,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${info.id} must be activated in Jupyter Notebook.`);\n }\n return app.info;\n },\n};\n/**\n * The logo plugin.\n */\nconst logo = {\n id: '@jupyter-notebook/application-extension:logo',\n description: 'The logo plugin.',\n autoStart: true,\n activate: (app) => {\n const baseUrl = PageConfig.getBaseUrl();\n const node = document.createElement('a');\n node.href = `${baseUrl}tree`;\n node.target = '_blank';\n node.rel = 'noopener noreferrer';\n const logo = new Widget({ node });\n jupyterIcon.element({\n container: node,\n elementPosition: 'center',\n padding: '2px 2px 2px 8px',\n height: '28px',\n width: 'auto',\n cursor: 'pointer',\n margin: 'auto',\n });\n logo.id = 'jp-NotebookLogo';\n app.shell.add(logo, 'top', { rank: 0 });\n },\n};\n/**\n * A plugin to open documents in the main area.\n */\nconst opener = {\n id: '@jupyter-notebook/application-extension:opener',\n description: 'A plugin to open documents in the main area.',\n autoStart: true,\n requires: [IRouter, IDocumentManager],\n optional: [ISettingRegistry],\n activate: (app, router, docManager, settingRegistry) => {\n const { commands, docRegistry } = app;\n const command = 'router:tree';\n commands.addCommand(command, {\n execute: (args) => {\n var _a;\n const parsed = args;\n const matches = (_a = parsed.path.match(TREE_PATTERN)) !== null && _a !== void 0 ? _a : [];\n const [, , path] = matches;\n if (!path) {\n return;\n }\n app.started.then(async () => {\n var _a;\n const file = decodeURIComponent(path);\n const urlParams = new URLSearchParams(parsed.search);\n let defaultFactory = docRegistry.defaultWidgetFactory(path).name;\n // Explicitly get the default viewers from the settings because\n // JupyterLab might not have had the time to load the settings yet (race condition)\n // Relevant code: https://github.com/jupyterlab/jupyterlab/blob/d56ff811f39b3c10c6d8b6eb27a94624b753eb53/packages/docmanager-extension/src/index.tsx#L265-L293\n if (settingRegistry) {\n const settings = await settingRegistry.load(JUPYTERLAB_DOCMANAGER_PLUGIN_ID);\n const defaultViewers = settings.get('defaultViewers').composite;\n // get the file types for the path\n const types = docRegistry.getFileTypesForPath(path);\n // for each file type, check if there is a default viewer and if it\n // is available in the docRegistry. If it is the case, use it as the\n // default factory\n types.forEach((ft) => {\n if (defaultViewers[ft.name] !== undefined &&\n docRegistry.getWidgetFactory(defaultViewers[ft.name])) {\n defaultFactory = defaultViewers[ft.name];\n }\n });\n }\n const factory = (_a = urlParams.get('factory')) !== null && _a !== void 0 ? _a : defaultFactory;\n docManager.open(file, factory, undefined, {\n ref: '_noref',\n });\n });\n },\n });\n router.register({ command, pattern: TREE_PATTERN });\n },\n};\n/**\n * A plugin to customize menus\n */\nconst menus = {\n id: '@jupyter-notebook/application-extension:menus',\n description: 'A plugin to customize menus.',\n requires: [IMainMenu],\n autoStart: true,\n activate: (app, menu) => {\n // always disable the Tabs menu\n menu.tabsMenu.dispose();\n const page = PageConfig.getOption('notebookPage');\n switch (page) {\n case 'consoles':\n case 'terminals':\n case 'tree':\n menu.editMenu.dispose();\n menu.kernelMenu.dispose();\n menu.runMenu.dispose();\n break;\n case 'edit':\n menu.kernelMenu.dispose();\n menu.runMenu.dispose();\n break;\n default:\n break;\n }\n },\n};\n/**\n * A plugin to provide a spacer at rank 900 in the menu area\n */\nconst menuSpacer = {\n id: '@jupyter-notebook/application-extension:menu-spacer',\n description: 'A plugin to provide a spacer at rank 900 in the menu area.',\n autoStart: true,\n activate: (app) => {\n const menu = new Widget();\n menu.id = DOMUtils.createDomID();\n menu.addClass('jp-NotebookSpacer');\n app.shell.add(menu, 'menu', { rank: 900 });\n },\n};\n/**\n * Add commands to open the tree and running pages.\n */\nconst pages = {\n id: '@jupyter-notebook/application-extension:pages',\n description: 'Add commands to open the tree and running pages.',\n autoStart: true,\n requires: [ITranslator],\n optional: [ICommandPalette],\n activate: (app, translator, palette) => {\n const trans = translator.load('notebook');\n const baseUrl = PageConfig.getBaseUrl();\n app.commands.addCommand(CommandIDs.openLab, {\n label: trans.__('Open JupyterLab'),\n execute: () => {\n window.open(URLExt.join(baseUrl, 'lab'));\n },\n });\n const page = PageConfig.getOption('notebookPage');\n app.commands.addCommand(CommandIDs.openTree, {\n label: trans.__('File Browser'),\n execute: () => {\n if (page === 'tree') {\n app.commands.execute('filebrowser:activate');\n }\n else {\n window.open(URLExt.join(baseUrl, 'tree'));\n }\n },\n });\n if (palette) {\n palette.addItem({ command: CommandIDs.openLab, category: 'View' });\n palette.addItem({ command: CommandIDs.openTree, category: 'View' });\n }\n },\n};\n/**\n * A plugin to open paths in new browser tabs.\n */\nconst pathOpener = {\n id: '@jupyter-notebook/application-extension:path-opener',\n description: 'A plugin to open paths in new browser tabs.',\n autoStart: true,\n provides: INotebookPathOpener,\n activate: (app) => {\n return defaultNotebookPathOpener;\n },\n};\n/**\n * The default paths for a Jupyter Notebook app.\n */\nconst paths = {\n id: '@jupyter-notebook/application-extension:paths',\n description: 'The default paths for a Jupyter Notebook app.',\n autoStart: true,\n provides: JupyterFrontEnd.IPaths,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${paths.id} must be activated in Jupyter Notebook.`);\n }\n return app.paths;\n },\n};\n/**\n * A plugin providing a rendermime registry.\n */\nconst rendermime = {\n id: '@jupyter-notebook/application-extension:rendermime',\n description: 'A plugin providing a rendermime registry.',\n autoStart: true,\n provides: IRenderMimeRegistry,\n optional: [\n IDocumentManager,\n ILatexTypesetter,\n ISanitizer,\n IMarkdownParser,\n ITranslator,\n INotebookPathOpener,\n ],\n activate: (app, docManager, latexTypesetter, sanitizer, markdownParser, translator, notebookPathOpener) => {\n const trans = (translator !== null && translator !== void 0 ? translator : nullTranslator).load('jupyterlab');\n const opener = notebookPathOpener !== null && notebookPathOpener !== void 0 ? notebookPathOpener : defaultNotebookPathOpener;\n if (docManager) {\n app.commands.addCommand(CommandIDs.handleLink, {\n label: trans.__('Handle Local Link'),\n execute: (args) => {\n const path = args['path'];\n if (path === undefined || path === null) {\n return;\n }\n return docManager.services.contents\n .get(path, { content: false })\n .then((model) => {\n const baseUrl = PageConfig.getBaseUrl();\n opener.open({\n prefix: URLExt.join(baseUrl, 'tree'),\n path: model.path,\n target: '_blank',\n });\n });\n },\n });\n }\n return new RenderMimeRegistry({\n initialFactories: standardRendererFactories,\n linkHandler: !docManager\n ? undefined\n : {\n handleLink: (node, path, id) => {\n // If node has the download attribute explicitly set, use the\n // default browser downloading behavior.\n if (node.tagName === 'A' && node.hasAttribute('download')) {\n return;\n }\n app.commandLinker.connectNode(node, CommandIDs.handleLink, {\n path,\n id,\n });\n },\n },\n latexTypesetter: latexTypesetter !== null && latexTypesetter !== void 0 ? latexTypesetter : undefined,\n markdownParser: markdownParser !== null && markdownParser !== void 0 ? markdownParser : undefined,\n translator: translator !== null && translator !== void 0 ? translator : undefined,\n sanitizer: sanitizer !== null && sanitizer !== void 0 ? sanitizer : undefined,\n });\n },\n};\n/**\n * The default Jupyter Notebook application shell.\n */\nconst shell = {\n id: '@jupyter-notebook/application-extension:shell',\n description: 'The default Jupyter Notebook application shell.',\n autoStart: true,\n provides: INotebookShell,\n optional: [ISettingRegistry],\n activate: (app, settingRegistry) => {\n if (!(app.shell instanceof NotebookShell)) {\n throw new Error(`${shell.id} did not find a NotebookShell instance.`);\n }\n const notebookShell = app.shell;\n if (settingRegistry) {\n settingRegistry\n .load(shell.id)\n .then((settings) => {\n // Add a layer of customization to support app shell mode\n const customLayout = settings.composite['layout'];\n // Restore the layout.\n void notebookShell.restoreLayout(customLayout);\n })\n .catch((reason) => {\n console.error('Fail to load settings for the layout restorer.');\n console.error(reason);\n });\n }\n return notebookShell;\n },\n};\n/**\n * The default splash screen provider.\n */\nconst splash = {\n id: '@jupyter-notebook/application-extension:splash',\n description: 'Provides an empty splash screen.',\n autoStart: true,\n provides: ISplashScreen,\n activate: (app) => {\n const { restored } = app;\n const splash = document.createElement('div');\n splash.style.position = 'absolute';\n splash.style.width = '100%';\n splash.style.height = '100%';\n splash.style.zIndex = '10';\n return {\n show: (light = true) => {\n splash.style.backgroundColor = light ? 'white' : '#111111';\n document.body.appendChild(splash);\n return new DisposableDelegate(async () => {\n await restored;\n document.body.removeChild(splash);\n });\n },\n };\n },\n};\n/**\n * The default JupyterLab application status provider.\n */\nconst status = {\n id: '@jupyter-notebook/application-extension:status',\n description: 'The default JupyterLab application status provider.',\n autoStart: true,\n provides: ILabStatus,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${status.id} must be activated in Jupyter Notebook.`);\n }\n return app.status;\n },\n};\n/**\n * A plugin to display the document title in the browser tab title\n */\nconst tabTitle = {\n id: '@jupyter-notebook/application-extension:tab-title',\n description: 'A plugin to display the document title in the browser tab title.',\n autoStart: true,\n requires: [INotebookShell],\n activate: (app, shell) => {\n const setTabTitle = () => {\n const current = shell.currentWidget;\n if (current instanceof ConsolePanel) {\n const update = () => {\n const title = current.sessionContext.path || current.sessionContext.name;\n const basename = PathExt.basename(title);\n // Strip the \".ipynb\" suffix from filenames for display in tab titles.\n document.title = basename.replace(STRIP_IPYNB, '');\n };\n current.sessionContext.sessionChanged.connect(update);\n update();\n return;\n }\n else if (current instanceof DocumentWidget) {\n const update = () => {\n const basename = PathExt.basename(current.context.path);\n document.title = basename.replace(STRIP_IPYNB, '');\n };\n current.context.pathChanged.connect(update);\n update();\n }\n };\n shell.currentChanged.connect(setTabTitle);\n setTabTitle();\n },\n};\n/**\n * A plugin to display and rename the title of a file\n */\nconst title = {\n id: '@jupyter-notebook/application-extension:title',\n description: 'A plugin to display and rename the title of a file.',\n autoStart: true,\n requires: [INotebookShell, ITranslator],\n optional: [IDocumentManager, IRouter, IToolbarWidgetRegistry],\n activate: (app, shell, translator, docManager, router, toolbarRegistry) => {\n const { commands } = app;\n const trans = translator.load('notebook');\n const node = document.createElement('div');\n if (toolbarRegistry) {\n toolbarRegistry.addFactory('TopBar', 'widgetTitle', (toolbar) => {\n const widget = new Widget({ node });\n widget.id = 'jp-title';\n return widget;\n });\n }\n const addTitle = async () => {\n const current = shell.currentWidget;\n if (!current || !(current instanceof DocumentWidget)) {\n return;\n }\n if (node.children.length > 0) {\n return;\n }\n const h = document.createElement('h1');\n h.textContent = current.title.label.replace(STRIP_IPYNB, '');\n node.appendChild(h);\n node.style.marginLeft = '10px';\n if (!docManager) {\n return;\n }\n const isEnabled = () => {\n const { currentWidget } = shell;\n return !!(currentWidget && docManager.contextForWidget(currentWidget));\n };\n commands.addCommand(CommandIDs.duplicate, {\n label: () => trans.__('Duplicate'),\n isEnabled,\n execute: async () => {\n if (!isEnabled()) {\n return;\n }\n // Duplicate the file, and open the new file.\n const result = await docManager.duplicate(current.context.path);\n await commands.execute('docmanager:open', { path: result.path });\n },\n });\n commands.addCommand(CommandIDs.rename, {\n label: () => trans.__('Rename…'),\n isEnabled,\n execute: async () => {\n var _a;\n if (!isEnabled()) {\n return;\n }\n const result = await renameDialog(docManager, current.context);\n // activate the current widget to bring the focus\n if (current) {\n current.activate();\n }\n if (result === null) {\n return;\n }\n const newPath = current.context.path;\n const basename = PathExt.basename(newPath);\n h.textContent = basename.replace(STRIP_IPYNB, '');\n if (!router) {\n return;\n }\n const matches = (_a = router.current.path.match(TREE_PATTERN)) !== null && _a !== void 0 ? _a : [];\n const [, route, path] = matches;\n if (!route || !path) {\n return;\n }\n const encoded = encodeURIComponent(newPath);\n router.navigate(`/${route}/${encoded}`, {\n skipRouting: true,\n });\n },\n });\n node.onclick = async () => {\n void commands.execute(CommandIDs.rename);\n };\n };\n shell.currentChanged.connect(addTitle);\n void addTitle();\n },\n};\n/**\n * Plugin to toggle the top header visibility.\n */\nconst topVisibility = {\n id: '@jupyter-notebook/application-extension:top',\n description: 'Plugin to toggle the top header visibility.',\n requires: [INotebookShell, ITranslator],\n optional: [ISettingRegistry, ICommandPalette],\n activate: (app, notebookShell, translator, settingRegistry, palette) => {\n const trans = translator.load('notebook');\n const top = notebookShell.top;\n const pluginId = topVisibility.id;\n app.commands.addCommand(CommandIDs.toggleTop, {\n label: trans.__('Show Header'),\n execute: () => {\n top.setHidden(top.isVisible);\n if (settingRegistry) {\n void settingRegistry.set(pluginId, 'visible', top.isVisible ? 'yes' : 'no');\n }\n },\n isToggled: () => top.isVisible,\n });\n let adjustToScreen = false;\n if (settingRegistry) {\n const loadSettings = settingRegistry.load(pluginId);\n const updateSettings = (settings) => {\n // 'visible' property from user preferences or default settings\n let visible = settings.get('visible').composite;\n if (settings.user.visible !== undefined) {\n visible = settings.user.visible;\n }\n top.setHidden(visible === 'no');\n // adjust to screen from user preferences or default settings\n adjustToScreen = visible === 'automatic';\n };\n Promise.all([loadSettings, app.restored])\n .then(([settings]) => {\n updateSettings(settings);\n settings.changed.connect((settings) => {\n updateSettings(settings);\n });\n })\n .catch((reason) => {\n console.error(reason.message);\n });\n }\n if (palette) {\n palette.addItem({ command: CommandIDs.toggleTop, category: 'View' });\n }\n const onChanged = () => {\n if (!adjustToScreen) {\n return;\n }\n if (app.format === 'desktop') {\n notebookShell.expandTop();\n }\n else {\n notebookShell.collapseTop();\n }\n };\n // listen on format change (mobile and desktop) to make the view more compact\n app.formatChanged.connect(onChanged);\n },\n autoStart: true,\n};\n/**\n * Plugin to toggle the left or right side panel's visibility.\n */\nconst sidePanelVisibility = {\n id: '@jupyter-notebook/application-extension:sidepanel',\n description: 'Plugin to toggle the visibility of left or right side panel.',\n requires: [INotebookShell, ITranslator],\n optional: [IMainMenu, ICommandPalette],\n autoStart: true,\n activate: (app, notebookShell, translator, menu, palette) => {\n const trans = translator.load('notebook');\n /* Arguments for togglePanel command:\n * side, left or right area\n * title, widget title to show in the menu\n * id, widget ID to activate in the side panel\n */\n app.commands.addCommand(CommandIDs.togglePanel, {\n label: (args) => args['title'],\n caption: (args) => {\n // We do not substitute the parameter into the string because the parameter is not\n // localized (e.g., it is always 'left') even though the string is localized.\n if (args['side'] === 'left') {\n return trans.__('Show %1 in the left sidebar', args['title']);\n }\n else if (args['side'] === 'right') {\n return trans.__('Show %1 in the right sidebar', args['title']);\n }\n return trans.__('Show %1 in the sidebar', args['title']);\n },\n execute: (args) => {\n var _a, _b;\n switch (args['side']) {\n case 'left':\n if (notebookShell.leftCollapsed) {\n notebookShell.expandLeft(args.id);\n }\n else if (((_a = notebookShell.leftHandler.currentWidget) === null || _a === void 0 ? void 0 : _a.id) !== args.id) {\n notebookShell.expandLeft(args.id);\n }\n else {\n notebookShell.collapseLeft();\n if (notebookShell.currentWidget) {\n notebookShell.activateById(notebookShell.currentWidget.id);\n }\n }\n break;\n case 'right':\n if (notebookShell.rightCollapsed) {\n notebookShell.expandRight(args.id);\n }\n else if (((_b = notebookShell.rightHandler.currentWidget) === null || _b === void 0 ? void 0 : _b.id) !== args.id) {\n notebookShell.expandRight(args.id);\n }\n else {\n notebookShell.collapseRight();\n if (notebookShell.currentWidget) {\n notebookShell.activateById(notebookShell.currentWidget.id);\n }\n }\n break;\n }\n },\n isToggled: (args) => {\n switch (args['side']) {\n case 'left': {\n if (notebookShell.leftCollapsed) {\n return false;\n }\n const currentWidget = notebookShell.leftHandler.currentWidget;\n if (!currentWidget) {\n return false;\n }\n return currentWidget.id === args['id'];\n }\n case 'right': {\n if (notebookShell.rightCollapsed) {\n return false;\n }\n const currentWidget = notebookShell.rightHandler.currentWidget;\n if (!currentWidget) {\n return false;\n }\n return currentWidget.id === args['id'];\n }\n }\n return false;\n },\n });\n const sidePanelMenu = {\n left: null,\n right: null,\n };\n /**\n * The function which adds entries to the View menu for each widget of a side panel.\n *\n * @param area - 'left' or 'right', the area of the side panel.\n * @param entryLabel - the name of the main entry in the View menu for that side panel.\n * @returns - The disposable menu added to the View menu or null.\n */\n const updateMenu = (area, entryLabel) => {\n var _a;\n if (menu === null) {\n return null;\n }\n // Remove the previous menu entry for this side panel.\n (_a = sidePanelMenu[area]) === null || _a === void 0 ? void 0 : _a.dispose();\n // Creates a new menu entry and populates it with side panel widgets.\n const newMenu = new Menu({ commands: app.commands });\n newMenu.title.label = entryLabel;\n const widgets = notebookShell.widgets(area);\n let menuToAdd = false;\n for (const widget of widgets) {\n newMenu.addItem({\n command: CommandIDs.togglePanel,\n args: {\n side: area,\n title: `Show ${widget.title.caption}`,\n id: widget.id,\n },\n });\n menuToAdd = true;\n }\n // If there are widgets, add the menu to the main menu entry.\n if (menuToAdd) {\n sidePanelMenu[area] = menu.viewMenu.addItem({\n type: 'submenu',\n submenu: newMenu,\n });\n }\n };\n app.restored.then(() => {\n // Create menu entries for the left and right panel.\n if (menu) {\n const getSidePanelLabel = (area) => {\n if (area === 'left') {\n return trans.__('Left Sidebar');\n }\n else {\n return trans.__('Right Sidebar');\n }\n };\n const leftArea = notebookShell.leftHandler.area;\n const leftLabel = getSidePanelLabel(leftArea);\n updateMenu(leftArea, leftLabel);\n const rightArea = notebookShell.rightHandler.area;\n const rightLabel = getSidePanelLabel(rightArea);\n updateMenu(rightArea, rightLabel);\n const handleSidePanelChange = (sidePanel, widget) => {\n const label = getSidePanelLabel(sidePanel.area);\n updateMenu(sidePanel.area, label);\n };\n notebookShell.leftHandler.widgetAdded.connect(handleSidePanelChange);\n notebookShell.leftHandler.widgetRemoved.connect(handleSidePanelChange);\n notebookShell.rightHandler.widgetAdded.connect(handleSidePanelChange);\n notebookShell.rightHandler.widgetRemoved.connect(handleSidePanelChange);\n }\n // Add palette entries for side panels.\n if (palette) {\n const sidePanelPalette = new SidePanelPalette({\n commandPalette: palette,\n command: CommandIDs.togglePanel,\n });\n notebookShell.leftHandler.widgets.forEach((widget) => {\n sidePanelPalette.addItem(widget, notebookShell.leftHandler.area);\n });\n notebookShell.rightHandler.widgets.forEach((widget) => {\n sidePanelPalette.addItem(widget, notebookShell.rightHandler.area);\n });\n // Update menu and palette when widgets are added or removed from side panels.\n notebookShell.leftHandler.widgetAdded.connect((sidePanel, widget) => {\n sidePanelPalette.addItem(widget, sidePanel.area);\n });\n notebookShell.leftHandler.widgetRemoved.connect((sidePanel, widget) => {\n sidePanelPalette.removeItem(widget, sidePanel.area);\n });\n notebookShell.rightHandler.widgetAdded.connect((sidePanel, widget) => {\n sidePanelPalette.addItem(widget, sidePanel.area);\n });\n notebookShell.rightHandler.widgetRemoved.connect((sidePanel, widget) => {\n sidePanelPalette.removeItem(widget, sidePanel.area);\n });\n }\n });\n },\n};\n/**\n * The default tree route resolver plugin.\n */\nconst tree = {\n id: '@jupyter-notebook/application-extension:tree-resolver',\n description: 'The default tree route resolver plugin.',\n autoStart: true,\n requires: [IRouter],\n provides: JupyterFrontEnd.ITreeResolver,\n activate: (app, router) => {\n const { commands } = app;\n const set = new DisposableSet();\n const delegate = new PromiseDelegate();\n const treePattern = new RegExp('/(/tree/.*)?');\n set.add(commands.addCommand(CommandIDs.resolveTree, {\n execute: (async (args) => {\n var _a;\n if (set.isDisposed) {\n return;\n }\n const query = URLExt.queryStringToObject((_a = args.search) !== null && _a !== void 0 ? _a : '');\n const browser = query['file-browser-path'] || '';\n // Remove the file browser path from the query string.\n delete query['file-browser-path'];\n // Clean up artifacts immediately upon routing.\n set.dispose();\n delegate.resolve({ browser, file: PageConfig.getOption('treePath') });\n }),\n }));\n set.add(router.register({ command: CommandIDs.resolveTree, pattern: treePattern }));\n // If a route is handled by the router without the tree command being\n // invoked, resolve to `null` and clean up artifacts.\n const listener = () => {\n if (set.isDisposed) {\n return;\n }\n set.dispose();\n delegate.resolve(null);\n };\n router.routed.connect(listener);\n set.add(new DisposableDelegate(() => {\n router.routed.disconnect(listener);\n }));\n return { paths: delegate.promise };\n },\n};\n/**\n * Plugin to update tree path.\n */\nconst treePathUpdater = {\n id: '@jupyter-notebook/application-extension:tree-updater',\n description: 'Plugin to update tree path.',\n requires: [IRouter],\n provides: ITreePathUpdater,\n activate: (app, router) => {\n function updateTreePath(treePath) {\n if (treePath !== PageConfig.getOption('treePath')) {\n const path = URLExt.join(PageConfig.getOption('baseUrl') || '/', 'tree', URLExt.encodeParts(treePath));\n router.navigate(path, { skipRouting: true });\n // Persist the new tree path to PageConfig as it is used elsewhere at runtime.\n PageConfig.setOption('treePath', treePath);\n }\n }\n return updateTreePath;\n },\n autoStart: true,\n};\n/**\n * Translator plugin\n */\nconst translator = {\n id: '@jupyter-notebook/application-extension:translator',\n description: 'Translator plugin',\n requires: [INotebookShell, ITranslator],\n autoStart: true,\n activate: (app, notebookShell, translator) => {\n notebookShell.translator = translator;\n },\n};\n/**\n * Zen mode plugin\n */\nconst zen = {\n id: '@jupyter-notebook/application-extension:zen',\n description: 'Zen mode plugin.',\n autoStart: true,\n requires: [ITranslator],\n optional: [ICommandPalette, INotebookShell],\n activate: (app, translator, palette, notebookShell) => {\n const { commands } = app;\n const elem = document.documentElement;\n const trans = translator.load('notebook');\n const toggleOn = () => {\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.collapseTop();\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.menu.setHidden(true);\n zenModeEnabled = true;\n };\n const toggleOff = () => {\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.expandTop();\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.menu.setHidden(false);\n zenModeEnabled = false;\n };\n let zenModeEnabled = false;\n commands.addCommand(CommandIDs.toggleZen, {\n label: trans.__('Toggle Zen Mode'),\n execute: () => {\n if (!zenModeEnabled) {\n elem.requestFullscreen();\n toggleOn();\n }\n else {\n document.exitFullscreen();\n toggleOff();\n }\n },\n });\n document.addEventListener('fullscreenchange', () => {\n if (!document.fullscreenElement) {\n toggleOff();\n }\n });\n if (palette) {\n palette.addItem({ command: CommandIDs.toggleZen, category: 'Mode' });\n }\n },\n};\n/**\n * Export the plugins as default.\n */\nconst plugins = [\n dirty,\n info,\n logo,\n menus,\n menuSpacer,\n opener,\n pages,\n pathOpener,\n paths,\n rendermime,\n shell,\n sidePanelVisibility,\n splash,\n status,\n tabTitle,\n title,\n topVisibility,\n tree,\n treePathUpdater,\n translator,\n zen,\n];\nexport default plugins;\n"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"8579.973518a0960b2b927064.js?v=973518a0960b2b927064","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAC8G;AACO;AAClE;AACiB;AACI;AACf;AACR;AAC+F;AACjF;AACO;AACwF;AAChG;AACV;AACoB;AACzB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAU,EAAE,gEAAW;AACtC;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAU;AACxB;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAU;AAClC;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA,yBAAyB,oDAAM,GAAG,MAAM;AACxC,QAAQ,yEAAW;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,qCAAqC,SAAS;AAC9C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO,EAAE,oEAAgB;AACxC,eAAe,yEAAgB;AAC/B;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,0BAA0B,gCAAgC;AAC1D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAS;AACxB;AACA;AACA;AACA;AACA,qBAAqB,6DAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAM;AAC/B,kBAAkB,0DAAQ;AAC1B;AACA,sCAAsC,WAAW;AACjD,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gEAAW;AAC1B,eAAe,iEAAe;AAC9B;AACA;AACA,wBAAwB,6DAAU;AAClC;AACA;AACA;AACA,4BAA4B,yDAAM;AAClC,aAAa;AACb,SAAS;AACT,qBAAqB,6DAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yDAAM;AACtC;AACA,aAAa;AACb,SAAS;AACT;AACA,8BAA8B,+CAA+C;AAC7E,8BAA8B,gDAAgD;AAC9E;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+EAAmB;AACjC;AACA,eAAe,qFAAyB;AACxC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oEAAe;AAC7B;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,UAAU;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uEAAmB;AACjC;AACA,QAAQ,oEAAgB;AACxB,QAAQ,oEAAgB;AACxB,QAAQ,4DAAU;AAClB,QAAQ,mEAAe;AACvB,QAAQ,gEAAW;AACnB,QAAQ,+EAAmB;AAC3B;AACA;AACA,mFAAmF,mEAAc;AACjG,2GAA2G,qFAAyB;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gBAAgB;AACrD;AACA,wCAAwC,6DAAU;AAClD;AACA,oCAAoC,yDAAM;AAC1C;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA,mBAAmB,sEAAkB;AACrC,8BAA8B,6EAAyB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0EAAc;AAC5B,eAAe,yEAAgB;AAC/B;AACA,mCAAmC,yEAAa;AAChD,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAa;AAC3B;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mEAAkB;AAC7C;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAU;AACxB;AACA,6BAA6B,uEAAW;AACxC,+BAA+B,WAAW;AAC1C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc;AAC7B;AACA;AACA;AACA,mCAAmC,6DAAY;AAC/C;AACA;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mEAAc;AACtD;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,oEAAgB,EAAE,4DAAO,EAAE,wEAAsB;AAChE;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA,mCAAmC,oDAAM,GAAG,MAAM;AAClD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,mEAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,mBAAmB;AACnF,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,oEAAY;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,MAAM,GAAG,QAAQ;AACzD;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,yEAAgB,EAAE,iEAAe;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,8BAA8B,iDAAiD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C,eAAe,2DAAS,EAAE,iEAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kDAAI,GAAG,wBAAwB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,4EAAgB;AAC7D;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO;AACtB,cAAc,oEAAe;AAC7B;AACA,gBAAgB,WAAW;AAC3B,wBAAwB,8DAAa;AACrC,6BAA6B,+DAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,yDAAM;AACpC;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe,6DAAU,wBAAwB;AACpF,aAAa;AACb,SAAS;AACT,kCAAkC,uDAAuD;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mEAAkB;AACtC;AACA,SAAS;AACT,iBAAiB;AACjB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAO;AACtB,cAAc,qEAAgB;AAC9B;AACA;AACA,6BAA6B,6DAAU;AACvC,6BAA6B,yDAAM,MAAM,6DAAU,sCAAsC,yDAAM;AAC/F,wCAAwC,mBAAmB;AAC3D;AACA,gBAAgB,6DAAU;AAC1B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAc,EAAE,gEAAW;AAC1C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gEAAW;AAC1B,eAAe,iEAAe,EAAE,0EAAc;AAC9C;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,iDAAiD;AAC/E;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,OAAO,EAAC","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../packages/application-extension/lib/index.js"],"sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nimport { ILabStatus, IRouter, ITreePathUpdater, JupyterFrontEnd, JupyterLab, } from '@jupyterlab/application';\nimport { DOMUtils, ICommandPalette, ISanitizer, ISplashScreen, IToolbarWidgetRegistry, } from '@jupyterlab/apputils';\nimport { ConsolePanel } from '@jupyterlab/console';\nimport { PageConfig, PathExt, URLExt } from '@jupyterlab/coreutils';\nimport { IDocumentManager, renameDialog } from '@jupyterlab/docmanager';\nimport { DocumentWidget } from '@jupyterlab/docregistry';\nimport { IMainMenu } from '@jupyterlab/mainmenu';\nimport { ILatexTypesetter, IMarkdownParser, IRenderMimeRegistry, RenderMimeRegistry, standardRendererFactories, } from '@jupyterlab/rendermime';\nimport { ISettingRegistry } from '@jupyterlab/settingregistry';\nimport { ITranslator, nullTranslator } from '@jupyterlab/translation';\nimport { NotebookApp, NotebookShell, INotebookShell, SidePanelPalette, INotebookPathOpener, defaultNotebookPathOpener, } from '@jupyter-notebook/application';\nimport { jupyterIcon } from '@jupyter-notebook/ui-components';\nimport { PromiseDelegate } from '@lumino/coreutils';\nimport { DisposableDelegate, DisposableSet, } from '@lumino/disposable';\nimport { Menu, Widget } from '@lumino/widgets';\n/**\n * A regular expression to match path to notebooks and documents\n */\nconst TREE_PATTERN = new RegExp('/(notebooks|edit)/(.*)');\n/**\n * A regular expression to suppress the file extension from display for .ipynb files.\n */\nconst STRIP_IPYNB = /\\.ipynb$/;\n/**\n * The JupyterLab document manager plugin id.\n */\nconst JUPYTERLAB_DOCMANAGER_PLUGIN_ID = '@jupyterlab/docmanager-extension:plugin';\n/**\n * The command IDs used by the application plugin.\n */\nvar CommandIDs;\n(function (CommandIDs) {\n /**\n * Duplicate the current document and open the new document\n */\n CommandIDs.duplicate = 'application:duplicate';\n /**\n * Handle local links\n */\n CommandIDs.handleLink = 'application:handle-local-link';\n /**\n * Toggle Top Bar visibility\n */\n CommandIDs.toggleTop = 'application:toggle-top';\n /**\n * Toggle side panel visibility\n */\n CommandIDs.togglePanel = 'application:toggle-panel';\n /**\n * Toggle the Zen mode\n */\n CommandIDs.toggleZen = 'application:toggle-zen';\n /**\n * Open JupyterLab\n */\n CommandIDs.openLab = 'application:open-lab';\n /**\n * Open the tree page.\n */\n CommandIDs.openTree = 'application:open-tree';\n /**\n * Rename the current document\n */\n CommandIDs.rename = 'application:rename';\n /**\n * Resolve tree path\n */\n CommandIDs.resolveTree = 'application:resolve-tree';\n})(CommandIDs || (CommandIDs = {}));\n/**\n * Check if the application is dirty before closing the browser tab.\n */\nconst dirty = {\n id: '@jupyter-notebook/application-extension:dirty',\n description: 'Check if the application is dirty before closing the browser tab.',\n autoStart: true,\n requires: [ILabStatus, ITranslator],\n activate: (app, status, translator) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${dirty.id} must be activated in Jupyter Notebook.`);\n }\n const trans = translator.load('notebook');\n const message = trans.__('Are you sure you want to exit Jupyter Notebook?\\n\\nAny unsaved changes will be lost.');\n window.addEventListener('beforeunload', (event) => {\n if (app.status.isDirty) {\n return (event.returnValue = message);\n }\n });\n },\n};\n/**\n * The application info.\n */\nconst info = {\n id: '@jupyter-notebook/application-extension:info',\n autoStart: true,\n provides: JupyterLab.IInfo,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${info.id} must be activated in Jupyter Notebook.`);\n }\n return app.info;\n },\n};\n/**\n * The logo plugin.\n */\nconst logo = {\n id: '@jupyter-notebook/application-extension:logo',\n description: 'The logo plugin.',\n autoStart: true,\n activate: (app) => {\n const baseUrl = PageConfig.getBaseUrl();\n const node = document.createElement('a');\n node.href = `${baseUrl}tree`;\n node.target = '_blank';\n node.rel = 'noopener noreferrer';\n const logo = new Widget({ node });\n jupyterIcon.element({\n container: node,\n elementPosition: 'center',\n padding: '2px 2px 2px 8px',\n height: '28px',\n width: 'auto',\n cursor: 'pointer',\n margin: 'auto',\n });\n logo.id = 'jp-NotebookLogo';\n app.shell.add(logo, 'top', { rank: 0 });\n },\n};\n/**\n * A plugin to open documents in the main area.\n */\nconst opener = {\n id: '@jupyter-notebook/application-extension:opener',\n description: 'A plugin to open documents in the main area.',\n autoStart: true,\n requires: [IRouter, IDocumentManager],\n optional: [ISettingRegistry],\n activate: (app, router, docManager, settingRegistry) => {\n const { commands, docRegistry } = app;\n const command = 'router:tree';\n commands.addCommand(command, {\n execute: (args) => {\n var _a;\n const parsed = args;\n const matches = (_a = parsed.path.match(TREE_PATTERN)) !== null && _a !== void 0 ? _a : [];\n const [, , path] = matches;\n if (!path) {\n return;\n }\n app.started.then(async () => {\n var _a;\n const file = decodeURIComponent(path);\n const urlParams = new URLSearchParams(parsed.search);\n let defaultFactory = docRegistry.defaultWidgetFactory(path).name;\n // Explicitly get the default viewers from the settings because\n // JupyterLab might not have had the time to load the settings yet (race condition)\n // Relevant code: https://github.com/jupyterlab/jupyterlab/blob/d56ff811f39b3c10c6d8b6eb27a94624b753eb53/packages/docmanager-extension/src/index.tsx#L265-L293\n if (settingRegistry) {\n const settings = await settingRegistry.load(JUPYTERLAB_DOCMANAGER_PLUGIN_ID);\n const defaultViewers = settings.get('defaultViewers').composite;\n // get the file types for the path\n const types = docRegistry.getFileTypesForPath(path);\n // for each file type, check if there is a default viewer and if it\n // is available in the docRegistry. If it is the case, use it as the\n // default factory\n types.forEach((ft) => {\n if (defaultViewers[ft.name] !== undefined &&\n docRegistry.getWidgetFactory(defaultViewers[ft.name])) {\n defaultFactory = defaultViewers[ft.name];\n }\n });\n }\n const factory = (_a = urlParams.get('factory')) !== null && _a !== void 0 ? _a : defaultFactory;\n docManager.open(file, factory, undefined, {\n ref: '_noref',\n });\n });\n },\n });\n router.register({ command, pattern: TREE_PATTERN });\n },\n};\n/**\n * A plugin to customize menus\n */\nconst menus = {\n id: '@jupyter-notebook/application-extension:menus',\n description: 'A plugin to customize menus.',\n requires: [IMainMenu],\n autoStart: true,\n activate: (app, menu) => {\n // always disable the Tabs menu\n menu.tabsMenu.dispose();\n const page = PageConfig.getOption('notebookPage');\n switch (page) {\n case 'consoles':\n case 'terminals':\n case 'tree':\n menu.editMenu.dispose();\n menu.kernelMenu.dispose();\n menu.runMenu.dispose();\n break;\n case 'edit':\n menu.kernelMenu.dispose();\n menu.runMenu.dispose();\n break;\n default:\n break;\n }\n },\n};\n/**\n * A plugin to provide a spacer at rank 900 in the menu area\n */\nconst menuSpacer = {\n id: '@jupyter-notebook/application-extension:menu-spacer',\n description: 'A plugin to provide a spacer at rank 900 in the menu area.',\n autoStart: true,\n activate: (app) => {\n const menu = new Widget();\n menu.id = DOMUtils.createDomID();\n menu.addClass('jp-NotebookSpacer');\n app.shell.add(menu, 'menu', { rank: 900 });\n },\n};\n/**\n * Add commands to open the tree and running pages.\n */\nconst pages = {\n id: '@jupyter-notebook/application-extension:pages',\n description: 'Add commands to open the tree and running pages.',\n autoStart: true,\n requires: [ITranslator],\n optional: [ICommandPalette],\n activate: (app, translator, palette) => {\n const trans = translator.load('notebook');\n const baseUrl = PageConfig.getBaseUrl();\n app.commands.addCommand(CommandIDs.openLab, {\n label: trans.__('Open JupyterLab'),\n execute: () => {\n window.open(URLExt.join(baseUrl, 'lab'));\n },\n });\n const page = PageConfig.getOption('notebookPage');\n app.commands.addCommand(CommandIDs.openTree, {\n label: trans.__('File Browser'),\n execute: () => {\n if (page === 'tree') {\n app.commands.execute('filebrowser:activate');\n }\n else {\n window.open(URLExt.join(baseUrl, 'tree'));\n }\n },\n });\n if (palette) {\n palette.addItem({ command: CommandIDs.openLab, category: 'View' });\n palette.addItem({ command: CommandIDs.openTree, category: 'View' });\n }\n },\n};\n/**\n * A plugin to open paths in new browser tabs.\n */\nconst pathOpener = {\n id: '@jupyter-notebook/application-extension:path-opener',\n description: 'A plugin to open paths in new browser tabs.',\n autoStart: true,\n provides: INotebookPathOpener,\n activate: (app) => {\n return defaultNotebookPathOpener;\n },\n};\n/**\n * The default paths for a Jupyter Notebook app.\n */\nconst paths = {\n id: '@jupyter-notebook/application-extension:paths',\n description: 'The default paths for a Jupyter Notebook app.',\n autoStart: true,\n provides: JupyterFrontEnd.IPaths,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${paths.id} must be activated in Jupyter Notebook.`);\n }\n return app.paths;\n },\n};\n/**\n * A plugin providing a rendermime registry.\n */\nconst rendermime = {\n id: '@jupyter-notebook/application-extension:rendermime',\n description: 'A plugin providing a rendermime registry.',\n autoStart: true,\n provides: IRenderMimeRegistry,\n optional: [\n IDocumentManager,\n ILatexTypesetter,\n ISanitizer,\n IMarkdownParser,\n ITranslator,\n INotebookPathOpener,\n ],\n activate: (app, docManager, latexTypesetter, sanitizer, markdownParser, translator, notebookPathOpener) => {\n const trans = (translator !== null && translator !== void 0 ? translator : nullTranslator).load('jupyterlab');\n const opener = notebookPathOpener !== null && notebookPathOpener !== void 0 ? notebookPathOpener : defaultNotebookPathOpener;\n if (docManager) {\n app.commands.addCommand(CommandIDs.handleLink, {\n label: trans.__('Handle Local Link'),\n execute: (args) => {\n const path = args['path'];\n if (path === undefined || path === null) {\n return;\n }\n return docManager.services.contents\n .get(path, { content: false })\n .then((model) => {\n const baseUrl = PageConfig.getBaseUrl();\n opener.open({\n prefix: URLExt.join(baseUrl, 'tree'),\n path: model.path,\n target: '_blank',\n });\n });\n },\n });\n }\n return new RenderMimeRegistry({\n initialFactories: standardRendererFactories,\n linkHandler: !docManager\n ? undefined\n : {\n handleLink: (node, path, id) => {\n // If node has the download attribute explicitly set, use the\n // default browser downloading behavior.\n if (node.tagName === 'A' && node.hasAttribute('download')) {\n return;\n }\n app.commandLinker.connectNode(node, CommandIDs.handleLink, {\n path,\n id,\n });\n },\n },\n latexTypesetter: latexTypesetter !== null && latexTypesetter !== void 0 ? latexTypesetter : undefined,\n markdownParser: markdownParser !== null && markdownParser !== void 0 ? markdownParser : undefined,\n translator: translator !== null && translator !== void 0 ? translator : undefined,\n sanitizer: sanitizer !== null && sanitizer !== void 0 ? sanitizer : undefined,\n });\n },\n};\n/**\n * The default Jupyter Notebook application shell.\n */\nconst shell = {\n id: '@jupyter-notebook/application-extension:shell',\n description: 'The default Jupyter Notebook application shell.',\n autoStart: true,\n provides: INotebookShell,\n optional: [ISettingRegistry],\n activate: (app, settingRegistry) => {\n if (!(app.shell instanceof NotebookShell)) {\n throw new Error(`${shell.id} did not find a NotebookShell instance.`);\n }\n const notebookShell = app.shell;\n if (settingRegistry) {\n settingRegistry\n .load(shell.id)\n .then((settings) => {\n // Add a layer of customization to support app shell mode\n const customLayout = settings.composite['layout'];\n // Restore the layout.\n void notebookShell.restoreLayout(customLayout);\n })\n .catch((reason) => {\n console.error('Fail to load settings for the layout restorer.');\n console.error(reason);\n });\n }\n return notebookShell;\n },\n};\n/**\n * The default splash screen provider.\n */\nconst splash = {\n id: '@jupyter-notebook/application-extension:splash',\n description: 'Provides an empty splash screen.',\n autoStart: true,\n provides: ISplashScreen,\n activate: (app) => {\n const { restored } = app;\n const splash = document.createElement('div');\n splash.style.position = 'absolute';\n splash.style.width = '100%';\n splash.style.height = '100%';\n splash.style.zIndex = '10';\n return {\n show: (light = true) => {\n splash.style.backgroundColor = light ? 'white' : '#111111';\n document.body.appendChild(splash);\n return new DisposableDelegate(async () => {\n await restored;\n document.body.removeChild(splash);\n });\n },\n };\n },\n};\n/**\n * The default JupyterLab application status provider.\n */\nconst status = {\n id: '@jupyter-notebook/application-extension:status',\n description: 'The default JupyterLab application status provider.',\n autoStart: true,\n provides: ILabStatus,\n activate: (app) => {\n if (!(app instanceof NotebookApp)) {\n throw new Error(`${status.id} must be activated in Jupyter Notebook.`);\n }\n return app.status;\n },\n};\n/**\n * A plugin to display the document title in the browser tab title\n */\nconst tabTitle = {\n id: '@jupyter-notebook/application-extension:tab-title',\n description: 'A plugin to display the document title in the browser tab title.',\n autoStart: true,\n requires: [INotebookShell],\n activate: (app, shell) => {\n const setTabTitle = () => {\n const current = shell.currentWidget;\n if (current instanceof ConsolePanel) {\n const update = () => {\n const title = current.sessionContext.path || current.sessionContext.name;\n const basename = PathExt.basename(title);\n // Strip the \".ipynb\" suffix from filenames for display in tab titles.\n document.title = basename.replace(STRIP_IPYNB, '');\n };\n current.sessionContext.sessionChanged.connect(update);\n update();\n return;\n }\n else if (current instanceof DocumentWidget) {\n const update = () => {\n const basename = PathExt.basename(current.context.path);\n document.title = basename.replace(STRIP_IPYNB, '');\n };\n current.context.pathChanged.connect(update);\n update();\n }\n };\n shell.currentChanged.connect(setTabTitle);\n setTabTitle();\n },\n};\n/**\n * A plugin to display and rename the title of a file\n */\nconst title = {\n id: '@jupyter-notebook/application-extension:title',\n description: 'A plugin to display and rename the title of a file.',\n autoStart: true,\n requires: [INotebookShell, ITranslator],\n optional: [IDocumentManager, IRouter, IToolbarWidgetRegistry],\n activate: (app, shell, translator, docManager, router, toolbarRegistry) => {\n const { commands } = app;\n const trans = translator.load('notebook');\n const node = document.createElement('div');\n if (toolbarRegistry) {\n toolbarRegistry.addFactory('TopBar', 'widgetTitle', (toolbar) => {\n const widget = new Widget({ node });\n widget.id = 'jp-title';\n return widget;\n });\n }\n const addTitle = async () => {\n const current = shell.currentWidget;\n if (!current || !(current instanceof DocumentWidget)) {\n return;\n }\n if (node.children.length > 0) {\n return;\n }\n const h = document.createElement('h1');\n h.textContent = current.title.label.replace(STRIP_IPYNB, '');\n node.appendChild(h);\n node.style.marginLeft = '10px';\n if (!docManager) {\n return;\n }\n const isEnabled = () => {\n const { currentWidget } = shell;\n return !!(currentWidget && docManager.contextForWidget(currentWidget));\n };\n commands.addCommand(CommandIDs.duplicate, {\n label: () => trans.__('Duplicate'),\n isEnabled,\n execute: async () => {\n if (!isEnabled()) {\n return;\n }\n // Duplicate the file, and open the new file.\n const result = await docManager.duplicate(current.context.path);\n await commands.execute('docmanager:open', { path: result.path });\n },\n });\n commands.addCommand(CommandIDs.rename, {\n label: () => trans.__('Rename…'),\n isEnabled,\n execute: async () => {\n var _a;\n if (!isEnabled()) {\n return;\n }\n const result = await renameDialog(docManager, current.context);\n // activate the current widget to bring the focus\n if (current) {\n current.activate();\n }\n if (result === null) {\n return;\n }\n const newPath = current.context.path;\n const basename = PathExt.basename(newPath);\n h.textContent = basename.replace(STRIP_IPYNB, '');\n if (!router) {\n return;\n }\n const matches = (_a = router.current.path.match(TREE_PATTERN)) !== null && _a !== void 0 ? _a : [];\n const [, route, path] = matches;\n if (!route || !path) {\n return;\n }\n const encoded = encodeURIComponent(newPath);\n router.navigate(`/${route}/${encoded}`, {\n skipRouting: true,\n });\n },\n });\n node.onclick = async () => {\n void commands.execute(CommandIDs.rename);\n };\n };\n shell.currentChanged.connect(addTitle);\n void addTitle();\n },\n};\n/**\n * Plugin to toggle the top header visibility.\n */\nconst topVisibility = {\n id: '@jupyter-notebook/application-extension:top',\n description: 'Plugin to toggle the top header visibility.',\n requires: [INotebookShell, ITranslator],\n optional: [ISettingRegistry, ICommandPalette],\n activate: (app, notebookShell, translator, settingRegistry, palette) => {\n const trans = translator.load('notebook');\n const top = notebookShell.top;\n const pluginId = topVisibility.id;\n app.commands.addCommand(CommandIDs.toggleTop, {\n label: trans.__('Show Header'),\n execute: () => {\n top.setHidden(top.isVisible);\n if (settingRegistry) {\n void settingRegistry.set(pluginId, 'visible', top.isVisible ? 'yes' : 'no');\n }\n },\n isToggled: () => top.isVisible,\n });\n let adjustToScreen = false;\n if (settingRegistry) {\n const loadSettings = settingRegistry.load(pluginId);\n const updateSettings = (settings) => {\n // 'visible' property from user preferences or default settings\n let visible = settings.get('visible').composite;\n if (settings.user.visible !== undefined) {\n visible = settings.user.visible;\n }\n top.setHidden(visible === 'no');\n // adjust to screen from user preferences or default settings\n adjustToScreen = visible === 'automatic';\n };\n Promise.all([loadSettings, app.restored])\n .then(([settings]) => {\n updateSettings(settings);\n settings.changed.connect((settings) => {\n updateSettings(settings);\n });\n })\n .catch((reason) => {\n console.error(reason.message);\n });\n }\n if (palette) {\n palette.addItem({ command: CommandIDs.toggleTop, category: 'View' });\n }\n const onChanged = () => {\n if (!adjustToScreen) {\n return;\n }\n if (app.format === 'desktop') {\n notebookShell.expandTop();\n }\n else {\n notebookShell.collapseTop();\n }\n };\n // listen on format change (mobile and desktop) to make the view more compact\n app.formatChanged.connect(onChanged);\n },\n autoStart: true,\n};\n/**\n * Plugin to toggle the left or right side panel's visibility.\n */\nconst sidePanelVisibility = {\n id: '@jupyter-notebook/application-extension:sidepanel',\n description: 'Plugin to toggle the visibility of left or right side panel.',\n requires: [INotebookShell, ITranslator],\n optional: [IMainMenu, ICommandPalette],\n autoStart: true,\n activate: (app, notebookShell, translator, menu, palette) => {\n const trans = translator.load('notebook');\n /* Arguments for togglePanel command:\n * side, left or right area\n * title, widget title to show in the menu\n * id, widget ID to activate in the side panel\n */\n app.commands.addCommand(CommandIDs.togglePanel, {\n label: (args) => args['title'],\n caption: (args) => {\n // We do not substitute the parameter into the string because the parameter is not\n // localized (e.g., it is always 'left') even though the string is localized.\n if (args['side'] === 'left') {\n return trans.__('Show %1 in the left sidebar', args['title']);\n }\n else if (args['side'] === 'right') {\n return trans.__('Show %1 in the right sidebar', args['title']);\n }\n return trans.__('Show %1 in the sidebar', args['title']);\n },\n execute: (args) => {\n var _a, _b;\n switch (args['side']) {\n case 'left':\n if (notebookShell.leftCollapsed) {\n notebookShell.expandLeft(args.id);\n }\n else if (((_a = notebookShell.leftHandler.currentWidget) === null || _a === void 0 ? void 0 : _a.id) !== args.id) {\n notebookShell.expandLeft(args.id);\n }\n else {\n notebookShell.collapseLeft();\n if (notebookShell.currentWidget) {\n notebookShell.activateById(notebookShell.currentWidget.id);\n }\n }\n break;\n case 'right':\n if (notebookShell.rightCollapsed) {\n notebookShell.expandRight(args.id);\n }\n else if (((_b = notebookShell.rightHandler.currentWidget) === null || _b === void 0 ? void 0 : _b.id) !== args.id) {\n notebookShell.expandRight(args.id);\n }\n else {\n notebookShell.collapseRight();\n if (notebookShell.currentWidget) {\n notebookShell.activateById(notebookShell.currentWidget.id);\n }\n }\n break;\n }\n },\n isToggled: (args) => {\n switch (args['side']) {\n case 'left': {\n if (notebookShell.leftCollapsed) {\n return false;\n }\n const currentWidget = notebookShell.leftHandler.currentWidget;\n if (!currentWidget) {\n return false;\n }\n return currentWidget.id === args['id'];\n }\n case 'right': {\n if (notebookShell.rightCollapsed) {\n return false;\n }\n const currentWidget = notebookShell.rightHandler.currentWidget;\n if (!currentWidget) {\n return false;\n }\n return currentWidget.id === args['id'];\n }\n }\n return false;\n },\n });\n const sidePanelMenu = {\n left: null,\n right: null,\n };\n /**\n * The function which adds entries to the View menu for each widget of a side panel.\n *\n * @param area - 'left' or 'right', the area of the side panel.\n * @param entryLabel - the name of the main entry in the View menu for that side panel.\n * @returns - The disposable menu added to the View menu or null.\n */\n const updateMenu = (area, entryLabel) => {\n var _a;\n if (menu === null) {\n return null;\n }\n // Remove the previous menu entry for this side panel.\n (_a = sidePanelMenu[area]) === null || _a === void 0 ? void 0 : _a.dispose();\n // Creates a new menu entry and populates it with side panel widgets.\n const newMenu = new Menu({ commands: app.commands });\n newMenu.title.label = entryLabel;\n const widgets = notebookShell.widgets(area);\n let menuToAdd = false;\n for (const widget of widgets) {\n newMenu.addItem({\n command: CommandIDs.togglePanel,\n args: {\n side: area,\n title: `Show ${widget.title.caption}`,\n id: widget.id,\n },\n });\n menuToAdd = true;\n }\n // If there are widgets, add the menu to the main menu entry.\n if (menuToAdd) {\n sidePanelMenu[area] = menu.viewMenu.addItem({\n type: 'submenu',\n submenu: newMenu,\n });\n }\n };\n app.restored.then(() => {\n // Create menu entries for the left and right panel.\n if (menu) {\n const getSidePanelLabel = (area) => {\n if (area === 'left') {\n return trans.__('Left Sidebar');\n }\n else {\n return trans.__('Right Sidebar');\n }\n };\n const leftArea = notebookShell.leftHandler.area;\n const leftLabel = getSidePanelLabel(leftArea);\n updateMenu(leftArea, leftLabel);\n const rightArea = notebookShell.rightHandler.area;\n const rightLabel = getSidePanelLabel(rightArea);\n updateMenu(rightArea, rightLabel);\n const handleSidePanelChange = (sidePanel, widget) => {\n const label = getSidePanelLabel(sidePanel.area);\n updateMenu(sidePanel.area, label);\n };\n notebookShell.leftHandler.widgetAdded.connect(handleSidePanelChange);\n notebookShell.leftHandler.widgetRemoved.connect(handleSidePanelChange);\n notebookShell.rightHandler.widgetAdded.connect(handleSidePanelChange);\n notebookShell.rightHandler.widgetRemoved.connect(handleSidePanelChange);\n }\n // Add palette entries for side panels.\n if (palette) {\n const sidePanelPalette = new SidePanelPalette({\n commandPalette: palette,\n command: CommandIDs.togglePanel,\n });\n notebookShell.leftHandler.widgets.forEach((widget) => {\n sidePanelPalette.addItem(widget, notebookShell.leftHandler.area);\n });\n notebookShell.rightHandler.widgets.forEach((widget) => {\n sidePanelPalette.addItem(widget, notebookShell.rightHandler.area);\n });\n // Update menu and palette when widgets are added or removed from side panels.\n notebookShell.leftHandler.widgetAdded.connect((sidePanel, widget) => {\n sidePanelPalette.addItem(widget, sidePanel.area);\n });\n notebookShell.leftHandler.widgetRemoved.connect((sidePanel, widget) => {\n sidePanelPalette.removeItem(widget, sidePanel.area);\n });\n notebookShell.rightHandler.widgetAdded.connect((sidePanel, widget) => {\n sidePanelPalette.addItem(widget, sidePanel.area);\n });\n notebookShell.rightHandler.widgetRemoved.connect((sidePanel, widget) => {\n sidePanelPalette.removeItem(widget, sidePanel.area);\n });\n }\n });\n },\n};\n/**\n * The default tree route resolver plugin.\n */\nconst tree = {\n id: '@jupyter-notebook/application-extension:tree-resolver',\n description: 'The default tree route resolver plugin.',\n autoStart: true,\n requires: [IRouter],\n provides: JupyterFrontEnd.ITreeResolver,\n activate: (app, router) => {\n const { commands } = app;\n const set = new DisposableSet();\n const delegate = new PromiseDelegate();\n const treePattern = new RegExp('/(/tree/.*)?');\n set.add(commands.addCommand(CommandIDs.resolveTree, {\n execute: (async (args) => {\n var _a;\n if (set.isDisposed) {\n return;\n }\n const query = URLExt.queryStringToObject((_a = args.search) !== null && _a !== void 0 ? _a : '');\n const browser = query['file-browser-path'] || '';\n // Remove the file browser path from the query string.\n delete query['file-browser-path'];\n // Clean up artifacts immediately upon routing.\n set.dispose();\n delegate.resolve({ browser, file: PageConfig.getOption('treePath') });\n }),\n }));\n set.add(router.register({ command: CommandIDs.resolveTree, pattern: treePattern }));\n // If a route is handled by the router without the tree command being\n // invoked, resolve to `null` and clean up artifacts.\n const listener = () => {\n if (set.isDisposed) {\n return;\n }\n set.dispose();\n delegate.resolve(null);\n };\n router.routed.connect(listener);\n set.add(new DisposableDelegate(() => {\n router.routed.disconnect(listener);\n }));\n return { paths: delegate.promise };\n },\n};\n/**\n * Plugin to update tree path.\n */\nconst treePathUpdater = {\n id: '@jupyter-notebook/application-extension:tree-updater',\n description: 'Plugin to update tree path.',\n requires: [IRouter],\n provides: ITreePathUpdater,\n activate: (app, router) => {\n function updateTreePath(treePath) {\n if (treePath !== PageConfig.getOption('treePath')) {\n const path = URLExt.join(PageConfig.getOption('baseUrl') || '/', 'tree', URLExt.encodeParts(treePath));\n router.navigate(path, { skipRouting: true });\n // Persist the new tree path to PageConfig as it is used elsewhere at runtime.\n PageConfig.setOption('treePath', treePath);\n }\n }\n return updateTreePath;\n },\n autoStart: true,\n};\n/**\n * Translator plugin\n */\nconst translator = {\n id: '@jupyter-notebook/application-extension:translator',\n description: 'Translator plugin',\n requires: [INotebookShell, ITranslator],\n autoStart: true,\n activate: (app, notebookShell, translator) => {\n notebookShell.translator = translator;\n },\n};\n/**\n * Zen mode plugin\n */\nconst zen = {\n id: '@jupyter-notebook/application-extension:zen',\n description: 'Zen mode plugin.',\n autoStart: true,\n requires: [ITranslator],\n optional: [ICommandPalette, INotebookShell],\n activate: (app, translator, palette, notebookShell) => {\n const { commands } = app;\n const elem = document.documentElement;\n const trans = translator.load('notebook');\n const toggleOn = () => {\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.collapseTop();\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.menu.setHidden(true);\n zenModeEnabled = true;\n };\n const toggleOff = () => {\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.expandTop();\n notebookShell === null || notebookShell === void 0 ? void 0 : notebookShell.menu.setHidden(false);\n zenModeEnabled = false;\n };\n let zenModeEnabled = false;\n commands.addCommand(CommandIDs.toggleZen, {\n label: trans.__('Toggle Zen Mode'),\n execute: () => {\n if (!zenModeEnabled) {\n elem.requestFullscreen();\n toggleOn();\n }\n else {\n document.exitFullscreen();\n toggleOff();\n }\n },\n });\n document.addEventListener('fullscreenchange', () => {\n if (!document.fullscreenElement) {\n toggleOff();\n }\n });\n if (palette) {\n palette.addItem({ command: CommandIDs.toggleZen, category: 'Mode' });\n }\n },\n};\n/**\n * Export the plugins as default.\n */\nconst plugins = [\n dirty,\n info,\n logo,\n menus,\n menuSpacer,\n opener,\n pages,\n pathOpener,\n paths,\n rendermime,\n shell,\n sidePanelVisibility,\n splash,\n status,\n tabTitle,\n title,\n topVisibility,\n tree,\n treePathUpdater,\n translator,\n zen,\n];\nexport default plugins;\n"],"names":[],"sourceRoot":""}