Initial commit

main
Jerry Aldrich 4 years ago
commit 1693151e0b
  1. 15
      Dockerfile
  2. 23
      lighttpd.conf
  3. 41
      static/bower_components/jquery.terminal/.bower.json
  4. 12
      static/bower_components/jquery.terminal/.gitattributes
  5. 9
      static/bower_components/jquery.terminal/.github/FUNDING.yml
  6. 20
      static/bower_components/jquery.terminal/.github/ISSUE_TEMPLATE/bug.md
  7. 8
      static/bower_components/jquery.terminal/.github/ISSUE_TEMPLATE/feature.md
  8. 8
      static/bower_components/jquery.terminal/.github/ISSUE_TEMPLATE/question.md
  9. 5
      static/bower_components/jquery.terminal/.github/PULL_REQUEST_TEMPLATE
  10. 49
      static/bower_components/jquery.terminal/.github/support.svg
  11. 3
      static/bower_components/jquery.terminal/.gitmodules
  12. 15
      static/bower_components/jquery.terminal/.travis.yml
  13. 1679
      static/bower_components/jquery.terminal/CHANGELOG.md
  14. 105
      static/bower_components/jquery.terminal/CONTRIBUTING.md
  15. 21
      static/bower_components/jquery.terminal/LICENSE
  16. 316
      static/bower_components/jquery.terminal/README.md
  17. BIN
      static/bower_components/jquery.terminal/__tests__/Ken_Thompson__and_Dennis_Ritchie_at_PDP-11.jpg
  18. 564
      static/bower_components/jquery.terminal/__tests__/__snapshots__/terminal.spec.js.snap
  19. 136
      static/bower_components/jquery.terminal/__tests__/bs-pacis.ans
  20. 33
      static/bower_components/jquery.terminal/__tests__/ervy-plot-01
  21. 45
      static/bower_components/jquery.terminal/__tests__/ervy-plot-02
  22. 73
      static/bower_components/jquery.terminal/__tests__/nf-marble.ans
  23. 6745
      static/bower_components/jquery.terminal/__tests__/terminal.spec.js
  24. 30
      static/bower_components/jquery.terminal/bower.json
  25. 3306
      static/bower_components/jquery.terminal/css/emoji.css
  26. 17
      static/bower_components/jquery.terminal/css/jquery.terminal-2.0.0.min.css
  27. 985
      static/bower_components/jquery.terminal/css/jquery.terminal-2.22.0.css
  28. 17
      static/bower_components/jquery.terminal/css/jquery.terminal-2.22.0.min.css
  29. 985
      static/bower_components/jquery.terminal/css/jquery.terminal-src.css
  30. 985
      static/bower_components/jquery.terminal/css/jquery.terminal.css
  31. 17
      static/bower_components/jquery.terminal/css/jquery.terminal.min.css
  32. 1
      static/bower_components/jquery.terminal/css/jquery.terminal.min.css.map
  33. 5
      static/bower_components/jquery.terminal/files
  34. 26
      static/bower_components/jquery.terminal/import.html
  35. 113
      static/bower_components/jquery.terminal/js/ascii_table.js
  36. 172
      static/bower_components/jquery.terminal/js/autocomplete_menu.js
  37. 110
      static/bower_components/jquery.terminal/js/dterm.js
  38. 148
      static/bower_components/jquery.terminal/js/echo_newline.js
  39. 162
      static/bower_components/jquery.terminal/js/emoji.js
  40. 4
      static/bower_components/jquery.terminal/js/jquery-1.7.1.min.js
  41. 2
      static/bower_components/jquery.terminal/js/jquery.mousewheel-min.js
  42. 10959
      static/bower_components/jquery.terminal/js/jquery.terminal-2.22.0.js
  43. 47
      static/bower_components/jquery.terminal/js/jquery.terminal-2.22.0.min.js
  44. 10959
      static/bower_components/jquery.terminal/js/jquery.terminal-src.js
  45. 680
      static/bower_components/jquery.terminal/js/jquery.terminal.d.ts
  46. 10959
      static/bower_components/jquery.terminal/js/jquery.terminal.js
  47. 47
      static/bower_components/jquery.terminal/js/jquery.terminal.min.js
  48. 1
      static/bower_components/jquery.terminal/js/jquery.terminal.min.js.map
  49. 545
      static/bower_components/jquery.terminal/js/less.js
  50. 456
      static/bower_components/jquery.terminal/js/pipe.js
  51. 220
      static/bower_components/jquery.terminal/js/prism.js
  52. 50
      static/bower_components/jquery.terminal/js/terminal.widget.in
  53. 50
      static/bower_components/jquery.terminal/js/terminal.widget.js
  54. 1421
      static/bower_components/jquery.terminal/js/unix_formatting.js
  55. 86
      static/bower_components/jquery.terminal/js/xml_formatting.js
  56. 8226
      static/bower_components/jquery.terminal/package-lock.json
  57. 128
      static/bower_components/jquery.terminal/scripts/contributors.js
  58. 36
      static/bower_components/jquery.terminal/scripts/cssnano.js
  59. 46
      static/bower_components/jquery.terminal/scripts/methods.js
  60. 37
      static/bower_components/jquery.terminal/scripts/mkemoji
  61. 3
      static/bower_components/jquery.terminal/scripts/options
  62. 40
      static/bower_components/jquery.terminal/scripts/update-contributors-package.js
  63. 14
      static/bower_components/jquery.terminal/scripts/update-contributors-readme
  64. 154
      static/bower_components/jquery.terminal/templates/Makefile.in
  65. 26
      static/bower_components/jquery.terminal/templates/import.in
  66. 7
      static/bower_components/jquery.terminal/templates/npmrc.tmpl
  67. 169
      static/bower_components/jquery.terminal/templates/package.git
  68. 26
      static/bower_components/jquery.terminal/terminal.jquery.json
  69. 1027
      static/bower_components/jquery.terminal/test.ts
  70. 8
      static/bower_components/jquery.terminal/tsconfig.json
  71. 25
      static/bower_components/jquery/.bower.json
  72. 331
      static/bower_components/jquery/AUTHORS.txt
  73. 20
      static/bower_components/jquery/LICENSE.txt
  74. 62
      static/bower_components/jquery/README.md
  75. 14
      static/bower_components/jquery/bower.json
  76. 10881
      static/bower_components/jquery/dist/jquery.js
  77. 2
      static/bower_components/jquery/dist/jquery.min.js
  78. 1
      static/bower_components/jquery/dist/jquery.min.map
  79. 8782
      static/bower_components/jquery/dist/jquery.slim.js
  80. 2
      static/bower_components/jquery/dist/jquery.slim.min.js
  81. 1
      static/bower_components/jquery/dist/jquery.slim.min.map
  82. 36
      static/bower_components/jquery/external/sizzle/LICENSE.txt
  83. 2478
      static/bower_components/jquery/external/sizzle/dist/sizzle.js
  84. 3
      static/bower_components/jquery/external/sizzle/dist/sizzle.min.js
  85. 1
      static/bower_components/jquery/external/sizzle/dist/sizzle.min.map
  86. 876
      static/bower_components/jquery/src/ajax.js
  87. 103
      static/bower_components/jquery/src/ajax/jsonp.js
  88. 77
      static/bower_components/jquery/src/ajax/load.js
  89. 74
      static/bower_components/jquery/src/ajax/script.js
  90. 5
      static/bower_components/jquery/src/ajax/var/location.js
  91. 5
      static/bower_components/jquery/src/ajax/var/nonce.js
  92. 5
      static/bower_components/jquery/src/ajax/var/rquery.js
  93. 170
      static/bower_components/jquery/src/ajax/xhr.js
  94. 13
      static/bower_components/jquery/src/attributes.js
  95. 141
      static/bower_components/jquery/src/attributes/attr.js
  96. 186
      static/bower_components/jquery/src/attributes/classes.js
  97. 143
      static/bower_components/jquery/src/attributes/prop.js
  98. 33
      static/bower_components/jquery/src/attributes/support.js
  99. 191
      static/bower_components/jquery/src/attributes/val.js
  100. 236
      static/bower_components/jquery/src/callbacks.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,15 @@
# Switch to alpine to serve content built above
FROM alpine:latest
EXPOSE 8080
RUN apk add --no-cache lighttpd=1.4.54-r0
RUN chown -R lighttpd /var/log/lighttpd
USER lighttpd
COPY lighttpd.conf /etc/lighttpd/lighttpd.conf
COPY static/ /srv/http/
CMD ["lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"]

@ -0,0 +1,23 @@
var.logdir = "/var/log/lighttpd"
var.statedir = "/var/lib/lighttpd"
server.modules = (
"mod_access",
"mod_accesslog",
)
include "mime-types.conf"
server.document-root = "/srv/http/"
server.pid-file = "/tmp/lighttpd.pid"
server.errorlog-use-syslog = "enable"
accesslog.use-syslog = "enable"
server.indexfiles = ("index.php", "index.html", "index.htm", "default.htm")
server.port = 8080
url.access-deny = ("~", ".inc")
server.network-backend = "writev"

@ -0,0 +1,41 @@
{
"name": "jquery.terminal",
"version": "2.22.0",
"main": [
"js/jquery.terminal.min.js",
"js/jquery.mousewheel-min.js",
"css/jquery.terminal.min.css"
],
"description": "jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications.",
"license": "MIT",
"ignore": [
"examples",
"README.in",
"bower.in",
"Makefile",
"manifest",
".gitignore",
".npmignore",
"package.in",
"package.json",
"bin",
"version"
],
"dependencies": {
"jquery": "~3"
},
"devDependencies": {
"keyboardevent-key-polyfill": "^1.0.2"
},
"homepage": "https://github.com/jcubic/jquery.terminal",
"_release": "2.22.0",
"_resolution": {
"type": "version",
"tag": "2.22.0",
"commit": "9c28d597e8295a5bd282030256a9fe1b50a371c1"
},
"_source": "https://github.com/jcubic/jquery.terminal.git",
"_target": "^2.22.0",
"_originalSource": "jquery.terminal",
"_direct": true
}

@ -0,0 +1,12 @@
* text eol=lf
.* text eol=lf
js/jquery.terminal-[0-9.]* binary
js/jquery.terminal.min.js binary
js/jquery.terminal.js binary
css/jquery.terminal-[0-9.]* binary
css/jquery.terminal.min.css binary
css/jquery.terminal.css binary
css/*map binary
js/*map binary
__tests__/*.ans binary
*.png binary

@ -0,0 +1,9 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi:
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
custom: https://www.paypal.me/jcubic

@ -0,0 +1,20 @@
---
name: Bug Report
about: Found bug in the library
---
### Issue summary
### Expected behavior
### Actual behavior
### Steps to reproduce
### Browser and OS
<!--
You can create demo by forking this codepen http://codepen.io/jcubic/pen/MbVMwO
Please don't close the issue, I'm marking it as resolved and closing when merge to master
-->

@ -0,0 +1,8 @@
---
name: Feature
about: Feature request or proposal
---
### I have idea for a new feature for jQuery Terminal
<!-- add your idea here -->

@ -0,0 +1,8 @@
---
name: Question
about: Question about the library
---
### I have question related to jQuery Terminal
<!-- add your question here -->

@ -0,0 +1,5 @@
<!--
Thank you the PR, if you want your PR to be merged make sure you modify -src files and create PR against devel branch
-->

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" id="svg8" version="1.1" viewBox="0 0 52.916493 38.395805" height="38.395805mm" width="52.916492mm">
<defs id="defs2">
<clipPath id="clip0">
<rect y="0" x="0" width="104" height="48" fill="#ffffff" id="rect863" />
</clipPath>
</defs>
<metadata id="metadata5">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-25.681721,-32.05098)" id="layer1">
<rect ry="0.98588061" rx="0.98588061" y="32.05098" x="25.681721" height="38.395805" width="52.916492" id="rect833" style="opacity:1;fill:#2f2f2f;fill-opacity:1;stroke-width:0.5165;stroke-linecap:round" />
<g transform="matrix(0.32062318,0,0,0.32062318,31.189928,49.33767)" id="g886" style="fill:none">
<g clip-path="url(#clip0)" id="g861">
<path d="m 71.4061,9.88963 c 0.0012,-0.48657 0.1481,-0.96192 0.4223,-1.36624 0.2741,-0.40432 0.6633,-0.71954 1.1185,-0.906 0.4551,-0.18645 0.956,-0.23582 1.4395,-0.14187 0.4835,0.09394 0.9281,0.32699 1.2778,0.66982 0.3497,0.34283 0.5889,0.78013 0.6875,1.25687 0.0985,0.47674 0.0521,0.97159 -0.1335,1.42239 -0.1856,0.4507 -0.502,0.8372 -0.9096,1.1108 -0.4075,0.2735 -0.8879,0.422 -1.3806,0.4266 -0.3304,0.0024 -0.6579,-0.0599 -0.9638,-0.1831 -0.3058,-0.1232 -0.584,-0.3049 -0.8184,-0.5347 -0.2344,-0.2299 -0.4205,-0.5032 -0.5474,-0.8043 -0.127,-0.3011 -0.1923,-0.6241 -0.1923,-0.95027 z m 0,8.83007 c 0.0012,-0.4866 0.1481,-0.962 0.4223,-1.3663 0.2741,-0.4043 0.6633,-0.7195 1.1185,-0.906 0.4551,-0.1864 0.956,-0.2358 1.4395,-0.1419 0.4835,0.094 0.9281,0.327 1.2778,0.6699 0.3497,0.3428 0.5889,0.7801 0.6875,1.2568 0.0985,0.4768 0.0521,0.9717 -0.1335,1.4224 -0.1856,0.4508 -0.502,0.8372 -0.9096,1.1108 -0.4075,0.2736 -0.8879,0.422 -1.3806,0.4267 -0.3319,0.0023 -0.6609,-0.0605 -0.9679,-0.1848 -0.3071,-0.1243 -0.586,-0.3076 -0.8207,-0.5393 -0.2346,-0.2317 -0.4203,-0.5071 -0.5462,-0.8103 -0.1259,-0.3032 -0.1895,-0.628 -0.1871,-0.9557 z" fill="#007eff" id="path843" />
<path d="m 49.3708,22.8756 -2.8677,-4.8859 -2.8915,4.8859 h -4.4834 l 5.1213,-8.6887 -4.9007,-8.25312 h 4.4595 l 2.6948,4.47972 2.6471,-4.47972 h 4.4595 l -4.8768,8.24132 5.1213,8.6888 z" fill="#ffffff" id="path845" />
<path d="m 53.9555,19.0257 3.3804,-1.9543 c 0.2573,0.7222 0.7452,1.3424 1.3904,1.7671 0.6452,0.4247 1.4126,0.6309 2.1868,0.5875 1.8661,0 2.3311,-0.724 2.3311,-1.3775 0,-1.0419 -0.9837,-1.454 -3.5771,-2.1545 -2.5935,-0.7005 -5.0498,-1.9132 -5.0498,-5.1508 0,-3.23769 2.7961,-5.15675 5.7592,-5.15675 1.3198,-0.05346 2.6258,0.28252 3.7514,0.96507 1.1256,0.68255 2.0197,1.68072 2.5683,2.86715 l -3.3089,1.91313 c -0.5962,-1.2067 -1.3951,-1.96022 -2.981,-1.96022 -1.2281,0 -1.8362,0.58867 -1.8362,1.28332 0,0.777 0.4173,1.3068 3.0882,2.1074 2.671,0.8006 5.5148,1.6659 5.5148,5.2509 0,3.2671 -2.6471,5.2038 -6.3733,5.2038 -3.5652,0 -5.8904,-1.6953 -6.8443,-4.1913 z" fill="#ffffff" id="path847" />
<path d="m 38.6393,34.7961 c -0.0346,-1.1688 0.173,-2.3323 0.6102,-3.4191 0.4371,-1.0868 1.0946,-2.0739 1.932,-2.9007 0.8375,-0.8269 1.8372,-1.4761 2.9378,-1.9077 1.1007,-0.4317 2.2791,-0.6367 3.4629,-0.6025 1.4607,-0.0149 2.901,0.3397 4.1837,1.0301 1.2826,0.6904 2.3648,1.6936 3.1435,2.914 l -3.3804,1.9367 c -0.4142,-0.6648 -1.0005,-1.2084 -1.6985,-1.5747 -0.698,-0.3664 -1.4824,-0.5421 -2.2722,-0.5092 -3.0406,0 -5.002,2.0074 -5.002,5.0331 0,3.0258 1.9614,5.0332 5.002,5.0332 0.7898,0.0373 1.5752,-0.136 2.2738,-0.5016 0.6987,-0.3656 1.2848,-0.9101 1.6969,-1.5764 l 3.3804,1.9367 c -0.7794,1.2234 -1.8658,2.2272 -3.1537,2.9141 -1.288,0.6869 -2.7338,1.0336 -4.1974,1.0064 -1.18,0.03 -2.3539,-0.1775 -3.4501,-0.6099 -1.0962,-0.4323 -2.0919,-1.0804 -2.9263,-1.9048 -0.8344,-0.8245 -1.4901,-1.808 -1.9273,-2.8907 -0.4371,-1.0826 -0.6465,-2.2418 -0.6153,-3.407 z" fill="#ffffff" id="path849" />
<path d="m 55.7679,34.7962 c 0,-1.7464 0.5245,-3.4536 1.5072,-4.9057 0.9826,-1.4521 2.3793,-2.5839 4.0134,-3.2522 1.6341,-0.6683 3.4322,-0.8432 5.167,-0.5025 1.7347,0.3407 3.3282,1.1817 4.5789,2.4166 1.2507,1.2349 2.1024,2.8083 2.4475,4.5211 0.345,1.7129 0.1679,3.4883 -0.5089,5.1018 -0.6769,1.6134 -1.8231,2.9925 -3.2938,3.9628 -1.4706,0.9702 -3.1996,1.4881 -4.9684,1.4881 -1.1782,0.0134 -2.3471,-0.2058 -3.4383,-0.6448 -1.0911,-0.439 -2.0824,-1.0889 -2.9155,-1.9116 -0.8332,-0.8226 -1.4914,-1.8014 -1.936,-2.8787 -0.4446,-1.0774 -0.6667,-2.2316 -0.6531,-3.3949 z m 13.9211,0 C 69.7122,34.1336 69.6001,33.4733 69.3593,32.8544 69.1185,32.2356 68.754,31.6709 68.2875,31.1941 67.821,30.7174 67.262,30.3382 66.644,30.0792 c -0.6181,-0.259 -1.2826,-0.3924 -1.9541,-0.3924 -0.6714,0 -1.3359,0.1334 -1.954,0.3924 -0.618,0.259 -1.177,0.6382 -1.6435,1.1149 -0.4665,0.4768 -0.831,1.0415 -1.0718,1.6603 -0.2408,0.6189 -0.3529,1.2792 -0.3297,1.9418 -0.0232,0.6625 0.0889,1.3229 0.3297,1.9417 0.2408,0.6189 0.6053,1.1835 1.0718,1.6603 0.4665,0.4768 1.0255,0.856 1.6435,1.1149 0.6181,0.259 1.2826,0.3925 1.954,0.3925 0.6715,0 1.336,-0.1335 1.9541,-0.3925 0.618,-0.2589 1.177,-0.6381 1.6435,-1.1149 0.4665,-0.4768 0.831,-1.0414 1.0718,-1.6603 0.2408,-0.6188 0.3529,-1.2792 0.3297,-1.9417 z" fill="#ffffff" id="path851" />
<path d="m 91.0088,34.7962 c 0,4.7917 -3.5771,8.4709 -8.3466,8.4709 H 75.8179 V 26.3253 h 6.8622 c 4.7278,0 8.3287,3.6968 8.3287,8.4709 z m -3.7738,0 c 0,-2.9021 -1.8602,-4.7094 -4.5549,-4.7094 h -2.9452 v 9.454 h 2.9452 c 2.6947,0 4.5549,-1.8366 4.5549,-4.7446 z" fill="#ffffff" id="path853" />
<path d="m 104,39.5408 v 3.7263 H 93.2149 V 26.3253 h 10.6601 v 3.7321 h -6.7372 v 2.8021 h 6.1292 v 3.6791 h -6.1292 v 3.0022 z" fill="#ffffff" id="path855" />
<path d="m 22.4169,40.2059 v -8.7888 c 0,-2.9433 -1.6932,-5.2627 -4.388,-4.9507 v -5.2333 c 2.6948,0.312 4.388,-2.0014 4.388,-4.9742 V 7.47597 c 0,-8.06476 4.7397,-7.476091255 9.4258,-7.476091255 V 4.38546 c -2.6948,-0.312 -4.388,0.12362 -4.388,3.09051 v 8.78293 c 0,3.4084 -1.0671,6.0044 -3.3208,7.5526 2.2537,1.6071 3.3208,4.2031 3.3208,7.6056 v 8.7888 c 0,2.9434 1.6932,3.4025 4.388,3.0905 v 4.7094 c -4.066,-0.0059 -9.4258,0.2649 -9.4258,-7.7999 z" fill="#ffffff" id="path857" />
<path d="m 0,47.9964 v -4.7093 c 2.69479,0.312 4.38798,-0.1237 4.38798,-3.0906 v -8.7829 c 0,-3.4025 1.06123,-5.9985 3.3208,-7.6056 -2.25957,-1.5482 -3.3208,-4.1207 -3.3208,-7.5526 V 7.47246 C 4.38798,4.52912 2.69479,4.06996 0,4.38195 v -4.38558077 c 4.68608,0 9.42582,-0.58866823 9.42582,7.47609077 v 8.78294 c 0,2.9728 1.68718,5.298 4.38198,4.9742 v 5.2569 c -2.6948,-0.312 -4.38198,1.9838 -4.38198,4.9507 v 8.7652 c 0,8.0648 -5.35978,7.794 -9.42582,7.794 z" fill="#ffffff" id="path859" />
</g>
</g>
<g style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.58097px;line-height:1.25;font-family:Franchise;-inkscape-font-specification:Franchise;letter-spacing:0.160893px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.160893" id="text890" aria-label="Get Support via">
<path id="path848" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 32.640112,34.958965 q 0.223105,0 0.420467,0.08581 0.197363,0.08581 0.343239,0.231686 0.145877,0.145877 0.231686,0.343239 0.08581,0.197362 0.08581,0.420468 v 0.274591 q 0,0.120133 -0.111552,0.154457 l -0.780869,0.283172 q -0.111552,0.03432 -0.111552,-0.08581 v -0.583506 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145877,-0.06007 h -0.06865 q -0.08581,0 -0.145877,0.06007 -0.06007,0.06007 -0.06007,0.145876 v 3.878599 q 0,0.08581 0.06007,0.145876 0.06007,0.06007 0.145877,0.06007 h 0.06865 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 v -1.527413 h -0.240268 v -0.97823 h 1.124108 q 0.120133,0 0.120133,0.120133 v 2.428415 q 0,0.223105 -0.08581,0.420467 -0.08581,0.197362 -0.231686,0.343239 -0.145876,0.145876 -0.343239,0.231686 -0.197362,0.08581 -0.420467,0.08581 h -0.326077 q -0.223105,0 -0.420467,-0.08581 -0.197363,-0.08581 -0.343239,-0.231686 -0.145877,-0.145877 -0.231686,-0.343239 -0.08581,-0.197362 -0.08581,-0.420467 v -3.964408 q 0,-0.223106 0.08581,-0.420468 0.08581,-0.197362 0.231686,-0.343239 0.145876,-0.145876 0.343239,-0.231686 0.197362,-0.08581 0.420467,-0.08581 h 0.326077 z" />
<path id="path850" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 36.550878,40.021738 q 0.120133,0 0.120133,0.120133 v 0.763706 q 0,0.120134 -0.120133,0.120134 h -1.862071 q -0.120133,0 -0.120133,-0.120134 v -4.908314 q 0,-0.120134 0.120133,-0.120134 h 1.862071 q 0.120133,0 0.120133,0.120134 v 0.763706 q 0,0.120134 -0.120133,0.120134 h -0.978231 v 0.97823 h 0.849516 q 0.120134,0 0.120134,0.120134 v 0.763706 q 0,0.120134 -0.120134,0.120134 h -0.849516 v 1.158431 h 0.978231 z" />
<path id="path852" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 39.72369,35.877129 q 0.120134,0 0.120134,0.120134 v 0.763706 q 0,0.120134 -0.120134,0.120134 h -0.609249 v 4.024474 q 0,0.120134 -0.120133,0.120134 h -0.763706 q -0.0429,0 -0.08581,-0.03432 -0.03432,-0.03432 -0.03432,-0.08581 V 36.881103 H 37.5098 q -0.120133,0 -0.120133,-0.120134 v -0.763706 q 0,-0.120134 0.120133,-0.120134 h 2.21389 z" />
<path id="path854" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 43.177518,34.958965 q 0.223105,0 0.420467,0.08581 0.197363,0.08581 0.343239,0.231686 0.145877,0.145877 0.231686,0.343239 0.08581,0.197362 0.08581,0.420468 v 0.326076 q 0,0.120134 -0.111553,0.154458 l -0.780868,0.205943 q -0.111552,0.03432 -0.111552,-0.08581 v -0.557763 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145877,-0.06007 h -0.06865 q -0.08581,0 -0.145877,0.06007 -0.06007,0.06007 -0.06007,0.145876 v 0.780869 q 0.0086,0.09439 0.03432,0.163038 0.02574,0.06865 0.09439,0.137296 l 1.124107,0.840935 q 0.137295,0.120133 0.171619,0.248848 0.0429,0.120133 0.06007,0.274591 v 1.475927 q 0,0.223105 -0.08581,0.420467 -0.08581,0.197362 -0.231686,0.343239 -0.145876,0.145876 -0.343239,0.231686 -0.197362,0.08581 -0.420467,0.08581 h -0.326077 q -0.223105,0 -0.420467,-0.08581 -0.197363,-0.08581 -0.343239,-0.231686 -0.145877,-0.145877 -0.231686,-0.343239 -0.08581,-0.197362 -0.08581,-0.420467 v -0.823773 q 0,-0.120134 0.111552,-0.154458 l 0.780869,-0.205943 q 0.111552,-0.03432 0.111552,0.08581 v 1.055459 q 0,0.08581 0.06007,0.145876 0.06007,0.06007 0.145877,0.06007 h 0.06865 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 v -1.132688 q -0.0086,-0.111553 -0.03432,-0.197363 -0.02574,-0.08581 -0.102972,-0.154457 l -1.106945,-0.849516 q -0.128715,-0.120134 -0.188781,-0.240267 -0.05149,-0.120134 -0.05149,-0.317496 v -1.029716 q 0,-0.223106 0.08581,-0.420468 0.08581,-0.197362 0.231686,-0.343239 0.145876,-0.145876 0.343239,-0.231686 0.197362,-0.08581 0.420467,-0.08581 h 0.326077 z" />
<path id="path856" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 47.34571,35.877129 q 0.120134,0 0.120134,0.120134 v 4.007313 q 0,0.223105 -0.08581,0.420467 -0.08581,0.197362 -0.231686,0.343239 -0.145877,0.145876 -0.343239,0.231686 -0.197362,0.08581 -0.420467,0.08581 h -0.326077 q -0.223105,0 -0.420468,-0.08581 -0.197362,-0.08581 -0.343239,-0.231686 -0.145876,-0.145877 -0.231686,-0.343239 -0.08581,-0.197362 -0.08581,-0.420467 v -4.007313 q 0,-0.120134 0.120133,-0.120134 h 0.763706 q 0.120134,0 0.120134,0.120134 v 3.964408 q 0,0.08581 0.06007,0.145876 0.06007,0.06007 0.145876,0.06007 h 0.06865 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 v -3.964408 q 0,-0.120134 0.120134,-0.120134 h 0.763706 z" />
<path id="path858" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 49.720482,35.877129 q 0.223105,0 0.420467,0.08581 0.197363,0.08581 0.343239,0.231686 0.145877,0.145877 0.231686,0.343239 0.08581,0.197362 0.08581,0.420467 V 38.0996 q 0,0.223106 -0.08581,0.420468 -0.08581,0.197362 -0.231686,0.343239 -0.145876,0.145876 -0.343239,0.231686 -0.197362,0.08581 -0.420467,0.08581 h -0.403306 v 1.724774 q 0,0.120134 -0.120133,0.120134 h -0.763707 q -0.120133,0 -0.120133,-0.120134 v -4.908314 q 0,-0.120134 0.120133,-0.120134 z m 0.07723,1.124107 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145877,-0.06007 h -0.274591 v 1.467346 h 0.274591 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 z" />
<path id="path860" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 52.927616,35.877129 q 0.223105,0 0.420468,0.08581 0.197362,0.08581 0.343238,0.231686 0.145877,0.145877 0.231687,0.343239 0.08581,0.197362 0.08581,0.420467 V 38.0996 q 0,0.223106 -0.08581,0.420468 -0.08581,0.197362 -0.231687,0.343239 -0.145876,0.145876 -0.343238,0.231686 -0.197363,0.08581 -0.420468,0.08581 h -0.403305 v 1.724774 q 0,0.120134 -0.120134,0.120134 h -0.763706 q -0.120134,0 -0.120134,-0.120134 v -4.908314 q 0,-0.120134 0.120134,-0.120134 z m 0.07723,1.124107 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145876,-0.06007 h -0.274591 v 1.467346 h 0.274591 q 0.08581,0 0.145876,-0.06007 0.06007,-0.06007 0.06007,-0.145876 z" />
<path id="path862" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 57.130141,40.004576 q 0,0.223105 -0.08581,0.420467 -0.08581,0.197362 -0.231686,0.343239 -0.145876,0.145876 -0.343239,0.231686 -0.197362,0.08581 -0.420467,0.08581 h -0.326077 q -0.223105,0 -0.420468,-0.08581 -0.197362,-0.08581 -0.343238,-0.231686 -0.145877,-0.145877 -0.231687,-0.343239 -0.08581,-0.197362 -0.08581,-0.420467 v -3.106311 q 0,-0.223106 0.08581,-0.420468 0.08581,-0.197362 0.231687,-0.343239 0.145876,-0.145876 0.343238,-0.231686 0.197363,-0.08581 0.420468,-0.08581 h 0.326077 q 0.223105,0 0.420467,0.08581 0.197363,0.08581 0.343239,0.231686 0.145877,0.145877 0.231686,0.343239 0.08581,0.197362 0.08581,0.420468 z m -1.003974,-3.063407 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145877,-0.06007 h -0.06865 q -0.08581,0 -0.145876,0.06007 -0.06007,0.06007 -0.06007,0.145876 v 3.020502 q 0,0.08581 0.06007,0.145876 0.06007,0.06007 0.145876,0.06007 h 0.06865 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 z" />
<path id="path864" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 58.981475,40.905577 q 0,0.120134 -0.128714,0.120134 h -0.763707 q -0.111552,0 -0.111552,-0.120134 v -4.908314 q 0,-0.120134 0.120133,-0.120134 h 1.287146 q 0.223105,0 0.420467,0.08581 0.197363,0.08581 0.343239,0.231686 0.145877,0.145877 0.231686,0.343239 0.08581,0.197362 0.08581,0.420467 v 1.05546 q 0,0.317496 -0.188781,0.574925 -0.188782,0.248848 -0.454792,0.386143 l 0.815192,1.930718 q 0.02574,0.120134 -0.08581,0.120134 h -0.780868 q -0.05149,0 -0.102972,-0.03432 -0.0429,-0.03432 -0.06007,-0.08581 l -0.626411,-1.587479 z m 0,-2.728748 h 0.274591 q 0.08581,0 0.145877,-0.06007 0.06007,-0.06007 0.06007,-0.145876 v -0.96965 q 0,-0.08581 -0.06007,-0.145876 -0.06007,-0.06007 -0.145877,-0.06007 h -0.274591 z" />
<path id="path866" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 63.398512,35.877129 q 0.120134,0 0.120134,0.120134 v 0.763706 q 0,0.120134 -0.120134,0.120134 h -0.609249 v 4.024474 q 0,0.120134 -0.120133,0.120134 h -0.763707 q -0.0429,0 -0.08581,-0.03432 -0.03432,-0.03432 -0.03432,-0.08581 v -4.024474 h -0.600668 q -0.120134,0 -0.120134,-0.120134 v -0.763706 q 0,-0.120134 0.120134,-0.120134 h 2.21389 z" />
<path id="path868" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 68.233878,35.877129 q 0.120133,0 0.102971,0.120134 l -1.012554,4.908314 q -0.01716,0.120134 -0.137296,0.120134 h -0.755125 q -0.120133,0 -0.137295,-0.120134 l -1.012555,-4.908314 q -0.01716,-0.120134 0.102972,-0.120134 h 0.926745 q 0.111552,0 0.128714,0.120134 l 0.35182,3.209282 h 0.03432 l 0.35182,-3.209282 q 0.01716,-0.120134 0.128714,-0.120134 h 0.926745 z" />
<path id="path870" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 69.982234,40.905577 q 0,0.120134 -0.120133,0.120134 h -0.763706 q -0.120134,0 -0.120134,-0.120134 v -4.908314 q 0,-0.120134 0.120134,-0.120134 h 0.763706 q 0.120133,0 0.120133,0.120134 z" />
<path id="path872" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Franchise;-inkscape-font-specification:Franchise;fill:#ffffff;stroke-width:0.160893" d="m 73.403887,40.905577 q 0.01716,0.120134 -0.102971,0.120134 h -0.780868 q -0.111553,0 -0.128715,-0.120134 l -0.06865,-0.840935 h -0.53202 l -0.06865,0.840935 q -0.01716,0.120134 -0.128714,0.120134 h -0.780868 q -0.120134,0 -0.102972,-0.120134 l 0.643573,-4.908314 q 0.01716,-0.120134 0.137295,-0.120134 h 1.132688 q 0.120134,0 0.137296,0.120134 z m -1.14985,-1.802003 -0.163038,-1.896395 h -0.06865 l -0.163038,1.896395 z" />
</g>
<path id="path896" d="M 31.189928,43.652224 H 72.852326" style="fill:none;stroke:#ffffff;stroke-width:0.322152;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,3 @@
[submodule "examples/json-rpc"]
path = examples/json-rpc
url = https://github.com/jcubic/json-rpc.git

@ -0,0 +1,15 @@
language: node_js
node_js:
- 14.3.0
before_install:
- sudo apt-get -y install graphicsmagick
install:
- npm ci
script:
- make
- make lint
- make tscheck
- make skipped_tests
- make test || travis_terminate 1
after_script:
- make coveralls

File diff suppressed because it is too large Load Diff

@ -0,0 +1,105 @@
## Contributing
All contribution are welcome even not tech one. To contribute you need to fork, then clone the repo:
```
git clone git@github.com:your-name/jquery.terminal.git
```
Please only modify `js/jquery.terminal-src.js`/`css/jquery.terminal-src.css` files. You can run `make`, but you may have conflicts others push commits with their build (you may have conflict because there is build date/time in build file) make sure you're on devel branch and create PR to devel brach as well, fixes to examples and README can be made directly to master but they could also be made to devel.
Non tech contribution are also welcome, if you find a bug in documentation on the website you can file an issue to [jcubic/jquery.terminal-www](https://github.com/jcubic/jquery.terminal-www).
## List of contributors with avatars
To update the list, the script need to be run when change is merged to master and since all merges are done on
devel. I need to run the script when I'm releasing new version. To help me remember, if this is yours first
contribution, please modify template/Makefile.in and update line `UPDATE_CONTRIBUTORS=1` it should be 1 which
is true (0 is false). On each build it will show red reminder message and it will stop build when run on master.
## Building the project
The process of building the project is very simple all you need is this:
```bash
clone https://github.com/jcubic/jquery.terminal.git
cd jquery.terminal
npm install
make
```
While developing you can use -src versions they are work fine. Make will just create
Release files that have proper version number, create minified files and build emoji
css.
## Test
You should run test to make sure you don't break anything, to run tests from browser you need to run
```bash
npm install
make test
```
and run ESlint and JSONLint using:
```bash
make lint
```
you can also run test coverage using
```bash
make coverage
```
## README
if you want to modify readme please modify the one in `./templates` directory, because
that one is source file with {{VER}} markers that get filled with current version when
running `make`.
## Release Cycle
* New version is developed on devel branch
* Each fix and feature need to be added to CHANGELOG.md file
* After random number of feature and bugfixes are done, the code need to be merged with master
```bash
git checkout master
git merge devel --no-ff -m 'merge with devel'
```
* then the next version need to be created, last version from CHANGELOG need to be used
to call version script that rename files that have version at the end.
``bash
./scripts/version 2.21.0
make
git commit -am 'version 2.21.0'
git push
git tag 2.21.0
git push --tags
```
**NOTE:** if something is wrong (e.g. Travis CI failed) the tag can be removed, fix can be added
in new commit and tag need to be added again.
* Now version on GitHub is released. You need to wait a bit to have confirmation
from CI that the build was successful. In mean time you can add Release Notes
on GitHub. Just click releases -> draft new release then pick the version
and copy paste what's in CHANGELOG.md file.
* After you git confirmation that CI (travis) run successfully you can release
to npm. By calling:
```bash
make publish
```
* Script will clone the repo (just in case you have lot of files in repo that you
don't want to publish to npm) into ./npm directory and run `npm publish`,
after that it will delete the directory.
* New version is ready.

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2011-2019 Jakub Jankiewicz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,316 @@
```
_______ ________ __
/ / _ /_ ____________ _/__ ___/______________ _____ / /
__ / / // / // / _ / _/ // / / / _ / _/ / / \/ / _ \/ /
/ / / // / // / ___/ // // / / / ___/ // / / / / /\ / // / /__
\___/____ \\__/____/_/ \__ / /_/____/_//_/_/_/_/_/ \/\__\_\___/
\/ /____/ version 2.22.0
```
https://terminal.jcubic.pl
[![npm](https://img.shields.io/badge/npm-2.22.0-blue.svg)](https://www.npmjs.com/package/jquery.terminal)
![bower](https://img.shields.io/badge/bower-2.22.0-yellow.svg)
[![travis](https://travis-ci.org/jcubic/jquery.terminal.svg?branch=master&9fb3dcfddd2a4d346dc8cffbc4089553c068b292)](https://travis-ci.org/jcubic/jquery.terminal)
[![Coverage Status](https://coveralls.io/repos/github/jcubic/jquery.terminal/badge.svg?branch=master&634dd6bdb563cac4da5f3e6ae04ce222)](https://coveralls.io/github/jcubic/jquery.terminal?branch=master)
![downloads](https://img.shields.io/npm/dm/jquery.terminal.svg?style=flat)
[![](https://data.jsdelivr.com/v1/package/npm/jquery.terminal/badge?style=rounded)](https://www.jsdelivr.com/package/npm/jquery.terminal)
[![LICENSE MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/jcubic/jquery.terminal/blob/master/LICENSE)
[![Paid Support](https://github.com/jcubic/jquery.terminal/blob/master/.github/support.svg?raw=true)](https://xscode.com/jcubic/jquery.terminal)
### Summary
jQuery Terminal Emulator is a plugin for creating command line interpreters in
your applications. It can automatically call JSON-RPC service when a user types
commands or you can provide your own function in which you can parse user
commands. It's ideal if you want to provide additional functionality for power
users. It can also be used to debug your application.
You can use this JavaScript library to create a web based terminal on any website.
### Features:
* You can create an interpreter for your JSON-RPC service with one line
of code (just use url as first argument).
* Support for authentication (you can provide functions when users enter
login and password or if you use JSON-RPC it can automatically call
login function on the server and pass token to all functions).
* Stack of interpreters - you can create commands that trigger additional
interpreters (eg. you can use couple of JSON-RPC service and run them
when user type command)
* Command Tree - you can use nested objects. Each command will invoke a
function, if the value is an object it will create a new interpreter and
use the function from that object as commands. You can use as many nested
object/commands as you like. If the value is a string it will create
JSON-RPC service.
* Support for command line history, it uses Local Storage if possible.
* Support for tab completion.
* Includes keyboard shortcut from bash like CTRL+A, CTRL+D, CTRL+E etc.
* Multiple terminals on one page (every terminal can have different
commands, its own authentication function and its own command history).
* It catches all exceptions and displays error messages in the terminal
(you can see errors in your javascript and php code in terminal if they
are in the interpreter function).
* Using extended commands you can change working of the terminal without
touching the front-end code (using echo method and terminal formatting
like syntax). Read more in
[docs](https://terminal.jcubic.pl/api_reference.php#extended_commands)
* Full mobile support
### Installation
Include jQuery library, you can use cdn from https://jquery.com/download/
```html
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
```
Then include js/jquery.terminal-2.22.0.min.js and css/jquery.terminal-2.22.0.min.css
You can grab the files from CDN:
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.22.0/js/jquery.terminal.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.22.0/css/jquery.terminal.min.css" rel="stylesheet"/>
```
or
```html
<script src="https://cdn.jsdelivr.net/npm/jquery.terminal@2.22.0/js/jquery.terminal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery.terminal@2.22.0/css/jquery.terminal.min.css">
```
If you always want latest version, you can get it from [unpkg](https://unpkg.com/) without specifying version,
it will redirect to the latest ones:
```html
<script src="https://unpkg.com/jquery.terminal/js/jquery.terminal.min.js"></script>
<link href="https://unpkg.com/jquery.terminal/css/jquery.terminal.min.css" rel="stylesheet"/>
```
#### Bleeding Edge Version
If you want to test bleeding edge, development version of jQuery Terminal. You can use those files:
```html
<script src="https://cdn.jsdelivr.net/gh/jcubic/jquery.terminal@devel/js/jquery.terminal.min.js"></script>
<link href="https://cdn.jsdelivr.net/gh/jcubic/jquery.terminal@devel/css/jquery.terminal.min.css" rel="stylesheet"/>
```
but it's not refreshed as fast as rawgit was, because it's CDN and need to be propagated to different servers.
#### Keyboard key polyfill
**NOTE:** From version 1.0.0 if you want to support old browsers then you'll need to use [key event property polyfill](https://rawgit.com/inexorabletash/polyfill/master/keyboard.js). You can check the support for it on [can I use](https://caniuse.com/#feat=keyboardevent-key).
```html
<script src="https://unpkg.com/js-polyfills@0.x.x/keyboard.js"></script>
```
#### Command Line
You can also install jQuery Terminal using command line, from [bower repository](https://bower.io/):
```
bower install jquery.terminal
```
or [npm registry](https://www.npmjs.com/):
```
npm install jquery.terminal
```
### Example of usage
This is code that uses low level function, that gives you full control of the commands,
just pass anything that the user types into a function.
```javascript
jQuery(function($, undefined) {
$('#term_demo').terminal(function(command) {
if (command !== '') {
var result = window.eval(command);
if (result != undefined) {
this.echo(String(result));
}
}
}, {
greetings: 'Javascript Interpreter',
name: 'js_demo',
height: 200,
width: 450,
prompt: 'js> '
});
});
```
Here is a higher level call, using an object as an interpreter, By default the terminal will
parse commands that a user types and replace number like strings with real numbers
regex with regexes and process escape characters in double quoted strings.
```javascript
jQuery(function($, undefined) {
$('#term_demo').terminal({
add: function(a, b) {
this.echo(a + b);
},
re: function(re, str) {
if (re instanceof RegExp && re.test(str)) {
this.echo(str + ' [[;green;]match]');
}
},
foo: 'foo.php',
bar: {
sub: function(a, b) {
this.echo(a - b);
}
}
}, {
height: 200,
width: 450,
prompt: 'demo> '
});
});
```
command `add 2 2` will display `4` (not `22`).
Command `foo` will change prompt to `foo>` and each new command will execute
json-rpc method from foo.php script.
command `bar` will change the prompt to `bar> ` and if you type `sub 10 2` it will display 8.
To exit from bar nested command you can type `exit` or press CTRL+D.
command `re /^foo/ foo-bar` will echo: "foo-bar match" where "match" will be green.
By default arguments are required but you can disable the check like this:
```javascript
jQuery(function($, undefined) {
$('#term_demo').terminal({
add: function(...args) {
this.echo(args.reduce((a,b) => a + b));
}
}, {
checkArity: false
});
});
```
And add command will accept any number of argments and it will sum them up (if they are numbers).
You can create JSON-RPC interpreter with authentication in just one line:
```javascript
$('#term_demo').terminal('service.php', {login: true});
```
The rest of the code can be on the server, so you can write fully working application,
without any front-end, that can be tested in browser.
First argument to terminal can also be array with objects strings and functions, with
one requirement, that only one function can be used as last fallback for commands that was
not found in RPC or in objects.
```javascript
jQuery(function($, undefined) {
$('#term_demo').terminal([{
add: function(...args) {
this.echo(args.reduce((a,b) => a + b));
}
} 'foo.php', function(command) {
this.echo("You've typed " + command, {formatters: false, exec: false});
}], {
checkArity: false
});
});
```
More examples [here](http://terminal.jcubic.pl/examples.php). You can also check
[Full Documentation](http://terminal.jcubic.pl/api_reference.php) or
[Getting Started Guide on Wiki](https://github.com/jcubic/jquery.terminal/wiki/Getting-Started).
### Security
Because of security in version 1.20.0 links with protocols different than ftp or http(s) (it was
possible to enter javascript protocol, that could lead to XSS if author of the app echo user input
and save it in DB) was turn off by default. To enable it, you need to use `anyLinks: true` option.
In version 1.21.0 executing terminal methods using extendend commands `[[ terminal::clear() ]]` was
also disabled by default because attacker (depending on your application) could execute
`terminal::echo` with raw option to enter any html and execute any javascript. To enable this
feature from this version you need to use `invokeMethods: true` option.
The features are safe to enable, if you don't save user input in DB and don't echo it back to
different users (like with chat application). It's also safe if you escape formatting before you
echo stuff.
If you don't save user input in DB but allow to echo back what user types and have enabled
`execHash` options, you may have reflected XSS vulnerability if you enable this features. If you
escape formatting this options are also safe.
**NOTE**: To disable exec if you have `execHash` (or echo stuff from users with `invokeMethods: true`),
you can also set option `{exec: false}` to your `echo` call and use it only when you get
values from server (not from DB indireclty from users). If you do this you will be able to echo stuff
from users and execute terminal methods from server (this feature is mostly done just for that).
### Contributors
If you want to contribute read [CONTRIBUTING.md](CONTRIBUTING.md) first. Here are project contributors:
<!-- CONTRIBUTORS-START -->
| [<img src="https://avatars1.githubusercontent.com/u/280241?v=4" width="100px;"/><br /><sub>Jakub T. Jankiewicz</sub>](https://jcubic.pl/me)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=jcubic) | [<img src="https://avatars1.githubusercontent.com/u/1208327?v=4" width="100px;"/><br /><sub>Zuo Qiyang</sub>](http://zuoqy.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=kid1412z) | [<img src="https://avatars1.githubusercontent.com/u/4943440?v=4" width="100px;"/><br /><sub>Marcel Link</sub>](https://github.com/ml1nk)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=ml1nk) | [<img src="https://avatars1.githubusercontent.com/u/6674275?v=4" width="100px;"/><br /><sub>Sébastien Warin</sub>](http://sebastien.warin.fr)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=sebastienwarin) | [<img src="https://avatars2.githubusercontent.com/u/8646106?v=4" width="100px;"/><br /><sub>Christopher John Ryan</sub>](https://github.com/ChrisJohnRyan)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=ChrisJohnRyan) | [<img src="https://avatars3.githubusercontent.com/u/715580?v=4" width="100px;"/><br /><sub>Johan</sub>](https://github.com/johanjordaan)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=johanjordaan) | [<img src="https://avatars0.githubusercontent.com/u/273194?v=4" width="100px;"/><br /><sub>Florian Schäfer</sub>](https://github.com/fschaefer)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=fschaefer) |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| [<img src="https://avatars2.githubusercontent.com/u/4673812?v=4" width="100px;"/><br /><sub>David Refoua</sub>](http://www.Refoua.me)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=DRSDavidSoft) | [<img src="https://avatars0.githubusercontent.com/u/1751242?v=4" width="100px;"/><br /><sub>Ishan Ratnapala</sub>](https://github.com/IshanRatnapala)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=IshanRatnapala) | [<img src="https://avatars2.githubusercontent.com/u/375027?v=4" width="100px;"/><br /><sub>Tomasz Ducin</sub>](http://ducin.it)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=ducin) | [<img src="https://avatars2.githubusercontent.com/u/32747235?v=4" width="100px;"/><br /><sub>7twin</sub>](https://7twin.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=7twin) | [<img src="https://avatars0.githubusercontent.com/u/406705?v=4" width="100px;"/><br /><sub>Abdelrahman Omran</sub>](https://omranic.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=Omranic) | [<img src="https://avatars1.githubusercontent.com/u/569896?v=4" width="100px;"/><br /><sub>Anton Vasil'ev</sub>](https://github.com/avdes)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=avdes) | [<img src="https://avatars3.githubusercontent.com/u/336727?v=4" width="100px;"/><br /><sub>finlob</sub>](https://github.com/finlob)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=finlob) |
| [<img src="https://avatars2.githubusercontent.com/u/9531780?v=4" width="100px;"/><br /><sub>Hasan</sub>](https://github.com/JuanPotato)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=JuanPotato) | [<img src="https://avatars1.githubusercontent.com/u/137852?v=4" width="100px;"/><br /><sub>Hraban Luyat</sub>](https://luyat.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=hraban) | [<img src="https://avatars1.githubusercontent.com/u/15666417?v=4" width="100px;"/><br /><sub>Jarry Shaw</sub>](jarryshaw.me)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=JarryShaw) | [<img src="https://avatars0.githubusercontent.com/u/3868754?v=4" width="100px;"/><br /><sub>Jon Steinich</sub>](https://github.com/jsteinich)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=jsteinich) | [<img src="https://avatars0.githubusercontent.com/u/74179?v=4" width="100px;"/><br /><sub>Martin v. Löwis</sub>](https://github.com/loewis)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=loewis) | [<img src="https://avatars2.githubusercontent.com/u/27475?v=4" width="100px;"/><br /><sub>Mateusz Paprocki</sub>](https://github.com/mattpap)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=mattpap) | [<img src="https://avatars2.githubusercontent.com/u/7055377?v=4" width="100px;"/><br /><sub>exit1</sub>](https://github.com/exit1)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=exit1) |
| [<img src="https://avatars3.githubusercontent.com/u/1263192?v=4" width="100px;"/><br /><sub>Robert Wikman</sub>](https://github.com/rbw)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=rbw) | [<img src="https://avatars1.githubusercontent.com/u/139603?v=4" width="100px;"/><br /><sub>Steve Phillips</sub>](https://tryingtobeawesome.com/)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=elimisteve) | [<img src="https://avatars0.githubusercontent.com/u/1833930?v=4" width="100px;"/><br /><sub>Yutong Luo</sub>](https://yutongluo.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=yutongluo) | [<img src="https://avatars3.githubusercontent.com/u/1573141?v=4" width="100px;"/><br /><sub>coderaiser</sub>](http://coderaiser.github.io)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=coderaiser) | [<img src="https://avatars2.githubusercontent.com/u/282724?v=4" width="100px;"/><br /><sub>mrkaiser</sub>](https://github.com/mrkaiser)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=mrkaiser) | [<img src="https://avatars2.githubusercontent.com/u/179534?v=4" width="100px;"/><br /><sub>stereobooster</sub>](https://stereobooster.com)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=stereobooster) | [<img src="https://avatars2.githubusercontent.com/u/5696096?v=4" width="100px;"/><br /><sub>Steve Kirkegard</sub>](https://www.linkedin.com/in/steve-kirkegard)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=stevekirks) |
| [<img src="https://avatars1.githubusercontent.com/u/588573?v=4" width="100px;"/><br /><sub>Juraj Vitko</sub>](https://github.com/youurayy)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=youurayy) |
<!-- CONTRIBUTORS-END -->
[jQuery Terminal Website](https://github.com/jcubic/jquery.terminal-www) contributors:
<!-- CONTRIBUTORS-WWW-START -->
| [<img src="https://avatars1.githubusercontent.com/u/280241?v=4" width="100px;"/><br /><sub>Jakub T. Jankiewicz</sub>](https://jcubic.pl/me)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=jcubic) | [<img src="https://avatars1.githubusercontent.com/u/1004261?v=4" width="100px;"/><br /><sub>Marc Laporte</sub>](https://wikisuite.org)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=marclaporte) | [<img src="https://avatars0.githubusercontent.com/u/31372?v=4" width="100px;"/><br /><sub>Rich Morin</sub>](http://www.cfcl.com/rdm)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=RichMorin) | [<img src="https://avatars0.githubusercontent.com/u/26324569?v=4" width="100px;"/><br /><sub>DInesh51297</sub>](https://github.com/DInesh51297)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=DInesh51297) | [<img src="https://avatars1.githubusercontent.com/u/512317?v=4" width="100px;"/><br /><sub>Logan Rosen</sub>](https://www.loganrosen.com/)<br>[commits](https://github.com/jcubic/jquery.terminal/commits?author=loganrosen) |
| :---: | :---: | :---: | :---: | :---: |
<!-- CONTRIBUTORS-WWW-END -->
### Credits
Projects used:
* [Storage plugin](https://sites.google.com/site/daveschindler/jquery-html5-storage-plugin) by Dave Schindler (MIT)
* [jQuery Timers](http://jquery.offput.ca/every/) (WTFPL)
* [Cross-Browser Split](http://blog.stevenlevithan.com/archives/cross-browser-split) by [Steven Levithan](http://stevenlevithan.com/) (MIT)
* [jQuery Caret](https://github.com/accursoft/caret) by Gideon Sireling (3-BSD)
* [sprintf.js](https://github.com/alexei/sprintf.js) by [Alexandru Mărășteanu](http://alexei.ro/) (3-BSD)
* [node-ansiparser](https://github.com/netzkolchose/node-ansiparser) by Joerg Breitbart (MIT)
### Paid Support
If you have some non-trivial request or need help, you can get paid support at [xs:code](https://xscode.com/jcubic/jquery.terminal).
### License
Licensed under [MIT](http://opensource.org/licenses/MIT) license
Copyright (c) 2011-2021 [Jakub Jankiewicz](https://jcubic.pl/me)

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

@ -0,0 +1,564 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[` 1`] = `
Object {
"char": Object {
"height": 0,
"width": 0,
},
"cols": 100,
"rows": 25,
"terminal": Object {
"height": 0,
"width": 0,
},
}
`;
exports[`Terminal plugin cmd plugin should move cursor 1`] = `
Array [
5,
26,
46,
25,
4,
]
`;
exports[`Terminal plugin cmd plugin should move cursor 2`] = `
Array [
3,
33,
64,
93,
88,
57,
27,
]
`;
exports[`Terminal plugin events enter text text should appear and interpreter function should be called 1`] = `"<span data-text=\\">&nbsp;foo\\">&gt;&nbsp;foo</span>"`;
exports[`Terminal plugin jQuery Terminal methods generic import/export view should import view 1`] = `"<div data-index=\\"0\\"><div style=\\"width: 100%;\\"><span data-text=\\"Hello&nbsp;World!\\">Hello&nbsp;World!</span></div></div><div data-index=\\"1\\" class=\\"terminal-command\\" role=\\"presentation\\" aria-hidden=\\"true\\"><div style=\\"width: 100%;\\"><span data-text=\\">&nbsp;foo\\">&gt;&nbsp;foo</span></div></div><div data-index=\\"2\\" class=\\"terminal-command\\" role=\\"presentation\\" aria-hidden=\\"true\\"><div style=\\"width: 100%;\\"><span data-text=\\">&nbsp;bar\\">&gt;&nbsp;bar</span></div></div>"`;
exports[`Terminal plugin prompt should format prompt 1`] = `"<span style=\\"font-weight:bold;text-decoration:underline;color:#fff;--color:#fff;--original-color:#fff;\\" data-text=\\">>>\\"><span style=\\"width: 3ch;\\">&gt;&gt;&gt;</span></span><span data-text=\\"&nbsp;\\"><span style=\\"width: 1ch;\\">&nbsp;</span></span>"`;
exports[`Terminal plugin prompt should format prompt 2`] = `"<span style=\\"font-weight:bold;text-decoration:underline;color:#fff;--color:#fff;--original-color:#fff;\\" data-text=\\">>>\\"><span style=\\"width: 3ch;\\">&gt;&gt;&gt;</span></span><span data-text=\\"&nbsp;\\"><span style=\\"width: 1ch;\\">&nbsp;</span></span>"`;
exports[`Terminal plugin prompt should return prompt 1`] = `"<span data-text=\\">>>&nbsp;\\"><span style=\\"width: 4ch;\\">&gt;&gt;&gt;&nbsp;</span></span>"`;
exports[`Terminal plugin prompt should set prompt 1`] = `"<span data-text=\\"|||&nbsp;\\"><span style=\\"width: 4ch;\\">|||&nbsp;</span></span>"`;
exports[`Terminal plugin prompt should set prompt 2`] = `"<span data-text=\\">>>&nbsp;\\"><span style=\\"width: 4ch;\\">&gt;&gt;&gt;&nbsp;</span></span>"`;
exports[`Terminal plugin terminal create / terminal destroy should have default prompt 1`] = `"<span data-text=\\">&nbsp;\\"><span style=\\"width: 2ch;\\">&gt;&nbsp;</span></span>"`;
exports[`Terminal utils $.terminal.format should create html span tags with style and classes 1`] = `"<span style=\\"font-weight:bold;text-decoration:underline line-through;font-style:italic;color:#fff;--color:#fff;--original-color:#fff;text-shadow:0 0 5px #fff;background-color:#000;--background:#000;\\" data-text=\\"Foo\\"><span>Foo</span></span><span style=\\"font-style:italic;\\" class=\\"foo\\" data-text=\\"Bar\\"><span>Bar</span></span><span style=\\"text-decoration:underline line-through overline;\\" data-text=\\"Baz\\"><span>Baz</span></span>"`;
exports[`Terminal utils $.terminal.format should filter out attribute in JSON 1`] = `"<span title=\\"foo\\" data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should handle JSON 1`] = `"<span title=\\"foo\\" data-foo=\\"bar\\" data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should handle emails 1`] = `"<a href=\\"mailto:jcubic@onet.pl\\" tabindex=\\"1000\\" data-text>jcubic@onet.pl</a>"`;
exports[`Terminal utils $.terminal.format should handle emails 2`] = `"<a href=\\"mailto:jcubic@onet.pl\\" tabindex=\\"1000\\" data-text>j</a><a href=\\"mailto:jcubic@onet.pl\\" tabindex=\\"1000\\" data-text>cubic@onet.pl</a>"`;
exports[`Terminal utils $.terminal.format should handle wider characters without formatting 1`] = `"<span style=\\"width: 24ch\\" data-text=\\"ターミナルウィンドウは黒\\"><span style=\\"width: 24ch\\"><span style=\\"width: 2ch\\">タ</span><span style=\\"width: 2ch\\">ー</span><span style=\\"width: 2ch\\">ミ</span><span style=\\"width: 2ch\\">ナ</span><span style=\\"width: 2ch\\">ル</span><span style=\\"width: 2ch\\">ウ</span><span style=\\"width: 2ch\\">ィ</span><span style=\\"width: 2ch\\">ン</span><span style=\\"width: 2ch\\">ド</span><span style=\\"width: 2ch\\">ウ</span><span style=\\"width: 2ch\\">は</span><span style=\\"width: 2ch\\">黒</span></span></span><span style=\\"width: 4ch\\" data-text=\\"です\\"><span><span style=\\"width: 4ch\\"><span style=\\"width: 2ch\\">で</span><span style=\\"width: 2ch\\">す</span></span></span></span>"`;
exports[`Terminal utils $.terminal.format should merge color style with style attr 1`] = `"<span style=\\"color:green;--color:green;--original-color:green;--size: 2\\" data-text=\\"Foo\\"><span>Foo</span></span>"`;
exports[`Terminal utils $.terminal.format should not allow attributes 1`] = `"<span data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should not duplicate and don't overwrite data-text 1`] = `"<span data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should not duplicate and don't overwrite data-text 2`] = `"<span data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should parse JSON if semicolon in value 1`] = `"<span title=\\"foo ; bar\\" data-text=\\"foo\\"><span>foo</span></span>"`;
exports[`Terminal utils $.terminal.format should skip empty parts 1`] = `"<span data-text=\\"x\\">x</span><span style=\\"font-weight:bold;\\" data-text=\\"y\\"><span>y</span></span><span style=\\"font-weight:bold;\\" data-text=\\"z\\"><span>z</span></span>"`;
exports[`Terminal utils $.terminal.from_ansi should convert ansi to terminal formatting 1`] = `"[[;#5555FF;]Hello][[;#640000;#0AA]Foo][[biu;#44D544;#A0A]B[[sb;;]a]r][[;#000;#AAA]Baz][[;#006400;#ffff00]Quux]"`;
exports[`Terminal utils $.terminal.from_ansi should convert ansi to terminal formatting and escape the remaining brackets 1`] = `"[[;#5555FF;]Hello][[;#640000;#0AA]Foo][[biu;#44D544;#A0A]B&#91;&#91;sb;;&#93;a&#93;r][[;#000;#AAA]Baz][[;#006400;#ffff00]Quux]"`;
exports[`Terminal utils $.terminal.from_ansi should format plots with moving cursors 1`] = `
" Y Axis Foo: [[;#A00;]#]
A
10|
|
8| [[;#A00;]#]
| [[;#A00;]#] [[;#A00;]#] [[;#A00;]#]
6| [[;#A00;]#]
| [[;#A00;]#]
4|
|
2|
|
+---+---+---+---+---+----+----+----+-> X Axis
0 2 4 6 8 10 12 14 "
`;
exports[`Terminal utils $.terminal.from_ansi should format plots with moving cursors 2`] = `
" Y Axis A: [[;#A00;]*] | B: [[;#00A;]# ] | C: [[;#AAA;#0AA] ]
[[;#A00;]*] [[;#A00;]*] [[;#A00;]*] [[;#A00;]*] [[;#A00;]*] [[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
[[;#A00;]*]
A [[;#A00;]*]
10| [[;#AAA;#0AA] ] [[;#A00;]*]
| [[;#00A;]# ][[;#00A;]# ]
8| [[;#00A;]# ][[;#00A;]# ]
|
6|
|
4|
|
2|
|
+---+---+---+---+---+----+----+----+-> X Axis
0 2 4 6 8 10 12 14 "
`;
exports[`Terminal utils $.terminal.from_ansi should render ANSI art 1`] = `
"
[[b;#555;#000]▄]▄▄▄▄▄[[b;#555;]▄ ▄]▄▄▄▄[[b;#555;]▄]
[[b;#555;]▄]▄▄▄[[b;#FFF;#AAA]░▒▓█]▀▀▄▄▄[[b;#FFF;#AAA]░▒▓█▓▓▓▓▒▒]▄[[b;#555;]▄]
[[b;#555;]▄]▄[[b;#FFF;#AAA]░▒▓▓██]▀▀▄▄[[b;#FFF;#AAA]░▒▓████████▓▓▓▓▓▒░]▄
▄[[b;#FFF;#AAA]░▒▓██▒]▀▀▄[[b;#FFF;#AAA]░▒▓█████████████████▓▓▓▒]▄
[[b;#555;]░]▄[[b;#FFF;#AAA]░▒▓██]▀▄▄[[b;#FFF;#AAA]▄▄▀▀][[;#555;#AAA]▄▄][[;#FFF;#AAA]░▒▓████████████████▓▓▓▒]▄
▄[[b;#FFF;#AAA]░░▒▓██▓][[;#555;#000]▄▀][[;#FFF;#AAA]▒▓][[;#555;#AAA]▄][[;#555;#000] ░ ▀]▀[[b;#FFF;#AAA]░▒█████████████████▓▓▓▒]▄
[[b;#555;]░]▄[[b;#FFF;#AAA]░▒▓████▒][[;#555;#AAA]▒][[;#555;#000]▌▐][[;#FFF;#AAA]▒▓][[;#555;#AAA]▀][[;#555;#000] ░ ▀]▀[[b;#FFF;#AAA]░▒▓▓██████████████▓▓▓]▓
[[b;#555;]░][[;#FFF;#AAA]░░▒▓█████▒][[;#555;#000]▓ ░][[;#FFF;#AAA]▒▓]▌ [[b;#555;]░░░] [[b;#555;]▀]▀▀[[b;#FFF;#AAA]▒▓▓██████████████▓▓░]░
[[;#555;]░][[;#FFF;#AAA]░▒▓]▀[[b;#FFF;#AAA]▓▓███▓▒][[;#555;#000]░ ][[;#FFF;#AAA]▒█][[;#FFF;#000] ][[;#555;#000]▄][[;#555;#AAA]▀▀▀▒][[;#555;#000]▄▄▒▒ ▀]▀▀[[b;#FFF;#AAA]▒▓▓████████████▓▓▒]▒
[[b;#555;]░][[;#FFF;#AAA]░░]▀▄[[b;#FFF;#AAA]░▓████▓▒][[;#555;#AAA]▀][[;#555;#000]▄▐][[;#FFF;#AAA]▒][[;#FFF;#000] ][[;#555;#AAA]▒][[;#FFF;#AAA]░░▒▓▓▄▓▓░][[;#555;#AAA]▀▀▀][[;#555;#000]▄ ▀]▀▀[[b;#FFF;#AAA]▒▓█▓█████████▓▓▓]▓
▐▌▀▄[[b;#FFF;#AAA]░▓██████▓░▒░]▌[[b;#555;]▐][[;#FFF;#AAA]░▓▓▓████████▓░][[;#555;#AAA]▀▀][[;#555;#000]▄ ▀]▀[[b;#FFF;#AAA]░▒▓█▓█████▓▓▓▓▓]▒░
[[b;#555;]░][[;#555;#AAA]░][[;#555;#000] ][[;#FFF;#AAA]░░▓█████████▒▒][[;#FFF;#000] ][[;#FFF;#AAA]░▓████████████▓▓░░][[;#555;#AAA]▀▀][[;#555;#000]▄ ]▀▀[[b;#FFF;#AAA]░▒▓▓▓▓▓▓█▓▓░▓]▒▒
▐[[b;#555;#AAA]░]▐[[b;#FFF;#AAA]░▓█████████▓▒][[;#FFF;#000] ][[;#555;#AAA]▒][[;#FFF;#AAA]▓█████████████▓▓▒][[;#555;#000]▀▀█][[;#FFF;#AAA]░][[;#555;#AAA]▓][[;#555;#000]▄▄▀]▀▀[[b;#FFF;#AAA]░▒▓▒▒▓▓█▓ ▓]▓▒
[[b;#555;]░][[;#555;#AAA]░▒][[;#555;#000] ][[;#FFF;#AAA]▓███████▓▓▒]▀ [[b;#555;#AAA]▒][[;#FFF;#AAA]░▓███████████▓▓░]▀ ▄[[b;#FFF;#AAA]░]▄[[b;#555;]▄▀▀▀][[;#555;#AAA]▓][[;#555;#000]░ ▀▀]▀▀[[b;#FFF;#AAA]░░▓▓█░][[;#FFF;#000] ]▓░
▐[[b;#555;#AAA]░▓][[;#555;#000] ][[;#FFF;#AAA]▒██████▓▒]▀ [[b;#555;]▄][[;#555;#AAA]▒][[;#FFF;#AAA]░▓██████████▓▀▄]▀[[b;#555;]▄][[;#555;#AAA]▀][[;#FFF;#AAA]▓▒▒▓█▄▄ ][[;#555;#000]▄▀▄] [[;#555;#000]▀]▀[[b;#FFF;#AAA]▒▓▒]▌▐▓
[[b;#555;]░][[;#555;#AAA]░▒][[;#555;#000]▌ ][[;#FFF;#AAA]░]▌[[b;#FFF;#AAA]████▓▒][[;#FFF;#000] ][[;#555;#000]▀▄][[;#FFF;#AAA]░▒▓███████▓▀▓▓]▀[[b;#555;]▄][[;#555;#AAA]▀][[;#FFF;#AAA]░▒][[;#555;#AAA]▄][[;#555;#000]▓▀▀ ▀▀█][[;#555;#AAA]▓][[;#FFF;#AAA] ][[;#FFF;#000] ][[;#555;#000]▓] [[;#FFF;#000]░][[;#FFF;#AAA]▒▓]█ [[b;#FFF;#AAA]▒]▄
[[b;#555;]░][[;#555;#AAA]▒▓][[;#555;#000] ▐]▌▐█[[b;#FFF;#AAA]██▓▒][[;#FFF;#000] ][[;#555;#000]░▀▄][[;#FFF;#AAA]░▒▓██▓▓▒▄▄█▒░░][[;#FFF;#000] ][[;#555;#AAA]▒][[;#FFF;#AAA]░][[;#555;#AAA]░▓][[;#555;#000]▀] [[;#555;#000]░][[;#555;#AAA]▓][[;#555;#000]▌▐▓] [[;#FFF;#000]░][[;#FFF;#AAA]▓]█[[b;#555;#AAA]░]▌░[[b;#FFF;#AAA]▒]░
[[b;#555;]░][[;#555;#AAA]▒][[;#555;#000]█ ░ ]█[[b;#FFF;#AAA]██▓▒][[;#555;#000]░ ░▒][[;#555;#AAA]▓░][[;#FFF;#AAA]▒▓▓▄▄░]▀▀▀[[b;#555;]▀▀▀▓][[;#FFF;#AAA]▒]▌[[b;#555;]▐][[;#FFF;#AAA]░][[;#555;#AAA]░][[;#555;#000]▌] [[;#555;#000]░][[;#555;#AAA]▓][[;#555;#000] ▓▒] [[;#FFF;#000]░][[;#FFF;#AAA]▓]█[[b;#555;#AAA]▒][[;#555;#000]▌]▐[[b;#FFF;#AAA]▓░]
[[;#555;#AAA]▓][[;#555;#000]▌░▒]▐[[b;#FFF;#AAA]██▒]▀ [[b;#555;]▒░][[;#555;#AAA]▓░]▀▀▄▄[[b;#555;]▄ ░ ░ ▀][[;#FFF;#AAA]░]▌[[b;#555;]▐][[;#FFF;#AAA]▒░][[;#555;#000]▌░] [[;#555;#AAA]▒][[;#555;#000]▌▐▓▒ ░ ][[;#FFF;#000]▓][[;#FFF;#AAA]▒][[;#555;#AAA]▒▒][[;#555;#000]▌]▐▄▀▒
[[b;#555;]▓▓▒▓]█[[b;#FFF;#AAA]▓▒]▀[[b;#555;]▄ ░▓▒▄ ][[;#555;#AAA]▓▓][[;#FFF;#AAA]░▓▓]▀▀▀[[b;#555;#AAA]▀][[;#555;#000]▄ ░▀][[;#FFF;#AAA]░][[;#FFF;#000] ][[;#FFF;#AAA]▒▓▒]▄[[b;#555;]░ ]▄[[b;#555;]■░▄][[;#FFF;#AAA]▀░][[;#555;#AAA]░][[;#555;#000]▄▀][[;#555;#AAA]▒][[;#555;#000] ][[;#FFF;#000]▓]█[[b;#555;#AAA]▒▓][[;#555;#000] ][[;#FFF;#AAA]░░][[;#FFF;#000] ]▓
[[;#555;]▐▓▓ ][[;#FFF;#AAA]▒▒░][[;#555;#000]▐][[;#555;#AAA]▓][[;#555;#000]▌ ][[;#555;#AAA]▓▓][[;#555;#000]▄░ ▀▄]▄[[b;#FFF;#AAA]▒▓▀▀▀][[;#555;#000]▀▄ ░][[;#FFF;#AAA]░][[;#FFF;#000] ][[;#FFF;#AAA]▀][[;#555;#000]▀][[;#FFF;#AAA]▀█▄▄▄▓▓▄▄█▓▓][[;#555;#AAA]░▓][[;#555;#000]▌▀▌░ ][[;#FFF;#AAA]▒][[;#555;#AAA]▒▒▓][[;#555;#000] ][[;#FFF;#AAA]░▒]▌▐░
[[b;#555;]█ ][[;#FFF;#AAA]░]▀ [[b;#555;#AAA]▓▒▒][[;#555;#000] ░▐][[;#555;#AAA]▓][[;#FFF;#AAA]░][[;#555;#AAA]▓][[;#555;#000]▄ ░▀▀]▀▀[[b;#555;]▀▄]▄[[b;#FFF;#AAA]▒▓][[;#555;#AAA]░]▌▐ [[b;#555;]▌ ▀][[;#555;#AAA]▄][[;#FFF;#AAA]▀▀][[;#555;#AAA]▄][[;#555;#000]▀▀▀][[;#555;#AAA]▄][[;#FFF;#AAA]▒░][[;#555;#AAA]▒▒][[;#555;#000]▒ ░ ][[;#FFF;#000]░][[;#FFF;#AAA]▒][[;#555;#AAA]▒▓][[;#555;#000]▌]▐[[b;#FFF;#AAA]▒▓░]░░
[[b;#555;]▐▌ ▐][[;#FFF;#AAA]▓][[;#FFF;#000] ][[;#555;#AAA]▒░░][[;#FFF;#AAA]▒][[;#FFF;#000] ][[;#555;#AAA]▒][[;#FFF;#AAA]░][[;#555;#AAA]▒▓][[;#555;#000]▄ ░ ]▀[[b;#FFF;#AAA]▒▓█▒][[;#555;#AAA]▓][[;#555;#000]░]▌[[b;#555;]▐ ][[;#555;#AAA]▓][[;#555;#000]▀▀▄][[;#FFF;#AAA]░]█[[b;#555;]▓▄▀▀▀▄░ ][[;#FFF;]▒][[;#FFF;#AAA]░][[;#555;#AAA]▒▓][[;#555;#000]▌]░[[b;#FFF;#AAA]░█░]░
[[;#555;]█▄ ][[;#FFF;#AAA]▒▓][[;#FFF;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]▒▓▓][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]░][[;#FFF;#AAA]░░][[;#555;#AAA]░][[;#555;#000]▄░ ▄]▄[[b;#FFF;#AAA]▒▓▓██▓][[;#555;#AAA]▒▓]▌[[b;#555;]▐▄ ▐][[;#FFF;#AAA]░▄░▒][[;#555;#AAA]░▒][[;#555;#000] ▓▓▒▒░ ░ ][[;#FFF;#000]▓][[;#555;#AAA]░▒▓][[;#555;#000] ][[;#FFF;#AAA]░█▓]░░
[[b;#555;]▐▓▄▀][[;#FFF;#AAA]█▓][[;#FFF;#000] ][[;#FFF;#AAA]▓▓▓▒][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]░░][[;#FFF;#AAA]░▄▒▓▓█▓████▓][[;#555;#AAA]░][[;#555;#000]█][[;#555;#AAA]░][[;#FFF;#000] ]█[[b;#555;#AAA]▀▀▀][[;#FFF;#AAA]▒▓▒▓][[;#555;#AAA]░][[;#555;#000]▌▓ ░░ ░ ][[;#FFF;#000] ][[;#FFF;#AAA]▒][[;#555;#AAA]▒▓][[;#555;#000]▌]▐[[b;#FFF;#AAA]░█░]░
[[;#555;]▓▓▓▄▐][[;#FFF;#AAA]▓▓][[;#FFF;#000] ][[;#FFF;#AAA]▓█▓▒][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]░]█[[b;#FFF;#AAA]░▓▓█▓████▓░][[;#555;#000]▀][[;#555;#AAA]░▓][[;#FFF;#000] ][[;#FFF;#AAA]░▒▓▓███][[;#555;#AAA]░▒▓][[;#555;#000] ░] [[;#FFF;#000] ░]█[[b;#555;#AAA]▒▓][[;#555;#000] ][[;#FFF;#AAA]░█▓]░
[[b;#555;]▐▓▀ ▀ ][[;#555;#AAA]░][[;#FFF;#AAA]▓][[;#FFF;#000] ][[;#FFF;#AAA]▒██▓▒][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]░░]█[[b;#FFF;#AAA]▒▓▒▓▓█▓][[;#555;#AAA]▓][[;#555;#000]▌ ▄][[;#555;#AAA]▒]▄▀[[b;#FFF;#AAA]▀▀█▀]▀[[b;#555;]▀▀▄░▀▒░ ░ ][[;#FFF;] ][[;#FFF;#AAA]▒][[;#555;#AAA]▒▓][[;#555;#000]▌]▐[[b;#FFF;#AAA]░▓]▌
[[b;#555;]▓▒ ][[;#555;#AAA]▓][[;#FFF;#AAA]▒▓][[;#FFF;#000] ][[;#FFF;#AAA]▒██▓▒][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]▒░][[;#FFF;#AAA]░▒░▒▒▓]█[[b;#555;#AAA]▒▓▓▒░]██▄ ▀[[b;#555;]▄][[;#555;#AAA]▒▒][[;#555;#000]▀▀▄ ]▐[[b;#555;]▓] [[;#FFF;]▒][[;#FFF;#AAA]░][[;#555;#AAA]▒▓][[;#555;#000] ][[;#FFF;#AAA]░▓░]
[[;#555;]▐▓▌░ ▐][[;#FFF;#AAA]░░▓][[;#FFF;#000] ][[;#FFF;#AAA]▒██▓▒][[;#FFF;#000] ][[;#555;#AAA]▒░][[;#FFF;#AAA]░░░]█[[b;#FFF;#AAA]░]█[[b;#555;#AAA]░░][[;#FFF;#AAA]░][[;#555;#000]█]▀[[b;#555;]▀ ]▄▌ ▀▄▄[[b;#FFF;#AAA]▒][[;#555;#000]▀ ]▄[[b;#FFF;#AAA]▒][[;#555;#AAA]░][[;#555;#000]▌░ ][[;#FFF;#000]░][[;#FFF;#AAA]▒][[;#555;#AAA]▒▓][[;#555;#000] ][[;#FFF;#000]▓][[;#FFF;#AAA]▓░][[;#555;#000]▀]
[[;#555;#000]▀█▄▒ █][[;#555;#AAA]░][[;#FFF;#AAA]░▒][[;#FFF;#000] ][[;#FFF;#AAA]▒▓█▓▒]▄ [[b;#555;]▀][[;#555;#AAA]░░][[;#FFF;#AAA]░]████[[b;#FFF;#AAA]░][[;#555;#AAA]▀][[;#555;#000]▄ ▀]█[[b;#FFF;#AAA]▓▀][[;#FFF;#000] ][[;#555;#000]▀▀]▄▄[[b;#FFF;#AAA]░]█[[b;#FFF;#AAA]▒▓░][[;#555;#000]▓ ][[;#FFF;#AAA]▒][[;#555;#AAA]▒][[;#555;#000]▀]▄[[b;#FFF;#AAA]█▓░][[;#555;#000]▀]
[[;#555;#000]▀█▄▐][[;#555;#AAA]░]█[[b;#FFF;#AAA]░][[;#FFF;#000] ][[;#FFF;#AAA]▒▓██▓▒░][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]▒░][[;#FFF;#AAA]░]██[[b;#FFF;#AAA]░▓▒]██[[b;#555;]▀]▄▄▄▄ [[b;#FFF;#AAA]▒░▒]█[[b;#FFF;#AAA]▒▓][[;#555;#AAA]░][[;#555;#000]▓▀ ][[;#FFF;#AAA]▒][[;#555;#AAA]▒][[;#555;#000] ][[;#FFF;#000]▓][[;#FFF;#AAA]█▓░][[;#555;#000]▀]
[[;#555;#000]▀▄][[;#555;#AAA]▓░][[;#FFF;#AAA]░]▐[[b;#FFF;#AAA]▒▓███▓▓▒]▄ [[b;#555;#AAA]▒░░][[;#FFF;#AAA]░]█[[b;#FFF;#AAA]▒░]█[[b;#555;]▀ ]▄[[b;#FFF;#AAA]█▓▓]▄▀[[b;#FFF;#AAA]▒▓█▓][[;#555;#AAA]░][[;#555;#000]▓░ ][[;#FFF;#AAA]▒][[;#555;#AAA]▒][[;#555;#000]▌]▐[[b;#FFF;#AAA]▓▓]▓░
[[b;#555;]░][[;#555;#AAA]▓]█[[b;#FFF;#AAA]░▒▓█████▓▒]▄ [[b;#555;]▀][[;#555;#AAA]▒░][[;#FFF;#AAA]░]███[[b;#FFF;#AAA]░▓█▓▒▓█]▄▀[[b;#FFF;#AAA]▒][[;#555;#000]▓▓▀ ][[;#FFF;#000]▄]█▀▄[[b;#FFF;#AAA]▓▒░][[;#555;#000]▀]▐
[[b;#555;]▓][[;#FFF;#AAA]░]█[[b;#FFF;#AAA]▒▓██████▓▒░][[;#555;#000]▄ ▀▀][[;#555;#AAA]▄▄▓][[;#555;#000]▄▀▀]▀[[b;#555;]▀▀]▀[[b;#555;]▀ ▀ ▄ ]▄[[b;#FFF;]▀]▀▄[[b;#FFF;#AAA]▓▓▒░][[;#555;#AAA]▄]▐▌
[[b;#555;]▄ ]▓[[b;#FFF;#AAA]▒▒▓█▀▀]▀▀[[b;#555;]▀ ▀]▀▀[[b;#555;]▀▀ ▀▀▓▓▓▄▄▄▀▀ ▀ ]▐[[b;#FFF;#AAA]▄▄█▓▓░░][[;#555;#AAA]▄] [[b;#FFF;#AAA]▓]
[[;#555;]░▄]░[[b;#FFF;#AAA]▒▓▓]▀ [[b;#555;]▄]▄[[b;#FFF;#AAA]▄][[;#FFF;#000]██][[;#FFF;#AAA]▄▄▄][[;#555;#AAA]▀][[;#555;#000]▄] [[;#555;#000]▀▀▒▀▀] [[b;#555;] ]▄[[b;#FFF;#AAA]▒██▒░░░]▀ [[b;#FFF;]▐▌]
[[;#555;]▄ ▀▄]▀[[b;#FFF;#AAA]▒]▀ [[b;#555;#AAA]░][[;#FFF;#AAA]░▒▓][[;#FFF;#000]█████][[;#FFF;#AAA]▓▒][[;#555;#AAA]░░][[;#555;#000]▄ ░][[;#FFF;#000] ] [[;#FFF;#000] ]░▓[[b;#FFF;#AAA]▒█▓▒░][[;#555;#AAA]▄]▀ [[b;#FFF;]▐][[;#FFF;#AAA]▓]
[[;#555;]▄▄██▓▓▓▓▒▄ ░]▀[[b;#555;]▄][[;#555;#AAA]░][[;#FFF;#AAA]▒▒▓███████▓▓▒][[;#555;#AAA]▒][[;#555;#000]▌][[;#FFF;#000] ][[;#555;#000] ▄]▄▄▄ ░▀[[b;#FFF;#AAA]▓▒░]▀ [[b;#FFF;]▄][[;#FFF;#AAA]▓][[;#FFF;#000] ][[;#555;#000]▄]
[[;#555;#000]▄][[;#555;#AAA]░░][[;#FFF;#AAA]▒░][[;#555;#000]▄ ▀▒▒░░ ▄][[;#555;#AAA]░][[;#FFF;#AAA]░▓▓][[;#FFF;#000]██████████][[;#FFF;#AAA]▓][[;#555;#AAA]░][[;#555;#000]▓][[;#FFF;#000] ][[;#555;#000]▄■][[;#FFF;#000]▄][[;#555;#AAA]▀▀][[;#FFF;#AAA]▀]▓░[[b;#FFF;]█]▀▄[[b;#FFF;#AAA]▓░░][[;#555;#000]▀][[;#FFF;#000] ]▄[[b;#FFF;]▄][[;#FFF;#AAA]▓▓][[;#555;#000]▀ ]▀[[b;#FFF;#AAA]░░]▄[[b;#555;]▄]
[[b;#555;]▄][[;#555;#AAA]░][[;#FFF;#AAA]▒█▓▒░][[;#FFF;#000] ][[;#555;#000]░░ ░ ][[;#555;#AAA]░][[;#FFF;#AAA]░▒▓][[;#FFF;#000]████████████][[;#FFF;#AAA]▒][[;#555;#000]▓░░▓][[;#555;#AAA]▓▒▒▓][[;#555;#000] ][[;#555;#AAA]░]█[[b;#555;#AAA]▀] [[b;#FFF;#AAA]░]▀▄[[b;#FFF;]▄][[;#FFF;#AAA]▓▒▒]▀ ▄[[b;#FFF;#AAA]░▒][[;#FFF;#000] ][[;#FFF;#AAA]░▒▒░]
[[;#555;]▒░]▀[[b;#FFF;#AAA]░▓█▓▒░][[;#555;#000]▄] [[;#555;#000]▐][[;#FFF;#AAA]░▒▓][[;#FFF;#000]█████████████][[;#FFF;#AAA]▓][[;#555;#000]▌][[;#FFF;#000] ][[;#555;#000]▀][[;#555;#AAA]▓▓][[;#555;#000]▀▄][[;#555;#AAA]▓▓▓]▀▄▄[[b;#FFF;]█][[;#FFF;#AAA]░░▒]▀ ▄[[b;#FFF;#AAA]░▒▒▓][[;#FFF;#000]█ ][[;#FFF;#AAA]░▓▓░]
[[;#555;]▓▄ ]▀[[b;#FFF;#AAA]▒▓█▓▒░░][[;#555;#000]▄ ░▐][[;#FFF;#AAA]░▓▓][[;#FFF;#000]████████████][[;#FFF;#AAA]▓][[;#555;#AAA]░][[;#555;#000] ░] [[b;#555;]▀▀▀][[;#555;#AAA]▒▓▓]▀▄[[b;#FFF;#AAA]░░▒▓][[;#FFF;#000]█▀][[;#555;#000]▄▌]▀[[b;#FFF;#AAA]░▓▒]▌
▀[[b;#555;#AAA]▓][[;#555;#000] ][[;#FFF;#AAA]░▒██▓▓▒░][[;#555;#000]▄ ]▐[[b;#FFF;#AAA]░▓][[;#FFF;#000]████][[;#FFF;#AAA]▄█][[;#FFF;#000]██████][[;#FFF;#AAA]▓][[;#555;#AAA]░][[;#555;#000]▌ ] [[b;#555;]▄]▄▓▓ [[b;#555;]▄] [[b;#555;]▀]█[[b;#FFF;#AAA]░]█[[b;#FFF;]▀▀][[;#555;]▄][[;#555;#AAA]▀▀][[;#FFF;#000] ]▄ ▀[[b;#FFF;#AAA]▓░]
▀ ▀[[b;#FFF;#AAA]░▓███▓░░][[;#555;#AAA]▓][[;#555;#000]░]▐[[b;#FFF;#AAA]░▓][[;#FFF;#000]███████████][[;#FFF;#AAA]▓][[;#555;#AAA]░][[;#555;#000]▌ ▐]▌▄ ▀[[b;#FFF;#AAA]░░▒▒▓][[;#FFF;#000] ]▄[[b;#FFF;]█][[;#FFF;#AAA]▓▓]▀ ▀[[b;#555;]▄▀][[;#555;#AAA]▀▀][[;#FFF;#AAA]▒▓░][[;#FFF;#000] ][[;#FFF;#AAA]▄]▄ ▀[[b;#FFF;#AAA]▒]
▀[[b;#FFF;#AAA]░░▓███▓░][[;#555;#AAA]▓][[;#555;#000] ]▐[[b;#FFF;#AAA]░▓][[;#FFF;#000]██████████][[;#FFF;#AAA]░][[;#555;#AAA]░][[;#555;#000]▀ ] [[b;#555;#AAA]▓][[;#555;#000] ][[;#FFF;#AAA]░▒][[;#FFF;#000]█]▄▀[[b;#FFF;#AAA]▓▓][[;#FFF;#000]▀]▄[[b;#FFF;]█][[;#FFF;#AAA]▓▒▓]▀[[b;#555;]▄][[;#555;#AAA]▀▀][[;#555;#000] ]▐[[b;#FFF;#AAA]░][[;#FFF;#000] ][[;#FFF;#AAA]▓][[;#FFF;#000]███][[;#FFF;#AAA]░]▄[[b;#FFF;]▀][[;#FFF;#AAA]▄][[;#FFF;#000] ]▀[[b;#FFF;#AAA]▒]
[[;#555;]▀]▀[[b;#FFF;#AAA]░▓██▓░][[;#555;#AAA]▓][[;#555;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]▓▓][[;#FFF;#000]█████████][[;#FFF;#AAA]░]▀ [[b;#555;]▄▄][[;#555;#AAA]▓▒][[;#FFF;#000] ][[;#FFF;#AAA]▒▓][[;#FFF;#000]██]▄ ▄[[b;#FFF;#AAA]░▒][[;#555;#AAA]▄]▀ ▄[[b;#FFF;#AAA]░▒▓]▌ ▐[[b;#FFF;#AAA]░][[;#555;#000]▄][[;#FFF;#000]▀████][[;#FFF;#AAA]░][[;#FFF;#000]█][[;#FFF;#AAA]▄]▄▀
[[b;#555;]▀]▀[[b;#FFF;#AAA]░▓█▓░][[;#555;#000]▌ ][[;#FFF;#AAA]░▓][[;#FFF;#000]█████████][[;#FFF;#AAA]▒]▀ [[b;#555;#AAA]▓░][[;#FFF;#AAA]░▒]▌ [[b;#FFF;#AAA]▓][[;#FFF;#000]██]▀ ▄[[b;#FFF;#AAA]░▒]▀ [[b;#555;]▄]▄[[b;#FFF;#AAA]░▒▒▓▓▒]▄ ▀[[b;#FFF;#AAA]░▒▓][[;#FFF;#000]███████][[;#FFF;#AAA]▄]▄
▀[[b;#FFF;#AAA]░▓░][[;#555;#000]▌▐][[;#FFF;#AAA]░▓][[;#FFF;#000]████████][[;#FFF;#AAA]▓][[;#555;#AAA]░][[;#FFF;#000] ][[;#555;#AAA]▓▒][[;#FFF;#AAA]▒▒▒]▌ [[b;#FFF;#AAA]▓]▀ ▄[[b;#FFF;#AAA]▒]▀[[b;#555;]▀] ▀[[b;#FFF;#AAA]░░▒▓▓][[;#FFF;#000]██][[;#FFF;#AAA]▓▒]▄ [[b;#555;]▀][[;#FFF;#AAA]░▒▓][[;#FFF;#000]███████][[;#FFF;#AAA]░]▄
[[b;#555;]▀][[;#555;#AAA]▄▓][[;#555;#000] ]▐[[b;#555;#AAA]░][[;#FFF;#AAA]▓][[;#FFF;#000]███████][[;#FFF;#AAA]▓][[;#555;#AAA]░]▌[[b;#555;]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓▓▒]▌▐[[b;#FFF;#AAA]▒][[;#FFF;#000] ][[;#FFF;#AAA]░▒][[;#555;#000]▀][[;#FFF;#000]▄][[;#555;#AAA]▄▄▄][[;#FFF;#000]▄][[;#555;#000]▀][[;#FFF;#AAA]▒▓][[;#FFF;#000]█████][[;#FFF;#AAA]▓▒]▄ [[b;#555;]▀][[;#FFF;#AAA]░▒▓][[;#FFF;#000]██████][[;#FFF;#AAA]▒░]█
[[b;#555;]▀ ]▐[[b;#FFF;#AAA]▒▓][[;#FFF;#000]██████][[;#FFF;#AAA]▓░][[;#555;#AAA]░][[;#FFF;#000] ][[;#555;#AAA]▓][[;#FFF;#AAA]▒▓█▓▓][[;#555;#000]▌]▐▌[[b;#555;]▐][[;#FFF;]█]▌▐[[b;#555;#AAA]▀]▄[[b;#FFF;#AAA]▄]▀[[b;#FFF;#AAA]█]▌▐[[b;#FFF;#AAA]▓][[;#FFF;#000]██████][[;#FFF;#AAA]▓▒▒]▄ [[b;#FFF;#AAA]░▒▓][[;#FFF;#000]█████][[;#FFF;#AAA]▓▒░][[;#555;#AAA]▀]
[[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]████][[;#FFF;#AAA]▓░░]▀[[;#000;] ][[b;#555;#AAA]▒][[;#FFF;#AAA]▒███▓][[;#000;] ][[b;#FFF;#AAA]░]▌[[b;#555;]▐][[;#FFF;]█][[;#FFF;#AAA]▌][[;#555;#000]▄]▀[[b;#FFF;#AAA]▀▀▀]▀[[b;#555;]▄█][[;#FFF;]█████████][[;#FFF;#AAA]▓▒]▌[[;#000;] ][[b;#FFF;#AAA]░▒▓][[;#FFF;#000]█████][[;#FFF;#AAA]▓░░][[;#555;#000]▄]
[[;#555;#000]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]███][[;#FFF;#AAA]▒]▀[[b;#555;]▄▄▄▄][[;#000;] ][[b;#555;]▀][[;#FFF;#AAA]▓▓██▓][[;#000;] ][[b;#FFF;#AAA]▒]▌[[b;#555;]▐][[;#FFF;]█][[;#FFF;#AAA]▌][[;#555;#000]░▄]▄[[b;#555;]▄▄▄][[;#555;#AAA]▀][[;#FFF;#000]███████████][[;#FFF;#AAA]▓▒][[;#555;#000]▄][[;#000;] ][[b;#FFF;#AAA]░▒][[;#FFF;#000]█████][[;#555;#AAA]░][[;#FFF;#AAA]░][[;#555;#AAA]░][[;#555;#000]▌]
[[;#555;#000]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]██][[;#FFF;#AAA]▓]▌[[b;#555;]▐][[;#555;#AAA]▓▓▓▓▓][[;#555;#000]▄][[;#000;] ][[;#AAA;]▀][[b;#FFF;#AAA]▓█▓][[;#000;] ][[b;#FFF;#AAA]▓]▌[[b;#555;]▐][[;#FFF;]██]▌▐[[b;#FFF;#AAA]▓▓▓][[;#FFF;#000]███][[;#555;#AAA]▄]▀[[b;#555;]▀][[;#000;] ][[b;#555;]▀]▀▀▀[[b;#555;#AAA]▄▄▄▄▄][[;#000;] ][[b;#FFF;#AAA]░▒▓▓▓][[;#555;#AAA]░░▒▓][[;#555;#000]▄]
[[;#555;#000]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]██][[;#FFF;#AAA]▓][[;#FFF;#000] ][[;#555;#AAA]▓▓▒▒▒▓▓▓][[;#000;] ][[;#AAA;]▀][[b;#FFF;#AAA]▓▓][[;#000;] ][[b;#FFF;#AAA]▓][[;#FFF;#000]█][[;#000;] ][[b;#555;#AAA]▌▄▄][[;#000;] ][[b;#555;#AAA]▄▄▄]▀▀[[b;#555;]▀] [[b;#555;]▀▀▀][[;#555;#AAA]░░][[;#555;#000]█▄▄]
[[;#555;#000]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]██][[;#FFF;#AAA]▓][[;#FFF;#000] ][[;#555;#AAA]▓▒░░░░▒▓▓][[;#000;] ][[;#AAA;]▀][[;#000;] ][[;#AAA;]▀]
[[b;#555;]▐][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]█][[;#FFF;#AAA]▓▒][[;#FFF;#000] ][[;#555;#AAA]▒░][[;#FFF;#AAA]░░░░][[;#555;#AAA]░░▓▓]░░
[[b;#555;#AAA]░][[;#FFF;#AAA]▒▓▓▒][[;#555;#AAA]░][[;#555;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]░▓][[;#FFF;#000]██][[;#FFF;#AAA]▒░░][[;#555;#AAA]░]▀[[b;#555;]▀]
▐[[b;#FFF;#AAA]░▓▒][[;#555;#AAA]░][[;#555;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]████][[;#FFF;#AAA]▓][[;#555;#AAA]▄][[;#555;#000]▀]
[[b;#555;]▐][[;#FFF;#AAA]░▒][[;#555;#AAA]░][[;#555;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]██][[;#FFF;#AAA]▓▒][[;#555;#AAA]▄][[;#555;#000]▀]
[[b;#555;#AAA]░░][[;#555;#000] ][[;#555;#AAA]░][[;#FFF;#AAA]▒▓][[;#FFF;#000]█][[;#FFF;#AAA]▓][[;#555;#AAA]▄][[;#555;#000]▀]
[[b;#555;#AAA]░][[;#555;#000] ][[;#FFF;#AAA]▒▓▓][[;#555;#AAA]▄][[;#555;#000]▀]
[[b;#555;]▀][[;#FFF;#AAA]▓][[;#555;#AAA]▄][[;#555;#000]▀] [[b;#FFF;] ][[;#000;] ][[;#AAA;]▄][[b;#555;]▀ ▄▄▄▓█][[;#555;#AAA]▓][[;#555;#000]▀▀][[;#555;#AAA]▓][[;#555;#000]▄ FUEL! ]▄[[b;#555;#AAA]▒][[;#555;#000]▄]
[[b;#555;] ▀]▀▀▐[[b;#555;#AAA]░][[;#555;#000]▀ ]▐[[b;#FFF;#AAA]░][[;#555;#000]▀] [[;#555;#AAA]▐][[;#555;#000]▌ ][[;#555;#AAA]▓][[;#555;#000]▌]
[[;#555;#AAA]░][[;#555;#000]▌ ░ ]▀ ▄[[b;#555;#AAA]▓▀][[;#555;#000]▄ ]▐[[b;#555;#AAA]▓][[;#555;#000]░]▐[[b;#FFF;#AAA]░][[;#555;#000]▌]
▄[[b;#FFF;#AAA]░][[;#555;#AAA]▀]▄[[b;#555;]▄][[;#555;#AAA]▐][[;#555;#000]▌ ]▐[[b;#FFF;#AAA]░][[;#FFF;#000] ][[;#555;#AAA]▐][[;#555;#000]▌ ]▐[[b;#555;#AAA]▓][[;#555;#000] ][[;#555;#AAA]▐][[;#555;#000]▌]▄[[b;#555;#AAA]▒][[;#555;#000]▀]
[[b;#555;] ]▄[[b;#555;#AAA]▄][[;#555;#000]▀]▐[[b;#555;#AAA]▓][[;#555;#000] ]░▐[[b;#555;#AAA]▓][[;#555;#000]░ ][[;#555;#AAA]▐][[;#555;#000]▌]▐[[b;#555;#AAA]░]▄[[b;#555;]▄][[;#555;#AAA]▄][[;#555;#000]▌]▐[[b;#FFF;#AAA]░][[;#555;#AAA]▄][[;#555;#000]▀]
[[b;#555;] ]▐[[b;#555;#AAA]▓][[;#555;#000]░ ][[;#555;#AAA]▐][[;#555;#000]▌ ][[;#555;#AAA]░▀]▄[[b;#555;#AAA]▄][[;#555;#000]▀]░[[b;#555;#AAA]░][[;#FFF;#AAA]░]▄[[b;#555;]▄ ▀][[;#555;#AAA]░][[;#555;#000]▌ ▄░]▀
[[;#AAA;] ][[b;#555;#AAA]░][[;#555;#000]▌]▄[[b;#555;#AAA]▄][[;#555;#000]▀ ]▀[[b;#555;]▀ ▀▀ ]▀[[b;#555;]▀]
[[b;#555;] ]▀[[b;#555;]▀]
"
`;
exports[`Terminal utils $.terminal.from_ansi should render ANSI art 2`] = `
"
[[b;#555;#000]░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▄▄▄ ▄▄▄ ▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]
[[b;#555;#000]░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ▒▄▀▐ ▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]
[[b;#555;#000]▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▄▄▒▒ ░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒]
[[b;#555;#000]▒▒▒▒▒▒▒▒▒▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒]
[[b;#555;#000]▓▓▓▓▓▓▓▓▀ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ░ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓]
[[b;#555;#000]▓▓▓▓▓▓▓▌▐█ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒] [[b;#555;#000]░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀]
[[b;#555;#000]▓▓▓▓▓▓▓ █▐▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░] [[b;#555;#000]▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌▐▌]
[[b;#555;#000]▓▓▓▓▓▓▌▐▌▌█ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀▀ ░] [[b;#555;#000]▀▀▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ █]
[[b;#555;#000]▓▓▓▓▓▓ ██▒▐▌▐▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▀▀ ▄▄▀ ░] [[b;#555;#000]▀▄▄ ▀▀▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌▐▌▌]
[[b;#555;#000]▓▓▓▓▓▌▐█▀▀ █ ▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▀ ▄▄▀▀ ░] [[b;#555;#000]▀▀▄▄ ▀▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓ █▐░]
[[b;#555;#000]▒▒▒▒▒ ▀▀▀▀▀ ▐▒▒▒▒▒▒▒▒▒▒▒▒▀▀ ▄▄▀] [[b;#555;#000]▀▄▄] [[b;#555;#000]▀▄▄ ▀▀▒▒▒▒▒▒▒▒▒▒▒▒▒▌▐▓▄▄]
[[b;#555;#000]▒▒▒▒▒▐▀▀▀▀▀▀▀▌▒▒▒▒▒▒▒▒ ][[;#A50;]▄][[;#AAA;]▄▄ ][[b;#555;]▀▀] [[b;#555;]▀▀▄▄ ▀▀▄▄ ▀▀▒▒▒▒▒▒▒▒▒ ▀▀▀]
[[b;#555;]░░░░░▌▓▀▀▀▀▀▐▄░░░░░ ][[;#A50;]▐▓][[;#AAA;#A50]░▒][[;#AAA;#000]▌] [[b;#555;#000]▀▄▄] [[b;#555;#000]▀▀▄▄ ░░░░░░▄▀▀▀▀]
[[b;#555;#000]░░░░░░▐▓▓▀ ▀▓▐░░ ▄▀▀ ][[;#A50;]▀▀][[;#AAA;]▌] [[b;#555;]▀▀▄▄] [[b;#555;]▀▄▄ ░░▌▓▀▀▀]
[[b;#555;]░░░░░░▐▒░ ▐▐ ▄▀▀ ][[;#A50;]▐▓][[;#AAA;]▌ ][[b;#555;]░] [[b;#555;]▄▒ ▀▀ ▀▄▄] [[b;#555;]▀▀▄▄ ▀▀▄ ░▐▓▓▀]
[[b;#555;]▒▒▒▒▒▒▐░] [[b;#555;]▀▀] [[;#A50;]▐▓][[;#AAA;]▌ ][[b;#555;]░░] [[b;#555;]▄▀ ▐▐▄▌ ▀▀▄] [[b;#555;]▀▄▄ ▀▀▄▐▒░]
[[b;#555;]▒▒▒▒▒▒▐] [[b;#555;]▄▒ ][[;#A50;]▐▐▌ ][[b;#555;]░] [[b;#555;]▄░ ▄░ ▄▄▄ ▐▀ ▀▄] [[b;#555;]▀▀▄ ▐▒▓▓]
[[b;#555;]▒▒▒▀ ▄▐] [[b;#555;]▄▒░░░░░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]░ ▄░ ▄ ▄ ▀ ▐▌ ▀▀▄ ▄ ▓] [[b;#555;#000]▀▀▄ ▌░▒▓]
[[b;#555;#000]▀ ▄▄▓▀] [[b;#555;#000]▄▀░░░░░░░░ ][[;#A50;]▒][[;#AAA;#A50]░] [[b;#555;#000]░ ▄▐▀ ░ ▐▌ █ ▄▀ ▓] [[b;#555;#000]▄░ ▐░▒▓]
[[b;#555;#000]█▀▀ ]▄▄[[;#A50;]▄] [[;#A50;]▓][[;#AAA;#A50]▐] [[b;#555;#000]▀ ][[;#A50;]▄][[;#AAA;]▄▄ ][[b;#555;]▌ ▐▌ ▐▌] [[b;#555;]▐▓ ▐░░▒]
▐[[;#AAA;#A50]░][[;#A50;#000]▓▀▌▀▓▓█][[;#AAA;#A50]░░▀▀▀▀▀▀][[;#A50;#000]███▒▓▓█][[;#AAA;#A50]▀▀░▀▀▀▀░][[;#A50;#000]▐][[;#AAA;#A50]░][[;#A50;#000]▓░][[;#AAA;#000]▌ ][[b;#555;#000]▀▀▀▀▀▌ ▀▀ ▐▌] [[b;#555;#000]▓ ░░]
[[b;#555;#000] ▄ ][[;#A50;]▀░▀] [[;#A50;]▐][[;#AAA;#A50]░] [[;#A50;#000]▀▀ ][[b;#555;#000]▌ █ ▄▀ ▓] [[b;#555;#000]▒ ░]
[[b;#555;#000] ▄▄▓░] [[b;#555;#000]░░░░░░░░░░░ ][[;#A50;]▓][[;#AAA;#A50]░] [[b;#555;#000]░ ▀▀▒ ▀▄▄ ▐▌ ▄▄▀ ▀ ▐▌] [[b;#555;#000]░ ░]
[[b;#555;#000]▒▒░░░ ░░░░░░░░ ░░░ ][[;#A50;]▓][[;#AAA;#A50]░] [[b;#555;#000]░ ▀ ▄▄ ▀▀▀▀ ▐▀▄ ▄▀] [[b;#555;#000]░ ░]
[[b;#555;#000]░░░░░ ░░░░░░ ▄▓▄ ░ ][[;#A50;]▓][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]▒▄] [[b;#555;#000]▄ ▀▌▐ ▐▀▌ ▀ ▄▀] [[b;#555;#000]▄▓▄] [[b;#555;#000]▄▓▄]
[[b;#555;#000] ░░░ ░ ░░░░░ █▀▄▀▒ ░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]▄▀█] [[b;#555;#000]░ ▄] [[b;#555;#000]▀ ▄▒▀] [[b;#555;#000]█▀▄▀▒ █▀▄▀▒]
[[b;#555;#000] ░ ▒ ░░░░░ ▐▓▀ ▀▓▌ ░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]▀▓▌ ░] [[b;#555;#000]▀ ▀▀▀] [[b;#555;#000]▐▓▀ ▀▓▌ ▐▓▀ ▀▓▌] [[b;#555;#000]░]
[[b;#555;#000] ░ ▒ ░░░░░ ▐▌░ ▐▌ ░ ][[;#A50;]▐][[;#AAA;#A50]▒][[;#A50;#000]▌ ][[b;#555;#000]▐▌ ░░░░░] [[b;#555;#000]▐▌ ▐▌ ▐▌ ▐▌] [[b;#555;#000]░]
[[b;#555;#000]▒ ░░░░░ ▐▌░ ▒▌ ░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▌][[b;#555;#000]░ ░▌ ░░░░░░░░░ ▄▄] [[b;#555;#000]▐▌░ ▌ ▐▌░ ▐▌]
[[b;#555;#000]▒ ░░░░░ ▐▌░ ░▌ ░ ][[;#A50;]▐█▌][[b;#555;]░] [[b;#555;]░░░░] [[b;#555;]▀ ▀▄] [[b;#555;]▐▌░ ▌ ▐▌░ ░▌]
[[b;#555;]▒ ░░░░░ ▐▌░ ▌ ░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▌][[b;#555;#000]░ ][[;#AAA;#A50]░][[;#AAA;#000]▄] [[b;#555;#000]▄▓▄] [[b;#555;#000]░ ░░] [[b;#555;#000]▐▌░] [[b;#555;#000]▐▌░ ▌]
[[b;#555;#000]░ ░░░░░ ▐▌░] [[b;#555;#000]░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▌][[b;#555;#000]░ ][[;#A50;]▐▐][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]▄▀][[;#A50;]▄][[;#AAA;]▄ ][[b;#555;]▒▄] [[b;#555;]░░ ▐▌░] [[b;#555;]▐▐▌]
[[b;#555;]░ ░░░░░░▐▌▒] [[b;#555;]░ ][[;#AAA;#A50]░][[;#A50;#000]▌ ▌▐][[;#AAA;#A50]▒][[;#AAA;#000] ][[;#A50;#000]▄▀ ][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[b;#555;#000]▓▌ ][[;#A50;]▄▄][[;#AAA;]▄][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[b;#555;#000]▄▄▌ ▐▌▒] [[b;#555;#000]▐▐]
[[b;#555;#000] ░ ░ ░░░░░▐▐▓▀] [[b;#555;#000]░░ ][[;#AAA;#A50]░][[;#A50;#000]█ ][[b;#555;#000]░░ ][[;#A50;]▐ ][[;#AAA;#A50]▐][[;#A50;#000]▐▌▐▄▐][[;#AAA;#A50]▒][[b;#555;#000] ░ ][[;#A50;]▓▀▀ ▄▌][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]▐][[;#555;#A50]▓][[;#555;#000]░▀ ▐▌]
[[;#555;#000] ░ ░ ░░░░░] [[;#555;#000]░ ][[;#AAA;#A50]░][[;#A50;#000]█ ][[b;#555;#000]░░ ][[;#A50;]▓▒▄▀▄▀▄][[;#AAA;]▌ ][[b;#555;]▀▌][[;#A50;]▐▌▄▀][[b;#FF5;#A50]░] ▐▌[[b;#555;]▀ ]▄[[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]▐░]
[[b;#555;#000]░░░░ ░ ░░░░░░░░░░░░░░░░ ][[;#AAA;#A50]▐░][[;#AAA;#000] ][[b;#555;#000]░░ ][[;#A50;]▄▀▀][[b;#FF5;#A50]░][[;#A50;]▄█▐▀▀▄▄▒▄▄▌▀▐][[;#AAA;]▌][[;#A50;]▄▀][[;#AAA;#A50]░][[;#A50;#000]▀ ][[b;#555;#000]░]
[[b;#555;#000]▒░░░ ░ ░░░░░░░░░░░░░░░░ ][[;#A50;]▐][[;#AAA;#A50]▌][[;#AAA;#000] ][[b;#555;#000]░ ][[;#A50;]▄▀][[;#AAA;#A50]░][[;#A50;#000]▀█▄ ▀▀▀▀▄][[;#AAA;#A50]░][[;#A50;#000]█▄▐█▀▀][[;#AAA;#A50]░][[;#A50;#000]▄▀ ][[b;#555;#000]░░░░░]
[[b;#555;#000] ▀▓░ ░░░░░░░░░░░░░░░░░][[;#A50;]▐][[;#AAA;#A50]▌][[;#AAA;#000] ][[;#A50;#000]▐ ][[;#AAA;#A50]▒][[;#A50;#000]▌█▀][[;#AAA;#A50]░][[;#A50;#000]▓▓▀▀][[;#AAA;#A50]░][[;#A50;#000]▄▄▄▄ ▀▀▀▀ ][[b;#555;#000]░░░░░░░░░░░░░░] [[b;#555;#000]▌]
[[b;#555;#000]█▄ ▓ ░ ░░░░░░░░░░░░░░░░░][[;#A50;]▐][[;#AAA;#A50]▌][[;#AAA;#000] ][[;#A50;#000]▌][[;#AAA;#000]▐][[;#A50;#000]█▐] [[;#A50;#000]▀▀▀▀█][[;#AAA;#A50]░▒][[;#A50;#000]▌▌ ][[b;#555;#000]░░░░░░░░░░░░░░░░░░░░░ ▌]
[[b;#555;#000]▄▀█] [[b;#555;#000]░░░░░░░░░░░░░░░░░][[;#A50;]▐][[;#AAA;#A50]▒][[;#A50;#000]▌▐▄][[;#AAA;#A50]░][[;#A50;#000]▄▀▐░ ░▄▒▓][[b;#555;#A50]░░][[;#A50;]█▄▄ ▄ ▄█ ][[b;#555;]░░░░░░░░░░░░░░░░░░░░░ ▌]
[[b;#555;] █▐▌ ░░░░░░░░░░░░░░░░░][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▌][[;#AAA;#A50]░][[;#A50;#000]▀▀ ][[b;#555;#000]░ ][[;#A50;]▀▀▓][[b;#555;#A50]░░][[;#A50;]██][[;#AAA;#A50]░▒▄][[;#A50;#000]▌ ░ ▌ ][[b;#555;#000]░░░░░░░░░░░░░░░░░░░░░░ ▌]
[[b;#555;#000] ▐▌█ ░░░░░░░░ ░░░░░░][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▌▌] [[;#A50;#000]░▓▄▀ ▄███][[b;#555;#A50]░][[;#A50;]▀█▓ ▐ ][[b;#555;]░░░░░░░░ ░░░░░░ ░░░ ▌]
[[b;#555;] ▐▌▓ ░ ░░░░░░ ▄▓▄ ░░ ][[;#AAA;#A50]░][[;#A50;#000]▌▐ ][[b;#555;#000]▄░ ][[;#A50;]▒▓█][[b;#555;#A50]░][[;#A50;]▄][[b;#555;]▄▄][[;#AAA;#A50]░][[;#A50;#000]▌▀▀░ ▌] [[b;#555;#000]▄▓▄ ░░ ▄▒▄ ░ ▌]
[[b;#555;#000] ▐▌▓ ░ ░░░░░░ █▀▄▀▓ ░ ][[;#A50;]░ ][[;#AAA;#A50]░][[;#A50;#000]▌▀ ▐][[b;#555;#000]▀ ][[;#A50;]▐▓██][[;#AAA;#A50]░][[b;#555;#A50]▒][[;#A50;]▀▐][[;#AAA;#A50]▒][[;#A50;#000]▐][[b;#555;#A50]▀][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[;#A50;#000]▐ ▄▄][[b;#FF5;#A50]░][[;#A50;]█][[;#AAA;#A50]░][[;#A50;#000]▀██▄▄ ][[b;#555;#000]▀▓ ░ █▀▄▀▒ ░ ▌]
[[b;#555;#000] ▐▌▓ ░ ░░░░░ ▐▓▀ ▀▒▌ ][[;#A50;]▒▓ ][[;#AAA;#A50]▐][[;#A50;#000]█] [[;#A50;#000]░▓▓█][[b;#555;#A50]░][[;#A50;]▄▌▀▀▄][[;#AAA;#A50]░][[;#AAA;#000]▀ ][[b;#555;#000]▐ ][[;#A50;]▌▀▌▀ ▀▐▓][[;#AAA;#A50]▒][[;#A50;#000]▀▄][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000] ][[b;#555;#000]▐▌ ▐▓▀ ▀▓▌ ▌]
[[b;#555;#000] ▌▒ ░ ░░░░░ ▐▌▒ ▐▌▐][[;#AAA;#A50]░][[;#A50;#000]▀▄ ][[;#AAA;#A50]▐][[;#A50;#000]█ ░ ][[b;#555;#000]░][[;#A50;]▒▓][[b;#555;#A50]░][[;#A50;]▄▄][[b;#555;]▄][[;#A50;]▐][[b;#555;#A50]░][[;#A50;]▀ ][[b;#555;]▒ ][[;#A50;]▌░▓█][[;#AAA;#A50]░][[;#A50;#000]▄▀ ▐█▄▀▀▌ ][[b;#555;#000]▌ ▐▌ ▐▌ ▌]
[[b;#555;#000] ▌▒ ▒ ░░░░░ ▐▌░ ][[;#A50;]▄▀░▓▌ ][[;#AAA;#A50]▒░] [[;#A50;#000]▀▓][[;#AAA;#A50]░][[;#AAA;#000]▄][[;#A50;#000]▄▀ ][[b;#555;#000]░▌ ][[;#A50;]▄ ][[b;#555;]▀][[;#A50;]█][[b;#555;#A50]░][[;#A50;]▓░▀][[b;#555;]▄][[;#555;#A50]▒░][[;#A50;]▄▐ ][[b;#555;]▌ ▐▌░ ▐▌ ▌]
[[b;#555;] ▌▒ ▒ ░░░░░ ▐▌ ][[;#A50;]▄▀ ░▓▀ ][[;#AAA;#A50]░][[b;#555;#A50]░] [[;#A50;]░] [[;#A50;]▀▀] [[b;#555;]▐ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▓][[;#AAA;#A50]▄░][[;#A50;#000]██▒▄ ][[b;#555;#000]▀][[;#A50;]░▀▌ ][[b;#555;]▌ ▐▌ ▌ ▌]
[[b;#555;] ▌▐ ▓ ░░░░░ ▐ ]▀▄[[;#A50;]▄][[;#AAA;]▀][[;#A50;]▀ ][[b;#555;#A50]░][[;#555;#000]▀ ][[;#A50;]░░][[b;#555;]░ ░░ ░ ░ ▀][[;#555;#A50]▌][[;#AAA;#A50]▒░][[;#A50;#000]█▓▓█▌▄ ▐░ ][[b;#555;#000]▐▌ ▐▒░ ▌ ▌]
[[b;#555;#000] ▐ ▓ ░░░▒░ ]▄▀▀ [[;#A50;]▄▌ ▄▌][[b;#555;]▄ ][[;#A50;]▄ ░▓░░][[b;#555;]░ ░ ░][[;#555;#A50]░][[;#AAA;#A50]░][[b;#555;#000]░ ][[;#A50;]█ ▄█▓▓░ ▀ ░▀ ][[b;#555;]▓▌ ▐░░ ▌ ▌]
[[b;#555;] ▐ ▐ ▀ ]▀▄▄[[;#AAA;#A50]▓░][[;#A50;#000]▌▀░ ▐▄ ][[b;#555;#A50]▓][[;#555;#000]▌ ][[;#A50;]▀▌ ▀▓▒][[b;#555;]░░ ][[;#A50;]░▒][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▄▄][[;#AAA;#A50]▒][[;#A50;#000]▀▀ ▀][[b;#555;#000]▀ ][[;#A50;]▄▄▌ ][[b;#555;]░▌ ▐▐ ░ ▌ ▌]
[[b;#555;] ▐ ▓▌▄▄▄ ]█[[;#AAA;#A50]▓░][[b;#FF5;#A50]░░░][[;#A50;]██▄▄▄ ][[b;#555;#A50]░▓] [[;#A50;]░][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▄▄▀▀ ▀▀░▄▄ ][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]▀░ ░][[;#A50;]▄▌▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▌][[;#AAA;#000]▄▄ ][[b;#555;#000]▐▐ ░] [[b;#555;#000]▌]
[[b;#555;#000]▐▓▀▀ ]▄[[;#AAA;#A50]▓░░][[b;#FF5;#A50]░░][[;#A50;]█][[b;#555;#A50]░░░░][[;#A50;]▓▓▓▌][[;#AAA;#A50]░][[b;#555;#A50]░] [[;#A50;]▓▌][[;#AAA;#A50]░][[;#AAA;#000]▄ ][[;#A50;#000]▀ ▀▀▀▀ ▄ ▄█][[;#AAA;#A50]░][[;#A50;#000]▄ ][[b;#555;#000]▒ ][[;#A50;]▀▀ ▄▀▀▄][[b;#555;#A50]░][[;#A50;]█][[;#AAA;#A50]▀▓][[;#AAA;#000]▄▄] [[b;#555;#000]▌]
[[b;#555;#000]▒ ]▐[[;#AAA;#A50]░░][[;#A50;#000]█][[b;#FF5;#A50]░][[;#A50;]█][[b;#555;#A50]░░░░][[;#A50;]▓][[b;#555;#A50]▄][[;#555;#000]▀][[;#A50;]▄▄ ][[;#AAA;#A50]▐][[;#A50;#000]█ ░▀][[;#AAA;#A50]░▓][[;#AAA;#000]▄][[;#A50;#000]▀▄▀▓][[;#AAA;#A50]▒░][[;#A50;#000]▀ ▄ ][[;#AAA;#000]▄][[;#A50;#000]▀][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;] ][[b;#555;]▐▓▄][[;#555;#A50]▓][[;#555;#000]▄▄][[;#555;#A50]▓▒][[;#A50;]▓▀▓][[b;#FF5;#A50]░][[;#AAA;#A50]░▓][[b;#FFF;#AAA]░]▌ [[b;#555;]▐ ▌]
[[b;#555;] ▄ ▒ ]▐[[;#AAA;#A50]░][[b;#555;#A50]░░░░░░][[;#A50;]▒▒▒▓][[b;#555;]▌][[;#A50;]▀][[b;#555;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▀▐][[;#AAA;#A50]░][[;#A50;#000]▐▄ ░][[;#AAA;#A50]░▓][[;#A50;#000]▐][[;#AAA;#A50]░][[;#A50;#000]▐▓▓▌▐▓][[;#AAA;#A50]░][[;#A50;#000]▄][[;#AAA;#A50]▒][[;#AAA;#000]▄][[;#A50;#000]▀ ][[b;#555;#000]▀▄][[;#555;#A50]▓░][[;#A50;]▀▐ ][[b;#555;]▄][[;#555;#A50]░][[;#A50;]▓][[b;#FF5;#A50]░][[;#AAA;#A50]░▓][[;#AAA;#000]█] [[b;#555;#000]▐ ▌]
[[b;#555;#000] ░░▒ ▒ ][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#555;#A50]░░░][[;#A50;]▒▒░░▒▒▒▓][[b;#555;#A50]▀▓░][[;#A50;]▓▐][[;#AAA;#A50]░][[;#A50;#000]▌█▓░ ▀░▐▓][[b;#555;#000]▐][[;#A50;]▀░][[b;#555;]░ ][[;#A50;]▀▀▒▓][[;#AAA;#A50]░][[;#A50;#000]█▄ ][[b;#555;#000]▀▀ ]▄[[;#A50;]▄ ][[b;#555;]▀][[;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]░][[;#AAA;#000]▌][[;#AAA;#A50]░] [[b;#555;#000]▒ ▌]
[[b;#555;#000] ▒ ░ ][[;#A50;]▐][[b;#FF5;#A50]░▒][[;#555;#A50]░][[;#A50;]▒░░░▒▒▓▓█▀][[b;#555;#A50]░][[;#FF5;#A50]░][[;#A50;]▀ ▐][[;#AAA;#A50]░][[;#A50;#000]▌▓░ ▄ ▄▌░ ][[b;#555;#000]░] [[;#A50;]▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▄▀][[b;#FF5;#A50]░][[;#AAA;#A50]▀▀▒░░][[;#A50;#000]██][[;#AAA;#A50]░▒][[;#A50;#000]▐▌][[b;#555;#000]▄▀▄ ▄▀▄▓ ▌]
[[b;#555;#000] ░ ░ ][[;#A50;]▐][[b;#FF5;#A50]░][[;#A50;]▒░░░░▒▓▓▒▀▄][[b;#FF5;#A50]░][[;#A50;]▀ ][[b;#555;]░░]▄▄[[;#A50;]▄▄][[;#AAA;]▄▄ ][[;#A50;]▀] [[;#A50;]▄▄▄][[b;#555;#A50]░▒][[;#555;#000]▄▄▄ ]▀[[;#AAA;#A50]▒][[;#A50;#000]▌▀▄][[b;#555;#000]▄░ ][[;#A50;]▀][[b;#555;#A50]░▓][[;#A50;]▀░][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]▀ ▓ ▌]
[[b;#555;#000] ░ ░ ][[;#A50;]▓][[b;#555;#A50]░][[;#A50;]░░░░▒▓▀▄▓▒▀ ][[;#AAA;]▄▄][[;#AAA;#A50]▓▒░][[b;#FF5;#A50]░][[;#A50;]▄▄][[;#AAA;]▄][[;#A50;]▀▌ ░░▄▐][[b;#555;#A50]▒][[;#555;#000]▌]▀[[;#AAA;#A50]▒][[;#AAA;#000]▄][[b;#555;#000]▄▄░]▄[[;#A50;]▄▄][[b;#555;#AAA]▀]▄▄[[b;#555;]▄ ▀▀▀▓░ ]▀[[;#AAA;#A50]▓][[;#AAA;#000] ][[b;#555;#000]▀▀▀▀▀▀▀▀ ▌]
[[;#A50;]▐▒░ ░░▒▓▄▓▀ ▄][[;#AAA;#A50]░▒▓▒░░░][[;#A50;#000]▓▄][[;#AAA;#000]▄▄][[;#A50;#000]▀ ▌░▒▀ ][[b;#555;#A50]░▓▓][[;#555;#000]▀▀][[;#A50;]▄▄][[;#AAA;#A50]░▒][[;#A50;#000]▀][[;#AAA;#A50]░▀▓][[b;#FFF;#AAA]▒░]█[[;#A50;]▀▄][[;#AAA;]▄ ][[;#A50;]▀][[;#AAA;]▄▄▄][[;#A50;]▀][[;#AAA;]▀ ][[b;#555;]▄░▒▓▄ ▀▒ ▌]
[[b;#555;]▄ ░ ][[;#A50;]▓░ ░▒▀▓▀ ▄▌▀▒▓▓███][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]▄▄][[;#AAA;]▄][[;#A50;]▀▀ ▓][[b;#555;#A50]▒░] [[b;#555;]▐░▀▄][[;#A50;]▄▀▄][[;#AAA;#A50]░▄░▒][[;#A50;#000]▀▀][[;#AAA;#A50]░][[;#AAA;#000]▀▀▄][[;#A50;#000]█▓░▀▄ ][[;#AAA;#A50]▒][[;#AAA;#000]▄][[;#A50;#000]▀▓ ][[b;#555;#000]░ ▀▓▓ ▐ ▌]
[[b;#555;#000]▀▓ ][[;#A50;]▐░ ░ ▄▓▀ ][[;#AAA;]▐][[;#A50;]▌▐ ░░▒▓█▀▀▀ ░▀ ][[b;#555;]░][[;#A50;]▄▀][[b;#FF5;#A50]░][[;#A50;]▌ ][[b;#555;]▀][[;#555;#A50]▀][[;#A50;]▀ ▄▄▀▀▓▒░][[b;#555;]░][[;#A50;]▐▌▄▄][[;#AAA;]▀][[;#AAA;#A50]░][[;#A50;#000]▄░ ][[;#AAA;#000]▀][[;#A50;#000]█▌][[b;#555;#000]░]▄ [[b;#555;]▐▓▌ ▌]
[[b;#555;] ▐█ ][[;#A50;]▒ █▀ ][[;#AAA;]▄▐▀][[;#AAA;#A50]░][[;#A50;#000]▄▀] [[;#A50;#000]▄ ][[b;#555;#000]▄░ ][[;#AAA;#A50]░][[;#A50;#000]▄ ▀░ ▀▄][[;#AAA;#A50]░][[;#A50;#000]▀▒░ ▄▄][[;#AAA;#000]▄▄][[;#A50;#000]▄ ▀ ▀][[;#AAA;#A50]░][[;#A50;#000]▄▀▄▓▄▌ ▄][[;#AAA;#A50]▒][[;#AAA;#000]▌ ][[b;#555;#000]░ ▄▓▓ ▌]
[[b;#555;#000]▄ ▓▌ ][[;#A50;]▐░▀▄▀ ][[;#AAA;]▄][[;#AAA;#A50]▓][[;#AAA;#000]▌][[;#A50;#000]▌ ▀▓░ ░▐▌ ][[b;#555;#A50]░▓] [[;#A50;]▀▀ ▄▀][[;#AAA;#A50]░▓░][[;#A50;#000]▄▀▀▀ ▄▄][[;#AAA;#000]▄][[;#A50;#000]░][[;#AAA;#000]▀▀][[;#AAA;#A50]▓░][[;#AAA;#000]▄][[;#A50;#000]▄][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▄▀ ▄][[b;#FF5;#A50]░][[;#AAA;#A50]░▀][[;#AAA;#000]▌][[b;#555;#000]▀░▒▓▀ ▒ ▌]
[[b;#555;#000]▐▌▐▌ ][[;#A50;]▌▄▀ ][[;#AAA;]▄][[;#AAA;#A50]▓░][[;#AAA;#000]▐][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]░░] [[;#A50;#000]▐▀ ][[;#AAA;#A50]░][[;#A50;#000]▌█][[b;#555;#A50]░][[;#A50;]▐▄▀ ▄][[;#AAA;#A50]▓▒░][[;#A50;#000]▌▀][[;#AAA;#A50]▒][[;#A50;#000]▒▓▄][[b;#555;#000]░ ][[;#A50;]▄▄▄][[;#AAA;]▀][[;#A50;]▀▀][[;#AAA;#A50]░][[;#A50;#000]█][[b;#555;#A50]░][[;#A50;]▓][[b;#555;#A50]░][[;#AAA;#A50]░░][[;#A50;#000]█ ▀▀▀][[b;#FF5;#A50]░][[;#A50;]▄][[;#AAA;]▀▄ ][[b;#555;]▒░░ ▌]
[[b;#555;] ▓▐▌][[;#A50;]▐▐▀][[;#AAA;]▄][[;#AAA;#A50]▒░][[;#A50;#000]█▀ ▀][[;#AAA;#A50]░][[;#A50;#000]▄▒░░] [[;#A50;#000]▄ ][[;#AAA;#A50]░][[;#A50;#000]█ ][[b;#555;#000]░ ]▀▄▀[[;#A50;]█▀ ▐▌░▐░][[b;#555;]░ ][[;#A50;]▄▄▀▀▀▀][[b;#555;#A50]░][[;#A50;]▓▒░░▓][[;#AAA;#A50]░][[;#A50;#000]▌][[;#AAA;#A50]▓][[;#AAA;#000]▄][[;#AAA;#A50]▒][[;#AAA;#000]▄▄][[;#AAA;#A50]░][[;#A50;#000]▄][[;#AAA;#000]▀▄ ][[b;#555;#000]░░ ▌]
[[b;#555;#000] ▓▐ ][[;#A50;]▌▌▐][[;#AAA;#A50]▒░][[;#A50;#000]▓][[b;#FF5;#A50]░][[;#A50;]▄ ▀][[b;#555;]░ ][[;#A50;]░▀▀ ][[;#AAA;#A50]░][[;#A50;#000]█ ▄▌▄ ▀ ░▒ ▀▄░▀▀░ ▀▀▀▓▒░░][[b;#555;#000]░░][[;#A50;]▀ ][[;#AAA;#A50]░][[;#AAA;#000]▌][[;#AAA;#A50]░][[;#AAA;#000]▀][[;#AAA;#A50]▓][[;#AAA;#000]▄][[;#A50;#000]▀][[;#AAA;#000]▌][[;#A50;#000]▐][[;#AAA;#000]▌ ][[b;#555;#000]░ ▌]
[[b;#555;#000] ▐ ][[;#A50;]▓▐][[;#AAA;#A50]▒][[;#A50;#000]▄▄▀ ░░] [[b;#555;#000]░ ][[;#A50;]▄ ▒░▐][[;#AAA;#A50]▌][[;#A50;#000]▌▐][[b;#FF5;#A50]░][[;#A50;]▓▀] [[;#A50;]▄][[b;#555;]▄][[;#A50;]▀▀▄▄▌] [[;#A50;]▀][[b;#FF5;#A50]░][[;#A50;]▐▀ ][[;#AAA;#A50]▒][[;#AAA;#000]▌▌][[;#A50;#000]▐][[;#AAA;#000]▌][[;#A50;#000]▐][[;#AAA;#000]▌ ][[b;#555;#000]░ ▌]
[[b;#555;#000] ▓ ][[;#A50;]▐▐][[;#AAA;#A50]░][[;#A50;#000]▄ ▀ ░][[b;#555;#000]░ ░ ][[;#A50;]▐▌ ▀ ▐][[;#AAA;#A50]▌][[;#A50;#000]▌][[;#AAA;#A50]░][[;#A50;#000]▀ ▄▓░][[b;#555;#000]░ ][[;#A50;]▀▓][[b;#555;#A50]▀][[;#A50;]▌] [[b;#555;]░ ][[;#A50;]▄▄▀░][[b;#555;]░▀ ]▐[[;#AAA;#A50]░][[;#A50;#000]▐][[;#AAA;#000]▌▐ ][[;#A50;#000]▐][[;#AAA;#000]▌ ][[b;#555;#000]▌]
[[b;#555;#000] ▒ ][[;#A50;]▓░▀▀][[b;#FF5;#A50]░][[;#A50;]▓▄] [[;#A50;]░ ▀▄▄▓▄ ▐][[;#AAA;#A50]▒][[;#A50;#000]▌▐▄][[b;#555;#A50]░░▓][[;#555;#000]▒░░ ░ ][[;#A50;]▀] [[;#A50;]░░ ░][[b;#555;]░ ░] [[;#FF5;#A50]░][[;#A50;]▌▐][[;#AAA;#A50]▒][[;#A50;#000]▌][[;#AAA;#000]▌][[;#A50;#000]░▌ ][[b;#555;#000]▌]
[[b;#555;#000] ░ ][[;#A50;]▌▒▌ ▀▒░░] [[;#A50;]▐▌ ▀▀][[;#AAA;#A50]░][[;#A50;#000]▄▐][[;#AAA;#A50]▒][[;#A50;#000]▌█][[;#AAA;#A50]░░][[;#A50;#000]█][[b;#555;#A50]░▓][[;#555;#000]▀ ][[;#A50;]▄▄▄▄ ▄▄▓▓░▀ ▐▒ ░ ][[b;#555;]▐ ][[;#A50;]▐][[b;#555;#A50]▓] [[b;#555;]░][[;#AAA;#A50]░][[;#A50;#000]▀][[b;#FF5;#A50]░][[;#A50;]▐ ][[b;#555;]▌]
[[b;#555;] ░][[;#A50;]▐][[b;#555;]░ ][[;#A50;]░░] [[;#A50;]░][[b;#555;]░ ][[;#A50;]█▒ ][[b;#555;]░░ ][[;#A50;]▀▐][[;#AAA;#A50]░][[;#A50;#000]▌▄░▀▀▄▄▄███][[b;#FF5;#A50]░][[;#AAA;#A50]░░][[b;#555;#A50]░░▒][[;#A50;]▀ ▄▓▌][[b;#555;]░][[;#A50;]▒ ▐ ][[b;#555;]░ ▒][[;#A50;]░ ][[b;#555;#A50]▓][[;#A50;] ▐] [[b;#555;]▌]
[[b;#555;] ][[;#A50;]▐][[b;#555;]▒ ][[;#A50;]░░░] [[;#A50;]▐▓░ ░░][[b;#555;]░░ ][[;#A50;]▄ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ▀▀▀ ][[b;#555;#000]░][[;#A50;]░ ▄▓▓▀▀▀ ▄▄▀▀▓ ][[b;#555;#A50]▌][[;#A50;]▓ ▐▌ ][[b;#555;]▐▌ ░][[;#A50;]░ ][[b;#555;]░][[;#A50;]▌ ▌] [[b;#555;]▌]
[[b;#555;] ][[;#555;#A50]▐] [[;#555;#000]░ ][[;#AAA;#A50]░][[;#A50;#000]▓][[b;#555;#000]░ ][[;#A50;]░░][[b;#555;#A50]▓][[;#A50;]▓▌ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░ ░░][[;#A50;]▄▓▓█▀▀ ▄▄][[;#AAA;#A50]░][[;#A50;#000]▀ ▐▓][[b;#555;#A50]░] [[b;#555;#A50]▌▒][[;#A50;]▌ ▓ ][[b;#555;]▓ ▌ ░][[;#555;#A50]▌][[;#A50;]▄▓▀ ][[b;#555;]░ ▌]
[[b;#555;] ░ ][[;#A50;]▐][[b;#555;]▌] [[b;#555;]░ ][[;#A50;]▐▀█▄ ▒▓▄ ▀▀ ][[;#AAA;#A50]░][[;#A50;#000]█ ▄▄▀▀▀ ▄][[;#AAA;#A50]▒░][[;#A50;#000]█▀ ░][[b;#555;#000]░][[;#A50;]█][[b;#555;#A50]▐] [[b;#555;#A50]▌░][[;#AAA;#A50]░][[;#A50;#000]▌▐][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]▀][[;#A50;]▄▄▀▀] [[b;#555;]░░ ▌]
[[b;#555;] ░ ▐░] [[b;#555;]░░][[;#A50;]░ ][[b;#555;]▄ ][[;#A50;]▀▄▄▓▓][[b;#555;#A50]░▒▓][[;#A50;] ][[;#AAA;#A50]░][[;#A50;#000]█][[b;#555;#000]░][[;#A50;]▐▌▄▄][[;#AAA;]▄][[;#A50;]▄▄█][[;#AAA;#A50]▀░][[b;#FF5;#A50]▒░][[;#A50;]▀ ░▒][[b;#555;]░ ][[;#AAA;#A50]░][[;#A50;#000]▌ ▐][[b;#555;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▐ ▓][[;#AAA;#000]▌][[;#A50;#000]▓ ▄▐ ][[b;#555;#000]░ ░░░▒ ▌]
[[b;#555;#000] ░ ░░ ░░▒][[;#555;#A50]▓▓][[;#555;#000]▀ ░ ][[;#A50;]▄][[b;#555;]▄][[;#A50;]▀▀][[b;#555;#A50]░░] [[;#AAA;#A50]▐][[;#A50;#000]█][[b;#555;#000]░ ][[;#A50;]▀▀▀ ░▒▄▄][[b;#FF5;#A50]░][[;#A50;]▀ ▄▓▒ ][[;#AAA;#A50]░][[;#A50;#000]█ ░][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]▌▌░][[;#AAA;#A50]░][[;#AAA;#000]▌][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]░▓ ][[b;#555;#000]▀▀▒▒▓ ▌]
[[b;#555;#000]▄ ▀▀▄ ░ ][[;#A50;]█][[;#AAA;#A50]░][[;#A50;#000]▓][[b;#555;#000]░ ][[;#A50;]▄ ][[;#AAA;#A50]▐][[;#A50;#000]█ ][[b;#555;#000]░░][[;#A50;]░▒▓][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]▀ ▄▓][[b;#555;#A50]░][[;#A50;]▀ ▄][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▌ ░][[b;#555;#A50]░][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]▌▐ ▓][[;#AAA;#A50]░][[;#AAA;#000] ][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▌ ][[b;#555;#000]▄░▒▓▄ ▀▓ ▌]
[[b;#555;#000]▀▀▀ ][[;#A50;]▄░ ▄█][[;#AAA;#A50]░][[;#A50;#000]▓░ ▐▒░ ][[;#AAA;#A50]░][[;#A50;#000]█] [[;#A50;#000]▀▀ ▄][[;#AAA;#A50]░░][[b;#555;#A50]░][[;#A50;]▀ ▄][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000]█ ░][[b;#555;#A50]░][[;#AAA;#A50]░▓][[b;#FF5;#A50]░][[;#A50;]▐ ░][[;#AAA;#A50]░▒][[;#AAA;#000] ][[;#AAA;#A50]▒][[;#AAA;#000] ][[b;#555;#000]░ ▀▓▓ ▐ ▌]
[[b;#555;#000]░░ ][[;#A50;]▌▄][[;#AAA;#A50]░][[;#A50;#000]▌ ▄█▓▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▓▀ ][[;#AAA;#A50]▐░][[;#AAA;#000] ][[;#A50;#000]░▄▄▀ ▀▀▀▀ ▄█▀▀█ ░▓▀▀][[;#AAA;#000]▀][[;#AAA;#A50]░][[;#A50;#000]▌▌ ░][[b;#FF5;#A50]░][[;#AAA;#A50]▓][[;#A50;#000]▐][[b;#FF5;#A50]░] [[b;#555;]▐▓▌ ▌]
[[b;#555;]░░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▓░ █▓░▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▀ ▄ ][[;#AAA;#A50]▐░][[;#AAA;#000] ][[;#A50;#000]▀ ░ ▄][[b;#555;#A50]░][[;#A50;]▌] [[;#A50;]▄░] [[;#A50;]▄ ▀▌ ░▀][[;#AAA;]▀▄][[;#A50;]▐][[;#AAA;#A50]▐][[;#AAA;#000] ][[b;#555;#000]▄▓▒ ▒ ▌]
[[b;#555;#000]░ ][[;#A50;]▀░ ][[b;#555;#A50]░][[;#A50;]▓][[b;#555;]░ ][[;#A50;]▄█▀ ▄▄▓░ ][[;#AAA;#A50]▐░][[;#AAA;#000] ][[;#A50;#000]░▓ ░▒ ▄][[;#AAA;#A50]░][[;#A50;#000]▀ ░][[b;#555;#000]░ ][[;#A50;]▐▓▌ ][[b;#555;]░][[;#A50;]░ ▐▒▒░▄ ▐ ][[b;#555;]░ ][[;#A50;]▐▄][[;#AAA;#A50]░][[;#AAA;#000]▓ ][[b;#555;#000]░▒▀ ▄▓ ▌]
[[b;#555;#000]░ ][[;#555;#A50]▒][[;#555;#000]░ ][[;#AAA;#A50]░][[;#A50;#000]▀ ▒▀▄][[b;#555;#A50]░][[;#A50;]▀ █][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▓█▄▄][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]▀ ▒░ ][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░][[;#A50;]░▄ ▒▓][[;#AAA;#A50]░░][[;#A50;#000]▌ ▀▄ ░▄ ▀][[;#AAA;#000]▀▌ ][[b;#555;#000]▄▓▒▒ ▌]
[[b;#555;#000]▄] [[b;#555;#000]░░ ][[;#555;#A50]░][[;#555;#000]░ ][[;#A50;]▄▀ ░░▄][[;#AAA;#A50]░][[;#A50;#000]▀ █][[;#AAA;#A50]▒][[;#AAA;#000] ][[b;#555;#000]░][[;#A50;]▐▓][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#A50;]█][[b;#555;]░ ][[;#A50;]▒▒ ][[;#AAA;#A50]░][[;#A50;#000]█ ▓][[;#AAA;#A50]░][[;#A50;#000]█ ▒▓][[b;#FF5;#A50]░][[;#AAA;#A50]▒][[;#AAA;#000]█ ][[;#A50;#000]░▄ ▓][[b;#555;#A50]░][[;#FFF;#000] ][[;#555;#000]░░░░▒ ▌]
[[;#555;#000]▀▓▄] [[;#555;#000]░ ][[;#A50;]▐▀▄▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▓▀ ░░░ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░][[;#555;#A50]▓][[;#AAA;#A50]░][[;#A50;#000]█][[b;#555;#000]░ ][[;#A50;]▐▓ ▐][[;#AAA;#A50]▒][[;#AAA;#000] ][[;#A50;#000]▓][[;#AAA;#A50]░░][[;#A50;#000]▓ ][[b;#555;#000]░][[;#A50;]▓▓][[;#AAA;#A50]░▓][[b;#555;#AAA]░] [[;#A50;]░][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[;#A50;#000]░][[;#AAA;#A50]░][[;#A50;#000]▌] [[b;#555;#000]░░░ ▌]
[[b;#555;#000]░ ▓▌] [[;#A50;]▄▀▀ ▄▀▓ ░░░▒▒ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#A50]▒░][[;#A50;]▌ ▐▓ ▐][[b;#FF5;#A50]░][[;#A50;]▌ ▐][[b;#555;#A50]░][[;#A50;]▓▓▌ ][[b;#555;]░][[;#A50;]▓][[b;#555;#A50]░][[;#AAA;#A50]░▒][[b;#555;#AAA]░]▌[[;#A50;]░][[;#AAA;#A50]░▒][[;#AAA;#000] ][[;#A50;#000]░][[;#AAA;#A50]░▒][[;#AAA;#000]▌] [[b;#555;#000]░ ▌]
[[b;#555;#000]▄ ▐▓] [[;#A50;]▐▌▄░▀ ▄▀ ░░▒▒▒▓▌▐][[;#AAA;#A50]░][[;#A50;#000]▌ ▐][[b;#555;#A50]░][[;#A50;]▌ ▄▓ ][[;#AAA;#A50]▒][[;#A50;#000]▌ ▓][[b;#555;#A50]░][[;#A50;]▓▓][[b;#555;]░ ░][[;#A50;]▓█][[b;#555;#A50]░][[;#AAA;#A50]░][[b;#555;#AAA]░]▌ [[;#A50;]▓][[;#AAA;#A50]▒][[;#AAA;#000]▌ ][[;#AAA;#A50]░░▓][[b;#555;#000] ▄ ▌]
[[b;#555;#000]▐▌ █] [[;#A50;]▀ ▄▀][[b;#555;]░ ][[;#A50;]░░▒▒▒▓▓▓▓▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#A50]░][[;#A50;]▀░▄▓ ][[;#AAA;#A50]░][[;#A50;#000]█ ][[b;#555;#000]░][[;#555;#A50]░][[;#A50;]▓█ ░▓█][[b;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]▓][[;#AAA;#000]█ ][[;#A50;#000]░][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[b;#FF5;#A50]░][[;#A50;]▀ ][[b;#555;]▄▀ ▀▄ ▌]
[[b;#555;] ▓ ▓ ░░ ][[;#A50;]▐][[b;#555;]░ ][[;#A50;]░░▒▓▓▓▓][[;#AAA;#A50]░░][[;#A50;#000]▓▐][[;#AAA;#A50]░][[;#A50;#000]▌▐▓░▓▓ ][[b;#555;#000]░][[;#A50;]▐▓ ][[b;#555;]░][[;#A50;]░▒█▓ ][[b;#555;]░][[;#A50;]░██][[b;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]▒][[b;#555;#AAA]░] [[;#A50;]░][[;#AAA;#A50]░▒][[;#A50;#000] ▌][[;#AAA;#000]▌ ][[b;#555;#000]▐▌▄▀▄▐▌ ▌]
[[b;#555;#000] ▒ ▐ ░░░ ][[;#A50;]▌ ░▄][[;#AAA;#A50]░][[;#A50;#000]▀▓▓][[b;#555;#A50]░░][[;#A50;]█][[;#AAA;#A50]░░][[;#A50;#000]█▐][[;#AAA;#A50]░][[;#A50;#000]▌▒▓▓▓▌ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░][[;#A50;]░▒▌▓ ░▓█][[b;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]▒][[b;#555;#AAA]░]▌ [[;#A50;]▓][[b;#FF5;#A50]░]▌[[;#A50;]░▀ ][[b;#555;]▒▐▌ ▐▌█ ▌]
[[b;#555;] ░ ▐ ░░░░ ][[;#A50;]▐][[b;#555;]░][[;#A50;]▄][[;#AAA;#A50]░][[;#A50;#000]█▀ ][[b;#FF5;#A50]░][[;#A50;]█][[b;#555;#A50]░][[;#A50;]█][[;#AAA;#A50]░░░][[;#A50;#000]█▐][[;#AAA;#A50]▒][[;#A50;#000]▌░▒▒▌ ][[b;#555;#000]░ ][[;#AAA;#A50]▒][[;#A50;#000]█ ][[b;#555;#000]░][[;#A50;]░░▓ ▓ ][[b;#555;]░][[;#A50;]░▓█][[b;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]▒][[b;#555;#AAA]░]▌ [[;#A50;]░][[;#AAA;#A50]░▒][[;#AAA;#000] ][[b;#555;#000]▒▓ ▌▓ ▌]
[[b;#555;#000] ░ ▓ ░░░░ ][[;#A50;]▀][[;#AAA;#A50]░][[;#A50;#000]█ ][[b;#555;#A50]░][[;#A50;]▄][[;#AAA;#A50]░][[b;#555;#A50]░░][[;#A50;]▓][[b;#555;#A50]░][[;#AAA;#A50]░][[;#A50;#000]███▐][[b;#FF5;#A50]░][[;#A50;]▌░▒▌ ][[b;#555;]░ ][[;#A50;]▐][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]░░][[;#A50;]░░▓ ▒ ][[b;#555;]░][[;#A50;]░▓█][[b;#555;#A50]░][[;#AAA;#A50]░▒▓][[;#AAA;#000]█ ][[;#A50;#000]░▓][[b;#FF5;#A50]░]▌ [[b;#555;]▓▌░ ▌▓ ▌]
[[b;#555;] ░ ▒ ░░░░░ ][[;#A50;]▓][[b;#555;]░ ][[;#A50;]██▓▓▓█][[;#AAA;#A50]░][[;#A50;#000]███][[b;#555;#A50]░][[;#A50;]▐][[b;#FF5;#A50]░][[;#A50;]▌░▌ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░░][[;#A50;]░░▒▌▐▒ ░▒▓█][[b;#555;#A50]░][[;#AAA;#A50]░▒▓][[;#AAA;#000]█ ][[;#A50;#000]░][[;#AAA;#A50]░▒][[;#AAA;#000] ][[b;#555;#000]▓▌░ ▌▒ ▌]
[[b;#555;#000] ▒ ░░░░░ ][[;#555;#A50]▓] [[;#AAA;#A50]░][[;#A50;#000]▌▓▓▓████][[b;#555;#A50]░░][[;#A50;]▒▐][[b;#FF5;#A50]░][[;#A50;]▌▀ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░░][[;#A50;]░░▒▓▌▐▒ ][[b;#555;]░][[;#A50;]▓██][[b;#555;#A50]░][[;#FF5;#A50]░][[;#AAA;#A50]▓][[b;#555;#AAA]░]▌ [[;#A50;]░▓][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[b;#555;#000]▓▌░ ▌▒ ▌]
[[b;#555;#000] ░ ░ ░░░ ▐░][[;#555;#A50]▓] [[;#A50;]░▒▓████][[b;#555;#A50]░][[;#A50;]▓▒ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ ▄][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]░░][[;#A50;]░░░░▓▌▐▌ ][[b;#555;]░][[;#A50;]▓█][[b;#555;#A50]░][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#AAA;#A50]▓][[b;#555;#AAA]░]█ [[;#A50;]░][[b;#FF5;#A50]░][[;#AAA;#A50]▒][[b;#FFF;#000] ][[;#555;#000]▐▌░ ▌▒ ▌]
[[;#555;#000] ░ ░] [[;#555;#000]▌▐░][[;#A50;]░▓▓▓███][[;#AAA;#A50]░][[;#A50;#000]▓▓░░▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]▌][[;#A50;]▐][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]░░ ][[;#A50;]░░▓ ][[;#AAA;#A50]░][[;#A50;#000]▌▐ ░▓█][[b;#555;#A50]░][[;#AAA;#A50]░][[b;#FF5;#A50]░][[;#AAA;#A50]▓▓][[;#AAA;#000]█ ][[;#A50;#000]░][[b;#FF5;#A50]░][[;#AAA;#A50]▓][[;#AAA;#000]▌ ][[b;#555;#000]▌░ ▌░ ▌]
[[b;#555;#000]░] [[b;#555;#000]▓ ][[;#A50;]█][[;#AAA;#A50]░][[;#A50;#000]██][[;#AAA;#A50]░░][[b;#FF5;#A50]░░][[;#AAA;#A50]░][[;#A50;#000]▓▓▐][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]░ ][[;#A50;]█▀ ][[b;#555;]░] [[;#A50;]░░▒ ][[;#AAA;#A50]░][[;#A50;#000] ▌ ░▓][[b;#555;#A50]░][[;#AAA;#A50]░▒▓▓][[b;#FF5;#AAA]░][[;#AAA;#A50]▓][[;#AAA;#000]▌ ][[;#A50;#000]▄▀][[;#AAA;#000]▀▀ ][[b;#555;#000]▌░ ▌░ ▌]
[[b;#555;#000] ░ ░] [[b;#555;#000]▐░][[;#A50;]▄▀▀ ▀][[;#AAA;#A50]░░▒▓▒░][[;#A50;#000]▀ ▐][[;#AAA;#A50]░][[;#A50;#000]▌ █▀ ][[b;#555;#000]░] [[;#A50;]░░░▌ █ ▌ ░▓][[b;#555;#A50]░][[;#AAA;#A50]░░][[b;#FF5;#A50]░░][[;#FF5;#AAA]░]█▀ [[;#A50;]▄ ░ ][[b;#555;]▐▌░ ░ ▌]
[[b;#555;]▄▒ ░ ░░] [[b;#555;]▐ ][[;#A50;]▌ ░ ▐█][[;#AAA;#A50]▀▀][[;#A50;#000]▓▀ ][[;#AAA;#A50]▐][[;#A50;#000]█ ][[;#AAA;#A50]░][[;#A50;#000]▌] [[;#A50;#000]░░░░ ▐█▄▌ ▒▓][[;#AAA;#A50]░][[;#A50;#000]█▀▀▀ ][[b;#555;#000]░][[;#A50;]▓][[;#AAA;]▌ ][[b;#555;]▓▌] [[b;#555;]▌]
[[b;#555;]▄▄▄▓ ▒▒▒░░░ ▌ ][[;#A50;]▄▀ ░▓][[;#AAA;#A50]░][[;#A50;#000]█░][[b;#555;#000]░] [[;#AAA;#A50]▐][[;#A50;#000]█▐▓ ][[b;#555;#000]░] [[b;#555;#000]░░][[;#A50;]░░░ ][[b;#555;#A50]░][[;#A50;]█▓ ░▓▀▀ ░][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[;#A50;#000]░][[;#AAA;#A50]░▓][[;#AAA;#000] ][[b;#555;#000]░░▓▄▄] [[b;#555;#000]▌]
[[b;#555;#000]▄▄▄▄▄▄▄▄▄▄▄▄ ▌][[;#AAA;#A50]░][[b;#555;#000]░ ][[;#A50;]░▓▓░░][[b;#555;]░] [[;#AAA;#A50]░][[;#A50;#000]█▐] [[b;#555;#000]░][[;#A50;]░ ][[;#AAA;#A50]░][[;#A50;#000]█░ █▀ ▌ ][[b;#555;#000]░][[;#A50;]▓][[;#AAA;#A50]░▓][[;#AAA;#000] ][[;#A50;#000]▓][[;#AAA;#A50]░][[;#AAA;#000]▀ ][[b;#555;#000]▄▄▄▄▄▄▄▄▄▄▌]
[[b;#555;#000] ▄ ▄ ▄ ]▐[[;#A50;]▀][[b;#555;]░ ][[;#A50;]░░] [[;#AAA;#A50]░][[;#A50;#000]█] [[;#A50;#000]░ ▐█▓░ ░][[;#AAA;#A50]░][[;#A50;#000]▌ ░▓][[;#AAA;#A50]░▓][[;#AAA;#000] ][[;#A50;#000]█][[;#AAA;#000]▀][[b;#555;#000]▐ ▄ ▄ ▄▌]
[[b;#555;#000]▀ ▀▄▀ ▀▄▀ ▀ ][[;#A50;]▌][[b;#555;]░ ░ ░] [[b;#555;]░][[;#A50;]▌][[;#AAA;#A50]░▌] [[;#A50;#000]░ ][[b;#555;#A50]░][[;#A50;]█▒░ ▀ ▓][[b;#555;#A50]░][[;#AAA;#A50]▒][[;#AAA;#000]▀▀][[b;#555;#000]▄ ][[;#555;#A50]▒] [[b;#555;]▀ ▀▄▀ ▀▄▀ ▌]
[[b;#555;]▄▄▄▄▄▄▄▄▄▄ ][[;#A50;]▐ ][[b;#555;]▄░] [[b;#555;]▓][[;#555;#A50]▒][[;#A50;]▌][[b;#FF5;#A50]░][[;#AAA;#A50]▒] [[;#AAA;#A50]░][[;#A50;#000]▓░ ▄░▌█▀ ][[b;#555;#000]▐][[;#555;#A50]▓][[;#A50;]▌ ][[b;#555;#A50]░] [[b;#555;]▄▄▄▄▄▄ ▄▄▄▌]
[[;#A50;]▌][[b;#555;]▐░] [[b;#555;]░] [[b;#555;]▒][[;#555;#A50]▓][[;#555;#000]▀ ][[;#A50;]▀][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]░][[b;#555;#000]░] [[b;#555;#000]░][[;#A50;]░ ][[;#AAA;#A50]░][[;#A50;#000]▓▓▀ ▐][[b;#555;#A50]░][[;#AAA;#A50]░▒][[;#A50;#000] ][[b;#555;#000]▄][[;#A50;]▌][[b;#555;]░▓][[;#555;#A50]░][[;#A50;]▌ ][[;#AAA;#A50]░][[;#AAA;#000] ][[b;#555;#000]░] [[b;#555;#000]▌]
[[b;#555;#000]▓▀▀▀▀▀▓▓ ][[;#A50;]▌][[b;#555;]▓] [[b;#555;]░▓ ][[;#A50;]▐▀▀▌] [[b;#555;]░░░░░][[;#A50;]░▒ ▐▓▀ ▐][[b;#555;#A50]░][[;#A50;]█▀▀ ][[b;#555;#A50]▓][[;#A50;]▌ ░▓▌░][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▄][[;#AAA;#A50]░][[;#A50;#000]▐ ][[b;#555;#000]▀▒▓▌]
[[b;#555;#000]▒ ░▀▒▄▐ ][[;#A50;]▄][[b;#555;]▀] [[b;#555;]░] [[b;#555;]░░ ][[;#A50;]▓▌ ▀][[;#AAA;]▄ ][[b;#555;]░][[;#A50;]░░░▌ ][[b;#555;#A50]░] [[;#A50;]░▓▀ ][[b;#555;#A50]▓░][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▒][[;#AAA;#A50]░][[;#A50;#000]▌░][[;#AAA;#A50]▒][[;#AAA;#000] ][[;#A50;#000]▄][[;#AAA;#A50]▓░][[;#A50;#000]▀ ▌ ][[b;#555;#000]░▒▌]
[[b;#555;#000]░ ▒▐ ][[;#A50;]▐][[b;#555;]▌ ░░] [[b;#555;]░] [[;#A50;]█][[;#AAA;#A50]░][[;#A50;#000] ▀][[;#AAA;#A50]░][[;#AAA;#000]▄ ][[;#A50;#000]░░] [[;#A50;#000]▀ ][[b;#555;#000]░][[;#555;#A50]░][[;#A50;]█][[;#AAA;#A50]▒][[;#AAA;#000] ][[;#A50;#000]▒][[;#AAA;#A50]░][[;#A50;#000]▌░▀▐][[;#AAA;#A50]▓][[;#A50;#000]▀ ▐ ][[b;#555;#000]░▌]
[[b;#555;#000]░ ░▐ ][[;#555;#A50]▐] [[b;#555;]░░] [[b;#555;]░] [[;#A50;]▐][[;#AAA;#A50]░░] [[;#A50;#000]▀][[;#AAA;#A50]▒][[;#AAA;#000]▄] [[b;#555;#000]░][[;#A50;]▓][[;#AAA;#A50]░▓][[;#AAA;#000] ][[;#A50;#000]▓][[;#AAA;#A50]░][[;#A50;#000]█ ][[;#AAA;#A50]▒][[;#A50;#000] ][[b;#555;#000]░ ][[;#A50;]▌ ][[b;#555;]░▌]
[[b;#555;]░ ░▐ ][[;#A50;]▌ ][[b;#555;]░▒] [[;#A50;]█][[;#AAA;#A50]░▓][[;#AAA;#000] ][[b;#555;#000]░] [[b;#555;#000]░][[;#A50;]█][[;#AAA;#A50]░▓][[;#AAA;#000]▄▄] [[b;#555;#000]░ ░][[;#A50;]░█][[;#AAA;#A50]░▓][[;#AAA;#000] ][[;#A50;#000]▀ ][[;#AAA;#A50]░][[;#A50;#000] ░][[b;#555;#000]░ ][[;#A50;]▌ ][[b;#555;]░▌]
[[b;#555;]░] [[b;#555;]▐ ][[;#A50;]▐ ][[b;#555;]░ ▒] [[b;#555;]░] [[;#A50;]▐▒][[;#AAA;]▀ ][[b;#555;]░] [[;#A50;]▀█][[;#AAA;#A50]▒▓][[b;#FF5;#AAA]░]▄ [[;#A50;]░▓][[;#AAA;#A50]░][[b;#FF5;#AAA]░]▌ [[;#AAA;#A50]░][[;#A50;#000] ░▄ ░][[;#AAA;#000]▄ ][[b;#555;#000]▌]
[[b;#555;#000]░] [[b;#555;#000]▐ ▐ ▌ ░▒] [[b;#555;#000]▓] [[;#555;#A50]░▓] [[b;#555;]░░ ░ ][[;#A50;]▀█][[;#AAA;#A50]░▒][[;#AAA;#000]█▄ ][[;#A50;#000]░ ▀][[;#AAA;#000]▀▌ ▐ ][[;#A50;#000]░][[b;#555;#000]░ ][[;#A50;]▒▓█▄][[;#AAA;]▀][[;#A50;]▄▄]
[[b;#555;]░] [[b;#555;]▐ ▌][[;#A50;]▌][[b;#555;]░▓] [[;#555;#A50]▓] [[b;#555;#A50]░][[;#A50;]▌ ][[b;#555;]░░░ ][[;#A50;]▐] [[;#A50;]█][[;#AAA;#A50]░][[b;#FF5;#AAA]░]▓ [[;#A50;]░][[b;#555;]░] [[;#A50;]▌ ▒▓█][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▀▀▌ ][[b;#555;#000]▌]
[[b;#555;#000]▐ ][[;#555;#A50]▌] [[b;#555;]▓] [[;#555;#A50]░] [[;#A50;]▐▌ ][[b;#555;]░░░ ][[;#A50;]▌ ][[b;#555;]░ ▀▄ ][[;#A50;]▀][[;#AAA;#A50]░▒][[;#AAA;#000]▓ ][[;#A50;#000]▓][[b;#555;#000]░░ ░ ][[;#A50;]▐ ░][[b;#555;]░][[;#A50;]▄█][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#A50;#000]▀ ▐ ][[b;#555;#000]▌]
[[;#A50;]▌][[b;#555;]▐ ][[;#A50;]▄▀] [[;#A50;]▐ ][[b;#555;]░░ ][[;#A50;]░▓ ][[b;#555;]▐ ▀▄][[;#A50;]▐][[;#AAA;#A50]▀▓][[;#AAA;#000]▌][[;#A50;#000]▐][[b;#555;#A50]░][[;#555;#000]░] [[;#A50;]▌░▒▓][[b;#555;#A50]░][[;#AAA;#A50]░][[;#AAA;#000]▀ ][[;#A50;#000]░ ▐ ][[b;#555;#000]░▌]
[[b;#555;#000] ░ ][[;#555;#A50]░][[;#555;#000]▌ ][[;#555;#A50]░] [[b;#555;]░ ][[;#A50;]▐] [[;#A50;]░▓▌ ][[b;#555;]░] [[b;#555;]▌][[;#A50;]▓][[;#AAA;#A50]░▓][[;#A50;#000]▐▓][[b;#555;#A50]▓][[;#555;#000]░ ][[;#A50;]▐ ▒▓][[b;#555;#A50]░]▀ [[;#A50;]░░ ▌ ][[b;#555;]░▌]
[[b;#555;] ░ ][[;#A50;]░▌ ▓] [[b;#555;]░░░] [[;#A50;]▄▄ ▓▓] [[b;#555;]▀▀▄ ][[;#A50;]▐][[;#AAA;#A50]░▓][[;#A50;#000] █][[b;#555;#A50]░][[;#555;#000]░░ ][[;#A50;]▐▐▓][[;#AAA;#A50]░][[;#AAA;#000]▀ ][[;#A50;#000]░][[b;#555;#000]░ ][[;#A50;]▓█▄▀][[;#AAA;]▄]
[[;#AAA;] ][[b;#555;]░░ ][[;#A50;]▓ ▄▀] [[;#AAA;#A50]▓░][[;#A50;#000]▄▀][[;#AAA;#000]▐][[;#A50;#000]▌▀ ][[b;#555;#000]▌] [[b;#555;#000]░ ][[;#AAA;#A50]░▒][[;#AAA;#000]▌][[;#A50;#000]▐][[b;#555;#A50]░▓][[;#555;#000]░░ ][[;#A50;]▌▓][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[;#A50;#000]░ ▓▓][[b;#555;#A50]░░][[;#FF5;#A50]░][[;#AAA;#A50]░░][[;#A50;#000]▄█▄]
[[;#A50;#000] ][[b;#555;#000]░▒ ][[;#A50;]▐ ▄▀] [[;#AAA;]▄ ][[b;#555;]▄ ▀▀]▐[[;#AAA;#A50]▒░][[;#A50;#000]▌▀▄▌ ][[b;#555;#000]░] [[b;#555;#000]▌ ][[;#A50;]█][[;#AAA;#A50]░][[;#AAA;#000]▌ ][[;#A50;#000]▀▓░][[b;#555;#000]░ ][[;#A50;]▐▓][[;#AAA;#A50]░][[;#AAA;#000]▌][[;#A50;#000]░░▓][[b;#555;#A50]░][[;#A50;]█][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#AAA;#000]▀▀][[;#A50;#000]▀ ▌]
[[;#A50;#000] ][[b;#555;#000]░░▓ ][[;#A50;]▓░▌] [[b;#555;]░ ][[;#A50;]▐][[;#AAA;]▌][[b;#555;]▀ ▀ ][[;#AAA;#A50]░][[;#A50;#000]█▒][[;#AAA;#A50]░][[;#A50;#000]▀][[;#AAA;#A50]░] [[b;#555;#000]▄▄ ][[;#A50;]░▓][[;#AAA;#A50]░][[;#A50;#000] ▀░][[b;#555;#000]░][[;#A50;]▐][[;#AAA;#A50]░▓][[;#A50;#000] ▒█][[;#AAA;#A50]░▒][[;#AAA;#000]▀▀ ][[b;#555;#000]░][[;#A50;]░ ▐ ][[b;#555;]▌]
[[b;#555;] ░░▒ ][[;#A50;]░][[;#AAA;#A50]░][[;#A50;#000]▌] [[b;#555;#000]░][[;#A50;]░] [[;#A50;]▀][[;#AAA;#A50]░][[;#A50;#000]▄][[b;#555;#000]▀ ][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▐][[;#AAA;#A50]▒][[;#A50;#000]▌▄▌▐] [[b;#555;#000]▀▀▄ ][[;#A50;]▐][[;#AAA;#A50]░▒] [[;#A50;#000]▐][[b;#FF5;#A50]░]▌[[;#A50;]█][[;#AAA;#A50]░▄][[;#AAA;#000]▀ ][[;#A50;#000]░░][[b;#555;#A50]░░][[;#A50;]▓ ▌ ][[b;#555;]▌]
[[b;#555;] ]▄▐[[;#AAA;#A50]░][[;#A50;#000]▒ ▄▄ ▀] [[;#A50;#000]▐▌][[b;#555;#000]▀ ][[;#A50;]▄▌▒ ][[b;#FFF;]▄][[;#A50;]▐][[b;#FF5;#A50]░] [[;#A50;]▒▄] [[;#A50;]▐][[;#AAA;#A50]░▒][[;#AAA;#000]▓] [[;#A50;#000]█][[;#AAA;#A50]░▒][[;#AAA;#000]▀ ][[;#A50;#000]▄][[;#AAA;#A50]░░][[;#A50;#000]▓][[b;#FF5;#A50]░][[;#AAA;#A50]▄░░][[;#A50;#000]▌▀][[;#AAA;#000]▄][[;#A50;#000]▄]
[[;#A50;#000] ][[;#AAA;#000]▀][[;#AAA;#A50]▓][[;#AAA;#000]▄ ][[;#AAA;#A50]░][[;#A50;#000]▀▀] [[;#A50;#000]▄░ ▀░▒▓▀▐▌▄▄▀▄▌ ▀▀▄ ░][[;#AAA;#A50]░▒▓] [[;#A50;#000]▄▄▐][[;#AAA;#A50]░▒▓▓][[;#AAA;#000]▀▀▄][[;#A50;#000]▄▀▀▀][[;#AAA;#000]▀▀][[;#A50;#000]▀▀▀][[;#AAA;#A50]░][[;#A50;#000]▀▀]
[[;#A50;#000] ][[b;#555;#000]░ ][[;#A50;]▄][[;#AAA;]▀▀ ░] [[;#A50;]▄▄▀▀] [[;#A50;]▐▓▄░▀▄▄▄][[;#AAA;#A50]░][[;#A50;#000]▌ ▀][[;#AAA;#A50]░][[;#A50;#000]▌ ][[b;#555;#000]▄▌][[;#A50;]▄][[;#AAA;#A50]░][[;#A50;#000]▀][[;#AAA;#000]▀][[b;#555;#000]░ ][[;#A50;]▄▄▓▀█ ▐][[;#AAA;#A50]░][[;#AAA;#000]▀ ▀][[;#AAA;#A50]░][[;#A50;#000]█▓▒▄▀▀▀]
[[;#A50;#000] ▐][[b;#FF5;#A50]░][[;#AAA;#A50]░][[;#AAA;#000]▄][[;#A50;#000]▄▄▄ ▄▄▄▓░ ░░ ░▌ ▌ ▀▀▒▄▓▄ ▀ ][[b;#555;#000]░▒] [[;#A50;]▄ ░▓█▀▄▓▀▌▀ ▄▓█▄ ▀][[;#AAA;#A50]░]
[[;#A50;] ][[;#AAA;]▄][[;#AAA;#A50]▒][[;#A50;#000]▌][[;#AAA;#000]▀][[;#AAA;#A50]▒][[;#AAA;#000]▄][[;#A50;#000]▄ ▀▀▀][[;#AAA;#A50]░][[;#A50;#000]▓▓▒░ ▄▒░░ ░ ▐ ▐ ░▒▌▐░ ▀][[;#AAA;#A50]░][[;#A50;#000]▄][[;#AAA;#000]▄] [[;#A50;#000]▄][[;#AAA;#A50]░][[;#A50;#000]▌▄▀▄▌▐][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▐][[;#AAA;#A50]░][[;#A50;#000]▌ ░▄▓][[;#AAA;#A50]░][[;#AAA;#000]▌]
[[;#AAA;#000] ][[;#AAA;#A50]▓][[;#AAA;#000]▀][[;#A50;#000]▀▄ ][[;#AAA;#000]▀▌▀][[;#A50;#000]▀▓▄▄ ▄▄▓▒▀ ▄][[;#AAA;#A50]░][[;#A50;#000]▀ ░▌▐ █▒ ▀▄▄ ▀][[;#AAA;#A50]▒░][[;#A50;#000]▀ ▄▓▀ ▐][[;#AAA;#A50]░][[;#A50;#000]░▐][[;#AAA;#A50]░][[;#AAA;#000] ][[;#A50;#000]▀▌░▀ ▄▒▓][[;#AAA;#A50]░▒][[;#AAA;#000]▄▌ ][[b;#555;#000]░░░ ░]
[[b;#555;#000] ][[;#A50;]░▓▄▄▄ ][[;#AAA;]▀▄▄▄ ][[;#A50;]▀▀▀▀ ▄▄][[;#AAA;#A50]░][[;#A50;#000]▀ ][[b;#555;#000]░ ][[;#A50;]░ ▐▄▒▄ ▀▀ ▄▄][[b;#FF5;#A50]░][[;#A50;]▐][[;#AAA;#A50]░][[;#A50;#000]▄▓▒ ▌ ▄▄▄ ▄▓▀▐▓ ▀][[;#AAA;#A50]░▒][[;#AAA;#000] ][[b;#555;#000]░]
[[b;#555;#000] ][[;#A50;]░ ▀ ▀▀ ][[;#AAA;]▀▀▀▀][[;#A50;]▀][[;#AAA;]▀][[;#A50;]▀▀▀▀] [[b;#555;]░░] [[;#A50;]░ ▀▐▓▒░ ▀▓][[;#AAA;#A50]░][[;#A50;#000]▌][[;#AAA;#A50]░][[;#A50;#000]▀▀▀ ▄▀][[;#AAA;#A50]░][[;#AAA;#000] ][[;#AAA;#A50]░][[;#A50;#000]▀▄ ▐▀ ▀ ▀]
[[;#A50;#000]▀▀▀] [[;#A50;#000]▐▌▐▌▐▌▀▓▒▄▀ ░ ▄▓]
[[;#A50;#000]▀ ▀ ▀ ▀] [[;#A50;#000]▄▀ ][[b;#555;#000]bs]
[[;#000;]░░▒▓]
"
`;
exports[`Terminal utils $.terminal.less should split image 1`] = `
"xxx
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
[[@;;;;data:image/jpg;<BLOB>]]
xxx
~
~"
`;
exports[`Terminal utils $.terminal.parse_arguments should create array of arguments and convert types 1`] = `
Array [
"foo bar",
"baz",
/\\^asd \\[x\\]/,
"str str",
10,
10000000000,
"",
"foobar",
"foo",
]
`;
exports[`Terminal utils $.terminal.parse_command should handle JSON inside string 1`] = `
Object {
"args": Array [
"{\\"wrap\\": true}",
],
"args_quotes": Array [
"\\"",
],
"command": "test \\"{\\\\\\"wrap\\\\\\": true}\\"",
"name": "test",
"rest": "\\"{\\\\\\"wrap\\\\\\": true}\\"",
}
`;
exports[`Terminal utils $.terminal.parse_command should handle JSON inside string 2`] = `
Object {
"args": Array [
"{\\"wrap\\": true}",
],
"args_quotes": Array [
"'",
],
"command": "test '{\\"wrap\\": true}'",
"name": "test",
"rest": "'{\\"wrap\\": true}'",
}
`;
exports[`Terminal utils $.terminal.parse_command should handle JSON inside string 3`] = `
Object {
"args": Array [
"xxx\\"xxx\\"xxx",
"y",
],
"args_quotes": Array [
"\\"",
"",
],
"command": "test \\"xxx\\\\\\"xxx\\\\\\"xxx\\" y",
"name": "test",
"rest": "\\"xxx\\\\\\"xxx\\\\\\"xxx\\" y",
}
`;
exports[`Terminal utils $.terminal.parse_command should handle JSON string 1`] = `
Object {
"args": Array [
"[error]}",
],
"args_quotes": Array [
"",
],
"command": "{\\"demo\\": [\\"error\\"]}",
"name": "{\\"demo\\":",
"rest": "[\\"error\\"]}",
}
`;
exports[`Terminal utils $.terminal.parse_command should split and parse command 1`] = `
Object {
"args": Array [
"foo bar",
"baz",
/\\^asd \\[x\\]/,
"str str",
10,
10000000000,
"",
"foobar",
"foo",
],
"args_quotes": Array [
"\\"",
"",
"",
"",
"",
"",
"\\"",
"",
"'",
],
"command": "test \\"foo bar\\" baz /^asd [x]/ str\\\\ str 10 1e10 \\"\\" foo\\"bar\\" 'foo'",
"name": "test",
"rest": "\\"foo bar\\" baz /^asd [x]/ str\\\\ str 10 1e10 \\"\\" foo\\"bar\\" 'foo'",
}
`;
exports[`Terminal utils $.terminal.split_arguments should create array of arguments 1`] = `
Array [
"foo bar",
"baz",
"/^asd [x]/",
"str str",
"10",
"1e10",
"",
"foo\\"bar\\"",
"foo",
]
`;
exports[`Terminal utils $.terminal.split_command Should split command 1`] = `
Object {
"args": Array [
"foo bar",
"baz",
"/^asd [x]/",
"str str",
"10",
"1e10",
"",
"foo\\"bar\\"",
"foo",
],
"args_quotes": Array [
"\\"",
"",
"",
"",
"",
"",
"\\"",
"",
"'",
],
"command": "test \\"foo bar\\" baz /^asd [x]/ str\\\\ str 10 1e10 \\"\\" foo\\"bar\\" 'foo'",
"name": "test",
"rest": "\\"foo bar\\" baz /^asd [x]/ str\\\\ str 10 1e10 \\"\\" foo\\"bar\\" 'foo'",
}
`;
exports[`Terminal utils $.terminal.split_equal split emoji encoded from apply_formatters 1`] = `
Array [
"ZZZZZZz",
"[[;;;emoji relaxed;☺]☺]oo&nbsp;bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[[;;;emoji relaxed;☺]☺]a[[;;;emoji eight;8]8]",
"foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baz",
"foobar&nbsp;&nbsp;ba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br",
]
`;

@ -0,0 +1,136 @@

ААААААААААААААААААААААААААААААААААммм ммм ББББААААААААААААААААААААААААААААААААА
АААААААААААААААААААААААААААААААААААА Бмпо ББББААААААААААААААААААААААААААААААААА
БББББББББББББББББББББББББББББББББББББммББ АААААББББББББББББББББББББББББББББББББ
БББББББББоБББББББББББББББББББББББББББББББ АААААББББББББББББББББББББББББББББББББ
ВВВВВВВВп ВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВБ А АВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВ
ВВВВВВВнол ВВВВВВВВВВВВВВВВВВВВВВВВВВВВВБАВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВп
ВВВВВВВ лоноВВВВВВВВВВВВВВВВВВВВВВВВВВВВАВВВВВВВВВВВВВВВВВВВВВВВВВВВВВнон
ВВВВВВноннл ВВВВВВВВВВВВВВВВВВВВВВВВВпп АппВВВВВВВВВВВВВВВВВВВВВВВВВВ л
ВВВВВВ ллБоноВВВВВВВВВВВБББББББББпп ммп Апмм ппББББББВВВВВВВВВВВВВВВнонн
ВВВВВнолпп л ВВВВВББББББББББББп ммпп Аппмм пББББББББББВВВВВВВВ лоА
БББББ ппппп оББББББББББББпп ммппммпмм ппБББББББББББББноВмм
БББББопппппппнББББББББ ммм ппппмм ппмм ппБББББББББ ппп
АААААнВпппппомААААА оВАБнпммппмм ААААААмпппп
ААААААоВВп пВоАА мпп ппнппммпмм ААнВппп
ААААААоБА оо мпп оВн АмБ пп пммппмм ппм АоВВп
ББББББоАппоВн ААмп оомн ппмпмм ппмоБА
ББББББомБ оон АмА мА ммм оп пмппм оБВВ
БББп момБААААА оА А мА м м п он ппм м Вппм нАБВ
п ммВпмпАААААААА БАА моп А он л мп ВмА оАБВ
лпп мммВоп ммм н он оноВ оААБ
оАВпнпВВлААпппппплллБВВлппАппппАоАВАн пппппн пп онВ АА
м пАпоАпп н л мп ВБ А
ммВАААААААААААА ВАА ппБ пмм он ммп п онА А
ББААА АААААААА ААА ВАА п мм пппп опм мпА А
ААААА АААААА мВм А ВА Бмм пно опн п мпмВммВм
ААА А ААААА лпмпБ А оА мплА мп мБплпмпБ лпмпБ
А Б ААААА оВп пВн А оА пВн Ап пппоВп пВн оВп пВнА
А Б ААААА онА он А оБн он АААААон он он онА
Б ААААА онА Бн А оАнА Ан ААААААААА ммонА н онА он
Б ААААА онА Ан А олнАААААп пмонА н онА Ан
Б ААААА онА н А оАнА АммВмА ААонАонА н
А ААААА онАА оАнА ооА мпмм БмАА онАоон
А ААААААонБА Ан ноБ мп Ан Вн мммАн ммн онБоо
А А АААААооВпАА Ал АА о оономоБ А Впп мнА оВАп он
А А АААААА Ал АА ВБмпмпмн пнонмпА онп мА оА
АААА А АААААААААААААААА оА АА мппАмлоппммБммнпонмпАп А
БААА А АААААААААААААААА он А мпАплм ппппмАлмолппАмп ААААА
пВА АААААААААААААААААон о БнлпАВВппАмммм пппп ААААААААААААААн
лм В А АААААААААААААААААон нолопппплАБнн ААААААААААААААААААААА н
мплАААААААААААААААААоБномАмпоА АмБВААлмм м мл ААААААААААААААААААААА н
лон АААААААААААААААААоАнАпп А ппВААллАБмн А н АААААААААААААААААААААА н
онл АААААААА ААААААоАннАВмп млллАплВ о АААААААА АААААА ААА н
онВ А АААААА мВм АА Ано мА БВлАмммАнппА нмВм АА мБм А н
онВ А АААААА лпмпВ А А Анп оп оВллАБпоБопАн о ммАлАпллмм пВ А лпмпБ А н
онВ А ААААА оВп пБн БВ олАВВлАмнппмАп о нпнп поВБпмАА он оВп пВн н
нБ А ААААА онБ оноАпм ол А АБВАмммоАп Б нАВлАмп олмппн н он он н
нБ Б ААААА онА мпАВн БАпВАммп Ан м плАВАпмБАмо н онА он н
нБ Б ААААА он мп АВп АА Аппо оАВмАллБм пАпн н он н н
но В ААААА о пммпп Ап ААА АА А А пнБАлВВлнм оА он оБА н н
о В АААБА мпп мн мнм м АВААА А АААА л млВВА п Ап Вн оАА н н
о о п пммВАнпА ом Вн пн пВБАА АБА ммБпп пп ммн Ан оо А н н
о Внммм лВААААллммм АВ АА ммпп ппАмм А пА Амнп мАнмм оо Ан
оВпп мВААААлААААВВВнАА ВнАм п пппп м млАм Б пп мппмАлпВммн
Б оААлАлААААВмпмм ол АпАВмпмпВБАп м мпАА оВмВммВБВпВААВАно н
м Б оАААААААБББВнпААпоАом ААВоАоВВноВАмБмп пмВАпо мАВААВло н
ААБ Б АААААББААБББВпВАВоАнлВА пАоВопАА ппБВАлм пп мм пАААнАБ н
Б А оАБАБАААББВВлпААп оАнВА м мнА Ап мАмпАппБААллАБонмпм мпмВ н
А А оАБААААБВВБпмАп ААмммммм пмммАБммм пБнпммА пАВпАА п В н
А А ВАААААБВпмВБп ммВБААмммпн ААмоБнпБмммАмммпммм пппВА пВ пппппппп н
оБА ААБВмВп мАБВБАААВмммп нАБп АВВппммАБпАпВБАлпмм пмммпп мАБВм пБ н
м А ВА АБпВп мнпБВВлллААмммпп ВБА оАпммпмАмАБппАппмлВАпм БмпВ А пВВ о н
пВ оА А мВп оно ААБВлппп Ап АмпАн ппп ммппВБААонммпАмА плнАмоВн н
ол Б лп мопАмпм мА Ам пА пмАпБА ммммм п пАмпмВмн мБн А мВВ н
м Вн оАпмп мВнн пВА Аон АВ пп мпАВАмппп мммАппВАммААмп мААпнпАБВп Б н
онон нмп мВАоА ААоп АнлАомп мВБАнпББВмА мммпппАлАВАААл пппАмпм БАА н
ВоноопмБАлп пАмБААм Ал А пмплп онАоАА ммппппАВБААВАнВмБммАмпм АА н
Во нноБАВАм пА Апп Ал мнм п АБ пмАппА пппВБААААп АнАпВмпнон А н
о ВоБммп ААА м БАонноАВпммппммнпАоп Бннонон А н
В ооАм п АА А он п оннАп мВАА пВпнА ммпААп оАоно он н
Б ВАппАВмА пммВм оБномААВБАА А пАА АА ААноБннАн н
А нБн пБААон ппАмоБнлААлАВп мммм ммВВАп оБ А о оВ ААпАо н
АоА АААА лБ АА поАнмАппмммлллАААААБп мВнАБ о А БА В он
оБ АААоВА АААА м оАн ппп АА мВВппп ммппВ нВ он он АА Ан нн
оА АВА ААВВн оАн А ААмВВлпп ммАп оВА нБн В В н АнмВп А н
А онА оплм БВм пп Ал ммппп мБАлп ААло нААноА пммппАА н
А оАААА м пммВВАБВ АлАонмммммлпАБАп АБА Ан оААо ВнВ мо А АААБ н
А АА ААБВВп А ммппАА олА ппп АБммАп мВБ Ал АААннААнА АВ ппББВ н
м ппм А лАВА м ол АААБВААп мВАп мААн ААААно ВА А н мАБВм пВ н
ппп мА млАВА оБА Алпп мАААп мААл АААВАо ААБ Б А пВВ о н
АА нмАн млВп мАВп оА Аммп пппп млппл АВпппАнн ААВоАоВн н
АА оАВА лВАп мАп м оА п А мАнмАм пн Аппмоо мВБ Б н
А пА АВА млп ммВА оА АВ АБ мАп АА оВн АА оББАм о А омАВ АБп мВ н
А БА Ап БпмАп лА ВлммААп БА Ан ААм БВААн пм Ам ппн мВББ н
мАА АА мп ААмАп лБ АоВААлА ББ Ал ВАл БВАБл Ам ВА ААААБ н
пВмА опмп мАВп ААА оАн АВАлА оВ оБ ВААВ АВВАВА ААн ААнААА н
А Внмпп мпВ АААББ оАн БАн оВ оАн оАВВн АВААБАнААБ ААБнА н
м оВонмАп мп ААБББВноАн оАн мВ Бн ВАВВА АВлАААн ВБн ААВ м н
он лп мпА ААБББВВВВоАн АпАмВ Ал ААВл АВлААВл ААн Ап мп пм н
В В АА оА ААБВВВВААВоАноВАВВ АоВ ААБлВ ААллААБА ААБ нн онмпмон н
Б о ААА н АмАпВВААлААлоАнБВВВн оАн ААБнВ АВлААБАн ВАнАп Бон онл н
А о АААА оАмАлп АлАлАААлоБнАББн А Бл АААВ В ААВлААБАн ААБ БВ нВ н
А В АААА пАл АмАААВААлллоАнАБн А оА ААААВ Б ААВлААБВл АВАн ВнА нВ н
А Б ААААА ВА ллВВВлАлллАоАнАн оАн ААААБноБ АБВлААБВл ААБ ВнА нБ н
Б ААААА В АнВВВллллААБоАнп оАн ААААБВноБ АВллААВАн АВАн ВнА нБ н
А А ААА оАВ АБВллллАВБ оАн мА ААААААВнон АВлАААВАл ААБ онА нБ н
А АноААВВВлллАВВААоАн ноА АА ААВ Ано АВлАААВВл ААВн нА нА н
АВ лАллАААААВВоАн А лп АААБ А н АВААБВВАВн мппп нА нА н
А АоАмпп пААБВБАп оАн лп ААААн л н АВААААААлп м А онА А н
мБ А ААо н А олппВп ол АнАААА олмн БВАлппп АВн Внн
мммВ БББААА н мп АВАлААолоВ АААААА АлВ АВпп ААн ААВ ААВммн
мммммммммммм нАА АВВААААлоАА АлА лп н АВАВ ВАп ммммммммммн
м м м опА АААлА олВА ААн АВАВ лпо м м мн
п пмп пмп п нА А ААнАнА АлБА п ВАБппм Б п пмп пмп н
мммммммммм о мАВБнАБАВА мАнлп оВн А мммммм мммн
ноААБВп пА АААА АВВп оААБ мнАВАн А Ан
ВпппппВВ нВАВ оппнААААААБ оВп оАлпп Вн АВнАА мАо пБВн
Б АпБмо мпААА Вн пм ААААн А АВп ВАА БАнАБ мВАп н АБн
А Бо он АААлА пАм ААп ААлБ БАнАпоВп о Ан
А Ао о АААоААпБмАВАВ ВАл Б А н Ан
А Ао н АБлАВ ААлАВммА ААлАВ п А АА н Ан
Ао о А БАоБп АплБВАмАВААн А Ам Ам н
Ао о н АБВАВ АА А плАБлм А ппн о АА БВлмпмм
Ао ннАВВАн ААА олААВ ААн БВлААппн н
о н ВАон ААА н А пм пАБВ ВАА А о ААмлААп о н
но мпо АА АВ о пмопВноААнАБВААп А о Ан
А Ан АА оАВн АнВАВоВВА о БВАп АА н Ан
А Ан ВАААмм ВВппм оАВ лААА ооВАп АА Влмпм
АА В мпВАмпонп нА АБноАВАА нВАн А ВВАААААмлм
АБ о мпм м ппоБАнпмн Ан лАн пВАА оВАнААВАлААппп н
ААВ ВАнА онп п АлБАпАмм АВА пААоАВ БлАБпп АА о н
ААБ ААнААпАмп оАоБнмноппм оАБоАнлАмп ААААВ н н
моАБ мм понп мнБ моА БмоАБВлАБп мААВАмААнпмм
пВм АппмА пАБВпонммпмн ппм ААБВммоАБВВппммппппппппАпп
А мпп АммппоВмАпмммАн пАн мнмАппА ммВпл оАп пАлВБмппп
оААмммм мммВА АА Ан н ппБмВм п АБм АВлпмВпнп мВлм пА
 мБнпБмм пппАВВБА мБАА А о о АБноА пАмммАнмпмноА оАн АмВАн
Вппм пнппВмм ммВБп мАп Ано лБ пмм пБАп мВп оААоА пнАп мБВАБмн ААА А
АВммм пммм пппп ммАп А А омБм пп ммАоАмВБ н ммм мВпоВ пАБ А
А п пп ппппппппппААА поВБА пВАнАппп мпА Апм оп п п
пппонононпВБмп А мВ
п п п пмп bs
ААБВ
SAUCE00Regina Pacis burps fuel 20180923fXP<EFBFBD>IBM VGA

@ -0,0 +1,33 @@
Y Axis Foo: #











#
#
#
#
#
#
#
 A
10|
|
8|
|
6|
|
4|
|
2|
|
|+---+---+---+---+---+----+----+----+-> X Axis
0 2 4 6 8 10 12 14

@ -0,0 +1,45 @@
Y Axis A: * | B: #  | C:  











*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
# # 
# # 
 
 A
10|
|
8|
|
6|
|
4|
|
2|
|
|+---+---+---+---+---+----+----+----+-> X Axis
0 2 4 6 8 10 12 14

@ -0,0 +1,73 @@

ммммммм мммммм
ммммАБВлппмммАБВлВВВВББмм
ммАБВВллппммАБВллллллллВВВВВБАм
мАБВллБппмАБВлллллллллллллллллВВВБм
АмАБВллпммммппммАБВллллллллллллллллВВВБм
мААБВллВмпБВм А ппАБлллллллллллллллллВВВБм
АмАБВллллББноБВп А ппАБВВллллллллллллллВВВВ
АААБВлллллБВ АБВн ААА пппБВВллллллллллллллВВАА
ААБВпВВлллВБА Бл мпппБммББ пппБВВллллллллллллВВББ
АААпмАВллллВБпмоБ БААБВВмВВАпппм пппБВлВлллллллллВВВВ
онпмАВллллллВАБАноАВВВллллллллВАппм ппАБВлВлллллВВВВВБА
АА ААВлллллллллББ АВллллллллллллВВААппм ппАБВВВВВВлВВАВББ
оАоАВлллллллллВБ БВлллллллллллллВВБпплАВммпппАБВББВВлВ ВВБ
ААБ ВлллллллВВБп БАВлллллллллллВВАп мАммпппВА ппппААВВлА ВА
оАВ БллллллВБп мБАВллллллллллВпмпмпВББВлмм мпмппБВБноВ
ААБн АнллллВБ пмАБВлллллллВпВВпмпАБмВпп пплВ  ВАБВл Бм
АБВ онолллВБ АпмАБВллВВБммлБАА БААВпАВноВАВлАнАБА
АБл А лллВБА АБВАБВВммАппппппВБноААнАВ ВБАВлБноВА
ВнАБоллБп БАВАппммм А А пАноБАнАБноВБ А ВБББномпБ
ВВБВлВБпм АВБм ВВАВВппппм АпА БВБмА мўАмпААмпБ ВлБВ АА В
оВВ ББАоВн ВВмА пммБВппппм АА ппплмммВВммлВВАВнпнА БББВ АБноА
л Ап ВББ АоВАВм АпппппммБВАно н пмппмпппмБАБББ А АББВноБВААА
он оВ БААБ БАБВм А пБВлБВАно ВппмАлВмпппмА БАБВнААлАА
лм БВ АБВВ пААААмА ммБВВллВБВном оАмАБАБ ВВББА А ВАБВ АлВАА
оВмплВ ВВВБ пАААмБВВлВллллВАлА лпппБВБВАнВ АА А  ББВноАлАА
ВВВмоВВ ВлВБ пАлАВВлВллллВАпАВ АБВВлллАБВ А АлБВ АлВА
оВп п АВ БллВБ пААлБВБВВлВВн мБмппплппппмАпБА А  ББВноАВн
ВБ ВБВ БллВБ пБААБАББВлБВВБАллм пмББппм оВБАБВ АВА
оВнА оААВ БллВБ БААААлАлАААлпп мн пммБп мБАнА АББВ ВВАп
плмБ лААБ БВлВБм пАААллллАпм плВп ппммАлБВАВ ББпмлВАп
плмоАлА БВллВБА пБААллАВБллпмммм БАБлБВАВп ББ ВлВАп
пмВААоБВлллВВБм БАААлБАлп млВВмпБВлВАВА ББноВВВА
АВлАБВлллллВБм пБААлллАВлВБВлмпБВВп млпмВБАпо
ВАлБВллллллВБАм ппммВмппппппп п м мппмВВБАмон
м ВББВлппппп ппппп ппВВВмммпп п оммлВВААм В
АмАБВВп мммллмммпмппБпп  мБллБАААп он
м пмпБп ААБВлллллВБААм А  АВБлВБАмп оВ
ммллВВВВБм АпмАББВлллллллВВББн  мммм АпВБАп мВ м
мААБАм пББАА мААВВллллллллллВАВ мўмпппВАлпмВААп ммВВп пААмм
мАБлВБА АА А ААБВллллллллллллБВААВВББВ Алп АпммВББп мАБ АББА
БАпАВлВБАмоАБВлллллллллллллВн пВВпмВВВпммлААБп мАББВл АВВА
Вм пБВлВБААм АоАВВллллллллллллВА АпппБВВпмААБВлпмнпАВБн
пВ АБллВВБАм оАВллллмлллллллВАн  ммВВ мплАлппмпп м пВА
п пАВлллВААВАоАВлллллллллллВАн онм пААББВ млВВп пмпппБВА мм пБ
пААВлллВАВ оАВллллллллллААп  В АБлмпВВпмлВБВпмпп оА ВлллАмпм пБ
ппАВллВАВ АВВлллллллллАп ммВБ БВллм мАБмп мАБВн оАмпллллАлммп
ппАВлВАн АВлллллллллБп ВААБн Вллп мАБп ммАББВВБм пАБВлллллллмм
пАВАноАВллллллллВА ВББББн Вп мБпп пААБВВллВБм пАБВлллллллАм
пмВ оАВлллллллВАноАБВВБноБ АБпмммммпБВлллллВБм пАБВллллллБАл
п оБВллллллВАА ВБВлВВнонолнопммплноВллллллВББм АБВлллллВБАп
АБВллллВААп ББлллВ АнолнмпппппмллллллллллВБн АБВлллллВААм
оАБВлллБпмммм пВВллВ БнолнАмммммплллллллллллВБм АБлллллАААн
оАБВллВноВВВВВм пВлВ ВноллноВВВлллмпп ппппммммм АБВВВААБВм
оАБВллВ ВВБББВВВ пВВ Вл нмм мммппппппААлмм
оАБВллВ ВБААААБВВ п п
оАБВлВБ БАААААААВВАА
АБВВБА ААВллБАААпп
оАВБА АБВллллВмп
оАБА АБВллВБмп
АА АБВлВмп
А БВВмп
пВмп   мп мммВлВппВм FUEL! мБм
 пппоАп оАпон Вн
Ан А п мВпм оВАоАн
мАпммон оА он оВ онмБп
 ммпоВ АоВА оноАмммноАмп
 оВА он АпммпАААмм пАн мАп
 Анммп пп пп пп
 пп
SAUCE00marble Necrofiliac fuel 20180923;+PHIBM VGA

File diff suppressed because it is too large Load Diff

@ -0,0 +1,30 @@
{
"name": "jquery.terminal",
"version": "2.22.0",
"main": [
"js/jquery.terminal.min.js",
"js/jquery.mousewheel-min.js",
"css/jquery.terminal.min.css"
],
"description": "jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications.",
"license": "MIT",
"ignore": [
"examples",
"README.in",
"bower.in",
"Makefile",
"manifest",
".gitignore",
".npmignore",
"package.in",
"package.json",
"bin",
"version"
],
"dependencies": {
"jquery": "~3"
},
"devDependencies": {
"keyboardevent-key-polyfill": "^1.0.2"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,985 @@
/*!
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/ version 2.22.0
* http://terminal.jcubic.pl
*
* This file is part of jQuery Terminal.
*
* Copyright (c) 2011-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
* Date: Sun, 14 Feb 2021 11:03:09 +0000
*/
.terminal .terminal-output .format, .cmd .format,
.cmd-prompt, .cmd-prompt div {
display: inline-block;
}
.terminal h1, .terminal h2, .terminal h3, .terminal h4, .terminal h5, .terminal h6, .terminal pre, .cmd {
margin: 0;
}
.cmd .cmd-clipboard {
all: unset;
position: absolute !important;
left: -16px !important;
top: 0 !important;
width: 16px !important;
height: 16px !important;
background: transparent !important;
border: none !important;
color: transparent !important;
outline: none !important;
padding: 0 !important;
resize: none !important;
z-index: 1000 !important;
overflow: hidden !important;
white-space: pre !important;
text-indent: -9999em !important; /* better cursor hiding for Safari and IE */
top: calc(var(--cursor-line, 0) * var(--size, 1) * 14px) !important;
}
.cmd span.cmd-end-line,
.cmd span.cmd-end-line span,
.cmd div.cmd-end-line span[data-text]:last-child,
.cmd div.cmd-end-line span[data-text]:last-child span,
.cmd textarea,
.cmd .cursor + span:empty {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */
}
.terminal img, .terminal audio, .terminal object, .terminal canvas {
cursor: default;
}
.terminal {
position: relative;
line-height: initial;
overflow-y: auto;
}
terminal.terminal-temp {
visibility: hidden;
}
.terminal {
contain: content;
}
body.terminal {
min-height: 100vh;
height: 100%;
}
html {
height: 100%;
}
body.terminal, body.full-screen-terminal {
margin: 0;
height: 100%;
}
body.full-screen-terminal .terminal {
height: 100%;
}
.terminal > div.terminal-fill {
min-height: 100%;
height: 100%;
}
.terminal > .terminal-resizer, .terminal > .terminal-font .terminal-resizer {
all: unset;
position: absolute !important;
top: 0 !important;
right: 0 !important;
bottom: 0 !important;
left: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
z-index: -1 !important;
height: 100% !important;
border: none !important;
padding: 0 !important;
width: 100% !important;
}
.cmd {
padding: 0;
position: relative;
width: 100%;
z-index: 300;
}
.terminal a[tabindex="1000"],
.terminal a[tabindex="1000"]:active,
.terminal a[tabindex="1000"]:focus {
outline: none;
}
.terminal .inverted, .cmd.cmd.cmd .inverted,
.terminal .terminal-inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: #aaa !important;
color: #000 !important;
}
.terminal .terminal-output > :not(.raw) a[href], .cmd a[href] {
color: #0F60FF;
color: var(--link-color, #0F60FF);
cursor: pointer;
}
.cmd a[href]:not(.terminal-inverted),
.terminal .terminal-output > :not(.raw) a[href]:not(.terminal-inverted) {
--color: var(--link-color, #0F60FF);
}
.terminal .terminal-output > :not(.raw) a[href].terminal-inverted {
background: var(--color, #ccc);
}
.terminal .terminal-output > :not(.raw) a[href]:hover, .cmd a[href]:hover {
background-color: #0F60FF;
background-color: var(--link-color, #0F60FF) !important;
color: #000;
color: var(--background, #000) !important;
text-decoration: none;
}
.terminal .terminal-output > :not(.raw) a[href] span,
.cmd a[href] span {
/*
* shorter and simple solution
* it's hard to overwrite long :not selector (:not(a span) don't work)
*/
color: #0F60FF !important;
--color: var(--link-color, #0F60FF);
color: var(--link-color, #0F60FF) !important;
text-decoration: underline;
}
.terminal .terminal-output > :not(.raw) a[href]:hover span,
.cmd a[href]:hover span {
background-color: #0F60FF !important;
background-color: var(--link-color, #0F60FF) !important;
color: #000 !important;
color: var(--background, #000) !important;
text-decoration: none;
}
.cmd .cmd-cursor {
display: inline-block;
}
.cmd .cmd-cursor-line > span,
.cmd .cmd-cursor-line img {
display: inline-block;
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor .emoji {
-webkit-animation: terminal-blink 1s infinite linear;
-moz-animation: terminal-blink 1s infinite linear;
-ms-animation: terminal-blink 1s infinite linear;
animation: terminal-blink 1s infinite linear;
}
.bar.terminal .inverted, .bar.cmd .cmd-inverted {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
.terminal, .terminal .terminal-output > div > div, .cmd .cmd-prompt {
display: block;
height: auto;
}
.terminal .terminal-output > div:not(.raw) div {
white-space: nowrap;
}
.cmd .cmd-prompt > span {
float: left;
}
.cmd .cmd-prompt ~ div span[style*="width"],
.terminal-output span[style*="width"] {
display: inline-block;
line-height: 1;
}
.terminal-ouput span[style*="width"] {
min-height: 14px;
min-height: calc(var(--size, 1) * 14px);
}
.cmd .cmd-prompt span[style*="width"] {
margin-top: 2px;
}
.terminal,
.terminal-output > :not(.raw),
.terminal-output > :not(.raw) span:not(.fas):not(.far):not(.fa),
.terminal-output > :not(.raw) a,
.cmd,
.cmd span:not(.fas):not(.far):not(.fa) {
/*font-family: FreeMono, monospace; this don't work on Android */
font-family: monospace;
}
.terminal,
.cmd {
font-size: 12px;
}
.terminal-output div div::before {
content: '\0200B';
width: 0;
float: left;
display: block;
}
.terminal, terminal-output > div:not(.raw) div > span:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji) {
color: #aaa;
background-color: #000;
}
.cmd span.cmd-prompt, .cmd .cmd-prompt span {
background-color: transparent !important;
}
.terminal-output .emoji, .cmd .emoji {
height: 12px;
background-size: contain;
background-repeat: no-repeat;
color: transparent;
position: relative;
}
.terminal .terminal-output .fa span,
.terminal .terminal-output .fas span,
.terminal .terminal-output .far span,
.cmd .fa span,
.cmd .fas span,
.cmd .far span {
background: transparent !important;
color: transparent !important;
clip: rect(1px,1px,1px,1px);
position: absolute;
}
.terminal-output .emoji,
.terminal-output .emoji span,
.cmd .emoji, .cmd .emoji span {
display: inline-block;
width: 2ch;
}
.terminal, .cmd {
box-sizing: border-box;
}
.cmd .cmd-cursor span:not(.token):not(.inverted) {
color: inherit;
background-color: inherit;
}
.cmd .emoji.emoji.emoji.emoji, .cmd .emoji.emoji.emoji.emoji span {
color: transparent;
background-color: transparent;
}
.cmd .cmd-cursor * {
background-color: transparent;
}
.cmd div {
clear: both;
}
.cmd .cmd-prompt + div {
clear: right;
}
terminal .terminal-output > div {
margin-top: -1px;
}
.terminal-output > div.raw > div * {
overflow-wrap: break-word;
word-wrap: break-word;
}
.terminal .terminal-font {
position: absolute;
float: left;
font-size: inherit;
line-height: inherit;
top: -100%;
left: 0;
margin-bottom: 1px;
}
.cmd > span:not(.cmd-prompt) {
float: left;
}
.cmd .cmd-prompt span.cmd-line {
display: block;
float: none;
}
.terminal table {
border-collapse: collapse;
}
.terminal td {
border: 1px solid #aaa;
}
.cmd span[data-text]:not(.emoji):not(.fa):not(.fas):not(.far) span {
background-color: inherit;
color: inherit;
}
/* fix for underline on middle line */
.cmd [role="presentation"].cmd-cursor-line {
position: relative;
z-index: 100;
}
/* prompt above cursor line */
.cmd .cmd-prompt {
position: relative;
z-index: 200;
}
.cmd [role="presentation"]:not(.cmd-cursor-line) {
overflow: hidden;
}
/*
* this is set so animation can select original color as backgound for cursor
* so span can have --color for selection
*/
.cmd {
--original-color: var(--color, #aaa);
}
.cmd a[href] {
--original-color: var(--link-color, #0F60FF);
}
/* DEFAULT ANIMATION */
@-webkit-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
/* original background is set in emoji that need different style */
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@-moz-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
/* GLOW ANIMATION */
@-webkit-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-webkit-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-webkit-box-shadow: none;
box-shadow: none;
}
}
@-moz-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-moz-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-moz-box-shadow: none;
box-shadow: none;
}
}
@keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
box-shadow: none;
}
}
/* BAR ANIMATION */
@-webkit-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
/* UNDERLINE ANIMATION */
@-webkit-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
.underline-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.underline-animation .cmd .cmd-cursor.cmd-blink a,
.underline-animation .cmd .cmd-cursor.cmd-blink .fa,
.underline-animation .cmd .cmd-cursor.cmd-blink .far,
.underline-animation .cmd .cmd-cursor.cmd-blink .fas,
.underline-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-underline;
-moz-animation-name: terminal-underline;
-ms-animation-name: terminal-underline;
animation-name: terminal-underline;
}
.glow-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.glow-animation .cmd .cmd-cursor.cmd-blink a,
.glow-animation .cmd .cmd-cursor.cmd-blink .fa,
.glow-animation .cmd .cmd-cursor.cmd-blink .far,
.glow-animation .cmd .cmd-cursor.cmd-blink .fas,
.glow-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-glow;
-moz-animation-name: terminal-glow;
-ms-animation-name: terminal-glow;
animation-name: terminal-glow;
}
.bar-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.bar-animation .cmd .cmd-cursor.cmd-blink a,
.bar-animation .cmd .cmd-cursor.cmd-blink .fa,
.bar-animation .cmd .cmd-cursor.cmd-blink .far,
.bar-animation .cmd .cmd-cursor.cmd-blink .fas,
.bar-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-bar;
-moz-animation-name: terminal-bar;
-ms-animation-name: terminal-bar;
animation-name: terminal-bar;
}
/*
Internet Explorer & Edge *, Safari 6
source: https://w3reign.com/internet-explorer-edge-css-hacks/
*/
@supports (-ms-ime-align:auto) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
@keyframes terminal-blink {
0%, 50% {
background-color: var(--original-color, #aaa);
color: var(--background, #000);
}
50.1%, 100% {
background-color: var(--background, #000);
color: var(--original-color, #aaa);
}
}
@keyframes terminal-bar {
0%, 50% {
border-left-color: var(--color, #aaa);
}
50.1%, 100% {
border-left-color: var(--background, #000);
}
}
@keyframes terminal-underline {
0%, 50% {
border-bottom-color: var(--color, #aaa);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
50.1%, 100% {
border-bottom-color: var(--background, #000);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
}
}
/* IE hack Edge one don't work in IE11 */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
.underline-animation .cursor.blink span span {
margin-top: 1px;
}
@-ms-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
color: #000;
}
50.1%, 100% {
background-color: #000;
color: #aaa;
}
}
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection {
background-color: #aaa;
color: #000;
}
/* this don't work in Chrome
.terminal tr td::-moz-selection {
border-color: #000;
}
.terminal tr td::selection {
border-color: #000;
}
*/
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::selection {
/*
* use rgba to fix transparent selection in chrome
* http://stackoverflow.com/questions/7224445/css3-selection-behaves-differently-in-ff-chrome
*/
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
.terminal-output .emoji::-moz-selection,
.terminal-output .emoji span::-moz-selection,
.cmd .emoji::-moz-selection,
.cmd .emoji span::-moz-selection,
.cmd textarea::-moz-selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal-output .emoji::selection,
.terminal-output .emoji span::selection,
.cmd .emoji span::selection,
.cmd .emoji::selection,
.cmd textarea::selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal .terminal-output > :not(.raw) .terminal-error,
.terminal .terminal-output > :not(.raw) .terminal-error * {
color: red;
color: var(--error-color, red);
}
.tilda {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1100;
}
.ui-dialog-content .terminal {
width: 100%;
height: 100%;
box-sizing: border-box;
}
.ui-dialog .ui-dialog-content.dterm {
padding: 0;
}
.clear {
clear: both;
}
.terminal .terminal-fill {
position: absolute;
left: 0;
top: -100%;
width: 100%;
height: 100%;
margin: 1px 0 0;
border: none;
opacity: 0.01;
pointer-events: none;
box-sizing: border-box;
}
.terminal, .terminal .terminal-fill, .cmd-editable {
padding: 10px;
}
.cmd-editable {
padding-top: 0;
}
/* padding added as margin to .cmd to fix FireFox bug see: https://stackoverflow.com/q/29986977/387194 */
.terminal {
padding-bottom: 0;
}
.terminal .cmd {
margin-bottom: 10px;
position: relative;
}
@supports (--css: variables) {
.terminal,
.terminal-output > :not(.raw) span[data-text]:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji),
.cmd div {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.terminal span[style*="--length"] {
/*
* default value for char-width taken from Google Chrome for default font
* to silence warning in webpack #371
*/
width: calc(var(--length, 1) * var(--char-width, 7.23438) * 1px);
display: inline-block;
}
.terminal,
.terminal-output > :not(.raw) span,
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
font-size: calc(var(--size, 1) * 12px);
}
.terminal-output .emoji, .cmd .emoji {
height: calc(var(--size, 1) * 12px);
}
.cmd .clipboard {
top: calc(var(--size, 1) * 14 * var(--cursor-line, 0) * 1px);
}
.terminal .inverted, .cmd.cmd.cmd .inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: var(--color, #aaa) !important;
color: var(--background, #000) !important;
}
.cmd .cmd-cursor.cmd-blink {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor.cmd-blink .emoji {
-webkit-animation: var(--animation, terminal-blink) 1s infinite linear;
-moz-animation: var(--animation, terminal-blink) 1s infinite linear;
-ms-animation: var(--animation, terminal-blink) 1s infinite linear;
animation: var(--animation, terminal-blink) 1s infinite linear;
--original-background: inherit;
}
.cmd .cmd-cursor.cmd-blink .emoji span {
color: transparent;
background: transparent;
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
/*
* font icons (fontawesome) don't render selection we make emoji the same becuase,
* selection on emoji looks weird
*/
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection {
background-color: var(--color, #aaa);
color: var(--background, #000);
}
.terminal .terminal-output div div a::-moz-selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::-moz-selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]:not(.emoji)::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection {
background-color: var(--color, rgba(170, 170, 170, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a::selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
}
/*
* overwrite css variables that don't work with selection in Edge
*/
@supports (-ms-ime-align:auto) {
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.cmd span[data-text]::selection {
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
}
/* PrismJS style overwrites */
.terminal .token.token,
.terminal .token.operator,
.terminal .token.entity,
.terminal .token.variable,
.terminal .token.url,
.terminal .token.string,
.terminal .style .token.string,
.terminal .token.token,
.cmd .token.operator,
.cmd .token.entity,
.cmd .token.variable,
.cmd .token.url,
.cmd .token.string,
.cmd .style .token.string,
.cmd .token.token {
background-color: inherit;
}
/* FireFox hack
@supports (-moz-animation: foo) {
.terminal,
.terminal .terminal-output > :not(.raw) span,
.terminal .terminal-output > :not(.raw) a,
.terminal .terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
line-height: calc(var(--size, 1) * 13px);
}
}
*/
/* style for autocomplete menu */
.cmd .cursor-wrapper ul {
list-style: none;
margin: 0;
padding: 0;
float: left;
position: absolute;
top: 14px;
left: 0;
}
.cmd .cursor-wrapper li {
cursor: pointer;
white-space: nowrap;
}
.cmd .cursor-wrapper li:hover {
background: #aaa;
color: #000;
}
.cursor-wrapper {
position: relative;
}
/* images */
.terminal-output div[style*="100%;"] {
overflow: hidden;
}
.terminal-output img {
display: block;
}
.cmd img {
height: 14px;
height: calc(var(--size, 1) * 14px);
border: 1px solid transparent;
}
.cmd-cursor img {
border-color: #ccc;
border-color: var(--color, #ccc);
}
.terminal-output svg.terminal-broken-image {
height: calc(var(--size, 1) * 14px);
}
.terminal-output svg.terminal-broken-image use {
fill: var(--color, #ccc);
}
.terminal-error {
--color: var(--error-color);
}
.terminal-glow {
--animation: terminal-glow;
}
.terminal-glow span[data-text],
.terminal-glow .cmd-prompt > span,
.terminal-glow a[data-text],
.terminal-glow [data-text] span,
.terminal-glow .terminal-output > div span,
.terminal-glow .terminal-output > div a[href] {
text-shadow: 1px 1px 5px #ccc;
text-shadow: 1px 1px 5px var(--color, #ccc);
}
/* is_bottom detection */
.terminal-scroll-marker {
position: relative;
height: 1px;
margin-top: -1px;
z-index: 100;
}
.terminal-scroll-marker div {
position: absolute;
bottom: 0;
left: 0;
right: 0;
z-index: 200;
}
.terminal-less {
touch-action: none;
overscroll-behavior-y: contain;
}
/*
* mobile scroll fix, with help from StackOverflow
* https://stackoverflow.com/a/60535925/387194
*/
.terminal-mobile.terminal-less .terminal-wrapper {
pointer-events: none;
}
.terminal-mobile.terminal-less .terminal-output a, .cmd-editable {
pointer-events: visible;
}
.cmd-editable::before {
content: attr(data-cmd-prompt);
display: inline-block;
}
.cmd-editable {
position: absolute;
top: 0;
top: calc(var(--terminal-y, var(--cmd-y, 0)) + var(--terminal-scroll, 0) * 1px);
right: 0;
left: 0;
bottom: 0;
bottom: calc(var(--terminal-scroll, 0) * -1px);
z-index: 500;
color: transparent;
background: transparent;
opacity: 0.01;
}
.terminal::-webkit-scrollbar {
width: 6px;
height: 6px;
background: var(--background, #000);
}
.terminal::-webkit-scrollbar-thumb {
background: var(--color, #aaa);
}
.terminal::-webkit-scrollbar-thumb:hover {
background: var(--color, #aaa);
}
.terminal {
scrollbar-color: #aaa #000;
scrollbar-color: var(--color, #aaa) var(--background, #000);
scrollbar-width: thin;
}
.cmd .token {
--original-color: var(--color);
}
.terminal .terminal-blink, .cmd .terminal-blink {
animation: terminal-ansi-blink 1s steps(2, start) infinite;
-webkit-animation: terminal-ansi-blink 1s steps(2, start) infinite;
}
@keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}
@-webkit-keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,985 @@
/*!
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/ version {{VER}}
* http://terminal.jcubic.pl
*
* This file is part of jQuery Terminal.
*
* Copyright (c) 2011-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
* Date: {{DATE}}
*/
.terminal .terminal-output .format, .cmd .format,
.cmd-prompt, .cmd-prompt div {
display: inline-block;
}
.terminal h1, .terminal h2, .terminal h3, .terminal h4, .terminal h5, .terminal h6, .terminal pre, .cmd {
margin: 0;
}
.cmd .cmd-clipboard {
all: unset;
position: absolute !important;
left: -16px !important;
top: 0 !important;
width: 16px !important;
height: 16px !important;
background: transparent !important;
border: none !important;
color: transparent !important;
outline: none !important;
padding: 0 !important;
resize: none !important;
z-index: 1000 !important;
overflow: hidden !important;
white-space: pre !important;
text-indent: -9999em !important; /* better cursor hiding for Safari and IE */
top: calc(var(--cursor-line, 0) * var(--size, 1) * 14px) !important;
}
.cmd span.cmd-end-line,
.cmd span.cmd-end-line span,
.cmd div.cmd-end-line span[data-text]:last-child,
.cmd div.cmd-end-line span[data-text]:last-child span,
.cmd textarea,
.cmd .cursor + span:empty {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */
}
.terminal img, .terminal audio, .terminal object, .terminal canvas {
cursor: default;
}
.terminal {
position: relative;
line-height: initial;
overflow-y: auto;
}
terminal.terminal-temp {
visibility: hidden;
}
.terminal {
contain: content;
}
body.terminal {
min-height: 100vh;
height: 100%;
}
html {
height: 100%;
}
body.terminal, body.full-screen-terminal {
margin: 0;
height: 100%;
}
body.full-screen-terminal .terminal {
height: 100%;
}
.terminal > div.terminal-fill {
min-height: 100%;
height: 100%;
}
.terminal > .terminal-resizer, .terminal > .terminal-font .terminal-resizer {
all: unset;
position: absolute !important;
top: 0 !important;
right: 0 !important;
bottom: 0 !important;
left: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
z-index: -1 !important;
height: 100% !important;
border: none !important;
padding: 0 !important;
width: 100% !important;
}
.cmd {
padding: 0;
position: relative;
width: 100%;
z-index: 300;
}
.terminal a[tabindex="1000"],
.terminal a[tabindex="1000"]:active,
.terminal a[tabindex="1000"]:focus {
outline: none;
}
.terminal .inverted, .cmd.cmd.cmd .inverted,
.terminal .terminal-inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: #aaa !important;
color: #000 !important;
}
.terminal .terminal-output > :not(.raw) a[href], .cmd a[href] {
color: #0F60FF;
color: var(--link-color, #0F60FF);
cursor: pointer;
}
.cmd a[href]:not(.terminal-inverted),
.terminal .terminal-output > :not(.raw) a[href]:not(.terminal-inverted) {
--color: var(--link-color, #0F60FF);
}
.terminal .terminal-output > :not(.raw) a[href].terminal-inverted {
background: var(--color, #ccc);
}
.terminal .terminal-output > :not(.raw) a[href]:hover, .cmd a[href]:hover {
background-color: #0F60FF;
background-color: var(--link-color, #0F60FF) !important;
color: #000;
color: var(--background, #000) !important;
text-decoration: none;
}
.terminal .terminal-output > :not(.raw) a[href] span,
.cmd a[href] span {
/*
* shorter and simple solution
* it's hard to overwrite long :not selector (:not(a span) don't work)
*/
color: #0F60FF !important;
--color: var(--link-color, #0F60FF);
color: var(--link-color, #0F60FF) !important;
text-decoration: underline;
}
.terminal .terminal-output > :not(.raw) a[href]:hover span,
.cmd a[href]:hover span {
background-color: #0F60FF !important;
background-color: var(--link-color, #0F60FF) !important;
color: #000 !important;
color: var(--background, #000) !important;
text-decoration: none;
}
.cmd .cmd-cursor {
display: inline-block;
}
.cmd .cmd-cursor-line > span,
.cmd .cmd-cursor-line img {
display: inline-block;
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor .emoji {
-webkit-animation: terminal-blink 1s infinite linear;
-moz-animation: terminal-blink 1s infinite linear;
-ms-animation: terminal-blink 1s infinite linear;
animation: terminal-blink 1s infinite linear;
}
.bar.terminal .inverted, .bar.cmd .cmd-inverted {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
.terminal, .terminal .terminal-output > div > div, .cmd .cmd-prompt {
display: block;
height: auto;
}
.terminal .terminal-output > div:not(.raw) div {
white-space: nowrap;
}
.cmd .cmd-prompt > span {
float: left;
}
.cmd .cmd-prompt ~ div span[style*="width"],
.terminal-output span[style*="width"] {
display: inline-block;
line-height: 1;
}
.terminal-ouput span[style*="width"] {
min-height: 14px;
min-height: calc(var(--size, 1) * 14px);
}
.cmd .cmd-prompt span[style*="width"] {
margin-top: 2px;
}
.terminal,
.terminal-output > :not(.raw),
.terminal-output > :not(.raw) span:not(.fas):not(.far):not(.fa),
.terminal-output > :not(.raw) a,
.cmd,
.cmd span:not(.fas):not(.far):not(.fa) {
/*font-family: FreeMono, monospace; this don't work on Android */
font-family: monospace;
}
.terminal,
.cmd {
font-size: 12px;
}
.terminal-output div div::before {
content: '\0200B';
width: 0;
float: left;
display: block;
}
.terminal, terminal-output > div:not(.raw) div > span:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji) {
color: #aaa;
background-color: #000;
}
.cmd span.cmd-prompt, .cmd .cmd-prompt span {
background-color: transparent !important;
}
.terminal-output .emoji, .cmd .emoji {
height: 12px;
background-size: contain;
background-repeat: no-repeat;
color: transparent;
position: relative;
}
.terminal .terminal-output .fa span,
.terminal .terminal-output .fas span,
.terminal .terminal-output .far span,
.cmd .fa span,
.cmd .fas span,
.cmd .far span {
background: transparent !important;
color: transparent !important;
clip: rect(1px,1px,1px,1px);
position: absolute;
}
.terminal-output .emoji,
.terminal-output .emoji span,
.cmd .emoji, .cmd .emoji span {
display: inline-block;
width: 2ch;
}
.terminal, .cmd {
box-sizing: border-box;
}
.cmd .cmd-cursor span:not(.token):not(.inverted) {
color: inherit;
background-color: inherit;
}
.cmd .emoji.emoji.emoji.emoji, .cmd .emoji.emoji.emoji.emoji span {
color: transparent;
background-color: transparent;
}
.cmd .cmd-cursor * {
background-color: transparent;
}
.cmd div {
clear: both;
}
.cmd .cmd-prompt + div {
clear: right;
}
terminal .terminal-output > div {
margin-top: -1px;
}
.terminal-output > div.raw > div * {
overflow-wrap: break-word;
word-wrap: break-word;
}
.terminal .terminal-font {
position: absolute;
float: left;
font-size: inherit;
line-height: inherit;
top: -100%;
left: 0;
margin-bottom: 1px;
}
.cmd > span:not(.cmd-prompt) {
float: left;
}
.cmd .cmd-prompt span.cmd-line {
display: block;
float: none;
}
.terminal table {
border-collapse: collapse;
}
.terminal td {
border: 1px solid #aaa;
}
.cmd span[data-text]:not(.emoji):not(.fa):not(.fas):not(.far) span {
background-color: inherit;
color: inherit;
}
/* fix for underline on middle line */
.cmd [role="presentation"].cmd-cursor-line {
position: relative;
z-index: 100;
}
/* prompt above cursor line */
.cmd .cmd-prompt {
position: relative;
z-index: 200;
}
.cmd [role="presentation"]:not(.cmd-cursor-line) {
overflow: hidden;
}
/*
* this is set so animation can select original color as backgound for cursor
* so span can have --color for selection
*/
.cmd {
--original-color: var(--color, #aaa);
}
.cmd a[href] {
--original-color: var(--link-color, #0F60FF);
}
/* DEFAULT ANIMATION */
@-webkit-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
/* original background is set in emoji that need different style */
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@-moz-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
/* GLOW ANIMATION */
@-webkit-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-webkit-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-webkit-box-shadow: none;
box-shadow: none;
}
}
@-moz-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-moz-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-moz-box-shadow: none;
box-shadow: none;
}
}
@keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
box-shadow: none;
}
}
/* BAR ANIMATION */
@-webkit-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
/* UNDERLINE ANIMATION */
@-webkit-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
.underline-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.underline-animation .cmd .cmd-cursor.cmd-blink a,
.underline-animation .cmd .cmd-cursor.cmd-blink .fa,
.underline-animation .cmd .cmd-cursor.cmd-blink .far,
.underline-animation .cmd .cmd-cursor.cmd-blink .fas,
.underline-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-underline;
-moz-animation-name: terminal-underline;
-ms-animation-name: terminal-underline;
animation-name: terminal-underline;
}
.glow-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.glow-animation .cmd .cmd-cursor.cmd-blink a,
.glow-animation .cmd .cmd-cursor.cmd-blink .fa,
.glow-animation .cmd .cmd-cursor.cmd-blink .far,
.glow-animation .cmd .cmd-cursor.cmd-blink .fas,
.glow-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-glow;
-moz-animation-name: terminal-glow;
-ms-animation-name: terminal-glow;
animation-name: terminal-glow;
}
.bar-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.bar-animation .cmd .cmd-cursor.cmd-blink a,
.bar-animation .cmd .cmd-cursor.cmd-blink .fa,
.bar-animation .cmd .cmd-cursor.cmd-blink .far,
.bar-animation .cmd .cmd-cursor.cmd-blink .fas,
.bar-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-bar;
-moz-animation-name: terminal-bar;
-ms-animation-name: terminal-bar;
animation-name: terminal-bar;
}
/*
Internet Explorer & Edge *, Safari 6
source: https://w3reign.com/internet-explorer-edge-css-hacks/
*/
@supports (-ms-ime-align:auto) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
@keyframes terminal-blink {
0%, 50% {
background-color: var(--original-color, #aaa);
color: var(--background, #000);
}
50.1%, 100% {
background-color: var(--background, #000);
color: var(--original-color, #aaa);
}
}
@keyframes terminal-bar {
0%, 50% {
border-left-color: var(--color, #aaa);
}
50.1%, 100% {
border-left-color: var(--background, #000);
}
}
@keyframes terminal-underline {
0%, 50% {
border-bottom-color: var(--color, #aaa);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
50.1%, 100% {
border-bottom-color: var(--background, #000);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
}
}
/* IE hack Edge one don't work in IE11 */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
.underline-animation .cursor.blink span span {
margin-top: 1px;
}
@-ms-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
color: #000;
}
50.1%, 100% {
background-color: #000;
color: #aaa;
}
}
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection {
background-color: #aaa;
color: #000;
}
/* this don't work in Chrome
.terminal tr td::-moz-selection {
border-color: #000;
}
.terminal tr td::selection {
border-color: #000;
}
*/
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::selection {
/*
* use rgba to fix transparent selection in chrome
* http://stackoverflow.com/questions/7224445/css3-selection-behaves-differently-in-ff-chrome
*/
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
.terminal-output .emoji::-moz-selection,
.terminal-output .emoji span::-moz-selection,
.cmd .emoji::-moz-selection,
.cmd .emoji span::-moz-selection,
.cmd textarea::-moz-selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal-output .emoji::selection,
.terminal-output .emoji span::selection,
.cmd .emoji span::selection,
.cmd .emoji::selection,
.cmd textarea::selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal .terminal-output > :not(.raw) .terminal-error,
.terminal .terminal-output > :not(.raw) .terminal-error * {
color: red;
color: var(--error-color, red);
}
.tilda {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1100;
}
.ui-dialog-content .terminal {
width: 100%;
height: 100%;
box-sizing: border-box;
}
.ui-dialog .ui-dialog-content.dterm {
padding: 0;
}
.clear {
clear: both;
}
.terminal .terminal-fill {
position: absolute;
left: 0;
top: -100%;
width: 100%;
height: 100%;
margin: 1px 0 0;
border: none;
opacity: 0.01;
pointer-events: none;
box-sizing: border-box;
}
.terminal, .terminal .terminal-fill, .cmd-editable {
padding: 10px;
}
.cmd-editable {
padding-top: 0;
}
/* padding added as margin to .cmd to fix FireFox bug see: https://stackoverflow.com/q/29986977/387194 */
.terminal {
padding-bottom: 0;
}
.terminal .cmd {
margin-bottom: 10px;
position: relative;
}
@supports (--css: variables) {
.terminal,
.terminal-output > :not(.raw) span[data-text]:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji),
.cmd div {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.terminal span[style*="--length"] {
/*
* default value for char-width taken from Google Chrome for default font
* to silence warning in webpack #371
*/
width: calc(var(--length, 1) * var(--char-width, 7.23438) * 1px);
display: inline-block;
}
.terminal,
.terminal-output > :not(.raw) span,
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
font-size: calc(var(--size, 1) * 12px);
}
.terminal-output .emoji, .cmd .emoji {
height: calc(var(--size, 1) * 12px);
}
.cmd .clipboard {
top: calc(var(--size, 1) * 14 * var(--cursor-line, 0) * 1px);
}
.terminal .inverted, .cmd.cmd.cmd .inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: var(--color, #aaa) !important;
color: var(--background, #000) !important;
}
.cmd .cmd-cursor.cmd-blink {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor.cmd-blink .emoji {
-webkit-animation: var(--animation, terminal-blink) 1s infinite linear;
-moz-animation: var(--animation, terminal-blink) 1s infinite linear;
-ms-animation: var(--animation, terminal-blink) 1s infinite linear;
animation: var(--animation, terminal-blink) 1s infinite linear;
--original-background: inherit;
}
.cmd .cmd-cursor.cmd-blink .emoji span {
color: transparent;
background: transparent;
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
/*
* font icons (fontawesome) don't render selection we make emoji the same becuase,
* selection on emoji looks weird
*/
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection {
background-color: var(--color, #aaa);
color: var(--background, #000);
}
.terminal .terminal-output div div a::-moz-selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::-moz-selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]:not(.emoji)::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection {
background-color: var(--color, rgba(170, 170, 170, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a::selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
}
/*
* overwrite css variables that don't work with selection in Edge
*/
@supports (-ms-ime-align:auto) {
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.cmd span[data-text]::selection {
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
}
/* PrismJS style overwrites */
.terminal .token.token,
.terminal .token.operator,
.terminal .token.entity,
.terminal .token.variable,
.terminal .token.url,
.terminal .token.string,
.terminal .style .token.string,
.terminal .token.token,
.cmd .token.operator,
.cmd .token.entity,
.cmd .token.variable,
.cmd .token.url,
.cmd .token.string,
.cmd .style .token.string,
.cmd .token.token {
background-color: inherit;
}
/* FireFox hack
@supports (-moz-animation: foo) {
.terminal,
.terminal .terminal-output > :not(.raw) span,
.terminal .terminal-output > :not(.raw) a,
.terminal .terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
line-height: calc(var(--size, 1) * 13px);
}
}
*/
/* style for autocomplete menu */
.cmd .cursor-wrapper ul {
list-style: none;
margin: 0;
padding: 0;
float: left;
position: absolute;
top: 14px;
left: 0;
}
.cmd .cursor-wrapper li {
cursor: pointer;
white-space: nowrap;
}
.cmd .cursor-wrapper li:hover {
background: #aaa;
color: #000;
}
.cursor-wrapper {
position: relative;
}
/* images */
.terminal-output div[style*="100%;"] {
overflow: hidden;
}
.terminal-output img {
display: block;
}
.cmd img {
height: 14px;
height: calc(var(--size, 1) * 14px);
border: 1px solid transparent;
}
.cmd-cursor img {
border-color: #ccc;
border-color: var(--color, #ccc);
}
.terminal-output svg.terminal-broken-image {
height: calc(var(--size, 1) * 14px);
}
.terminal-output svg.terminal-broken-image use {
fill: var(--color, #ccc);
}
.terminal-error {
--color: var(--error-color);
}
.terminal-glow {
--animation: terminal-glow;
}
.terminal-glow span[data-text],
.terminal-glow .cmd-prompt > span,
.terminal-glow a[data-text],
.terminal-glow [data-text] span,
.terminal-glow .terminal-output > div span,
.terminal-glow .terminal-output > div a[href] {
text-shadow: 1px 1px 5px #ccc;
text-shadow: 1px 1px 5px var(--color, #ccc);
}
/* is_bottom detection */
.terminal-scroll-marker {
position: relative;
height: 1px;
margin-top: -1px;
z-index: 100;
}
.terminal-scroll-marker div {
position: absolute;
bottom: 0;
left: 0;
right: 0;
z-index: 200;
}
.terminal-less {
touch-action: none;
overscroll-behavior-y: contain;
}
/*
* mobile scroll fix, with help from StackOverflow
* https://stackoverflow.com/a/60535925/387194
*/
.terminal-mobile.terminal-less .terminal-wrapper {
pointer-events: none;
}
.terminal-mobile.terminal-less .terminal-output a, .cmd-editable {
pointer-events: visible;
}
.cmd-editable::before {
content: attr(data-cmd-prompt);
display: inline-block;
}
.cmd-editable {
position: absolute;
top: 0;
top: calc(var(--terminal-y, var(--cmd-y, 0)) + var(--terminal-scroll, 0) * 1px);
right: 0;
left: 0;
bottom: 0;
bottom: calc(var(--terminal-scroll, 0) * -1px);
z-index: 500;
color: transparent;
background: transparent;
opacity: 0.01;
}
.terminal::-webkit-scrollbar {
width: 6px;
height: 6px;
background: var(--background, #000);
}
.terminal::-webkit-scrollbar-thumb {
background: var(--color, #aaa);
}
.terminal::-webkit-scrollbar-thumb:hover {
background: var(--color, #aaa);
}
.terminal {
scrollbar-color: #aaa #000;
scrollbar-color: var(--color, #aaa) var(--background, #000);
scrollbar-width: thin;
}
.cmd .token {
--original-color: var(--color);
}
.terminal .terminal-blink, .cmd .terminal-blink {
animation: terminal-ansi-blink 1s steps(2, start) infinite;
-webkit-animation: terminal-ansi-blink 1s steps(2, start) infinite;
}
@keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}
@-webkit-keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}

@ -0,0 +1,985 @@
/*!
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/ version 2.22.0
* http://terminal.jcubic.pl
*
* This file is part of jQuery Terminal.
*
* Copyright (c) 2011-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
* Date: Sun, 14 Feb 2021 11:03:09 +0000
*/
.terminal .terminal-output .format, .cmd .format,
.cmd-prompt, .cmd-prompt div {
display: inline-block;
}
.terminal h1, .terminal h2, .terminal h3, .terminal h4, .terminal h5, .terminal h6, .terminal pre, .cmd {
margin: 0;
}
.cmd .cmd-clipboard {
all: unset;
position: absolute !important;
left: -16px !important;
top: 0 !important;
width: 16px !important;
height: 16px !important;
background: transparent !important;
border: none !important;
color: transparent !important;
outline: none !important;
padding: 0 !important;
resize: none !important;
z-index: 1000 !important;
overflow: hidden !important;
white-space: pre !important;
text-indent: -9999em !important; /* better cursor hiding for Safari and IE */
top: calc(var(--cursor-line, 0) * var(--size, 1) * 14px) !important;
}
.cmd span.cmd-end-line,
.cmd span.cmd-end-line span,
.cmd div.cmd-end-line span[data-text]:last-child,
.cmd div.cmd-end-line span[data-text]:last-child span,
.cmd textarea,
.cmd .cursor + span:empty {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */
}
.terminal img, .terminal audio, .terminal object, .terminal canvas {
cursor: default;
}
.terminal {
position: relative;
line-height: initial;
overflow-y: auto;
}
terminal.terminal-temp {
visibility: hidden;
}
.terminal {
contain: content;
}
body.terminal {
min-height: 100vh;
height: 100%;
}
html {
height: 100%;
}
body.terminal, body.full-screen-terminal {
margin: 0;
height: 100%;
}
body.full-screen-terminal .terminal {
height: 100%;
}
.terminal > div.terminal-fill {
min-height: 100%;
height: 100%;
}
.terminal > .terminal-resizer, .terminal > .terminal-font .terminal-resizer {
all: unset;
position: absolute !important;
top: 0 !important;
right: 0 !important;
bottom: 0 !important;
left: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
z-index: -1 !important;
height: 100% !important;
border: none !important;
padding: 0 !important;
width: 100% !important;
}
.cmd {
padding: 0;
position: relative;
width: 100%;
z-index: 300;
}
.terminal a[tabindex="1000"],
.terminal a[tabindex="1000"]:active,
.terminal a[tabindex="1000"]:focus {
outline: none;
}
.terminal .inverted, .cmd.cmd.cmd .inverted,
.terminal .terminal-inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: #aaa !important;
color: #000 !important;
}
.terminal .terminal-output > :not(.raw) a[href], .cmd a[href] {
color: #0F60FF;
color: var(--link-color, #0F60FF);
cursor: pointer;
}
.cmd a[href]:not(.terminal-inverted),
.terminal .terminal-output > :not(.raw) a[href]:not(.terminal-inverted) {
--color: var(--link-color, #0F60FF);
}
.terminal .terminal-output > :not(.raw) a[href].terminal-inverted {
background: var(--color, #ccc);
}
.terminal .terminal-output > :not(.raw) a[href]:hover, .cmd a[href]:hover {
background-color: #0F60FF;
background-color: var(--link-color, #0F60FF) !important;
color: #000;
color: var(--background, #000) !important;
text-decoration: none;
}
.terminal .terminal-output > :not(.raw) a[href] span,
.cmd a[href] span {
/*
* shorter and simple solution
* it's hard to overwrite long :not selector (:not(a span) don't work)
*/
color: #0F60FF !important;
--color: var(--link-color, #0F60FF);
color: var(--link-color, #0F60FF) !important;
text-decoration: underline;
}
.terminal .terminal-output > :not(.raw) a[href]:hover span,
.cmd a[href]:hover span {
background-color: #0F60FF !important;
background-color: var(--link-color, #0F60FF) !important;
color: #000 !important;
color: var(--background, #000) !important;
text-decoration: none;
}
.cmd .cmd-cursor {
display: inline-block;
}
.cmd .cmd-cursor-line > span,
.cmd .cmd-cursor-line img {
display: inline-block;
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor .emoji {
-webkit-animation: terminal-blink 1s infinite linear;
-moz-animation: terminal-blink 1s infinite linear;
-ms-animation: terminal-blink 1s infinite linear;
animation: terminal-blink 1s infinite linear;
}
.bar.terminal .inverted, .bar.cmd .cmd-inverted {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
.terminal, .terminal .terminal-output > div > div, .cmd .cmd-prompt {
display: block;
height: auto;
}
.terminal .terminal-output > div:not(.raw) div {
white-space: nowrap;
}
.cmd .cmd-prompt > span {
float: left;
}
.cmd .cmd-prompt ~ div span[style*="width"],
.terminal-output span[style*="width"] {
display: inline-block;
line-height: 1;
}
.terminal-ouput span[style*="width"] {
min-height: 14px;
min-height: calc(var(--size, 1) * 14px);
}
.cmd .cmd-prompt span[style*="width"] {
margin-top: 2px;
}
.terminal,
.terminal-output > :not(.raw),
.terminal-output > :not(.raw) span:not(.fas):not(.far):not(.fa),
.terminal-output > :not(.raw) a,
.cmd,
.cmd span:not(.fas):not(.far):not(.fa) {
/*font-family: FreeMono, monospace; this don't work on Android */
font-family: monospace;
}
.terminal,
.cmd {
font-size: 12px;
}
.terminal-output div div::before {
content: '\0200B';
width: 0;
float: left;
display: block;
}
.terminal, terminal-output > div:not(.raw) div > span:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji) {
color: #aaa;
background-color: #000;
}
.cmd span.cmd-prompt, .cmd .cmd-prompt span {
background-color: transparent !important;
}
.terminal-output .emoji, .cmd .emoji {
height: 12px;
background-size: contain;
background-repeat: no-repeat;
color: transparent;
position: relative;
}
.terminal .terminal-output .fa span,
.terminal .terminal-output .fas span,
.terminal .terminal-output .far span,
.cmd .fa span,
.cmd .fas span,
.cmd .far span {
background: transparent !important;
color: transparent !important;
clip: rect(1px,1px,1px,1px);
position: absolute;
}
.terminal-output .emoji,
.terminal-output .emoji span,
.cmd .emoji, .cmd .emoji span {
display: inline-block;
width: 2ch;
}
.terminal, .cmd {
box-sizing: border-box;
}
.cmd .cmd-cursor span:not(.token):not(.inverted) {
color: inherit;
background-color: inherit;
}
.cmd .emoji.emoji.emoji.emoji, .cmd .emoji.emoji.emoji.emoji span {
color: transparent;
background-color: transparent;
}
.cmd .cmd-cursor * {
background-color: transparent;
}
.cmd div {
clear: both;
}
.cmd .cmd-prompt + div {
clear: right;
}
terminal .terminal-output > div {
margin-top: -1px;
}
.terminal-output > div.raw > div * {
overflow-wrap: break-word;
word-wrap: break-word;
}
.terminal .terminal-font {
position: absolute;
float: left;
font-size: inherit;
line-height: inherit;
top: -100%;
left: 0;
margin-bottom: 1px;
}
.cmd > span:not(.cmd-prompt) {
float: left;
}
.cmd .cmd-prompt span.cmd-line {
display: block;
float: none;
}
.terminal table {
border-collapse: collapse;
}
.terminal td {
border: 1px solid #aaa;
}
.cmd span[data-text]:not(.emoji):not(.fa):not(.fas):not(.far) span {
background-color: inherit;
color: inherit;
}
/* fix for underline on middle line */
.cmd [role="presentation"].cmd-cursor-line {
position: relative;
z-index: 100;
}
/* prompt above cursor line */
.cmd .cmd-prompt {
position: relative;
z-index: 200;
}
.cmd [role="presentation"]:not(.cmd-cursor-line) {
overflow: hidden;
}
/*
* this is set so animation can select original color as backgound for cursor
* so span can have --color for selection
*/
.cmd {
--original-color: var(--color, #aaa);
}
.cmd a[href] {
--original-color: var(--link-color, #0F60FF);
}
/* DEFAULT ANIMATION */
@-webkit-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
/* original background is set in emoji that need different style */
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@-moz-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
@keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
color: var(--original-background, var(--original-color, #aaa));
}
}
/* GLOW ANIMATION */
@-webkit-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-webkit-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-webkit-box-shadow: none;
box-shadow: none;
}
}
@-moz-keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
-moz-box-shadow: 0 0 3px var(--color, #aaa);
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
-moz-box-shadow: none;
box-shadow: none;
}
}
@keyframes terminal-glow {
0%, 50% {
background-color: #aaa;
background-color: var(--original-color, #aaa);
color: #000;
color: var(--background, #000);
box-shadow: 0 0 3px #aaa;
box-shadow: 0 0 3px var(--color, #aaa);
}
50.1%, 100% {
background-color: inherit;
color: inherit;
box-shadow: none;
}
}
/* BAR ANIMATION */
@-webkit-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-bar {
0%, 50% {
box-shadow: -2px 0 0 -1px #aaa;
box-shadow: -2px 0 0 -1px var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
/* UNDERLINE ANIMATION */
@-webkit-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@-moz-keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
@keyframes terminal-underline {
0%, 50% {
box-shadow: 0 2px 0 #aaa;
box-shadow: 0 2px 0 var(--original-color, #aaa);
}
50.1%, 100% {
box-shadow: none;
}
}
.underline-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.underline-animation .cmd .cmd-cursor.cmd-blink a,
.underline-animation .cmd .cmd-cursor.cmd-blink .fa,
.underline-animation .cmd .cmd-cursor.cmd-blink .far,
.underline-animation .cmd .cmd-cursor.cmd-blink .fas,
.underline-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-underline;
-moz-animation-name: terminal-underline;
-ms-animation-name: terminal-underline;
animation-name: terminal-underline;
}
.glow-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.glow-animation .cmd .cmd-cursor.cmd-blink a,
.glow-animation .cmd .cmd-cursor.cmd-blink .fa,
.glow-animation .cmd .cmd-cursor.cmd-blink .far,
.glow-animation .cmd .cmd-cursor.cmd-blink .fas,
.glow-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-glow;
-moz-animation-name: terminal-glow;
-ms-animation-name: terminal-glow;
animation-name: terminal-glow;
}
.bar-animation .cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.bar-animation .cmd .cmd-cursor.cmd-blink a,
.bar-animation .cmd .cmd-cursor.cmd-blink .fa,
.bar-animation .cmd .cmd-cursor.cmd-blink .far,
.bar-animation .cmd .cmd-cursor.cmd-blink .fas,
.bar-animation .cmd .cmd-cursor .emoji {
-webkit-animation-name: terminal-bar;
-moz-animation-name: terminal-bar;
-ms-animation-name: terminal-bar;
animation-name: terminal-bar;
}
/*
Internet Explorer & Edge *, Safari 6
source: https://w3reign.com/internet-explorer-edge-css-hacks/
*/
@supports (-ms-ime-align:auto) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
@keyframes terminal-blink {
0%, 50% {
background-color: var(--original-color, #aaa);
color: var(--background, #000);
}
50.1%, 100% {
background-color: var(--background, #000);
color: var(--original-color, #aaa);
}
}
@keyframes terminal-bar {
0%, 50% {
border-left-color: var(--color, #aaa);
}
50.1%, 100% {
border-left-color: var(--background, #000);
}
}
@keyframes terminal-underline {
0%, 50% {
border-bottom-color: var(--color, #aaa);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
50.1%, 100% {
border-bottom-color: var(--background, #000);
line-height: 12px;
line-height: calc(var(--size, 1) * 12px);
}
}
}
/* IE hack Edge one don't work in IE11 */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.cmd .cmd-clipboard {
margin-left: -9999px;
}
.underline-animation .cursor.blink span span {
margin-top: 1px;
}
@-ms-keyframes terminal-blink {
0%, 50% {
background-color: #aaa;
color: #000;
}
50.1%, 100% {
background-color: #000;
color: #aaa;
}
}
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::-moz-selection {
background-color: #aaa;
color: #000;
}
/* this don't work in Chrome
.terminal tr td::-moz-selection {
border-color: #000;
}
.terminal tr td::selection {
border-color: #000;
}
*/
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas) span::selection {
/*
* use rgba to fix transparent selection in chrome
* http://stackoverflow.com/questions/7224445/css3-selection-behaves-differently-in-ff-chrome
*/
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
.terminal-output .emoji::-moz-selection,
.terminal-output .emoji span::-moz-selection,
.cmd .emoji::-moz-selection,
.cmd .emoji span::-moz-selection,
.cmd textarea::-moz-selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal-output .emoji::selection,
.terminal-output .emoji span::selection,
.cmd .emoji span::selection,
.cmd .emoji::selection,
.cmd textarea::selection {
background-color: transparent !important;
color: transparent !important;
}
.terminal .terminal-output > :not(.raw) .terminal-error,
.terminal .terminal-output > :not(.raw) .terminal-error * {
color: red;
color: var(--error-color, red);
}
.tilda {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1100;
}
.ui-dialog-content .terminal {
width: 100%;
height: 100%;
box-sizing: border-box;
}
.ui-dialog .ui-dialog-content.dterm {
padding: 0;
}
.clear {
clear: both;
}
.terminal .terminal-fill {
position: absolute;
left: 0;
top: -100%;
width: 100%;
height: 100%;
margin: 1px 0 0;
border: none;
opacity: 0.01;
pointer-events: none;
box-sizing: border-box;
}
.terminal, .terminal .terminal-fill, .cmd-editable {
padding: 10px;
}
.cmd-editable {
padding-top: 0;
}
/* padding added as margin to .cmd to fix FireFox bug see: https://stackoverflow.com/q/29986977/387194 */
.terminal {
padding-bottom: 0;
}
.terminal .cmd {
margin-bottom: 10px;
position: relative;
}
@supports (--css: variables) {
.terminal,
.terminal-output > :not(.raw) span[data-text]:not(.token):not(.inverted):not(.terminal-inverted):not(.cmd-inverted):not(.terminal-error):not(.emoji),
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span[data-text]:not(.cmd-inverted):not(.token):not(.emoji),
.cmd div {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.terminal span[style*="--length"] {
/*
* default value for char-width taken from Google Chrome for default font
* to silence warning in webpack #371
*/
width: calc(var(--length, 1) * var(--char-width, 7.23438) * 1px);
display: inline-block;
}
.terminal,
.terminal-output > :not(.raw) span,
.terminal-output > :not(.raw) a,
.terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
font-size: calc(var(--size, 1) * 12px);
}
.terminal-output .emoji, .cmd .emoji {
height: calc(var(--size, 1) * 12px);
}
.cmd .clipboard {
top: calc(var(--size, 1) * 14 * var(--cursor-line, 0) * 1px);
}
.terminal .inverted, .cmd.cmd.cmd .inverted, .cmd.cmd.cmd .cmd-inverted {
background-color: var(--color, #aaa) !important;
color: var(--background, #000) !important;
}
.cmd .cmd-cursor.cmd-blink {
color: var(--color, #aaa);
background-color: var(--background, #000);
}
.cmd .cmd-cursor.cmd-blink > span[data-text]:not(.emoji):not(.fa):not(.far):not(.fas) span,
.cmd .cmd-cursor.cmd-blink a,
.cmd .cmd-cursor.cmd-blink .fa,
.cmd .cmd-cursor.cmd-blink .far,
.cmd .cmd-cursor.cmd-blink .fas,
.cmd .cmd-cursor.cmd-blink .emoji {
-webkit-animation: var(--animation, terminal-blink) 1s infinite linear;
-moz-animation: var(--animation, terminal-blink) 1s infinite linear;
-ms-animation: var(--animation, terminal-blink) 1s infinite linear;
animation: var(--animation, terminal-blink) 1s infinite linear;
--original-background: inherit;
}
.cmd .cmd-cursor.cmd-blink .emoji span {
color: transparent;
background: transparent;
}
.terminal h1::-moz-selection,
.terminal h2::-moz-selection,
.terminal h3::-moz-selection,
.terminal h4::-moz-selection,
.terminal h5::-moz-selection,
.terminal h6::-moz-selection,
.terminal pre::-moz-selection,
.terminal td::-moz-selection,
.terminal .terminal-output::-moz-selection,
.terminal .terminal-output div div::-moz-selection,
.terminal .terminal-output div div a::-moz-selection,
.terminal .terminal-output span[data-text]::-moz-selection,
/*
* font icons (fontawesome) don't render selection we make emoji the same becuase,
* selection on emoji looks weird
*/
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection,
.terminal .terminal-output .raw div::-moz-selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::-moz-selection {
background-color: var(--color, #aaa);
color: var(--background, #000);
}
.terminal .terminal-output div div a::-moz-selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::-moz-selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.terminal .terminal-output span[data-text]:not(.emoji)::selection,
.terminal .terminal-output span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection,
.terminal .terminal-output .raw div::selection,
.cmd span[data-text]:not(.far):not(.fa):not(.fas):not(.emoji) span::selection {
background-color: var(--color, rgba(170, 170, 170, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a::selection {
background-color: var(--link-color, rgba(15, 96, 255, 0.99)) !important;
color: var(--background, #000) !important;
}
.terminal .terminal-output div div a:hover::selection {
background-color: var(--link-color, rgba(2, 50, 144, 0.99)) !important;
}
}
/*
* overwrite css variables that don't work with selection in Edge
*/
@supports (-ms-ime-align:auto) {
.terminal h1::selection,
.terminal h2::selection,
.terminal h3::selection,
.terminal h4::selection,
.terminal h5::selection,
.terminal h6::selection,
.terminal pre::selection,
.terminal td::selection,
.terminal .terminal-output div div::selection,
.terminal .terminal-output div div a::selection,
.cmd span[data-text]::selection {
background-color: rgba(170, 170, 170, 0.99);
color: #000;
}
}
/* PrismJS style overwrites */
.terminal .token.token,
.terminal .token.operator,
.terminal .token.entity,
.terminal .token.variable,
.terminal .token.url,
.terminal .token.string,
.terminal .style .token.string,
.terminal .token.token,
.cmd .token.operator,
.cmd .token.entity,
.cmd .token.variable,
.cmd .token.url,
.cmd .token.string,
.cmd .style .token.string,
.cmd .token.token {
background-color: inherit;
}
/* FireFox hack
@supports (-moz-animation: foo) {
.terminal,
.terminal .terminal-output > :not(.raw) span,
.terminal .terminal-output > :not(.raw) a,
.terminal .terminal-output > :not(.raw) div,
.cmd,
.cmd span,
.cmd div {
line-height: calc(var(--size, 1) * 13px);
}
}
*/
/* style for autocomplete menu */
.cmd .cursor-wrapper ul {
list-style: none;
margin: 0;
padding: 0;
float: left;
position: absolute;
top: 14px;
left: 0;
}
.cmd .cursor-wrapper li {
cursor: pointer;
white-space: nowrap;
}
.cmd .cursor-wrapper li:hover {
background: #aaa;
color: #000;
}
.cursor-wrapper {
position: relative;
}
/* images */
.terminal-output div[style*="100%;"] {
overflow: hidden;
}
.terminal-output img {
display: block;
}
.cmd img {
height: 14px;
height: calc(var(--size, 1) * 14px);
border: 1px solid transparent;
}
.cmd-cursor img {
border-color: #ccc;
border-color: var(--color, #ccc);
}
.terminal-output svg.terminal-broken-image {
height: calc(var(--size, 1) * 14px);
}
.terminal-output svg.terminal-broken-image use {
fill: var(--color, #ccc);
}
.terminal-error {
--color: var(--error-color);
}
.terminal-glow {
--animation: terminal-glow;
}
.terminal-glow span[data-text],
.terminal-glow .cmd-prompt > span,
.terminal-glow a[data-text],
.terminal-glow [data-text] span,
.terminal-glow .terminal-output > div span,
.terminal-glow .terminal-output > div a[href] {
text-shadow: 1px 1px 5px #ccc;
text-shadow: 1px 1px 5px var(--color, #ccc);
}
/* is_bottom detection */
.terminal-scroll-marker {
position: relative;
height: 1px;
margin-top: -1px;
z-index: 100;
}
.terminal-scroll-marker div {
position: absolute;
bottom: 0;
left: 0;
right: 0;
z-index: 200;
}
.terminal-less {
touch-action: none;
overscroll-behavior-y: contain;
}
/*
* mobile scroll fix, with help from StackOverflow
* https://stackoverflow.com/a/60535925/387194
*/
.terminal-mobile.terminal-less .terminal-wrapper {
pointer-events: none;
}
.terminal-mobile.terminal-less .terminal-output a, .cmd-editable {
pointer-events: visible;
}
.cmd-editable::before {
content: attr(data-cmd-prompt);
display: inline-block;
}
.cmd-editable {
position: absolute;
top: 0;
top: calc(var(--terminal-y, var(--cmd-y, 0)) + var(--terminal-scroll, 0) * 1px);
right: 0;
left: 0;
bottom: 0;
bottom: calc(var(--terminal-scroll, 0) * -1px);
z-index: 500;
color: transparent;
background: transparent;
opacity: 0.01;
}
.terminal::-webkit-scrollbar {
width: 6px;
height: 6px;
background: var(--background, #000);
}
.terminal::-webkit-scrollbar-thumb {
background: var(--color, #aaa);
}
.terminal::-webkit-scrollbar-thumb:hover {
background: var(--color, #aaa);
}
.terminal {
scrollbar-color: #aaa #000;
scrollbar-color: var(--color, #aaa) var(--background, #000);
scrollbar-width: thin;
}
.cmd .token {
--original-color: var(--color);
}
.terminal .terminal-blink, .cmd .terminal-blink {
animation: terminal-ansi-blink 1s steps(2, start) infinite;
-webkit-animation: terminal-ansi-blink 1s steps(2, start) infinite;
}
@keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}
@-webkit-keyframes terminal-ansi-blink {
to {
color: var(--background);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,5 @@
#!/bin/bash
find . -type f -not -path './node_modules*' -a -not -path '*.git*' -a -not -path './coverage*' -a -not -path './bower_components*' | while read file; do
git check-ignore -q "$file" || echo "$file"
done

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdn.rawgit.com/jcubic/jquery.terminal/devel/js/jquery.terminal.min.js"></script>
<style>
body {
min-height: 100vh;
margin: 0;
}
</style>
<script>
(function() {
var url = 'https://cdn.rawgit.com/jcubic/jquery.terminal/devel/css/jquery.terminal.min.css';
var $ = jQuery.noConflict();
$('<link href="' + url + '" rel="stylesheet"/>').appendTo('head');
var importDoc = document.currentScript.ownerDocument;
var style = importDoc.querySelector('style');
document.head.appendChild(style);
window.terminal = function(selector) {
var args = [].slice.call(arguments, 1);
return $.fn.terminal.apply($(selector), args);
};
})();
</script>
</head>

@ -0,0 +1,113 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* utility that renders simple ascii table, like the one from mysql cli tool
* it was first created for leash shell https://leash.jcubic.pl
*
* usage:
*
* var arr = [[1,2,3,4,5], ["lorem", "ipsum", "dolor", "sit", "amet"]];
* term.echo(ascii_table(arr));
* // or
* term.echo(ascii_table(arr, true)); // this will render first row as header
*
* Copyright (c) 2018-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define, module, global, wcwidth, require */
(function(factory) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['wcwidth'], function(wcwidth) {
return (root.ascii_table = factory(wcwidth));
});
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory(require('wcwidth'));
} else {
root.ascii_table = factory(root.wcwidth);
}
})(function(wcwidth, undefined) {
var strlen = (function() {
if (typeof wcwidth === 'undefined') {
return function(string) {
return string.length;
};
} else {
return wcwidth;
}
})();
function ascii_table(array, header) {
if (!array.length) {
return '';
}
for (var i = array.length - 1; i >= 0; i--) {
var row = array[i];
var stacks = [];
for (var j = 0; j < row.length; j++) {
var new_lines = row[j].toString().replace(/\r/g).split("\n");
row[j] = new_lines.shift();
stacks.push(new_lines);
}
var stack_lengths = stacks.map(function(column) {
return column.length;
});
var new_rows_count = Math.max.apply(Math, stack_lengths);
for (var k = new_rows_count - 1; k >= 0; k--) {
array.splice(i + 1, 0, stacks.map(function(column) {
return column[k] || "";
}));
}
}
var lengths = array[0].map(function(_, i) {
var col = array.map(function(row) {
if (row[i] != undefined) {
var len = strlen(row[i]);
if (row[i].match(/\t/g)) {
// tab is 4 spaces
len += row[i].match(/\t/g).length*3;
}
return len;
} else {
return 0;
}
});
return Math.max.apply(Math, col);
});
// column padding
array = array.map(function(row) {
return '| ' + row.map(function(item, i) {
var size = strlen(item);
if (item.match(/\t/g)) {
// tab is 4 spaces
size += item.match(/\t/g).length*3;
}
if (size < lengths[i]) {
item += new Array(lengths[i] - size + 1).join(' ');
}
return item;
}).join(' | ') + ' |';
});
array = array.map(function(line) {
return line.replace(/&(?![^;]+;)/g, '&amp;');
});
var sep = '+' + lengths.map(function(length) {
return new Array(length + 3).join('-');
}).join('+') + '+';
if (header) {
return sep + '\n' + array[0] + '\n' + sep + '\n' +
array.slice(1).join('\n') + '\n' + sep;
} else {
return sep + '\n' + array.join('\n') + '\n' + sep;
}
}
return ascii_table;
});

@ -0,0 +1,172 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* Wrapper for options that will create autocomplete menu for jQuery Terminal
*
* Copyright (c) 2014-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (typeof window !== 'undefined') {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (typeof window !== 'undefined') {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
var jquery_terminal = $.fn.terminal;
$.fn.terminal = function(interpreter, options) {
function init(node) {
return jquery_terminal.call(node, interpreter, autocomplete_menu(options));
}
if (this.length > 1) {
return this.each(init.bind(null, this));
} else {
return init(this);
}
};
// -----------------------------------------------------------------------------------
// :: cancableble task for usage in comletion menu to ignore previous async completion
// -----------------------------------------------------------------------------------
function Task(fn) {
this._fn = fn;
}
Task.prototype.invoke = function() {
if (!this._cancel) {
this._fn.apply(null, arguments);
}
};
Task.prototype.cancel = function() {
this._cancel = true;
};
// -----------------------------------------------------------------------------------
// :: function return patched terminal settings
// -----------------------------------------------------------------------------------
function autocomplete_menu(options) {
if (options && !options.autocompleteMenu) {
return options;
}
var settings = options || {};
var last_task;
// -------------------------------------------------------------------------------
// :: function that do actuall matching and displaying of completion menu
// -------------------------------------------------------------------------------
function complete_menu(term, e, word, list) {
var matched = [];
var regex = new RegExp('^' + $.terminal.escape_regex(word));
for (var i = list.length; i--;) {
if (regex.test(list[i])) {
matched.unshift(list[i]);
}
}
if (e.which === 9) {
if (term.complete(matched)) {
word = term.before_cursor(true);
regex = new RegExp('^' + $.terminal.escape_regex(word));
}
}
if (word && matched.length) {
ul.hide();
for (i = 0; i < matched.length; ++i) {
var text = matched[i].replace(regex, '');
if (text) {
$('<li>' + text + '</li>').appendTo(ul);
}
}
ul.show();
}
}
var ul;
if (typeof settings.completion !== 'undefined') {
var onInit = settings.onInit || $.noop;
var keydown = settings.keydown || $.noop;
var completion = settings.completion;
delete settings.completion;
settings.onInit = function(term) {
onInit.call(this, term);
// init html menu element
var wrapper = this.cmd().find('.cmd-cursor').
wrap('<span/>').parent().addClass('cursor-wrapper');
ul = $('<ul></ul>').appendTo(wrapper);
ul.on('click', 'li', function() {
term.insert($(this).text());
ul.empty();
});
};
var timer;
settings.keydown = function(e, term) {
// setTimeout because terminal is adding characters in keypress
// we use keydown because we need to prevent default action
// for tab and still execute custom code
clearTimeout(timer);
timer = setTimeout(function() {
ul.empty();
var word = term.before_cursor(true);
if (last_task) {
last_task.cancel(); // ignore previous completion task
}
// we save task in closure for callbacks and promise::then
var task = last_task = new Task(complete_menu);
if (typeof completion === 'function') {
var ret = completion.call(term, word, function(list) {
task.invoke(term, e, word, list);
});
if (ret && typeof ret.then === 'function') {
ret.then(function(completion) {
task.invoke(term, e, word, completion);
});
} else if (ret instanceof Array) {
task.invoke(term, e, word, ret);
}
} else if (completion instanceof Array) {
task.invoke(term, e, word, completion);
}
}, 0);
var ret = keydown.call(this, e, term);
if (typeof ret !== 'undefined') {
return false;
}
if (e.which === 9) {
return false;
}
};
}
return settings;
}
});

@ -0,0 +1,110 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* Example plugin using JQuery Terminal Emulator
* Copyright (c) 2014-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory, undefined) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (window !== undefined) {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (window !== undefined) {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
$.extend_if_has = function(desc, source, array) {
for (var i = array.length; i--;) {
if (typeof source[array[i]] !== 'undefined') {
desc[array[i]] = source[array[i]];
}
}
return desc;
};
var defaults = Object.keys($.terminal.defaults).concat(['greetings']);
$.fn.dterm = function(interpreter, options) {
var op = $.extend_if_has({}, options, defaults);
op.enabled = false;
this.addClass('dterm');
var terminal = $('<div/>').appendTo(this).terminal(interpreter, op);
if (!options.title) {
options.title = 'JQuery Terminal Emulator';
}
var close = options.close || $.noop;
if (options.logoutOnClose) {
options.close = function() {
terminal.logout();
terminal.clear();
close();
};
} else {
options.close = function() {
terminal.disable();
close();
};
}
var self = this;
if (window.IntersectionObserver) {
var visibility_observer = new IntersectionObserver(function() {
if (self.is(':visible')) {
terminal.focus().resize();
} else {
terminal.disable();
}
}, {
root: null
});
visibility_observer.observe(terminal[0]);
}
this.dialog($.extend({}, options, {
open: function(event, ui) {
if (!window.IntersectionObserver) {
setTimeout(function() {
terminal.enable().resize();
}, 100);
}
if (typeof options.open === 'function') {
options.open(event, ui);
}
},
show: 'fade',
closeOnEscape: false
}));
self.terminal = terminal;
return self;
};
});

@ -0,0 +1,148 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* Monkey patch to add newlinew option for echo method inside jQuery Terminal
*
* Copyright (c) 2014-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (typeof window !== 'undefined') {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (typeof window !== 'undefined') {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
var init = $.fn.terminal;
$.fn.terminal = function(interpreter, options) {
return init.call(this, interpreter, patch_options(options)).each(function() {
patch_term($(this).data('terminal'), should_echo_command(options));
});
};
var last = null;
var prompt = null;
function should_echo_command(options) {
return options && options.echoCommand !== false || !options;
}
function patch_options(options) {
var keymap = {
'ENTER': function(e, original) {
var term = this;
if (last === null) {
if (should_echo_command(options)) {
term.echo_command();
}
} else {
this.__echo(last + prompt + this.get_command());
this.set_prompt(prompt);
last = null;
}
if (options && options.keymap && options.keymap.ENTER) {
options.keymap.ENTER.call(this, e, original);
} else {
original.call(this, e);
}
}
};
var settings = {
echoCommand: false,
keymap: $.extend({}, options && options.keymap || {}, keymap)
};
return $.extend({}, options || {}, settings);
}
function patch_term(term, echo_command) {
if (term.__echo) {
return term;
}
term.__echo = term.echo;
term.__exec = term.exec;
term.__set_prompt = term.set_prompt;
term.exec = function() {
last = null;
if (echo_command) {
this.settings().echoCommand = true;
}
var ret = term.__exec.apply(this, arguments);
if (echo_command) {
this.settings().echoCommand = false;
}
return ret;
};
term.echo = function(arg, options) {
var settings = $.extend({
newline: true
}, options);
function process(prompt) {
if (last === null) {
last = arg;
} else {
last += arg;
}
term.__set_prompt(last + prompt);
}
if (settings.newline === false) {
if (prompt === null) {
prompt = term.get_prompt();
}
if (typeof prompt === 'string') {
process(prompt);
} else {
prompt(process);
}
} else {
if (prompt !== null) {
term.__set_prompt(prompt);
}
if (last !== null) {
term.__echo(last + arg, options);
} else if (!arguments.length) {
// original echo check length to test if someone call echo
// with value that is undefined
term.__echo();
} else {
term.__echo(arg, options);
}
prompt = null;
last = null;
}
return term;
};
}
});

@ -0,0 +1,162 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* this is formatter for jQuery Terminal that add support for emoji
*
* Copyright (c) 2019-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory, undefined) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (window !== undefined) {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (window !== undefined) {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery, root.Prism);
}
})(function($, undefined) {
// https://2ality.com/2013/09/javascript-unicode.html
function toUTF16(codePoint) {
var TEN_BITS = parseInt('1111111111', 2);
function u(codeUnit) {
return '\\u' + codeUnit.toString(16).toUpperCase();
}
if (codePoint <= 0xFFFF) {
return u(codePoint);
}
codePoint -= 0x10000;
// Shift right to get to most significant 10 bits
var leadSurrogate = 0xD800 + (codePoint >> 10);
// Mask to get least significant 10 bits
var tailSurrogate = 0xDC00 + (codePoint & TEN_BITS);
return u(leadSurrogate) + u(tailSurrogate);
}
// compare two arrays of numbers
function compare_nums(a, b) {
for (var i = 0; i < a.length; ++i) {
if (a[1] === undefined) {
return 1;
}
if (b[i] === undefined) {
return -1;
}
if (a[i] > b[i]) {
return -1;
} else if (a[i] < b[i]) {
return 1;
}
}
return 0;
}
function make_formatter(unified, short_name) {
var unicode = unified.split('-').map(function(u) {
var x = parseInt(u, 16);
if (x > 0xFFFF) {
return toUTF16(x);
}
return '\\u' + u;
}).join('');
var re = new RegExp('(' + unicode + ')', 'g');
return [re, '[[;;;emoji ' + short_name + ']⻇]'];
}
// create array of numbers out of unified field
function parse_unified(str) {
return str.split('-').map(function(num) {
return parseInt(num, 16);
});
}
// emoji_data param need to be JavaScript object from
// https://unpkg.com/emoji-datasource-twitter/emoji.json
$.terminal.emoji = function(emoji_data) {
var text = {};
var names = [];
emoji_data.forEach(function(emoji) {
if (emoji.text && !text[emoji.text]) {
text[emoji.text] = emoji.short_name;
}
names.push(emoji.short_name);
});
// new API from version 1.10.0, old one with function will still work but
// if you need to use replacement that change length of the input text
// you need to use [regex, str] or function formatter where you use
// $.terminal.tracking_replace that returns [string, position] the same
// should be returned by formatter, optionally you can check if options
// have position
$.terminal.defaults.formatters.push([
new RegExp(':(' + names.map(function(name) {
return $.terminal.escape_regex(name);
}).join('|') + '):', 'g'),
'[[;;;emoji $1]⻇]'
]);
Object.keys(text).forEach(function(name) {
$.terminal.defaults.formatters.push([
new RegExp($.terminal.escape_regex(name), 'g'),
'[[;;;emoji ' + text[name] + ']⻇]'
]);
});
for (var i = 0; i < emoji_data.length; ++i) {
var emoji = emoji_data[i];
emoji.sort = parse_unified(emoji.unified);
}
emoji_data = emoji_data.sort(function(a, b) {
return compare_nums(a.sort, b.sort);
});
var formatters = [];
emoji_data.forEach(function(emoji) {
formatters.push(make_formatter(emoji.unified, emoji.short_name));
if (emoji.skin_variations) {
var variations = Object.keys(emoji.skin_variations).map(function(key, i) {
var unified = emoji.skin_variations[key].unified;
var short_name = emoji.short_name + '-var-' + i;
return make_formatter(unified, short_name);
});
formatters = formatters.concat(variations);
}
});
// this is unicode emoji handling
$.terminal.defaults.formatters.push(function(string, options) {
return $.terminal.apply_formatters(string, $.extend(options, {
formatters: formatters
}));
});
};
});

File diff suppressed because one or more lines are too long

@ -0,0 +1,2 @@
(function(c){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),e=0,h=0,f=0;a=c.event.fix(b);a.type="mousewheel";if(b.wheelDelta)e=b.wheelDelta/120;if(b.detail)e=-b.detail/3;f=e;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){f=0;h=-1*e}if(b.wheelDeltaY!==undefined)f=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,e,h,f);return(c.event.dispatch||c.event.handle).apply(this,i)}var d=["DOMMouseScroll","mousewheel"];if(c.event.fixHooks)for(var j=d.length;j;)c.event.fixHooks[d[--j]]=
c.event.mouseHooks;c.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=d.length;a;)this.addEventListener(d[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=d.length;a;)this.removeEventListener(d[--a],g,false);else this.onmousewheel=null}};c.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,680 @@
/*
* helper types
*/
type anyFunction = (...args: any[]) => any;
type StringOrNumber = string | number | null;
type JSONObject = {
[key: string]: TypeOrArray<StringOrNumber | boolean | JSONObject>
}
type renderHandlerOptions = {
update?: boolean;
line?: number;
}
type mapFunction = (key: string, value: anyFunction) => any;
type voidFunction = () => void;
type TypeOrArray<T> = T | T[];
type TypeOrString<T> = T | string;
type TypeOrPromise<T> = T | PromiseLike<T>;
declare namespace JQueryTerminal {
type interpreterFunction = (this: JQueryTerminal, command: string, term: JQueryTerminal) => any;
type terminalObjectFunction = (...args: (string | number | RegExp)[]) => (void | TypeOrPromise<echoValue>);
type Interpreter = string | interpreterFunction | ObjectInterpreter;
type ObjectInterpreter = {
[key: string]: ObjectInterpreter | terminalObjectFunction;
}
type RegExpReplacementFunction = (...args: string[]) => string;
type IterateFormattingArgument = {
count: number,
index: number,
formatting: string,
length: number,
text: boolean,
space: number
};
type IterateFormattingFunction = (data: IterateFormattingArgument) => void;
type strings = {
comletionParameters: string;
wrongPasswordTryAgain: string;
wrongPassword: string;
ajaxAbortError: string;
wrongArity: string;
commandNotFound: string;
oneRPCWithIgnore: string;
oneInterpreterFunction: string;
loginFunctionMissing: string;
noTokenError: string;
serverResponse: string;
wrongGreetings: string;
notWhileLogin: string;
loginIsNotAFunction: string;
canExitError: string;
invalidCompletion: string;
invalidSelector: string;
invalidTerminalId: string;
login: string;
password: string;
recursiveCall: string;
notAString: string;
redrawError: string;
invalidStrings: string;
defunctTerminal: string;
};
type ParsedCommand<T> = {
command: string;
name: string;
args: T[];
args_quotes: string[];
rest: string;
};
type size = {
width: number,
height: number
};
interface geometry {
terminal: size;
char: size;
cols: number;
rows: number;
}
type AnsiColorType = {
black: string;
red: string;
green: string;
yellow: string;
blue: string;
magenta: string;
cyan: string;
white: string;
}
type LessArgument = string | ((cols: number, cb: (text: string) => void) => void) | string[];
type ParsedOptions = {
_: string[];
[key: string]: boolean | string | string[];
};
type FormatterRegExpFunction = (...args: string[]) => string;
type FormaterRegExpReplacement = string | FormatterRegExpFunction;
type FormatterFunctionPropsInterface = {
__inherit__?: boolean;
__warn__?: boolean;
__meta__?: boolean;
};
type FormatterFunction = ((str: string, options?: JSONObject) => (string | [string, number])) & FormatterFunctionPropsInterface;
type FormatterArrayOptions = {
loop?: boolean;
echo?: boolean;
command?: boolean;
prompt?: boolean;
};
type Formatter = [RegExp, FormaterRegExpReplacement] | [RegExp, FormaterRegExpReplacement, FormatterArrayOptions] | FormatterFunction;
type keymapFunctionOptionalArg = (event: JQueryKeyEventObject, original?: keymapFunction) => any;
type keymapFunction<T = JQueryTerminal> = (this: T, event: JQueryKeyEventObject, original: keymapFunctionOptionalArg) => any;
type keymapObject<T = JQueryTerminal> = { [key: string]: keymapFunction<T> };
type keymapObjectOptionalArg = { [key: string]: keymapFunctionOptionalArg };
type commandsCmdFunction<T = Cmd> = (this: T, command: string) => any;
type echoValue = string | string[] | Element | JQuery<Element> | (() => string | string[]);
type errorArgument = string | (() => string) | PromiseLike<string>;
type setStringFunction = (value: string) => void;
type setEchoValueFunction = (value: TypeOrPromise<echoValue>) => void;
type greetingsArg = ((this: JQueryTerminal, setGreeting: setEchoValueFunction) => (void | TypeOrPromise<JQueryTerminal.echoValue>)) | string | null;
type cmdPrompt<T = Cmd> = ((this: Cmd, setPrompt: setStringFunction) => void) | string;
type ExtendedPrompt = ((this: JQueryTerminal, setPrompt: setStringFunction) => (void | PromiseLike<string>)) | string;
type pushOptions = {
infiniteLogin?: boolean;
prompt?: ExtendedPrompt;
login?: LoginArgument;
name?: string;
completion?: Completion;
}
type historyFilterFunction = (command: string) => boolean;
type historyFilter = null | RegExp | historyFilterFunction;
type KeyEventHandler<T = JQueryTerminal> = (this: T, event: JQueryKeyEventObject) => (boolean | void);
type ExceptionHandler = (this: JQueryTerminal, e: Error | TerminalException, label: string) => void;
type processRPCResponseFunction = (this: JQueryTerminal, result: JSONObject, term: JQueryTerminal) => void;
type ObjectWithThenMethod = {
then: () => any;
}
type SetLoginCallback = (token: string) => (void | ObjectWithThenMethod);
type LoginFunction = (username: string, password: string, cb: SetLoginCallback) => (void | ObjectWithThenMethod);
type LoginArgument = string | boolean | JQueryTerminal.LoginFunction;
type Completion = string[] | CompletionFunction | boolean;
type SetComplationCallback = (complation: string[]) => void;
type CompletionFunction = (this: JQueryTerminal, str: string, callback: SetComplationCallback) => void;
type EchoCommandCallback = (command: string) => void;
// all arguments are optional so you can use $.noop
type DoubleTabFunction = (this: JQueryTerminal, str: string, matched: string[], echoCmd: () => void) => (void | boolean);
type RPCErrorCallback = (this: JQueryTerminal, error: any) => void;
type RequestResponseCallback = (this: JQueryTerminal, xhr: JQuery.jqXHR, json: any, term: JQueryTerminal) => void;
type EchoEventFunction = (this: JQueryTerminal, div: JQuery<Element>) => void;
type EventCallback = (this: JQueryTerminal, term: JQueryTerminal) => (void | boolean);
type formatOptions = {
linksNoReferrer?: boolean;
anyLinks?: boolean;
char_width?: number;
linksNoFollow?: boolean;
allowedAttributes: string[];
escape: boolean;
};
type InterpreterItem = {
completion: "settings" | JQueryTerminal.Completion;
history?: boolean;
// all other interpreters are converted to function
interpreter: JQueryTerminal.interpreterFunction;
keydown?: KeyEventHandler<JQueryTerminal>;
keypress?: KeyEventHandler<JQueryTerminal>;
mask?: boolean | string;
infiniteLogin?: boolean;
prompt: ExtendedPrompt;
}
type PushPopCallback = (this: JQueryTerminal, before: JQueryTerminal.InterpreterItem, after: JQueryTerminal.InterpreterItem, term: JQueryTerminal) => void;
type Lines = Array<{ string: any, options: LineEchoOptions, index: number }>;
type View = {
focus: boolean;
mask: string | boolean;
prompt?: ExtendedPrompt;
command: string;
position: number;
lines: Lines;
interpreters?: Stack<InterpreterItem>;
history: string[];
}
type CompleteOptions = {
word?: boolean;
echo?: boolean;
escape?: boolean;
caseSensitive?: boolean;
echoCommand?: boolean;
doubleTab?: DoubleTabFunction;
}
type LineEchoOptions = {
exec: boolean;
unmount: JQueryTerminal.EchoEventFunction;
onClear: JQueryTerminal.EchoEventFunction;
finalize: JQueryTerminal.EchoEventFunction;
invokeMethods: boolean;
allowedAttributes: Array<RegExp | string>;
flush: boolean;
formatters: boolean;
keepWords: boolean;
raw: boolean;
newline?: boolean;
}
type EchoOptions = {
flush?: boolean;
raw?: boolean;
exec?: boolean;
invokeMethods?: boolean;
allowedAttributes?: Array<RegExp | string>;
unmount?: JQueryTerminal.EchoEventFunction;
onClear?: JQueryTerminal.EchoEventFunction;
finalize?: JQueryTerminal.EchoEventFunction;
keepWords?: boolean;
formatters?: boolean;
newline?: boolean;
}
interface History<T = string> {
new(name?: string, size?: number, memory?: boolean): History<T>;
append(item: T): void;
set(items: T[]): void;
data(): T[];
reset(): void;
last(): any;
end(): boolean;
position(): number;
current(): T;
next(): T | void;
previous(): T | void;
clear(): void;
enabled(): boolean;
enable(): void;
purge(): void;
disable(): void;
toggle(value?: boolean): void;
}
interface Stack<T> {
new(init?: T[]): Stack<T>;
data(): T[];
map(fn: (item: T, index?: number) => any): any[];
size(): number;
pop(): null | T;
push(): T;
top(): T;
clone(): Stack<T>;
}
interface Cycle<T> {
new(...args: T[]): Cycle<T>;
get(): T[];
index(): number;
rotate(): T | void;
length(): number;
remove(i: number): void;
set(item: T): void;
front(): void | T;
map(fn: (item: T, index: number) => any): any[];
forEach(fn: (item: T, index: number) => any): void;
append(item: T): void;
}
}
interface JQuery<TElement = HTMLElement> {
terminal(interpreter?: TypeOrArray<JQueryTerminal.Interpreter>, options?: TerminalOptions): JQueryTerminal;
resizer(arg: TypeOrString<anyFunction>): JQuery;
cmd(options?: CmdOptions): Cmd;
text_length(): number;
caret(pos?: number): number;
visible(): JQuery;
hidden(): JQuery;
// plugins
less(text: JQueryTerminal.LessArgument, options?: {
formatters?: boolean,
wrap?: boolean,
keepWords?: boolean
}): JQueryTerminal;
}
interface JQueryStatic {
omap(object: { [key: string]: anyFunction }, fn: mapFunction): { [key: string]: anyFunction };
jrpc(url: string, method: string, params: any[], success?: (json: JSONObject, status: string, jqxhr: JQuery.jqXHR) => void, error?: (jqxhr: JQuery.jqXHR, status: string) => void): void;
terminal: JQueryTerminalStatic;
}
interface JQueryTerminalStatic {
version: string,
data: string;
color_names: string[];
defaults: {
formatters: JQueryTerminal.Formatter[],
strings: JQueryTerminal.strings;
[key: string]: any;
};
History(name?: string, size?: number, memory?: boolean): JQueryTerminal.History<any>;
Stack(init?: any[]): JQueryTerminal.Stack<any>;
Cycle(...args: any[]): JQueryTerminal.Cycle<any>;
valid_color(color: string): boolean;
unclosed_strings(str: string): boolean;
escape_regex(str: string): string;
have_formatting(str: string): boolean;
is_formatting(str: string): boolean;
format_split(str: string): string[];
tracking_replace(str: string, rex: RegExp, replacement: string | JQueryTerminal.RegExpReplacementFunction, position: number): [string, number];
iterate_formatting(str: string, callback: (data: JSONObject) => void): void;
substring(str: string, start_index: number, end_index: number): string;
normalize(str: string): string;
split_equal(str: string, len: number, keep_words?: boolean): string[];
amp(str: string): string;
encode(str: string): string;
nested_formatting: JQueryTerminal.FormatterFunction;
escape_formatting(str: string): string;
/**
* if options have position it will return [string, display_position]
*/
apply_formatters(str: string, options: JSONObject): string | [string, number];
format(str: string, options?: JQueryTerminal.formatOptions): string;
escape_brackets(str: string): string;
unescape_brackets(str: string): string;
length(str: string): number;
columns(arr: string[], cols: number, space: number): string;
strip(str: string): string;
active(): JQueryTerminal | void;
last_id(): number;
parse_argument(arg: string, strict?: boolean): number | RegExp | string;
parse_arguments(str: string): Array<number | RegExp | string>;
split_arguments(str: string): string[];
parse_command(str: string): JQueryTerminal.ParsedCommand<number | RegExp | string>;
split_command(str: string): JQueryTerminal.ParsedCommand<string>;
parse_options(arg: string | string[], options?: { booleans: string[] }): JQueryTerminal.ParsedOptions;
extended_command(term: JQueryTerminal, str: string): void;
/**
* formatter is an object that can be used in RegExp functions
*/
formatter: any;
Exception: TerminalException;
/**
* plugins
*/
prism(lang: string, text: string): string;
prism_formatters: {
command: boolean,
echo: boolean,
prompt: boolean
},
syntax(lang: string): void;
pipe(obj: JQueryTerminal.ObjectInterpreter): JQueryTerminal.interpreterFunction;
// formatters
// unix formatting
overtyping: JQueryTerminal.FormatterFunction;
from_ansi: JQueryTerminal.FormatterFunction;
ansi_colors: {
normal: JQueryTerminal.AnsiColorType;
faited: JQueryTerminal.AnsiColorType;
bold: JQueryTerminal.AnsiColorType;
palette: string[];
};
// xml
xml_formatter: JQueryTerminal.FormatterFunction;
}
type TerminalException = {
new(typeOrMessage: string, message?: string, stack?: string): TerminalException;
message: string;
type: string;
stack?: string;
};
type CmdOptions = {
mask?: string | boolean;
caseSensitiveSearch?: boolean;
historySize?: number;
prompt?: JQueryTerminal.cmdPrompt;
enabled?: boolean;
history?: boolean | "memory";
tabs?: number;
onPositionChange?: (position: number, display_position: number) => void;
clickTimeout?: number;
holdTimeout?: number;
holdRepeatTimeout?: number;
mobileIngoreAutoSpace?: string[];
repeatTimeoutKeys?: string[];
onPaste?: (this: Cmd, value: string) => TypeOrPromise<string | Blob> | void;
width?: number;
historyFilter?: JQueryTerminal.historyFilter;
commands?: JQueryTerminal.commandsCmdFunction;
char_width?: number;
onCommandChange?: (this: Cmd, command: string) => void;
name?: string;
keypress?: JQueryTerminal.KeyEventHandler<Cmd>;
keydown?: JQueryTerminal.KeyEventHandler<Cmd>;
tabindex?: number;
mobileDelete?: boolean;
}
type CmdOption = "mask" | "caseSensitiveSearch" | "historySize" | "prompt" | "enabled" |
"history" | "tabs" | "onPositionChange" | "clickTimeout" | "holdTimeout" | "onPaste" |
"holdRepeatTimeout" | "repeatTimeoutKeys" | "width" | "historyFilter" | "commands" |
"char_width" | "onCommandChange" | "name" | "keypress" | "keydown" | "mobileDelete";
// we copy methods from jQuery to overwrite it
// see: https://github.com/Microsoft/TypeScript/issues/978
interface Cmd<TElement = HTMLElement> extends JQuery<TElement> {
option(name: CmdOption, value: any): Cmd;
option(name: CmdOption): any;
name(name: string): Cmd;
name(): string;
purge(): Cmd;
history(): JQueryTerminal.History<string>;
delete(count: number, stay?: boolean): string;
set(command: string, stay?: boolean, silent?: boolean): Cmd;
keymap(shortcut: string, callback: JQueryTerminal.keymapFunction<Cmd>): Cmd;
keymap(shortcut: string): JQueryTerminal.keymapFunctionOptionalArg;
keymap(arg: JQueryTerminal.keymapObject<Cmd>): Cmd;
keymap(): JQueryTerminal.keymapObjectOptionalArg;
insert(value: string, stay?: boolean): Cmd;
/* jQuery types */
get(index: number): TElement;
get(): TElement[];
get<T extends string>(): T;
commands(fn: JQueryTerminal.commandsCmdFunction): Cmd;
commands(): JQueryTerminal.commandsCmdFunction<void>;
destroy(): Cmd;
invoke_key(shortcut: string): Cmd;
column(include_prompt: boolean): number;
prompt(prompt: JQueryTerminal.cmdPrompt): Cmd;
prompt(last_render: true): string;
prompt<T extends JQueryTerminal.cmdPrompt<void>>(): T;
kill_text(): string;
position(): JQueryCoordinates;
position<T extends number>(): number;
position(value: number, silent?: boolean): Cmd;
refresh(): Cmd;
display_position(): number;
display_position(value: number): Cmd;
visible(): Cmd;
//jQuery methods
show(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): this;
show(duration: JQuery.Duration, easing_complete: string | ((this: TElement) => void)): this;
show(duration_complete_options?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions<TElement>): this;
show(): Cmd;
// jQuery methods
resize(handler?: JQuery.TypeEventHandler<TElement, null, TElement, TElement, 'resize'> |
false): this;
// jQuery Terminal method
resize(num_chars?: number): Cmd;
enable(): Cmd;
isenabled(): boolean;
disable(focus?: boolean): Cmd;
mask(mask: boolean | string): Cmd;
mask<T extends boolean | string>(): T;
}
type TerminalOption = "prompt" | "name" | "history" | "exit" | "clear" | "enabled" | "maskCHar" |
"wrap" | "checkArity" | "invokeMethods" | "anyLinks" | "raw" | "keymap" | "exceptionHandler" |
"pauseEvents" | "softPause" | "memory" | "cancelableAjax" | "processArguments" | "onCommandChange" |
"linksNoReferrer" | "javascriptLinks" | "processRPCResponse" | "completionEscape" | "convertLinks" |
"unixFormattingEscapeBrackets" | "extra" | "tabs" | "historySize" | "greetings" | "scrollObject" |
"historyState" | "importHistory" | "historyFilter" | "echoCommand" | "scrollOnEcho" | "login" |
"outputLimit" | "onAjaxError" | "pasteImage" | "scrollBottomOffset" | "wordAutocomplete" |
"caseSensitiveAutocomplete" | "caseSensitiveSearch" | "clickTimeout" | "holdTimeout" |
"holdRepeatTimeout" | "request" | "describe" | "onRPCError" | "doubleTab" | "completion" |
"onInit" | "onClear" | "onBlur" | "onFocus" | "onExit" | "onTerminalChange" | "onPush" | "onPaste" |
"onPop" | "keypress" | "keydown" | "onAfterRedraw" | "onEchoCommand" | "onFlush" | "strings" |
"repeatTimeoutKeys" | "allowedAttributes" | "doubleTabEchoCommand" | "mobileIngoreAutoSpace" |
"onBeforeCommand" | "onAfterCommand" | "onBeforeLogout" | "onAfterLogout" | "onBeforeLogin" |
"onAfterLogin" | "onBeforeEcho" | "onAfterEcho" | "autocompleteMenu" | "mobileDelete" | "renderHandler" | "pipe" | "redirets";
type TerminalOptions = {
prompt?: JQueryTerminal.ExtendedPrompt;
name?: string;
history?: boolean;
exit?: boolean;
clear?: boolean;
enabled?: boolean;
maskCHar?: string;
pipe?: boolean;
redirects?: {[key:string]: JQueryTerminal.terminalObjectFunction};
wrap?: boolean;
checkArity?: boolean;
invokeMethods?: boolean;
anyLinks?: boolean;
raw?: boolean;
allowedAttributes?: Array<RegExp | string>;
tabindex?: number;
keymap?: JQueryTerminal.keymapObject;
exceptionHandler?: null | JQueryTerminal.ExceptionHandler;
pauseEvents?: boolean;
softPause?: boolean;
memory?: boolean;
cancelableAjax?: boolean;
processArguments?: boolean;
linksNoReferrer?: boolean;
javascriptLinks?: boolean;
processRPCResponse?: null | JQueryTerminal.processRPCResponseFunction;
completionEscape?: boolean;
convertLinks?: boolean;
unixFormattingEscapeBrackets?: boolean; // provided by unix_formatting
extra?: any;
tabs?: number;
historySize?: number;
greetings?: JQueryTerminal.greetingsArg;
scrollObject?: null | JQuery.Selector | HTMLElement | JQuery;
historyState?: boolean;
importHistory?: boolean;
historyFilter?: JQueryTerminal.historyFilter;
echoCommand?: boolean;
scrollOnEcho?: boolean;
login?: JQueryTerminal.LoginArgument;
outputLimit?: number;
pasteImage?: boolean;
scrollBottomOffset?: boolean;
wordAutocomplete?: boolean;
caseSensitiveAutocomplete?: boolean;
caseSensitiveSearch?: boolean;
clickTimeout?: number;
holdTimeout?: number;
holdRepeatTimeout?: number;
repeatTimeoutKeys?: string[];
mobileIngoreAutoSpace?: string[];
request?: JQueryTerminal.RequestResponseCallback;
response?: JQueryTerminal.RequestResponseCallback;
describe?: string | false;
onRPCError?: JQueryTerminal.RPCErrorCallback;
doubleTab?: JQueryTerminal.DoubleTabFunction;
doubleTabEchoCommand?: boolean;
completion?: JQueryTerminal.Completion;
keypress?: JQueryTerminal.KeyEventHandler;
keydown?: JQueryTerminal.KeyEventHandler;
renderHandler?: (this: JQueryTerminal, obj: any, opts: renderHandlerOptions, term: JQueryTerminal) => (void | string | Element | JQuery<Element> | false);
onAjaxError?: (this: JQueryTerminal, xhr: JQuery.jqXHR, status: string, error: string) => void;
onFocus?: JQueryTerminal.EventCallback;
onInit?: JQueryTerminal.EventCallback;
onClear?: JQueryTerminal.EventCallback;
onBlur?: JQueryTerminal.EventCallback;
onExit?: JQueryTerminal.EventCallback;
onPop?: JQueryTerminal.PushPopCallback;
onTerminalChange?: JQueryTerminal.EventCallback;
onPush?: JQueryTerminal.PushPopCallback;
onAfterRedraw?: JQueryTerminal.EventCallback;
onEchoCommand?: (this: JQueryTerminal, div: JQuery, command: string, term: JQueryTerminal) => void;
onFlush?: JQueryTerminal.EventCallback;
onPaste?: (this: JQueryTerminal, value: string) => TypeOrPromise<string | Blob> | void;
onCommandChange?: (this: JQueryTerminal, command: string, term: JQueryTerminal) => void;
onPositionChange?: (this: JQueryTerminal, position: number, display_position: number, term: JQueryTerminal) => void;
onBeforeCommand?: (this: JQueryTerminal, command: string) => (boolean | void);
onAfterCommand?: (this: JQueryTerminal, command: string) => void;
onBeforeLogout?: (this: JQueryTerminal) => (boolean | void);
onAfterLogout?: (this: JQueryTerminal) => void;
onBeforeLogin?: (this: JQueryTerminal, user: string, tokenOrPass: string) => (boolean | void);
onAfterLogin?: (this: JQueryTerminal, user: string, token: string) => void;
onBeforeEcho?: (this: JQueryTerminal, value: JQueryTerminal.echoValue) => (boolean | void);
onAfterEcho?: (this: JQueryTerminal, value: JQueryTerminal.echoValue) => void;
autocompleteMenu?: boolean;
mobileDelete?: boolean;
strings?: JQueryTerminal.strings;
height?: number;
}
interface JQueryTerminal<TElement = HTMLElement> extends JQuery<TElement> {
set_command(command: string): JQueryTerminal;
id(): number;
clear(): JQueryTerminal;
export_view(): JQueryTerminal.View;
import_view(view: JQueryTerminal.View): JQueryTerminal;
save_state(command?: string, ignore_hash?: boolean, index?: number): JQueryTerminal;
exec(command: string, silent?: boolean, deferred?: JQuery.Deferred<void>): JQuery.Promise<void>;
autologin(user: string, token: string, silent?: boolean): JQueryTerminal;
// there is success and error callbacks because we call this function from terminal and auth function can
// be created by user
login(auth: JQueryTerminal.LoginFunction, infinite?: boolean, success?: () => void, error?: () => void): JQueryTerminal;
settings(): any; // we use any because option types have optional values that will throw error when used
before_cursor(word?: boolean): string;
complete(commands: string[], options?: JQueryTerminal.CompleteOptions): boolean;
commands(): JQueryTerminal.interpreterFunction;
set_interpreter(interpreter: TypeOrArray<JQueryTerminal.Interpreter>, login?: JQueryTerminal.LoginArgument): JQueryTerminal;
greetings(): JQueryTerminal;
paused(): boolean;
pause(): JQueryTerminal;
resume(): JQueryTerminal;
cols(): number;
rows(): number;
geometry(): JQueryTerminal.geometry;
history(): JQueryTerminal.History<string>;
history_state(toggle: boolean): JQueryTerminal;
clear_history_state(): JQueryTerminal;
next(selector?: JQuery.Selector): this;
next(): JQueryTerminal;
focus(handler?: JQuery.TypeEventHandler<TElement, null, TElement, TElement, 'focus'> | false): this;
focus(toggle?: boolean): JQueryTerminal;
freeze(toggle?: boolean): JQueryTerminal;
frozen(): boolean;
enable(silent?: boolean): JQueryTerminal;
disable(silent?: boolean): JQueryTerminal;
enabled(): boolean;
signature(): string;
version(): string;
cmd(): Cmd;
get_command(): string;
set_command(cmd: string, silent?: boolean): JQueryTerminal;
set_position(pos: number, relative?: boolean): JQueryTerminal;
get_position(): number;
insert(str: string, stay?: boolean): JQueryTerminal;
set_prompt(prompt: JQueryTerminal.ExtendedPrompt): JQueryTerminal;
get_prompt<T extends JQueryTerminal.ExtendedPrompt>(): T;
set_mask(toggle?: boolean | string): JQueryTerminal;
get_output<T extends JQueryTerminal.Lines | string[]>(raw?: boolean): T;
resize(handler?: JQuery.TypeEventHandler<TElement, null, TElement, TElement, 'resize'> | false): this;
resize(width?: number, height?: number): JQueryTerminal;
refresh(): JQueryTerminal;
flush(options?: { update?: boolean, scroll?: boolean }): JQueryTerminal;
update(line: number, str: string, options?: JQueryTerminal.EchoOptions): JQueryTerminal;
// options for remove_line is useless but that's how API look like
remove_line(line: number): JQueryTerminal;
last_index(): number;
echo<TValue = JQueryTerminal.echoValue>(arg: TypeOrPromise<TValue>, options?: JQueryTerminal.EchoOptions): JQueryTerminal;
error(arg: JQueryTerminal.errorArgument, options?: JQueryTerminal.EchoOptions): JQueryTerminal;
exception<T extends Error>(e: T, label?: string): JQueryTerminal;
scroll(handler?: JQuery.TypeEventHandler<TElement, null, TElement, TElement, 'scroll'> | false): this;
scroll(amount: number): JQueryTerminal;
logout(local?: boolean): JQueryTerminal;
token<T extends string | void>(local?: boolean): T;
set_token(token?: string, local?: boolean): JQueryTerminal;
get_token<T extends string | void>(local?: boolean): T;
login_name<T extends string | void>(local?: boolean): T;
name(): string;
prefix_name(local?: boolean): string;
read(message: string, success?: (result: string) => void, cancel?: voidFunction): JQuery.Promise<string>;
push(interpreter: TypeOrArray<JQueryTerminal.Interpreter>, options?: JQueryTerminal.pushOptions): JQueryTerminal;
pop(echoCommand?: string, silent?: boolean): JQueryTerminal;
option(options: TerminalOptions | TerminalOption, value?: any): any;
invoke_key(shortcut: string): JQueryTerminal;
keymap(shortcut: string, callback: JQueryTerminal.keymapFunction): JQueryTerminal;
keymap(shortcut: string): JQueryTerminal.keymapFunctionOptionalArg;
keymap(arg: JQueryTerminal.keymapObject): JQueryTerminal;
keymap(): JQueryTerminal.keymapObjectOptionalArg;
//keymap<T extends JQueryTerminal.keymapObject | JQueryTerminal.keymapFunctionOptionalArg | JQueryTerminal>(keymap?: JQueryTerminal.keymapObject | string, fn?: JQueryTerminal.keymapFunction): T;
level(): number;
reset(): JQueryTerminal;
purge(): JQueryTerminal;
destroy(): JQueryTerminal;
scroll_to_bottom(): JQueryTerminal;
is_bottom(): boolean;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,545 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* This is example of how to create less like command for jQuery Terminal
* the code is based on the one from leash shell and written as jQuery plugin
*
* Copyright (c) 2018-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory, undefined) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (window !== undefined) {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (window !== undefined) {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
var img_split_re = /(\[\[(?:[^;]*@[^;]*);[^;]*;[^\]]*\]\s*\])/;
var img_re = /\[\[(?:[^;]*@[^;]*);[^;]*;[^;]*;[^;]*;([^;]*)\] ?\]/;
// -------------------------------------------------------------------------
function find(arr, fn) {
for (var i in arr) {
if (fn(arr[i])) {
return arr[i];
}
}
}
// -------------------------------------------------------------------------
// $.when is always async we don't want that for normal non images
// -------------------------------------------------------------------------
function unpromise(args, fn) {
var found = find(args, function(arg) {
return typeof arg.then === 'function';
});
if (found) {
return $.when.apply($, args).then(fn);
} else {
return fn.apply(null, args);
}
}
// -------------------------------------------------------------------------
// slice images into terminal lines - each line is unique blob url
function slice_image(img_data, width, y1, y2) {
// render slice on canvas and get Blob Data URI
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = width;
canvas.height = y2 - y1;
ctx.putImageData(img_data, 0, 0);
var defer = $.Deferred();
canvas.toBlob(function(blob) {
if (blob === null) {
defer.resolve(null);
} else {
defer.resolve(URL.createObjectURL(blob));
}
});
return defer.promise();
}
function slice(src, options) {
var settings = $.extend({
width: null,
line_height: null
}, options);
var img = new Image();
var defer = $.Deferred();
var slices = [];
img.onload = function() {
var height, width;
if (settings.width < img.width) {
height = Math.floor((img.height * settings.width) / img.width);
width = settings.width;
} else {
height = img.height;
width = img.width;
}
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
// scale the image to fit the terminal
ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);
(function recur(start) {
// loop over slices
if (start < height) {
var y1 = start, y2 = start + settings.line_height;
if (y2 > height) {
y2 = height;
}
var img_data = ctx.getImageData(0, y1, width, y2);
slice_image(img_data, width, y1, y2).then(function(uri) {
slices.push(uri);
recur(y2);
});
} else {
defer.resolve(slices);
}
})(0);
};
img.onerror = function() {
defer.reject('Error loading the image: ' + src);
};
// images need to have CORS if on different server,
// without this it will throw error
img.crossOrigin = "anonymous";
img.src = src;
return defer.promise();
}
// -----------------------------------------------------------------------------------
function less(term, text, options) {
var export_data = term.export_view();
var cols, rows;
var pos = 0;
var original_lines;
var lines;
var prompt = '';
var left = 0;
var $output = term.find('.terminal-output');
var had_cache = term.option('useCache');
if (!had_cache) {
term.option('useCache', true);
}
var cmd = term.cmd();
var scroll_by = 3;
//term.on('mousewheel', wheel);
var in_search = false, last_found, search_string;
// -------------------------------------------------------------------------------
function print() {
// performance optimization
term.find('.terminal-output').css('visibilty', 'hidden');
term.clear();
if (lines.length - pos > rows - 1) {
prompt = ':';
} else {
prompt = '[[;;;cmd-inverted](END)]';
}
term.set_prompt(prompt);
var to_print = lines.slice(pos, pos + rows - 1);
var should_substring = options.wrap ? false : to_print.filter(function(line) {
var len = $.terminal.length(line);
return len > cols;
}).length;
if (should_substring) {
to_print = to_print.map(function(line) {
return $.terminal.substring(line, left, left + cols - 1);
});
}
if (to_print.length < rows - 1) {
while (rows - 1 > to_print.length) {
to_print.push('~');
}
}
term.echo(to_print.join('\n'));
if (term.find('.terminal-output').is(':empty')) {
// sometimes the output is not flushed not idea why
// TODO: investigate
term.flush();
}
}
// -------------------------------------------------------------------------------
function quit() {
term.pop().import_view(export_data);
clear_cache();
term.removeClass('terminal-less');
$output.css('height', '');
var exit = options.exit || options.onExit;
if ($.isFunction(exit)) {
exit();
}
}
// -------------------------------------------------------------------------------
var cache = {};
function clear_cache() {
if (!had_cache) {
term.option('useCache', false).clear_cache();
}
Object.keys(cache).forEach(function(width) {
Object.keys(cache[width]).forEach(function(img) {
cache[width][img].forEach(function(uri) {
URL.revokeObjectURL(uri);
});
});
});
cache = {};
}
// -------------------------------------------------------------------------------
function fixed_output() {
// this will not change on resize, but the font size may change
var height = cmd.outerHeight(true);
term.addClass('terminal-less');
$output.css('height', 'calc(100% - ' + height + 'px)');
}
// -------------------------------------------------------------------------------
function refresh_view() {
cols = term.cols();
rows = term.rows();
fixed_output();
function cont(l) {
original_lines = process_optional_wrap(l);
lines = original_lines.slice();
if (in_search) {
search(last_found);
} else {
print();
}
}
function process_optional_wrap(arg) {
if (arg instanceof Array) {
if (options.wrap) {
arg = arg.join('\n');
return $.terminal.split_equal(arg, cols, options.keepWords);
}
return arg;
} else if (options.wrap) {
return $.terminal.split_equal(arg, cols, options.keepWords);
} else {
return [arg];
}
}
function run(arg) {
var text;
if (arg instanceof Array) {
if (options.formatters) {
text = arg.join('\n');
} else {
original_lines = arg;
}
} else {
text = arg;
}
if (text) {
if (options.formatters) {
text = $.terminal.apply_formatters(text);
} else {
// prism text will be boken when there are nestings (xml)
// and empty formattings
text = $.terminal.nested_formatting(text);
text = $.terminal.normalize(text);
}
unpromise([image_formatter(text)], cont);
} else {
unpromise(original_lines.map(image_formatter), function() {
var l = Array.prototype.concat.apply([], arguments);
cont(l);
});
}
}
if ($.isFunction(text)) {
text(cols, run);
} else {
run(text);
}
}
// -------------------------------------------------------------------------------
function cursor_size() {
var cursor = term.find('.cmd-cursor')[0];
return cursor.getBoundingClientRect();
}
// -------------------------------------------------------------------------------
function image_formatter(text) {
var defer = $.Deferred();
if (!text.match(img_re)) {
return text.split('\n');
}
var parts = text.split(img_split_re).filter(Boolean);
var result = [];
(function recur() {
function concat_slices(slices) {
cache[width][img] = slices;
result = result.concat(slices.map(function(uri) {
return '[[@;;;;' + uri + ']]';
}));
recur();
}
if (!parts.length) {
return defer.resolve(result);
}
var part = parts.shift();
var m = part.match(img_re);
if (m) {
var img = m[1];
var rect = cursor_size();
var width = term.width();
var opts = {
width: width,
line_height: Math.floor(rect.height)
};
cache[width] = cache[width] || {};
if (cache[width][img]) {
concat_slices(cache[width][img]);
} else {
slice(img, opts).then(concat_slices).catch(function() {
var msg = $.terminal.escape_brackets('[BROKEN IMAGE]');
var cls = 'terminal-broken-image';
result.push('[[;#c00;;' + cls + ']' + msg + ']');
recur();
});
}
} else {
if (part !== '\n') {
result = result.concat(part.split('\n'));
}
recur();
}
})();
return defer.promise();
}
// -------------------------------------------------------------------------------
function search(start, reset) {
var escape = $.terminal.escape_brackets(search_string);
var flag = search_string.toLowerCase() === search_string ? 'i' : '';
var start_re = new RegExp('^(' + escape + ')', flag);
var index = -1;
var prev_format = '';
var formatting = false;
var in_text = false;
var count = 0;
lines = original_lines.slice();
if (reset) {
index = pos = 0;
}
for (var i = start; i < lines.length; ++i) {
var line = lines[i];
for (var j = 0, jlen = line.length; j < jlen; ++j) {
if (line[j] === '[' && line[j + 1] === '[') {
formatting = true;
in_text = false;
start = j;
} else if (formatting && line[j] === ']') {
if (in_text) {
formatting = false;
in_text = false;
} else {
in_text = true;
prev_format = line.substring(start, j + 1);
}
} else if (formatting && in_text || !formatting) {
if (line.substring(j).match(start_re)) {
var rep;
if (formatting && in_text) {
var style = prev_format.match(/\[\[([^;]+)/);
var new_format = ';;;terminal-inverted';
style = style ? style[1] : '';
if (style.match(/!/)) {
new_format = style + new_format + ';';
new_format += prev_format.replace(/]$/, '')
.split(';').slice(4).join(';');
}
rep = '][[' + new_format + ']$1]' + prev_format;
} else {
rep = '[[;;;terminal-inverted]$1]';
}
line = line.substring(0, j) +
line.substring(j).replace(start_re, rep);
j += rep.length - 2;
if (i >= pos && index === -1) {
index = pos = i;
}
count++;
}
}
}
lines[i] = line;
}
print();
term.set_command('');
term.set_prompt(prompt);
if (count === 1) {
return -1;
}
return index;
}
// -------------------------------------------------------------------------------
function scroll(delta, scroll_by) {
if (delta > 0) {
pos -= scroll_by;
if (pos < 0) {
pos = 0;
}
} else {
pos += scroll_by;
if (pos - 1 > lines.length - rows) {
pos = lines.length - rows + 1;
}
}
print();
return false;
}
term.push($.noop, {
onResize: refresh_view,
touchscroll: function(event, delta) {
var offset = Math.abs(delta);
scroll(delta, Math.round(offset / 14));
return false;
},
onPaste: function() {
if (term.get_prompt() !== '/') {
return false;
}
},
mousewheel: function(event, delta) {
return scroll(delta, scroll_by);
},
name: 'less',
keydown: function(e) {
var command = term.get_command();
var key = e.key.toUpperCase();
if (term.get_prompt() !== '/') {
if (key === '/') {
term.set_prompt('/');
} else if (in_search &&
$.inArray(e.which, [78, 80]) !== -1) {
if (key === 'N') { // search_string
if (last_found !== -1) {
var ret = search(last_found + 1);
if (ret !== -1) {
last_found = ret;
}
}
} else if (key === 'P') {
last_found = search(0, true);
}
} else if (key === 'Q') {
quit();
} else if (key === 'ARROWRIGHT') {
if (!options.wrap) {
left += Math.round(cols / 2);
print();
}
} else if (key === 'ARROWLEFT') {
if (!options.wrap) {
left -= Math.round(cols / 2);
if (left < 0) {
left = 0;
}
print();
// scroll
}
} else if (lines.length > rows) {
if (key === 'ARROWUP') { //up
if (pos > 0) {
--pos;
print();
}
} else if (key === 'ARROWDOWN') { //down
if (pos <= lines.length - rows) {
++pos;
print();
}
} else if (key === 'PAGEDOWN') {
pos += rows - 1;
var limit = lines.length - rows + 1;
if (pos > limit) {
pos = limit;
}
print();
} else if (key === 'PAGEUP') {
//Page Down
pos -= rows - 1;
if (pos < 0) {
pos = 0;
}
print();
}
}
if (!e.ctrlKey && !e.alKey) {
return false;
}
// search
} else if (e.which === 8 && command === '') {
// backspace
term.set_prompt(prompt);
} else if (e.which === 13) { // enter
// basic search find only first
if (command.length > 0) {
in_search = true;
pos = 0;
search_string = command;
last_found = search(0);
}
// this will disable history
return false;
}
},
prompt: prompt
});
// -------------------------------------------------------------------------------
refresh_view();
}
// -----------------------------------------------------------------------------------
$.fn.less = function(text, options) {
var settings = $.extend({
onExit: $.noop,
formatters: false
}, options);
if (!(this instanceof $.fn.init && this.terminal)) {
throw new Error('This plugin require jQuery Terminal');
}
var term = this.terminal();
if (!term) {
throw new Error(
'You need to invoke this plugin on selector that have ' +
'jQuery Terminal or on jQuery Terminal instance'
);
}
less(term, text, settings);
return term;
};
});

@ -0,0 +1,456 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* This is object enchancment that will add pipe operator and redirects to commands
*
* Copyright (c) 2014-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (typeof window !== 'undefined') {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (typeof window !== 'undefined') {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
// -----------------------------------------------------------------------------------
// :: split over array - returns array of arrays
// -----------------------------------------------------------------------------------
function array_split(array, splitter) {
var test_fn;
if (typeof splitter === 'function') {
test_fn = splitter;
} else if (splitter instanceof RegExp) {
test_fn = function(item) {
if (item instanceof RegExp) {
item = item.source;
} else if (typeof item !== 'string') {
item = item.toString();
}
var m = item.match(splitter);
if (m) {
if (m.length > 1) {
return m.slice(1);
}
return true;
}
};
} else {
test_fn = function(item) {
return splitter === item;
};
}
var output = [];
var sub = [];
array.forEach(function(item, i) {
var check = test_fn(item, i);
if (check) {
output.push(sub);
sub = [];
if (check instanceof Array) {
output.push(check);
}
} else {
sub.push(item);
}
});
output.push(sub);
return output;
}
// -----------------------------------------------------------------------------------
function is_function(obj) {
return typeof obj === 'function';
}
// -----------------------------------------------------------------------------------
$.terminal.defaults.strings.pipeNestedInterpreterError = 'You can\'t pipe nested ' +
'interpreter';
// -----------------------------------------------------------------------------------
$.terminal.pipe = function pipe(interpreter, options) {
var settings = $.extend({
processArguments: true,
overwrite: undefined,
redirects: {}
}, options);
var overwrite_buffer;
var term;
var orig;
var command_index;
var process_redirect = false;
// -------------------------------------------------------------------------------
function parse_redirect(args, re) {
var redirects = [];
if (args.length) {
var cmd_redirect, settings_redirect;
for (var i = 0; i < args.length; ++i) {
var operator = null;
if (args[i].length === 1 && args[i][0].match(re)) {
operator = args[i][0];
}
if (operator) {
for (var j = settings.redirects.length; j--;) {
if (operator === settings.redirects[j].name) {
settings_redirect = settings.redirects[j];
break;
}
}
cmd_redirect = {
fn: settings_redirect.callback,
args: []
};
redirects.push(cmd_redirect);
} else {
cmd_redirect.args = args[i];
}
}
}
return redirects;
}
// -------------------------------------------------------------------------------
function is_pipe(cmd) {
var quotes = [''].concat(cmd.args_quotes);
return function(string, i) {
return string === '|' && !quotes[i];
};
}
// -------------------------------------------------------------------------------
function tokens(cmd) {
return [cmd.name].concat(cmd.args);
}
// -------------------------------------------------------------------------------
function parse_command(command) {
var cmd;
if (term.settings().processArguments) {
cmd = $.terminal.parse_command(command);
} else {
cmd = $.terminal.split_command(command);
}
var index = 1;
return array_split(tokens(cmd), is_pipe(cmd)).map(function(args, i) {
var result = {
redirects: []
};
var len = args.length;
if (settings.redirects.length) {
var redirect_names = settings.redirects.map(function(redirect) {
return $.terminal.escape_regex(redirect.name);
});
var re = new RegExp('^(' + redirect_names.join('|') + ')$');
var split_args = array_split(args, re);
if (split_args.length > 1) {
args = split_args[0];
result.redirects = parse_redirect(split_args.slice(1), re);
}
}
if (i === 0) {
result.args_quotes = args.map(function(_, i) {
return cmd.args_quotes[i];
});
} else {
result.args_quotes = args.map(function(_, i) {
return cmd.args_quotes[i + index];
}).slice(1);
}
index += len;
result.name = args[0];
result.args = args.slice(1);
return result;
});
}
// -------------------------------------------------------------------------------
function overwrite(command) {
return command.overwrite === true ||
typeof command.overwrite === 'undefined' ||
settings.overwrite === true;
}
// -------------------------------------------------------------------------------
function redirects(command) {
var defer = $.Deferred();
if (overwrite(command)) {
overwrite_buffer = true;
}
function resolve() {
overwrite_buffer = false;
defer.resolve();
}
if (command.redirects.length) {
var i = 0;
(function loop() {
var redirect = command.redirects[i++];
if (redirect) {
var fn = redirect.fn;
var args = redirect.args;
continuation(fn.apply(term, args), function(value) {
echo_non_empty(value);
loop();
}, 'redirect loop');
} else {
resolve();
}
})();
} else {
resolve();
}
return defer.promise();
}
// -------------------------------------------------------------------------------
function continuation(promise, callback) {
if (promise && promise.then) {
promise.then(callback);
return promise;
} else {
callback();
}
}
// -------------------------------------------------------------------------------
function echo_non_empty(value) {
if (typeof value !== 'undefined') {
term.echo(value);
}
}
// -------------------------------------------------------------------------------
function single_command(commands) {
return commands.length === 1 && !commands[0].redirects.length;
}
// -------------------------------------------------------------------------------
function make_tty() {
var tty = {
read: function(message, callback) {
// in case we return read() call from interpreter
// we can't access force_awake flag in term (it's invoked later)
if (term.paused()) {
term.resume();
}
if ((command_index === 0 && !tty.buffer) || process_redirect) {
term.push = orig.push;
term.echo = orig.echo;
var ret = orig.read.apply(term, arguments);
return ret.then(function(value) {
term.push = tty.push;
term.echo = tty.echo;
return value;
});
} else {
var text;
if (tty.buffer) {
text = tty.buffer.replace(/\n$/, '');
delete tty.buffer;
}
var d = new $.Deferred();
if (is_function(callback)) {
callback(text);
}
d.resolve(text);
return d.promise();
}
},
echo: function(string) {
if (overwrite_buffer) {
overwrite_buffer = false;
tty.buffer = '';
}
tty.buffer = (tty.buffer || '') + string + '\n';
},
push: function() {
this.error(strings(this).pipeNestedInterpreterError);
}
};
return tty;
}
// -------------------------------------------------------------------------------
function strings(term) {
var term_settings = term.settings();
return $.extend(
{},
$.terminal.defaults.strings,
term_settings && term_settings.strings || {}
);
}
// -------------------------------------------------------------------------------
function error(message) {
var echo = term.echo;
term.echo = orig.echo;
term.error(message);
term.echo = echo;
}
// -------------------------------------------------------------------------------
function unparse(string) {
if (term.settings().processArguments) {
return string.replace(/(['"()])/g, '\\$1');
} else {
return string.replace(/ /g, '\\ ');
}
}
// -------------------------------------------------------------------------------
function stringify(cmd) {
return cmd.name + ' ' + cmd.args.map(function(arg, i) {
if (cmd.args_quotes[i]) {
var quote = cmd.args_quotes[i];
return quote + unparse(arg) + quote;
}
return arg.replace(/ /g, '\\ ');
}).join(' ');
}
// -------------------------------------------------------------------------------
return function(command, t) {
command_index = -1;
term = t; // for echo_non_empty and function that call it
var term_settings = term.settings();
if (!orig) {
orig = {
echo: term.echo,
read: term.read,
push: term.push
};
}
var tty = make_tty();
var commands = parse_command(command);
function loop(callback) {
var i = 0;
var d = new $.Deferred();
return (function inner() {
var cmd = commands[i++];
if (cmd) {
process_redirect = true;
redirects(cmd).then(function() {
process_redirect = false;
if (!commands[i]) {
$.extend(term, {echo: orig.echo, push: orig.push});
}
command_index++;
var ret = callback(cmd);
if (ret === false) {
return inner();
} else {
return continuation(ret, inner, 'inner');
}
});
} else {
d.resolve();
}
return d.promise();
})();
}
if (single_command(commands)) {
var cmd = commands[0];
if (is_function(interpreter)) {
return interpreter.call(term, stringify(cmd), term);
} else if (is_function(interpreter[cmd.name])) {
return interpreter[cmd.name].apply(term, cmd.args);
} else if ($.isPlainObject(interpreter[cmd.name])) {
term.push(interpreter[cmd.name], {
prompt: cmd.name + '> ',
name: cmd.name,
completion: Object.keys(interpreter[cmd.name])
});
} else if (is_function(term_settings.onCommandNotFound)) {
term_settings.onCommandNotFound.call(term, command, term);
} else {
error(sprintf(strings(term).commandNotFound, cmd.name));
}
} else {
$.extend(term, tty);
var stop_error = false;
var promise = loop(function(cmd) {
var ret;
if (is_function(interpreter)) {
// this branch will be always invoked with new API
// using pipe option
var str = stringify(cmd);
// this resume and exec is needed for rpc
// because it use pause/resume and not promises
// TODO: refactor RPC in terminal
term.resume();
ret = term.exec(str, true);
return continuation(ret, echo_non_empty);
} else {
var inter = interpreter[cmd.name];
if (is_function(inter)) {
ret = inter.apply(term, cmd.args);
return continuation(ret, echo_non_empty);
} else {
if ($.isPlainObject(inter)) {
error(strings(term).pipeNestedInterpreterError);
} else if (is_function(term_settings.onCommandNotFound)) {
if (!stop_error) {
term_settings.onCommandNotFound.call(
term,
command,
term
);
stop_error = true;
}
} else {
error(sprintf(strings(term).commandNotFound, cmd.name));
}
return false;
}
}
});
return promise.then(function() {
$.extend(term, orig);
});
}
};
};
// -------------------------------------------------------------------------
var init = $.fn.terminal;
$.fn.terminal = function(interpreter, options) {
if (options && options.pipe) {
var settings = $.extend({}, options, {
onInit: function() {
var defer = $.Deferred();
if (options && options.pipe) {
var interpreter = $.terminal.pipe(this.commands(), options);
this.set_interpreter(interpreter).then(defer.resolve);
} else {
defer.resolve();
}
if (options && is_function(options.onInit)) {
var self = this;
defer.then(function() {
options.onInit.call(self, self);
});
}
}
});
}
return init.call(this, interpreter, settings || options);
};
});

@ -0,0 +1,220 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* this is utility that monkey patch Prism functions to output
* terminal formatting (it was first created here https://codepen.io/jcubic/pen/zEyxjJ)
*
* usage:
*
* you need to include both css and js (it need to be before this file)
*
* js code:
*
* code = $.terminal.escape_brackets(code);
* code = $.terminal.prism(language, code);
*
* term.echo(code); // or term.less(code) if you include less.js
*
* you can also use helper that will create formatter
*
* $.terminal.syntax(language);
*
* there is one extra language 'website' that format html with script and style tags
*
* by default only javascript markup and css languages are defined (also file extension
* for them. To have more languages you need to include appropriate js files.
*
* Copyright (c) 2018-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory, undefined) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'prismjs', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery, Prism) {
if (Prism === undefined) {
Prism = require('prismjs');
}
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (window !== undefined) {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (window !== undefined) {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery, Prism);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery, root.Prism);
}
})(function($, Prism) {
var Token = Prism.Token;
if (typeof Prism === 'undefined') {
throw new Error('PrismJS not defined');
}
var _ = $.extend({}, Prism);
_.Token = function() {
Token.apply(this, [].slice.call(arguments));
};
_.Token.stringify = function(o, language, parent) {
if (typeof o === 'string') {
return o;
}
if (_.util.type(o) === 'Array') {
return o.map(function(element) {
return _.Token.stringify(element, language, o);
}).join('');
}
var env = {
content: _.Token.stringify(o.content, language, parent),
tag: 'span',
classes: ['token', o.type],
attributes: {},
language: language,
parent: parent
};
if (env.type === 'comment') {
env.attributes['spellcheck'] = 'true';
}
if (o.alias) {
var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
Array.prototype.push.apply(env.classes, aliases);
}
_.hooks.run('wrap', env);
return env.content.split(/\n/).map(function(content) {
if (content) {
// escape nested non formatting
// so you can use like <script>alert("[[;red;]xxxx]");</script>
var parts = content.split(format_split_re).filter(Boolean);
content = parts.map(function(string) {
if (!string.match(/^\x00/)) {
return $.terminal.escape_brackets(string).replace(/\\/g, '&#92;');
}
return string;
}).join('');
return '\x00\x00\x00\x00[[b;;;' + env.classes.join(' ') + ']' +
content + '\x00\x00\x00\x00]';
}
return '';
}).join('\n');
};
if (!$) {
throw new Error('jQuery Not defined');
}
if (!$.terminal) {
throw new Error('$.terminal is not defined');
}
// we use 0x00 character so we know which one of the formatting came from prism
// so we can escape the reset because we unescape original values, the values
// need to be escape in cmd plugin so you can't type in formatting
/* eslint-disable */
var format_split_re = /(\x00\x00\x00\x00(?:\[\[[!gbiuso]*;[^;]*;[^\]]*\](?:[^\]\\]*(\\\\)*\\\][^\]]*|[^\]]*|[^[]*\[[^\]]*)\]?|\]))/i;
/* eslint-enable */
function should_render(options) {
if (!options || !Object.keys(options).length) {
return true;
}
var props = Object.keys($.terminal.prism_formatters);
for (var i = props.length; i--;) {
var prop = props[i];
if (options[prop] === true && $.terminal.prism_formatters[prop] === true) {
return true;
}
}
return false;
}
$.terminal.prism = function prism(language, string, options) {
if (!should_render(options)) {
return string;
}
if (language === 'website') {
var re = /(<\/?\s*(?:script|style)[^>]*>)/g;
var style;
var script;
return string.split(re).filter(Boolean).map(function(string) {
if (script) {
script = false;
return $.terminal.prism('javascript', string);
} else if (style) {
style = false;
return $.terminal.prism('css', string);
}
if (string.match(/^<script/)) {
script = true;
} else if (string.match(/^<style/)) {
style = true;
}
return $.terminal.prism('html', string);
}).join('');
}
if (language && _.languages[language]) {
string = $.terminal.unescape_brackets(string);
var grammar = _.languages[language];
var tokens = _.tokenize(string, grammar);
string = _.Token.stringify(tokens, language);
string = string.split(format_split_re).filter(Boolean).map(function(string) {
if (string.match(/^\x00/)) {
return string.replace(/\x00/g, '');
}
return $.terminal.escape_brackets(string);
}).join('');
}
return string;
};
$.terminal.prism_formatters = {
echo: true,
command: true
};
$.terminal.syntax = function syntax(language) {
// we create function with name so we will see it in developer tools
// we bind jQuery as argument so it will work when jQuery with noConflict
// is added after this script
var name = 'syntax_' + language;
var fn = new Function('$', 'return function ' + name +
'(string, options) { return $.terminal.prism("' + language +
'", string, options); }')($);
fn.__no_warn__ = true;
var formatters = $.terminal.defaults.formatters;
$.terminal.defaults.formatters = formatters.filter(function(formatter) {
if (typeof formatter !== 'function') {
return true;
}
return formatter.name !== name;
});
// disable warning because it may create nested formatting
$.terminal.new_formatter(fn);
};
});

@ -0,0 +1,50 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/ version {{VER}}
*
* This file is part of jQuery Terminal. https://terminal.jcubic.pl
*
* Copyright (c) 2010-2021 Jakub T. Jankiewicz <https://jcubic.pl/m>e
* Released under the MIT license
*/
/* global jQuery */
(function() {
function get(url) {
var element;
if (url.match(/css$/)) {
element = document.createElement('link');
element.setAttribute('href', url);
element.setAttribute('rel', 'stylesheet');
} else if (url.match(/js$/)) {
element = document.createElement('script');
element.setAttribute('src', url);
}
console.log(element);
return new Promise(function(resolve, reject) {
console.log(element);
if (element) {
element.onload = resolve;
var head = document.querySelector('head');
head.appendChild(element);
} else {
reject();
}
});
}
var terminals = window.terminals || [];
if (typeof jQuery === 'undefined') {
get('http://code.jquery.com/jquery-3.5.0.min.js').then(function() {
jQuery.noConflict();
get('https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/{{VER}}/css/jquery.terminal.min.css');
return get('https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/{{VER}}/js/jquery.terminal.min.js');
}).then(function() {
terminals.forEach(function(spec) {
jQuery.fn.terminal.apply(jQuery(spec[0]), spec.slice(1));
});
});
}
})();

@ -0,0 +1,50 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/ version 2.22.0
*
* This file is part of jQuery Terminal. https://terminal.jcubic.pl
*
* Copyright (c) 2010-2021 Jakub T. Jankiewicz <https://jcubic.pl/m>e
* Released under the MIT license
*/
/* global jQuery */
(function() {
function get(url) {
var element;
if (url.match(/css$/)) {
element = document.createElement('link');
element.setAttribute('href', url);
element.setAttribute('rel', 'stylesheet');
} else if (url.match(/js$/)) {
element = document.createElement('script');
element.setAttribute('src', url);
}
console.log(element);
return new Promise(function(resolve, reject) {
console.log(element);
if (element) {
element.onload = resolve;
var head = document.querySelector('head');
head.appendChild(element);
} else {
reject();
}
});
}
var terminals = window.terminals || [];
if (typeof jQuery === 'undefined') {
get('http://code.jquery.com/jquery-3.5.0.min.js').then(function() {
jQuery.noConflict();
get('https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.22.0/css/jquery.terminal.min.css');
return get('https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.22.0/js/jquery.terminal.min.js');
}).then(function() {
terminals.forEach(function(spec) {
jQuery.fn.terminal.apply(jQuery(spec[0]), spec.slice(1));
});
});
}
})();

File diff suppressed because it is too large Load Diff

@ -0,0 +1,86 @@
/**@license
* __ _____ ________ __
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
* \/ /____/
* http://terminal.jcubic.pl
*
* This is example of how to create custom formatter for jQuery Terminal
*
* Copyright (c) 2014-2021 Jakub Jankiewicz <https://jcubic.pl/me>
* Released under the MIT license
*
*/
/* global define */
(function(factory) {
var root = typeof window !== 'undefined' ? window : global;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
// istanbul ignore next
define(['jquery', 'jquery.terminal'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function(root, jQuery) {
if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if (typeof window !== 'undefined') {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
if (!jQuery.fn.terminal) {
if (typeof window !== 'undefined') {
require('jquery.terminal');
} else {
require('jquery.terminal')(jQuery);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser
// istanbul ignore next
factory(root.jQuery);
}
})(function($) {
if (!$.terminal) {
throw new Error('$.terminal is not defined');
}
// this formatter allow to echo xml where tags are colors like:
// <red>hello <navy>blue</navy> world</red>
function xml_formatter(string) {
var stack = [];
var output = [];
var parts = string.split(/(<\/?[a-zA-Z]+>)/);
for (var i = 0; i < parts.length; ++i) {
if (parts[i][0] === '<') {
if (parts[i][1] === '/') {
if (stack.length) {
stack.pop();
}
} else {
stack.push(parts[i].replace(/^<|>$/g, ''));
}
} else {
if (stack.length) {
// top of the stack
output.push('[[;' + stack[stack.length - 1] + ';]');
}
output.push(parts[i]);
if (stack.length) {
output.push(']');
}
}
}
return output.join('');
}
$.terminal.xml_formatter = xml_formatter;
$.terminal.new_formatter(xml_formatter);
});

File diff suppressed because it is too large Load Diff

@ -0,0 +1,128 @@
#!/usr/bin/env node
var https = require('https');
var path = require('path');
var fs = require('fs');
var argv = require('optimist').argv;
var request = require('request');
function split_equal(array, length) {
var result = [];
var len = array.length;
if (len < length) {
return [array];
} else if (length < 0) {
throw new Error("split_equal: length can't be negative");
}
for (var i = 0; i < len; i += length) {
result.push(array.slice(i, i + length));
}
return result;
}
function get(url, query) {
var options = {
url: url,
qs: query,
headers: {
'User-Agent': 'Node.js'
}
};
if (argv.auth) {
var [user,pass] = argv.auth.split(':');
options.auth = {
user,
pass
};
}
//return;
return new Promise(function(resolve, reject) {
request(options, function(error, res, body) {
if (res.statusCode == 200) {
resolve(JSON.parse(body));
} else if (+res.headers['x-ratelimit-remaining'] == 0) {
var date = new Date(+res.headers['x-ratelimit-reset']*1000);
reject('Rate limit util ' + date);
} else {
reject('Error code ' + res.statusCode);
}
});
});
}
function get_file(filename) {
return new Promise(function(resolve, reject) {
fs.readFile(filename, function(err, data) {
if (err) {
reject(err);
} else {
resolve(JSON.parse(data.toString()));
}
});
});
}
function get_api(argv) {
var user = argv.u;
var repo = argv.r;
var path = '/repos/' + user + '/' + repo + '/contributors';
var query = {
"per_page": 100
};
if (argv.t) {
query['access_token'] = argv.t;
}
return get('https://api.github.com' + path, query).then(function(contributors) {
return Promise.all(contributors.map(function(contributor) {
var path = contributor.url.replace(/https:\/\/[^\/]+/, '');
return get('https://api.github.com' + path, query).then(function(user) {
if (user.name || user.login) {
var object = {
name: user.name || user.login
};
if (user.email) {
object.email = user.email;
}
if (user.blog) {
object.url = user.blog;
} else {
object.url = "https://github.com/" + user.login
}
object.avatar = contributor.avatar_url;
object.login = user.login;
return object;
}
});
}).filter(Boolean));
});
}
if ((argv.f && argv.m) || (argv.u && argv.r)) {
(argv.f ? get_file(argv.f) : get_api(argv)).then(function(contributors) {
if (argv.m) {
var split = split_equal(contributors, 7);
var align = new Array(split[0].length + 1).join('| :---: ') + ' |';
var rows = split.map(function(list) {
return '| ' + list.map(function(contributor) {
return '[<img src="' + contributor.avatar + '" width="100px;"/>' +
'<br /><sub>' + contributor.name + '</sub>](' +
contributor.url + ')<br>[commits](https://github.com/jcubic' +
'/jquery.terminal/commits?author=' + contributor.login + ')';
}).join(' | ') + ' |';
});
rows.splice(1, 0, align);
console.log(rows.join('\n'));
} else {
console.log(JSON.stringify(contributors, null, 2));
}
}).catch(function(error) {
console.log('ERROR: ' + error);
});
} else {
var script = path.basename(process.argv[1]);
console.log('usage: \n' + script + '-u <user> -r <repo> ' +
'[--auth githubUsername:githubPassword] [-m]\n' +
script + ' -f <json filename> -m');
}

@ -0,0 +1,36 @@
var fs = require('fs');
var nano = require('cssnano');
var input = process.argv[2];
var output = process.argv[3];
var options = {
preset: "default",
map: {
inline: false
},
discardUnused: false,
from: input,
to: output
};
function error(err) {
if (err) {
if (err.message && typeof err.showSourceCode === 'function') {
console.error(err.message);
console.error(err.showSourceCode());
} else {
console.error(err);
}
process.exit(1);
}
}
fs.readFile(input, function(err, buffer) {
nano.process(String(buffer), options).then(function(result) {
fs.writeFile(output, result.css, function(err) {
error(err);
fs.writeFile(output + '.map', result.map.toString(), error);
});
}).catch(error);
});

@ -0,0 +1,46 @@
#!/usr/bin/node
/*
* script print terminal methods. it require esprima.
*
* To get list of functions, not covered by tests, use:
*
* methods | while read method; do
* grep $method spec/terminalSpec.js > /dev/null || echo $method;
* done
*
* if you want to find methods not in documentation use www/api_reference.php
* instead of spec/terminalSpec.js
*/
var fs = require('fs');
var esprima = require('esprima');
fs.readFile('js/jquery.terminal-src.js', function(err, file) {
var syntax = esprima.parse(file.toString());
traverse(syntax, function(obj) {
if (obj.callee && obj.callee.property && obj.callee.property.name == 'omap' &&
obj.callee.type == 'MemberExpression') {
var methods = [];
if (obj.arguments[0].properties) {
obj.arguments[0].properties.map(function(prop) {
console.log(prop.key.name);
});
return false;
}
}
});
function traverse(obj, fn) {
for (var key in obj) {
if (obj[key] !== null && fn(obj[key]) === false) {
return false;
}
if (typeof obj[key] == 'object' && obj[key] !== null) {
if (traverse(obj[key], fn) === false) {
return false;
}
}
}
}
});

@ -0,0 +1,37 @@
#!/usr/bin/env node
const http = require('https');
const url = require('url');
const emoji = require('emoji-datasource-twitter');
if (process.argv.length === 3) {
console.log([
'/*',
' * Autogenerated by mkemoji script from jQuery Terminal',
' * Copyright (C) Jakub T. Jankiewicz <https://jcubic.pl>',
' * ship with version: ' + process.argv[2],
' * build: ' + new Date().toUTCString(),
' */'].join('\n'));
function make_emoji(class_name, url) {
var selector = [
'.terminal-output .emoji.' + class_name,
'.cmd .emoji.' + class_name].join(',');
return `${selector}{background-image:url(${url});}`;
}
var base = 'https://unpkg.com/emoji-datasource-twitter/img/twitter/64/';
emoji.map(function(emoji) {
var url = base + emoji.image;
// escape special characters in class name
// https://mathiasbynens.be/notes/css-escapes
var class_name = emoji.short_name.replace(/\+/g, '\\+')
.replace(/^(\d)/i, '\\3$1 ');
console.log(make_emoji(class_name, url));
if (emoji.skin_variations) {
Object.values(emoji.skin_variations).forEach((emoji, i) => {
var url = base + emoji.image;
var var_class_name = `${class_name}-var-${i}`;
console.log(make_emoji(var_class_name, url));
});
}
});
}

@ -0,0 +1,3 @@
#!/bin/bash
# print missing options in documentation
grep -oE 'settings\.[^;, ().?:]+' js/jquery.terminal-src.js | sort | uniq | while read setting; do grep `echo $setting | sed -e 's/settings.//'` ../www/api_reference.php.in > /dev/null || echo $setting; done

@ -0,0 +1,40 @@
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var argv = require('optimist').argv;
function usage(error) {
if (error) {
console.error(error);
}
console.log('usage: \n' + path.basename(process.argv[1]) +
' -f <package-json-file>' +
' -j <Contributor JSON file>');
}
if (argv.f && argv.j) {
fs.readFile(argv.j, function(err, data) {
if (err) {
return usage(err);
}
var contributors = JSON.parse(data.toString());
fs.readFile(argv.f, function(err, data) {
if (err) {
return usage(err);
}
var _package = JSON.parse(data.toString());
_package.contributors = contributors.map(function(user) {
const { name, url } = user;
return { name, url };
});
fs.writeFile(argv.f, JSON.stringify(_package, null, 2) + '\n', 'utf8', function(err) {
if (err) {
return usage(err);
}
});
});
});
} else {
usage();
}

@ -0,0 +1,14 @@
#!/bin/bash
input=$1
marker=$2
file=$3
CONTRIBUTORS=`./scripts/contributors.js -f $input -m | tr '\n' '☺'`
if echo "$CONTRIBUTORS" | grep ERROR > /dev/null; then
echo "$CONTRIBUTORS" | tr '☺' '\n'
else
cat $file | sed -n "/${marker}-START/{p;:a;N;/${marker}-END/!ba;s%.*\n%${CONTRIBUTORS}%};p" | tr '☺' '\n' > README.tmp
cp README.tmp $file
rm README.tmp
fi

@ -0,0 +1,154 @@
VERSION={{VERSION}}
SED=sed
CD=cd
NPM=npm
CP=cp
RM=rm
CAT=cat
DATE=`date -uR`
GIT=git
BRANCH=`git branch | grep '^*' | sed 's/* //'`
UGLIFY=../node_modules/.bin/uglifyjs
JSONLINT=./node_modules/.bin/jsonlint
JEST=./node_modules/.bin/jest
CSSNANO=node ./scripts/cssnano.js
ESLINT=./node_modules/.bin/eslint
TSC=./node_modules/.bin/tsc
SPEC_CHECKSUM=`md5sum __tests__/terminal.spec.js | cut -d' ' -f 1`
COMMIT=`git log -n 1 | grep '^commit' | sed 's/commit //'`
TOKEN=cat .github.token | tr -d '\n'
URL=`git config --get remote.origin.url`
skip_re="[xfi]it\\(|[fdx]describe\\("
UPDATE_CONTRIBUTORS=0
.PHONY: coverage test coveralls lint.src eslint skipped_tests jsonlint publish lint tscheck publish-guthub emoji
ALL: Makefile .$(VERSION) terminal.jquery.json bower.json package.json js/jquery.terminal-$(VERSION).js js/jquery.terminal.js js/jquery.terminal-$(VERSION).min.js js/jquery.terminal.min.js js/jquery.terminal.min.js.map css/jquery.terminal-$(VERSION).css css/jquery.terminal-$(VERSION).min.css css/jquery.terminal.min.css css/jquery.terminal.min.css.map css/jquery.terminal.css README.md import.html js/terminal.widget.js css/emoji.css update-contributors
bower.json: templates/bower.in .$(VERSION)
$(SED) -e "s/{{VER}}/$(VERSION)/g" templates/bower.in > bower.json
package.json: templates/package.in .$(VERSION)
$(SED) -e "s/{{VER}}/$(VERSION)/g" templates/package.in > package.json
js/jquery.terminal-$(VERSION).js: js/jquery.terminal-src.js .$(VERSION)
$(GIT) branch | grep '* devel' > /dev/null && $(SED) -e "s/{{VER}}/DEV/g" -e "s/{{DATE}}/$(DATE)/g" js/jquery.terminal-src.js > js/jquery.terminal-$(VERSION).js || $(SED) -e "s/{{VER}}/$(VERSION)/g" -e "s/{{DATE}}/$(DATE)/g" js/jquery.terminal-src.js > js/jquery.terminal-$(VERSION).js
js/jquery.terminal.js: js/jquery.terminal-$(VERSION).js
$(CP) js/jquery.terminal-$(VERSION).js js/jquery.terminal.js
js/jquery.terminal-$(VERSION).min.js: js/jquery.terminal.min.js
$(CP) js/jquery.terminal.min.js js/jquery.terminal-$(VERSION).min.js
js/jquery.terminal.min.js js/jquery.terminal.min.js.map: js/jquery.terminal-$(VERSION).js
$(CD) js && $(UGLIFY) -o jquery.terminal.min.js --comments --mangle --source-map "includeSources,url='jquery.terminal.min.js.map'" -- jquery.terminal.js
css/jquery.terminal-$(VERSION).css: css/jquery.terminal-src.css .$(VERSION)
$(GIT) branch | grep '* devel' > /dev/null && $(SED) -e "s/{{VER}}/DEV/g" -e "s/{{DATE}}/$(DATE)/g" css/jquery.terminal-src.css > css/jquery.terminal-$(VERSION).css || $(SED) -e "s/{{VER}}/$(VERSION)/g" -e "s/{{DATE}}/$(DATE)/g" css/jquery.terminal-src.css > css/jquery.terminal-$(VERSION).css
css/jquery.terminal.css: css/jquery.terminal-$(VERSION).css .$(VERSION)
$(CP) css/jquery.terminal-$(VERSION).css css/jquery.terminal.css
css/jquery.terminal.min.css css/jquery.terminal.min.css.map: css/jquery.terminal.css
$(CSSNANO) css/jquery.terminal.css css/jquery.terminal.min.css
css/jquery.terminal-$(VERSION).min.css: css/jquery.terminal.min.css
$(CP) css/jquery.terminal.min.css css/jquery.terminal-$(VERSION).min.css
README.md: templates/README.in .$(VERSION) __tests__/terminal.spec.js
$(GIT) branch | grep '* devel' > /dev/null && $(SED) -e "s/{{VER}}/DEV/g" -e \
"s/{{BRANCH}}/$(BRANCH)/g" -e "s/{{CHECKSUM}}/$(SPEC_CHECKSUM)/" \
-e "s/{{COMMIT}}/$(COMMIT)/g" < templates/README.in > README.md || $(SED) -e \
"s/{{VER}}/$(VERSION)/g" -e "s/{{BRANCH}}/$(BRANCH)/g" -e \
"s/{{CHECKSUM}}/$(SPEC_CHECKSUM)/" -e "s/{{COMMIT}}/$(COMMIT)/g" < templates/README.in > README.md
.$(VERSION): Makefile
touch .$(VERSION)
Makefile: templates/Makefile.in
$(SED) -e "s/{{VER""SION}}/"$(VERSION)"/" templates/Makefile.in > Makefile
import.html: templates/import.in
$(SED) -e "s/{{BRANCH}}/$(BRANCH)/g" templates/import.in > import.html
js/terminal.widget.js: js/terminal.widget.in .$(VERSION)
$(SED) -e "s/{{VER}}/$(VERSION)/g" js/terminal.widget.in > js/terminal.widget.js
terminal.jquery.json: manifest .$(VERSION)
$(SED) -e "s/{{VER}}/$(VERSION)/g" manifest > terminal.jquery.json
css/emoji.css: ./scripts/mkemoji .$(VERSION)
./scripts/mkemoji $(VERSION) > css/emoji.css
emoji:
./scripts/mkemoji $(VERSION) > css/emoji.css
test:
$(JEST) --coverage --testMatch '**/__tests__/*.spec.js'
test-accept-snapshots:
$(JEST) --coverage --updateSnapshot --testMatch '**/__tests__/*.spec.js'
coveralls:
$(CAT) ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
lint.src:
$(ESLINT) js/jquery.terminal-src.js
eslint:
$(ESLINT) js/jquery.terminal-src.js
$(ESLINT) js/dterm.js
$(ESLINT) js/xml_formatting.js
$(ESLINT) js/unix_formatting.js
$(ESLINT) js/prism.js
$(ESLINT) js/less.js
$(ESLINT) js/emoji.js
$(ESLINT) js/pipe.js
$(ESLINT) js/autocomplete_menu.js
$(ESLINT) js/echo_newline.js
skipped_tests:
@! grep -E $(skip_re) __tests__/terminal.spec.js
tscheck:
$(TSC) --noEmit --project tsconfig.json
jsonlint: package.json bower.json
$(JSONLINT) -cq package.json
$(JSONLINT) -cq bower.json
publish:
test -e npm && ( $(CD) npm && $(GIT) pull ) || true
test -e npm || $(GIT) clone $(URL) --depth 1 npm
$(CD) npm && $(NPM) publish && $(CD) .. && $(RM) -rf npm
publish-guthub: .github.token
$(SED) "s/{{TOKEN}}/`$(TOKEN)`/" templates/npmrc.tmpl > .npmrc
$(SED) -e "s/{{VER}}/$(VERSION)/g" templates/package.git > package.json
contributors.json:
./scripts/contributors.js -u jcubic -r jquery.terminal > contributors.json
contributors-www.json:
./scripts/contributors.js -u jcubic -r jquery.terminal-www > contributors-www.json
contributors: contributors-www.json contributors.json
./scripts/update-contributors-readme contributors.json "CONTRIBUTORS" templates/README.in
./scripts/update-contributors-readme contributors-www.json "CONTRIBUTORS-WWW" templates/README.in
./scripts/update-contributors-readme contributors-www.json "CONTRIBUTORS" www/README.md
./scripts/update-contributors-package.js -j contributors.json -f templates/package.in
./scripts/update-contributors-package.js -j contributors.json -f templates/package.git
lint: eslint jsonlint
checkout:
@git status | sed "1,/not staged/d" | grep modified | sed "s/.*modified:\s*\(.*\)/\1/" | tr '\n' ' ' | sed -e "s/.*/git checkout &; touch &/" | bash
update-contributors:
@if [ $(UPDATE_CONTRIBUTORS) = 1 ]; then\
echo -e "\x1b[31mUpdate Contributors\x1b[m";\
if [ $(BRANCH) = 'master' ]; then \
false;\
fi;\
fi

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdn.rawgit.com/jcubic/jquery.terminal/{{BRANCH}}/js/jquery.terminal.min.js"></script>
<style>
body {
min-height: 100vh;
margin: 0;
}
</style>
<script>
(function() {
var url = 'https://cdn.rawgit.com/jcubic/jquery.terminal/{{BRANCH}}/css/jquery.terminal.min.css';
var $ = jQuery.noConflict();
$('<link href="' + url + '" rel="stylesheet"/>').appendTo('head');
var importDoc = document.currentScript.ownerDocument;
var style = importDoc.querySelector('style');
document.head.appendChild(style);
window.terminal = function(selector) {
var args = [].slice.call(arguments, 1);
return $.fn.terminal.apply($(selector), args);
};
})();
</script>
</head>

@ -0,0 +1,7 @@
//npm.pkg.github.com/:_authToken={{TOKEN}}
@jcubic:registry=https://npm.pkg.github.com/
init.author.name=Jakub T. Jankiewicz
init.author.email=jcubic@onet.pl
init.author.url=https://jcubic.pl/jakub-jankiewicz/

@ -0,0 +1,169 @@
{
"name": "@jcubic/jquery.terminal",
"version": "{{VER}}",
"description": "jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications.",
"main": "js/jquery.terminal.js",
"typings": "js/jquery.terminal.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/jcubic/jquery.terminal.git"
},
"keywords": [
"terminal",
"emulator",
"prompt",
"console",
"keyboard",
"type",
"rpc",
"input",
"ui"
],
"scripts": {
"test": "make test"
},
"author": {
"name": "Jakub Jankiewicz",
"email": "jcubic@onet.pl",
"url": "https://jcubic.pl/me"
},
"contributors": [
{
"name": "Jakub T. Jankiewicz",
"url": "https://jcubic.pl/me"
},
{
"name": "Zuo Qiyang",
"url": "http://zuoqy.com"
},
{
"name": "Marcel Link",
"url": "https://github.com/ml1nk"
},
{
"name": "Sébastien Warin",
"url": "http://sebastien.warin.fr"
},
{
"name": "Christopher John Ryan",
"url": "https://github.com/ChrisJohnRyan"
},
{
"name": "Johan",
"url": "https://github.com/johanjordaan"
},
{
"name": "Florian Schäfer",
"url": "https://github.com/fschaefer"
},
{
"name": "David Refoua",
"url": "http://www.Refoua.me"
},
{
"name": "Ishan Ratnapala",
"url": "https://github.com/IshanRatnapala"
},
{
"name": "Tomasz Ducin",
"url": "http://ducin.it"
},
{
"name": "7twin",
"url": "https://7twin.com"
},
{
"name": "Abdelrahman Omran",
"url": "https://omranic.com"
},
{
"name": "Anton Vasil'ev",
"url": "https://github.com/avdes"
},
{
"name": "finlob",
"url": "https://github.com/finlob"
},
{
"name": "Hasan",
"url": "https://github.com/JuanPotato"
},
{
"name": "Hraban Luyat",
"url": "https://luyat.com"
},
{
"name": "Jarry Shaw",
"url": "jarryshaw.me"
},
{
"name": "Jon Steinich",
"url": "https://github.com/jsteinich"
},
{
"name": "Martin v. Löwis",
"url": "https://github.com/loewis"
},
{
"name": "Mateusz Paprocki",
"url": "https://github.com/mattpap"
},
{
"name": "exit1",
"url": "https://github.com/exit1"
},
{
"name": "Robert Wikman",
"url": "https://github.com/rbw"
},
{
"name": "Steve Phillips",
"url": "https://tryingtobeawesome.com/"
},
{
"name": "Yutong Luo",
"url": "https://yutongluo.com"
},
{
"name": "coderaiser",
"url": "http://coderaiser.github.io"
},
{
"name": "mrkaiser",
"url": "https://github.com/mrkaiser"
},
{
"name": "stereobooster",
"url": "https://stereobooster.com"
},
{
"name": "Steve Kirkegard",
"url": "https://www.linkedin.com/in/steve-kirkegard"
},
{
"name": "Juraj Vitko",
"url": "https://github.com/youurayy"
}
],
"license": "MIT",
"bugs": {
"url": "https://github.com/jcubic/jquery.terminal/issues"
},
"homepage": "https://terminal.jcubic.pl",
"dependencies": {
"@types/jquery": "3.3.29",
"jquery": "~3",
"prismjs": "^1.16.0",
"wcwidth": "^1.0.1"
},
"devDependencies": {
"coveralls": "^3.0.3",
"cssnano": "^4.1.10",
"emoji-datasource-twitter": "^4.1.0",
"eslint": "^5.16.0",
"jest": "^24.8.0",
"jsonlint": "^1.6.3",
"typescript": "~3.1.6",
"uglify-js": "^3.5.12"
}
}

@ -0,0 +1,26 @@
{
"name": "terminal",
"title": "jQuery Terminal Emulator",
"description": "jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications.",
"version": "2.22.0",
"keywords": [
"terminal", "emulator", "prompt", "console", "keyboard", "type", "rpc", "input", "ui"
],
"author": {
"name": "Jakub Jankiewicz",
"email": "jcubic@onet.pl",
"url": "http://jcubic.pl/me"
},
"licenses": [{
"type": "MIT",
"url": "http://opensource.org/licenses/MIT"
}],
"homepage": "http://terminal.jcubic.pl/",
"bugs": "https://github.com/jcubic/jquery.terminal/issues",
"demo": "http://terminal.jcubic.pl/#demo",
"docs": "http://terminal.jcubic.pl/api_reference.php",
"download": "https://github.com/jcubic/jquery.terminal/releases",
"dependencies": {
"jquery": ">=1.5"
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["es2015", "ES2018.Promise", "dom"]
},
"exclude": ["npm"]
}

@ -0,0 +1,25 @@
{
"name": "jquery",
"main": "dist/jquery.js",
"license": "MIT",
"ignore": [
"package.json"
],
"keywords": [
"jquery",
"javascript",
"browser",
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
"version": "3.6.0",
"_release": "3.6.0",
"_resolution": {
"type": "version",
"tag": "3.6.0",
"commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
"_source": "https://github.com/jquery/jquery-dist.git",
"_target": "~3",
"_originalSource": "jquery"
}

@ -0,0 +1,331 @@
John Resig <jeresig@gmail.com>
Gilles van den Hoven <gilles0181@gmail.com>
Michael Geary <mike@geary.com>
Stefan Petre <stefan.petre@gmail.com>
Yehuda Katz <wycats@gmail.com>
Corey Jewett <cj@syntheticplayground.com>
Klaus Hartl <klaus.hartl@gmail.com>
Franck Marcia <franck.marcia@gmail.com>
Jörn Zaefferer <joern.zaefferer@gmail.com>
Paul Bakaus <paul.bakaus@gmail.com>
Brandon Aaron <brandon.aaron@gmail.com>
Mike Alsup <malsup@gmail.com>
Dave Methvin <dave.methvin@gmail.com>
Ed Engelhardt <edengelhardt@gmail.com>
Sean Catchpole <littlecooldude@gmail.com>
Paul Mclanahan <pmclanahan@gmail.com>
David Serduke <davidserduke@gmail.com>
Richard D. Worth <rdworth@gmail.com>
Scott González <scott.gonzalez@gmail.com>
Ariel Flesler <aflesler@gmail.com>
Jon Evans <jon@springyweb.com>
TJ Holowaychuk <tj@vision-media.ca>
Michael Bensoussan <mickey@seesmic.com>
Robert Katić <robert.katic@gmail.com>
Louis-Rémi Babé <lrbabe@gmail.com>
Earle Castledine <mrspeaker@gmail.com>
Damian Janowski <damian.janowski@gmail.com>
Rich Dougherty <rich@rd.gen.nz>
Kim Dalsgaard <kim@kimdalsgaard.com>
Andrea Giammarchi <andrea.giammarchi@gmail.com>
Mark Gibson <jollytoad@gmail.com>
Karl Swedberg <kswedberg@gmail.com>
Justin Meyer <justinbmeyer@gmail.com>
Ben Alman <cowboy@rj3.net>
James Padolsey <cla@padolsey.net>
David Petersen <public@petersendidit.com>
Batiste Bieler <batiste.bieler@gmail.com>
Alexander Farkas <info@corrupt-system.de>
Rick Waldron <waldron.rick@gmail.com>
Filipe Fortes <filipe@fortes.com>
Neeraj Singh <neerajdotname@gmail.com>
Paul Irish <paul.irish@gmail.com>
Iraê Carvalho <irae@irae.pro.br>
Matt Curry <matt@pseudocoder.com>
Michael Monteleone <michael@michaelmonteleone.net>
Noah Sloan <noah.sloan@gmail.com>
Tom Viner <github@viner.tv>
Douglas Neiner <doug@dougneiner.com>
Adam J. Sontag <ajpiano@ajpiano.com>
Dave Reed <dareed@microsoft.com>
Ralph Whitbeck <ralph.whitbeck@gmail.com>
Carl Fürstenberg <azatoth@gmail.com>
Jacob Wright <jacwright@gmail.com>
J. Ryan Stinnett <jryans@gmail.com>
unknown <Igen005@.upcorp.ad.uprr.com>
temp01 <temp01irc@gmail.com>
Heungsub Lee <h@subl.ee>
Colin Snover <github.com@zetafleet.com>
Ryan W Tenney <ryan@10e.us>
Pinhook <contact@pinhooklabs.com>
Ron Otten <r.j.g.otten@gmail.com>
Jephte Clain <Jephte.Clain@univ-reunion.fr>
Anton Matzneller <obhvsbypqghgc@gmail.com>
Alex Sexton <AlexSexton@gmail.com>
Dan Heberden <danheberden@gmail.com>
Henri Wiechers <hwiechers@gmail.com>
Russell Holbrook <russell.holbrook@patch.com>
Julian Aubourg <aubourg.julian@gmail.com>
Gianni Alessandro Chiappetta <gianni@runlevel6.org>
Scott Jehl <scottjehl@gmail.com>
James Burke <jrburke@gmail.com>
Jonas Pfenniger <jonas@pfenniger.name>
Xavi Ramirez <xavi.rmz@gmail.com>
Jared Grippe <jared@deadlyicon.com>
Sylvester Keil <sylvester@keil.or.at>
Brandon Sterne <bsterne@mozilla.com>
Mathias Bynens <mathias@qiwi.be>
Timmy Willison <4timmywil@gmail.com>
Corey Frang <gnarf37@gmail.com>
Digitalxero <digitalxero>
Anton Kovalyov <anton@kovalyov.net>
David Murdoch <david@davidmurdoch.com>
Josh Varner <josh.varner@gmail.com>
Charles McNulty <cmcnulty@kznf.com>
Jordan Boesch <jboesch26@gmail.com>
Jess Thrysoee <jess@thrysoee.dk>
Michael Murray <m@murz.net>
Lee Carpenter <elcarpie@gmail.com>
Alexis Abril <me@alexisabril.com>
Rob Morgan <robbym@gmail.com>
John Firebaugh <john_firebaugh@bigfix.com>
Sam Bisbee <sam@sbisbee.com>
Gilmore Davidson <gilmoreorless@gmail.com>
Brian Brennan <me@brianlovesthings.com>
Xavier Montillet <xavierm02.net@gmail.com>
Daniel Pihlstrom <sciolist.se@gmail.com>
Sahab Yazdani <sahab.yazdani+github@gmail.com>
avaly <github-com@agachi.name>
Scott Hughes <hi@scott-hughes.me>
Mike Sherov <mike.sherov@gmail.com>
Greg Hazel <ghazel@gmail.com>
Schalk Neethling <schalk@ossreleasefeed.com>
Denis Knauf <Denis.Knauf@gmail.com>
Timo Tijhof <krinklemail@gmail.com>
Steen Nielsen <swinedk@gmail.com>
Anton Ryzhov <anton@ryzhov.me>
Shi Chuan <shichuanr@gmail.com>
Berker Peksag <berker.peksag@gmail.com>
Toby Brain <tobyb@freshview.com>
Matt Mueller <mattmuelle@gmail.com>
Justin <drakefjustin@gmail.com>
Daniel Herman <daniel.c.herman@gmail.com>
Oleg Gaidarenko <markelog@gmail.com>
Richard Gibson <richard.gibson@gmail.com>
Rafaël Blais Masson <rafbmasson@gmail.com>
cmc3cn <59194618@qq.com>
Joe Presbrey <presbrey@gmail.com>
Sindre Sorhus <sindresorhus@gmail.com>
Arne de Bree <arne@bukkie.nl>
Vladislav Zarakovsky <vlad.zar@gmail.com>
Andrew E Monat <amonat@gmail.com>
Oskari <admin@o-programs.com>
Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
tsinha <tsinha@Anthonys-MacBook-Pro.local>
Matt Farmer <matt@frmr.me>
Trey Hunner <treyhunner@gmail.com>
Jason Moon <jmoon@socialcast.com>
Jeffery To <jeffery.to@gmail.com>
Kris Borchers <kris.borchers@gmail.com>
Vladimir Zhuravlev <private.face@gmail.com>
Jacob Thornton <jacobthornton@gmail.com>
Chad Killingsworth <chadkillingsworth@missouristate.edu>
Nowres Rafid <nowres.rafed@gmail.com>
David Benjamin <davidben@mit.edu>
Uri Gilad <antishok@gmail.com>
Chris Faulkner <thefaulkner@gmail.com>
Elijah Manor <elijah.manor@gmail.com>
Daniel Chatfield <chatfielddaniel@gmail.com>
Nikita Govorov <nikita.govorov@gmail.com>
Wesley Walser <waw325@gmail.com>
Mike Pennisi <mike@mikepennisi.com>
Markus Staab <markus.staab@redaxo.de>
Dave Riddle <david@joyvuu.com>
Callum Macrae <callum@lynxphp.com>
Benjamin Truyman <bentruyman@gmail.com>
James Huston <james@jameshuston.net>
Erick Ruiz de Chávez <erickrdch@gmail.com>
David Bonner <dbonner@cogolabs.com>
Akintayo Akinwunmi <aakinwunmi@judge.com>
MORGAN <morgan@morgangraphics.com>
Ismail Khair <ismail.khair@gmail.com>
Carl Danley <carldanley@gmail.com>
Mike Petrovich <michael.c.petrovich@gmail.com>
Greg Lavallee <greglavallee@wapolabs.com>
Daniel Gálvez <dgalvez@editablething.com>
Sai Lung Wong <sai.wong@huffingtonpost.com>
Tom H Fuertes <TomFuertes@gmail.com>
Roland Eckl <eckl.roland@googlemail.com>
Jay Merrifield <fracmak@gmail.com>
Allen J Schmidt Jr <cobrasoft@gmail.com>
Jonathan Sampson <jjdsampson@gmail.com>
Marcel Greter <marcel.greter@ocbnet.ch>
Matthias Jäggli <matthias.jaeggli@gmail.com>
David Fox <dfoxinator@gmail.com>
Yiming He <yiminghe@gmail.com>
Devin Cooper <cooper.semantics@gmail.com>
Paul Ramos <paul.b.ramos@gmail.com>
Rod Vagg <rod@vagg.org>
Bennett Sorbo <bsorbo@gmail.com>
Sebastian Burkhard <sebi.burkhard@gmail.com>
Zachary Adam Kaplan <razic@viralkitty.com>
nanto_vi <nanto@moon.email.ne.jp>
nanto <nanto@moon.email.ne.jp>
Danil Somsikov <danilasomsikov@gmail.com>
Ryunosuke SATO <tricknotes.rs@gmail.com>
Jean Boussier <jean.boussier@gmail.com>
Adam Coulombe <me@adam.co>
Andrew Plummer <plummer.andrew@gmail.com>
Mark Raddatz <mraddatz@gmail.com>
Isaac Z. Schlueter <i@izs.me>
Karl Sieburg <ksieburg@yahoo.com>
Pascal Borreli <pascal@borreli.com>
Nguyen Phuc Lam <ruado1987@gmail.com>
Dmitry Gusev <dmitry.gusev@gmail.com>
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
Li Xudong <istonelee@gmail.com>
Steven Benner <admin@stevenbenner.com>
Tom H Fuertes <tomfuertes@gmail.com>
Renato Oliveira dos Santos <ros3@cin.ufpe.br>
ros3cin <ros3@cin.ufpe.br>
Jason Bedard <jason+jquery@jbedard.ca>
Kyle Robinson Young <kyle@dontkry.com>
Chris Talkington <chris@talkingtontech.com>
Eddie Monge <eddie@eddiemonge.com>
Terry Jones <terry@jon.es>
Jason Merino <jasonmerino@gmail.com>
Jeremy Dunck <jdunck@gmail.com>
Chris Price <price.c@gmail.com>
Guy Bedford <guybedford@gmail.com>
Amey Sakhadeo <me@ameyms.com>
Mike Sidorov <mikes.ekb@gmail.com>
Anthony Ryan <anthonyryan1@gmail.com>
Dominik D. Geyer <dominik.geyer@gmail.com>
George Kats <katsgeorgeek@gmail.com>
Lihan Li <frankieteardrop@gmail.com>
Ronny Springer <springer.ronny@gmail.com>
Chris Antaki <ChrisAntaki@gmail.com>
Marian Sollmann <marian.sollmann@cargomedia.ch>
njhamann <njhamann@gmail.com>
Ilya Kantor <iliakan@gmail.com>
David Hong <d.hong@me.com>
John Paul <john@johnkpaul.com>
Jakob Stoeck <jakob@pokermania.de>
Christopher Jones <chris@cjqed.com>
Forbes Lindesay <forbes@lindesay.co.uk>
S. Andrew Sheppard <andrew@wq.io>
Leonardo Balter <leonardo.balter@gmail.com>
Roman Reiß <me@silverwind.io>
Benjy Cui <benjytrys@gmail.com>
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
John Hoven <hovenj@gmail.com>
Philip Jägenstedt <philip@foolip.org>
Christian Kosmowski <ksmwsk@gmail.com>
Liang Peng <poppinlp@gmail.com>
TJ VanToll <tj.vantoll@gmail.com>
Senya Pugach <upisfree@outlook.com>
Aurelio De Rosa <aurelioderosa@gmail.com>
Nazar Mokrynskyi <nazar@mokrynskyi.com>
Amit Merchant <bullredeyes@gmail.com>
Jason Bedard <jason+github@jbedard.ca>
Arthur Verschaeve <contact@arthurverschaeve.be>
Dan Hart <danhart@notonthehighstreet.com>
Bin Xin <rhyzix@gmail.com>
David Corbacho <davidcorbacho@gmail.com>
Veaceslav Grimalschi <grimalschi@yandex.ru>
Daniel Husar <dano.husar@gmail.com>
Frederic Hemberger <mail@frederic-hemberger.de>
Ben Toews <mastahyeti@gmail.com>
Aditya Raghavan <araghavan3@gmail.com>
Victor Homyakov <vkhomyackov@gmail.com>
Shivaji Varma <contact@shivajivarma.com>
Nicolas HENRY <icewil@gmail.com>
Anne-Gaelle Colom <coloma@westminster.ac.uk>
George Mauer <gmauer@gmail.com>
Leonardo Braga <leonardo.braga@gmail.com>
Stephen Edgar <stephen@netweb.com.au>
Thomas Tortorini <thomastortorini@gmail.com>
Winston Howes <winstonhowes@gmail.com>
Jon Hester <jon.d.hester@gmail.com>
Alexander O'Mara <me@alexomara.com>
Bastian Buchholz <buchholz.bastian@googlemail.com>
Arthur Stolyar <nekr.fabula@gmail.com>
Calvin Metcalf <calvin.metcalf@gmail.com>
Mu Haibao <mhbseal@163.com>
Richard McDaniel <rm0026@uah.edu>
Chris Rebert <github@rebertia.com>
Gabriel Schulhof <gabriel.schulhof@intel.com>
Gilad Peleg <giladp007@gmail.com>
Martin Naumann <martin@geekonaut.de>
Marek Lewandowski <m.lewandowski@cksource.com>
Bruno Pérel <brunoperel@gmail.com>
Reed Loden <reed@reedloden.com>
Daniel Nill <daniellnill@gmail.com>
Yongwoo Jeon <yongwoo.jeon@navercorp.com>
Sean Henderson <seanh.za@gmail.com>
Richard Kraaijenhagen <stdin+git@riichard.com>
Connor Atherton <c.liam.atherton@gmail.com>
Gary Ye <garysye@gmail.com>
Christian Grete <webmaster@christiangrete.com>
Liza Ramo <liza.h.ramo@gmail.com>
Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
Joelle Fleurantin <joasqueeniebee@gmail.com>
Jae Sung Park <alberto.park@gmail.com>
Jun Sun <klsforever@gmail.com>
Josh Soref <apache@soref.com>
Henry Wong <henryw4k@gmail.com>
Jon Dufresne <jon.dufresne@gmail.com>
Martijn W. van der Lee <martijn@vanderlee.com>
Devin Wilson <dwilson6.github@gmail.com>
Steve Mao <maochenyan@gmail.com>
Zack Hall <zackhall@outlook.com>
Bernhard M. Wiedemann <jquerybmw@lsmod.de>
Todor Prikumov <tono_pr@abv.bg>
Jha Naman <createnaman@gmail.com>
William Robinet <william.robinet@conostix.com>
Alexander Lisianoi <all3fox@gmail.com>
Vitaliy Terziev <vitaliyterziev@gmail.com>
Joe Trumbull <trumbull.j@gmail.com>
Alexander K <xpyro@ya.ru>
Damian Senn <jquery@topaxi.codes>
Ralin Chimev <ralin.chimev@gmail.com>
Felipe Sateler <fsateler@gmail.com>
Christophe Tafani-Dereeper <christophetd@hotmail.fr>
Manoj Kumar <nithmanoj@gmail.com>
David Broder-Rodgers <broder93@gmail.com>
Alex Louden <alex@louden.com>
Alex Padilla <alexonezero@outlook.com>
南漂一卒 <shiy007@qq.com>
karan-96 <karanbatra96@gmail.com>
Boom Lee <teabyii@gmail.com>
Andreas Solleder <asol@num42.de>
CDAGaming <cstack2011@yahoo.com>
Pierre Spring <pierre@nelm.io>
Shashanka Nataraj <shashankan.10@gmail.com>
Erik Lax <erik@datahack.se>
Matan Kotler-Berkowitz <205matan@gmail.com>
Jordan Beland <jordan.beland@gmail.com>
Henry Zhu <hi@henryzoo.com>
Saptak Sengupta <saptak013@gmail.com>
Nilton Cesar <niltoncms@gmail.com>
basil.belokon <basil.belokon@gmail.com>
tmybr11 <tomas.perone@gmail.com>
Luis Emilio Velasco Sanchez <emibloque@gmail.com>
Ed S <ejsanders@gmail.com>
Bert Zhang <enbo@users.noreply.github.com>
Andrei Fangli <andrei_fangli@outlook.com>
Marja Hölttä <marja.holtta@gmail.com>
abnud1 <ahmad13932013@hotmail.com>
buddh4 <mail@jharrer.de>
Pat O'Callaghan <patocallaghan@gmail.com>
Ahmed.S.ElAfifi <ahmed.s.elafifi@gmail.com>
Wonseop Kim <wonseop.kim@samsung.com>
Christian Oliff <christianoliff@pm.me>
Christian Wenz <christian@wenz.org>
Sean Robinson <sean.robinson@scottsdalecc.edu>
Jonathan <vanillajonathan@users.noreply.github.com>
Pierre Grimaud <grimaud.pierre@gmail.com>
Beatriz Rezener <beatrizrezener@users.noreply.github.com>
Natalia Sroka <37873210+natipo@users.noreply.github.com>
Wonhyoung Park <wh05.park@samsung.com>
Dallas Fraser <dallas.fraser.waterloo@gmail.com>

@ -0,0 +1,20 @@
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -0,0 +1,62 @@
# jQuery
> jQuery is a fast, small, and feature-rich JavaScript library.
For information on how to get started and how to use jQuery, please see [jQuery's documentation](https://api.jquery.com/).
For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery).
If upgrading, please see the [blog post for 3.6.0](https://blog.jquery.com/2021/03/02/jquery-3-6-0-released/). This includes notable differences from the previous version and a more readable changelog.
## Including jQuery
Below are some of the most common ways to include jQuery.
### Browser
#### Script tag
```html
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
```
#### Babel
[Babel](https://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.
```js
import $ from "jquery";
```
#### Browserify/Webpack
There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documentation. In the script, including jQuery will usually look like this...
```js
var $ = require( "jquery" );
```
#### AMD (Asynchronous Module Definition)
AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](https://requirejs.org/docs/whyamd.html).
```js
define( [ "jquery" ], function( $ ) {
} );
```
### Node
To include jQuery in [Node](https://nodejs.org/), first install with npm.
```sh
npm install jquery
```
For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/jsdom/jsdom). This can be useful for testing purposes.
```js
const { JSDOM } = require( "jsdom" );
const { window } = new JSDOM( "" );
const $ = require( "jquery" )( window );
```

@ -0,0 +1,14 @@
{
"name": "jquery",
"main": "dist/jquery.js",
"license": "MIT",
"ignore": [
"package.json"
],
"keywords": [
"jquery",
"javascript",
"browser",
"library"
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,36 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/sizzle
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,876 @@
define( [
"./core",
"./var/document",
"./var/isFunction",
"./var/rnothtmlwhite",
"./ajax/var/location",
"./ajax/var/nonce",
"./ajax/var/rquery",
"./core/init",
"./core/parseXML",
"./event/trigger",
"./deferred",
"./serialize" // jQuery.param
], function( jQuery, document, isFunction, rnothtmlwhite, location, nonce, rquery ) {
"use strict";
var
r20 = /%20/g,
rhash = /#.*$/,
rantiCache = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
/* Prefilters
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
* 2) These are called:
* - BEFORE asking for a transport
* - AFTER param serialization (s.data is a string if s.processData is true)
* 3) key is the dataType
* 4) the catchall symbol "*" can be used
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
*/
prefilters = {},
/* Transports bindings
* 1) key is the dataType
* 2) the catchall symbol "*" can be used
* 3) selection will start with transport dataType and THEN go to "*" if needed
*/
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = "*/".concat( "*" ),
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
// dataTypeExpression is optional and defaults to "*"
return function( dataTypeExpression, func ) {
if ( typeof dataTypeExpression !== "string" ) {
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType,
i = 0,
dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
if ( isFunction( func ) ) {
// For each dataType in the dataTypeExpression
while ( ( dataType = dataTypes[ i++ ] ) ) {
// Prepend if requested
if ( dataType[ 0 ] === "+" ) {
dataType = dataType.slice( 1 ) || "*";
( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
// Otherwise append
} else {
( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
}
}
}
};
}
// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
var inspected = {},
seekingTransport = ( structure === transports );
function inspect( dataType ) {
var selected;
inspected[ dataType ] = true;
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
if ( typeof dataTypeOrTransport === "string" &&
!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
options.dataTypes.unshift( dataTypeOrTransport );
inspect( dataTypeOrTransport );
return false;
} else if ( seekingTransport ) {
return !( selected = dataTypeOrTransport );
}
} );
return selected;
}
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}
// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
for ( key in src ) {
if ( src[ key ] !== undefined ) {
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
}
}
if ( deep ) {
jQuery.extend( true, target, deep );
}
return target;
}
/* Handles responses to an ajax request:
* - finds the right dataType (mediates between content-type and expected dataType)
* - returns the corresponding response
*/
function ajaxHandleResponses( s, jqXHR, responses ) {
var ct, type, finalDataType, firstDataType,
contents = s.contents,
dataTypes = s.dataTypes;
// Remove auto dataType and get content-type in the process
while ( dataTypes[ 0 ] === "*" ) {
dataTypes.shift();
if ( ct === undefined ) {
ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
}
}
// Check if we're dealing with a known content-type
if ( ct ) {
for ( type in contents ) {
if ( contents[ type ] && contents[ type ].test( ct ) ) {
dataTypes.unshift( type );
break;
}
}
}
// Check to see if we have a response for the expected dataType
if ( dataTypes[ 0 ] in responses ) {
finalDataType = dataTypes[ 0 ];
} else {
// Try convertible dataTypes
for ( type in responses ) {
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
finalDataType = type;
break;
}
if ( !firstDataType ) {
firstDataType = type;
}
}
// Or just use first one
finalDataType = finalDataType || firstDataType;
}
// If we found a dataType
// We add the dataType to the list if needed
// and return the corresponding response
if ( finalDataType ) {
if ( finalDataType !== dataTypes[ 0 ] ) {
dataTypes.unshift( finalDataType );
}
return responses[ finalDataType ];
}
}
/* Chain conversions given the request and the original response
* Also sets the responseXXX fields on the jqXHR instance
*/
function ajaxConvert( s, response, jqXHR, isSuccess ) {
var conv2, current, conv, tmp, prev,
converters = {},
// Work with a copy of dataTypes in case we need to modify it for conversion
dataTypes = s.dataTypes.slice();
// Create converters map with lowercased keys
if ( dataTypes[ 1 ] ) {
for ( conv in s.converters ) {
converters[ conv.toLowerCase() ] = s.converters[ conv ];
}
}
current = dataTypes.shift();
// Convert to each sequential dataType
while ( current ) {
if ( s.responseFields[ current ] ) {
jqXHR[ s.responseFields[ current ] ] = response;
}
// Apply the dataFilter if provided
if ( !prev && isSuccess && s.dataFilter ) {
response = s.dataFilter( response, s.dataType );
}
prev = current;
current = dataTypes.shift();
if ( current ) {
// There's only work to do if current dataType is non-auto
if ( current === "*" ) {
current = prev;
// Convert response if prev dataType is non-auto and differs from current
} else if ( prev !== "*" && prev !== current ) {
// Seek a direct converter
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
// If none found, seek a pair
if ( !conv ) {
for ( conv2 in converters ) {
// If conv2 outputs current
tmp = conv2.split( " " );
if ( tmp[ 1 ] === current ) {
// If prev can be converted to accepted input
conv = converters[ prev + " " + tmp[ 0 ] ] ||
converters[ "* " + tmp[ 0 ] ];
if ( conv ) {
// Condense equivalence converters
if ( conv === true ) {
conv = converters[ conv2 ];
// Otherwise, insert the intermediate dataType
} else if ( converters[ conv2 ] !== true ) {
current = tmp[ 0 ];
dataTypes.unshift( tmp[ 1 ] );
}
break;
}
}
}
}
// Apply converter (if not an equivalence)
if ( conv !== true ) {
// Unless errors are allowed to bubble, catch and return them
if ( conv && s.throws ) {
response = conv( response );
} else {
try {
response = conv( response );
} catch ( e ) {
return {
state: "parsererror",
error: conv ? e : "No conversion from " + prev + " to " + current
};
}
}
}
}
}
}
return { state: "success", data: response };
}
jQuery.extend( {
// Counter for holding the number of active queries
active: 0,
// Last-Modified header cache for next request
lastModified: {},
etag: {},
ajaxSettings: {
url: location.href,
type: "GET",
isLocal: rlocalProtocol.test( location.protocol ),
global: true,
processData: true,
async: true,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
/*
timeout: 0,
data: null,
dataType: null,
username: null,
password: null,
cache: null,
throws: false,
traditional: false,
headers: {},
*/
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
// Data converters
// Keys separate source (or catchall "*") and destination types with a single space
converters: {
// Convert anything to text
"* text": String,
// Text to html (true = no transformation)
"text html": true,
// Evaluate text as a json expression
"text json": JSON.parse,
// Parse text as xml
"text xml": jQuery.parseXML
},
// For options that shouldn't be deep extended:
// you can add your own custom options here if
// and when you create one that shouldn't be
// deep extended (see ajaxExtend)
flatOptions: {
url: true,
context: true
}
},
// Creates a full fledged settings object into target
// with both ajaxSettings and settings fields.
// If target is omitted, writes into ajaxSettings.
ajaxSetup: function( target, settings ) {
return settings ?
// Building a settings object
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
// Extending ajaxSettings
ajaxExtend( jQuery.ajaxSettings, target );
},
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
ajaxTransport: addToPrefiltersOrTransports( transports ),
// Main method
ajax: function( url, options ) {
// If url is an object, simulate pre-1.5 signature
if ( typeof url === "object" ) {
options = url;
url = undefined;
}
// Force options to be an object
options = options || {};
var transport,
// URL without anti-cache param
cacheURL,
// Response headers
responseHeadersString,
responseHeaders,
// timeout handle
timeoutTimer,
// Url cleanup var
urlAnchor,
// Request state (becomes false upon send and true upon completion)
completed,
// To know if global events are to be dispatched
fireGlobals,
// Loop variable
i,
// uncached part of the url
uncached,
// Create the final options object
s = jQuery.ajaxSetup( {}, options ),
// Callbacks context
callbackContext = s.context || s,
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
jQuery( callbackContext ) :
jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
completeDeferred = jQuery.Callbacks( "once memory" ),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// Headers (they are sent all at once)
requestHeaders = {},
requestHeadersNames = {},
// Default abort message
strAbort = "canceled",
// Fake xhr
jqXHR = {
readyState: 0,
// Builds headers hashtable if needed
getResponseHeader: function( key ) {
var match;
if ( completed ) {
if ( !responseHeaders ) {
responseHeaders = {};
while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
.concat( match[ 2 ] );
}
}
match = responseHeaders[ key.toLowerCase() + " " ];
}
return match == null ? null : match.join( ", " );
},
// Raw string
getAllResponseHeaders: function() {
return completed ? responseHeadersString : null;
},
// Caches the header
setRequestHeader: function( name, value ) {
if ( completed == null ) {
name = requestHeadersNames[ name.toLowerCase() ] =
requestHeadersNames[ name.toLowerCase() ] || name;
requestHeaders[ name ] = value;
}
return this;
},
// Overrides response content-type header
overrideMimeType: function( type ) {
if ( completed == null ) {
s.mimeType = type;
}
return this;
},
// Status-dependent callbacks
statusCode: function( map ) {
var code;
if ( map ) {
if ( completed ) {
// Execute the appropriate callbacks
jqXHR.always( map[ jqXHR.status ] );
} else {
// Lazy-add the new callbacks in a way that preserves old ones
for ( code in map ) {
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
}
}
}
return this;
},
// Cancel the request
abort: function( statusText ) {
var finalText = statusText || strAbort;
if ( transport ) {
transport.abort( finalText );
}
done( 0, finalText );
return this;
}
};
// Attach deferreds
deferred.promise( jqXHR );
// Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
s.url = ( ( url || s.url || location.href ) + "" )
.replace( rprotocol, location.protocol + "//" );
// Alias method option to type as per ticket #12004
s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
// A cross-domain request is in order when the origin doesn't match the current origin.
if ( s.crossDomain == null ) {
urlAnchor = document.createElement( "a" );
// Support: IE <=8 - 11, Edge 12 - 15
// IE throws exception on accessing the href property if url is malformed,
// e.g. http://example.com:80x/
try {
urlAnchor.href = s.url;
// Support: IE <=8 - 11 only
// Anchor's host property isn't correctly set when s.url is relative
urlAnchor.href = urlAnchor.href;
s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
urlAnchor.protocol + "//" + urlAnchor.host;
} catch ( e ) {
// If there is an error parsing the URL, assume it is crossDomain,
// it can be rejected by the transport if it is invalid
s.crossDomain = true;
}
}
// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional );
}
// Apply prefilters
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
// If request was aborted inside a prefilter, stop there
if ( completed ) {
return jqXHR;
}
// We can fire global events as of now if asked to
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
fireGlobals = jQuery.event && s.global;
// Watch for a new set of requests
if ( fireGlobals && jQuery.active++ === 0 ) {
jQuery.event.trigger( "ajaxStart" );
}
// Uppercase the type
s.type = s.type.toUpperCase();
// Determine if request has content
s.hasContent = !rnoContent.test( s.type );
// Save the URL in case we're toying with the If-Modified-Since
// and/or If-None-Match header later on
// Remove hash to simplify url manipulation
cacheURL = s.url.replace( rhash, "" );
// More options handling for requests with no content
if ( !s.hasContent ) {
// Remember the hash so we can put it back
uncached = s.url.slice( cacheURL.length );
// If data is available and should be processed, append data to url
if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}
// Add or update anti-cache param if needed
if ( s.cache === false ) {
cacheURL = cacheURL.replace( rantiCache, "$1" );
uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
uncached;
}
// Put hash and anti-cache on the URL that will be requested (gh-1732)
s.url = cacheURL + uncached;
// Change '%20' to '+' if this is encoded form body content (gh-2658)
} else if ( s.data && s.processData &&
( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
s.data = s.data.replace( r20, "+" );
}
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
if ( jQuery.lastModified[ cacheURL ] ) {
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
}
if ( jQuery.etag[ cacheURL ] ) {
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
}
}
// Set the correct header, if data is being sent
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
jqXHR.setRequestHeader( "Content-Type", s.contentType );
}
// Set the Accepts header for the server, depending on the dataType
jqXHR.setRequestHeader(
"Accept",
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
s.accepts[ s.dataTypes[ 0 ] ] +
( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
s.accepts[ "*" ]
);
// Check for headers option
for ( i in s.headers ) {
jqXHR.setRequestHeader( i, s.headers[ i ] );
}
// Allow custom headers/mimetypes and early abort
if ( s.beforeSend &&
( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
// Abort if not done already and return
return jqXHR.abort();
}
// Aborting is no longer a cancellation
strAbort = "abort";
// Install callbacks on deferreds
completeDeferred.add( s.complete );
jqXHR.done( s.success );
jqXHR.fail( s.error );
// Get transport
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
// If no transport, we auto-abort
if ( !transport ) {
done( -1, "No Transport" );
} else {
jqXHR.readyState = 1;
// Send global event
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
}
// If request was aborted inside ajaxSend, stop there
if ( completed ) {
return jqXHR;
}
// Timeout
if ( s.async && s.timeout > 0 ) {
timeoutTimer = window.setTimeout( function() {
jqXHR.abort( "timeout" );
}, s.timeout );
}
try {
completed = false;
transport.send( requestHeaders, done );
} catch ( e ) {
// Rethrow post-completion exceptions
if ( completed ) {
throw e;
}
// Propagate others as results
done( -1, e );
}
}
// Callback for when everything is done
function done( status, nativeStatusText, responses, headers ) {
var isSuccess, success, error, response, modified,
statusText = nativeStatusText;
// Ignore repeat invocations
if ( completed ) {
return;
}
completed = true;
// Clear timeout if it exists
if ( timeoutTimer ) {
window.clearTimeout( timeoutTimer );
}
// Dereference transport for early garbage collection
// (no matter how long the jqXHR object will be used)
transport = undefined;
// Cache response headers
responseHeadersString = headers || "";
// Set readyState
jqXHR.readyState = status > 0 ? 4 : 0;
// Determine if successful
isSuccess = status >= 200 && status < 300 || status === 304;
// Get response data
if ( responses ) {
response = ajaxHandleResponses( s, jqXHR, responses );
}
// Use a noop converter for missing script but not if jsonp
if ( !isSuccess &&
jQuery.inArray( "script", s.dataTypes ) > -1 &&
jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
// Convert no matter what (that way responseXXX fields are always set)
response = ajaxConvert( s, response, jqXHR, isSuccess );
// If successful, handle type chaining
if ( isSuccess ) {
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
modified = jqXHR.getResponseHeader( "Last-Modified" );
if ( modified ) {
jQuery.lastModified[ cacheURL ] = modified;
}
modified = jqXHR.getResponseHeader( "etag" );
if ( modified ) {
jQuery.etag[ cacheURL ] = modified;
}
}
// if no content
if ( status === 204 || s.type === "HEAD" ) {
statusText = "nocontent";
// if not modified
} else if ( status === 304 ) {
statusText = "notmodified";
// If we have data, let's convert it
} else {
statusText = response.state;
success = response.data;
error = response.error;
isSuccess = !error;
}
} else {
// Extract error from statusText and normalize for non-aborts
error = statusText;
if ( status || !statusText ) {
statusText = "error";
if ( status < 0 ) {
status = 0;
}
}
}
// Set data for the fake xhr object
jqXHR.status = status;
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
// Success/Error
if ( isSuccess ) {
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
} else {
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
}
// Status-dependent callbacks
jqXHR.statusCode( statusCode );
statusCode = undefined;
if ( fireGlobals ) {
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
[ jqXHR, s, isSuccess ? success : error ] );
}
// Complete
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
// Handle the global AJAX counter
if ( !( --jQuery.active ) ) {
jQuery.event.trigger( "ajaxStop" );
}
}
}
return jqXHR;
},
getJSON: function( url, data, callback ) {
return jQuery.get( url, data, callback, "json" );
},
getScript: function( url, callback ) {
return jQuery.get( url, undefined, callback, "script" );
}
} );
jQuery.each( [ "get", "post" ], function( _i, method ) {
jQuery[ method ] = function( url, data, callback, type ) {
// Shift arguments if data argument was omitted
if ( isFunction( data ) ) {
type = type || callback;
callback = data;
data = undefined;
}
// The url can be an options object (which then must have .url)
return jQuery.ajax( jQuery.extend( {
url: url,
type: method,
dataType: type,
data: data,
success: callback
}, jQuery.isPlainObject( url ) && url ) );
};
} );
jQuery.ajaxPrefilter( function( s ) {
var i;
for ( i in s.headers ) {
if ( i.toLowerCase() === "content-type" ) {
s.contentType = s.headers[ i ] || "";
}
}
} );
return jQuery;
} );

@ -0,0 +1,103 @@
define( [
"../core",
"../var/isFunction",
"./var/nonce",
"./var/rquery",
"../ajax"
], function( jQuery, isFunction, nonce, rquery ) {
"use strict";
var oldCallbacks = [],
rjsonp = /(=)\?(?=&|$)|\?\?/;
// Default jsonp settings
jQuery.ajaxSetup( {
jsonp: "callback",
jsonpCallback: function() {
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
this[ callback ] = true;
return callback;
}
} );
// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
var callbackName, overwritten, responseContainer,
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
"url" :
typeof s.data === "string" &&
( s.contentType || "" )
.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
rjsonp.test( s.data ) && "data"
);
// Handle iff the expected data type is "jsonp" or we have a parameter to set
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
// Get callback name, remembering preexisting value associated with it
callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
s.jsonpCallback() :
s.jsonpCallback;
// Insert callback into url or form data
if ( jsonProp ) {
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
} else if ( s.jsonp !== false ) {
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
}
// Use data converter to retrieve json after script execution
s.converters[ "script json" ] = function() {
if ( !responseContainer ) {
jQuery.error( callbackName + " was not called" );
}
return responseContainer[ 0 ];
};
// Force json dataType
s.dataTypes[ 0 ] = "json";
// Install callback
overwritten = window[ callbackName ];
window[ callbackName ] = function() {
responseContainer = arguments;
};
// Clean-up function (fires after converters)
jqXHR.always( function() {
// If previous value didn't exist - remove it
if ( overwritten === undefined ) {
jQuery( window ).removeProp( callbackName );
// Otherwise restore preexisting value
} else {
window[ callbackName ] = overwritten;
}
// Save back as free
if ( s[ callbackName ] ) {
// Make sure that re-using the options doesn't screw things around
s.jsonpCallback = originalSettings.jsonpCallback;
// Save the callback name for future use
oldCallbacks.push( callbackName );
}
// Call if it was a function and we have a response
if ( responseContainer && isFunction( overwritten ) ) {
overwritten( responseContainer[ 0 ] );
}
responseContainer = overwritten = undefined;
} );
// Delegate to script
return "script";
}
} );
} );

@ -0,0 +1,77 @@
define( [
"../core",
"../core/stripAndCollapse",
"../var/isFunction",
"../core/parseHTML",
"../ajax",
"../traversing",
"../manipulation",
"../selector"
], function( jQuery, stripAndCollapse, isFunction ) {
"use strict";
/**
* Load a url into a page
*/
jQuery.fn.load = function( url, params, callback ) {
var selector, type, response,
self = this,
off = url.indexOf( " " );
if ( off > -1 ) {
selector = stripAndCollapse( url.slice( off ) );
url = url.slice( 0, off );
}
// If it's a function
if ( isFunction( params ) ) {
// We assume that it's the callback
callback = params;
params = undefined;
// Otherwise, build a param string
} else if ( params && typeof params === "object" ) {
type = "POST";
}
// If we have elements to modify, make the request
if ( self.length > 0 ) {
jQuery.ajax( {
url: url,
// If "type" variable is undefined, then "GET" method will be used.
// Make value of this field explicit since
// user can override it through ajaxSetup method
type: type || "GET",
dataType: "html",
data: params
} ).done( function( responseText ) {
// Save response for use in complete callback
response = arguments;
self.html( selector ?
// If a selector was specified, locate the right elements in a dummy div
// Exclude scripts to avoid IE 'Permission Denied' errors
jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
// Otherwise use the full result
responseText );
// If the request succeeds, this function gets "data", "status", "jqXHR"
// but they are ignored because response was set above.
// If it fails, this function gets "jqXHR", "status", "error"
} ).always( callback && function( jqXHR, status ) {
self.each( function() {
callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
} );
} );
}
return this;
};
} );

@ -0,0 +1,74 @@
define( [
"../core",
"../var/document",
"../ajax"
], function( jQuery, document ) {
"use strict";
// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
jQuery.ajaxPrefilter( function( s ) {
if ( s.crossDomain ) {
s.contents.script = false;
}
} );
// Install script dataType
jQuery.ajaxSetup( {
accepts: {
script: "text/javascript, application/javascript, " +
"application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function( text ) {
jQuery.globalEval( text );
return text;
}
}
} );
// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
if ( s.cache === undefined ) {
s.cache = false;
}
if ( s.crossDomain ) {
s.type = "GET";
}
} );
// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {
// This transport only deals with cross domain or forced-by-attrs requests
if ( s.crossDomain || s.scriptAttrs ) {
var script, callback;
return {
send: function( _, complete ) {
script = jQuery( "<script>" )
.attr( s.scriptAttrs || {} )
.prop( { charset: s.scriptCharset, src: s.url } )
.on( "load error", callback = function( evt ) {
script.remove();
callback = null;
if ( evt ) {
complete( evt.type === "error" ? 404 : 200, evt.type );
}
} );
// Use native DOM manipulation to avoid our domManip AJAX trickery
document.head.appendChild( script[ 0 ] );
},
abort: function() {
if ( callback ) {
callback();
}
}
};
}
} );
} );

@ -0,0 +1,5 @@
define( function() {
"use strict";
return window.location;
} );

@ -0,0 +1,5 @@
define( function() {
"use strict";
return { guid: Date.now() };
} );

@ -0,0 +1,5 @@
define( function() {
"use strict";
return ( /\?/ );
} );

@ -0,0 +1,170 @@
define( [
"../core",
"../var/support",
"../ajax"
], function( jQuery, support ) {
"use strict";
jQuery.ajaxSettings.xhr = function() {
try {
return new window.XMLHttpRequest();
} catch ( e ) {}
};
var xhrSuccessStatus = {
// File protocol always yields status code 0, assume 200
0: 200,
// Support: IE <=9 only
// #1450: sometimes IE returns 1223 when it should be 204
1223: 204
},
xhrSupported = jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
support.ajax = xhrSupported = !!xhrSupported;
jQuery.ajaxTransport( function( options ) {
var callback, errorCallback;
// Cross domain only allowed if supported through XMLHttpRequest
if ( support.cors || xhrSupported && !options.crossDomain ) {
return {
send: function( headers, complete ) {
var i,
xhr = options.xhr();
xhr.open(
options.type,
options.url,
options.async,
options.username,
options.password
);
// Apply custom fields if provided
if ( options.xhrFields ) {
for ( i in options.xhrFields ) {
xhr[ i ] = options.xhrFields[ i ];
}
}
// Override mime type if needed
if ( options.mimeType && xhr.overrideMimeType ) {
xhr.overrideMimeType( options.mimeType );
}
// X-Requested-With header
// For cross-domain requests, seeing as conditions for a preflight are
// akin to a jigsaw puzzle, we simply never set it to be sure.
// (it can always be set on a per-request basis or even using ajaxSetup)
// For same-domain requests, won't change header if already provided.
if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
headers[ "X-Requested-With" ] = "XMLHttpRequest";
}
// Set headers
for ( i in headers ) {
xhr.setRequestHeader( i, headers[ i ] );
}
// Callback
callback = function( type ) {
return function() {
if ( callback ) {
callback = errorCallback = xhr.onload =
xhr.onerror = xhr.onabort = xhr.ontimeout =
xhr.onreadystatechange = null;
if ( type === "abort" ) {
xhr.abort();
} else if ( type === "error" ) {
// Support: IE <=9 only
// On a manual native abort, IE9 throws
// errors on any property access that is not readyState
if ( typeof xhr.status !== "number" ) {
complete( 0, "error" );
} else {
complete(
// File: protocol always yields status 0; see #8605, #14207
xhr.status,
xhr.statusText
);
}
} else {
complete(
xhrSuccessStatus[ xhr.status ] || xhr.status,
xhr.statusText,
// Support: IE <=9 only
// IE9 has no XHR2 but throws on binary (trac-11426)
// For XHR2 non-text, let the caller handle it (gh-2498)
( xhr.responseType || "text" ) !== "text" ||
typeof xhr.responseText !== "string" ?
{ binary: xhr.response } :
{ text: xhr.responseText },
xhr.getAllResponseHeaders()
);
}
}
};
};
// Listen to events
xhr.onload = callback();
errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
// Support: IE 9 only
// Use onreadystatechange to replace onabort
// to handle uncaught aborts
if ( xhr.onabort !== undefined ) {
xhr.onabort = errorCallback;
} else {
xhr.onreadystatechange = function() {
// Check readyState before timeout as it changes
if ( xhr.readyState === 4 ) {
// Allow onerror to be called first,
// but that will not handle a native abort
// Also, save errorCallback to a variable
// as xhr.onerror cannot be accessed
window.setTimeout( function() {
if ( callback ) {
errorCallback();
}
} );
}
};
}
// Create the abort callback
callback = callback( "abort" );
try {
// Do send the request (this may raise an exception)
xhr.send( options.hasContent && options.data || null );
} catch ( e ) {
// #14683: Only rethrow if this hasn't been notified as an error yet
if ( callback ) {
throw e;
}
}
},
abort: function() {
if ( callback ) {
callback();
}
}
};
}
} );
} );

@ -0,0 +1,13 @@
define( [
"./core",
"./attributes/attr",
"./attributes/prop",
"./attributes/classes",
"./attributes/val"
], function( jQuery ) {
"use strict";
// Return jQuery for attributes-only inclusion
return jQuery;
} );

@ -0,0 +1,141 @@
define( [
"../core",
"../core/access",
"../core/nodeName",
"./support",
"../var/rnothtmlwhite",
"../selector"
], function( jQuery, access, nodeName, support, rnothtmlwhite ) {
"use strict";
var boolHook,
attrHandle = jQuery.expr.attrHandle;
jQuery.fn.extend( {
attr: function( name, value ) {
return access( this, jQuery.attr, name, value, arguments.length > 1 );
},
removeAttr: function( name ) {
return this.each( function() {
jQuery.removeAttr( this, name );
} );
}
} );
jQuery.extend( {
attr: function( elem, name, value ) {
var ret, hooks,
nType = elem.nodeType;
// Don't get/set attributes on text, comment and attribute nodes
if ( nType === 3 || nType === 8 || nType === 2 ) {
return;
}
// Fallback to prop when attributes are not supported
if ( typeof elem.getAttribute === "undefined" ) {
return jQuery.prop( elem, name, value );
}
// Attribute hooks are determined by the lowercase version
// Grab necessary hook if one is defined
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
}
if ( value !== undefined ) {
if ( value === null ) {
jQuery.removeAttr( elem, name );
return;
}
if ( hooks && "set" in hooks &&
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
return ret;
}
elem.setAttribute( name, value + "" );
return value;
}
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
return ret;
}
ret = jQuery.find.attr( elem, name );
// Non-existent attributes return null, we normalize to undefined
return ret == null ? undefined : ret;
},
attrHooks: {
type: {
set: function( elem, value ) {
if ( !support.radioValue && value === "radio" &&
nodeName( elem, "input" ) ) {
var val = elem.value;
elem.setAttribute( "type", value );
if ( val ) {
elem.value = val;
}
return value;
}
}
}
},
removeAttr: function( elem, value ) {
var name,
i = 0,
// Attribute names can contain non-HTML whitespace characters
// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
attrNames = value && value.match( rnothtmlwhite );
if ( attrNames && elem.nodeType === 1 ) {
while ( ( name = attrNames[ i++ ] ) ) {
elem.removeAttribute( name );
}
}
}
} );
// Hooks for boolean attributes
boolHook = {
set: function( elem, value, name ) {
if ( value === false ) {
// Remove boolean attributes when set to false
jQuery.removeAttr( elem, name );
} else {
elem.setAttribute( name, name );
}
return name;
}
};
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
var getter = attrHandle[ name ] || jQuery.find.attr;
attrHandle[ name ] = function( elem, name, isXML ) {
var ret, handle,
lowercaseName = name.toLowerCase();
if ( !isXML ) {
// Avoid an infinite loop by temporarily removing this function from the getter
handle = attrHandle[ lowercaseName ];
attrHandle[ lowercaseName ] = ret;
ret = getter( elem, name, isXML ) != null ?
lowercaseName :
null;
attrHandle[ lowercaseName ] = handle;
}
return ret;
};
} );
} );

@ -0,0 +1,186 @@
define( [
"../core",
"../core/stripAndCollapse",
"../var/isFunction",
"../var/rnothtmlwhite",
"../data/var/dataPriv",
"../core/init"
], function( jQuery, stripAndCollapse, isFunction, rnothtmlwhite, dataPriv ) {
"use strict";
function getClass( elem ) {
return elem.getAttribute && elem.getAttribute( "class" ) || "";
}
function classesToArray( value ) {
if ( Array.isArray( value ) ) {
return value;
}
if ( typeof value === "string" ) {
return value.match( rnothtmlwhite ) || [];
}
return [];
}
jQuery.fn.extend( {
addClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
if ( isFunction( value ) ) {
return this.each( function( j ) {
jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
} );
}
classes = classesToArray( value );
if ( classes.length ) {
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
cur += clazz + " ";
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
}
}
}
return this;
},
removeClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
if ( isFunction( value ) ) {
return this.each( function( j ) {
jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
} );
}
if ( !arguments.length ) {
return this.attr( "class", "" );
}
classes = classesToArray( value );
if ( classes.length ) {
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
// This expression is here for better compressibility (see addClass)
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
// Remove *all* instances
while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
cur = cur.replace( " " + clazz + " ", " " );
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
}
}
}
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value,
isValidValue = type === "string" || Array.isArray( value );
if ( typeof stateVal === "boolean" && isValidValue ) {
return stateVal ? this.addClass( value ) : this.removeClass( value );
}
if ( isFunction( value ) ) {
return this.each( function( i ) {
jQuery( this ).toggleClass(
value.call( this, i, getClass( this ), stateVal ),
stateVal
);
} );
}
return this.each( function() {
var className, i, self, classNames;
if ( isValidValue ) {
// Toggle individual class names
i = 0;
self = jQuery( this );
classNames = classesToArray( value );
while ( ( className = classNames[ i++ ] ) ) {
// Check each className given, space separated list
if ( self.hasClass( className ) ) {
self.removeClass( className );
} else {
self.addClass( className );
}
}
// Toggle whole class name
} else if ( value === undefined || type === "boolean" ) {
className = getClass( this );
if ( className ) {
// Store className if set
dataPriv.set( this, "__className__", className );
}
// If the element has a class name or if we're passed `false`,
// then remove the whole classname (if there was one, the above saved it).
// Otherwise bring back whatever was previously saved (if anything),
// falling back to the empty string if nothing was stored.
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
"" :
dataPriv.get( this, "__className__" ) || ""
);
}
}
} );
},
hasClass: function( selector ) {
var className, elem,
i = 0;
className = " " + selector + " ";
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
return true;
}
}
return false;
}
} );
} );

@ -0,0 +1,143 @@
define( [
"../core",
"../core/access",
"./support",
"../selector"
], function( jQuery, access, support ) {
"use strict";
var rfocusable = /^(?:input|select|textarea|button)$/i,
rclickable = /^(?:a|area)$/i;
jQuery.fn.extend( {
prop: function( name, value ) {
return access( this, jQuery.prop, name, value, arguments.length > 1 );
},
removeProp: function( name ) {
return this.each( function() {
delete this[ jQuery.propFix[ name ] || name ];
} );
}
} );
jQuery.extend( {
prop: function( elem, name, value ) {
var ret, hooks,
nType = elem.nodeType;
// Don't get/set properties on text, comment and attribute nodes
if ( nType === 3 || nType === 8 || nType === 2 ) {
return;
}
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
// Fix name and attach hooks
name = jQuery.propFix[ name ] || name;
hooks = jQuery.propHooks[ name ];
}
if ( value !== undefined ) {
if ( hooks && "set" in hooks &&
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
return ret;
}
return ( elem[ name ] = value );
}
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
return ret;
}
return elem[ name ];
},
propHooks: {
tabIndex: {
get: function( elem ) {
// Support: IE <=9 - 11 only
// elem.tabIndex doesn't always return the
// correct value when it hasn't been explicitly set
// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
// Use proper attribute retrieval(#12072)
var tabindex = jQuery.find.attr( elem, "tabindex" );
if ( tabindex ) {
return parseInt( tabindex, 10 );
}
if (
rfocusable.test( elem.nodeName ) ||
rclickable.test( elem.nodeName ) &&
elem.href
) {
return 0;
}
return -1;
}
}
},
propFix: {
"for": "htmlFor",
"class": "className"
}
} );
// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
// eslint rule "no-unused-expressions" is disabled for this code
// since it considers such accessions noop
if ( !support.optSelected ) {
jQuery.propHooks.selected = {
get: function( elem ) {
/* eslint no-unused-expressions: "off" */
var parent = elem.parentNode;
if ( parent && parent.parentNode ) {
parent.parentNode.selectedIndex;
}
return null;
},
set: function( elem ) {
/* eslint no-unused-expressions: "off" */
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
}
};
}
jQuery.each( [
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
jQuery.propFix[ this.toLowerCase() ] = this;
} );
} );

@ -0,0 +1,33 @@
define( [
"../var/document",
"../var/support"
], function( document, support ) {
"use strict";
( function() {
var input = document.createElement( "input" ),
select = document.createElement( "select" ),
opt = select.appendChild( document.createElement( "option" ) );
input.type = "checkbox";
// Support: Android <=4.3 only
// Default value for a checkbox should be "on"
support.checkOn = input.value !== "";
// Support: IE <=11 only
// Must access selectedIndex to make default options select
support.optSelected = opt.selected;
// Support: IE <=11 only
// An input loses its value after becoming a radio
input = document.createElement( "input" );
input.value = "t";
input.type = "radio";
support.radioValue = input.value === "t";
} )();
return support;
} );

@ -0,0 +1,191 @@
define( [
"../core",
"../core/stripAndCollapse",
"./support",
"../core/nodeName",
"../var/isFunction",
"../core/init"
], function( jQuery, stripAndCollapse, support, nodeName, isFunction ) {
"use strict";
var rreturn = /\r/g;
jQuery.fn.extend( {
val: function( value ) {
var hooks, ret, valueIsFunction,
elem = this[ 0 ];
if ( !arguments.length ) {
if ( elem ) {
hooks = jQuery.valHooks[ elem.type ] ||
jQuery.valHooks[ elem.nodeName.toLowerCase() ];
if ( hooks &&
"get" in hooks &&
( ret = hooks.get( elem, "value" ) ) !== undefined
) {
return ret;
}
ret = elem.value;
// Handle most common string cases
if ( typeof ret === "string" ) {
return ret.replace( rreturn, "" );
}
// Handle cases where value is null/undef or number
return ret == null ? "" : ret;
}
return;
}
valueIsFunction = isFunction( value );
return this.each( function( i ) {
var val;
if ( this.nodeType !== 1 ) {
return;
}
if ( valueIsFunction ) {
val = value.call( this, i, jQuery( this ).val() );
} else {
val = value;
}
// Treat null/undefined as ""; convert numbers to string
if ( val == null ) {
val = "";
} else if ( typeof val === "number" ) {
val += "";
} else if ( Array.isArray( val ) ) {
val = jQuery.map( val, function( value ) {
return value == null ? "" : value + "";
} );
}
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
// If set returns undefined, fall back to normal setting
if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
this.value = val;
}
} );
}
} );
jQuery.extend( {
valHooks: {
option: {
get: function( elem ) {
var val = jQuery.find.attr( elem, "value" );
return val != null ?
val :
// Support: IE <=10 - 11 only
// option.text throws exceptions (#14686, #14858)
// Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
stripAndCollapse( jQuery.text( elem ) );
}
},
select: {
get: function( elem ) {
var value, option, i,
options = elem.options,
index = elem.selectedIndex,
one = elem.type === "select-one",
values = one ? null : [],
max = one ? index + 1 : options.length;
if ( index < 0 ) {
i = max;
} else {
i = one ? index : 0;
}
// Loop through all the selected options
for ( ; i < max; i++ ) {
option = options[ i ];
// Support: IE <=9 only
// IE8-9 doesn't update selected after form reset (#2551)
if ( ( option.selected || i === index ) &&
// Don't return options that are disabled or in a disabled optgroup
!option.disabled &&
( !option.parentNode.disabled ||
!nodeName( option.parentNode, "optgroup" ) ) ) {
// Get the specific value for the option
value = jQuery( option ).val();
// We don't need an array for one selects
if ( one ) {
return value;
}
// Multi-Selects return an array
values.push( value );
}
}
return values;
},
set: function( elem, value ) {
var optionSet, option,
options = elem.options,
values = jQuery.makeArray( value ),
i = options.length;
while ( i-- ) {
option = options[ i ];
/* eslint-disable no-cond-assign */
if ( option.selected =
jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
) {
optionSet = true;
}
/* eslint-enable no-cond-assign */
}
// Force browsers to behave consistently when non-matching value is set
if ( !optionSet ) {
elem.selectedIndex = -1;
}
return values;
}
}
}
} );
// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = {
set: function( elem, value ) {
if ( Array.isArray( value ) ) {
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
}
}
};
if ( !support.checkOn ) {
jQuery.valHooks[ this ].get = function( elem ) {
return elem.getAttribute( "value" ) === null ? "on" : elem.value;
};
}
} );
} );

@ -0,0 +1,236 @@
define( [
"./core",
"./core/toType",
"./var/isFunction",
"./var/rnothtmlwhite"
], function( jQuery, toType, isFunction, rnothtmlwhite ) {
"use strict";
// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
var object = {};
jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
object[ flag ] = true;
} );
return object;
}
/*
* Create a callback list using the following parameters:
*
* options: an optional list of space-separated options that will change how
* the callback list behaves or a more traditional option object
*
* By default a callback list will act like an event callback list and can be
* "fired" multiple times.
*
* Possible options:
*
* once: will ensure the callback list can only be fired once (like a Deferred)
*
* memory: will keep track of previous values and will call any callback added
* after the list has been fired right away with the latest "memorized"
* values (like a Deferred)
*
* unique: will ensure a callback can only be added once (no duplicate in the list)
*
* stopOnFalse: interrupt callings when a callback returns false
*
*/
jQuery.Callbacks = function( options ) {
// Convert options from String-formatted to Object-formatted if needed
// (we check in cache first)
options = typeof options === "string" ?
createOptions( options ) :
jQuery.extend( {}, options );
var // Flag to know if list is currently firing
firing,
// Last fire value for non-forgettable lists
memory,
// Flag to know if list was already fired
fired,
// Flag to prevent firing
locked,
// Actual callback list
list = [],
// Queue of execution data for repeatable lists
queue = [],
// Index of currently firing callback (modified by add/remove as needed)
firingIndex = -1,
// Fire callbacks
fire = function() {
// Enforce single-firing
locked = locked || options.once;
// Execute callbacks for all pending executions,
// respecting firingIndex overrides and runtime changes
fired = firing = true;
for ( ; queue.length; firingIndex = -1 ) {
memory = queue.shift();
while ( ++firingIndex < list.length ) {
// Run callback and check for early termination
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
options.stopOnFalse ) {
// Jump to end and forget the data so .add doesn't re-fire
firingIndex = list.length;
memory = false;
}
}
}
// Forget the data if we're done with it
if ( !options.memory ) {
memory = false;
}
firing = false;
// Clean up if we're done firing for good
if ( locked ) {
// Keep an empty list if we have data for future add calls
if ( memory ) {
list = [];
// Otherwise, this object is spent
} else {
list = "";
}
}
},
// Actual Callbacks object
self = {
// Add a callback or a collection of callbacks to the list
add: function() {
if ( list ) {
// If we have memory from a past run, we should fire after adding
if ( memory && !firing ) {
firingIndex = list.length - 1;
queue.push( memory );
}
( function add( args ) {
jQuery.each( args, function( _, arg ) {
if ( isFunction( arg ) ) {
if ( !options.unique || !self.has( arg ) ) {
list.push( arg );
}
} else if ( arg && arg.length && toType( arg ) !== "string" ) {
// Inspect recursively
add( arg );
}
} );
} )( arguments );
if ( memory && !firing ) {
fire();
}
}
return this;
},
// Remove a callback from the list
remove: function() {
jQuery.each( arguments, function( _, arg ) {
var index;
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
list.splice( index, 1 );
// Handle firing indexes
if ( index <= firingIndex ) {
firingIndex--;
}
}
} );
return this;
},
// Check if a given callback is in the list.
// If no argument is given, return whether or not list has callbacks attached.
has: function( fn ) {
return fn ?
jQuery.inArray( fn, list ) > -1 :
list.length > 0;
},
// Remove all callbacks from the list
empty: function() {
if ( list ) {
list = [];
}
return this;
},
// Disable .fire and .add
// Abort any current/pending executions
// Clear all callbacks and values
disable: function() {
locked = queue = [];
list = memory = "";
return this;
},
disabled: function() {
return !list;
},
// Disable .fire
// Also disable .add unless we have memory (since it would have no effect)
// Abort any pending executions
lock: function() {
locked = queue = [];
if ( !memory && !firing ) {
list = memory = "";
}
return this;
},
locked: function() {
return !!locked;
},
// Call all callbacks with the given context and arguments
fireWith: function( context, args ) {
if ( !locked ) {
args = args || [];
args = [ context, args.slice ? args.slice() : args ];
queue.push( args );
if ( !firing ) {
fire();
}
}
return this;
},
// Call all the callbacks with the given arguments
fire: function() {
self.fireWith( this, arguments );
return this;
},
// To know if the callbacks have already been called at least once
fired: function() {
return !!fired;
}
};
return self;
};
return jQuery;
} );

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save