Browse Source

git-annex in jovyan@jupyter-ivis-5frino-5fmizuguchi-40rdm-2enii-2eac-2ejp--ivis-2dm:~/

ivis-mizuguchi 2 years ago
parent
commit
ce83af7f52
100 changed files with 1429946 additions and 0 deletions
  1. 7 0
      .bash_logout
  2. 118 0
      .bashrc
  3. 1 0
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/base
  4. 1 0
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/buildid
  5. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_ADDRESS
  6. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_COLLATE
  7. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_CTYPE
  8. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_IDENTIFICATION
  9. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MEASUREMENT
  10. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MESSAGES/SYS_LC_MESSAGES
  11. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MONETARY
  12. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_NAME
  13. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_NUMERIC
  14. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_PAPER
  15. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_TELEPHONE
  16. BIN
      .cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_TIME
  17. 3104 0
      .cache/matplotlib/fontlist-v330.json
  18. BIN
      .cache/pip/http/a/1/9/5/3/a19537d3cf37c122db841d6fe4cd322bc10d1a558bb00d146b85cb9a
  19. 1 0
      .cache/pip/selfcheck/ab2bb442149194bcbab5700d8f932112632ba9320db09910f4a4422b
  20. 123 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/.yarn-metadata.json
  21. 49 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/CHANGELOG.md
  22. 28 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/LICENSE
  23. 173 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/README.md
  24. 13 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/README.txt
  25. 729 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_AT_frami.aff
  26. 258243 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_AT_frami.dic
  27. 729 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_CH_frami.aff
  28. 257827 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_CH_frami.dic
  29. 729 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_DE_frami.aff
  30. 258218 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_DE_frami.dic
  31. 205 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_AU.aff
  32. 49782 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_AU.dic
  33. 205 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_CA.aff
  34. 49520 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_CA.dic
  35. 205 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_GB-ise.aff
  36. 49560 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_GB-ise.dic
  37. 205 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_US.aff
  38. 49525 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_US.dic
  39. 6893 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/es_ES.aff
  40. 71935 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/es_ES.dic
  41. 8975 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/fr.aff
  42. 80853 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/fr.dic
  43. 1086 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/pt_PT.aff
  44. 40626 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/pt_PT.dic
  45. 8 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/handler.d.ts
  46. 26 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/handler.js
  47. 9 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/index.d.ts
  48. 510 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/index.js
  49. 98 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/package.json
  50. 92 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/schema/plugin.json
  51. 0 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/base.css
  52. 202 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/icons/LICENSE
  53. 5 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/icons/ic-baseline-spellcheck.svg
  54. 34 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/index.css
  55. 1 0
      .cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/index.js
  56. 67 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/.yarn-metadata.json
  57. 6 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/README.md
  58. 232481 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/dist/index.js
  59. 49 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/package.json
  60. 1880 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/Figure.js
  61. 9 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/embed.js
  62. 19 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/extension.js
  63. 3 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/index.js
  64. 18 0
      .cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/jupyterlab-plugin.js
  65. 115 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/.yarn-metadata.json
  66. 314 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/LICENSE
  67. 69 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/README.md
  68. 7 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/index.d.ts
  69. 9 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/index.js
  70. 174 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/manager.d.ts
  71. 430 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/manager.js
  72. 56 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/output.d.ts
  73. 157 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/output.js
  74. 15 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/plugin.d.ts
  75. 212 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/plugin.js
  76. 33 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/renderer.d.ts
  77. 102 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/renderer.js
  78. 8 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/semvercache.d.ts
  79. 29 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/semvercache.js
  80. 96 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/package.json
  81. 14 0
      .cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/schema/plugin.json
  82. 99 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/.yarn-metadata.json
  83. 6 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/README.md
  84. 2 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/dist/index.js
  85. 189 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/dist/javascript-renderer-extension.js
  86. 1692 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/Figure.js
  87. 12 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/extension.js
  88. 3 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/index.js
  89. 22 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/jupyterlab-plugin.js
  90. 205 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/plotly-renderer.js
  91. 15 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/version.js
  92. 81 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/package.json
  93. 32 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/style/index.css
  94. 31 0
      .cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/style/plotly.svg
  95. 62 0
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/.yarn-metadata.json
  96. BIN
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/.yarn-tarball.tgz
  97. 22 0
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/LICENSE
  98. 223 0
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/README.md
  99. 225 0
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/example/demo.js
  100. 0 0
      .cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/example/minimal.js

+ 7 - 0
.bash_logout

@@ -0,0 +1,7 @@
+# ~/.bash_logout: executed by bash(1) when login shell exits.
+
+# when leaving the console clear the screen to increase privacy
+
+if [ "$SHLVL" = 1 ]; then
+    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
+fi

+ 118 - 0
.bashrc

@@ -0,0 +1,118 @@
+# ~/.bashrc: executed by bash(1) for non-login shells.
+# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
+# for examples
+
+# If not running interactively, don't do anything
+case $- in
+    *i*) ;;
+      *) return;;
+esac
+
+# don't put duplicate lines or lines starting with space in the history.
+# See bash(1) for more options
+HISTCONTROL=ignoreboth
+
+# append to the history file, don't overwrite it
+shopt -s histappend
+
+# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
+HISTSIZE=1000
+HISTFILESIZE=2000
+
+# check the window size after each command and, if necessary,
+# update the values of LINES and COLUMNS.
+shopt -s checkwinsize
+
+# If set, the pattern "**" used in a pathname expansion context will
+# match all files and zero or more directories and subdirectories.
+#shopt -s globstar
+
+# make less more friendly for non-text input files, see lesspipe(1)
+[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
+
+# set variable identifying the chroot you work in (used in the prompt below)
+if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
+    debian_chroot=$(cat /etc/debian_chroot)
+fi
+
+# set a fancy prompt (non-color, unless we know we "want" color)
+case "$TERM" in
+    xterm-color|*-256color) color_prompt=yes;;
+esac
+
+# uncomment for a colored prompt, if the terminal has the capability; turned
+# off by default to not distract the user: the focus in a terminal window
+# should be on the output of commands, not on the prompt
+force_color_prompt=yes
+
+if [ -n "$force_color_prompt" ]; then
+    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
+	# We have color support; assume it's compliant with Ecma-48
+	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
+	# a case would tend to support setf rather than setaf.)
+	color_prompt=yes
+    else
+	color_prompt=
+    fi
+fi
+
+if [ "$color_prompt" = yes ]; then
+    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+else
+    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+fi
+unset color_prompt force_color_prompt
+
+# If this is an xterm set the title to user@host:dir
+case "$TERM" in
+xterm*|rxvt*)
+    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+    ;;
+*)
+    ;;
+esac
+
+# enable color support of ls and also add handy aliases
+if [ -x /usr/bin/dircolors ]; then
+    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+    alias ls='ls --color=auto'
+    #alias dir='dir --color=auto'
+    #alias vdir='vdir --color=auto'
+
+    alias grep='grep --color=auto'
+    alias fgrep='fgrep --color=auto'
+    alias egrep='egrep --color=auto'
+fi
+
+# colored GCC warnings and errors
+#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
+
+# some more ls aliases
+alias ll='ls -alF'
+alias la='ls -A'
+alias l='ls -CF'
+
+# Add an "alert" alias for long running commands.  Use like so:
+#   sleep 10; alert
+alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
+
+# Alias definitions.
+# You may want to put all your additions into a separate file like
+# ~/.bash_aliases, instead of adding them here directly.
+# See /usr/share/doc/bash-doc/examples in the bash-doc package.
+
+if [ -f ~/.bash_aliases ]; then
+    . ~/.bash_aliases
+fi
+
+# enable programmable completion features (you don't need to enable
+# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
+# sources /etc/bash.bashrc).
+if ! shopt -oq posix; then
+  if [ -f /usr/share/bash-completion/bash_completion ]; then
+    . /usr/share/bash-completion/bash_completion
+  elif [ -f /etc/bash_completion ]; then
+    . /etc/bash_completion
+  fi
+fi
+eval "$(command conda shell.bash hook 2> /dev/null)"

+ 1 - 0
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/base

@@ -0,0 +1 @@
+/opt/conda/share/git-annex-8.20210903-0

+ 1 - 0
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/buildid

@@ -0,0 +1 @@
+e5be605cd237211bd90f63f1901fb43a

BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_ADDRESS


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_COLLATE


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_CTYPE


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_IDENTIFICATION


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MEASUREMENT


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MESSAGES/SYS_LC_MESSAGES


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_MONETARY


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_NAME


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_NUMERIC


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_PAPER


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_TELEPHONE


BIN
.cache/git-annex/locales/a30f7d7fbf07af23a366da2db8df382c/en_US.UTF-8/LC_TIME


File diff suppressed because it is too large
+ 3104 - 0
.cache/matplotlib/fontlist-v330.json


BIN
.cache/pip/http/a/1/9/5/3/a19537d3cf37c122db841d6fe4cd322bc10d1a558bb00d146b85cb9a


+ 1 - 0
.cache/pip/selfcheck/ab2bb442149194bcbab5700d8f932112632ba9320db09910f4a4422b

@@ -0,0 +1 @@
+{"key":"/opt/conda","last_check":"2022-01-31T13:05:10Z","pypi_version":"22.0.2"}

File diff suppressed because it is too large
+ 123 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/.yarn-metadata.json


+ 49 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/CHANGELOG.md

@@ -0,0 +1,49 @@
+### 0.7.2 (2021-10-08)
+- fallback to `base_name` if babel crashes (#95)
+- bump ansi-regex from 5.0.0 to 5.0.1 (#97)
+
+### 0.7.1 (2021-09-01)
+- bump tar from 6.1.5 to 6.1.11 (#92)
+- bump url-parse from 1.5.1 to 1.5.3 (#91)
+- bump path-parse from 1.0.6 to 1.0.7 (#90)
+- add new trove classifiers (#89)
+- bump tar from 6.1.0 to 6.1.5 (#88)
+
+### 0.7.0 (2021-07-31)
+- added possibility of using remote "online" dictionaries by specifying URLs for `.aff` and `.dic` files (#85)
+- added support for translations of the text shown in the interface (#84)
+- fixed the behaviour of the dictionary selector when an invalid dictionary is initially set in the settings (#83)
+- bumped normalize-uri to 4.5.1 (#82)
+- enable strict null checks, switch to modern compilation targets; add more Jupyter projects to spellcheck ignore (#86)
+
+### 0.6.0 (2021-06-01)
+- change the dictionary loading mechanism from internal static into a server extension (#69)
+  - dictionaries will now be discovered in operating system specific paths if available
+  - choice is now possible from one of multiple dictionaries using the same locale
+- add the possibility to add custom dictionary (#66)
+
+### 0.5.2 (2021-03-19)
+- added a status message while loading a dictionary (#62)
+
+### 0.5.0 (2021-02-28)
+
+- added wavy-underline and dotted-underline themes which allow to customize how misspelt words are highlighted (#53)
+- development improvements: added GitHub Actions build check and binder badge (#48), binder bot (#54), and publish workflow (#52)
+- fixes: dictionaries were loaded twice, '' characters lead to empty words and problems in the german dictionaries
+
+### 0.4.0 (2021-02-26)
+
+- improved contrast for dark themes (#45)
+- migrated to new GitHub organization (#42); the repository is now available under: https://github.com/jupyterlab-contrib/spellchecker
+- the extension can now be installed using pip, which means that Node.js is no longer required (#48)
+- the "choose language" command is now also accessible from the command palette (#48)
+- statusbar and command palette are no longer required for the extension to work (#48)
+
+### 0.3.0 (2021-01-24)
+
+- added JupyterLab 3.0 support (#44)
+
+### 0.2.0 (2020-12-08)
+
+- added German, Portuguese, Spanish and French dictionaries
+- fixed "cancel" button in "choose language" dialog window

+ 28 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/LICENSE

@@ -0,0 +1,28 @@
+BSD 3-Clause License
+
+Copyright (c) 2020, ijmbarr All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 173 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/README.md

@@ -0,0 +1,173 @@
+# jupyterlab-spellchecker
+
+[![Extension status](https://img.shields.io/badge/status-ready-success "ready to be used")](https://jupyterlab-contrib.github.io/)
+[![Github Actions Status](https://github.com/jupyterlab-contrib/spellchecker/workflows/Build/badge.svg)](https://github.com/jupyterlab-contrib/spellchecker/actions)
+[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupyterlab-contrib/spellchecker/master?urlpath=lab)
+[![PyPI version](https://img.shields.io/pypi/v/jupyterlab-spellchecker.svg)](https://pypi.org/project/jupyterlab-spellchecker/)
+[![Conda version](https://img.shields.io/conda/vn/conda-forge/jupyterlab-spellchecker.svg)](https://anaconda.org/conda-forge/jupyterlab-spellchecker)
+
+A JupyterLab extension highlighting misspelled words in markdown cells within notebooks and in the text files.
+
+![](https://raw.githubusercontent.com/jupyterlab-contrib/spellchecker/master/demo.gif)
+
+The JupyterLab extension is based on [the spellchecker Jupyter Notebook extension](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/master/src/jupyter_contrib_nbextensions/nbextensions/spellchecker) and relies on [Typo.js](https://github.com/cfinke/Typo.js) for the actual spell checking.
+Spellchecker suggestions are available from the context menu. The style of the highlights can be customized in the *Advanced Settings Editor*.
+
+The extension provides (Hunspell) [SCOWL](http://wordlist.aspell.net/) dictionaries for:
+- American, British, Canadian, and Australian English
+- French,
+- German (Germany, Austria, Switzerland)
+- Portuguese,
+- Spanish
+
+and will also use the Hunspell dictionaries installed in [known paths](https://github.com/jupyterlab-contrib/spellchecker/search?q=OS_SPECIFIC_PATHS) which vary by operating systems.
+If you use JupyterLab in a browser running on a different computer than the jupyter server, please note that the dictionaries need to be installed on the server machine.
+
+You can add custom dictionary by placing Hunspell files it in `dictionaries` folder in one of the `data` locations as returned by:
+
+```bash
+jupyter --paths
+```
+
+You should place two files with extensions `.aff` and `.dic`, and name following [BCP 47](https://datatracker.ietf.org/doc/html/rfc5646#section-2.1) standards.
+For more details, please see the [example](#adding-dictionaries---example) below.
+
+## JupyterLab Version
+The extension has been tested up to JupyterLab version 3.0.
+
+## Installation
+
+For JupyterLab 3.x:
+
+```bash
+pip install jupyterlab-spellchecker
+```
+
+or
+
+```bash
+conda install -c conda-forge jupyterlab-spellchecker
+```
+
+For JupyterLab 2.x:
+
+```bash
+jupyter labextension install @ijmbarr/jupyterlab_spellchecker
+```
+
+### Adding dictionaries - example
+
+If `jupyter --paths` looks like:
+
+```
+config:
+    /home/your_name/.jupyter
+    /usr/local/etc/jupyter
+    /etc/jupyter
+data:
+    /home/your_name/.local/share/jupyter
+    /usr/local/share/jupyter
+    /usr/share/jupyter
+runtime:
+    /home/your_name/.local/share/jupyter/runtime
+```
+
+and you want to add Polish language, you would put `pl_PL.aff` and `pl_PL.dic` in `/home/your_name/.local/share/jupyter/dictionaries` (you will need to create this folder), so that the final structure looks similar to:
+
+```
+/home/your_name/.local/share/jupyter
+├── dictionaries
+│   ├── pl_PL.aff
+│   └── pl_PL.dic
+├── kernels
+│   └── julia-1.5
+│       ├── kernel.json
+│       ├── logo-32x32.png
+│       └── logo-64x64.png
+├── nbconvert
+│   └── templates
+│       ├── html
+│       └── latex
+├── nbsignatures.db
+├── notebook_secret
+└── runtime
+```
+
+#### Where to get the dictionaries from?
+
+Some good sources of dictionaries include:
+- [LibreOffice/dictionaries](https://github.com/LibreOffice/dictionaries) GitHub repository
+- [Chromium](https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries/+/master) repository
+- (if you know of any other quality resources please send a PR to add them here)
+
+#### Using online dictionaries
+
+An alternative to saving the dictionary on your own disk (or more accurately on the disk where jupyter-server is set up)
+is fetching the dictionaries from a remote URL. This requires an Internet connection to load the dictionary
+(each time when you open JupyterLab or change the dictionary), and might be useful if you are not able
+to save dictionaries on disk (e.g. when using JupyterLab on JupyterHub configured by someone else).
+
+To configure the online dictionaries go to *Advanced Settings Editor* → *Spellchecker*
+and set `onlineDictionaries` to an array of JSON objects like in the example below:
+
+```json
+[
+    {
+        "id": "en_US-online",
+        "aff": "https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.aff",
+        "dic": "https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.dic",
+        "name": "My favorite variant of English"
+    }
+]
+```
+
+## Contributing
+
+### Development install
+
+Note: You will need NodeJS to build the extension package.
+
+The `jlpm` command is JupyterLab's pinned version of
+[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
+`yarn` or `npm` in lieu of `jlpm` below.
+
+```bash
+# Clone the repo to your local environment
+# Change directory to the jupyterlab_spellchecker directory
+# Install package in development mode
+pip install -e .
+# Link your development version of the extension with JupyterLab
+jupyter labextension develop . --overwrite
+# Rebuild extension Typescript source after making changes
+jlpm run build
+pip install pytest
+```
+
+You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension.
+
+```bash
+# Watch the source directory in one terminal, automatically rebuilding when needed
+jlpm run watch
+# Run JupyterLab in another terminal
+jupyter lab
+```
+
+### Before commit
+
+Make sure that eslint passes:
+
+```bash
+jlpm run eslint:check
+```
+
+If there are any issues it might be possible to autofix them with:
+
+```bash
+jlpm run eslint
+```
+
+Run tests:
+
+```bash
+python -m pytest
+```

+ 13 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/README.txt

@@ -0,0 +1,13 @@
+Dictionaries
+============
+
+The dictionaries are downloaded from:
+
+https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries/+/master
+
+and 
+
+https://cgit.freedesktop.org/libreoffice/dictionaries/plain
+
+
+Licences are described in the README files according to the languages.

+ 729 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_AT_frami.aff

@@ -0,0 +1,729 @@
+# this is the affix file of the de_AT Hunspell dictionary
+# derived from the igerman98 dictionary
+#
+# Version: 20161207+frami20170109
+#
+# Copyright (C) 1998-2016 Björn Jacke <bjoern@j3e.de>
+#
+# License: GPLv2, GPLv3
+# There should be a copy of both of this licenses included
+# with every distribution of this dictionary. Modified
+# versions using the GPL may only include the GPL
+
+SET ISO8859-1
+TRY esijanrtolcdugmphbyfvkwqxzäüößáéêàâñESIJANRTOLCDUGMPHBYFVKWQXZÄÜÖÉ-.
+
+PFX U Y 1
+PFX U   0     un       .
+
+PFX V Y 1
+PFX V   0     ver      .
+
+SFX F Y 35
+SFX F   0     nen        in
+SFX F   e     in         e
+SFX F   e     innen      e
+SFX F   0     in         [^i]n
+SFX F   0     innen      [^i]n
+SFX F   0     in         [^enr]
+SFX F   0     innen      [^enr]
+SFX F   0     in         [^e]r
+SFX F   0     innen      [^e]r
+SFX F   0     in         [^r]er
+SFX F   0     innen      [^r]er
+SFX F   0     in         [^e]rer
+SFX F   0     innen      [^e]rer
+SFX F   0     in         ierer
+SFX F   0     innen      ierer
+SFX F   er    in         [^i]erer
+SFX F   er    innen      [^i]erer
+SFX F   in    In         in
+SFX F   in    Innen      in
+SFX F   e     In         e
+SFX F   e     Innen      e
+SFX F   0     In         [^i]n
+SFX F   0     Innen      [^i]n
+SFX F   0     In         [^en]
+SFX F   0     Innen      [^en]
+SFX F   0     In         [^e]r
+SFX F   0     Innen      [^e]r
+SFX F   0     In         [^r]er
+SFX F   0     Innen      [^r]er
+SFX F   0     In         [^e]rer
+SFX F   0     Innen      [^e]rer
+SFX F   0     In         ierer
+SFX F   0     Innen      ierer
+SFX F   er    In         [^i]erer
+SFX F   er    Innen      [^i]erer
+#SFX F   en    innen        en
+#SFX F   en    Innen        en
+
+
+SFX L N 12
+SFX L   0       tlich      n
+SFX L   0       tliche     n
+SFX L   0       tlicher    n
+SFX L   0       tliches    n
+SFX L   0       tlichem    n
+SFX L   0       tlichen    n
+SFX L   0       lich       [^n]
+SFX L   0       liche      [^n]
+SFX L   0       licher     [^n]
+SFX L   0       liches     [^n]
+SFX L   0       lichem     [^n]
+SFX L   0       lichen     [^n]
+
+
+#SFX H N 2
+#SFX H   0       heit       .
+#SFX H   0       heiten     .
+
+
+#SFX K N 2
+#SFX K   0       keit       .
+#SFX K   0       keiten     .
+
+
+SFX M N 10
+SFX M   0       chen       [^se]
+SFX M   0       chens      [^se]
+SFX M   ass     ässchen    ass
+SFX M   ass     ässchens   ass
+SFX M   oss     össchen    oss
+SFX M   oss     össchens   oss
+SFX M   uss     üsschen    uss
+SFX M   uss     üsschens   uss
+SFX M   e       chen       e
+SFX M   e       chens      e
+
+
+SFX A Y 46
+SFX A   0       r          e
+SFX A   0       n          e
+SFX A   0       m          e
+SFX A   0       s          e
+SFX A   0       e          [^elr]
+SFX A   0       er         [^elr]
+SFX A   0       en         [^elr]
+SFX A   0       em         [^elr]
+SFX A   0       es         [^elr]
+SFX A   0       e          [^e][rl]
+SFX A   0       er         [^e][rl]
+SFX A   0       en         [^e][rl]
+SFX A   0       em         [^e][rl]
+SFX A   0       es         [^e][rl]
+SFX A   0       e          [^u]er
+SFX A   0       er         [^u]er
+SFX A   0       en         [^u]er
+SFX A   0       em         [^u]er
+SFX A   0       es         [^u]er
+SFX A   er      re         uer
+SFX A   er      rer        uer
+SFX A   er      ren        uer
+SFX A   er      rem        uer
+SFX A   er      res        uer
+SFX A   0       e          [eil]el
+SFX A   0       er         [eil]el
+SFX A   0       en         [eil]el
+SFX A   0       em         [eil]el
+SFX A   0       es         [eil]el
+SFX A   el      le         [^eil]el
+SFX A   el      ler        [^eil]el
+SFX A   el      len        [^eil]el
+SFX A   el      lem        [^eil]el
+SFX A   el      les        [^eil]el
+SFX A   lig     elig       [^aeiouhlräüö]lig
+SFX A   lig     elige      [^aeiouhlräüö]lig
+SFX A   lig     eliger     [^aeiouhlräüö]lig
+SFX A   lig     eligen     [^aeiouhlräüö]lig
+SFX A   lig     eligem     [^aeiouhlräüö]lig
+SFX A   lig     eliges     [^aeiouhlräüö]lig
+SFX A   erig    rig        [^hi]erig
+SFX A   erig    rige       [^hi]erig
+SFX A   erig    riger      [^hi]erig
+SFX A   erig    rigen      [^hi]erig
+SFX A   erig    rigem      [^hi]erig
+SFX A   erig    riges      [^hi]erig
+
+
+SFX C Y 100
+SFX C   0       ere        [^elr]
+SFX C   0       erer       [^elr]
+SFX C   0       eren       [^elr]
+SFX C   0       erem       [^elr]
+SFX C   0       eres       [^elr]
+SFX C   0       re         e
+SFX C   0       rer        e
+SFX C   0       ren        e
+SFX C   0       rem        e
+SFX C   0       res        e
+SFX C   0       ere        [^e][lr]
+SFX C   0       erer       [^e][lr]
+SFX C   0       eren       [^e][lr]
+SFX C   0       erem       [^e][lr]
+SFX C   0       eres       [^e][lr]
+SFX C   el      lere       el
+SFX C   el      lerer      el
+SFX C   el      leren      el
+SFX C   el      lerem      el
+SFX C   el      leres      el
+SFX C   er      rere       uer
+SFX C   er      rerer      uer
+SFX C   er      reren      uer
+SFX C   er      rerem      uer
+SFX C   er      reres      uer
+SFX C   0       ere        [^u]er
+SFX C   0       erer       [^u]er
+SFX C   0       eren       [^u]er
+SFX C   0       erem       [^u]er
+SFX C   0       eres       [^u]er
+SFX C   lig     eligere    [^aeiouhlräüö]lig
+SFX C   lig     eligerer   [^aeiouhlräüö]lig
+SFX C   lig     eligeren   [^aeiouhlräüö]lig
+SFX C   lig     eligerem   [^aeiouhlräüö]lig
+SFX C   lig     eligeres   [^aeiouhlräüö]lig
+SFX C   erig    rigere     [^hi]erig
+SFX C   erig    rigerer    [^hi]erig
+SFX C   erig    rigeren    [^hi]erig
+SFX C   erig    rigerem    [^hi]erig
+SFX C   erig    rigeres    [^hi]erig
+SFX C   0       est        [kßsuxz]
+SFX C   0       este       [kßsuxz]
+SFX C   0       ester      [kßsuxz]
+SFX C   0       esten      [kßsuxz]
+SFX C   0       estem      [kßsuxz]
+SFX C   0       estes      [kßsuxz]
+SFX C   0       st         et
+SFX C   0       ste        et
+SFX C   0       ster       et
+SFX C   0       sten       et
+SFX C   0       stem       et
+SFX C   0       stes       et
+SFX C   0       st         igt
+SFX C   0       ste        igt
+SFX C   0       ster       igt
+SFX C   0       sten       igt
+SFX C   0       stem       igt
+SFX C   0       stes       igt
+SFX C   0       est        [^i]gt
+SFX C   0       este       [^i]gt
+SFX C   0       ester      [^i]gt
+SFX C   0       esten      [^i]gt
+SFX C   0       estem      [^i]gt
+SFX C   0       estes      [^i]gt
+SFX C   0       est        [^eg]t
+SFX C   0       este       [^eg]t
+SFX C   0       ester      [^eg]t
+SFX C   0       esten      [^eg]t
+SFX C   0       estem      [^eg]t
+SFX C   0       estes      [^eg]t
+SFX C   0       st         [^kßstxz]
+SFX C   0       ste        [^kßstxz]
+SFX C   0       ster       [^kßstxz]
+SFX C   0       sten       [^kßstxz]
+SFX C   0       stem       [^kßstxz]
+SFX C   0       stes       [^kßstxz]
+SFX C   0       st         nd
+SFX C   0       ste        nd
+SFX C   0       ster       nd
+SFX C   0       sten       nd
+SFX C   0       stem       nd
+SFX C   0       stes       nd
+SFX C   0       est        [^n]d
+SFX C   0       este       [^n]d
+SFX C   0       ester      [^n]d
+SFX C   0       esten      [^n]d
+SFX C   0       estem      [^n]d
+SFX C   0       estes      [^n]d
+SFX C   lig     eligst     [^aeiouhlräüö]lig
+SFX C   lig     eligste    [^aeiouhlräüö]lig
+SFX C   lig     eligster   [^aeiouhlräüö]lig
+SFX C   lig     eligsten   [^aeiouhlräüö]lig
+SFX C   lig     eligstem   [^aeiouhlräüö]lig
+SFX C   lig     eligstes   [^aeiouhlräüö]lig
+SFX C   erig    rigst      [^hi]erig
+SFX C   erig    rigste     [^hi]erig
+SFX C   erig    rigster    [^hi]erig
+SFX C   erig    rigsten    [^hi]erig
+SFX C   erig    rigstem    [^hi]erig
+SFX C   erig    rigstes    [^hi]erig
+
+
+SFX E Y 1
+SFX E   0       e          .
+
+
+SFX f Y 4
+SFX f   ph      f          ph
+SFX f   ph      fen        ph
+SFX f   phie    fie        phie
+SFX f   phie    fien       phie
+
+
+SFX N Y 1
+SFX N   0       n          .
+
+
+SFX P Y 1
+SFX P   0       en         .
+
+
+SFX p Y 26
+SFX p   auf     äufe      auf
+SFX p   auf     äufen     auf
+SFX p   aus     äuser     [hH]aus
+SFX p   aus     äusern    [hH]aus
+SFX p   arkt    ärkte     [mM]arkt
+SFX p   arkt    ärkten    [mM]arkt
+SFX p   ang     änge      ang
+SFX p   ang     ängen     ang
+SFX p   uß      üße       uß
+SFX p   uß      üßen      uß
+SFX p   oß      öße       oß
+SFX p   oß      ößen      oß
+SFX p   aum     äume      aum
+SFX p   aum     äumen     aum
+SFX p   ag      äge       ag
+SFX p   ag      ägen      ag
+SFX p   ug      üge       ug
+SFX p   ug      ügen      ug
+SFX p   all     älle      all
+SFX p   all     ällen     all
+SFX p   ass     ässe      ass
+SFX p   ass     ässen     ass
+SFX p   uss     üsse      uss
+SFX p   uss     üssen     uss
+SFX p   oss     össe      oss
+SFX p   oss     össen     oss
+# last ...oss rules are for swiss de_CH only - but do not affect de_DE
+
+
+SFX R Y 3
+SFX R   0       er         [^e]
+SFX R   0       ern        [^e]
+SFX R   0       r          e
+
+
+SFX S Y 1
+SFX S   0       s          .
+
+
+SFX q Y 2
+SFX q   0       se        s
+SFX q   0       sen       s
+
+
+SFX Q Y 1
+SFX Q   0       ses       s
+#SFX Q   0       se        s
+#SFX Q   0       sen       s
+
+
+SFX T Y 1
+SFX T   0       es         .
+
+
+SFX J Y 12
+SFX J   n       ung        [bgkpßsz]eln
+SFX J   n       ungen      [bgkpßsz]eln
+SFX J   eln     lung       eln
+SFX J   n       ung        ern
+SFX J   en      ung        en
+SFX J   eln     lungen     eln
+SFX J   n       ungen      ern
+SFX J   en      ungen      en
+SFX J   0       ung        [^n]
+SFX J   0       ungen      [^n]
+SFX J   el      lung       el
+SFX J   el      lungen     el
+
+
+SFX B N 12
+SFX B   n       bar        e[lr]n
+SFX B   n       bare       e[lr]n
+SFX B   n       baren      e[lr]n
+SFX B   n       barer      e[lr]n
+SFX B   n       bares      e[lr]n
+SFX B   n       barem      e[lr]n
+SFX B   en      bar        en
+SFX B   en      bare       en
+SFX B   en      baren      en
+SFX B   en      barer      en
+SFX B   en      bares      en
+SFX B   en      barem      en
+
+
+SFX D Y 6
+SFX D   0       d          n
+SFX D   0       de         n
+SFX D   0       den        n
+SFX D   0       der        n
+SFX D   0       des        n
+SFX D   0       dem        n
+
+
+
+SFX W Y 5
+SFX W   en      0          en
+SFX W   n       0          [^e]n
+SFX W   st      0          [^s]st
+SFX W   t       0          sst
+SFX W   t       0          [^s]t
+
+
+SFX I Y 16
+SFX I   n       0          en
+SFX I   eln     le         eln
+SFX I   n       e          eln
+SFX I   ern     re         ern
+SFX I   n       e          ern
+SFX I   n       t          e[lr]n
+SFX I   n       t          [dt]en
+SFX I   en      t          [^dimnt]en
+SFX I   en      t          eien
+SFX I   n       t          [^e]ien
+SFX I   n       t          chnen
+SFX I   en      t          [^c]h[mn]en
+SFX I   n       t          [^aäehilmnoöuür][mn]en
+SFX I   en      t          [aäeilmnoöuür][mn]en
+SFX I   n       e          un
+SFX I   n       t          un
+
+
+SFX X Y 26
+SFX X   n       t          e[lr]n
+SFX X   n       t          [dtw]en
+SFX X   en      t          eien
+SFX X   n       t          [^e]ien
+SFX X   en      t          [^ditmnw]en
+SFX X   n       t          chnen
+SFX X   en      t          [^c]h[mn]en
+SFX X   n       t          [^aäehilmnoöuür][mn]en
+SFX X   en      t          [aäeilmnoöuür][mn]en
+SFX X   n       t          un
+SFX X   st      0          tst
+SFX X   n       st         e[lr]n
+SFX X   n       st         [dtw]en
+SFX X   en      st         [^dimnßstwzx]en
+SFX X   en      st         eien
+SFX X   n       st         [^e]ien
+SFX X   n       st         chnen
+SFX X   en      st         [^c]h[mn]en
+SFX X   n       st         [^aäehilmnoöuür][mn]en
+SFX X   en      st         [aäeilmnoöuür][mn]en
+SFX X   n       st         un
+SFX X   n       st         [ßsxz]en
+SFX X   n       st         ssen
+SFX X   n       st         schen
+SFX X   t       st         [^sz]t
+SFX X   t       est        zt
+
+
+SFX Y Y 36
+SFX Y   n       te         e[lr]n
+SFX Y   n       te         [dtw]en
+SFX Y   en      te         [^dimntw]en
+SFX Y   en      te         eien
+SFX Y   n       te         [^e]ien
+SFX Y   n       te         chnen
+SFX Y   en      te         [^c]h[mn]en
+SFX Y   n       te         [^aäehilmnoöuür][mn]en
+SFX Y   en      te         [aäeilmnoöuür][mn]en
+SFX Y   n       test       e[lr]n
+SFX Y   n       test       [dtw]en
+SFX Y   en      test       [^dimntw]en
+SFX Y   en      test       eien
+SFX Y   n       test       [^e]ien
+SFX Y   n       test       chnen
+SFX Y   en      test       [^c]h[mn]en
+SFX Y   n       test       [^aäehilmnoöuür][mn]en
+SFX Y   en      test       [aäeilmnoöuür][mn]en
+SFX Y   n       tet        e[lr]n
+SFX Y   n       tet        [dtw]en
+SFX Y   en      tet        [^dimntw]en
+SFX Y   en      tet        eien
+SFX Y   n       tet        [^e]ien
+SFX Y   n       tet        chnen
+SFX Y   en      tet        [^c]h[mn]en
+SFX Y   n       tet        [^aäehilmnoöuür][mn]en
+SFX Y   en      tet        [aäeilmnoöuür][mn]en
+SFX Y   n       ten        e[lr]n
+SFX Y   n       ten        [dtw]en
+SFX Y   en      ten        [^dimntw]en
+SFX Y   en      ten        eien
+SFX Y   n       ten        [^e]ien
+SFX Y   n       ten        chnen
+SFX Y   en      ten        [^c]h[mn]en
+SFX Y   n       ten        [^aäehilmnoöuür][mn]en
+SFX Y   en      ten        [aäeilmnoöuür][mn]en
+
+
+SFX Z Y 15
+SFX Z   0       st         [^hßsz]
+SFX Z   0       st         [^c]h
+SFX Z   0       st         [^s]ch
+SFX Z   0       est        [dfkstz]
+SFX Z   0       est        ch
+SFX Z   0       est        [au]ß
+SFX Z   0       est        ieß
+SFX Z   0       est        [io]ss
+SFX Z   0       t          [^dt]
+SFX Z   0       et         [dt]
+SFX Z   0       n          e
+SFX Z   0       en         ie
+SFX Z   0       en         [^e]
+SFX Z   0       est        iess
+SFX Z   0       est        [au]ss
+# last two ...ss rules only used for swiss de_CH - but de_DE is unaffected
+
+
+SFX O Y 21
+SFX O   n       tes        e[lr]n
+SFX O   n       tes        [dtw]en
+SFX O   en      tes        [^dmntw]en
+SFX O   n       tes        chnen
+SFX O   en      tes        [^c]h[mn]en
+SFX O   n       tes        [^aäehilmnoöuür][mn]en
+SFX O   en      tes        [aäeilmnoöuür][mn]en
+SFX O   n       ter        e[lr]n
+SFX O   n       ter        [dtw]en
+SFX O   en      ter        [^dmntw]en
+SFX O   n       ter        chnen
+SFX O   en      ter        [^c]h[mn]en
+SFX O   n       ter        [^aäehilmnoöuür][mn]en
+SFX O   en      ter        [aäeilmnoöuür][mn]en
+SFX O   n       tem        e[lr]n
+SFX O   n       tem        [dtw]en
+SFX O   en      tem        [^dmntw]en
+SFX O   n       tem        chnen
+SFX O   en      tem        [^c]h[mn]en
+SFX O   n       tem        [^aäehilmnoöuür][mn]en
+SFX O   en      tem        [aäeilmnoöuür][mn]en
+
+REP 28
+REP f ph
+REP ph f
+REP ß ss
+REP ss ß
+REP s ss
+REP ss s
+REP i ie
+REP ie i
+REP ee e
+REP o oh
+REP oh o
+REP a ah
+REP ah a
+REP e eh
+REP eh e
+REP ae ä
+REP oe ö
+REP ue ü
+REP Ae Ä
+REP Oe Ö
+REP Ue Ü
+REP d t
+REP t d
+REP th t
+REP t th
+REP r rh
+REP ch k
+REP k ch
+#REP eee ee-E
+
+
+# this one will allow "-Eltern" - Hunspell 1.1.5 bug, but CHECKSHARPS obsoletes LANG de_DE
+#LANG de_DE
+CHECKSHARPS
+
+
+COMPOUNDBEGIN x
+COMPOUNDMIDDLE y
+COMPOUNDEND z
+FORBIDDENWORD d
+
+# Prefixes are allowed at the beginning of compounds,
+# suffixes are allowed at the end of compounds by default:
+# (prefix)?(root)+(affix)?
+# Affixes with COMPOUNDPERMITFLAG may be inside of compounds.
+COMPOUNDPERMITFLAG c
+
+ONLYINCOMPOUND o
+
+# my PSEUDOROOT h(elper) flag
+NEEDAFFIX h
+
+# forbid uppercase characters at compound word bounds
+# BUT I want to take care about it myself ;-)
+# CHECKCOMPOUNDCASE
+KEEPCASE w
+
+# Affixes  signed  with CIRCUMFIX flag may be on a word when this word also has a prefix with CIRCUMFIX flag and vice versa.
+# for decapitalizing nouns with fogemorphemes
+CIRCUMFIX f
+
+# this one would make a separate dict entry "Denkmalsschutz" invalidate the
+# compound of "Denkmal"+"schutz". We do not want this feature here...
+# CHECKCOMPOUNDREP
+
+# make not all possible suggestions for typos of Flicken or some rare words
+NOSUGGEST n
+
+WORDCHARS ß-.
+
+# - setting this to 2 decreases performance by 1/10 but is needed for "öl" and "ei"
+# - setting this to 1 for handling Fuge-elements with dashes (Arbeits-) dash will 
+#   be a special word but - is handled as a affix now
+COMPOUNDMIN 2
+
+# this ones are for Duden R36 (old orthography)
+#CHECKCOMPOUNDPATTERN 2  #oldspell
+#CHECKCOMPOUNDPATTERN ee e #oldspell
+#CHECKCOMPOUNDPATTERN oo o #oldspell
+# also need oo o
+
+# this one needs to be flagable to be used for old orthography
+#CHECKCOMPOUNDTRIPLE
+
+
+PFX i Y 1
+PFX i 0 -/coyf .
+
+SFX j Y 3
+SFX j 0 0/xoc .
+SFX j 0 -/zocf .
+SFX j 0 -/cz .
+
+# Female forms for compound/Compound words:
+# attention: [^e][^n] does also filter out "...er" !
+SFX g Y 12
+SFX g 0  innen/xyoc [^n]
+SFX g en innen/xyoc en
+SFX g 0  Innen/xyoc [^n]
+SFX g en Innen/xyoc en
+SFX g 0  innen/xyocf [^n]
+SFX g en innen/xyocf en
+SFX g 0  Innen/xyocf [^n]
+SFX g en Innen/xyocf en
+SFX g 0  innen-/cz [^n]
+SFX g en innen-/cz en
+SFX g 0  Innen-/cz [^n]
+SFX g en Innen-/cz en
+
+
+PFX k Y 2
+PFX k 0 -/coxf .
+PFX k 0 0/coy .
+
+SFX e Y 2
+SFX e 0 0/yoc .
+SFX e 0 -/zc .
+
+# for Uppercased end-words to prepend - and lowercase: (Tier/EPSm) (EX: Bettbezüge und *-laken*)
+# AND
+# for lowercased end-words to prepend - and re-uppercase : (tier/EPSozm) (EX: Arbeits*-Tier*)
+#PFX m A -a/co A
+#PFX m a -/ a
+PFX m Y 58
+PFX m A -a A
+PFX m B -b B
+PFX m C -c C
+PFX m D -d D
+PFX m E -e E
+PFX m F -f F
+PFX m G -g G
+PFX m H -h H
+PFX m I -i I
+PFX m J -j J
+PFX m K -k K
+PFX m L -l L
+PFX m M -m M
+PFX m N -n N
+PFX m O -o O
+PFX m P -p P
+PFX m Q -q Q
+PFX m R -r R
+PFX m S -s S
+PFX m T -t T
+PFX m U -u U
+PFX m V -v V
+PFX m W -w W
+PFX m X -x X
+PFX m Y -y Y
+PFX m Z -z Z
+PFX m Ä -ä Ä
+PFX m Ö -ö Ö
+PFX m Ü -ü Ü
+PFX m a -A/co a
+PFX m b -B/co b
+PFX m c -C/co c
+PFX m d -D/co d
+PFX m e -E/co e
+PFX m f -F/co f
+PFX m g -G/co g
+PFX m h -H/co h
+PFX m i -I/co i
+PFX m j -J/co j
+PFX m k -K/co k
+PFX m l -L/co l
+PFX m m -M/co m
+PFX m n -N/co n
+PFX m o -O/co o
+PFX m p -P/co p
+PFX m q -Q/co q
+PFX m r -R/co r
+PFX m s -S/co s
+PFX m t -T/co t
+PFX m u -U/co u
+PFX m v -V/co v
+PFX m w -W/co w
+PFX m x -X/co x
+PFX m y -Y/co y
+PFX m z -Z/co z
+PFX m ä -Ä/co ä
+PFX m ö -Ö/co ö
+PFX m ü -Ü/co ü
+
+
+# Decapitalizing: (not used ATM... )
+# /co(f) : compound permit, in coumpount only, (decapitalizing with fogemorphemes)
+#PFX l Y 29
+#PFX l A a/co A
+#PFX l Ä ä/co Ä
+#PFX l B b/co B
+#PFX l C c/co C
+#PFX l D d/co D
+#PFX l E e/co E
+#PFX l F f/co F
+#PFX l G g/co G
+#PFX l H h/co H
+#PFX l I i/co I
+#PFX l J j/co J
+#PFX l K k/co K
+#PFX l L l/co L
+#PFX l M m/co M
+#PFX l N n/co N
+#PFX l O o/co O
+#PFX l Ö ö/co Ö
+#PFX l P p/co P
+#PFX l Q q/co Q
+#PFX l R r/co R
+#PFX l S s/co S
+#PFX l T t/co T
+#PFX l U u/co U
+#PFX l Ü ü/co Ü
+#PFX l V v/co V
+#PFX l W w/co W
+#PFX l X x/co X
+#PFX l Y y/co Y
+#PFX l Z z/co Z
+
+# private hunspell flags:
+# --x : not for capmain (rare words)
+
+# With "BREAK -" some wrong forms are accepted but that is needed for US-Wirtschaft etc.
+# So enabling this is the lesser evil. No perfect solution found so far...
+BREAK 2
+BREAK -
+BREAK .
+

File diff suppressed because it is too large
+ 258243 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_AT_frami.dic


+ 729 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_CH_frami.aff

@@ -0,0 +1,729 @@
+# this is the affix file of the de_CH Hunspell dictionary
+# derived from the igerman98 dictionary
+#
+# Version: 20161207+frami20170109
+#
+# Copyright (C) 1998-2016 Björn Jacke <bjoern@j3e.de>
+#
+# License: GPLv2, GPLv3
+# There should be a copy of both of this licenses included
+# with every distribution of this dictionary. Modified
+# versions using the GPL may only include the GPL
+
+SET ISO8859-1
+TRY esijanrtolcdugmphbyfvkwqxzäüößáéêàâñESIJANRTOLCDUGMPHBYFVKWQXZÄÜÖÉ-.
+
+PFX U Y 1
+PFX U   0     un       .
+
+PFX V Y 1
+PFX V   0     ver      .
+
+SFX F Y 35
+SFX F   0     nen        in
+SFX F   e     in         e
+SFX F   e     innen      e
+SFX F   0     in         [^i]n
+SFX F   0     innen      [^i]n
+SFX F   0     in         [^enr]
+SFX F   0     innen      [^enr]
+SFX F   0     in         [^e]r
+SFX F   0     innen      [^e]r
+SFX F   0     in         [^r]er
+SFX F   0     innen      [^r]er
+SFX F   0     in         [^e]rer
+SFX F   0     innen      [^e]rer
+SFX F   0     in         ierer
+SFX F   0     innen      ierer
+SFX F   er    in         [^i]erer
+SFX F   er    innen      [^i]erer
+SFX F   in    In         in
+SFX F   in    Innen      in
+SFX F   e     In         e
+SFX F   e     Innen      e
+SFX F   0     In         [^i]n
+SFX F   0     Innen      [^i]n
+SFX F   0     In         [^en]
+SFX F   0     Innen      [^en]
+SFX F   0     In         [^e]r
+SFX F   0     Innen      [^e]r
+SFX F   0     In         [^r]er
+SFX F   0     Innen      [^r]er
+SFX F   0     In         [^e]rer
+SFX F   0     Innen      [^e]rer
+SFX F   0     In         ierer
+SFX F   0     Innen      ierer
+SFX F   er    In         [^i]erer
+SFX F   er    Innen      [^i]erer
+#SFX F   en    innen        en
+#SFX F   en    Innen        en
+
+
+SFX L N 12
+SFX L   0       tlich      n
+SFX L   0       tliche     n
+SFX L   0       tlicher    n
+SFX L   0       tliches    n
+SFX L   0       tlichem    n
+SFX L   0       tlichen    n
+SFX L   0       lich       [^n]
+SFX L   0       liche      [^n]
+SFX L   0       licher     [^n]
+SFX L   0       liches     [^n]
+SFX L   0       lichem     [^n]
+SFX L   0       lichen     [^n]
+
+
+#SFX H N 2
+#SFX H   0       heit       .
+#SFX H   0       heiten     .
+
+
+#SFX K N 2
+#SFX K   0       keit       .
+#SFX K   0       keiten     .
+
+
+SFX M N 10
+SFX M   0       chen       [^se]
+SFX M   0       chens      [^se]
+SFX M   ass     ässchen    ass
+SFX M   ass     ässchens   ass
+SFX M   oss     össchen    oss
+SFX M   oss     össchens   oss
+SFX M   uss     üsschen    uss
+SFX M   uss     üsschens   uss
+SFX M   e       chen       e
+SFX M   e       chens      e
+
+
+SFX A Y 46
+SFX A   0       r          e
+SFX A   0       n          e
+SFX A   0       m          e
+SFX A   0       s          e
+SFX A   0       e          [^elr]
+SFX A   0       er         [^elr]
+SFX A   0       en         [^elr]
+SFX A   0       em         [^elr]
+SFX A   0       es         [^elr]
+SFX A   0       e          [^e][rl]
+SFX A   0       er         [^e][rl]
+SFX A   0       en         [^e][rl]
+SFX A   0       em         [^e][rl]
+SFX A   0       es         [^e][rl]
+SFX A   0       e          [^u]er
+SFX A   0       er         [^u]er
+SFX A   0       en         [^u]er
+SFX A   0       em         [^u]er
+SFX A   0       es         [^u]er
+SFX A   er      re         uer
+SFX A   er      rer        uer
+SFX A   er      ren        uer
+SFX A   er      rem        uer
+SFX A   er      res        uer
+SFX A   0       e          [eil]el
+SFX A   0       er         [eil]el
+SFX A   0       en         [eil]el
+SFX A   0       em         [eil]el
+SFX A   0       es         [eil]el
+SFX A   el      le         [^eil]el
+SFX A   el      ler        [^eil]el
+SFX A   el      len        [^eil]el
+SFX A   el      lem        [^eil]el
+SFX A   el      les        [^eil]el
+SFX A   lig     elig       [^aeiouhlräüö]lig
+SFX A   lig     elige      [^aeiouhlräüö]lig
+SFX A   lig     eliger     [^aeiouhlräüö]lig
+SFX A   lig     eligen     [^aeiouhlräüö]lig
+SFX A   lig     eligem     [^aeiouhlräüö]lig
+SFX A   lig     eliges     [^aeiouhlräüö]lig
+SFX A   erig    rig        [^hi]erig
+SFX A   erig    rige       [^hi]erig
+SFX A   erig    riger      [^hi]erig
+SFX A   erig    rigen      [^hi]erig
+SFX A   erig    rigem      [^hi]erig
+SFX A   erig    riges      [^hi]erig
+
+
+SFX C Y 100
+SFX C   0       ere        [^elr]
+SFX C   0       erer       [^elr]
+SFX C   0       eren       [^elr]
+SFX C   0       erem       [^elr]
+SFX C   0       eres       [^elr]
+SFX C   0       re         e
+SFX C   0       rer        e
+SFX C   0       ren        e
+SFX C   0       rem        e
+SFX C   0       res        e
+SFX C   0       ere        [^e][lr]
+SFX C   0       erer       [^e][lr]
+SFX C   0       eren       [^e][lr]
+SFX C   0       erem       [^e][lr]
+SFX C   0       eres       [^e][lr]
+SFX C   el      lere       el
+SFX C   el      lerer      el
+SFX C   el      leren      el
+SFX C   el      lerem      el
+SFX C   el      leres      el
+SFX C   er      rere       uer
+SFX C   er      rerer      uer
+SFX C   er      reren      uer
+SFX C   er      rerem      uer
+SFX C   er      reres      uer
+SFX C   0       ere        [^u]er
+SFX C   0       erer       [^u]er
+SFX C   0       eren       [^u]er
+SFX C   0       erem       [^u]er
+SFX C   0       eres       [^u]er
+SFX C   lig     eligere    [^aeiouhlräüö]lig
+SFX C   lig     eligerer   [^aeiouhlräüö]lig
+SFX C   lig     eligeren   [^aeiouhlräüö]lig
+SFX C   lig     eligerem   [^aeiouhlräüö]lig
+SFX C   lig     eligeres   [^aeiouhlräüö]lig
+SFX C   erig    rigere     [^hi]erig
+SFX C   erig    rigerer    [^hi]erig
+SFX C   erig    rigeren    [^hi]erig
+SFX C   erig    rigerem    [^hi]erig
+SFX C   erig    rigeres    [^hi]erig
+SFX C   0       est        [kßsuxz]
+SFX C   0       este       [kßsuxz]
+SFX C   0       ester      [kßsuxz]
+SFX C   0       esten      [kßsuxz]
+SFX C   0       estem      [kßsuxz]
+SFX C   0       estes      [kßsuxz]
+SFX C   0       st         et
+SFX C   0       ste        et
+SFX C   0       ster       et
+SFX C   0       sten       et
+SFX C   0       stem       et
+SFX C   0       stes       et
+SFX C   0       st         igt
+SFX C   0       ste        igt
+SFX C   0       ster       igt
+SFX C   0       sten       igt
+SFX C   0       stem       igt
+SFX C   0       stes       igt
+SFX C   0       est        [^i]gt
+SFX C   0       este       [^i]gt
+SFX C   0       ester      [^i]gt
+SFX C   0       esten      [^i]gt
+SFX C   0       estem      [^i]gt
+SFX C   0       estes      [^i]gt
+SFX C   0       est        [^eg]t
+SFX C   0       este       [^eg]t
+SFX C   0       ester      [^eg]t
+SFX C   0       esten      [^eg]t
+SFX C   0       estem      [^eg]t
+SFX C   0       estes      [^eg]t
+SFX C   0       st         [^kßstxz]
+SFX C   0       ste        [^kßstxz]
+SFX C   0       ster       [^kßstxz]
+SFX C   0       sten       [^kßstxz]
+SFX C   0       stem       [^kßstxz]
+SFX C   0       stes       [^kßstxz]
+SFX C   0       st         nd
+SFX C   0       ste        nd
+SFX C   0       ster       nd
+SFX C   0       sten       nd
+SFX C   0       stem       nd
+SFX C   0       stes       nd
+SFX C   0       est        [^n]d
+SFX C   0       este       [^n]d
+SFX C   0       ester      [^n]d
+SFX C   0       esten      [^n]d
+SFX C   0       estem      [^n]d
+SFX C   0       estes      [^n]d
+SFX C   lig     eligst     [^aeiouhlräüö]lig
+SFX C   lig     eligste    [^aeiouhlräüö]lig
+SFX C   lig     eligster   [^aeiouhlräüö]lig
+SFX C   lig     eligsten   [^aeiouhlräüö]lig
+SFX C   lig     eligstem   [^aeiouhlräüö]lig
+SFX C   lig     eligstes   [^aeiouhlräüö]lig
+SFX C   erig    rigst      [^hi]erig
+SFX C   erig    rigste     [^hi]erig
+SFX C   erig    rigster    [^hi]erig
+SFX C   erig    rigsten    [^hi]erig
+SFX C   erig    rigstem    [^hi]erig
+SFX C   erig    rigstes    [^hi]erig
+
+
+SFX E Y 1
+SFX E   0       e          .
+
+
+SFX f Y 4
+SFX f   ph      f          ph
+SFX f   ph      fen        ph
+SFX f   phie    fie        phie
+SFX f   phie    fien       phie
+
+
+SFX N Y 1
+SFX N   0       n          .
+
+
+SFX P Y 1
+SFX P   0       en         .
+
+
+SFX p Y 26
+SFX p   auf     äufe      auf
+SFX p   auf     äufen     auf
+SFX p   aus     äuser     [hH]aus
+SFX p   aus     äusern    [hH]aus
+SFX p   arkt    ärkte     [mM]arkt
+SFX p   arkt    ärkten    [mM]arkt
+SFX p   ang     änge      ang
+SFX p   ang     ängen     ang
+SFX p   uß      üße       uß
+SFX p   uß      üßen      uß
+SFX p   oß      öße       oß
+SFX p   oß      ößen      oß
+SFX p   aum     äume      aum
+SFX p   aum     äumen     aum
+SFX p   ag      äge       ag
+SFX p   ag      ägen      ag
+SFX p   ug      üge       ug
+SFX p   ug      ügen      ug
+SFX p   all     älle      all
+SFX p   all     ällen     all
+SFX p   ass     ässe      ass
+SFX p   ass     ässen     ass
+SFX p   uss     üsse      uss
+SFX p   uss     üssen     uss
+SFX p   oss     össe      oss
+SFX p   oss     össen     oss
+# last ...oss rules are for swiss de_CH only - but do not affect de_DE
+
+
+SFX R Y 3
+SFX R   0       er         [^e]
+SFX R   0       ern        [^e]
+SFX R   0       r          e
+
+
+SFX S Y 1
+SFX S   0       s          .
+
+
+SFX q Y 2
+SFX q   0       se        s
+SFX q   0       sen       s
+
+
+SFX Q Y 1
+SFX Q   0       ses       s
+#SFX Q   0       se        s
+#SFX Q   0       sen       s
+
+
+SFX T Y 1
+SFX T   0       es         .
+
+
+SFX J Y 12
+SFX J   n       ung        [bgkpßsz]eln
+SFX J   n       ungen      [bgkpßsz]eln
+SFX J   eln     lung       eln
+SFX J   n       ung        ern
+SFX J   en      ung        en
+SFX J   eln     lungen     eln
+SFX J   n       ungen      ern
+SFX J   en      ungen      en
+SFX J   0       ung        [^n]
+SFX J   0       ungen      [^n]
+SFX J   el      lung       el
+SFX J   el      lungen     el
+
+
+SFX B N 12
+SFX B   n       bar        e[lr]n
+SFX B   n       bare       e[lr]n
+SFX B   n       baren      e[lr]n
+SFX B   n       barer      e[lr]n
+SFX B   n       bares      e[lr]n
+SFX B   n       barem      e[lr]n
+SFX B   en      bar        en
+SFX B   en      bare       en
+SFX B   en      baren      en
+SFX B   en      barer      en
+SFX B   en      bares      en
+SFX B   en      barem      en
+
+
+SFX D Y 6
+SFX D   0       d          n
+SFX D   0       de         n
+SFX D   0       den        n
+SFX D   0       der        n
+SFX D   0       des        n
+SFX D   0       dem        n
+
+
+
+SFX W Y 5
+SFX W   en      0          en
+SFX W   n       0          [^e]n
+SFX W   st      0          [^s]st
+SFX W   t       0          sst
+SFX W   t       0          [^s]t
+
+
+SFX I Y 16
+SFX I   n       0          en
+SFX I   eln     le         eln
+SFX I   n       e          eln
+SFX I   ern     re         ern
+SFX I   n       e          ern
+SFX I   n       t          e[lr]n
+SFX I   n       t          [dt]en
+SFX I   en      t          [^dimnt]en
+SFX I   en      t          eien
+SFX I   n       t          [^e]ien
+SFX I   n       t          chnen
+SFX I   en      t          [^c]h[mn]en
+SFX I   n       t          [^aäehilmnoöuür][mn]en
+SFX I   en      t          [aäeilmnoöuür][mn]en
+SFX I   n       e          un
+SFX I   n       t          un
+
+
+SFX X Y 26
+SFX X   n       t          e[lr]n
+SFX X   n       t          [dtw]en
+SFX X   en      t          eien
+SFX X   n       t          [^e]ien
+SFX X   en      t          [^ditmnw]en
+SFX X   n       t          chnen
+SFX X   en      t          [^c]h[mn]en
+SFX X   n       t          [^aäehilmnoöuür][mn]en
+SFX X   en      t          [aäeilmnoöuür][mn]en
+SFX X   n       t          un
+SFX X   st      0          tst
+SFX X   n       st         e[lr]n
+SFX X   n       st         [dtw]en
+SFX X   en      st         [^dimnßstwzx]en
+SFX X   en      st         eien
+SFX X   n       st         [^e]ien
+SFX X   n       st         chnen
+SFX X   en      st         [^c]h[mn]en
+SFX X   n       st         [^aäehilmnoöuür][mn]en
+SFX X   en      st         [aäeilmnoöuür][mn]en
+SFX X   n       st         un
+SFX X   n       st         [ßsxz]en
+SFX X   n       st         ssen
+SFX X   n       st         schen
+SFX X   t       st         [^sz]t
+SFX X   t       est        zt
+
+
+SFX Y Y 36
+SFX Y   n       te         e[lr]n
+SFX Y   n       te         [dtw]en
+SFX Y   en      te         [^dimntw]en
+SFX Y   en      te         eien
+SFX Y   n       te         [^e]ien
+SFX Y   n       te         chnen
+SFX Y   en      te         [^c]h[mn]en
+SFX Y   n       te         [^aäehilmnoöuür][mn]en
+SFX Y   en      te         [aäeilmnoöuür][mn]en
+SFX Y   n       test       e[lr]n
+SFX Y   n       test       [dtw]en
+SFX Y   en      test       [^dimntw]en
+SFX Y   en      test       eien
+SFX Y   n       test       [^e]ien
+SFX Y   n       test       chnen
+SFX Y   en      test       [^c]h[mn]en
+SFX Y   n       test       [^aäehilmnoöuür][mn]en
+SFX Y   en      test       [aäeilmnoöuür][mn]en
+SFX Y   n       tet        e[lr]n
+SFX Y   n       tet        [dtw]en
+SFX Y   en      tet        [^dimntw]en
+SFX Y   en      tet        eien
+SFX Y   n       tet        [^e]ien
+SFX Y   n       tet        chnen
+SFX Y   en      tet        [^c]h[mn]en
+SFX Y   n       tet        [^aäehilmnoöuür][mn]en
+SFX Y   en      tet        [aäeilmnoöuür][mn]en
+SFX Y   n       ten        e[lr]n
+SFX Y   n       ten        [dtw]en
+SFX Y   en      ten        [^dimntw]en
+SFX Y   en      ten        eien
+SFX Y   n       ten        [^e]ien
+SFX Y   n       ten        chnen
+SFX Y   en      ten        [^c]h[mn]en
+SFX Y   n       ten        [^aäehilmnoöuür][mn]en
+SFX Y   en      ten        [aäeilmnoöuür][mn]en
+
+
+SFX Z Y 15
+SFX Z   0       st         [^hßsz]
+SFX Z   0       st         [^c]h
+SFX Z   0       st         [^s]ch
+SFX Z   0       est        [dfkstz]
+SFX Z   0       est        ch
+SFX Z   0       est        [au]ß
+SFX Z   0       est        ieß
+SFX Z   0       est        [io]ss
+SFX Z   0       t          [^dt]
+SFX Z   0       et         [dt]
+SFX Z   0       n          e
+SFX Z   0       en         ie
+SFX Z   0       en         [^e]
+SFX Z   0       est        iess
+SFX Z   0       est        [au]ss
+# last two ...ss rules only used for swiss de_CH - but de_DE is unaffected
+
+
+SFX O Y 21
+SFX O   n       tes        e[lr]n
+SFX O   n       tes        [dtw]en
+SFX O   en      tes        [^dmntw]en
+SFX O   n       tes        chnen
+SFX O   en      tes        [^c]h[mn]en
+SFX O   n       tes        [^aäehilmnoöuür][mn]en
+SFX O   en      tes        [aäeilmnoöuür][mn]en
+SFX O   n       ter        e[lr]n
+SFX O   n       ter        [dtw]en
+SFX O   en      ter        [^dmntw]en
+SFX O   n       ter        chnen
+SFX O   en      ter        [^c]h[mn]en
+SFX O   n       ter        [^aäehilmnoöuür][mn]en
+SFX O   en      ter        [aäeilmnoöuür][mn]en
+SFX O   n       tem        e[lr]n
+SFX O   n       tem        [dtw]en
+SFX O   en      tem        [^dmntw]en
+SFX O   n       tem        chnen
+SFX O   en      tem        [^c]h[mn]en
+SFX O   n       tem        [^aäehilmnoöuür][mn]en
+SFX O   en      tem        [aäeilmnoöuür][mn]en
+
+REP 28
+REP f ph
+REP ph f
+REP ß ss
+REP ss ß
+REP s ss
+REP ss s
+REP i ie
+REP ie i
+REP ee e
+REP o oh
+REP oh o
+REP a ah
+REP ah a
+REP e eh
+REP eh e
+REP ae ä
+REP oe ö
+REP ue ü
+REP Ae Ä
+REP Oe Ö
+REP Ue Ü
+REP d t
+REP t d
+REP th t
+REP t th
+REP r rh
+REP ch k
+REP k ch
+#REP eee ee-E
+
+
+# this one will allow "-Eltern" - Hunspell 1.1.5 bug, but CHECKSHARPS obsoletes LANG de_DE
+#LANG de_DE
+CHECKSHARPS
+
+
+COMPOUNDBEGIN x
+COMPOUNDMIDDLE y
+COMPOUNDEND z
+FORBIDDENWORD d
+
+# Prefixes are allowed at the beginning of compounds,
+# suffixes are allowed at the end of compounds by default:
+# (prefix)?(root)+(affix)?
+# Affixes with COMPOUNDPERMITFLAG may be inside of compounds.
+COMPOUNDPERMITFLAG c
+
+ONLYINCOMPOUND o
+
+# my PSEUDOROOT h(elper) flag
+NEEDAFFIX h
+
+# forbid uppercase characters at compound word bounds
+# BUT I want to take care about it myself ;-)
+# CHECKCOMPOUNDCASE
+KEEPCASE w
+
+# Affixes  signed  with CIRCUMFIX flag may be on a word when this word also has a prefix with CIRCUMFIX flag and vice versa.
+# for decapitalizing nouns with fogemorphemes
+CIRCUMFIX f
+
+# this one would make a separate dict entry "Denkmalsschutz" invalidate the
+# compound of "Denkmal"+"schutz". We do not want this feature here...
+# CHECKCOMPOUNDREP
+
+# make not all possible suggestions for typos of Flicken or some rare words
+NOSUGGEST n
+
+WORDCHARS ß-.
+
+# - setting this to 2 decreases performance by 1/10 but is needed for "öl" and "ei"
+# - setting this to 1 for handling Fuge-elements with dashes (Arbeits-) dash will 
+#   be a special word but - is handled as a affix now
+COMPOUNDMIN 2
+
+# this ones are for Duden R36 (old orthography)
+#CHECKCOMPOUNDPATTERN 2  #oldspell
+#CHECKCOMPOUNDPATTERN ee e #oldspell
+#CHECKCOMPOUNDPATTERN oo o #oldspell
+# also need oo o
+
+# this one needs to be flagable to be used for old orthography
+#CHECKCOMPOUNDTRIPLE
+
+
+PFX i Y 1
+PFX i 0 -/coyf .
+
+SFX j Y 3
+SFX j 0 0/xoc .
+SFX j 0 -/zocf .
+SFX j 0 -/cz .
+
+# Female forms for compound/Compound words:
+# attention: [^e][^n] does also filter out "...er" !
+SFX g Y 12
+SFX g 0  innen/xyoc [^n]
+SFX g en innen/xyoc en
+SFX g 0  Innen/xyoc [^n]
+SFX g en Innen/xyoc en
+SFX g 0  innen/xyocf [^n]
+SFX g en innen/xyocf en
+SFX g 0  Innen/xyocf [^n]
+SFX g en Innen/xyocf en
+SFX g 0  innen-/cz [^n]
+SFX g en innen-/cz en
+SFX g 0  Innen-/cz [^n]
+SFX g en Innen-/cz en
+
+
+PFX k Y 2
+PFX k 0 -/coxf .
+PFX k 0 0/coy .
+
+SFX e Y 2
+SFX e 0 0/yoc .
+SFX e 0 -/zc .
+
+# for Uppercased end-words to prepend - and lowercase: (Tier/EPSm) (EX: Bettbezüge und *-laken*)
+# AND
+# for lowercased end-words to prepend - and re-uppercase : (tier/EPSozm) (EX: Arbeits*-Tier*)
+#PFX m A -a/co A
+#PFX m a -/ a
+PFX m Y 58
+PFX m A -a A
+PFX m B -b B
+PFX m C -c C
+PFX m D -d D
+PFX m E -e E
+PFX m F -f F
+PFX m G -g G
+PFX m H -h H
+PFX m I -i I
+PFX m J -j J
+PFX m K -k K
+PFX m L -l L
+PFX m M -m M
+PFX m N -n N
+PFX m O -o O
+PFX m P -p P
+PFX m Q -q Q
+PFX m R -r R
+PFX m S -s S
+PFX m T -t T
+PFX m U -u U
+PFX m V -v V
+PFX m W -w W
+PFX m X -x X
+PFX m Y -y Y
+PFX m Z -z Z
+PFX m Ä -ä Ä
+PFX m Ö -ö Ö
+PFX m Ü -ü Ü
+PFX m a -A/co a
+PFX m b -B/co b
+PFX m c -C/co c
+PFX m d -D/co d
+PFX m e -E/co e
+PFX m f -F/co f
+PFX m g -G/co g
+PFX m h -H/co h
+PFX m i -I/co i
+PFX m j -J/co j
+PFX m k -K/co k
+PFX m l -L/co l
+PFX m m -M/co m
+PFX m n -N/co n
+PFX m o -O/co o
+PFX m p -P/co p
+PFX m q -Q/co q
+PFX m r -R/co r
+PFX m s -S/co s
+PFX m t -T/co t
+PFX m u -U/co u
+PFX m v -V/co v
+PFX m w -W/co w
+PFX m x -X/co x
+PFX m y -Y/co y
+PFX m z -Z/co z
+PFX m ä -Ä/co ä
+PFX m ö -Ö/co ö
+PFX m ü -Ü/co ü
+
+
+# Decapitalizing: (not used ATM... )
+# /co(f) : compound permit, in coumpount only, (decapitalizing with fogemorphemes)
+#PFX l Y 29
+#PFX l A a/co A
+#PFX l Ä ä/co Ä
+#PFX l B b/co B
+#PFX l C c/co C
+#PFX l D d/co D
+#PFX l E e/co E
+#PFX l F f/co F
+#PFX l G g/co G
+#PFX l H h/co H
+#PFX l I i/co I
+#PFX l J j/co J
+#PFX l K k/co K
+#PFX l L l/co L
+#PFX l M m/co M
+#PFX l N n/co N
+#PFX l O o/co O
+#PFX l Ö ö/co Ö
+#PFX l P p/co P
+#PFX l Q q/co Q
+#PFX l R r/co R
+#PFX l S s/co S
+#PFX l T t/co T
+#PFX l U u/co U
+#PFX l Ü ü/co Ü
+#PFX l V v/co V
+#PFX l W w/co W
+#PFX l X x/co X
+#PFX l Y y/co Y
+#PFX l Z z/co Z
+
+# private hunspell flags:
+# --x : not for capmain (rare words)
+
+# With "BREAK -" some wrong forms are accepted but that is needed for US-Wirtschaft etc.
+# So enabling this is the lesser evil. No perfect solution found so far...
+BREAK 2
+BREAK -
+BREAK .
+

File diff suppressed because it is too large
+ 257827 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_CH_frami.dic


+ 729 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_DE_frami.aff

@@ -0,0 +1,729 @@
+# this is the affix file of the de_DE Hunspell dictionary
+# derived from the igerman98 dictionary
+#
+# Version: 20161207+frami20170109
+#
+# Copyright (C) 1998-2016 Björn Jacke <bjoern@j3e.de>
+#
+# License: GPLv2, GPLv3
+# There should be a copy of both of this licenses included
+# with every distribution of this dictionary. Modified
+# versions using the GPL may only include the GPL
+
+SET ISO8859-1
+TRY esijanrtolcdugmphbyfvkwqxzäüößáéêàâñESIJANRTOLCDUGMPHBYFVKWQXZÄÜÖÉ-.
+
+PFX U Y 1
+PFX U   0     un       .
+
+PFX V Y 1
+PFX V   0     ver      .
+
+SFX F Y 35
+SFX F   0     nen        in
+SFX F   e     in         e
+SFX F   e     innen      e
+SFX F   0     in         [^i]n
+SFX F   0     innen      [^i]n
+SFX F   0     in         [^enr]
+SFX F   0     innen      [^enr]
+SFX F   0     in         [^e]r
+SFX F   0     innen      [^e]r
+SFX F   0     in         [^r]er
+SFX F   0     innen      [^r]er
+SFX F   0     in         [^e]rer
+SFX F   0     innen      [^e]rer
+SFX F   0     in         ierer
+SFX F   0     innen      ierer
+SFX F   er    in         [^i]erer
+SFX F   er    innen      [^i]erer
+SFX F   in    In         in
+SFX F   in    Innen      in
+SFX F   e     In         e
+SFX F   e     Innen      e
+SFX F   0     In         [^i]n
+SFX F   0     Innen      [^i]n
+SFX F   0     In         [^en]
+SFX F   0     Innen      [^en]
+SFX F   0     In         [^e]r
+SFX F   0     Innen      [^e]r
+SFX F   0     In         [^r]er
+SFX F   0     Innen      [^r]er
+SFX F   0     In         [^e]rer
+SFX F   0     Innen      [^e]rer
+SFX F   0     In         ierer
+SFX F   0     Innen      ierer
+SFX F   er    In         [^i]erer
+SFX F   er    Innen      [^i]erer
+#SFX F   en    innen        en
+#SFX F   en    Innen        en
+
+
+SFX L N 12
+SFX L   0       tlich      n
+SFX L   0       tliche     n
+SFX L   0       tlicher    n
+SFX L   0       tliches    n
+SFX L   0       tlichem    n
+SFX L   0       tlichen    n
+SFX L   0       lich       [^n]
+SFX L   0       liche      [^n]
+SFX L   0       licher     [^n]
+SFX L   0       liches     [^n]
+SFX L   0       lichem     [^n]
+SFX L   0       lichen     [^n]
+
+
+#SFX H N 2
+#SFX H   0       heit       .
+#SFX H   0       heiten     .
+
+
+#SFX K N 2
+#SFX K   0       keit       .
+#SFX K   0       keiten     .
+
+
+SFX M N 10
+SFX M   0       chen       [^se]
+SFX M   0       chens      [^se]
+SFX M   ass     ässchen    ass
+SFX M   ass     ässchens   ass
+SFX M   oss     össchen    oss
+SFX M   oss     össchens   oss
+SFX M   uss     üsschen    uss
+SFX M   uss     üsschens   uss
+SFX M   e       chen       e
+SFX M   e       chens      e
+
+
+SFX A Y 46
+SFX A   0       r          e
+SFX A   0       n          e
+SFX A   0       m          e
+SFX A   0       s          e
+SFX A   0       e          [^elr]
+SFX A   0       er         [^elr]
+SFX A   0       en         [^elr]
+SFX A   0       em         [^elr]
+SFX A   0       es         [^elr]
+SFX A   0       e          [^e][rl]
+SFX A   0       er         [^e][rl]
+SFX A   0       en         [^e][rl]
+SFX A   0       em         [^e][rl]
+SFX A   0       es         [^e][rl]
+SFX A   0       e          [^u]er
+SFX A   0       er         [^u]er
+SFX A   0       en         [^u]er
+SFX A   0       em         [^u]er
+SFX A   0       es         [^u]er
+SFX A   er      re         uer
+SFX A   er      rer        uer
+SFX A   er      ren        uer
+SFX A   er      rem        uer
+SFX A   er      res        uer
+SFX A   0       e          [eil]el
+SFX A   0       er         [eil]el
+SFX A   0       en         [eil]el
+SFX A   0       em         [eil]el
+SFX A   0       es         [eil]el
+SFX A   el      le         [^eil]el
+SFX A   el      ler        [^eil]el
+SFX A   el      len        [^eil]el
+SFX A   el      lem        [^eil]el
+SFX A   el      les        [^eil]el
+SFX A   lig     elig       [^aeiouhlräüö]lig
+SFX A   lig     elige      [^aeiouhlräüö]lig
+SFX A   lig     eliger     [^aeiouhlräüö]lig
+SFX A   lig     eligen     [^aeiouhlräüö]lig
+SFX A   lig     eligem     [^aeiouhlräüö]lig
+SFX A   lig     eliges     [^aeiouhlräüö]lig
+SFX A   erig    rig        [^hi]erig
+SFX A   erig    rige       [^hi]erig
+SFX A   erig    riger      [^hi]erig
+SFX A   erig    rigen      [^hi]erig
+SFX A   erig    rigem      [^hi]erig
+SFX A   erig    riges      [^hi]erig
+
+
+SFX C Y 100
+SFX C   0       ere        [^elr]
+SFX C   0       erer       [^elr]
+SFX C   0       eren       [^elr]
+SFX C   0       erem       [^elr]
+SFX C   0       eres       [^elr]
+SFX C   0       re         e
+SFX C   0       rer        e
+SFX C   0       ren        e
+SFX C   0       rem        e
+SFX C   0       res        e
+SFX C   0       ere        [^e][lr]
+SFX C   0       erer       [^e][lr]
+SFX C   0       eren       [^e][lr]
+SFX C   0       erem       [^e][lr]
+SFX C   0       eres       [^e][lr]
+SFX C   el      lere       el
+SFX C   el      lerer      el
+SFX C   el      leren      el
+SFX C   el      lerem      el
+SFX C   el      leres      el
+SFX C   er      rere       uer
+SFX C   er      rerer      uer
+SFX C   er      reren      uer
+SFX C   er      rerem      uer
+SFX C   er      reres      uer
+SFX C   0       ere        [^u]er
+SFX C   0       erer       [^u]er
+SFX C   0       eren       [^u]er
+SFX C   0       erem       [^u]er
+SFX C   0       eres       [^u]er
+SFX C   lig     eligere    [^aeiouhlräüö]lig
+SFX C   lig     eligerer   [^aeiouhlräüö]lig
+SFX C   lig     eligeren   [^aeiouhlräüö]lig
+SFX C   lig     eligerem   [^aeiouhlräüö]lig
+SFX C   lig     eligeres   [^aeiouhlräüö]lig
+SFX C   erig    rigere     [^hi]erig
+SFX C   erig    rigerer    [^hi]erig
+SFX C   erig    rigeren    [^hi]erig
+SFX C   erig    rigerem    [^hi]erig
+SFX C   erig    rigeres    [^hi]erig
+SFX C   0       est        [kßsuxz]
+SFX C   0       este       [kßsuxz]
+SFX C   0       ester      [kßsuxz]
+SFX C   0       esten      [kßsuxz]
+SFX C   0       estem      [kßsuxz]
+SFX C   0       estes      [kßsuxz]
+SFX C   0       st         et
+SFX C   0       ste        et
+SFX C   0       ster       et
+SFX C   0       sten       et
+SFX C   0       stem       et
+SFX C   0       stes       et
+SFX C   0       st         igt
+SFX C   0       ste        igt
+SFX C   0       ster       igt
+SFX C   0       sten       igt
+SFX C   0       stem       igt
+SFX C   0       stes       igt
+SFX C   0       est        [^i]gt
+SFX C   0       este       [^i]gt
+SFX C   0       ester      [^i]gt
+SFX C   0       esten      [^i]gt
+SFX C   0       estem      [^i]gt
+SFX C   0       estes      [^i]gt
+SFX C   0       est        [^eg]t
+SFX C   0       este       [^eg]t
+SFX C   0       ester      [^eg]t
+SFX C   0       esten      [^eg]t
+SFX C   0       estem      [^eg]t
+SFX C   0       estes      [^eg]t
+SFX C   0       st         [^kßstxz]
+SFX C   0       ste        [^kßstxz]
+SFX C   0       ster       [^kßstxz]
+SFX C   0       sten       [^kßstxz]
+SFX C   0       stem       [^kßstxz]
+SFX C   0       stes       [^kßstxz]
+SFX C   0       st         nd
+SFX C   0       ste        nd
+SFX C   0       ster       nd
+SFX C   0       sten       nd
+SFX C   0       stem       nd
+SFX C   0       stes       nd
+SFX C   0       est        [^n]d
+SFX C   0       este       [^n]d
+SFX C   0       ester      [^n]d
+SFX C   0       esten      [^n]d
+SFX C   0       estem      [^n]d
+SFX C   0       estes      [^n]d
+SFX C   lig     eligst     [^aeiouhlräüö]lig
+SFX C   lig     eligste    [^aeiouhlräüö]lig
+SFX C   lig     eligster   [^aeiouhlräüö]lig
+SFX C   lig     eligsten   [^aeiouhlräüö]lig
+SFX C   lig     eligstem   [^aeiouhlräüö]lig
+SFX C   lig     eligstes   [^aeiouhlräüö]lig
+SFX C   erig    rigst      [^hi]erig
+SFX C   erig    rigste     [^hi]erig
+SFX C   erig    rigster    [^hi]erig
+SFX C   erig    rigsten    [^hi]erig
+SFX C   erig    rigstem    [^hi]erig
+SFX C   erig    rigstes    [^hi]erig
+
+
+SFX E Y 1
+SFX E   0       e          .
+
+
+SFX f Y 4
+SFX f   ph      f          ph
+SFX f   ph      fen        ph
+SFX f   phie    fie        phie
+SFX f   phie    fien       phie
+
+
+SFX N Y 1
+SFX N   0       n          .
+
+
+SFX P Y 1
+SFX P   0       en         .
+
+
+SFX p Y 26
+SFX p   auf     äufe      auf
+SFX p   auf     äufen     auf
+SFX p   aus     äuser     [hH]aus
+SFX p   aus     äusern    [hH]aus
+SFX p   arkt    ärkte     [mM]arkt
+SFX p   arkt    ärkten    [mM]arkt
+SFX p   ang     änge      ang
+SFX p   ang     ängen     ang
+SFX p   uß      üße       uß
+SFX p   uß      üßen      uß
+SFX p   oß      öße       oß
+SFX p   oß      ößen      oß
+SFX p   aum     äume      aum
+SFX p   aum     äumen     aum
+SFX p   ag      äge       ag
+SFX p   ag      ägen      ag
+SFX p   ug      üge       ug
+SFX p   ug      ügen      ug
+SFX p   all     älle      all
+SFX p   all     ällen     all
+SFX p   ass     ässe      ass
+SFX p   ass     ässen     ass
+SFX p   uss     üsse      uss
+SFX p   uss     üssen     uss
+SFX p   oss     össe      oss
+SFX p   oss     össen     oss
+# last ...oss rules are for swiss de_CH only - but do not affect de_DE
+
+
+SFX R Y 3
+SFX R   0       er         [^e]
+SFX R   0       ern        [^e]
+SFX R   0       r          e
+
+
+SFX S Y 1
+SFX S   0       s          .
+
+
+SFX q Y 2
+SFX q   0       se        s
+SFX q   0       sen       s
+
+
+SFX Q Y 1
+SFX Q   0       ses       s
+#SFX Q   0       se        s
+#SFX Q   0       sen       s
+
+
+SFX T Y 1
+SFX T   0       es         .
+
+
+SFX J Y 12
+SFX J   n       ung        [bgkpßsz]eln
+SFX J   n       ungen      [bgkpßsz]eln
+SFX J   eln     lung       eln
+SFX J   n       ung        ern
+SFX J   en      ung        en
+SFX J   eln     lungen     eln
+SFX J   n       ungen      ern
+SFX J   en      ungen      en
+SFX J   0       ung        [^n]
+SFX J   0       ungen      [^n]
+SFX J   el      lung       el
+SFX J   el      lungen     el
+
+
+SFX B N 12
+SFX B   n       bar        e[lr]n
+SFX B   n       bare       e[lr]n
+SFX B   n       baren      e[lr]n
+SFX B   n       barer      e[lr]n
+SFX B   n       bares      e[lr]n
+SFX B   n       barem      e[lr]n
+SFX B   en      bar        en
+SFX B   en      bare       en
+SFX B   en      baren      en
+SFX B   en      barer      en
+SFX B   en      bares      en
+SFX B   en      barem      en
+
+
+SFX D Y 6
+SFX D   0       d          n
+SFX D   0       de         n
+SFX D   0       den        n
+SFX D   0       der        n
+SFX D   0       des        n
+SFX D   0       dem        n
+
+
+
+SFX W Y 5
+SFX W   en      0          en
+SFX W   n       0          [^e]n
+SFX W   st      0          [^s]st
+SFX W   t       0          sst
+SFX W   t       0          [^s]t
+
+
+SFX I Y 16
+SFX I   n       0          en
+SFX I   eln     le         eln
+SFX I   n       e          eln
+SFX I   ern     re         ern
+SFX I   n       e          ern
+SFX I   n       t          e[lr]n
+SFX I   n       t          [dt]en
+SFX I   en      t          [^dimnt]en
+SFX I   en      t          eien
+SFX I   n       t          [^e]ien
+SFX I   n       t          chnen
+SFX I   en      t          [^c]h[mn]en
+SFX I   n       t          [^aäehilmnoöuür][mn]en
+SFX I   en      t          [aäeilmnoöuür][mn]en
+SFX I   n       e          un
+SFX I   n       t          un
+
+
+SFX X Y 26
+SFX X   n       t          e[lr]n
+SFX X   n       t          [dtw]en
+SFX X   en      t          eien
+SFX X   n       t          [^e]ien
+SFX X   en      t          [^ditmnw]en
+SFX X   n       t          chnen
+SFX X   en      t          [^c]h[mn]en
+SFX X   n       t          [^aäehilmnoöuür][mn]en
+SFX X   en      t          [aäeilmnoöuür][mn]en
+SFX X   n       t          un
+SFX X   st      0          tst
+SFX X   n       st         e[lr]n
+SFX X   n       st         [dtw]en
+SFX X   en      st         [^dimnßstwzx]en
+SFX X   en      st         eien
+SFX X   n       st         [^e]ien
+SFX X   n       st         chnen
+SFX X   en      st         [^c]h[mn]en
+SFX X   n       st         [^aäehilmnoöuür][mn]en
+SFX X   en      st         [aäeilmnoöuür][mn]en
+SFX X   n       st         un
+SFX X   n       st         [ßsxz]en
+SFX X   n       st         ssen
+SFX X   n       st         schen
+SFX X   t       st         [^sz]t
+SFX X   t       est        zt
+
+
+SFX Y Y 36
+SFX Y   n       te         e[lr]n
+SFX Y   n       te         [dtw]en
+SFX Y   en      te         [^dimntw]en
+SFX Y   en      te         eien
+SFX Y   n       te         [^e]ien
+SFX Y   n       te         chnen
+SFX Y   en      te         [^c]h[mn]en
+SFX Y   n       te         [^aäehilmnoöuür][mn]en
+SFX Y   en      te         [aäeilmnoöuür][mn]en
+SFX Y   n       test       e[lr]n
+SFX Y   n       test       [dtw]en
+SFX Y   en      test       [^dimntw]en
+SFX Y   en      test       eien
+SFX Y   n       test       [^e]ien
+SFX Y   n       test       chnen
+SFX Y   en      test       [^c]h[mn]en
+SFX Y   n       test       [^aäehilmnoöuür][mn]en
+SFX Y   en      test       [aäeilmnoöuür][mn]en
+SFX Y   n       tet        e[lr]n
+SFX Y   n       tet        [dtw]en
+SFX Y   en      tet        [^dimntw]en
+SFX Y   en      tet        eien
+SFX Y   n       tet        [^e]ien
+SFX Y   n       tet        chnen
+SFX Y   en      tet        [^c]h[mn]en
+SFX Y   n       tet        [^aäehilmnoöuür][mn]en
+SFX Y   en      tet        [aäeilmnoöuür][mn]en
+SFX Y   n       ten        e[lr]n
+SFX Y   n       ten        [dtw]en
+SFX Y   en      ten        [^dimntw]en
+SFX Y   en      ten        eien
+SFX Y   n       ten        [^e]ien
+SFX Y   n       ten        chnen
+SFX Y   en      ten        [^c]h[mn]en
+SFX Y   n       ten        [^aäehilmnoöuür][mn]en
+SFX Y   en      ten        [aäeilmnoöuür][mn]en
+
+
+SFX Z Y 15
+SFX Z   0       st         [^hßsz]
+SFX Z   0       st         [^c]h
+SFX Z   0       st         [^s]ch
+SFX Z   0       est        [dfkstz]
+SFX Z   0       est        ch
+SFX Z   0       est        [au]ß
+SFX Z   0       est        ieß
+SFX Z   0       est        [io]ss
+SFX Z   0       t          [^dt]
+SFX Z   0       et         [dt]
+SFX Z   0       n          e
+SFX Z   0       en         ie
+SFX Z   0       en         [^e]
+SFX Z   0       est        iess
+SFX Z   0       est        [au]ss
+# last two ...ss rules only used for swiss de_CH - but de_DE is unaffected
+
+
+SFX O Y 21
+SFX O   n       tes        e[lr]n
+SFX O   n       tes        [dtw]en
+SFX O   en      tes        [^dmntw]en
+SFX O   n       tes        chnen
+SFX O   en      tes        [^c]h[mn]en
+SFX O   n       tes        [^aäehilmnoöuür][mn]en
+SFX O   en      tes        [aäeilmnoöuür][mn]en
+SFX O   n       ter        e[lr]n
+SFX O   n       ter        [dtw]en
+SFX O   en      ter        [^dmntw]en
+SFX O   n       ter        chnen
+SFX O   en      ter        [^c]h[mn]en
+SFX O   n       ter        [^aäehilmnoöuür][mn]en
+SFX O   en      ter        [aäeilmnoöuür][mn]en
+SFX O   n       tem        e[lr]n
+SFX O   n       tem        [dtw]en
+SFX O   en      tem        [^dmntw]en
+SFX O   n       tem        chnen
+SFX O   en      tem        [^c]h[mn]en
+SFX O   n       tem        [^aäehilmnoöuür][mn]en
+SFX O   en      tem        [aäeilmnoöuür][mn]en
+
+REP 28
+REP f ph
+REP ph f
+REP ß ss
+REP ss ß
+REP s ss
+REP ss s
+REP i ie
+REP ie i
+REP ee e
+REP o oh
+REP oh o
+REP a ah
+REP ah a
+REP e eh
+REP eh e
+REP ae ä
+REP oe ö
+REP ue ü
+REP Ae Ä
+REP Oe Ö
+REP Ue Ü
+REP d t
+REP t d
+REP th t
+REP t th
+REP r rh
+REP ch k
+REP k ch
+#REP eee ee-E
+
+
+# this one will allow "-Eltern" - Hunspell 1.1.5 bug, but CHECKSHARPS obsoletes LANG de_DE
+#LANG de_DE
+CHECKSHARPS
+
+
+COMPOUNDBEGIN x
+COMPOUNDMIDDLE y
+COMPOUNDEND z
+FORBIDDENWORD d
+
+# Prefixes are allowed at the beginning of compounds,
+# suffixes are allowed at the end of compounds by default:
+# (prefix)?(root)+(affix)?
+# Affixes with COMPOUNDPERMITFLAG may be inside of compounds.
+COMPOUNDPERMITFLAG c
+
+ONLYINCOMPOUND o
+
+# my PSEUDOROOT h(elper) flag
+NEEDAFFIX h
+
+# forbid uppercase characters at compound word bounds
+# BUT I want to take care about it myself ;-)
+# CHECKCOMPOUNDCASE
+KEEPCASE w
+
+# Affixes  signed  with CIRCUMFIX flag may be on a word when this word also has a prefix with CIRCUMFIX flag and vice versa.
+# for decapitalizing nouns with fogemorphemes
+CIRCUMFIX f
+
+# this one would make a separate dict entry "Denkmalsschutz" invalidate the
+# compound of "Denkmal"+"schutz". We do not want this feature here...
+# CHECKCOMPOUNDREP
+
+# make not all possible suggestions for typos of Flicken or some rare words
+NOSUGGEST n
+
+WORDCHARS ß-.
+
+# - setting this to 2 decreases performance by 1/10 but is needed for "öl" and "ei"
+# - setting this to 1 for handling Fuge-elements with dashes (Arbeits-) dash will 
+#   be a special word but - is handled as a affix now
+COMPOUNDMIN 2
+
+# this ones are for Duden R36 (old orthography)
+#CHECKCOMPOUNDPATTERN 2  #oldspell
+#CHECKCOMPOUNDPATTERN ee e #oldspell
+#CHECKCOMPOUNDPATTERN oo o #oldspell
+# also need oo o
+
+# this one needs to be flagable to be used for old orthography
+#CHECKCOMPOUNDTRIPLE
+
+
+PFX i Y 1
+PFX i 0 -/coyf .
+
+SFX j Y 3
+SFX j 0 0/xoc .
+SFX j 0 -/zocf .
+SFX j 0 -/cz .
+
+# Female forms for compound/Compound words:
+# attention: [^e][^n] does also filter out "...er" !
+SFX g Y 12
+SFX g 0  innen/xyoc [^n]
+SFX g en innen/xyoc en
+SFX g 0  Innen/xyoc [^n]
+SFX g en Innen/xyoc en
+SFX g 0  innen/xyocf [^n]
+SFX g en innen/xyocf en
+SFX g 0  Innen/xyocf [^n]
+SFX g en Innen/xyocf en
+SFX g 0  innen-/cz [^n]
+SFX g en innen-/cz en
+SFX g 0  Innen-/cz [^n]
+SFX g en Innen-/cz en
+
+
+PFX k Y 2
+PFX k 0 -/coxf .
+PFX k 0 0/coy .
+
+SFX e Y 2
+SFX e 0 0/yoc .
+SFX e 0 -/zc .
+
+# for Uppercased end-words to prepend - and lowercase: (Tier/EPSm) (EX: Bettbezüge und *-laken*)
+# AND
+# for lowercased end-words to prepend - and re-uppercase : (tier/EPSozm) (EX: Arbeits*-Tier*)
+#PFX m A -a/co A
+#PFX m a -/ a
+PFX m Y 58
+PFX m A -a A
+PFX m B -b B
+PFX m C -c C
+PFX m D -d D
+PFX m E -e E
+PFX m F -f F
+PFX m G -g G
+PFX m H -h H
+PFX m I -i I
+PFX m J -j J
+PFX m K -k K
+PFX m L -l L
+PFX m M -m M
+PFX m N -n N
+PFX m O -o O
+PFX m P -p P
+PFX m Q -q Q
+PFX m R -r R
+PFX m S -s S
+PFX m T -t T
+PFX m U -u U
+PFX m V -v V
+PFX m W -w W
+PFX m X -x X
+PFX m Y -y Y
+PFX m Z -z Z
+PFX m Ä -ä Ä
+PFX m Ö -ö Ö
+PFX m Ü -ü Ü
+PFX m a -A/co a
+PFX m b -B/co b
+PFX m c -C/co c
+PFX m d -D/co d
+PFX m e -E/co e
+PFX m f -F/co f
+PFX m g -G/co g
+PFX m h -H/co h
+PFX m i -I/co i
+PFX m j -J/co j
+PFX m k -K/co k
+PFX m l -L/co l
+PFX m m -M/co m
+PFX m n -N/co n
+PFX m o -O/co o
+PFX m p -P/co p
+PFX m q -Q/co q
+PFX m r -R/co r
+PFX m s -S/co s
+PFX m t -T/co t
+PFX m u -U/co u
+PFX m v -V/co v
+PFX m w -W/co w
+PFX m x -X/co x
+PFX m y -Y/co y
+PFX m z -Z/co z
+PFX m ä -Ä/co ä
+PFX m ö -Ö/co ö
+PFX m ü -Ü/co ü
+
+
+# Decapitalizing: (not used ATM... )
+# /co(f) : compound permit, in coumpount only, (decapitalizing with fogemorphemes)
+#PFX l Y 29
+#PFX l A a/co A
+#PFX l Ä ä/co Ä
+#PFX l B b/co B
+#PFX l C c/co C
+#PFX l D d/co D
+#PFX l E e/co E
+#PFX l F f/co F
+#PFX l G g/co G
+#PFX l H h/co H
+#PFX l I i/co I
+#PFX l J j/co J
+#PFX l K k/co K
+#PFX l L l/co L
+#PFX l M m/co M
+#PFX l N n/co N
+#PFX l O o/co O
+#PFX l Ö ö/co Ö
+#PFX l P p/co P
+#PFX l Q q/co Q
+#PFX l R r/co R
+#PFX l S s/co S
+#PFX l T t/co T
+#PFX l U u/co U
+#PFX l Ü ü/co Ü
+#PFX l V v/co V
+#PFX l W w/co W
+#PFX l X x/co X
+#PFX l Y y/co Y
+#PFX l Z z/co Z
+
+# private hunspell flags:
+# --x : not for capmain (rare words)
+
+# With "BREAK -" some wrong forms are accepted but that is needed for US-Wirtschaft etc.
+# So enabling this is the lesser evil. No perfect solution found so far...
+BREAK 2
+BREAK -
+BREAK .
+

File diff suppressed because it is too large
+ 258218 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/de_DE_frami.dic


+ 205 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_AU.aff

@@ -0,0 +1,205 @@
+SET UTF-8
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+ICONV 1
+ICONV ’ '
+NOSUGGEST !
+
+# ordinal numbers
+COMPOUNDMIN 1
+# only in compounds: 1th, 2th, 3th
+ONLYINCOMPOUND c
+# compound rules:
+# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+COMPOUNDRULE 2
+COMPOUNDRULE n*1t
+COMPOUNDRULE n*mp
+WORDCHARS 0123456789
+
+PFX A Y 1
+PFX A   0     re         .
+
+PFX I Y 1
+PFX I   0     in         .
+
+PFX U Y 1
+PFX U   0     un         .
+
+PFX C Y 1
+PFX C   0     de          .
+
+PFX E Y 1
+PFX E   0     dis         .
+
+PFX F Y 1
+PFX F   0     con         .
+
+PFX K Y 1
+PFX K   0     pro         .
+
+SFX V N 2
+SFX V   e     ive        e
+SFX V   0     ive        [^e]
+
+SFX N Y 3
+SFX N   e     ion        e
+SFX N   y     ication    y 
+SFX N   0     en         [^ey] 
+
+SFX X Y 3
+SFX X   e     ions       e
+SFX X   y     ications   y
+SFX X   0     ens        [^ey]
+
+SFX H N 2
+SFX H   y     ieth       y
+SFX H   0     th         [^y] 
+
+SFX Y Y 1
+SFX Y   0     ly         .
+
+SFX G Y 2
+SFX G   e     ing        e
+SFX G   0     ing        [^e] 
+
+SFX J Y 2
+SFX J   e     ings       e
+SFX J   0     ings       [^e]
+
+SFX D Y 4
+SFX D   0     d          e
+SFX D   y     ied        [^aeiou]y
+SFX D   0     ed         [^ey]
+SFX D   0     ed         [aeiou]y
+
+SFX T N 4
+SFX T   0     st         e
+SFX T   y     iest       [^aeiou]y
+SFX T   0     est        [aeiou]y
+SFX T   0     est        [^ey]
+
+SFX R Y 4
+SFX R   0     r          e
+SFX R   y     ier        [^aeiou]y
+SFX R   0     er         [aeiou]y
+SFX R   0     er         [^ey]
+
+SFX Z Y 4
+SFX Z   0     rs         e
+SFX Z   y     iers       [^aeiou]y
+SFX Z   0     ers        [aeiou]y
+SFX Z   0     ers        [^ey]
+
+SFX S Y 4
+SFX S   y     ies        [^aeiou]y
+SFX S   0     s          [aeiou]y
+SFX S   0     es         [sxzh]
+SFX S   0     s          [^sxzhy]
+
+SFX P Y 3
+SFX P   y     iness      [^aeiou]y
+SFX P   0     ness       [aeiou]y
+SFX P   0     ness       [^y]
+
+SFX M Y 1
+SFX M   0     's         .
+
+SFX B Y 3
+SFX B   0     able       [^aeiou]
+SFX B   0     able       ee
+SFX B   e     able       [^aeiou]e
+
+SFX L Y 1
+SFX L   0     ment       .
+
+REP 90
+REP a ei
+REP ei a
+REP a ey
+REP ey a
+REP ai ie
+REP ie ai
+REP alot a_lot
+REP are air
+REP are ear
+REP are eir
+REP air are
+REP air ere
+REP ere air
+REP ere ear
+REP ere eir
+REP ear are
+REP ear air
+REP ear ere
+REP eir are
+REP eir ere
+REP ch te
+REP te ch
+REP ch ti
+REP ti ch
+REP ch tu
+REP tu ch
+REP ch s
+REP s ch
+REP ch k
+REP k ch
+REP f ph
+REP ph f
+REP gh f
+REP f gh
+REP i igh
+REP igh i
+REP i uy
+REP uy i
+REP i ee
+REP ee i
+REP j di
+REP di j
+REP j gg
+REP gg j
+REP j ge
+REP ge j
+REP s ti
+REP ti s
+REP s ci
+REP ci s
+REP k cc
+REP cc k
+REP k qu
+REP qu k
+REP kw qu
+REP o eau
+REP eau o
+REP o ew
+REP ew o
+REP oo ew
+REP ew oo
+REP ew ui
+REP ui ew
+REP oo ui
+REP ui oo
+REP ew u
+REP u ew
+REP oo u
+REP u oo
+REP u oe
+REP oe u
+REP u ieu
+REP ieu u
+REP ue ew
+REP ew ue
+REP uff ough
+REP oo ieu
+REP ieu oo
+REP ier ear
+REP ear ier
+REP ear air
+REP air ear
+REP w qu
+REP qu w
+REP z ss
+REP ss z
+REP shun tion
+REP shun sion
+REP shun cion
+REP size cise

File diff suppressed because it is too large
+ 49782 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_AU.dic


+ 205 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_CA.aff

@@ -0,0 +1,205 @@
+SET UTF-8
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+ICONV 1
+ICONV ’ '
+NOSUGGEST !
+
+# ordinal numbers
+COMPOUNDMIN 1
+# only in compounds: 1th, 2th, 3th
+ONLYINCOMPOUND c
+# compound rules:
+# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+COMPOUNDRULE 2
+COMPOUNDRULE n*1t
+COMPOUNDRULE n*mp
+WORDCHARS 0123456789
+
+PFX A Y 1
+PFX A   0     re         .
+
+PFX I Y 1
+PFX I   0     in         .
+
+PFX U Y 1
+PFX U   0     un         .
+
+PFX C Y 1
+PFX C   0     de          .
+
+PFX E Y 1
+PFX E   0     dis         .
+
+PFX F Y 1
+PFX F   0     con         .
+
+PFX K Y 1
+PFX K   0     pro         .
+
+SFX V N 2
+SFX V   e     ive        e
+SFX V   0     ive        [^e]
+
+SFX N Y 3
+SFX N   e     ion        e
+SFX N   y     ication    y 
+SFX N   0     en         [^ey] 
+
+SFX X Y 3
+SFX X   e     ions       e
+SFX X   y     ications   y
+SFX X   0     ens        [^ey]
+
+SFX H N 2
+SFX H   y     ieth       y
+SFX H   0     th         [^y] 
+
+SFX Y Y 1
+SFX Y   0     ly         .
+
+SFX G Y 2
+SFX G   e     ing        e
+SFX G   0     ing        [^e] 
+
+SFX J Y 2
+SFX J   e     ings       e
+SFX J   0     ings       [^e]
+
+SFX D Y 4
+SFX D   0     d          e
+SFX D   y     ied        [^aeiou]y
+SFX D   0     ed         [^ey]
+SFX D   0     ed         [aeiou]y
+
+SFX T N 4
+SFX T   0     st         e
+SFX T   y     iest       [^aeiou]y
+SFX T   0     est        [aeiou]y
+SFX T   0     est        [^ey]
+
+SFX R Y 4
+SFX R   0     r          e
+SFX R   y     ier        [^aeiou]y
+SFX R   0     er         [aeiou]y
+SFX R   0     er         [^ey]
+
+SFX Z Y 4
+SFX Z   0     rs         e
+SFX Z   y     iers       [^aeiou]y
+SFX Z   0     ers        [aeiou]y
+SFX Z   0     ers        [^ey]
+
+SFX S Y 4
+SFX S   y     ies        [^aeiou]y
+SFX S   0     s          [aeiou]y
+SFX S   0     es         [sxzh]
+SFX S   0     s          [^sxzhy]
+
+SFX P Y 3
+SFX P   y     iness      [^aeiou]y
+SFX P   0     ness       [aeiou]y
+SFX P   0     ness       [^y]
+
+SFX M Y 1
+SFX M   0     's         .
+
+SFX B Y 3
+SFX B   0     able       [^aeiou]
+SFX B   0     able       ee
+SFX B   e     able       [^aeiou]e
+
+SFX L Y 1
+SFX L   0     ment       .
+
+REP 90
+REP a ei
+REP ei a
+REP a ey
+REP ey a
+REP ai ie
+REP ie ai
+REP alot a_lot
+REP are air
+REP are ear
+REP are eir
+REP air are
+REP air ere
+REP ere air
+REP ere ear
+REP ere eir
+REP ear are
+REP ear air
+REP ear ere
+REP eir are
+REP eir ere
+REP ch te
+REP te ch
+REP ch ti
+REP ti ch
+REP ch tu
+REP tu ch
+REP ch s
+REP s ch
+REP ch k
+REP k ch
+REP f ph
+REP ph f
+REP gh f
+REP f gh
+REP i igh
+REP igh i
+REP i uy
+REP uy i
+REP i ee
+REP ee i
+REP j di
+REP di j
+REP j gg
+REP gg j
+REP j ge
+REP ge j
+REP s ti
+REP ti s
+REP s ci
+REP ci s
+REP k cc
+REP cc k
+REP k qu
+REP qu k
+REP kw qu
+REP o eau
+REP eau o
+REP o ew
+REP ew o
+REP oo ew
+REP ew oo
+REP ew ui
+REP ui ew
+REP oo ui
+REP ui oo
+REP ew u
+REP u ew
+REP oo u
+REP u oo
+REP u oe
+REP oe u
+REP u ieu
+REP ieu u
+REP ue ew
+REP ew ue
+REP uff ough
+REP oo ieu
+REP ieu oo
+REP ier ear
+REP ear ier
+REP ear air
+REP air ear
+REP w qu
+REP qu w
+REP z ss
+REP ss z
+REP shun tion
+REP shun sion
+REP shun cion
+REP size cise

File diff suppressed because it is too large
+ 49520 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_CA.dic


+ 205 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_GB-ise.aff

@@ -0,0 +1,205 @@
+SET UTF-8
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+ICONV 1
+ICONV ’ '
+NOSUGGEST !
+
+# ordinal numbers
+COMPOUNDMIN 1
+# only in compounds: 1th, 2th, 3th
+ONLYINCOMPOUND c
+# compound rules:
+# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+COMPOUNDRULE 2
+COMPOUNDRULE n*1t
+COMPOUNDRULE n*mp
+WORDCHARS 0123456789
+
+PFX A Y 1
+PFX A   0     re         .
+
+PFX I Y 1
+PFX I   0     in         .
+
+PFX U Y 1
+PFX U   0     un         .
+
+PFX C Y 1
+PFX C   0     de          .
+
+PFX E Y 1
+PFX E   0     dis         .
+
+PFX F Y 1
+PFX F   0     con         .
+
+PFX K Y 1
+PFX K   0     pro         .
+
+SFX V N 2
+SFX V   e     ive        e
+SFX V   0     ive        [^e]
+
+SFX N Y 3
+SFX N   e     ion        e
+SFX N   y     ication    y 
+SFX N   0     en         [^ey] 
+
+SFX X Y 3
+SFX X   e     ions       e
+SFX X   y     ications   y
+SFX X   0     ens        [^ey]
+
+SFX H N 2
+SFX H   y     ieth       y
+SFX H   0     th         [^y] 
+
+SFX Y Y 1
+SFX Y   0     ly         .
+
+SFX G Y 2
+SFX G   e     ing        e
+SFX G   0     ing        [^e] 
+
+SFX J Y 2
+SFX J   e     ings       e
+SFX J   0     ings       [^e]
+
+SFX D Y 4
+SFX D   0     d          e
+SFX D   y     ied        [^aeiou]y
+SFX D   0     ed         [^ey]
+SFX D   0     ed         [aeiou]y
+
+SFX T N 4
+SFX T   0     st         e
+SFX T   y     iest       [^aeiou]y
+SFX T   0     est        [aeiou]y
+SFX T   0     est        [^ey]
+
+SFX R Y 4
+SFX R   0     r          e
+SFX R   y     ier        [^aeiou]y
+SFX R   0     er         [aeiou]y
+SFX R   0     er         [^ey]
+
+SFX Z Y 4
+SFX Z   0     rs         e
+SFX Z   y     iers       [^aeiou]y
+SFX Z   0     ers        [aeiou]y
+SFX Z   0     ers        [^ey]
+
+SFX S Y 4
+SFX S   y     ies        [^aeiou]y
+SFX S   0     s          [aeiou]y
+SFX S   0     es         [sxzh]
+SFX S   0     s          [^sxzhy]
+
+SFX P Y 3
+SFX P   y     iness      [^aeiou]y
+SFX P   0     ness       [aeiou]y
+SFX P   0     ness       [^y]
+
+SFX M Y 1
+SFX M   0     's         .
+
+SFX B Y 3
+SFX B   0     able       [^aeiou]
+SFX B   0     able       ee
+SFX B   e     able       [^aeiou]e
+
+SFX L Y 1
+SFX L   0     ment       .
+
+REP 90
+REP a ei
+REP ei a
+REP a ey
+REP ey a
+REP ai ie
+REP ie ai
+REP alot a_lot
+REP are air
+REP are ear
+REP are eir
+REP air are
+REP air ere
+REP ere air
+REP ere ear
+REP ere eir
+REP ear are
+REP ear air
+REP ear ere
+REP eir are
+REP eir ere
+REP ch te
+REP te ch
+REP ch ti
+REP ti ch
+REP ch tu
+REP tu ch
+REP ch s
+REP s ch
+REP ch k
+REP k ch
+REP f ph
+REP ph f
+REP gh f
+REP f gh
+REP i igh
+REP igh i
+REP i uy
+REP uy i
+REP i ee
+REP ee i
+REP j di
+REP di j
+REP j gg
+REP gg j
+REP j ge
+REP ge j
+REP s ti
+REP ti s
+REP s ci
+REP ci s
+REP k cc
+REP cc k
+REP k qu
+REP qu k
+REP kw qu
+REP o eau
+REP eau o
+REP o ew
+REP ew o
+REP oo ew
+REP ew oo
+REP ew ui
+REP ui ew
+REP oo ui
+REP ui oo
+REP ew u
+REP u ew
+REP oo u
+REP u oo
+REP u oe
+REP oe u
+REP u ieu
+REP ieu u
+REP ue ew
+REP ew ue
+REP uff ough
+REP oo ieu
+REP ieu oo
+REP ier ear
+REP ear ier
+REP ear air
+REP air ear
+REP w qu
+REP qu w
+REP z ss
+REP ss z
+REP shun tion
+REP shun sion
+REP shun cion
+REP size cise

File diff suppressed because it is too large
+ 49560 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_GB-ise.dic


+ 205 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_US.aff

@@ -0,0 +1,205 @@
+SET UTF-8
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+ICONV 1
+ICONV ’ '
+NOSUGGEST !
+
+# ordinal numbers
+COMPOUNDMIN 1
+# only in compounds: 1th, 2th, 3th
+ONLYINCOMPOUND c
+# compound rules:
+# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+COMPOUNDRULE 2
+COMPOUNDRULE n*1t
+COMPOUNDRULE n*mp
+WORDCHARS 0123456789
+
+PFX A Y 1
+PFX A   0     re         .
+
+PFX I Y 1
+PFX I   0     in         .
+
+PFX U Y 1
+PFX U   0     un         .
+
+PFX C Y 1
+PFX C   0     de          .
+
+PFX E Y 1
+PFX E   0     dis         .
+
+PFX F Y 1
+PFX F   0     con         .
+
+PFX K Y 1
+PFX K   0     pro         .
+
+SFX V N 2
+SFX V   e     ive        e
+SFX V   0     ive        [^e]
+
+SFX N Y 3
+SFX N   e     ion        e
+SFX N   y     ication    y 
+SFX N   0     en         [^ey] 
+
+SFX X Y 3
+SFX X   e     ions       e
+SFX X   y     ications   y
+SFX X   0     ens        [^ey]
+
+SFX H N 2
+SFX H   y     ieth       y
+SFX H   0     th         [^y] 
+
+SFX Y Y 1
+SFX Y   0     ly         .
+
+SFX G Y 2
+SFX G   e     ing        e
+SFX G   0     ing        [^e] 
+
+SFX J Y 2
+SFX J   e     ings       e
+SFX J   0     ings       [^e]
+
+SFX D Y 4
+SFX D   0     d          e
+SFX D   y     ied        [^aeiou]y
+SFX D   0     ed         [^ey]
+SFX D   0     ed         [aeiou]y
+
+SFX T N 4
+SFX T   0     st         e
+SFX T   y     iest       [^aeiou]y
+SFX T   0     est        [aeiou]y
+SFX T   0     est        [^ey]
+
+SFX R Y 4
+SFX R   0     r          e
+SFX R   y     ier        [^aeiou]y
+SFX R   0     er         [aeiou]y
+SFX R   0     er         [^ey]
+
+SFX Z Y 4
+SFX Z   0     rs         e
+SFX Z   y     iers       [^aeiou]y
+SFX Z   0     ers        [aeiou]y
+SFX Z   0     ers        [^ey]
+
+SFX S Y 4
+SFX S   y     ies        [^aeiou]y
+SFX S   0     s          [aeiou]y
+SFX S   0     es         [sxzh]
+SFX S   0     s          [^sxzhy]
+
+SFX P Y 3
+SFX P   y     iness      [^aeiou]y
+SFX P   0     ness       [aeiou]y
+SFX P   0     ness       [^y]
+
+SFX M Y 1
+SFX M   0     's         .
+
+SFX B Y 3
+SFX B   0     able       [^aeiou]
+SFX B   0     able       ee
+SFX B   e     able       [^aeiou]e
+
+SFX L Y 1
+SFX L   0     ment       .
+
+REP 90
+REP a ei
+REP ei a
+REP a ey
+REP ey a
+REP ai ie
+REP ie ai
+REP alot a_lot
+REP are air
+REP are ear
+REP are eir
+REP air are
+REP air ere
+REP ere air
+REP ere ear
+REP ere eir
+REP ear are
+REP ear air
+REP ear ere
+REP eir are
+REP eir ere
+REP ch te
+REP te ch
+REP ch ti
+REP ti ch
+REP ch tu
+REP tu ch
+REP ch s
+REP s ch
+REP ch k
+REP k ch
+REP f ph
+REP ph f
+REP gh f
+REP f gh
+REP i igh
+REP igh i
+REP i uy
+REP uy i
+REP i ee
+REP ee i
+REP j di
+REP di j
+REP j gg
+REP gg j
+REP j ge
+REP ge j
+REP s ti
+REP ti s
+REP s ci
+REP ci s
+REP k cc
+REP cc k
+REP k qu
+REP qu k
+REP kw qu
+REP o eau
+REP eau o
+REP o ew
+REP ew o
+REP oo ew
+REP ew oo
+REP ew ui
+REP ui ew
+REP oo ui
+REP ui oo
+REP ew u
+REP u ew
+REP oo u
+REP u oo
+REP u oe
+REP oe u
+REP u ieu
+REP ieu u
+REP ue ew
+REP ew ue
+REP uff ough
+REP oo ieu
+REP ieu oo
+REP ier ear
+REP ear ier
+REP ear air
+REP air ear
+REP w qu
+REP qu w
+REP z ss
+REP ss z
+REP shun tion
+REP shun sion
+REP shun cion
+REP size cise

File diff suppressed because it is too large
+ 49525 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/en_US.dic


File diff suppressed because it is too large
+ 6893 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/es_ES.aff


File diff suppressed because it is too large
+ 71935 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/es_ES.dic


File diff suppressed because it is too large
+ 8975 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/fr.aff


File diff suppressed because it is too large
+ 80853 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/fr.dic


File diff suppressed because it is too large
+ 1086 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/pt_PT.aff


File diff suppressed because it is too large
+ 40626 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/dictionaries/pt_PT.dic


+ 8 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/handler.d.ts

@@ -0,0 +1,8 @@
+/**
+ * Call the API extension
+ *
+ * @param endPoint API REST end point for the extension
+ * @param init Initial values for the request
+ * @returns The response body interpreted as JSON
+ */
+export declare function requestAPI<T>(endPoint?: string, init?: RequestInit): Promise<T>;

+ 26 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/handler.js

@@ -0,0 +1,26 @@
+import { URLExt } from '@jupyterlab/coreutils';
+import { ServerConnection } from '@jupyterlab/services';
+/**
+ * Call the API extension
+ *
+ * @param endPoint API REST end point for the extension
+ * @param init Initial values for the request
+ * @returns The response body interpreted as JSON
+ */
+export async function requestAPI(endPoint = '', init = {}) {
+    // Make request to Jupyter API
+    const settings = ServerConnection.makeSettings();
+    const requestUrl = URLExt.join(settings.baseUrl, 'spellchecker', endPoint);
+    let response;
+    try {
+        response = await ServerConnection.makeRequest(requestUrl, init, settings);
+    }
+    catch (error) {
+        throw new ServerConnection.NetworkError(error);
+    }
+    const data = await response.json();
+    if (!response.ok) {
+        throw new ServerConnection.ResponseError(response, data.message);
+    }
+    return data;
+}

+ 9 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/index.d.ts

@@ -0,0 +1,9 @@
+import { JupyterFrontEndPlugin } from '@jupyterlab/application';
+import { LabIcon } from '@jupyterlab/ui-components';
+import '../style/index.css';
+export declare const spellcheckIcon: LabIcon;
+/**
+ * Initialization data for the jupyterlab_spellchecker extension.
+ */
+declare const extension: JupyterFrontEndPlugin<void>;
+export default extension;

+ 510 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/lib/index.js

@@ -0,0 +1,510 @@
+import { IEditorTracker } from '@jupyterlab/fileeditor';
+import { INotebookTracker } from '@jupyterlab/notebook';
+import { LabIcon } from '@jupyterlab/ui-components';
+import { ICommandPalette, InputDialog, ReactWidget } from '@jupyterlab/apputils';
+import { Menu } from '@lumino/widgets';
+import { ISettingRegistry } from '@jupyterlab/settingregistry';
+import { IStatusBar, TextItem } from '@jupyterlab/statusbar';
+import { ICodeMirror } from '@jupyterlab/codemirror';
+import { ITranslator, nullTranslator } from '@jupyterlab/translation';
+import { requestAPI } from './handler';
+import '../style/index.css';
+import spellcheckSvg from '../style/icons/ic-baseline-spellcheck.svg';
+export const spellcheckIcon = new LabIcon({
+    name: 'spellcheck:spellcheck',
+    svgstr: spellcheckSvg
+});
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const Typo = require('typo-js');
+class LanguageManager {
+    /**
+     * initialise the manager
+     * mainly reading the definitions from the external extension
+     */
+    constructor(settingsRegistry) {
+        const loadSettings = settingsRegistry.load(extension.id).then(settings => {
+            this.updateSettings(settings);
+            settings.changed.connect(() => {
+                this.updateSettings(settings);
+            });
+        });
+        this.ready = Promise.all([
+            this.fetchServerDictionariesList(),
+            loadSettings
+        ]).then(() => {
+            console.debug('LanguageManager is ready');
+        });
+    }
+    updateSettings(settings) {
+        if (settings) {
+            this.onlineDictionaries = settings.get('onlineDictionaries').composite.map(dictionary => {
+                return Object.assign(Object.assign({}, dictionary), { isOnline: true });
+            });
+        }
+    }
+    /**
+     * Read the list of languages from the server extension
+     */
+    fetchServerDictionariesList() {
+        return requestAPI('language_manager').then(values => {
+            console.debug('Dictionaries fetched from server');
+            this.serverDictionaries = values.dictionaries.map(dictionary => {
+                return Object.assign(Object.assign({}, dictionary), { isOnline: false });
+            });
+        });
+    }
+    get dictionaries() {
+        return [...this.serverDictionaries, ...this.onlineDictionaries];
+    }
+    /**
+     * get an array of languages, put "language" in front of the list
+     * the list is alphabetically sorted
+     */
+    getChoices(language) {
+        const options = language
+            ? [language, ...this.dictionaries.filter(l => l.id !== language.id)]
+            : this.dictionaries;
+        return options.sort((a, b) => a.name.localeCompare(b.name));
+    }
+    /**
+     * select the language by the identifier
+     */
+    getLanguageByIdentifier(identifier) {
+        const exactMatch = this.dictionaries.find(l => l.id === identifier);
+        if (exactMatch) {
+            return exactMatch;
+        }
+        // approximate matches support transition from the 0.5 version (and older)
+        // that used incorrect codes as language identifiers
+        const approximateMatch = this.dictionaries.find(l => l.id.toLowerCase() === identifier.replace('-', '_').toLowerCase());
+        if (approximateMatch) {
+            console.warn(`Language identifier ${identifier} has a non-exact match, please update it to ${approximateMatch.id}`);
+            return approximateMatch;
+        }
+    }
+}
+class StatusWidget extends ReactWidget {
+    constructor(source) {
+        super();
+        this.language_source = source;
+    }
+    render() {
+        return TextItem({ source: this.language_source() });
+    }
+}
+/**
+ * SpellChecker
+ */
+class SpellChecker {
+    constructor(app, tracker, editor_tracker, setting_registry, code_mirror, translator, palette, status_bar) {
+        this.app = app;
+        this.tracker = tracker;
+        this.editor_tracker = editor_tracker;
+        this.setting_registry = setting_registry;
+        this.code_mirror = code_mirror;
+        this.palette = palette;
+        this.status_bar = status_bar;
+        // Default Options
+        this.check_spelling = true;
+        this.rx_word_char = /[^-[\]{}():/!;&@$£%§<>"*+=?.,~\\^|_`#±\s\t]/;
+        this.rx_non_word_char = /[-[\]{}():/!;&@$£%§<>"*+=?.,~\\^|_`#±\s\t]/;
+        this.ignored_tokens = new Set();
+        this.define_mode = (original_mode_spec) => {
+            if (original_mode_spec.indexOf('spellcheck_') === 0) {
+                return original_mode_spec;
+            }
+            const new_mode_spec = 'spellcheck_' + original_mode_spec;
+            this.code_mirror.CodeMirror.defineMode(new_mode_spec, (config) => {
+                const spellchecker_overlay = {
+                    name: new_mode_spec,
+                    token: (stream, state) => {
+                        if (stream.eatWhile(this.rx_word_char)) {
+                            const word = stream.current().replace(/(^')|('$)/g, '');
+                            if (word !== '' &&
+                                !word.match(/^\d+$/) &&
+                                this.dictionary !== undefined &&
+                                !this.dictionary.check(word) &&
+                                !this.ignored_tokens.has(word)) {
+                                return 'spell-error';
+                            }
+                        }
+                        stream.eatWhile(this.rx_non_word_char);
+                        return null;
+                    }
+                };
+                return this.code_mirror.CodeMirror.overlayMode(this.code_mirror.CodeMirror.getMode(config, original_mode_spec), spellchecker_overlay, true);
+            });
+            return new_mode_spec;
+        };
+        // use the language_manager
+        this.language_manager = new LanguageManager(setting_registry);
+        this._trans = translator.load('jupyterlab-spellchecker');
+        this.status_msg = this._trans.__('Dictionary not loaded');
+        this.TEXT_SUGGESTIONS_AVAILABLE = this._trans.__('Adjust spelling to');
+        this.TEXT_NO_SUGGESTIONS = this._trans.__('No spellcheck suggestions');
+        this.PALETTE_CATEGORY = this._trans.__('Spell Checker');
+        // read the settings
+        this.setup_settings();
+        // setup the static content of the spellchecker UI
+        this.setup_button();
+        this.setup_suggestions();
+        this.setup_language_picker();
+        this.setup_ignore_action();
+        this.tracker.activeCellChanged.connect(() => {
+            if (this.tracker.activeCell) {
+                this.setup_cell_editor(this.tracker.activeCell);
+            }
+        });
+        // setup newly open editors
+        this.editor_tracker.widgetAdded.connect((sender, widget) => this.setup_file_editor(widget.content, true));
+        // refresh already open editors when activated (because the MIME type might have changed)
+        this.editor_tracker.currentChanged.connect((sender, widget) => {
+            if (widget !== null) {
+                this.setup_file_editor(widget.content, false);
+            }
+        });
+    }
+    // move the load_dictionary into the setup routine, because then
+    // we know that the values are set correctly!
+    setup_settings() {
+        Promise.all([
+            this.setting_registry.load(extension.id),
+            this.app.restored,
+            this.language_manager.ready
+        ])
+            .then(([settings]) => {
+            this.update_settings(settings);
+            settings.changed.connect(() => {
+                this.update_settings(settings);
+            });
+        })
+            .catch((reason) => {
+            console.error(reason.message);
+        });
+    }
+    _set_theme(name) {
+        document.body.setAttribute('data-jp-spellchecker-theme', name);
+    }
+    update_settings(settings) {
+        this.settings = settings;
+        const tokens = settings.get('ignore').composite;
+        this.ignored_tokens = new Set(tokens);
+        this.accepted_types = settings.get('mimeTypes').composite;
+        const theme = settings.get('theme').composite;
+        this._set_theme(theme);
+        // read the saved language setting
+        const language_id = settings.get('language').composite;
+        const user_language = this.language_manager.getLanguageByIdentifier(language_id);
+        if (user_language === undefined) {
+            console.warn('The language ' + language_id + ' is not supported!');
+        }
+        else {
+            this.language = user_language;
+            // load the dictionary
+            this.load_dictionary().catch(console.warn);
+        }
+        this.refresh_state();
+    }
+    setup_file_editor(file_editor, setup_signal = false) {
+        if (this.accepted_types &&
+            this.accepted_types.indexOf(file_editor.model.mimeType) !== -1) {
+            const editor = this.extract_editor(file_editor);
+            this.setup_overlay(editor);
+        }
+        if (setup_signal) {
+            file_editor.model.mimeTypeChanged.connect((model, args) => {
+                // putting at the end of execution queue to allow the CodeMirror mode to be updated
+                setTimeout(() => this.setup_file_editor(file_editor), 0);
+            });
+        }
+    }
+    setup_cell_editor(cell) {
+        if (cell !== null && cell.model.type === 'markdown') {
+            const editor = this.extract_editor(cell);
+            this.setup_overlay(editor);
+        }
+    }
+    extract_editor(cell_or_editor) {
+        const editor_temp = cell_or_editor.editor;
+        return editor_temp.editor;
+    }
+    setup_overlay(editor, retry = true) {
+        const current_mode = editor.getOption('mode');
+        if (current_mode === 'null') {
+            if (retry) {
+                // putting at the end of execution queue to allow the CodeMirror mode to be updated
+                setTimeout(() => this.setup_overlay(editor, false), 0);
+            }
+            return;
+        }
+        if (this.check_spelling) {
+            editor.setOption('mode', this.define_mode(current_mode));
+        }
+        else {
+            const original_mode = current_mode.match(/^spellcheck_/)
+                ? current_mode.substr(11)
+                : current_mode;
+            editor.setOption('mode', original_mode);
+        }
+    }
+    toggle_spellcheck() {
+        this.check_spelling = !this.check_spelling;
+        console.log('Spell checking is currently: ', this.check_spelling);
+    }
+    setup_button() {
+        this.app.commands.addCommand("spellchecker:toggle-check-spelling" /* toggle */, {
+            label: this._trans.__('Toggle spellchecker'),
+            execute: () => {
+                this.toggle_spellcheck();
+            }
+        });
+        if (this.palette) {
+            this.palette.addItem({
+                command: "spellchecker:toggle-check-spelling" /* toggle */,
+                category: this.PALETTE_CATEGORY
+            });
+        }
+    }
+    get_contextmenu_context() {
+        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+        // @ts-ignore
+        const event = this.app._contextMenuEvent;
+        const target = event.target;
+        const code_mirror_wrapper = target.closest('.CodeMirror');
+        if (code_mirror_wrapper === null) {
+            return null;
+        }
+        const code_mirror = code_mirror_wrapper.CodeMirror;
+        const position = code_mirror.coordsChar({
+            left: event.clientX,
+            top: event.clientY
+        });
+        return {
+            editor: code_mirror,
+            position: position
+        };
+    }
+    /**
+     * This is different from token as implemented in CodeMirror
+     * and needed because Markdown does not tokenize words
+     * (each letter outside of markdown features is a separate token!)
+     */
+    get_current_word(context) {
+        const { editor, position } = context;
+        const line = editor.getDoc().getLine(position.line);
+        let start = position.ch;
+        while (start > 0 && line[start].match(this.rx_word_char)) {
+            start--;
+        }
+        let end = position.ch;
+        while (end < line.length && line[end].match(this.rx_word_char)) {
+            end++;
+        }
+        return {
+            line: position.line,
+            start: start,
+            end: end,
+            text: line.substring(start, end)
+        };
+    }
+    setup_suggestions() {
+        this.suggestions_menu = new Menu({ commands: this.app.commands });
+        this.suggestions_menu.title.label = this.TEXT_SUGGESTIONS_AVAILABLE;
+        this.suggestions_menu.title.icon = spellcheckIcon.bindprops({
+            stylesheet: 'menuItem'
+        });
+        // this command is not meant to be show - it is just menu trigger detection hack
+        this.app.commands.addCommand("spellchecker:update-suggestions" /* updateSuggestions */, {
+            execute: args => {
+                // no-op
+            },
+            isVisible: args => {
+                this.prepare_suggestions();
+                return false;
+            }
+        });
+        this.app.contextMenu.addItem({
+            selector: '.cm-spell-error',
+            command: "spellchecker:update-suggestions" /* updateSuggestions */
+        });
+        // end of the menu trigger detection hack
+        this.app.contextMenu.addItem({
+            selector: '.cm-spell-error',
+            submenu: this.suggestions_menu,
+            type: 'submenu'
+        });
+        this.app.commands.addCommand("spellchecker:apply-suggestion" /* applySuggestion */, {
+            execute: args => {
+                this.apply_suggestion(args['name']);
+            },
+            label: args => args['name']
+        });
+    }
+    setup_ignore_action() {
+        this.app.commands.addCommand("spellchecker:ignore" /* ignoreWord */, {
+            execute: () => {
+                this.ignore();
+            },
+            label: this._trans.__('Ignore')
+        });
+        this.app.contextMenu.addItem({
+            selector: '.cm-spell-error',
+            command: "spellchecker:ignore" /* ignoreWord */
+        });
+    }
+    ignore() {
+        const context = this.get_contextmenu_context();
+        if (context === null) {
+            console.log('Could not ignore the word as the context was no longer available');
+        }
+        else {
+            const word = this.get_current_word(context);
+            this.settings
+                .set('ignore', [
+                word.text.trim(),
+                ...this.settings.get('ignore').composite
+            ])
+                .catch(console.warn);
+        }
+    }
+    prepare_suggestions() {
+        const context = this.get_contextmenu_context();
+        let suggestions;
+        if (context === null) {
+            // no context (e.g. the edit was applied and the token is no longer in DOM,
+            // so we cannot find the parent editor
+            suggestions = [];
+        }
+        else {
+            const word = this.get_current_word(context);
+            suggestions = this.dictionary.suggest(word.text);
+        }
+        this.suggestions_menu.clearItems();
+        if (suggestions.length) {
+            for (const suggestion of suggestions) {
+                this.suggestions_menu.addItem({
+                    command: "spellchecker:apply-suggestion" /* applySuggestion */,
+                    args: { name: suggestion }
+                });
+            }
+            this.suggestions_menu.title.label = this.TEXT_SUGGESTIONS_AVAILABLE;
+            this.suggestions_menu.title.className = '';
+            this.suggestions_menu.setHidden(false);
+        }
+        else {
+            this.suggestions_menu.title.className = 'lm-mod-disabled';
+            this.suggestions_menu.title.label = this.TEXT_NO_SUGGESTIONS;
+            this.suggestions_menu.setHidden(true);
+        }
+    }
+    apply_suggestion(replacement) {
+        const context = this.get_contextmenu_context();
+        if (context === null) {
+            console.warn('Applying suggestion failed (probably was already applied earlier)');
+            return;
+        }
+        const word = this.get_current_word(context);
+        context.editor.getDoc().replaceRange(replacement, {
+            ch: word.start,
+            line: word.line
+        }, {
+            ch: word.end,
+            line: word.line
+        });
+    }
+    load_dictionary() {
+        const language = this.language;
+        if (!language) {
+            return new Promise((accept, reject) => reject('Cannot load dictionary: no language set'));
+        }
+        this.status_msg = this._trans.__('Loading dictionary…');
+        this.status_widget.update();
+        return Promise.all([
+            fetch(language.aff).then(res => res.text()),
+            fetch(language.dic).then(res => res.text())
+        ]).then(values => {
+            this.dictionary = new Typo(language.name, values[0], values[1]);
+            console.debug('Dictionary Loaded ', language.name, language.id);
+            this.status_msg = language.name;
+            // update the complete UI
+            this.status_widget.update();
+            this.refresh_state();
+        });
+    }
+    refresh_state() {
+        // update the active cell (if any)
+        if (this.tracker.activeCell !== null) {
+            this.setup_cell_editor(this.tracker.activeCell);
+        }
+        // update the current file editor (if any)
+        if (this.editor_tracker.currentWidget !== null) {
+            this.setup_file_editor(this.editor_tracker.currentWidget.content);
+        }
+    }
+    choose_language() {
+        const choices = this.language_manager.getChoices(this.language);
+        const choiceStrings = choices.map(
+        // note: two dictionaries may exist for a language with the same name,
+        // so we append the actual id of the dictionary in the square brackets.
+        dictionary => dictionary.isOnline
+            ? this._trans.__('%1 [%2] (online)', dictionary.name, dictionary.id)
+            : this._trans.__('%1 [%2]', dictionary.name, dictionary.id));
+        InputDialog.getItem({
+            title: this._trans.__('Choose spellchecker language'),
+            items: choiceStrings
+        }).then(value => {
+            if (value.value !== null) {
+                const index = choiceStrings.indexOf(value.value);
+                const lang = this.language_manager.getLanguageByIdentifier(choices[index].id);
+                if (!lang) {
+                    console.error('Language could not be matched - please report this as an issue');
+                    return;
+                }
+                this.language = lang;
+                // the setup routine will load the dictionary
+                this.settings.set('language', this.language.id).catch(console.warn);
+            }
+        });
+    }
+    setup_language_picker() {
+        this.status_widget = new StatusWidget(() => this.status_msg);
+        this.status_widget.node.onclick = () => {
+            this.choose_language();
+        };
+        this.app.commands.addCommand("spellchecker:choose-language" /* chooseLanguage */, {
+            execute: args => this.choose_language(),
+            label: this._trans.__('Choose spellchecker language')
+        });
+        if (this.palette) {
+            this.palette.addItem({
+                command: "spellchecker:choose-language" /* chooseLanguage */,
+                category: this.PALETTE_CATEGORY
+            });
+        }
+        if (this.status_bar) {
+            this.status_bar.registerStatusItem('spellchecker:choose-language', {
+                align: 'right',
+                item: this.status_widget
+            });
+        }
+    }
+}
+/**
+ * Activate extension
+ */
+function activate(app, tracker, editor_tracker, setting_registry, code_mirror, translator, palette, status_bar) {
+    console.log('Attempting to load spellchecker');
+    const sp = new SpellChecker(app, tracker, editor_tracker, setting_registry, code_mirror, translator || nullTranslator, palette, status_bar);
+    console.log('Spellchecker Loaded ', sp);
+}
+/**
+ * Initialization data for the jupyterlab_spellchecker extension.
+ */
+const extension = {
+    id: '@ijmbarr/jupyterlab_spellchecker:plugin',
+    autoStart: true,
+    requires: [INotebookTracker, IEditorTracker, ISettingRegistry, ICodeMirror],
+    optional: [ITranslator, ICommandPalette, IStatusBar],
+    activate: activate
+};
+export default extension;

+ 98 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/package.json

@@ -0,0 +1,98 @@
+{
+  "name": "@ijmbarr/jupyterlab_spellchecker",
+  "version": "0.7.2",
+  "description": "A spell checker for JupyterLab.",
+  "keywords": [
+    "jupyter",
+    "jupyterlab",
+    "jupyterlab-extension"
+  ],
+  "homepage": "https://github.com/jupyterlab-contrib/spellchecker",
+  "bugs": {
+    "url": "https://github.com/jupyterlab-contrib/spellchecker/issues"
+  },
+  "license": "BSD-3-Clause",
+  "author": {
+    "name": "JupyterLab Spellchecker Development Team"
+  },
+  "contributors": [
+    "Iain Barr",
+    "Michał Krassowski",
+    "Oliver Cordes <ocordes@astro.uni-bonn.de> (https://astro.uni-bonn.de/~ocordes)"
+  ],
+  "files": [
+    "dictionaries/*{aff,dic}",
+    "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}",
+    "schema/**/*.{json,}",
+    "style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}",
+    "style/index.js"
+  ],
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jupyterlab-contrib/spellchecker.git"
+  },
+  "scripts": {
+    "build": "jlpm run build:lib && jlpm run build:labextension:dev",
+    "build:prod": "jlpm run build:lib && jlpm run build:labextension",
+    "build:labextension": "jupyter labextension build .",
+    "build:labextension:dev": "jupyter labextension build --development True .",
+    "build:lib": "tsc",
+    "clean": "jlpm run clean:lib",
+    "clean:lib": "rimraf lib tsconfig.tsbuildinfo",
+    "clean:labextension": "rimraf jupyterlab_spellchecker/labextension",
+    "clean:all": "jlpm run clean:lib && jlpm run clean:labextension",
+    "eslint": "eslint . --ext .ts,.tsx --fix",
+    "eslint:check": "eslint . --ext .ts,.tsx",
+    "install:extension": "jupyter labextension develop --overwrite .",
+    "prepare": "jlpm run clean && jlpm run build:prod",
+    "watch": "run-p watch:src watch:labextension",
+    "watch:src": "tsc -w",
+    "watch:labextension": "jupyter labextension watch ."
+  },
+  "dependencies": {
+    "@jupyterlab/application": "^3.0.3",
+    "@jupyterlab/apputils": "^3.0.2",
+    "@jupyterlab/cells": "^3.0.3",
+    "@jupyterlab/codemirror": "^3.0.2",
+    "@jupyterlab/fileeditor": "^3.0.3",
+    "@jupyterlab/notebook": "^3.0.3",
+    "@jupyterlab/statusbar": "^3.0.2",
+    "@jupyterlab/ui-components": "^3.0.2",
+    "@lumino/widgets": "^1.16.1",
+    "@types/codemirror": "0.0.87",
+    "typo-js": "^1.1.0"
+  },
+  "devDependencies": {
+    "@jupyterlab/builder": "^3.0.0",
+    "@jupyterlab/translation": "^3.0.0",
+    "@lumino/coreutils": "^1.8.0",
+    "@typescript-eslint/eslint-plugin": "^4.8.1",
+    "@typescript-eslint/parser": "^4.8.1",
+    "eslint": "^7.14.0",
+    "eslint-config-prettier": "^6.15.0",
+    "eslint-plugin-prettier": "^3.1.4",
+    "npm-run-all": "^4.1.5",
+    "prettier": "^2.1.1",
+    "rimraf": "^3.0.2",
+    "typescript": "~4.1.3"
+  },
+  "jupyterlab": {
+    "discovery": {
+      "server": {
+        "managers": [
+          "pip",
+          "conda"
+        ],
+        "base": {
+          "name": "jupyterlab-spellchecker"
+        }
+      }
+    },
+    "extension": true,
+    "schemaDir": "schema",
+    "outputDir": "jupyterlab_spellchecker/labextension"
+  },
+  "styleModule": "style/index.js"
+}

+ 92 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/schema/plugin.json

@@ -0,0 +1,92 @@
+{
+  "jupyter.lab.setting-icon": "spellcheck:spellcheck",
+  "jupyter.lab.setting-icon-label": "Spellchecker",
+  "title": "Spellchecker",
+  "description": "Spellchecker settings.",
+  "definitions": {
+    "language": {
+      "type": "string"
+    },
+    "ignore": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      }
+    },
+    "mimeTypes": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      }
+    },
+    "onlineDictionaries": {
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "title": "Unique identifier"
+          },
+          "name": {
+            "type": "string",
+            "title": "Display name"
+          },
+          "aff": {
+            "type": "string",
+            "title": "URL address of the .aff file"
+          },
+          "dic": {
+            "type": "string",
+            "title": "URL address of the .dic file"
+          }
+        }
+      }
+    },
+    "theme": {
+      "type": "string",
+      "enum": [
+        "background-box",
+        "wavy-underline",
+        "dotted-underline"
+      ]
+    }
+  },
+  "properties": {
+    "theme": {
+      "title": "Theme",
+      "description": "Theme for decorating misspelt words, one of:\n  - 'background-box': fills the background of the misspelt word;\n  - 'wavy-underline': underline with wavelets (note: Chrome has a bug which prevents rendering of wavelets under some very short words)\n  - 'dotted-underline': underline with dotted style",
+      "$ref": "#/definitions/theme",
+      "default": "background-box"
+    },
+    "language": {
+      "title": "Language of the spellchecker",
+      "description": "Dictionary identifier, e.g. en-us",
+      "$ref": "#/definitions/language",
+      "default": "en-us"
+    },
+    "ignore": {
+      "title": "Words to be ignored by the spellchecker",
+      "description": "Case-sensitive list of words to be ignored",
+      "$ref": "#/definitions/ignore",
+      "default": ["JupyterLab", "Jupyter", "JupyterHub", "Voilà", "Xeus"]
+    },
+    "mimeTypes": {
+      "title": "MIME types for files/editors for which the spellchecking should be activated",
+      "description": "List of MIME types. GFM denotes GitHub Flavored Markdown",
+      "$ref": "#/definitions/mimeTypes",
+      "default": [
+        "text/plain",
+        "text/x-ipythongfm"
+      ]
+    },
+    "onlineDictionaries": {
+      "title": "Online dictionaries",
+      "description": "A list of online dictionaries to use if installing dictionaries in data path of jupyter-server is not possible or not desirable. For example:\n\n[\n    {\n        \"id\": \"pl_PL-online\",\n        \"aff\": \"http://some-url/pl_PL.aff\",\n        \"dic\": \"http://some-url/pl_PL.dic\",\n        \"name\": \"polski (Polska)\"\n    }\n]",
+      "$ref": "#/definitions/onlineDictionaries",
+      "default": []
+    }
+  },
+  "additionalProperties": false,
+  "type": "object"
+}

+ 0 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/base.css


+ 202 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/icons/LICENSE

@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 5 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/icons/ic-baseline-spellcheck.svg

@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" viewBox="0 0 24 24">
+  <g class="jp-icon3 jp-icon-selectable" fill="#616161" shape-rendering="geometricPrecision">
+    <path d="M12.45 16h2.09L9.43 3H7.57L2.46 16h2.09l1.12-3h5.64l1.14 3zm-6.02-5L8.5 5.48L10.57 11H6.43zm15.16.59l-8.09 8.09L9.83 16l-1.41 1.41l5.09 5.09L23 13l-1.41-1.41z"/>
+  </g>
+</svg>

+ 34 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/index.css

@@ -0,0 +1,34 @@
+body[data-jp-spellchecker-theme='background-box'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  background: rgba(255, 0, 0, .15);
+}
+
+body[data-jp-spellchecker-theme='background-box'][data-jp-theme-light='false'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  background: rgba(255, 0, 0, .35);
+  text-shadow: 0 0 5px black;
+}
+
+body[data-jp-spellchecker-theme='wavy-underline'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  text-decoration-line: underline;
+  text-decoration-style: wavy;
+  text-decoration-color: red;
+  /* For Chrome */
+  text-decoration-skip-ink: none;
+}
+
+body[data-jp-spellchecker-theme='wavy-underline'][data-jp-theme-light='false'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  /* Use bright red for dark themes */
+  text-decoration-color: #ff5722;
+}
+
+body[data-jp-spellchecker-theme='dotted-underline'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  text-decoration-line: underline;
+  text-decoration-style: dotted;
+  text-decoration-color: red;
+  /* For Chrome */
+  text-decoration-skip-ink: none;
+}
+
+body[data-jp-spellchecker-theme='dotted-underline'][data-jp-theme-light='false'] .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-tag):not(.cm-word) {
+  /* Use bright red for dark themes */
+    text-decoration-color: #ff5722;
+}

+ 1 - 0
.cache/yarn/v6/.tmp/0f557d7fd1c78911b88705aa96f14692/style/index.js

@@ -0,0 +1 @@
+import './base.css';

+ 67 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/.yarn-metadata.json

@@ -0,0 +1,67 @@
+{
+  "manifest": {
+    "name": "plotlywidget",
+    "version": "4.14.3",
+    "description": "The plotly JupyterLab extension",
+    "author": {
+      "name": "The plotly.py team"
+    },
+    "license": "MIT",
+    "main": "src/index.js",
+    "repository": {
+      "type": "git",
+      "url": "https://github.com/plotly/plotly.py"
+    },
+    "keywords": [
+      "jupyter",
+      "widgets",
+      "ipython",
+      "ipywidgets",
+      "plotly"
+    ],
+    "files": [
+      "src/**/*.js",
+      "dist/*.js",
+      "style/*.*"
+    ],
+    "scripts": {
+      "build": "webpack",
+      "clean": "rimraf dist/ && rimraf  ../../python/plotly/plotlywidget/static'",
+      "test": "echo \"Error: no test specified\" && exit 1"
+    },
+    "devDependencies": {
+      "webpack": "^3.10.0",
+      "rimraf": "^2.6.1",
+      "ify-loader": "^1.1.0",
+      "typescript": "~3.1.1"
+    },
+    "dependencies": {
+      "plotly.js": "^1.58.4",
+      "@jupyter-widgets/base": "^2.0.0 || ^3.0.0 || ^4.0.0",
+      "lodash": "^4.17.4"
+    },
+    "jupyterlab": {
+      "extension": "src/jupyterlab-plugin.js",
+      "sharedPackages": {
+        "@jupyter-widgets/base": {
+          "bundled": false,
+          "singleton": true
+        }
+      }
+    },
+    "_registry": "npm",
+    "_loc": "/home/jovyan/.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/package.json",
+    "readmeFilename": "README.md",
+    "readme": "Jupyter Extension for Plotly.py\n\nSee https://plot.ly/python/getting-started/ for details.\n\nInstall with `jupyter labextension install plotlywidget` in JupyterLab, otherwise\njust install Plotly.py and it will automatically work in Classic Notebooks.\n"
+  },
+  "artifacts": [],
+  "remote": {
+    "type": "tarball",
+    "reference": "file:../extensions/plotlywidget-4.14.3.tgz",
+    "registry": "npm",
+    "hash": "",
+    "cacheIntegrity": "sha1-b3EQ7myxPFYL20NCWlAoHQMnLLk="
+  },
+  "registry": "npm",
+  "hash": "6f7110ee6cb13c560bdb43425a50281d03272cb9"
+}

+ 6 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/README.md

@@ -0,0 +1,6 @@
+Jupyter Extension for Plotly.py
+
+See https://plot.ly/python/getting-started/ for details.
+
+Install with `jupyter labextension install plotlywidget` in JupyterLab, otherwise
+just install Plotly.py and it will automatically work in Classic Notebooks.

File diff suppressed because it is too large
+ 232481 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/dist/index.js


+ 49 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/package.json

@@ -0,0 +1,49 @@
+{
+  "name": "plotlywidget",
+  "version": "4.14.3",
+  "description": "The plotly JupyterLab extension",
+  "author": "The plotly.py team",
+  "license": "MIT",
+  "main": "src/index.js",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/plotly/plotly.py"
+  },
+  "keywords": [
+    "jupyter",
+    "widgets",
+    "ipython",
+    "ipywidgets",
+    "plotly"
+  ],
+  "files": [
+    "src/**/*.js",
+    "dist/*.js",
+    "style/*.*"
+  ],
+  "scripts": {
+    "build": "webpack",
+    "clean": "rimraf dist/ && rimraf  ../../python/plotly/plotlywidget/static'",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "devDependencies": {
+    "webpack": "^3.10.0",
+    "rimraf": "^2.6.1",
+    "ify-loader": "^1.1.0",
+    "typescript": "~3.1.1"
+  },
+  "dependencies": {
+    "plotly.js": "^1.58.4",
+    "@jupyter-widgets/base": "^2.0.0 || ^3.0.0 || ^4.0.0",
+    "lodash": "^4.17.4"
+  },
+  "jupyterlab": {
+    "extension": "src/jupyterlab-plugin.js",
+    "sharedPackages": {
+      "@jupyter-widgets/base": {
+        "bundled": false,
+        "singleton": true
+      }
+    }
+  }
+}

File diff suppressed because it is too large
+ 1880 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/Figure.js


+ 9 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/embed.js

@@ -0,0 +1,9 @@
+// Entry point for the unpkg bundle containing custom model definitions.
+//
+// It differs from the notebook bundle in that it does not need to define a
+// dynamic baseURL for the static assets and may load some css that would
+// already be loaded by the notebook otherwise.
+
+// Export widget models and views, and the npm package version number.
+module.exports = require('./Figure.js');
+module.exports['version'] = require('../package.json').version;

+ 19 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/extension.js

@@ -0,0 +1,19 @@
+// This file contains the javascript that is run when the notebook is loaded.
+// It contains some requirejs configuration and the `load_ipython_extension`
+// which is required for any notebook extension.
+
+// Configure requirejs
+if (window.require) {
+    window.require.config({
+        map: {
+            "*" : {
+                "plotlywidget": "nbextensions/plotlywidget/index"
+            }
+        }
+    });
+}
+
+// Export the required load_ipython_extention
+module.exports = {
+    load_ipython_extension: function() {}
+};

+ 3 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/index.js

@@ -0,0 +1,3 @@
+// Export widget models and views, and the npm package version number.
+module.exports = require('./Figure.js');
+module.exports['version'] = require('../package.json').version;

+ 18 - 0
.cache/yarn/v6/.tmp/407ef3c275bf044a0e3a8f068d3830f6/src/jupyterlab-plugin.js

@@ -0,0 +1,18 @@
+var plotly = require('./index');
+var base = require('@jupyter-widgets/base');
+
+/**
+ * The widget manager provider.
+ */
+module.exports = {
+  id: 'plotlywidget',
+  requires: [base.IJupyterWidgetRegistry],
+  activate: function(app, widgets) {
+      widgets.registerWidget({
+          name: 'plotlywidget',
+          version: plotly.version,
+          exports: plotly
+      });
+    },
+  autoStart: true
+};

File diff suppressed because it is too large
+ 115 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/.yarn-metadata.json


+ 314 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/LICENSE

@@ -0,0 +1,314 @@
+Copyright (c) 2015 Project Jupyter Contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+------------------------------------------------------------------------------
+
+This package bundles several JavaScript npm packages in the
+jupyterlab_widgets/static directory. Their licenses (as packaged in their
+distributions in the node_modules package installation directory) are copied
+below.
+
+------------------------------------------------------------------------------
+From css-loader/LICENSE:
+
+Copyright JS Foundation and other contributors
+
+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.
+
+------------------------------------------------------------------------------
+From style-loader/LICENSE:
+
+Copyright JS Foundation and other contributors
+
+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.
+
+------------------------------------------------------------------------------
+From backbone/backbone.js
+
+//     (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Backbone may be freely distributed under the MIT license.
+//     For all details and documentation:
+//     http://backbonejs.org
+
+------------------------------------------------------------------------------
+From base-64/LICENSE
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Jameson Little
+
+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.
+
+------------------------------------------------------------------------------
+From lodash/LICENSE
+
+Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
+
+Based on Underscore.js, copyright Jeremy Ashkenas,
+DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/lodash/lodash
+
+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.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code displayed within the prose of the
+documentation.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+Files located in the node_modules and vendor 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.
+
+------------------------------------------------------------------------------
+From d3-format/LICENSE:
+
+Copyright 2010-2015 Mike Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of contributors may be used to
+  endorse or promote products derived from this software without specific prior
+  written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+------------------------------------------------------------------------------
+From jquery-ui/LICENSE.txt
+
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+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.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+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.
+
+------------------------------------------------------------------
+From jquery/LICENSE.txt
+
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+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.
+
+------------------------------------------------------------------
+From semver/LICENSE:
+
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+------------------------------------------------------------------
+From underscore/LICENSE
+
+Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative
+Reporters & Editors
+
+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.

+ 69 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/README.md

@@ -0,0 +1,69 @@
+Jupyter Widgets JupyterLab Extension
+====================================
+
+A JupyterLab 3.0 extension for Jupyter/IPython widgets.
+
+## Installation
+
+To enable ipywidgets support in JupyterLab 3.x:
+
+```bash
+pip install jupyterlab_widgets
+```
+
+### Version compatibility
+
+Prior to JupyterLab 3.0, use the appropriate command from the following list
+to install a compatible JupyterLab extension.
+
+* For JupyterLab 0.30, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.31`
+* For JupyterLab 0.31rc1, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.32`
+* For JupyterLab 0.31rc2, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.33`
+* For JupyterLab 0.31.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.34`
+* For JupyterLab 0.32.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.35`
+* For JupyterLab 0.33.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.36`
+* For JupyterLab 0.34.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.37`
+* For JupyterLab 0.35.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@0.38`
+* For JupyterLab 1.0.x and 1.1.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@1.0`
+* For JupyterLab 1.2.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@1.1`
+* For JupyterLab 2.x, use `jupyter labextension install @jupyter-widgets/jupyterlab-manager@2`
+
+
+
+## Contributing
+
+### Development install
+
+Note: You will need Node.js to build the extension package.
+
+The `jlpm` command is JupyterLab's pinned version of
+[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
+`yarn` or `npm` in lieu of `jlpm` below.
+
+```bash
+# Clone the repo to your local environment
+# Change directory to the jupyterlab_widgets directory
+# Install package in development mode
+pip install -e .
+# Link your development version of the extension with JupyterLab
+jupyter labextension develop . --overwrite
+# Rebuild extension Typescript source after making changes
+jlpm run build
+```
+
+You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension.
+
+```bash
+# Watch the source directory in one terminal, automatically rebuilding when needed
+jlpm run watch
+# Run JupyterLab in another terminal
+jupyter lab
+```
+
+With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt).
+
+### Uninstall
+
+```bash
+pip uninstall jupyterlab_widgets
+```

+ 7 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/index.d.ts

@@ -0,0 +1,7 @@
+import WidgetManagerProvider from './plugin';
+import * as output from './output';
+export default WidgetManagerProvider;
+export { registerWidgetManager } from './plugin';
+export { WidgetManager } from './manager';
+export { WidgetRenderer } from './renderer';
+export { output };

+ 9 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/index.js

@@ -0,0 +1,9 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import WidgetManagerProvider from './plugin';
+import * as output from './output';
+export default WidgetManagerProvider;
+export { registerWidgetManager } from './plugin';
+export { WidgetManager } from './manager';
+export { WidgetRenderer } from './renderer';
+export { output };

+ 174 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/manager.d.ts

@@ -0,0 +1,174 @@
+import * as Backbone from 'backbone';
+import { ManagerBase, IClassicComm, IWidgetRegistryData, WidgetModel, WidgetView, IStateOptions } from '@jupyter-widgets/base';
+import { IDisposable } from '@lumino/disposable';
+import { Widget } from '@lumino/widgets';
+import { INotebookModel } from '@jupyterlab/notebook';
+import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
+import { Kernel, KernelMessage, Session } from '@jupyterlab/services';
+import { DocumentRegistry } from '@jupyterlab/docregistry';
+import { ISignal } from '@lumino/signaling';
+/**
+ * The mime type for a widget view.
+ */
+export declare const WIDGET_VIEW_MIMETYPE = "application/vnd.jupyter.widget-view+json";
+/**
+ * The mime type for widget state data.
+ */
+export declare const WIDGET_STATE_MIMETYPE = "application/vnd.jupyter.widget-state+json";
+export declare class BackboneViewWrapper extends Widget {
+    /**
+     * Construct a new `Backbone` wrapper widget.
+     *
+     * @param view - The `Backbone.View` instance being wrapped.
+     */
+    constructor(view: Backbone.View<any>);
+    onAfterAttach(msg: any): void;
+    dispose(): void;
+    private _view;
+}
+/**
+ * A widget manager that returns phosphor widgets.
+ */
+export declare class WidgetManager extends ManagerBase<Widget> implements IDisposable {
+    constructor(context: DocumentRegistry.IContext<INotebookModel>, rendermime: IRenderMimeRegistry, settings: WidgetManager.Settings);
+    /**
+     * Save the widget state to the context model.
+     */
+    private _saveState;
+    /**
+     * Default callback handler to emit unhandled kernel messages.
+     */
+    callbacks(view?: WidgetView): {
+        iopub: {
+            output: (msg: KernelMessage.IIOPubMessage) => void;
+        };
+    };
+    /**
+     * Register a new kernel
+     */
+    _handleKernelChanged({ oldValue, newValue }: Session.ISessionConnection.IKernelChangedArgs): void;
+    _handleKernelConnectionStatusChange(status: Kernel.ConnectionStatus): void;
+    _handleKernelStatusChange(status: Kernel.Status): void;
+    /**
+     * Restore widgets from kernel and saved state.
+     */
+    restoreWidgets(notebook: INotebookModel, { loadKernel, loadNotebook }?: {
+        loadKernel: boolean;
+        loadNotebook: boolean;
+    }): Promise<void>;
+    /**
+     * Disconnect the widget manager from the kernel, setting each model's comm
+     * as dead.
+     */
+    disconnect(): void;
+    _loadFromKernel(): Promise<void>;
+    /**
+     * Load widget state from notebook metadata
+     */
+    _loadFromNotebook(notebook: INotebookModel): Promise<void>;
+    /**
+     * Return a phosphor widget representing the view
+     */
+    display_view(msg: any, view: Backbone.View<Backbone.Model>, options: any): Promise<Widget>;
+    /**
+     * Create a comm.
+     */
+    _create_comm(target_name: string, model_id: string, data?: any, metadata?: any, buffers?: ArrayBuffer[] | ArrayBufferView[]): Promise<IClassicComm>;
+    /**
+     * Get the currently-registered comms.
+     */
+    _get_comm_info(): Promise<any>;
+    /**
+     * Get whether the manager is disposed.
+     *
+     * #### Notes
+     * This is a read-only property.
+     */
+    get isDisposed(): boolean;
+    /**
+     * Dispose the resources held by the manager.
+     */
+    dispose(): void;
+    /**
+     * Resolve a URL relative to the current notebook location.
+     */
+    resolveUrl(url: string): Promise<string>;
+    /**
+     * Load a class and return a promise to the loaded object.
+     */
+    protected loadClass(className: string, moduleName: string, moduleVersion: string): Promise<typeof WidgetModel | typeof WidgetView>;
+    get context(): DocumentRegistry.IContext<INotebookModel>;
+    get rendermime(): IRenderMimeRegistry;
+    /**
+     * A signal emitted when state is restored to the widget manager.
+     *
+     * #### Notes
+     * This indicates that previously-unavailable widget models might be available now.
+     */
+    get restored(): ISignal<this, void>;
+    /**
+     * Whether the state has been restored yet or not.
+     */
+    get restoredStatus(): boolean;
+    /**
+     * A signal emitted for unhandled iopub kernel messages.
+     *
+     */
+    get onUnhandledIOPubMessage(): ISignal<this, KernelMessage.IIOPubMessage>;
+    register(data: IWidgetRegistryData): void;
+    /**
+     * Get a model
+     *
+     * #### Notes
+     * Unlike super.get_model(), this implementation always returns a promise and
+     * never returns undefined. The promise will reject if the model is not found.
+     */
+    get_model(model_id: string): Promise<WidgetModel>;
+    /**
+     * Register a widget model.
+     */
+    register_model(model_id: string, modelPromise: Promise<WidgetModel>): void;
+    /**
+     * Close all widgets and empty the widget state.
+     * @return Promise that resolves when the widget state is cleared.
+     */
+    clear_state(): Promise<void>;
+    /**
+     * Synchronously get the state of the live widgets in the widget manager.
+     *
+     * This includes all of the live widget models, and follows the format given in
+     * the @jupyter-widgets/schema package.
+     *
+     * @param options - The options for what state to return.
+     * @returns Promise for a state dictionary
+     */
+    get_state_sync(options?: IStateOptions): {
+        version_major: number;
+        version_minor: number;
+        state: {
+            [key: string]: any;
+        };
+    };
+    /**
+     * Set the dirty state of the notebook model if applicable.
+     *
+     * TODO: perhaps should also set dirty when any model changes any data
+     */
+    setDirty(): void;
+    private _handleCommOpen;
+    private _context;
+    private _registry;
+    private _rendermime;
+    _commRegistration: IDisposable;
+    private _restored;
+    private _restoredStatus;
+    private _initialRestoredStatus;
+    private _modelsSync;
+    private _settings;
+    private _onUnhandledIOPubMessage;
+}
+export declare namespace WidgetManager {
+    type Settings = {
+        saveState: boolean;
+    };
+}

+ 430 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/manager.js

@@ -0,0 +1,430 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import { ManagerBase, shims, put_buffers, serialize_state } from '@jupyter-widgets/base';
+import { PromiseDelegate } from '@lumino/coreutils';
+import { Widget } from '@lumino/widgets';
+import { Signal } from '@lumino/signaling';
+import { valid } from 'semver';
+import { SemVerCache } from './semvercache';
+/**
+ * The mime type for a widget view.
+ */
+export const WIDGET_VIEW_MIMETYPE = 'application/vnd.jupyter.widget-view+json';
+/**
+ * The mime type for widget state data.
+ */
+export const WIDGET_STATE_MIMETYPE = 'application/vnd.jupyter.widget-state+json';
+/**
+ * The class name added to an BackboneViewWrapper widget.
+ */
+const BACKBONEVIEWWRAPPER_CLASS = 'jp-BackboneViewWrapper';
+export class BackboneViewWrapper extends Widget {
+    /**
+     * Construct a new `Backbone` wrapper widget.
+     *
+     * @param view - The `Backbone.View` instance being wrapped.
+     */
+    constructor(view) {
+        super();
+        this._view = null;
+        this._view = view;
+        view.on('remove', () => {
+            this.dispose();
+        });
+        this.addClass(BACKBONEVIEWWRAPPER_CLASS);
+        this.node.appendChild(view.el);
+    }
+    onAfterAttach(msg) {
+        this._view.trigger('displayed');
+    }
+    dispose() {
+        this._view = null;
+        super.dispose();
+    }
+}
+/**
+ * A widget manager that returns phosphor widgets.
+ */
+export class WidgetManager extends ManagerBase {
+    constructor(context, rendermime, settings) {
+        var _a, _b;
+        super();
+        this._registry = new SemVerCache();
+        this._restored = new Signal(this);
+        this._restoredStatus = false;
+        this._initialRestoredStatus = false;
+        this._modelsSync = new Map();
+        this._onUnhandledIOPubMessage = new Signal(this);
+        this._context = context;
+        this._rendermime = rendermime;
+        // Set _handleCommOpen so `this` is captured.
+        this._handleCommOpen = async (comm, msg) => {
+            let oldComm = new shims.services.Comm(comm);
+            await this.handle_comm_open(oldComm, msg);
+        };
+        context.sessionContext.kernelChanged.connect((sender, args) => {
+            this._handleKernelChanged(args);
+        });
+        context.sessionContext.statusChanged.connect((sender, args) => {
+            this._handleKernelStatusChange(args);
+        });
+        context.sessionContext.connectionStatusChanged.connect((sender, args) => {
+            this._handleKernelConnectionStatusChange(args);
+        });
+        if ((_a = context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel) {
+            this._handleKernelChanged({ name: 'kernel', oldValue: null, newValue: (_b = context.sessionContext.session) === null || _b === void 0 ? void 0 : _b.kernel });
+        }
+        this.restoreWidgets(this._context.model);
+        this._settings = settings;
+        context.saveState.connect((sender, saveState) => {
+            if (saveState === 'started' && settings.saveState) {
+                this._saveState();
+            }
+        });
+    }
+    /**
+     * Save the widget state to the context model.
+     */
+    _saveState() {
+        const state = this.get_state_sync({ drop_defaults: true });
+        this._context.model.metadata.set('widgets', {
+            'application/vnd.jupyter.widget-state+json': state
+        });
+    }
+    /**
+     * Default callback handler to emit unhandled kernel messages.
+     */
+    callbacks(view) {
+        return {
+            iopub: {
+                output: (msg) => {
+                    this._onUnhandledIOPubMessage.emit(msg);
+                }
+            }
+        };
+    }
+    /**
+     * Register a new kernel
+     */
+    _handleKernelChanged({ oldValue, newValue }) {
+        if (oldValue) {
+            oldValue.removeCommTarget(this.comm_target_name, this._handleCommOpen);
+        }
+        if (newValue) {
+            newValue.registerCommTarget(this.comm_target_name, this._handleCommOpen);
+        }
+    }
+    _handleKernelConnectionStatusChange(status) {
+        if (status === 'connected') {
+            // Only restore if our initial restore at construction is finished
+            if (this._initialRestoredStatus) {
+                // We only want to restore widgets from the kernel, not ones saved in the notebook.
+                this.restoreWidgets(this._context.model, { loadKernel: true, loadNotebook: false });
+            }
+        }
+    }
+    _handleKernelStatusChange(status) {
+        if (status === 'restarting') {
+            this.disconnect();
+        }
+    }
+    /**
+     * Restore widgets from kernel and saved state.
+     */
+    async restoreWidgets(notebook, { loadKernel, loadNotebook } = { loadKernel: true, loadNotebook: true }) {
+        if (loadKernel) {
+            await this._loadFromKernel();
+        }
+        if (loadNotebook) {
+            await this._loadFromNotebook(notebook);
+        }
+        this._restoredStatus = true;
+        this._initialRestoredStatus = true;
+        this._restored.emit();
+    }
+    /**
+     * Disconnect the widget manager from the kernel, setting each model's comm
+     * as dead.
+     */
+    disconnect() {
+        super.disconnect();
+        this._restoredStatus = false;
+    }
+    async _loadFromKernel() {
+        var _a;
+        if (!this.context.sessionContext) {
+            return;
+        }
+        await this.context.sessionContext.ready;
+        // TODO: when we upgrade to @jupyterlab/services 4.1 or later, we can
+        // remove this 'any' cast.
+        if (((_a = this.context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel.handleComms) === false) {
+            return;
+        }
+        const comm_ids = await this._get_comm_info();
+        // For each comm id that we do not know about, create the comm, and request the state.
+        const widgets_info = await Promise.all(Object.keys(comm_ids).map(async (comm_id) => {
+            try {
+                await this.get_model(comm_id);
+                // If we successfully get the model, do no more.
+                return;
+            }
+            catch (e) {
+                // If we have the widget model not found error, then we can create the
+                // widget. Otherwise, rethrow the error. We have to check the error
+                // message text explicitly because the get_model function in this
+                // class throws a generic error with this specific text.
+                if (e.message !== 'widget model not found') {
+                    throw e;
+                }
+                const comm = await this._create_comm(this.comm_target_name, comm_id);
+                let msg_id;
+                const info = new PromiseDelegate();
+                comm.on_msg((msg) => {
+                    if (msg.parent_header.msg_id === msg_id
+                        && msg.header.msg_type === 'comm_msg'
+                        && msg.content.data.method === 'update') {
+                        let data = msg.content.data;
+                        let buffer_paths = data.buffer_paths || [];
+                        // Make sure the buffers are DataViews
+                        let buffers = (msg.buffers || []).map(b => {
+                            if (b instanceof DataView) {
+                                return b;
+                            }
+                            else {
+                                return new DataView(b instanceof ArrayBuffer ? b : b.buffer);
+                            }
+                        });
+                        put_buffers(data.state, buffer_paths, buffers);
+                        info.resolve({ comm, msg });
+                    }
+                });
+                msg_id = comm.send({
+                    method: 'request_state'
+                }, this.callbacks(undefined));
+                return info.promise;
+            }
+        }));
+        // We put in a synchronization barrier here so that we don't have to
+        // topologically sort the restored widgets. `new_model` synchronously
+        // registers the widget ids before reconstructing their state
+        // asynchronously, so promises to every widget reference should be available
+        // by the time they are used.
+        await Promise.all(widgets_info.map(async (widget_info) => {
+            if (!widget_info) {
+                return;
+            }
+            const content = widget_info.msg.content;
+            await this.new_model({
+                model_name: content.data.state._model_name,
+                model_module: content.data.state._model_module,
+                model_module_version: content.data.state._model_module_version,
+                comm: widget_info.comm,
+            }, content.data.state);
+        }));
+    }
+    /**
+     * Load widget state from notebook metadata
+     */
+    async _loadFromNotebook(notebook) {
+        const widget_md = notebook.metadata.get('widgets');
+        // Restore any widgets from saved state that are not live
+        if (widget_md && widget_md[WIDGET_STATE_MIMETYPE]) {
+            let state = widget_md[WIDGET_STATE_MIMETYPE];
+            state = this.filterExistingModelState(state);
+            await this.set_state(state);
+        }
+    }
+    /**
+     * Return a phosphor widget representing the view
+     */
+    async display_view(msg, view, options) {
+        return view.pWidget || new BackboneViewWrapper(view);
+    }
+    /**
+     * Create a comm.
+     */
+    async _create_comm(target_name, model_id, data, metadata, buffers) {
+        var _a;
+        let kernel = (_a = this._context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel;
+        if (!kernel) {
+            throw new Error('No current kernel');
+        }
+        let comm = kernel.createComm(target_name, model_id);
+        if (data || metadata) {
+            comm.open(data, metadata, buffers);
+        }
+        return new shims.services.Comm(comm);
+    }
+    /**
+     * Get the currently-registered comms.
+     */
+    async _get_comm_info() {
+        var _a;
+        let kernel = (_a = this._context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel;
+        if (!kernel) {
+            throw new Error('No current kernel');
+        }
+        const reply = await kernel.requestCommInfo({ target_name: this.comm_target_name });
+        if (reply.content.status === 'ok') {
+            return reply.content.comms;
+        }
+        else {
+            return {};
+        }
+    }
+    /**
+     * Get whether the manager is disposed.
+     *
+     * #### Notes
+     * This is a read-only property.
+     */
+    get isDisposed() {
+        return this._context === null;
+    }
+    /**
+     * Dispose the resources held by the manager.
+     */
+    dispose() {
+        if (this.isDisposed) {
+            return;
+        }
+        if (this._commRegistration) {
+            this._commRegistration.dispose();
+        }
+        this._context = null;
+    }
+    /**
+     * Resolve a URL relative to the current notebook location.
+     */
+    async resolveUrl(url) {
+        const partial = await this.context.urlResolver.resolveUrl(url);
+        return this.context.urlResolver.getDownloadUrl(partial);
+    }
+    /**
+     * Load a class and return a promise to the loaded object.
+     */
+    async loadClass(className, moduleName, moduleVersion) {
+        // Special-case the Jupyter base and controls packages. If we have just a
+        // plain version, with no indication of the compatible range, prepend a ^ to
+        // get all compatible versions. We may eventually apply this logic to all
+        // widget modules. See issues #2006 and #2017 for more discussion.
+        if ((moduleName === '@jupyter-widgets/base'
+            || moduleName === '@jupyter-widgets/controls')
+            && valid(moduleVersion)) {
+            moduleVersion = `^${moduleVersion}`;
+        }
+        const mod = this._registry.get(moduleName, moduleVersion);
+        if (!mod) {
+            throw new Error(`Module ${moduleName}, semver range ${moduleVersion} is not registered as a widget module`);
+        }
+        let module;
+        if (typeof mod === 'function') {
+            module = await mod();
+        }
+        else {
+            module = await mod;
+        }
+        const cls = module[className];
+        if (!cls) {
+            throw new Error(`Class ${className} not found in module ${moduleName}`);
+        }
+        return cls;
+    }
+    get context() {
+        return this._context;
+    }
+    get rendermime() {
+        return this._rendermime;
+    }
+    /**
+     * A signal emitted when state is restored to the widget manager.
+     *
+     * #### Notes
+     * This indicates that previously-unavailable widget models might be available now.
+     */
+    get restored() {
+        return this._restored;
+    }
+    /**
+     * Whether the state has been restored yet or not.
+     */
+    get restoredStatus() {
+        return this._restoredStatus;
+    }
+    /**
+     * A signal emitted for unhandled iopub kernel messages.
+     *
+     */
+    get onUnhandledIOPubMessage() {
+        return this._onUnhandledIOPubMessage;
+    }
+    register(data) {
+        this._registry.set(data.name, data.version, data.exports);
+    }
+    /**
+     * Get a model
+     *
+     * #### Notes
+     * Unlike super.get_model(), this implementation always returns a promise and
+     * never returns undefined. The promise will reject if the model is not found.
+     */
+    async get_model(model_id) {
+        const modelPromise = super.get_model(model_id);
+        if (modelPromise === undefined) {
+            throw new Error('widget model not found');
+        }
+        return modelPromise;
+    }
+    /**
+     * Register a widget model.
+     */
+    register_model(model_id, modelPromise) {
+        super.register_model(model_id, modelPromise);
+        // Update the synchronous model map
+        modelPromise.then(model => {
+            this._modelsSync.set(model_id, model);
+            model.once('comm:close', () => {
+                this._modelsSync.delete(model_id);
+            });
+        });
+        this.setDirty();
+    }
+    /**
+     * Close all widgets and empty the widget state.
+     * @return Promise that resolves when the widget state is cleared.
+     */
+    async clear_state() {
+        await super.clear_state();
+        this._modelsSync = new Map();
+        this.setDirty();
+    }
+    /**
+     * Synchronously get the state of the live widgets in the widget manager.
+     *
+     * This includes all of the live widget models, and follows the format given in
+     * the @jupyter-widgets/schema package.
+     *
+     * @param options - The options for what state to return.
+     * @returns Promise for a state dictionary
+     */
+    get_state_sync(options = {}) {
+        const models = [];
+        for (let model of this._modelsSync.values()) {
+            if (model.comm_live) {
+                models.push(model);
+            }
+        }
+        return serialize_state(models, options);
+    }
+    /**
+     * Set the dirty state of the notebook model if applicable.
+     *
+     * TODO: perhaps should also set dirty when any model changes any data
+     */
+    setDirty() {
+        if (this._settings.saveState) {
+            this._context.model.dirty = true;
+        }
+    }
+}

+ 56 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/output.d.ts

@@ -0,0 +1,56 @@
+import * as outputBase from '@jupyter-widgets/output';
+import { JupyterPhosphorWidget } from '@jupyter-widgets/base';
+import { Message } from '@lumino/messaging';
+import { Panel } from '@lumino/widgets';
+import { WidgetManager } from './manager';
+import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea';
+import { KernelMessage, Session } from '@jupyterlab/services';
+export declare const OUTPUT_WIDGET_VERSION = "1.0.0";
+export declare class OutputModel extends outputBase.OutputModel {
+    defaults(): any;
+    initialize(attributes: any, options: any): void;
+    /**
+     * Register a new kernel
+     */
+    _handleKernelChanged({ oldValue }: Session.ISessionConnection.IKernelChangedArgs): void;
+    /**
+     * Reset the message id.
+     */
+    reset_msg_id(): void;
+    add(msg: KernelMessage.IIOPubMessage): void;
+    clear_output(wait?: boolean): void;
+    get outputs(): OutputAreaModel;
+    setOutputs(model?: any, value?: any, options?: any): void;
+    widget_manager: WidgetManager;
+    private _msgHook;
+    private _outputs;
+}
+export declare class JupyterPhosphorPanelWidget extends Panel {
+    constructor(options: JupyterPhosphorWidget.IOptions & Panel.IOptions);
+    /**
+     * Process the phosphor message.
+     *
+     * Any custom phosphor widget used inside a Jupyter widget should override
+     * the processMessage function like this.
+     */
+    processMessage(msg: Message): void;
+    /**
+     * Dispose the widget.
+     *
+     * This causes the view to be destroyed as well with 'remove'
+     */
+    dispose(): void;
+    private _view;
+}
+export declare class OutputView extends outputBase.OutputView {
+    _createElement(tagName: string): HTMLElement;
+    _setElement(el: HTMLElement): void;
+    /**
+     * Called when view is rendered.
+     */
+    render(): void;
+    remove(): any;
+    model: OutputModel;
+    _outputView: OutputArea;
+    pWidget: Panel;
+}

+ 157 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/output.js

@@ -0,0 +1,157 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import * as outputBase from '@jupyter-widgets/output';
+import { Panel } from '@lumino/widgets';
+import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea';
+import $ from 'jquery';
+export const OUTPUT_WIDGET_VERSION = outputBase.OUTPUT_WIDGET_VERSION;
+export class OutputModel extends outputBase.OutputModel {
+    defaults() {
+        return Object.assign(Object.assign({}, super.defaults()), { msg_id: '', outputs: [] });
+    }
+    initialize(attributes, options) {
+        super.initialize(attributes, options);
+        // The output area model is trusted since widgets are only rendered in trusted contexts.
+        this._outputs = new OutputAreaModel({ trusted: true });
+        this._msgHook = (msg) => {
+            this.add(msg);
+            return false;
+        };
+        this.widget_manager.context.sessionContext.kernelChanged.connect((sender, args) => {
+            this._handleKernelChanged(args);
+        });
+        this.listenTo(this, 'change:msg_id', this.reset_msg_id);
+        this.listenTo(this, 'change:outputs', this.setOutputs);
+        this.setOutputs();
+    }
+    /**
+     * Register a new kernel
+     */
+    _handleKernelChanged({ oldValue }) {
+        const msgId = this.get('msg_id');
+        if (msgId && oldValue) {
+            oldValue.removeMessageHook(msgId, this._msgHook);
+            this.set('msg_id', null);
+        }
+    }
+    /**
+     * Reset the message id.
+     */
+    reset_msg_id() {
+        const kernel = this.widget_manager.context.sessionContext.session.kernel;
+        const msgId = this.get('msg_id');
+        const oldMsgId = this.previous('msg_id');
+        // Clear any old handler.
+        if (oldMsgId && kernel) {
+            kernel.removeMessageHook(oldMsgId, this._msgHook);
+        }
+        // Register any new handler.
+        if (msgId && kernel) {
+            kernel.registerMessageHook(msgId, this._msgHook);
+        }
+    }
+    add(msg) {
+        let msgType = msg.header.msg_type;
+        switch (msgType) {
+            case 'execute_result':
+            case 'display_data':
+            case 'stream':
+            case 'error':
+                let model = msg.content;
+                model.output_type = msgType;
+                this._outputs.add(model);
+                break;
+            case 'clear_output':
+                this.clear_output(msg.content.wait);
+                break;
+            default:
+                break;
+        }
+        this.set('outputs', this._outputs.toJSON(), { newMessage: true });
+        this.save_changes();
+    }
+    clear_output(wait = false) {
+        this._outputs.clear(wait);
+    }
+    get outputs() {
+        return this._outputs;
+    }
+    setOutputs(model, value, options) {
+        if (!(options && options.newMessage)) {
+            // fromJSON does not clear the existing output
+            this.clear_output();
+            // fromJSON does not copy the message, so we make a deep copy
+            this._outputs.fromJSON(JSON.parse(JSON.stringify(this.get('outputs'))));
+        }
+    }
+}
+export class JupyterPhosphorPanelWidget extends Panel {
+    constructor(options) {
+        let view = options.view;
+        delete options.view;
+        super(options);
+        this._view = view;
+    }
+    /**
+     * Process the phosphor message.
+     *
+     * Any custom phosphor widget used inside a Jupyter widget should override
+     * the processMessage function like this.
+     */
+    processMessage(msg) {
+        super.processMessage(msg);
+        this._view.processPhosphorMessage(msg);
+    }
+    /**
+     * Dispose the widget.
+     *
+     * This causes the view to be destroyed as well with 'remove'
+     */
+    dispose() {
+        if (this.isDisposed) {
+            return;
+        }
+        super.dispose();
+        if (this._view) {
+            this._view.remove();
+        }
+        this._view = null;
+    }
+}
+export class OutputView extends outputBase.OutputView {
+    _createElement(tagName) {
+        this.pWidget = new JupyterPhosphorPanelWidget({ view: this });
+        return this.pWidget.node;
+    }
+    _setElement(el) {
+        if (this.el || el !== this.pWidget.node) {
+            // Boxes don't allow setting the element beyond the initial creation.
+            throw new Error('Cannot reset the DOM element.');
+        }
+        this.el = this.pWidget.node;
+        this.$el = $(this.pWidget.node);
+    }
+    /**
+     * Called when view is rendered.
+     */
+    render() {
+        super.render();
+        this._outputView = new OutputArea({
+            rendermime: this.model.widget_manager.rendermime,
+            contentFactory: OutputArea.defaultContentFactory,
+            model: this.model.outputs
+        });
+        // TODO: why is this a readonly property now?
+        // this._outputView.model = this.model.outputs;
+        // TODO: why is this on the model now?
+        // this._outputView.trusted = true;
+        this.pWidget.insertWidget(0, this._outputView);
+        this.pWidget.addClass('jupyter-widgets');
+        this.pWidget.addClass('widget-output');
+        this.update(); // Set defaults.
+    }
+    remove() {
+        this._outputView.dispose();
+        return super.remove();
+    }
+}

+ 15 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/plugin.d.ts

@@ -0,0 +1,15 @@
+import { DocumentRegistry } from '@jupyterlab/docregistry';
+import { INotebookModel } from '@jupyterlab/notebook';
+import { JupyterFrontEndPlugin } from '@jupyterlab/application';
+import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
+import { DisposableDelegate } from '@lumino/disposable';
+import { WidgetRenderer } from './renderer';
+import * as base from '@jupyter-widgets/base';
+import '@jupyter-widgets/base/css/index.css';
+import '@jupyter-widgets/controls/css/widgets-base.css';
+export declare function registerWidgetManager(context: DocumentRegistry.IContext<INotebookModel>, rendermime: IRenderMimeRegistry, renderers: IterableIterator<WidgetRenderer>): DisposableDelegate;
+/**
+ * The widget manager provider.
+ */
+declare const plugin: JupyterFrontEndPlugin<base.IJupyterWidgetRegistry>;
+export default plugin;

+ 212 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/plugin.js

@@ -0,0 +1,212 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import { ISettingRegistry } from '@jupyterlab/settingregistry';
+import { INotebookTracker } from '@jupyterlab/notebook';
+import { IMainMenu, } from '@jupyterlab/mainmenu';
+import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
+import { ILoggerRegistry } from '@jupyterlab/logconsole';
+import { toArray, filter } from '@lumino/algorithm';
+import { DisposableDelegate } from '@lumino/disposable';
+import { AttachedProperty } from '@lumino/properties';
+import { WidgetRenderer } from './renderer';
+import { WidgetManager, WIDGET_VIEW_MIMETYPE } from './manager';
+import { OutputModel, OutputView, OUTPUT_WIDGET_VERSION } from './output';
+import * as base from '@jupyter-widgets/base';
+// We import only the version from the specific module in controls so that the
+// controls code can be split and dynamically loaded in webpack.
+import { JUPYTER_CONTROLS_VERSION } from '@jupyter-widgets/controls/lib/version';
+import '@jupyter-widgets/base/css/index.css';
+import '@jupyter-widgets/controls/css/widgets-base.css';
+import { KernelMessage } from '@jupyterlab/services';
+const WIDGET_REGISTRY = [];
+/**
+ * The cached settings.
+ */
+const SETTINGS = { saveState: false };
+/**
+ * Iterate through all widget renderers in a notebook.
+ */
+function* widgetRenderers(nb) {
+    for (let cell of nb.widgets) {
+        if (cell.model.type === 'code') {
+            for (let codecell of cell.outputArea.widgets) {
+                for (let output of toArray(codecell.children())) {
+                    if (output instanceof WidgetRenderer) {
+                        yield output;
+                    }
+                }
+            }
+        }
+    }
+}
+/**
+ * Iterate through all matching linked output views
+ */
+function* outputViews(app, path) {
+    let linkedViews = filter(app.shell.widgets(), w => w.id.startsWith('LinkedOutputView-') && w.path === path);
+    for (let view of toArray(linkedViews)) {
+        for (let outputs of toArray(view.children())) {
+            for (let output of toArray(outputs.children())) {
+                if (output instanceof WidgetRenderer) {
+                    yield output;
+                }
+            }
+        }
+    }
+}
+function* chain(...args) {
+    for (let it of args) {
+        yield* it;
+    }
+}
+export function registerWidgetManager(context, rendermime, renderers) {
+    let wManager = Private.widgetManagerProperty.get(context);
+    if (!wManager) {
+        wManager = new WidgetManager(context, rendermime, SETTINGS);
+        WIDGET_REGISTRY.forEach(data => wManager.register(data));
+        Private.widgetManagerProperty.set(context, wManager);
+    }
+    for (let r of renderers) {
+        r.manager = wManager;
+    }
+    // Replace the placeholder widget renderer with one bound to this widget
+    // manager.
+    rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE);
+    rendermime.addFactory({
+        safe: false,
+        mimeTypes: [WIDGET_VIEW_MIMETYPE],
+        createRenderer: (options) => new WidgetRenderer(options, wManager)
+    }, 0);
+    return new DisposableDelegate(() => {
+        if (rendermime) {
+            rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE);
+        }
+        wManager.dispose();
+    });
+}
+/**
+ * The widget manager provider.
+ */
+const plugin = {
+    id: '@jupyter-widgets/jupyterlab-manager:plugin',
+    requires: [IRenderMimeRegistry, ISettingRegistry],
+    optional: [INotebookTracker, IMainMenu, ILoggerRegistry],
+    provides: base.IJupyterWidgetRegistry,
+    activate: activateWidgetExtension,
+    autoStart: true
+};
+export default plugin;
+function updateSettings(settings) {
+    SETTINGS.saveState = settings.get('saveState').composite;
+}
+/**
+ * Activate the widget extension.
+ */
+function activateWidgetExtension(app, rendermime, settingRegistry, tracker, menu, loggerRegistry) {
+    const { commands } = app;
+    const bindUnhandledIOPubMessageSignal = (nb) => {
+        if (!loggerRegistry) {
+            return;
+        }
+        const wManager = Private.widgetManagerProperty.get(nb.context);
+        if (wManager) {
+            wManager.onUnhandledIOPubMessage.connect((sender, msg) => {
+                const logger = loggerRegistry.getLogger(nb.context.path);
+                let level = 'warning';
+                if (KernelMessage.isErrorMsg(msg) ||
+                    (KernelMessage.isStreamMsg(msg) && msg.content.name === 'stderr')) {
+                    level = 'error';
+                }
+                const data = Object.assign(Object.assign({}, msg.content), { output_type: msg.header.msg_type });
+                logger.rendermime = nb.content.rendermime;
+                logger.log({ type: 'output', data, level });
+            });
+        }
+    };
+    settingRegistry.load(plugin.id).then((settings) => {
+        settings.changed.connect(updateSettings);
+        updateSettings(settings);
+    }).catch((reason) => {
+        console.error(reason.message);
+    });
+    // Add a placeholder widget renderer.
+    rendermime.addFactory({
+        safe: false,
+        mimeTypes: [WIDGET_VIEW_MIMETYPE],
+        createRenderer: options => new WidgetRenderer(options)
+    }, 0);
+    if (tracker) {
+        tracker.forEach(panel => {
+            registerWidgetManager(panel.context, panel.content.rendermime, chain(widgetRenderers(panel.content), outputViews(app, panel.context.path)));
+            bindUnhandledIOPubMessageSignal(panel);
+        });
+        tracker.widgetAdded.connect((sender, panel) => {
+            registerWidgetManager(panel.context, panel.content.rendermime, chain(widgetRenderers(panel.content), outputViews(app, panel.context.path)));
+            bindUnhandledIOPubMessageSignal(panel);
+        });
+    }
+    // Add a command for creating a new Markdown file.
+    commands.addCommand('@jupyter-widgets/jupyterlab-manager:saveWidgetState', {
+        label: 'Save Widget State Automatically',
+        execute: args => {
+            return settingRegistry
+                .set(plugin.id, 'saveState', !SETTINGS.saveState)
+                .catch((reason) => {
+                console.error(`Failed to set ${plugin.id}: ${reason.message}`);
+            });
+        },
+        isToggled: () => SETTINGS.saveState
+    });
+    if (menu) {
+        menu.settingsMenu.addGroup([
+            { command: '@jupyter-widgets/jupyterlab-manager:saveWidgetState' }
+        ]);
+    }
+    WIDGET_REGISTRY.push({
+        name: '@jupyter-widgets/base',
+        version: base.JUPYTER_WIDGETS_VERSION,
+        exports: {
+            WidgetModel: base.WidgetModel,
+            WidgetView: base.WidgetView,
+            DOMWidgetView: base.DOMWidgetView,
+            DOMWidgetModel: base.DOMWidgetModel,
+            LayoutModel: base.LayoutModel,
+            LayoutView: base.LayoutView,
+            StyleModel: base.StyleModel,
+            StyleView: base.StyleView
+        }
+    });
+    WIDGET_REGISTRY.push({
+        name: '@jupyter-widgets/controls',
+        version: JUPYTER_CONTROLS_VERSION,
+        exports: () => {
+            return new Promise((resolve, reject) => {
+                require.ensure(['@jupyter-widgets/controls'], (require) => {
+                    resolve(require('@jupyter-widgets/controls'));
+                }, (err) => {
+                    reject(err);
+                }, '@jupyter-widgets/controls');
+            });
+        }
+    });
+    WIDGET_REGISTRY.push({
+        name: '@jupyter-widgets/output',
+        version: OUTPUT_WIDGET_VERSION,
+        exports: { OutputModel, OutputView }
+    });
+    return {
+        registerWidget(data) {
+            WIDGET_REGISTRY.push(data);
+        }
+    };
+}
+var Private;
+(function (Private) {
+    /**
+     * A private attached property for a widget manager.
+     */
+    Private.widgetManagerProperty = new AttachedProperty({
+        name: 'widgetManager',
+        create: () => undefined
+    });
+})(Private || (Private = {}));

+ 33 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/renderer.d.ts

@@ -0,0 +1,33 @@
+import { IDisposable } from '@lumino/disposable';
+import { Panel } from '@lumino/widgets';
+import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
+import { WidgetManager } from './manager';
+/**
+ * A renderer for widgets.
+ */
+export declare class WidgetRenderer extends Panel implements IRenderMime.IRenderer, IDisposable {
+    constructor(options: IRenderMime.IRendererOptions, manager?: WidgetManager);
+    /**
+     * The widget manager.
+     */
+    set manager(value: WidgetManager);
+    renderModel(model: IRenderMime.IMimeModel): Promise<void>;
+    /**
+     * Get whether the manager is disposed.
+     *
+     * #### Notes
+     * This is a read-only property.
+     */
+    get isDisposed(): boolean;
+    /**
+     * Dispose the resources held by the manager.
+     */
+    dispose(): void;
+    private _rerender;
+    /**
+     * The mimetype being rendered.
+     */
+    readonly mimeType: string;
+    private _manager;
+    private _rerenderMimeModel;
+}

+ 102 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/renderer.js

@@ -0,0 +1,102 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import { PromiseDelegate } from '@lumino/coreutils';
+import { Panel } from '@lumino/widgets';
+/**
+ * A renderer for widgets.
+ */
+export class WidgetRenderer extends Panel {
+    constructor(options, manager) {
+        super();
+        this._manager = new PromiseDelegate();
+        this._rerenderMimeModel = null;
+        this.mimeType = options.mimeType;
+        if (manager) {
+            this.manager = manager;
+        }
+    }
+    /**
+     * The widget manager.
+     */
+    set manager(value) {
+        value.restored.connect(this._rerender, this);
+        this._manager.resolve(value);
+    }
+    async renderModel(model) {
+        const source = model.data[this.mimeType];
+        // Let's be optimistic, and hope the widget state will come later.
+        this.node.textContent = 'Loading widget...';
+        this.addClass('jupyter-widgets');
+        const manager = await this._manager.promise;
+        // If there is no model id, the view was removed, so hide the node.
+        if (source.model_id === '') {
+            this.hide();
+            return Promise.resolve();
+        }
+        let wModel;
+        try {
+            wModel = await manager.get_model(source.model_id);
+        }
+        catch (err) {
+            if (manager.restoredStatus) {
+                // The manager has been restored, so this error won't be going away.
+                this.node.textContent = 'Error displaying widget: model not found';
+                this.addClass('jupyter-widgets');
+                console.error(err);
+                return;
+            }
+            // Store the model for a possible rerender
+            this._rerenderMimeModel = model;
+            return;
+        }
+        // Successful getting the model, so we don't need to try to rerender.
+        this._rerenderMimeModel = null;
+        let widget;
+        try {
+            widget = await manager.display_model(undefined, wModel, undefined);
+        }
+        catch (err) {
+            this.node.textContent = 'Error displaying widget';
+            this.addClass('jupyter-widgets');
+            console.error(err);
+            return;
+        }
+        // Clear any previous loading message.
+        this.node.textContent = '';
+        this.addWidget(widget);
+        // When the widget is disposed, hide this container and make sure we
+        // change the output model to reflect the view was closed.
+        widget.disposed.connect(() => {
+            this.hide();
+            source.model_id = '';
+        });
+    }
+    /**
+     * Get whether the manager is disposed.
+     *
+     * #### Notes
+     * This is a read-only property.
+     */
+    get isDisposed() {
+        return this._manager === null;
+    }
+    /**
+     * Dispose the resources held by the manager.
+     */
+    dispose() {
+        if (this.isDisposed) {
+            return;
+        }
+        super.dispose();
+        this._manager = null;
+    }
+    _rerender() {
+        if (this._rerenderMimeModel) {
+            // Clear the error message
+            this.node.textContent = '';
+            this.removeClass('jupyter-widgets');
+            // Attempt to rerender.
+            this.renderModel(this._rerenderMimeModel);
+        }
+    }
+}

+ 8 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/semvercache.d.ts

@@ -0,0 +1,8 @@
+/**
+ * A cache using semver ranges to retrieve values.
+ */
+export declare class SemVerCache<T> {
+    set(key: string, version: string, object: T): void;
+    get(key: string, semver: string): T;
+    private _cache;
+}

+ 29 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/lib/semvercache.js

@@ -0,0 +1,29 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+import { maxSatisfying } from 'semver';
+/**
+ * A cache using semver ranges to retrieve values.
+ */
+export class SemVerCache {
+    constructor() {
+        this._cache = Object.create(null);
+    }
+    set(key, version, object) {
+        if (!(key in this._cache)) {
+            this._cache[key] = Object.create(null);
+        }
+        if (!(version in this._cache[key])) {
+            this._cache[key][version] = object;
+        }
+        else {
+            throw `Version ${version} of key ${key} already registered.`;
+        }
+    }
+    get(key, semver) {
+        if (key in this._cache) {
+            let versions = this._cache[key];
+            let best = maxSatisfying(Object.keys(versions), semver);
+            return versions[best];
+        }
+    }
+}

+ 96 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/package.json

@@ -0,0 +1,96 @@
+{
+  "name": "@jupyter-widgets/jupyterlab-manager",
+  "version": "3.0.1",
+  "description": "The JupyterLab extension providing Jupyter widgets.",
+  "keywords": [
+    "jupyter",
+    "jupyterlab",
+    "jupyterlab notebook",
+    "jupyterlab-extension"
+  ],
+  "homepage": "https://github.com/jupyter-widgets/ipywidgets",
+  "bugs": {
+    "url": "https://github.com/jupyter-widgets/ipywidgets/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/jupyter-widgets/ipywidgets"
+  },
+  "license": "BSD-3-Clause",
+  "author": "Project Jupyter",
+  "sideEffects": [
+    "style/*.css"
+  ],
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}",
+    "style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}",
+    "dist/*.js",
+    "schema/*.json"
+  ],
+  "scripts": {
+    "build": "jlpm run build:lib && jlpm run build:labextension:dev",
+    "build:prod": "jlpm run build:lib && jlpm run build:labextension",
+    "build:labextension": "jupyter labextension build .",
+    "build:labextension:dev": "jupyter labextension build --development True .",
+    "build:lib": "tsc",
+    "clean": "jlpm run clean:lib",
+    "clean:all": "jlpm run clean:lib && jlpm run clean:labextension",
+    "clean:labextension": "rimraf jupyterlab_widgets/labextension",
+    "clean:lib": "rimraf lib tsconfig.tsbuildinfo",
+    "eslint": "eslint . --ext .ts,.tsx --fix",
+    "eslint:check": "eslint . --ext .ts,.tsx",
+    "install:extension": "jupyter labextension develop --overwrite .",
+    "prepare": "jlpm run clean && jlpm run build:prod",
+    "watch": "run-p watch:src watch:labextension",
+    "watch:labextension": "jupyter labextension watch .",
+    "watch:src": "tsc -w"
+  },
+  "dependencies": {
+    "@jupyter-widgets/base": "^4.0.0",
+    "@jupyter-widgets/controls": "^3.0.0",
+    "@jupyter-widgets/output": "^4.0.0",
+    "@jupyterlab/application": "^3.0.0",
+    "@jupyterlab/docregistry": "^3.0.0",
+    "@jupyterlab/logconsole": "^3.0.0",
+    "@jupyterlab/mainmenu": "^3.0.0",
+    "@jupyterlab/nbformat": "^3.0.0",
+    "@jupyterlab/notebook": "^3.0.0",
+    "@jupyterlab/outputarea": "^3.0.0",
+    "@jupyterlab/rendermime": "^3.0.0",
+    "@jupyterlab/rendermime-interfaces": "^3.0.0",
+    "@jupyterlab/services": "^6.0.0",
+    "@jupyterlab/settingregistry": "^3.0.0",
+    "@lumino/algorithm": "^1.1.0",
+    "@lumino/coreutils": "^1.3.0",
+    "@lumino/disposable": "^1.1.1",
+    "@lumino/messaging": "^1.2.1",
+    "@lumino/properties": "^1.1.0",
+    "@lumino/signaling": "^1.2.0",
+    "@lumino/widgets": "^1.3.0",
+    "@types/backbone": "^1.4.1",
+    "jquery": "^3.1.1",
+    "semver": "^6.1.1"
+  },
+  "devDependencies": {
+    "@jupyterlab/builder": "^3.0.0",
+    "@jupyterlab/cells": "^3.0.0",
+    "@types/semver": "^6.0.1",
+    "@typescript-eslint/eslint-plugin": "^2.27.0",
+    "@typescript-eslint/parser": "^2.27.0",
+    "eslint": "^7.5.0",
+    "eslint-config-prettier": "^6.10.1",
+    "eslint-plugin-prettier": "^3.1.2",
+    "npm-run-all": "^4.1.5",
+    "prettier": "^1.19.0",
+    "rimraf": "^3.0.2",
+    "typescript": "~3.9.0"
+  },
+  "jupyterlab": {
+    "extension": true,
+    "outputDir": "jupyterlab_widgets/labextension",
+    "schemaDir": "./schema"
+  },
+  "gitHead": "febdb4b2181951746fee4e728da043631aba33ef"
+}

+ 14 - 0
.cache/yarn/v6/.tmp/d59ed821af0febbfdcf4ce1edc2e911f/schema/plugin.json

@@ -0,0 +1,14 @@
+{
+  "title": "Jupyter Widgets",
+  "description": "Jupyter widgets settings.",
+  "additionalProperties": false,
+  "properties": {
+    "saveState": {
+      "type": "boolean",
+      "title": "Save Jupyter widget state in notebooks",
+      "description": "Automatically save Jupyter widget state when a notebook is saved.",
+      "default": false
+    }
+  },
+  "type": "object"
+}

+ 99 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/.yarn-metadata.json

@@ -0,0 +1,99 @@
+{
+  "manifest": {
+    "name": "jupyterlab-plotly",
+    "version": "5.5.0",
+    "description": "The plotly Jupyter extension",
+    "author": {
+      "name": "The plotly.py team"
+    },
+    "license": "MIT",
+    "main": "lib/index.js",
+    "repository": {
+      "type": "git",
+      "url": "https://github.com/plotly/plotly.py"
+    },
+    "keywords": [
+      "jupyter",
+      "widgets",
+      "ipython",
+      "ipywidgets",
+      "plotly"
+    ],
+    "files": [
+      "lib/**/*.js",
+      "dist/*.js",
+      "style/*.*"
+    ],
+    "scripts": {
+      "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev",
+      "build:prod": "npm run build:lib && npm run build:nbextension && npm run build:labextension",
+      "build:labextension": "jupyter labextension build .",
+      "build:labextension:dev": "jupyter labextension build --development True .",
+      "build:lib": "tsc",
+      "build:nbextension": "webpack --mode=production",
+      "clean": "npm run clean:lib && npm run clean:nbextension && npm run clean:labextension",
+      "clean:lib": "rimraf lib",
+      "clean:labextension": "rimraf ../../python/plotly/jupyterlab_plotly/labextension",
+      "clean:nbextension": "rimraf ../../python/plotly/jupyterlab_plotly/nbextension/index.js*",
+      "lint": "eslint . --ext .ts,.tsx --fix",
+      "lint:check": "eslint . --ext .ts,.tsx",
+      "prepack": "npm run build:lib",
+      "test": "echo \"Error: no test specified\" && exit 1",
+      "watch": "npm-run-all -p watch:*",
+      "watch:lib": "tsc -w",
+      "watch:nbextension": "webpack --watch"
+    },
+    "devDependencies": {
+      "@jupyterlab/builder": "^3.0.0",
+      "@lumino/application": "^1.6.0",
+      "@types/plotly.js": "^1.54.10",
+      "@types/webpack-env": "^1.13.6",
+      "acorn": "^7.2.0",
+      "css-loader": "^5.2.6",
+      "fs-extra": "^7.0.0",
+      "mkdirp": "^0.5.1",
+      "npm-run-all": "^4.1.3",
+      "prettier": "^2.0.5",
+      "rimraf": "^2.6.2",
+      "source-map-loader": "^1.1.3",
+      "style-loader": "^1.0.0",
+      "ts-loader": "^8.0.0",
+      "typescript": "~4.1.3",
+      "webpack": "^5.0.0",
+      "webpack-cli": "^4.0.0"
+    },
+    "dependencies": {
+      "@jupyter-widgets/base": "^2.0.0 || ^3.0.0 || ^4.0.0",
+      "@jupyterlab/rendermime-interfaces": "^1.3.0 || ^2.0.0 || ^3.0.0",
+      "@lumino/messaging": "^1.2.3",
+      "@lumino/widgets": "^1.8.1",
+      "lodash": "^4.17.4",
+      "plotly.js": "^2.8.3"
+    },
+    "jupyterlab": {
+      "extension": "lib/jupyterlab-plugin",
+      "mimeExtension": "lib/plotly-renderer",
+      "outputDir": "../../python/plotly/jupyterlab_plotly/labextension",
+      "sharedPackages": {
+        "@jupyter-widgets/base": {
+          "bundled": false,
+          "singleton": true
+        }
+      }
+    },
+    "_registry": "npm",
+    "_loc": "/home/jovyan/.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/package.json",
+    "readmeFilename": "README.md",
+    "readme": "Jupyter Extension for Plotly.py\n\nSee https://plot.ly/python/getting-started/ for details.\n\nInstall with `jupyter labextension install plotlywidget` in JupyterLab, otherwise\njust install Plotly.py and it will automatically work in Classic Notebooks.\n"
+  },
+  "artifacts": [],
+  "remote": {
+    "type": "tarball",
+    "reference": "file:../extensions/jupyterlab-plotly-5.5.0.tgz",
+    "registry": "npm",
+    "hash": "",
+    "cacheIntegrity": "sha1-wWTCm2vkcMByglHK/lCUMdjGFXE="
+  },
+  "registry": "npm",
+  "hash": "c164c29b6be470c0728251cafe509431d8c61571"
+}

+ 6 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/README.md

@@ -0,0 +1,6 @@
+Jupyter Extension for Plotly.py
+
+See https://plot.ly/python/getting-started/ for details.
+
+Install with `jupyter labextension install plotlywidget` in JupyterLab, otherwise
+just install Plotly.py and it will automatically work in Classic Notebooks.

File diff suppressed because it is too large
+ 2 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/dist/index.js


+ 189 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/dist/javascript-renderer-extension.js

@@ -0,0 +1,189 @@
+"use strict";
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const widgets_1 = require("@lumino/widgets");
+const plotly_1 = __importDefault(require("plotly.js/dist/plotly"));
+require("../style/index.css");
+/**
+ * The CSS class to add to the Plotly Widget.
+ */
+const CSS_CLASS = "jp-RenderedPlotly";
+/**
+ * The CSS class for a Plotly icon.
+ */
+const CSS_ICON_CLASS = "jp-MaterialIcon jp-PlotlyIcon";
+/**
+ * The MIME type for Plotly.
+ * The version of this follows the major version of Plotly.
+ */
+exports.MIME_TYPE = "application/vnd.plotly.v1+json";
+class RenderedPlotly extends widgets_1.Widget {
+    /**
+     * Create a new widget for rendering Plotly.
+     */
+    constructor(options) {
+        super();
+        this.addClass(CSS_CLASS);
+        this._mimeType = options.mimeType;
+        // Create image element
+        this._img_el = document.createElement("img");
+        this._img_el.className = "plot-img";
+        this.node.appendChild(this._img_el);
+        // Install image hover callback
+        this._img_el.addEventListener("mouseenter", (event) => {
+            this.createGraph(this._model);
+        });
+    }
+    /**
+     * Render Plotly into this widget's node.
+     */
+    renderModel(model) {
+        if (this.hasGraphElement()) {
+            // We already have a graph, don't overwrite it
+            return Promise.resolve();
+        }
+        // Save off reference to model so that we can regenerate the plot later
+        this._model = model;
+        // Check for PNG data in mime bundle
+        const png_data = model.data["image/png"];
+        if (png_data !== undefined && png_data !== null) {
+            // We have PNG data, use it
+            this.updateImage(png_data);
+            return Promise.resolve();
+        }
+        else {
+            // Create a new graph
+            return this.createGraph(model);
+        }
+    }
+    hasGraphElement() {
+        // Check for the presence of the .plot-container element that plotly.js
+        // places at the top of the figure structure
+        return this.node.querySelector(".plot-container") !== null;
+    }
+    updateImage(png_data) {
+        this.hideGraph();
+        this._img_el.src = "data:image/png;base64," + png_data;
+        this.showImage();
+    }
+    hideGraph() {
+        // Hide the graph if there is one
+        let el = this.node.querySelector(".plot-container");
+        if (el !== null && el !== undefined) {
+            el.style.display = "none";
+        }
+    }
+    showGraph() {
+        // Show the graph if there is one
+        let el = this.node.querySelector(".plot-container");
+        if (el !== null && el !== undefined) {
+            el.style.display = "block";
+        }
+    }
+    hideImage() {
+        // Hide the image element
+        let el = this.node.querySelector(".plot-img");
+        if (el !== null && el !== undefined) {
+            el.style.display = "none";
+        }
+    }
+    showImage() {
+        // Show the image element
+        let el = this.node.querySelector(".plot-img");
+        if (el !== null && el !== undefined) {
+            el.style.display = "block";
+        }
+    }
+    createGraph(model) {
+        const { data, layout, frames, config } = model.data[this._mimeType];
+        return plotly_1.default.react(this.node, data, layout, config).then((plot) => {
+            this.showGraph();
+            this.hideImage();
+            this.update();
+            if (frames) {
+                plotly_1.default.addFrames(this.node, frames);
+            }
+            if (this.node.offsetWidth > 0 && this.node.offsetHeight > 0) {
+                plotly_1.default.toImage(plot, {
+                    format: "png",
+                    width: this.node.offsetWidth,
+                    height: this.node.offsetHeight,
+                }).then((url) => {
+                    const imageData = url.split(",")[1];
+                    if (model.data["image/png"] !== imageData) {
+                        model.setData({
+                            data: Object.assign(Object.assign({}, model.data), { "image/png": imageData }),
+                        });
+                    }
+                });
+            }
+            // Handle webgl context lost events
+            this.node.on("plotly_webglcontextlost", () => {
+                const png_data = model.data["image/png"];
+                if (png_data !== undefined && png_data !== null) {
+                    // We have PNG data, use it
+                    this.updateImage(png_data);
+                    return Promise.resolve();
+                }
+            });
+        });
+    }
+    /**
+     * A message handler invoked on an `'after-show'` message.
+     */
+    onAfterShow(msg) {
+        this.update();
+    }
+    /**
+     * A message handler invoked on a `'resize'` message.
+     */
+    onResize(msg) {
+        this.update();
+    }
+    /**
+     * A message handler invoked on an `'update-request'` message.
+     */
+    onUpdateRequest(msg) {
+        if (this.isVisible && this.hasGraphElement()) {
+            plotly_1.default.redraw(this.node).then(() => {
+                plotly_1.default.Plots.resize(this.node);
+            });
+        }
+    }
+}
+exports.RenderedPlotly = RenderedPlotly;
+/**
+ * A mime renderer factory for Plotly data.
+ */
+exports.rendererFactory = {
+    safe: true,
+    mimeTypes: [exports.MIME_TYPE],
+    createRenderer: (options) => new RenderedPlotly(options),
+};
+const extensions = [
+    {
+        id: "@jupyterlab/plotly-extension:factory",
+        rendererFactory: exports.rendererFactory,
+        rank: 0,
+        dataType: "json",
+        fileTypes: [
+            {
+                name: "plotly",
+                mimeTypes: [exports.MIME_TYPE],
+                extensions: [".plotly", ".plotly.json"],
+                iconClass: CSS_ICON_CLASS,
+            },
+        ],
+        documentWidgetFactoryOptions: {
+            name: "Plotly",
+            primaryFileType: "plotly",
+            fileTypes: ["plotly", "json"],
+            defaultFor: ["plotly"],
+        },
+    },
+];
+exports.default = extensions;

File diff suppressed because it is too large
+ 1692 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/Figure.js


+ 12 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/extension.js

@@ -0,0 +1,12 @@
+// Entry point for the notebook bundle containing custom model definitions.
+//
+// Setup notebook base URL
+//
+// Some static assets may be required by the custom widget javascript. The base
+// url for the notebook is not known at build time and is therefore computed
+// dynamically.
+// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+window.__webpack_public_path__ =
+    document.querySelector('body').getAttribute('data-base-url') +
+        'nbextensions/jupyterlab-plotly';
+export * from './index';

+ 3 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/index.js

@@ -0,0 +1,3 @@
+// Export widget models and views, and the npm package version number.
+export * from './Figure';
+export * from './version';

+ 22 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/jupyterlab-plugin.js

@@ -0,0 +1,22 @@
+import { IJupyterWidgetRegistry } from "@jupyter-widgets/base";
+import { MODULE_NAME, MODULE_VERSION } from "./version";
+/**
+ * Activate the widget extension.
+ */
+function activateWidgetExtension(app, registry) {
+    registry.registerWidget({
+        name: MODULE_NAME,
+        version: MODULE_VERSION,
+        exports: () => import("./index"),
+    });
+}
+/**
+ * The widget plugin.
+ */
+const widgetPlugin = {
+    id: "jupyterlab-plotly",
+    requires: [IJupyterWidgetRegistry],
+    activate: activateWidgetExtension,
+    autoStart: true,
+};
+export default widgetPlugin;

+ 205 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/plotly-renderer.js

@@ -0,0 +1,205 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+import { Widget } from "@lumino/widgets";
+import "../style/index.css";
+/**
+ * The CSS class to add to the Plotly Widget.
+ */
+const CSS_CLASS = "jp-RenderedPlotly";
+/**
+ * The CSS class for a Plotly icon.
+ */
+const CSS_ICON_CLASS = "jp-MaterialIcon jp-PlotlyIcon";
+/**
+ * The MIME type for Plotly.
+ * The version of this follows the major version of Plotly.
+ */
+export const MIME_TYPE = "application/vnd.plotly.v1+json";
+export class RenderedPlotly extends Widget {
+    /**
+     * Create a new widget for rendering Plotly.
+     */
+    constructor(options) {
+        super();
+        this.addClass(CSS_CLASS);
+        this._mimeType = options.mimeType;
+        // Create image element
+        this._img_el = document.createElement("img");
+        this._img_el.className = "plot-img";
+        this.node.appendChild(this._img_el);
+        // Install image hover callback
+        this._img_el.addEventListener("mouseenter", (event) => {
+            this.createGraph(this._model);
+        });
+    }
+    /**
+     * Render Plotly into this widget's node.
+     */
+    renderModel(model) {
+        if (this.hasGraphElement()) {
+            // We already have a graph, don't overwrite it
+            return Promise.resolve();
+        }
+        // Save off reference to model so that we can regenerate the plot later
+        this._model = model;
+        // Check for PNG data in mime bundle
+        const png_data = model.data["image/png"];
+        if (png_data !== undefined && png_data !== null) {
+            // We have PNG data, use it
+            this.updateImage(png_data);
+            return Promise.resolve();
+        }
+        else {
+            // Create a new graph
+            return this.createGraph(model);
+        }
+    }
+    hasGraphElement() {
+        // Check for the presence of the .plot-container element that plotly.js
+        // places at the top of the figure structure
+        return this.node.querySelector(".plot-container") !== null;
+    }
+    updateImage(png_data) {
+        this.hideGraph();
+        this._img_el.src = "data:image/png;base64," + png_data;
+        this.showImage();
+    }
+    hideGraph() {
+        // Hide the graph if there is one
+        let el = this.node.querySelector(".plot-container");
+        if (el !== null && el !== undefined) {
+            el.style.display = "none";
+        }
+    }
+    showGraph() {
+        // Show the graph if there is one
+        let el = this.node.querySelector(".plot-container");
+        if (el !== null && el !== undefined) {
+            el.style.display = "block";
+        }
+    }
+    hideImage() {
+        // Hide the image element
+        let el = this.node.querySelector(".plot-img");
+        if (el !== null && el !== undefined) {
+            el.style.display = "none";
+        }
+    }
+    showImage() {
+        // Show the image element
+        let el = this.node.querySelector(".plot-img");
+        if (el !== null && el !== undefined) {
+            el.style.display = "block";
+        }
+    }
+    createGraph(model) {
+        const { data, layout, frames, config } = model.data[this._mimeType];
+        // Load plotly asynchronously
+        const loadPlotly = () => __awaiter(this, void 0, void 0, function* () {
+            if (RenderedPlotly.Plotly === null) {
+                RenderedPlotly.Plotly = yield import("plotly.js/dist/plotly");
+                RenderedPlotly._resolveLoadingPlotly();
+            }
+            return RenderedPlotly.loadingPlotly;
+        });
+        return loadPlotly()
+            .then(() => RenderedPlotly.Plotly.react(this.node, data, layout, config))
+            .then((plot) => {
+            this.showGraph();
+            this.hideImage();
+            this.update();
+            if (frames) {
+                RenderedPlotly.Plotly.addFrames(this.node, frames);
+            }
+            if (this.node.offsetWidth > 0 && this.node.offsetHeight > 0) {
+                RenderedPlotly.Plotly.toImage(plot, {
+                    format: "png",
+                    width: this.node.offsetWidth,
+                    height: this.node.offsetHeight,
+                }).then((url) => {
+                    const imageData = url.split(",")[1];
+                    if (model.data["image/png"] !== imageData) {
+                        model.setData({
+                            data: Object.assign(Object.assign({}, model.data), { "image/png": imageData }),
+                        });
+                    }
+                });
+            }
+            // Handle webgl context lost events
+            this.node.on("plotly_webglcontextlost", () => {
+                const png_data = model.data["image/png"];
+                if (png_data !== undefined && png_data !== null) {
+                    // We have PNG data, use it
+                    this.updateImage(png_data);
+                    return Promise.resolve();
+                }
+            });
+        });
+    }
+    /**
+     * A message handler invoked on an `'after-show'` message.
+     */
+    onAfterShow(msg) {
+        this.update();
+    }
+    /**
+     * A message handler invoked on a `'resize'` message.
+     */
+    onResize(msg) {
+        this.update();
+    }
+    /**
+     * A message handler invoked on an `'update-request'` message.
+     */
+    onUpdateRequest(msg) {
+        if (RenderedPlotly.Plotly && this.isVisible && this.hasGraphElement()) {
+            RenderedPlotly.Plotly.redraw(this.node).then(() => {
+                RenderedPlotly.Plotly.Plots.resize(this.node);
+            });
+        }
+    }
+}
+RenderedPlotly.Plotly = null;
+RenderedPlotly.loadingPlotly = new Promise((resolve) => {
+    RenderedPlotly._resolveLoadingPlotly = resolve;
+});
+/**
+ * A mime renderer factory for Plotly data.
+ */
+export const rendererFactory = {
+    safe: true,
+    mimeTypes: [MIME_TYPE],
+    createRenderer: (options) => new RenderedPlotly(options),
+};
+const extensions = [
+    {
+        id: "@jupyterlab/plotly-extension:factory",
+        rendererFactory,
+        rank: 0,
+        dataType: "json",
+        fileTypes: [
+            {
+                name: "plotly",
+                mimeTypes: [MIME_TYPE],
+                extensions: [".plotly", ".plotly.json"],
+                iconClass: CSS_ICON_CLASS,
+            },
+        ],
+        documentWidgetFactoryOptions: {
+            name: "Plotly",
+            primaryFileType: "plotly",
+            fileTypes: ["plotly", "json"],
+            defaultFor: ["plotly"],
+        },
+    },
+];
+export default extensions;

+ 15 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/lib/version.js

@@ -0,0 +1,15 @@
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const data = require('../package.json');
+/**
+ * The _model_module_version/_view_module_version this package implements.
+ *
+ * The html widget manager assumes that this is the same as the npm package
+ * version number.
+ */
+export const MODULE_VERSION = data.version;
+/*
+ * The current package name.
+ */
+export const MODULE_NAME = data.name;

+ 81 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/package.json

@@ -0,0 +1,81 @@
+{
+  "name": "jupyterlab-plotly",
+  "version": "5.5.0",
+  "description": "The plotly Jupyter extension",
+  "author": "The plotly.py team",
+  "license": "MIT",
+  "main": "lib/index.js",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/plotly/plotly.py"
+  },
+  "keywords": [
+    "jupyter",
+    "widgets",
+    "ipython",
+    "ipywidgets",
+    "plotly"
+  ],
+  "files": [
+    "lib/**/*.js",
+    "dist/*.js",
+    "style/*.*"
+  ],
+  "scripts": {
+    "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev",
+    "build:prod": "npm run build:lib && npm run build:nbextension && npm run build:labextension",
+    "build:labextension": "jupyter labextension build .",
+    "build:labextension:dev": "jupyter labextension build --development True .",
+    "build:lib": "tsc",
+    "build:nbextension": "webpack --mode=production",
+    "clean": "npm run clean:lib && npm run clean:nbextension && npm run clean:labextension",
+    "clean:lib": "rimraf lib",
+    "clean:labextension": "rimraf ../../python/plotly/jupyterlab_plotly/labextension",
+    "clean:nbextension": "rimraf ../../python/plotly/jupyterlab_plotly/nbextension/index.js*",
+    "lint": "eslint . --ext .ts,.tsx --fix",
+    "lint:check": "eslint . --ext .ts,.tsx",
+    "prepack": "npm run build:lib",
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "watch": "npm-run-all -p watch:*",
+    "watch:lib": "tsc -w",
+    "watch:nbextension": "webpack --watch"
+  },
+  "devDependencies": {
+    "@jupyterlab/builder": "^3.0.0",
+    "@lumino/application": "^1.6.0",
+    "@types/plotly.js": "^1.54.10",
+    "@types/webpack-env": "^1.13.6",
+    "acorn": "^7.2.0",
+    "css-loader": "^5.2.6",
+    "fs-extra": "^7.0.0",
+    "mkdirp": "^0.5.1",
+    "npm-run-all": "^4.1.3",
+    "prettier": "^2.0.5",
+    "rimraf": "^2.6.2",
+    "source-map-loader": "^1.1.3",
+    "style-loader": "^1.0.0",
+    "ts-loader": "^8.0.0",
+    "typescript": "~4.1.3",
+    "webpack": "^5.0.0",
+    "webpack-cli": "^4.0.0"
+  },
+  "dependencies": {
+    "@jupyter-widgets/base": "^2.0.0 || ^3.0.0 || ^4.0.0",
+    "@jupyterlab/rendermime-interfaces": "^1.3.0 || ^2.0.0 || ^3.0.0",
+    "@lumino/messaging": "^1.2.3",
+    "@lumino/widgets": "^1.8.1",
+    "lodash": "^4.17.4",
+    "plotly.js": "^2.8.3"
+  },
+  "jupyterlab": {
+    "extension": "lib/jupyterlab-plugin",
+    "mimeExtension": "lib/plotly-renderer",
+    "outputDir": "../../python/plotly/jupyterlab_plotly/labextension",
+    "sharedPackages": {
+      "@jupyter-widgets/base": {
+        "bundled": false,
+        "singleton": true
+      }
+    }
+  }
+}

+ 32 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/style/index.css

@@ -0,0 +1,32 @@
+/**
+  Copyright (c) Jupyter Development Team.
+  Distributed under the terms of the Modified BSD License.
+*/
+
+/* Add CSS variables to :root */
+:root {
+  --jp-icon-plotly: url('./plotly.svg');
+}
+
+/* Base styles */
+.jp-RenderedPlotly {
+  width: 100%;
+  height: 100%;
+  padding: 0;
+  overflow: hidden;
+}
+
+/* Document styles */
+.jp-MimeDocument .jp-RenderedPlotly {
+  overflow: hidden;
+}
+
+/* Output styles */
+.jp-OutputArea .jp-RenderedPlotly {
+  min-height: 360px;
+}
+
+/* Document icon */
+.jp-PlotlyIcon {
+  background-image: var(--jp-icon-plotly);
+}

+ 31 - 0
.cache/yarn/v6/.tmp/e3b709ad0ded3e9ac478891f9e1dce3d/style/plotly.svg

@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 132 132">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #119dff;
+      }
+
+      .cls-2 {
+        fill: #25fefd;
+      }
+
+      .cls-3 {
+        fill: #fff;
+      }
+    </style>
+  </defs>
+  <title>plotly-logomark</title>
+  <g id="symbol">
+    <rect class="cls-1" width="132" height="132" rx="6" ry="6"/>
+    <circle class="cls-2" cx="78" cy="54" r="6"/>
+    <circle class="cls-2" cx="102" cy="30" r="6"/>
+    <circle class="cls-2" cx="78" cy="30" r="6"/>
+    <circle class="cls-2" cx="54" cy="30" r="6"/>
+    <circle class="cls-2" cx="30" cy="30" r="6"/>
+    <circle class="cls-2" cx="30" cy="54" r="6"/>
+    <path class="cls-3" d="M30,72a6,6,0,0,0-6,6v24a6,6,0,0,0,12,0V78A6,6,0,0,0,30,72Z"/>
+    <path class="cls-3" d="M78,72a6,6,0,0,0-6,6v24a6,6,0,0,0,12,0V78A6,6,0,0,0,78,72Z"/>
+    <path class="cls-3" d="M54,48a6,6,0,0,0-6,6v48a6,6,0,0,0,12,0V54A6,6,0,0,0,54,48Z"/>
+    <path class="cls-3" d="M102,48a6,6,0,0,0-6,6v48a6,6,0,0,0,12,0V54A6,6,0,0,0,102,48Z"/>
+  </g>
+</svg>

File diff suppressed because it is too large
+ 62 - 0
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/.yarn-metadata.json


BIN
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/.yarn-tarball.tgz


+ 22 - 0
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/LICENSE

@@ -0,0 +1,22 @@
+
+The MIT License (MIT)
+
+Copyright (c) 2015 Mikola Lysenko
+
+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.

+ 223 - 0
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/README.md

@@ -0,0 +1,223 @@
+3d-view
+=======
+This module is a generic interface which synchronizes several existing view interactions
+
+* [turntable-camera-controller](https://github.com/mikolalysenko/turntable-camera-controller)
+* [orbit-camera-controller](https://github.com/mikolalysenko/orbit-camera-controller)
+* [matrix-camera-controller](https://github.com/mikolalysenko/orbit-camera-controller)
+
+Each camera controller proceeds by appending events onto a log.  The current camera state is obtained by interpolating between these events.
+
+# API
+
+[Try a more complete demo here](https://mikolalysenko.github.io/3d-view)
+
+```javascript
+var now            = require('right-now')
+var bunny          = require('bunny')
+var perspective    = require('gl-mat4/perspective')
+var fit            = require('canvas-fit')
+var createContext  = require('gl-context')
+var createAxes     = require('gl-axes')
+var createMesh     = require('gl-simplicial-complex')
+var createCamera   = require('3d-view')
+
+//Set up WebGL
+var canvas = document.createElement('canvas')
+document.body.appendChild(canvas)
+window.addEventListener('resize', fit(canvas), false)
+var gl = createContext(canvas, {}, render)
+
+//Create objects for rendering
+var bounds = [[-10,-10,-10], [10,10,10]]
+var mesh = createMesh(gl, {
+    cells: bunny.cells,
+    positions: bunny.positions,
+    colormap: 'jet'
+  })
+var axes = createAxes(gl, {
+    bounds: bounds,
+    tickSpacing: [1,1,1],
+    textSize: 0.05
+  })
+
+//Set up camera
+var projectionMatrix = new Array(16)
+var camera = createCamera({
+  center:  [
+    0.5*(bounds[0][0]+bounds[1][0]),
+    0.5*(bounds[0][1]+bounds[1][1]),
+    0.5*(bounds[0][2]+bounds[1][2]) ],
+  eye: [0, 0, bounds[1][2]],
+  distanceLimits: [1, 1000]
+})
+
+//Create mode drop down
+var modeSelect = document.createElement('select')
+camera.modes.forEach(function(mode) {
+  modeSelect.add(new Option(mode, mode))
+})
+modeSelect.style.position = 'absolute'
+modeSelect.style.left = '10px'
+modeSelect.style.top = '10px'
+modeSelect.style['z-index'] = 10
+document.body.appendChild(modeSelect)
+
+
+//Hook event listeners
+var lastX = 0, lastY = 0
+
+document.oncontextmenu = function(e) { 
+  e.preventDefault()
+  e.stopPropagation()
+  return false 
+}
+
+modeSelect.addEventListener('change', function(ev) {
+  camera.setMode(modeSelect.value)
+})
+
+canvas.addEventListener('mousemove', function(ev) {
+  var dx =  (ev.clientX - lastX) / gl.drawingBufferWidth
+  var dy = -(ev.clientY - lastY) / gl.drawingBufferHeight
+  if(ev.which === 1) {
+    if(ev.shiftKey) {
+      //zoom
+      camera.rotate(now(), 0, 0, dx)
+    } else {
+      //rotate
+      camera.rotate(now(), dx, dy)
+    }
+  } else if(ev.which === 3) {
+    //pan
+    camera.pan(now(), dx, dy)
+  }
+  lastX = ev.clientX
+  lastY = ev.clientY
+})
+
+canvas.addEventListener('wheel', function(e) {
+  camera.pan(now(), 0, 0, e.deltaY)
+})
+
+//Redraw frame
+function render() {
+
+  //Update camera parameters
+  var t = now()
+  camera.idle(t - 20)
+  camera.flush(t - 100)
+  camera.recalcMatrix(t-25)
+  
+  //Compute parameters
+  var cameraParams = {
+    view: camera.computedMatrix,
+    projection: perspective(
+      [],
+      Math.PI/4.0,
+      gl.drawingBufferWidth/gl.drawingBufferHeight,
+      0.1,
+      1000.0)
+  }
+
+  //Draw everything
+  gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
+  gl.enable(gl.DEPTH_TEST)
+  axes.draw(cameraParams)
+  mesh.draw(cameraParams)
+}
+```
+
+## Constructor
+
+#### `var camera = require('3d-view')([options])`
+
+## Methods
+
+#### `camera.idle(t)`
+Idles the camera at time `t`
+
+* `t` is the time to idle at
+
+#### `camera.flush(t)`
+Flush all events in camera state before time `t`
+
+* `t` is the cut off time for the flush
+
+#### `camera.modes`
+An array of modes supported by the camera
+
+#### `camera.setMode(mode)`
+Sets the camera mode
+
+* `mode` is the new mode.  Must be either `turntable`, `orbit` or `matrix`
+
+#### `camera.getMode()`
+Retrieves the current camera mode
+
+#### `camera.lookAt(t, eye, center, up)`
+Reset camera position to focus on a specified target
+
+* `t` is the time of the event
+* `eye` is the position of the camera
+* `center` is the target of the camera
+* `up` is a vector pointing up
+
+#### `camera.rotate(t, yaw, pitch, roll)`
+Rotates the camera incrementally by some amount
+
+* `t` is the time of the input event
+* `yaw` is the amount to rotate by along y-axis in radians
+* `pitch` is the amount to rotate by along x-axis in radians
+* `roll` is the amount to rotate by along z-axis in radians
+
+#### `camera.pan(t, dx, dy, dz)`
+Pans the camera in local (view relative) coordinates
+
+* `t` is the time of the event
+* `dx,dy,dz` is the amount to move
+
+#### `camera.translate(t, dx, dy, dz)`
+Translates the camera in world (absolute global) coordinates
+
+* `t` is the time of the event
+* `dx,dy,dz` is the amount to move
+
+#### `camera.setMatrix(t, matrix)`
+Sets the camera matrix to some fixed 4x4 matrix
+
+* `t` is the time of the event
+* `matrix` is the new camera matrix
+
+#### `camera.setDistance(t, r)`
+Sets camera distance at time `t`
+
+* `t` is the time of the event
+* `r` is the new camera distance
+
+#### `camera.setDistanceLimits(lo, hi)`
+Sets bounds on the camera distance
+
+#### `camera.getDistanceLimits([out])`
+Retrieves the camera limits
+
+#### `camera.recalcMatrix(t)`
+Recomputes all matrix properties at time `t`
+
+#### `camera.computedMatrix`
+The computed 4x4 matrix of the camera
+
+#### `camera.computedEye`
+The computed 3d eye vector for the camera
+
+#### `camera.computedUp`
+Computed up vector (initialized when calling recalcMatrix)
+
+#### `camera.computedCenter`
+Computed camera center point
+
+#### `camera.computedRadius`
+Computed log(radius)
+
+# License
+(c) 2015 Mikola Lysenko. MIT License

+ 225 - 0
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/example/demo.js

@@ -0,0 +1,225 @@
+'use strict'
+
+var now            = require('right-now')
+var bunny          = require('bunny')
+var perspective    = require('gl-mat4/perspective')
+var fit            = require('canvas-fit')
+var createContext  = require('gl-context')
+var createAxes     = require('gl-axes')
+var createMesh     = require('gl-simplicial-complex')
+var createCamera   = require('../view')
+
+//Set up WebGL
+var canvas = document.createElement('canvas')
+document.body.appendChild(canvas)
+window.addEventListener('resize', fit(canvas), false)
+var gl = createContext(canvas, {}, render)
+
+var controlDiv = document.createElement('div')
+controlDiv.style.position = 'absolute'
+controlDiv.style['z-index'] = 10
+controlDiv.style.left = '10px'
+controlDiv.style.top = '10px'
+document.body.appendChild(controlDiv)
+
+var commandList = [
+  'Rotate - Hold left mouse',
+  'Roll - Hold shift + left mouse',
+  'Pan - Hold right mouse',
+  'Zoom - Mouse wheel',
+  'Translate - Hold control + left mouse'
+]
+
+var commandContainer = document.createElement('div')
+commandContainer.style['font-size'] = '75%'
+controlDiv.appendChild(commandContainer)
+
+commandList.forEach(function(str) {
+  var container = document.createElement('p')
+  container.appendChild(document.createTextNode(str))
+  commandContainer.appendChild(container)
+})
+
+function appendItem(label, item) {
+  var container = document.createElement('p')
+  container.appendChild(document.createTextNode(label))
+  container.appendChild(item)
+  controlDiv.appendChild(container)
+}
+
+var delayControl = document.createElement('input')
+delayControl.type = 'range'
+delayControl.min = 0
+delayControl.max = 200
+delayControl.value = 30
+appendItem('Delay:', delayControl)
+
+var zoomControl = document.createElement('input')
+zoomControl.type = 'range'
+zoomControl.min = 1
+zoomControl.max = 1000
+zoomControl.value = 50
+appendItem('Distance:', zoomControl)
+
+var rotateSensitivity = document.createElement('input')
+rotateSensitivity.type = 'range'
+rotateSensitivity.min = -10
+rotateSensitivity.max = 10
+rotateSensitivity.value = 0
+appendItem('Rotation Sensitivity:', rotateSensitivity)
+
+var zoomSensitivity = document.createElement('input')
+zoomSensitivity.type = 'range'
+zoomSensitivity.min = -10
+zoomSensitivity.max = 10
+zoomSensitivity.value = 0
+appendItem('Zoom Sensitivity:', zoomSensitivity)
+
+var flipXControl = document.createElement('input')
+flipXControl.type = 'checkbox'
+appendItem('Flip X:', flipXControl)
+
+var flipYControl = document.createElement('input')
+flipYControl.type = 'checkbox'
+appendItem('Flip Y:', flipYControl)
+
+var modes = ['turntable', 'orbit', 'matrix']
+var modeSelect = document.createElement('select')
+for(var i=0; i<modes.length; ++i) {
+  var option = document.createElement('option')
+  option.text = modes[i]
+  option.value = modes[i]
+  modeSelect.add(option)
+}
+appendItem('Mode:', modeSelect)
+
+var lookAtButton = document.createElement('input')
+lookAtButton.type = 'submit'
+lookAtButton.value = 'Reset'
+controlDiv.appendChild(lookAtButton)
+
+var statusElement = document.createElement('p')
+statusElement.style['font-size'] = '30%'
+controlDiv.appendChild(statusElement)
+
+//Create objects for rendering
+var bounds = [[-10,-10,-10], [10,10,10]]
+var mesh = createMesh(gl, {
+    cells: bunny.cells,
+    positions: bunny.positions,
+    colormap: 'jet'
+  })
+var axes = createAxes(gl, {
+    bounds: bounds,
+    tickSpacing: [1,1,1],
+    textSize: 0.05
+  })
+
+//Set up camera
+var projectionMatrix = new Array(16)
+var camera = createCamera({
+  center:  [
+    0.5*(bounds[0][0]+bounds[1][0]),
+    0.5*(bounds[0][1]+bounds[1][1]),
+    0.5*(bounds[0][2]+bounds[1][2]) ],
+  eye: [0, 0, bounds[1][2]],
+  distanceLimits: [1, 1000]
+})
+
+//Hook event listeners
+var lastX = 0, lastY = 0
+
+document.oncontextmenu = function(e) { 
+  e.preventDefault()
+  e.stopPropagation()
+  return false 
+}
+
+modeSelect.addEventListener('change', function(ev) {
+  camera.setMode(modeSelect.value)
+})
+
+canvas.addEventListener('mousemove', function(ev) {
+  var dx = (ev.clientX - lastX) / gl.drawingBufferWidth
+  var dy = -(ev.clientY - lastY) / gl.drawingBufferHeight
+  var w = Math.exp(+rotateSensitivity.value)
+  var flipX = flipXControl.checked
+  var flipY = flipYControl.checked
+  if(ev.which === 1) {
+    if(ev.shiftKey) {
+      camera.rotate(now(), 0, 0, w*dx)
+    } else if(ev.ctrlKey) {
+      camera.translate(now(), dx, dy, 0)
+    } else {
+      if(flipX) { dx = -dx }
+      if(flipY) { dy = -dy }
+      camera.rotate(now(), w*dx, w*dy)
+    }
+  }
+  if(ev.which === 3) {
+    camera.pan(now(), dx, dy)
+  }
+  lastX = ev.clientX
+  lastY = ev.clientY
+})
+
+canvas.addEventListener('wheel', function(e) {
+  var w = +zoomSensitivity.value
+  camera.pan(now(), 0, 0, Math.exp(w) * e.deltaY)
+})
+
+lookAtButton.addEventListener('click', function() {
+  camera.lookAt(now(),
+    [ 0, 0, -50 ],
+    [ 0.5*(bounds[0][0]+bounds[1][0]),
+      0.5*(bounds[0][1]+bounds[1][1]),
+      0.5*(bounds[0][2]+bounds[1][2]) ],
+    [ 0, 1, 0 ])
+})
+
+zoomControl.addEventListener('change', function() {
+  camera.setDistance(now(), +zoomControl.value)
+})
+
+//Redraw frame
+function render() {
+  //Update camera parameters
+  var t = now()
+  var delay = +delayControl.value
+  camera.idle(t - delay)
+  camera.flush(t - 100 * (delay + 1))
+
+  //Compute parameters
+  var cameraParams = {
+    view: camera.getMatrix(t - 2*delay),
+    projection: perspective(
+      [],
+      Math.PI/4.0,
+      gl.drawingBufferWidth/gl.drawingBufferHeight,
+      0.1,
+      1000.0)
+  }
+
+  //Draw everything
+  gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
+  gl.enable(gl.DEPTH_TEST)
+  axes.draw(cameraParams)
+  mesh.draw(cameraParams)
+
+  var d = camera.getDistance(t)
+  if(d !== +zoomControl.value) {
+    zoomControl.value = d
+  }
+
+  //Write out status stuff
+  statusElement.innerHTML = 
+    '<p>Distance=' + camera.getDistance(t-2*delay) + 
+    '</p><p>Up=[' + camera.getUp(t-2*delay).join() + 
+    ']</p><p>Eye=[' + camera.getEye(t-2*delay).join() + 
+    ']</p><p>Matrix=</p><table><tr><td>' + cameraParams.view.slice(0,4).join('</td><td>') + 
+    '</td></tr><tr><td>' + cameraParams.view.slice(4,8).join('</td><td>') + 
+    '</td></tr><tr><td>' + cameraParams.view.slice(8,12).join('</td><td>') + 
+    '</td></tr><tr><td>' + cameraParams.view.slice(12,16).join('</td><td>') + 
+    '</td></tr></table><p>Rotate sensitivity:' + Math.exp(rotateSensitivity.value) +
+    '</p><p>Zoom sensitivity:' + Math.exp(zoomSensitivity.value) + '</p>'
+}

+ 0 - 0
.cache/yarn/v6/npm-3d-view-2.0.1-2e174571c48215736b376bb66938a3513dad2179-integrity/node_modules/3d-view/example/minimal.js


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