From aaa54a2ff9ce568f7871c13b6791fc38ff744154 Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Wed, 23 Nov 2016 11:06:25 +0100 Subject: [PATCH 001/573] Es6 (#863) * added .editorconfig * babel and webpack configuration * updating dependencies for webpack and babel, removed grunt, updated scripts property * moved plugins file to src directory * refactored utils as es6 modules * removed use strict statement * import backends and drawers as es6 modules and cache them in the wavesurfer constructor object * es6 imports and exports * Removed AudioElement backward compatibility * updated karma to run with webpack * added plugin system to the core library * moved the style function to the util library, backward compatibility reference * updated references to assets in the example html * removed Gruntfile.js * plugin boilerplate for cursor, elan, microphone, minimap and timeline plugins * formatting for cursor, elan, microphone, minimap and timeline plugins * caching of even handlers in cursor plugin, added destroy method * added drawer-created and backend-created events to the core module * minimap destroy function, onCreatedDrawer callback for correct timing * replaced tabs with spaces in elan and minimap plugins * timeline _onReady and _onRedraw event callbacks for correct timing * cursor _onDrawerCreated for correct timing * microphone _onBackendCreated callback for correct timing * region plugin: moving Region definition above the Regions definition * region plugin: adding boilerplate code, moving static methods into the proper object * region plugin: updated variable references * region plugin: formatting and indentation * region plugin: _onCreatedBackend calllback for proper timing, updated variable references * spectrogram plugin: move FFT definition to the top * plugin methods in the core library return this so we can use chaining * minimap plugin: rename created-drawer event to drawer-created event * cursor plugin: fixed wrong reference to wavesurfer drawer * elan plugin: added extends observer property * spectrogram plugin: added plugin boilerplate * spectrogram plugin: indentation * wavesurfer init function returns this to support chaining * elan plugin: added destroy function * spectrogram plugin: added _onReady callback for proper timing, fixed linting issues, updated remaining wrong variable references * .eslint config * replaced initRegions with generic initPlugin('regions') in regions plugin * microphone extends observer * update public-facing (in html) example code with new api * update example code with new api * added cursor plugin example * update public-facing (in html) example code with new api * added plugin system example * region plugin: uses ready event as init event, wavesurfer.enableDragSelection does not reset region plugin * comments in core module * removed webpack-dev-server --env.plugins script * umdNamedDefine property in webpack babel, so amd modules are named * updated editorconfig for 4 spaces indentation * updated .travis.yml to use the new build system * annotation example, removed legacy js code * removed debugging statement and empty variable definition * microphone plugin: removed wrong static function * uniform indentation with 4 spaces * Updated download links on the example pages, added download attribute to link, fixed wrong download url on microphone page * tests for the plugin api * added jasmine core, missing dev dependency * test index now just calls all files with .spec.js in that dir * added node_js version in .travis.yml * tests files are queried from karma.config.js manually, not by requiring them dynamically from an index.js * downloading fresh chrome browser before travis testing * removed chrome installing in travis config, only node v 4.2 * removed invalid outputPath option from webpack config --- .babelrc | 13 + .editorconfig | 11 + .eslintrc.js | 256 ++ .travis.yml | 9 +- Gruntfile.js | 164 - example/angular-material/index.html | 2 +- example/angular/index.html | 2 +- example/annotation/app.js | 46 +- example/annotation/index.html | 8 +- example/audio-element/index.html | 8 +- example/cursor/index.html | 106 + example/cursor/main.js | 25 + example/elan/app.js | 39 +- example/elan/index.html | 6 +- example/equalizer/index.html | 2 +- example/equalizer/main.js | 2 +- example/microphone/app.js | 33 +- example/microphone/index.html | 44 +- example/mute/index.html | 2 +- example/panner/index.html | 6 +- example/playlist/index.html | 2 +- example/plugin-system/app.js | 116 + example/plugin-system/index.html | 188 ++ example/plugin-system/transcripts/001z.mp3 | Bin 0 -> 352154 bytes example/plugin-system/transcripts/001z.xml | 2866 +++++++++++++++++ example/regions/app.js | 46 +- example/regions/index.html | 41 +- example/spectrogram/app.js | 27 +- example/spectrogram/index.html | 27 +- example/split-channels/index.html | 4 +- example/timeline/app.js | 26 +- example/timeline/index.html | 33 +- example/video-element/index.html | 19 +- example/video-element/main.js | 4 +- example/zoom/index.html | 8 +- karma.conf.js | 21 +- package.json | 35 +- plugin/wavesurfer.cursor.js | 62 - plugin/wavesurfer.elan.js | 252 -- plugin/wavesurfer.microphone.js | 312 -- plugin/wavesurfer.minimap.js | 213 -- plugin/wavesurfer.spectrogram.js | 435 --- plugin/wavesurfer.timeline.js | 281 -- spec/plugin-api.spec.js | 102 + spec/util.spec.js | 2 + spec/wavesurfer.spec.js | 2 + src/drawer.canvas.js | 13 +- src/drawer.js | 18 +- src/drawer.multicanvas.js | 12 +- src/mediaelement.js | 12 +- src/plugin/cursor.js | 82 + src/plugin/elan.js | 266 ++ src/plugin/microphone.js | 321 ++ src/plugin/minimap.js | 239 ++ .../plugin/regions.js | 323 +- src/plugin/spectrogram.js | 452 +++ src/plugin/timeline.js | 297 ++ src/util.js | 152 - src/util/ajax.js | 39 + src/util/extend.js | 16 + src/util/get-id.js | 8 + src/util/index.js | 7 + src/util/max.js | 15 + src/util/min.js | 15 + src/util/observer.js | 73 + src/util/style.js | 16 + src/wavesurfer.js | 171 +- src/webaudio.js | 34 +- webpack.config.babel.js | 152 + 69 files changed, 6298 insertions(+), 2343 deletions(-) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .eslintrc.js delete mode 100644 Gruntfile.js create mode 100644 example/cursor/index.html create mode 100644 example/cursor/main.js create mode 100644 example/plugin-system/app.js create mode 100644 example/plugin-system/index.html create mode 100644 example/plugin-system/transcripts/001z.mp3 create mode 100644 example/plugin-system/transcripts/001z.xml delete mode 100755 plugin/wavesurfer.cursor.js delete mode 100644 plugin/wavesurfer.elan.js delete mode 100644 plugin/wavesurfer.microphone.js delete mode 100644 plugin/wavesurfer.minimap.js delete mode 100644 plugin/wavesurfer.spectrogram.js delete mode 100644 plugin/wavesurfer.timeline.js create mode 100644 spec/plugin-api.spec.js create mode 100644 src/plugin/cursor.js create mode 100644 src/plugin/elan.js create mode 100644 src/plugin/microphone.js create mode 100644 src/plugin/minimap.js rename plugin/wavesurfer.regions.js => src/plugin/regions.js (64%) mode change 100755 => 100644 create mode 100644 src/plugin/spectrogram.js create mode 100644 src/plugin/timeline.js delete mode 100644 src/util.js create mode 100644 src/util/ajax.js create mode 100644 src/util/extend.js create mode 100644 src/util/get-id.js create mode 100644 src/util/index.js create mode 100644 src/util/max.js create mode 100644 src/util/min.js create mode 100644 src/util/observer.js create mode 100644 src/util/style.js create mode 100644 webpack.config.babel.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..6ba8347a5 --- /dev/null +++ b/.babelrc @@ -0,0 +1,13 @@ +{ + "presets": [ + ["es2015"] + ], + "plugins": [ + "add-module-exports" + ], + "env": { + "test": { + "plugins": [ "istanbul" ] + } + } +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..48a18f15f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..fec02b541 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,256 @@ +module.exports = { + "env": { + "browser": true, + "commonjs": true, + "es6": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "accessor-pairs": "error", + "array-bracket-spacing": "off", + "array-callback-return": "error", + "arrow-body-style": "error", + "arrow-parens": "off", + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "off", + "block-spacing": [ + "error", + "always" + ], + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "callback-return": "off", + "camelcase": "error", + "class-methods-use-this": "error", + "comma-dangle": "error", + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": [ + "error", + "last" + ], + "complexity": "error", + "computed-property-spacing": [ + "error", + "never" + ], + "consistent-return": "off", + "consistent-this": "off", + "curly": "error", + "default-case": "off", + "dot-location": "off", + "dot-notation": "error", + "eol-last": "error", + "eqeqeq": "off", + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": [ + "error", + "never" + ], + "func-style": "off", + "generator-star-spacing": "error", + "global-require": "error", + "guard-for-in": "off", + "handle-callback-err": "error", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": "off", + "init-declarations": "off", + "jsx-quotes": "error", + "key-spacing": "off", + "keyword-spacing": [ + "off", + { + "after": true, + "before": true + } + ], + "line-comment-position": "off", + "linebreak-style": [ + "error", + "unix" + ], + "lines-around-comment": "off", + "lines-around-directive": "error", + "max-depth": "error", + "max-len": "off", + "max-lines": "off", + "max-nested-callbacks": "error", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "multiline-ternary": "off", + "new-cap": "error", + "new-parens": "off", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "no-redeclare": "off", + "no-unused-vars": "off", + "no-console": "off", + "no-alert": "error", + "no-array-constructor": "error", + "no-bitwise": "off", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "error", + "no-continue": "error", + "no-div-regex": "error", + "no-duplicate-imports": "error", + "no-else-return": "off", + "no-empty-function": "off", + "no-eq-null": "off", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "off", + "no-extra-label": "error", + "no-extra-parens": "off", + "no-floating-decimal": "error", + "no-implicit-coercion": "off", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "off", + "no-inner-declarations": [ + "error", + "functions" + ], + "no-invalid-this": "off", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "off", + "no-mixed-requires": "error", + "no-multi-spaces": "off", + "no-multi-str": "error", + "no-multiple-empty-lines": "off", + "no-native-reassign": "error", + "no-negated-condition": "off", + "no-negated-in-lhs": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "off", + "no-path-concat": "error", + "no-plusplus": "off", + "no-process-env": "error", + "no-process-exit": "error", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "off", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "error", + "no-tabs": "off", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "off", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-use-before-define": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "off", + "no-whitespace-before-property": "error", + "no-with": "error", + "object-curly-newline": "off", + "object-curly-spacing": "off", + "object-property-newline": "off", + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "error", + "operator-assignment": "off", + "operator-linebreak": "off", + "padded-blocks": "off", + "prefer-arrow-callback": "off", + "prefer-const": "error", + "prefer-numeric-literals": "error", + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "error", + "prefer-template": "off", + "quote-props": "off", + "quotes": [ + "error", + "single" + ], + "radix": "off", + "require-jsdoc": "error", + "rest-spread-spacing": "error", + "semi": "error", + "semi-spacing": "error", + "sort-imports": "off", + "sort-keys": "off", + "sort-vars": "off", + "space-before-blocks": "off", + "space-before-function-paren": "off", + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": "off", + "space-unary-ops": "off", + "spaced-comment": "off", + "strict": "error", + "symbol-description": "error", + "template-curly-spacing": "error", + "unicode-bom": [ + "error", + "never" + ], + "valid-jsdoc": "off", + "vars-on-top": "off", + "wrap-iife": "error", + "wrap-regex": "error", + "yield-star-spacing": "error", + "yoda": "off" + } +}; diff --git a/.travis.yml b/.travis.yml index 93ef71058..4c0e42d22 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,13 @@ +sudo: required +dist: trusty language: node_js -sudo: false +node_js: + - "4.2" before_install: - - npm install -g grunt-cli - export CHROME_BIN=chromium-browser - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start install: npm install script: - - grunt + - npm run test + - npm run build diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index e34ff2ecd..000000000 --- a/Gruntfile.js +++ /dev/null @@ -1,164 +0,0 @@ -/*global module:false*/ -module.exports = function (grunt) { - var path = require('path'); - - // Project configuration. - grunt.initConfig({ - // Metadata. - pkg: grunt.file.readJSON('package.json'), - banner: '/*! <%= pkg.title || pkg.name %> <%= pkg.version %> (<%= new Date().toGMTString() %>)\n' + - '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + - '* @license <%= pkg.license %> */', - // Task configuration. - clean : { - build: [ 'dist' ] - }, - concat: { - options: { - stripBanners: true - }, - dist: { - src: [ - 'src/wavesurfer.js', - 'src/util.js', - 'src/webaudio.js', - 'src/mediaelement.js', - 'src/drawer.js', - 'src/drawer.*.js', - 'src/html-init.js' - ], - dest: 'dist/wavesurfer.js' - } - }, - connect: { - options: { - base: '.', - port: 9000, - // Change this to '0.0.0.0' to access the server from outside. - hostname: 'localhost', - keepalive: true - } - }, - /* The build has three steps: - - concatenation (wavesurfer.js) - - UMD wrapping (wavesurfer.js) - - uglification (wavesurfer.min.js) */ - umd: { - main: { - options: { - src: '<%= concat.dist.dest %>', - dest: 'dist/wavesurfer.js', - amdModuleId: 'wavesurfer', - objectToExport: 'WaveSurfer', - globalAlias: 'WaveSurfer' - } - }, - plugins: { - src: 'plugin/*.js', - dest: 'dist', - deps: { - 'default': [ 'WaveSurfer' ], - amd: [ 'wavesurfer' ], - cjs: [ 'wavesurfer.js' ], - global: [ 'WaveSurfer' ] - } - } - }, - uglify: { - options: { - banner: '<%= banner %>' - }, - dist: { - options: { - sourceMap: 'dist/wavesurfer.min.js.map', - sourceMapRoot: '/' - }, - src: '<%= umd.main.options.dest %>', - dest: 'dist/wavesurfer.min.js' - }, - plugins: { - files: [{ - expand: true, - cwd: 'dist', - src: 'plugin/*.js', - dest: 'dist/', - rename: function (dest, src) { - if (src.indexOf('.min.js') == -1) { - return dest + src.replace('.js', '.min.js'); - } - return dest + src; - } - }] - } - }, - jshint: { - options: { - curly: true, - eqeqeq: false, - eqnull: true, - quotmark: 'single', - browser: true, - // Missing "use strict" statement. - strict: false, - globals: { - WaveSurfer: true, - Promise: true - } - }, - ignore_warning: { - options: { - '-W004': true, - // Expected an assignment or function call and instead saw an expression - '-W030': true, - // {a} used out of scope - '-W038': true, - // Use '!==' to compare with '' - '-W041': true, - '-W056': true, - // Missing '()' invoking a constructor. - '-W058': true, - '-W079': true, - // Use the function form of 'use strict' - '-W097': true - }, - src: [ '<%= concat.dist.src %>', 'plugin/*.js', 'spec/*.spec.js' ] - } - }, - jscs: { - src: [ '<%= concat.dist.src %>', 'plugin/*.js', 'spec/*.spec.js' ], - options: { - config: '.jscsrc', - fix: false, // Autofix code style violations when possible. - requireCurlyBraces: [ 'if' ] - } - }, - karma: { - e2e: { - configFile: 'karma.conf.js' - } - } - }); - - // ========================================================================== - // TASKS - // ========================================================================== - - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-karma'); - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-umd'); - grunt.loadNpmTasks('grunt-jscs'); - grunt.loadNpmTasks('grunt-contrib-clean'); - - // Default task. - grunt.registerTask('default', [ - 'clean', 'jshint', 'jscs', 'concat', 'umd', 'uglify', 'test' - ]); - - // Dev - grunt.registerTask('dev', [ 'clean', 'concat', 'uglify', 'jscs', 'connect' ]); - grunt.registerTask('test', [ 'karma:e2e' ]); -}; diff --git a/example/angular-material/index.html b/example/angular-material/index.html index f288f6086..bd7962463 100644 --- a/example/angular-material/index.html +++ b/example/angular-material/index.html @@ -15,7 +15,7 @@ - + diff --git a/example/angular/index.html b/example/angular/index.html index a93a81349..045acc781 100644 --- a/example/angular/index.html +++ b/example/angular/index.html @@ -17,7 +17,7 @@ - + diff --git a/example/annotation/app.js b/example/annotation/app.js index 01b1c3353..a16f65e09 100644 --- a/example/annotation/app.js +++ b/example/annotation/app.js @@ -1,24 +1,36 @@ /** * Create a WaveSurfer instance. */ -var wavesurfer = Object.create(WaveSurfer); +var wavesurfer; /** * Init & load. */ document.addEventListener('DOMContentLoaded', function () { // Init wavesurfer - wavesurfer.init({ + wavesurfer = window.WaveSurfer.create({ container: '#waveform', height: 100, pixelRatio: 1, scrollParent: true, normalize: true, minimap: true, - backend: 'MediaElement' + backend: 'MediaElement', + plugins: [ + window.WaveSurfer.regions(), + window.WaveSurfer.minimap({ + height: 30, + waveColor: '#ddd', + progressColor: '#999', + cursorColor: '#999' + }), + window.WaveSurfer.timeline({ + container: "#wave-timeline" + }) + ] }); - wavesurfer.util.ajax({ + window.WaveSurfer.util.ajax({ responseType: 'json', url: 'rashomon.json' }).on('success', function (data) { @@ -29,11 +41,12 @@ document.addEventListener('DOMContentLoaded', function () { }); /* Regions */ - wavesurfer.enableDragSelection({ - color: randomColor(0.1) - }); wavesurfer.on('ready', function () { + wavesurfer.enableDragSelection({ + color: randomColor(0.1) + }); + if (localStorage.regions) { loadRegions(JSON.parse(localStorage.regions)); } else { @@ -70,25 +83,6 @@ document.addEventListener('DOMContentLoaded', function () { }); - /* Minimap plugin */ - wavesurfer.initMinimap({ - height: 30, - waveColor: '#ddd', - progressColor: '#999', - cursorColor: '#999' - }); - - - /* Timeline plugin */ - wavesurfer.on('ready', function () { - var timeline = Object.create(WaveSurfer.Timeline); - timeline.init({ - wavesurfer: wavesurfer, - container: "#wave-timeline" - }); - }); - - /* Toggle play/pause buttons. */ var playButton = document.querySelector('#play'); var pauseButton = document.querySelector('#pause'); diff --git a/example/annotation/index.html b/example/annotation/index.html index 8eb95634a..fdc8c9095 100644 --- a/example/annotation/index.html +++ b/example/annotation/index.html @@ -15,12 +15,12 @@ - + - - - + + + diff --git a/example/audio-element/index.html b/example/audio-element/index.html index 9da244b47..7f92c66df 100644 --- a/example/audio-element/index.html +++ b/example/audio-element/index.html @@ -14,9 +14,9 @@ - + - + @@ -62,9 +62,7 @@

How to Enable the Fallback

-

var wavesurfer = Object.create(WaveSurfer);
-
-wavesurfer.init({
+
var wavesurfer = WaveSurfer.create({
     container: document.querySelector('#wave'),
     backend: 'MediaElement'
 });
diff --git a/example/cursor/index.html b/example/cursor/index.html
new file mode 100644
index 000000000..d8681e8f6
--- /dev/null
+++ b/example/cursor/index.html
@@ -0,0 +1,106 @@
+
+
+    
+        
+        wavesurfer.js | Cursor Example
+
+        
+
+        
+        
+
+        
+        
+        
+
+        
+        
+
+        
+
+        
+        
+    
+
+    
+        
+
+ + +

Cursor Plugin Example

+
+ +
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+

Cursor plugin

+
+

Shows a cursor on the waveform.

+ +

+

var wavesurfer = WaveSurfer.create({
+    container: document.querySelector('#waveform'),
+    plugins: [
+        WaveSurfer.cursor()
+    ]
+});
+
+

+
+ + +
+ + + + + + diff --git a/example/cursor/main.js b/example/cursor/main.js new file mode 100644 index 000000000..1f01ad315 --- /dev/null +++ b/example/cursor/main.js @@ -0,0 +1,25 @@ +'use strict'; + +// Create an instance +var wavesurfer = {}; + +// Init & load audio file +document.addEventListener('DOMContentLoaded', function () { + + wavesurfer = window.WaveSurfer.create({ + container: document.querySelector('#waveform'), + plugins: [ + window.WaveSurfer.cursor() + ] + }); + + + // Load audio from URL + wavesurfer.load('../media/demo.wav'); + + + // Play button + var button = document.querySelector('[data-action="play"]'); + + button.addEventListener('click', wavesurfer.playPause.bind(wavesurfer)); +}); diff --git a/example/elan/app.js b/example/elan/app.js index 200faac3f..be4ce2817 100644 --- a/example/elan/app.js +++ b/example/elan/app.js @@ -12,7 +12,18 @@ document.addEventListener('DOMContentLoaded', function () { loaderColor : 'purple', cursorColor : 'navy', selectionColor: '#d0e9c6', - loopSelection : false + loopSelection : false, + plugins: [ + window.WaveSurfer.elan({ + url: 'transcripts/001z.xml', + container: '#annotations', + tiers: { + Text: true, + Comments: true + } + }), + window.WaveSurfer.regions() + ] }; if (location.search.match('scroll')) { @@ -47,28 +58,16 @@ document.addEventListener('DOMContentLoaded', function () { // Init wavesurfer wavesurfer.init(options); - // Init ELAN plugin - var elan = Object.create(WaveSurfer.ELAN); - - elan.init({ - url: 'transcripts/001z.xml', - container: '#annotations', - tiers: { - Text: true, - Comments: true - } - }); - - elan.on('ready', function (data) { + wavesurfer.elan.on('ready', function (data) { wavesurfer.load('transcripts/' + data.media.url); }); - elan.on('select', function (start, end) { + wavesurfer.elan.on('select', function (start, end) { wavesurfer.backend.play(start, end); }); - elan.on('ready', function () { - var classList = elan.container.querySelector('table').classList; + wavesurfer.elan.on('ready', function () { + var classList = wavesurfer.elan.container.querySelector('table').classList; [ 'table', 'table-striped', 'table-hover' ].forEach(function (cl) { classList.add(cl); }); @@ -76,7 +75,7 @@ document.addEventListener('DOMContentLoaded', function () { var prevAnnotation, prevRow, region; var onProgress = function (time) { - var annotation = elan.getRenderedAnnotation(time); + var annotation = wavesurfer.elan.getRenderedAnnotation(time); if (prevAnnotation != annotation) { prevAnnotation = annotation; @@ -86,13 +85,13 @@ document.addEventListener('DOMContentLoaded', function () { if (annotation) { // Highlight annotation table row - var row = elan.getAnnotationNode(annotation); + var row = wavesurfer.elan.getAnnotationNode(annotation); prevRow && prevRow.classList.remove('success'); prevRow = row; row.classList.add('success'); var before = row.previousSibling; if (before) { - elan.container.scrollTop = before.offsetTop; + wavesurfer.elan.container.scrollTop = before.offsetTop; } // Region diff --git a/example/elan/index.html b/example/elan/index.html index d4c38db2b..b8b724334 100644 --- a/example/elan/index.html +++ b/example/elan/index.html @@ -15,13 +15,13 @@ - + - + - + diff --git a/example/equalizer/index.html b/example/equalizer/index.html index 6781e802b..7033af936 100644 --- a/example/equalizer/index.html +++ b/example/equalizer/index.html @@ -14,7 +14,7 @@ - + diff --git a/example/equalizer/main.js b/example/equalizer/main.js index 6212c7321..3a61f0c06 100644 --- a/example/equalizer/main.js +++ b/example/equalizer/main.js @@ -77,7 +77,7 @@ document.addEventListener('DOMContentLoaded', function () { }); input.style.display = 'inline-block'; input.setAttribute('orient', 'vertical'); - wavesurfer.drawer.style(input, { + wavesurfer.util.style(input, { 'webkitAppearance': 'slider-vertical', width: '50px', height: '150px' diff --git a/example/microphone/app.js b/example/microphone/app.js index 6c5420b0c..459fef26a 100644 --- a/example/microphone/app.js +++ b/example/microphone/app.js @@ -1,39 +1,36 @@ 'use strict'; // Create an instance -var wavesurfer = Object.create(WaveSurfer); +var wavesurfer; // Init & load document.addEventListener('DOMContentLoaded', function () { - var options = { - container : '#waveform', - waveColor : 'black', - interact : false, - cursorWidth : 0 - }; var micBtn = document.querySelector('#micBtn'); // Init wavesurfer - wavesurfer.init(options); - - // Init Microphone plugin - var microphone = Object.create(WaveSurfer.Microphone); - microphone.init({ - wavesurfer: wavesurfer + wavesurfer = window.WaveSurfer.create({ + container : '#waveform', + waveColor : 'black', + interact : false, + cursorWidth : 0, + plugins: [ + window.WaveSurfer.microphone() + ] }); - microphone.on('deviceReady', function() { + + wavesurfer.microphone.on('deviceReady', function() { console.info('Device ready!'); }); - microphone.on('deviceError', function(code) { + wavesurfer.microphone.on('deviceError', function(code) { console.warn('Device error: ' + code); }); // start/stop mic on button click micBtn.onclick = function() { - if (microphone.active) { - microphone.stop(); + if (wavesurfer.microphone.active) { + wavesurfer.microphone.stop(); } else { - microphone.start(); + wavesurfer.microphone.start(); } }; }); diff --git a/example/microphone/index.html b/example/microphone/index.html index bbc832407..da6f4e94c 100644 --- a/example/microphone/index.html +++ b/example/microphone/index.html @@ -13,10 +13,10 @@ - + - + @@ -53,14 +53,13 @@

Installation

    -
  1. add the Microphone plugin script tag
  2. -
  3. create a WaveSurfer instance
  4. -
  5. create a Microphone instance
  6. +
  7. add the Microphone plugin to the plugins property of the wavesurfer options
  8. +
  9. create a new instance of wavesurfer by using the create function
  10. control the Microphone using the start, stopDevice, play, pause, stop and togglePlay methods

- Download the plugin (3.2 KB) + Download the plugin

@@ -68,45 +67,40 @@

Installation

Quick Start

-

var wavesurfer = Object.create(WaveSurfer);
-
-wavesurfer.init({
+
var wavesurfer = WaveSurfer.create({
   container     : '#waveform',
   waveColor     : 'black',
   interact      : false,
-  cursorWidth   : 0
+  cursorWidth   : 0,
+  plugins: [
+    WaveSurfer.microphone()
+  ]
 });
 
-var microphone = Object.create(WaveSurfer.Microphone);
-
-microphone.init({
-    wavesurfer: wavesurfer
-});
-
-microphone.on('deviceReady', function(stream) {
+wavesurfer.microphone.on('deviceReady', function(stream) {
     console.log('Device ready!', stream);
 });
-microphone.on('deviceError', function(code) {
+wavesurfer.microphone.on('deviceError', function(code) {
     console.warn('Device error: ' + code);
 });
 
 // start the microphone
-microphone.start();
+wavesurfer.microphone.start();
 
 // pause rendering
-//microphone.pause();
+//wavesurfer.microphone.pause();
 
 // resume rendering
-//microphone.play();
+//wavesurfer.microphone.play();
 
 // stop visualization and disconnect microphone
-//microphone.stopDevice();
+//wavesurfer.microphone.stopDevice();
 
 // same as stopDevice() but also clears the wavesurfer canvas
-//microphone.stop();
+//wavesurfer.microphone.stop();
 
 // destroy the plugin
-//microphone.destroy();
+//wavesurfer.microphone.destroy();
 

@@ -190,7 +184,7 @@

Events

Fork me on GitHub - + + diff --git a/example/panner/index.html b/example/panner/index.html index 142962a86..b8234e659 100644 --- a/example/panner/index.html +++ b/example/panner/index.html @@ -15,7 +15,7 @@ - + @@ -82,9 +82,7 @@

1. Initialize wavesurfer.js

Create a WaveSurfer instance and load an audio clip.

-

var wavesurfer = Object.create(WaveSurfer);
-
-wavesurfer.init({
+
var wavesurfer = window.WaveSurfer.create({
     container: '#demo' // this is the only required param
 });
 
diff --git a/example/playlist/index.html b/example/playlist/index.html
index a442d378f..affc5eeb6 100644
--- a/example/playlist/index.html
+++ b/example/playlist/index.html
@@ -14,7 +14,7 @@
         
 
         
-        
+        
 
         
         
diff --git a/example/plugin-system/app.js b/example/plugin-system/app.js
new file mode 100644
index 000000000..b2f4effe4
--- /dev/null
+++ b/example/plugin-system/app.js
@@ -0,0 +1,116 @@
+'use strict';
+
+var wavesurfer;
+
+// Init & load
+document.addEventListener('DOMContentLoaded', function () {
+    var pluginOptions = {
+        minimap: {
+            waveColor     : '#777',
+            progressColor : '#222',
+            height: 30
+        },
+        timeline: {
+            container: '#wave-timeline'
+        },
+        spectrogram: {
+            container: '#wave-spectrogram'
+        },
+        regions: {
+            regions: [
+                {
+                    start: 1,
+                    end: 3,
+                    color: 'hsla(400, 100%, 30%, 0.5)'
+                },
+                {
+                    start: 4,
+                    end: 5.4
+                },
+                {
+                    start: 6.22,
+                    end: 7.1
+                }
+            ]
+        },
+        elan: {
+            url: 'transcripts/001z.xml',
+            container: '#annotations',
+            tiers: {
+                Text: true,
+                Comments: true
+            }
+        }
+    };
+    var options = {
+        container     : '#waveform',
+        waveColor     : 'violet',
+        progressColor : 'purple',
+        loaderColor   : 'purple',
+        cursorColor   : 'navy',
+        plugins: [
+            window.WaveSurfer.minimap(pluginOptions.minimap),
+            window.WaveSurfer.timeline(pluginOptions.timeline),
+        ]
+    };
+
+    if (location.search.match('scroll')) {
+        options.minPxPerSec = 100;
+        options.scrollParent = true;
+    }
+
+    if (location.search.match('normalize')) {
+        options.normalize = true;
+    }
+
+    // Init wavesurfer
+    wavesurfer = window.WaveSurfer.create(options);
+
+    [].forEach.call(document.querySelectorAll('[data-activate-plugin]'), function (el) {
+        var activePlugins = wavesurfer.initialisedPluginList;
+        Object.keys(activePlugins).forEach(function(name) {
+            if (el.dataset.activatePlugin === name) {
+                el.checked = true;
+            }
+        });
+    });
+
+    [].forEach.call(document.querySelectorAll('[data-activate-plugin]'), function (el) {
+        el.addEventListener('change', function (e) {
+            var pluginName = e.currentTarget.dataset.activatePlugin;
+            var activate = e.target.checked;
+            var options = pluginOptions[pluginName] || {};
+            var plugin = window.WaveSurfer[pluginName](options);
+
+            if (activate) {
+                wavesurfer.addPlugin(plugin).initPlugin(pluginName);
+            } else {
+                wavesurfer.destroyPlugin(pluginName);
+            }
+        });
+    });
+
+    /* Progress bar */
+    (function () {
+        var progressDiv = document.querySelector('#progress-bar');
+        var progressBar = progressDiv.querySelector('.progress-bar');
+
+        var showProgress = function (percent) {
+            progressDiv.style.display = 'block';
+            progressBar.style.width = percent + '%';
+        };
+
+        var hideProgress = function () {
+            progressDiv.style.display = 'none';
+        };
+
+        wavesurfer.on('loading', showProgress);
+        wavesurfer.on('ready', hideProgress);
+        wavesurfer.on('destroy', hideProgress);
+        wavesurfer.on('error', hideProgress);
+    }());
+
+
+
+    wavesurfer.load('../../media/demo.wav');
+});
diff --git a/example/plugin-system/index.html b/example/plugin-system/index.html
new file mode 100644
index 000000000..5e835464e
--- /dev/null
+++ b/example/plugin-system/index.html
@@ -0,0 +1,188 @@
+
+
+    
+        
+        wavesurfer.js | Timeline plugin
+
+        
+
+        
+        
+
+        
+        
+
+        
+
+        
+        
+
+        
+        
+		
+		
+		
+		
+        
+        
+
+        
+        
+        
+
+        
+        
+    
+
+    
+        
+
+ + + + +

wavesurfer.js Plugin system

+
+ +
+
+
+
+
+ + +
+
+
+
+ +
+ +
+
+ +
+
+
+

Disable and enable plugins on the fly:

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+

Initialising wavesurfer with plugins

+
+

The wavesurfer plugins is an array of plugin definitions. Calling a plugin with the parameter deferInit: true will stop it from automatically initialising – you can do that at a later time with wavesurfer.initPlugin('mypluginname').

+

+

var wavesurfer = WaveSurfer.create({
+        container: '#waveform',
+    waveColor: 'violet',
+    // ... other wavesurfer options
+    plugins: [
+        WaveSurfer.timeline({
+            container: '#wave-timeline',
+            // ... other timeline options
+        })
+    ]
+});
+
+wavesurfer.load('example/media/demo.mp3');
+

+
+
+

Dynamically adding and initialising a plugin

+
+

+

var wavesurfer = WaveSurfer.create({
+    container: '#waveform',
+    waveColor: 'violet',
+    // ... other wavesurfer options
+});
+
+// adding and initialising a plugin after initialisation
+wavesurfer.addPlugin(WaveSurfer.timeline({
+    container: '#wave-timeline',
+    // ... other timeline options
+})).initPlugin('timeline')
+
+wavesurfer.load('example/media/demo.mp3');
+

+
+
+
+ + +
+ + + + + + diff --git a/example/plugin-system/transcripts/001z.mp3 b/example/plugin-system/transcripts/001z.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bd43bfae3c5b6a5680a7808bc28c9f05213e256c GIT binary patch literal 352154 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 z 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 z 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 + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 41 + + + + + 42 + + + + + 43 + + + + + 44 + + + + + 45 + + + + + 46 + + + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A+ + + + + + +{sm}+ + + + + + +A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A+ + + + + + +{sm}+ + + + + + +A + + + + + A + + + + + A + + + + + A+ + + + + + +{sm}+ + + + + + +A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A+ + + + + + +{sm}+ + + + + + +A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A+ + + + + + +{sm}+ + + + + + +A+ + + + + + +{lg} + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + A + + + + + + + Пото= == + + + + + А потом ∙∙ про зайчика сон. + + + + + ∙∙ А зайчик вот, + + + + + ∙∙∙ он был в лесу. + + + + + ∙∙∙∙ А я была у р-речки. + + + + + ∙∙ {ЧМОКАНЬЕ} ∙∙ А потом ∙∙ ког= ‖ ∙∙ вот я пошла, + + + + + ∙∙ к ‖ домой, + + + + + ∙∙ а зайчик за мной, + + + + + бежал-бежал. + + + + + ∙∙∙∙ А потом ∙∙∙ он прибежал, + + + + + ∙∙∙ ко мне опять, + + + + + ∙∙ когда я ушла уже, + + + + + ∙∙ {ЧМОКАНЬЕ} ∙∙ я вышла, + + + + + ∙∙ к себе, + + + + + во двор. + + + + + ∙∙ И онь= == + + + + + ∙∙ {ЧМОКАНЬЕ} ∙∙ А зайчик как-то ∙∙ сюда прискакал, + + + + + ∙∙ а потом он ∙∙ н-не знал, + + + + + где я. + + + + + ∙∙∙∙ А я была ∙∙ у себя дома. + + + + + ∙∙∙∙ А потом этот зайчик прискакал ко мне домой. + + + + + ∙∙∙ {ЧМОКАНЬЕ} ∙∙ Он скакал-скакал, + + + + + и прискакал. + + + + + ∙∙∙ А потом он ск= ‖ ∙∙∙ этот зайчик ∙∙ встретил й-ёжика. + + + + + ∙∙∙ У меня! + + + + + ∙∙ Который был ∙∙ у меня дома, + + + + + ∙∙∙∙ и они были — + + + + + ∙∙ {ЧМОКАНЬЕ} ∙∙∙ {СМЕХ} этот зайчик, + + + + + ∙∙ и ёжик, + + + + + — у меня, + + + + + ∙∙∙ и они прям бегали ∙∙ тут прям-м по моему полу. + + + + + ∙∙∙ И по коврику, + + + + + ∙∙ а я им сделала ∙∙ пала’= ‖ ∙∙ к= ‖ ∙∙ по= ‖ ∙∙ постельку, + + + + + ∙∙ и они спали там. + + + + + ∙∙∙ На коврике. + + + + + ∙∙∙∙ А потом ∙∙ как-то неожиданно зайчик захотел морковку кушать. + + + + + ∙∙ А морковка ∙∙ стояла ‖ ∙∙ у меня там ∙∙ лежала в тарелочке. + + + + + ∙∙ Он взял эту морковку и скуш-шал. + + + + + ∙∙∙ С капусткой. + + + + + ∙∙ С капустой тоже, + + + + + капустку ∙∙ съел, + + + + + ∙∙∙ а я потом встала, + + + + + ∙∙ и увидела: + + + + + а где морковь?, + + + + + а где капуста? + + + + + ∙∙∙∙ Всё. + + + + + + + FLST + + + + + PERIOD + + + + + COMMA + + + + + PERIOD + + + + + PERIOD + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + PERIOD + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + PERIOD + + + + + FLST + + + + + COMMA + + + + + COMMA + + + + + PERIOD + + + + + PERIOD + + + + + PERIOD + + + + + COMMA + + + + + PERIOD + + + + + PERIOD + + + + + EXCLAM + + + + + COMMA + + + + + SPLIT + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + PERIOD + + + + + COMMA + + + + + COMMA + + + + + PERIOD + + + + + PERIOD + + + + + PERIOD + + + + + PERIOD + + + + + PERIOD + + + + + PERIOD + + + + + COMMA + + + + + COMMA + + + + + COMMA + + + + + COLON + + + + + QUEST+COMMA + + + + + QUEST + + + + + PERIOD + + + + + + + В начальной паузе шумный вдох. Слово вот — скрипучим голосом. + + + + + В начальной паузе шумный вдох. + + + + + Начальный союз — скрипучим голосом. Слово как-то произносит скандированно. + + + + + Падение на \мне почти на октаву. + + + + + Первый слог слова который произносит со смехом. + + + + + Смех частично накладывается на слово этот. + + + + + Слова тут прям-м произносит с улыбкой. Первые два слова и последнее слово — скрипучим голосом. + + + + + Тихо. С улыбкой. + + + + + Тихо. + + + + + Очень тихо. + + + + + + + Пото= + + + + + А + + + + + потом + + + + + про + + + + + зайчика + + + + + сон + + + + + А + + + + + зайчик + + + + + вот + + + + + он + + + + + был + + + + + в + + + + + лесу + + + + + А + + + + + я + + + + + была + + + + + у + + + + + речки + + + + + А + + + + + потом + + + + + ког= + + + + + вот + + + + + я + + + + + пошла + + + + + к + + + + + домой + + + + + а + + + + + зайчик + + + + + за + + + + + мной + + + + + бежал-бежал + + + + + А + + + + + потом + + + + + он + + + + + прибежал + + + + + ко + + + + + мне + + + + + опять + + + + + когда + + + + + я + + + + + ушла + + + + + уже + + + + + я + + + + + вышла + + + + + к + + + + + себе + + + + + во + + + + + двор + + + + + И + + + + + онь= + + + + + А + + + + + зайчик + + + + + как-то + + + + + сюда + + + + + прискакал + + + + + а + + + + + потом + + + + + он + + + + + не + + + + + знал + + + + + где + + + + + я + + + + + А + + + + + я + + + + + была + + + + + у + + + + + себя + + + + + дома + + + + + А + + + + + потом + + + + + этот + + + + + зайчик + + + + + прискакал + + + + + ко + + + + + мне + + + + + домой + + + + + Он + + + + + скакал-скакал + + + + + и + + + + + прискакал + + + + + А + + + + + потом + + + + + он + + + + + ск= + + + + + этот + + + + + зайчик + + + + + встретил + + + + + ёжика + + + + + У + + + + + меня + + + + + Который + + + + + был + + + + + у + + + + + меня + + + + + дома + + + + + и + + + + + они + + + + + были + + + + + этот + + + + + зайчик + + + + + и + + + + + ёжик + + + + + у + + + + + меня + + + + + и + + + + + они + + + + + прям + + + + + бегали + + + + + тут + + + + + прям + + + + + по + + + + + моему + + + + + полу + + + + + И + + + + + по + + + + + коврику + + + + + а + + + + + я + + + + + им + + + + + сделала + + + + + пала’= + + + + + к= + + + + + по= + + + + + постельку + + + + + и + + + + + они + + + + + спали + + + + + там + + + + + На + + + + + коврике + + + + + А + + + + + потом + + + + + как-то + + + + + неожиданно + + + + + зайчик + + + + + захотел + + + + + морковку + + + + + кушать + + + + + А + + + + + морковка + + + + + стояла + + + + + у + + + + + меня + + + + + там + + + + + лежала + + + + + в + + + + + тарелочке + + + + + Он + + + + + взял + + + + + эту + + + + + морковку + + + + + и + + + + + скушал + + + + + С + + + + + капусткой + + + + + С + + + + + капустой + + + + + тоже + + + + + капустку + + + + + съел + + + + + а + + + + + я + + + + + потом + + + + + встала + + + + + и + + + + + увидела + + + + + а + + + + + где + + + + + морковь + + + + + а + + + + + где + + + + + капуста + + + + + Всё + + + + + + + R + + + + + F + + + + + R + + + + + F + + + + + R + + + + + F + + + + + R + + + + + R + + + + + F + + + + + R + + + + + F + + + + + R + + + + + R + + + + + R + + + + + F + + + + + F + + + + + R-F + + + + + F + + + + + F + + + + + R + + + + + R + + + + + R + + + + + R + + + + + F + + + + + R + + + + + R + + + + + F + + + + + R + + + + + R + + + + + F + + + + + R + + + + + R + + + + + R + + + + + R-F + + + + + F + + + + + R + + + + + R + + + + + R + + + + + R-P + + + + + F + + + + + R + + + + + R + + + + + F + + + + + P + + + + + R + + + + + R + + + + + F + + + + + F + + + + + R + + + + + R + + + + + F + + + + + R + + + + + R + + + + + R + + + + + R + + + + + F + + + + + R + + + + + F + + + + + F + + + + + F + + + + + R + + + + + R-F + + + + + R + + + + + F + + + + + R-F + + + + + F + + + + + R-F + + + + + F + + + + + P + + + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + Main + + + + + + + Len + + + + + Len + + + + + Len + + + + + Len + + + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + Red + + + + + + + Asp-E + + + + + Lab-E + + + + + Asp-E + + + + + Gl-E + + + + + Asp-E + + + + + + + Emph + + + + + Emph + + + + + Emph + + + + + + + YES + + + + + YES + + + + + YES + + + + + YES + + + + + YES + + + + + YES + + + + + YES + + + + + + + + +
diff --git a/example/regions/app.js b/example/regions/app.js index 4d9ffa838..ac9670407 100644 --- a/example/regions/app.js +++ b/example/regions/app.js @@ -1,38 +1,42 @@ 'use strict'; // Create an instance -var wavesurfer = Object.create(WaveSurfer); - -wavesurfer.on('ready', function () { - wavesurfer.addRegion({ - start: 10, - end: 15, - color: 'hsla(400, 100%, 30%, 0.1)' - }); - - wavesurfer.addRegion({ - start: 5, - end: 7, - color: 'hsla(200, 50%, 70%, 0.1)' - }); -}); +var wavesurfer; // Init & load audio file document.addEventListener('DOMContentLoaded', function () { // Init - wavesurfer.init({ + wavesurfer = window.WaveSurfer.create({ container: document.querySelector('#waveform'), waveColor: '#A8DBA8', progressColor: '#3B8686', - backend: 'MediaElement' + backend: 'MediaElement', + plugins: [ + window.WaveSurfer.regions({ + regions: [ + { + start: 1, + end: 3, + color: 'hsla(400, 100%, 30%, 0.5)' + }, { + start: 5, + end: 7, + color: 'hsla(200, 50%, 70%, 0.4)' + } + ], + dragSelection: { + slop: 5 + } + }) + ] }); // Load audio from URL wavesurfer.load('../media/demo.wav'); - document.querySelector( - '[data-action="play"]' - ).addEventListener('click', wavesurfer.playPause.bind(wavesurfer)); + // this is already being done in /examples/trivia.js + // document.querySelector( + // '[data-action="play"]' + // ).addEventListener('click', wavesurfer.playPause.bind(wavesurfer)); - wavesurfer.enableDragSelection({ slop: 5 }); }); diff --git a/example/regions/index.html b/example/regions/index.html index 8f57feb50..17926f37b 100644 --- a/example/regions/index.html +++ b/example/regions/index.html @@ -11,16 +11,15 @@ - - + - - - + + + @@ -53,6 +52,38 @@

wavesurfer.js Regions

+
+

+

var wavesurfer = window.WaveSurfer.create({
+    container: document.querySelector('#waveform'),
+    waveColor: '#A8DBA8',
+    progressColor: '#3B8686',
+    backend: 'MediaElement',
+    plugins: [
+        window.WaveSurfer.regions({
+            regions: [
+                {
+                    start: 1,
+                    end: 3,
+                    color: 'hsla(400, 100%, 30%, 0.5)'
+                }, {
+                    start: 5,
+                    end: 7,
+                    color: 'hsla(200, 50%, 70%, 0.4)'
+                }
+            ],
+            dragSelection: {
+                slop: 5
+            }
+        })
+    ]
+});
+
+

+ +
+ +
@@ -84,19 +74,13 @@

Installation

Quick Start

-

var wavesurfer = Object.create(WaveSurfer);
-
-wavesurfer.init({
+
var wavesurfer = window.WaveSurfer.create({
   // your options here
-});
-
-wavesurfer.on('ready', function () {
-    var timeline = Object.create(WaveSurfer.Timeline);
-
-    timeline.init({
-        wavesurfer: wavesurfer,
+  plugins: [
+    window.WaveSurfer.timeline({
         container: "#wave-timeline"
-    });
+    })
+  ]
 });
 
 wavesurfer.load('example/media/demo.mp3');
@@ -107,7 +91,6 @@

Quick Start

Options

    -
  • wavesurfer - required - a WaveSurfer instance
  • container - required - the element in which to place the timeline, or a CSS selector to find it
  • height - the height (in pixels) of the timeline. The default is 20.
  • notchPercentHeight - the height (in percent) of the minor notch lines in the timeline. The default is 90.
  • diff --git a/example/video-element/index.html b/example/video-element/index.html index b03fa9c9c..e96ad2196 100644 --- a/example/video-element/index.html +++ b/example/video-element/index.html @@ -14,9 +14,9 @@ - + - + @@ -64,20 +64,17 @@

    How to Enable the Fallback

    -

    var wavesurfer = Object.create(WaveSurfer);
    -
    -wavesurfer.init({
    -    container: document.querySelector('#waveform'),
    -    waveColor: '#A8DBA8',
    -    progressColor: '#3B8686',
    -    backend: 'MediaElement'
    +                
    var wavesurfer = WaveSurfer.create({
    +  container: document.querySelector('#waveform'),
    +  waveColor: '#A8DBA8',
    +  progressColor: '#3B8686',
    +  backend: 'MediaElement'
     });
     
     // Load audio from existing media element
     var mediaElt = document.querySelector('video');
    -wavesurfer.load(mediaElt);
     
    -                
    +wavesurfer.load(mediaElt);

    Pre-rendered Peaks

    diff --git a/example/video-element/main.js b/example/video-element/main.js index 6b4152c2a..d58ad8f08 100644 --- a/example/video-element/main.js +++ b/example/video-element/main.js @@ -1,12 +1,12 @@ 'use strict'; // Create an instance -var wavesurfer = Object.create(WaveSurfer); +var wavesurfer; // Init & load audio file document.addEventListener('DOMContentLoaded', function () { // Init - wavesurfer.init({ + wavesurfer = window.WaveSurfer.create({ container: document.querySelector('#waveform'), waveColor: '#A8DBA8', progressColor: '#3B8686', diff --git a/example/zoom/index.html b/example/zoom/index.html index 3cef8ff07..d9e573da8 100644 --- a/example/zoom/index.html +++ b/example/zoom/index.html @@ -14,9 +14,7 @@ - - - + @@ -70,9 +68,7 @@

    How to Zoom


    -

    var wavesurfer = Object.create(WaveSurfer);
    -
    -wavesurfer.init({
    +
    var wavesurfer = WaveSurfer.create({
         container: document.querySelector('#wave'),
         backend: 'MediaElement'
     });
    diff --git a/karma.conf.js b/karma.conf.js
    index 58ebed216..4ef09ac1d 100644
    --- a/karma.conf.js
    +++ b/karma.conf.js
    @@ -10,14 +10,6 @@ module.exports = function (config) {
             singleRun: true,
             autoWatch: false,
             files: [
    -            'dist/wavesurfer.min.js',
    -
    -            {
    -                pattern: 'dist/wavesurfer.min.js.map',
    -                included: false,
    -                watched: false,
    -                served: true
    -            },
                 {
                     pattern: 'spec/support/demo.wav',
                     included: false,
    @@ -26,9 +18,20 @@ module.exports = function (config) {
                 },
     
                 // specs
    -            'spec/**/*.js'
    +            'spec/plugin-api.spec.js',
    +            'spec/util.spec.js',
    +            'spec/wavesurfer.spec.js'
             ],
    +        preprocessors: {
    +            'spec/plugin-api.spec.js': ['webpack'],
    +            'spec/util.spec.js': ['webpack'],
    +            'spec/wavesurfer.spec.js': ['webpack']
    +        },
    +        webpackMiddleware: {
    +            stats: 'errors-only'
    +        },
             plugins: [
    +            'karma-webpack',
                 'karma-jasmine',
                 'karma-jasmine-matchers',
                 'karma-chrome-launcher'
    diff --git a/package.json b/package.json
    index 8564ef6c0..d1d902cc7 100644
    --- a/package.json
    +++ b/package.json
    @@ -7,8 +7,11 @@
         "example": "example"
       },
       "scripts": {
    -    "start": "grunt; ruby -run -e httpd . -p 8080",
    -    "test": "grunt test"
    +    "start": "webpack --env.plugins && webpack-dev-server",
    +    "build": "npm run build:normal & npm run build:minified",
    +    "build:normal": "webpack & webpack --env.plugins",
    +    "build:minified": "webpack --env.minify & webpack --env.plugins --env.minify",
    +    "test": "BABEL_ENV=test karma start karma.conf.js"
       },
       "repository": {
         "type": "git",
    @@ -20,20 +23,24 @@
         "url": "https://github.com/katspaugh/wavesurfer.js/issues"
       },
       "devDependencies": {
    -    "grunt": "^1.0.0",
    -    "grunt-contrib-clean": "^1.0.0",
    -    "grunt-contrib-concat": ">=0.4.0",
    -    "grunt-contrib-connect": "^0.11.2",
    -    "grunt-contrib-jshint": ">=0.10.0",
    -    "grunt-contrib-uglify": ">=0.5.0",
    -    "grunt-jscs": ">=2.7.0",
    -    "grunt-karma": "2.0.0",
    -    "grunt-template-jasmine-istanbul": ">=0.3.3",
    -    "grunt-umd": ">=2.3.5",
    -    "karma": "1.3.0",
    +    "babel-core": "^6.18.2",
    +    "babel-loader": "^6.2.7",
    +    "babel-plugin-add-module-exports": "^0.2.1",
    +    "babel-plugin-istanbul": "^2.0.3",
    +    "babel-preset-es2015": "^6.18.0",
    +    "babel-preset-es2015-native-modules": "^6.9.4",
    +    "babel-register": "^6.18.0",
    +    "eslint": "^3.9.1",
    +    "eslint-loader": "^1.6.1",
    +    "jasmine-core": "^2.5.2",
    +    "karma": "^1.3.0",
         "karma-chrome-launcher": "2.0.0",
    +    "karma-coverage": "^1.1.1",
         "karma-jasmine": "1.0.2",
    -    "karma-jasmine-matchers": "3.0.1"
    +    "karma-jasmine-matchers": "3.0.1",
    +    "karma-webpack": "^1.8.0",
    +    "webpack": "^2.1.0-beta.25",
    +    "webpack-dev-server": "^2.1.0-beta.9"
       },
       "homepage": "https://github.com/katspaugh/wavesurfer.js"
     }
    diff --git a/plugin/wavesurfer.cursor.js b/plugin/wavesurfer.cursor.js
    deleted file mode 100755
    index 61acf19ef..000000000
    --- a/plugin/wavesurfer.cursor.js
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -'use strict';
    -
    -WaveSurfer.Cursor = {
    -    init: function (wavesurfer) {
    -        var my = this;
    -
    -        this.wavesurfer = wavesurfer;
    -        this.drawer = this.wavesurfer.drawer;
    -        this.wrapper = this.drawer.wrapper;
    -
    -        this.wrapper.addEventListener('mousemove', function (e) {
    -            my.updateCursorPosition(my.drawer.handleEvent(e));
    -        });
    -
    -        this.wrapper.addEventListener('mouseenter', function (e) {
    -            my.showCursor();
    -        });
    -
    -        this.wrapper.addEventListener('mouseleave', function (e) {
    -            my.hideCursor();
    -        });
    -
    -        this.cursor = this.wrapper.appendChild(
    -            this.drawer.style(document.createElement('wave'), {
    -                position: 'absolute',
    -                zIndex: 3,
    -                left: 0,
    -                top: 0,
    -                bottom: 0,
    -                width: '0',
    -                display: 'block',
    -                borderRightStyle: 'solid',
    -                borderRightWidth: 1 + 'px',
    -                borderRightColor: 'black',
    -                opacity: '.25',
    -                pointerEvents: 'none'
    -            })
    -        );
    -    },
    -
    -    updateCursorPosition: function(progress) {
    -        var pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
    -        this.drawer.style(this.cursor, { left: pos + 'px' });
    -    },
    -
    -    showCursor: function() {
    -        this.drawer.style(this.cursor, { display: 'block' });
    -    },
    -
    -    hideCursor: function() {
    -        this.drawer.style(this.cursor, { display: 'none' });
    -    }
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Cursor, WaveSurfer.Observer);
    -
    -WaveSurfer.enableCursor = function () {
    -    if (!this.cursor) {
    -        this.cursor = Object.create(WaveSurfer.Cursor);
    -        this.cursor.init(this);
    -    }
    -};
    \ No newline at end of file
    diff --git a/plugin/wavesurfer.elan.js b/plugin/wavesurfer.elan.js
    deleted file mode 100644
    index 1f9153ecb..000000000
    --- a/plugin/wavesurfer.elan.js
    +++ /dev/null
    @@ -1,252 +0,0 @@
    -'use strict';
    -
    -WaveSurfer.ELAN = {
    -    Types: {
    -        ALIGNABLE_ANNOTATION: 'ALIGNABLE_ANNOTATION',
    -        REF_ANNOTATION: 'REF_ANNOTATION'
    -    },
    -
    -    init: function (params) {
    -        this.data = null;
    -        this.params = params;
    -        this.container = 'string' == typeof params.container ?
    -            document.querySelector(params.container) : params.container;
    -
    -        if (!this.container) {
    -            throw Error('No container for ELAN');
    -        }
    -
    -        this.bindClick();
    -
    -        if (params.url) {
    -            this.load(params.url);
    -        }
    -    },
    -
    -    load: function (url) {
    -        var my = this;
    -        this.loadXML(url, function (xml) {
    -            my.data = my.parseElan(xml);
    -            my.render();
    -            my.fireEvent('ready', my.data);
    -        });
    -    },
    -
    -    loadXML: function (url, callback) {
    -        var xhr = new XMLHttpRequest();
    -        xhr.open('GET', url, true);
    -        xhr.responseType = 'document';
    -        xhr.send();
    -        xhr.addEventListener('load', function (e) {
    -            callback && callback(e.target.responseXML);
    -        });
    -    },
    -
    -    parseElan: function (xml) {
    -        var _forEach = Array.prototype.forEach;
    -        var _map = Array.prototype.map;
    -
    -        var data = {
    -            media: {},
    -            timeOrder: {},
    -            tiers: [],
    -            annotations: {},
    -            alignableAnnotations: []
    -        };
    -
    -        var header = xml.querySelector('HEADER');
    -        var inMilliseconds = header.getAttribute('TIME_UNITS') == 'milliseconds';
    -        var media = header.querySelector('MEDIA_DESCRIPTOR');
    -        data.media.url = media.getAttribute('MEDIA_URL');
    -        data.media.type = media.getAttribute('MIME_TYPE');
    -
    -        var timeSlots = xml.querySelectorAll('TIME_ORDER TIME_SLOT');
    -        var timeOrder = {};
    -        _forEach.call(timeSlots, function (slot) {
    -            var value = parseFloat(slot.getAttribute('TIME_VALUE'));
    -            // If in milliseconds, convert to seconds with rounding
    -            if (inMilliseconds) {
    -                value = Math.round(value * 1e2) / 1e5;
    -            }
    -            timeOrder[slot.getAttribute('TIME_SLOT_ID')] = value;
    -        });
    -
    -        data.tiers = _map.call(xml.querySelectorAll('TIER'), function (tier) {
    -            return {
    -                id: tier.getAttribute('TIER_ID'),
    -                linguisticTypeRef: tier.getAttribute('LINGUISTIC_TYPE_REF'),
    -                defaultLocale: tier.getAttribute('DEFAULT_LOCALE'),
    -                annotations: _map.call(
    -                    tier.querySelectorAll('REF_ANNOTATION, ALIGNABLE_ANNOTATION'),
    -                    function (node) {
    -                        var annot = {
    -                            type: node.nodeName,
    -                            id: node.getAttribute('ANNOTATION_ID'),
    -                            ref: node.getAttribute('ANNOTATION_REF'),
    -                            value: node.querySelector('ANNOTATION_VALUE')
    -                                .textContent.trim()
    -                        };
    -
    -                        if (this.Types.ALIGNABLE_ANNOTATION == annot.type) {
    -                            // Add start & end to alignable annotation
    -                            annot.start = timeOrder[node.getAttribute('TIME_SLOT_REF1')];
    -                            annot.end = timeOrder[node.getAttribute('TIME_SLOT_REF2')];
    -
    -                            // Add to the list of alignable annotations
    -                            data.alignableAnnotations.push(annot);
    -                        }
    -
    -                        // Additionally, put into the flat map of all annotations
    -                        data.annotations[annot.id] = annot;
    -
    -                        return annot;
    -                    }, this
    -                )
    -            };
    -        }, this);
    -
    -        // Create JavaScript references between annotations
    -        data.tiers.forEach(function (tier) {
    -            tier.annotations.forEach(function (annot) {
    -                if (null != annot.ref) {
    -                    annot.reference = data.annotations[annot.ref];
    -                }
    -            }, this);
    -        }, this);
    -
    -        // Sort alignable annotations by start & end
    -        data.alignableAnnotations.sort(function (a, b) {
    -            var d = a.start - b.start;
    -            if (d == 0) {
    -                d = b.end - a.end;
    -            }
    -            return d;
    -        });
    -
    -        data.length = data.alignableAnnotations.length;
    -
    -        return data;
    -    },
    -
    -    render: function () {
    -        // apply tiers filter
    -        var tiers = this.data.tiers;
    -        if (this.params.tiers) {
    -            tiers = tiers.filter(function (tier) {
    -                return tier.id in this.params.tiers;
    -            }, this);
    -        }
    -
    -        // denormalize references to alignable annotations
    -        var backRefs = {};
    -        var indeces = {};
    -        tiers.forEach(function (tier, index) {
    -            tier.annotations.forEach(function (annot) {
    -                if (annot.reference &&
    -                    annot.reference.type == this.Types.ALIGNABLE_ANNOTATION) {
    -                    if (!(annot.reference.id in backRefs)) {
    -                        backRefs[annot.ref] = {};
    -                    }
    -                    backRefs[annot.ref][index] = annot;
    -                    indeces[index] = true;
    -                }
    -            }, this);
    -        }, this);
    -        indeces = Object.keys(indeces).sort();
    -
    -        this.renderedAlignable = this.data.alignableAnnotations.filter(
    -            function (alignable) {
    -                return backRefs[alignable.id];
    -            }
    -        );
    -
    -        // table
    -        var table = document.createElement('table');
    -        table.className = 'wavesurfer-annotations';
    -
    -        // head
    -        var thead = document.createElement('thead');
    -        var headRow = document.createElement('tr');
    -        thead.appendChild(headRow);
    -        table.appendChild(thead);
    -        var th = document.createElement('th');
    -        th.textContent = 'Time';
    -        th.className = 'wavesurfer-time';
    -        headRow.appendChild(th);
    -        indeces.forEach(function (index) {
    -            var tier = tiers[index];
    -            var th = document.createElement('th');
    -            th.className = 'wavesurfer-tier-' + tier.id;
    -            th.textContent = tier.id;
    -            th.style.width = this.params.tiers[tier.id];
    -            headRow.appendChild(th);
    -        }, this);
    -
    -        // body
    -        var tbody = document.createElement('tbody');
    -        table.appendChild(tbody);
    -        this.renderedAlignable.forEach(function (alignable) {
    -            var row = document.createElement('tr');
    -            row.id = 'wavesurfer-alignable-' + alignable.id;
    -            tbody.appendChild(row);
    -
    -            var td = document.createElement('td');
    -            td.className = 'wavesurfer-time';
    -            td.textContent = alignable.start.toFixed(1) + '–' +
    -                alignable.end.toFixed(1);
    -            row.appendChild(td);
    -
    -            var backRef = backRefs[alignable.id];
    -            indeces.forEach(function (index) {
    -                var tier = tiers[index];
    -                var td = document.createElement('td');
    -                var annotation = backRef[index];
    -                if (annotation) {
    -                    td.id = 'wavesurfer-annotation-' + annotation.id;
    -                    td.dataset.ref = alignable.id;
    -                    td.dataset.start = alignable.start;
    -                    td.dataset.end = alignable.end;
    -                    td.textContent = annotation.value;
    -                }
    -                td.className = 'wavesurfer-tier-' + tier.id;
    -                row.appendChild(td);
    -            }, this);
    -        }, this);
    -
    -        this.container.innerHTML = '';
    -        this.container.appendChild(table);
    -    },
    -
    -    bindClick: function () {
    -        var my = this;
    -        this.container.addEventListener('click', function (e) {
    -            var ref = e.target.dataset.ref;
    -            if (null != ref) {
    -                var annot = my.data.annotations[ref];
    -                if (annot) {
    -                    my.fireEvent('select', annot.start, annot.end);
    -                }
    -            }
    -        });
    -    },
    -
    -    getRenderedAnnotation: function (time) {
    -        var result;
    -        this.renderedAlignable.some(function (annotation) {
    -            if (annotation.start <= time && annotation.end >= time) {
    -                result = annotation;
    -                return true;
    -            }
    -            return false;
    -        });
    -        return result;
    -    },
    -
    -    getAnnotationNode: function (annotation) {
    -        return document.getElementById(
    -            'wavesurfer-alignable-' + annotation.id
    -        );
    -    }
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.ELAN, WaveSurfer.Observer);
    diff --git a/plugin/wavesurfer.microphone.js b/plugin/wavesurfer.microphone.js
    deleted file mode 100644
    index 60f9935ae..000000000
    --- a/plugin/wavesurfer.microphone.js
    +++ /dev/null
    @@ -1,312 +0,0 @@
    -'use strict';
    -
    -WaveSurfer.Microphone = {
    -    init: function (params) {
    -        this.params = params;
    -
    -        var wavesurfer = this.wavesurfer = params.wavesurfer;
    -
    -        if (!this.wavesurfer) {
    -            throw new Error('No WaveSurfer instance provided');
    -        }
    -
    -        this.active = false;
    -        this.paused = false;
    -        this.reloadBufferFunction = this.reloadBuffer.bind(this);
    -
    -        // cross-browser getUserMedia
    -        var promisifiedOldGUM = function(constraints, successCallback, errorCallback) {
    -            // get ahold of getUserMedia, if present
    -            var getUserMedia = (navigator.getUserMedia ||
    -                navigator.webkitGetUserMedia ||
    -                navigator.mozGetUserMedia ||
    -                navigator.msGetUserMedia);
    -            // Some browsers just don't implement it - return a rejected
    -            // promise with an error to keep a consistent interface
    -            if (!getUserMedia) {
    -                return Promise.reject(
    -                    new Error('getUserMedia is not implemented in this browser')
    -                );
    -            }
    -            // otherwise, wrap the call to the old navigator.getUserMedia with
    -            // a Promise
    -            return new Promise(function(successCallback, errorCallback) {
    -                getUserMedia.call(navigator, constraints, successCallback,
    -                    errorCallback);
    -            });
    -        };
    -        // Older browsers might not implement mediaDevices at all, so we set an
    -        // empty object first
    -        if (navigator.mediaDevices === undefined) {
    -            navigator.mediaDevices = {};
    -        }
    -        // Some browsers partially implement mediaDevices. We can't just assign
    -        // an object with getUserMedia as it would overwrite existing
    -        // properties. Here, we will just add the getUserMedia property if it's
    -        // missing.
    -        if (navigator.mediaDevices.getUserMedia === undefined) {
    -            navigator.mediaDevices.getUserMedia = promisifiedOldGUM;
    -        }
    -
    -        // The constraints parameter is a MediaStreamConstaints object with two
    -        // members: video and audio, describing the media types requested. Either
    -        // or both must be specified.
    -        this.constraints = this.params.constraints || {
    -            video: false,
    -            audio: true
    -        };
    -
    -        // The buffer size in units of sample-frames.
    -        // If specified, the bufferSize must be one of the following values:
    -        // 256, 512, 1024, 2048, 4096, 8192, 16384. Defaults to 4096.
    -        this.bufferSize = this.params.bufferSize || 4096;
    -
    -        // Integer specifying the number of channels for this node's input,
    -        // defaults to 1. Values of up to 32 are supported.
    -        this.numberOfInputChannels = this.params.numberOfInputChannels || 1;
    -
    -        // Integer specifying the number of channels for this node's output,
    -        // defaults to 1. Values of up to 32 are supported.
    -        this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;
    -
    -        // wavesurfer's AudioContext where we'll route the mic signal to
    -        this.micContext = this.wavesurfer.backend.getAudioContext();
    -    },
    -
    -    /**
    -     * Allow user to select audio input device, eg. microphone, and
    -     * start the visualization.
    -     */
    -    start: function() {
    -        navigator.mediaDevices.getUserMedia(this.constraints).then(
    -            this.gotStream.bind(this)
    -        ).catch(
    -            this.deviceError.bind(this)
    -        );
    -    },
    -
    -    /**
    -     * Pause/resume visualization.
    -     */
    -    togglePlay: function() {
    -        if (!this.active) {
    -            // start it first
    -            this.start();
    -        } else {
    -            // toggle paused
    -            this.paused = !this.paused;
    -
    -            if (this.paused) {
    -                this.pause();
    -            } else {
    -                this.play();
    -            }
    -        }
    -    },
    -
    -    /**
    -     * Play visualization.
    -     */
    -    play: function() {
    -        this.paused = false;
    -
    -        this.connect();
    -    },
    -
    -    /**
    -     * Pause visualization.
    -     */
    -    pause: function() {
    -        this.paused = true;
    -
    -        // disconnect sources so they can be used elsewhere
    -        // (eg. during audio playback)
    -        this.disconnect();
    -    },
    -
    -    /**
    -     * Stop the device stream and remove any remaining waveform drawing from
    -     * the wavesurfer canvas.
    -     */
    -    stop: function() {
    -        if (this.active) {
    -            // stop visualization and device
    -            this.stopDevice();
    -
    -            // empty last frame
    -            this.wavesurfer.empty();
    -        }
    -    },
    -
    -    /**
    -     * Stop the device and the visualization.
    -     */
    -    stopDevice: function() {
    -        this.active = false;
    -
    -        // stop visualization
    -        this.disconnect();
    -
    -        // stop stream from device
    -        if (this.stream) {
    -            var result = this.detectBrowser();
    -            // MediaStream.stop is deprecated since:
    -            // - Firefox 44 (https://www.fxsitecompat.com/en-US/docs/2015/mediastream-stop-has-been-deprecated/)
    -            // - Chrome 45 (https://developers.google.com/web/updates/2015/07/mediastream-deprecations)
    -            if ((result.browser === 'chrome' && result.version >= 45) ||
    -                (result.browser === 'firefox' && result.version >= 44) ||
    -                (result.browser === 'edge')) {
    -                if (this.stream.getTracks) { // note that this should not be a call
    -                    this.stream.getTracks().forEach(function (stream) {
    -                        stream.stop();
    -                    });
    -                    return;
    -                }
    -            }
    -
    -            this.stream.stop();
    -        }
    -    },
    -
    -    /**
    -     * Connect the media sources that feed the visualization.
    -     */
    -    connect: function() {
    -        if (this.stream !== undefined) {
    -            // Create an AudioNode from the stream.
    -            this.mediaStreamSource = this.micContext.createMediaStreamSource(this.stream);
    -
    -            this.levelChecker = this.micContext.createScriptProcessor(
    -                this.bufferSize, this.numberOfInputChannels, this.numberOfOutputChannels);
    -            this.mediaStreamSource.connect(this.levelChecker);
    -
    -            this.levelChecker.connect(this.micContext.destination);
    -            this.levelChecker.onaudioprocess = this.reloadBufferFunction;
    -        }
    -    },
    -
    -    /**
    -     * Disconnect the media sources that feed the visualization.
    -     */
    -    disconnect: function() {
    -        if (this.mediaStreamSource !== undefined) {
    -            this.mediaStreamSource.disconnect();
    -        }
    -
    -        if (this.levelChecker !== undefined) {
    -            this.levelChecker.disconnect();
    -            this.levelChecker.onaudioprocess = undefined;
    -        }
    -    },
    -
    -    /**
    -     * Redraw the waveform.
    -     */
    -    reloadBuffer: function(event) {
    -        if (!this.paused) {
    -            this.wavesurfer.empty();
    -            this.wavesurfer.loadDecodedBuffer(event.inputBuffer);
    -        }
    -    },
    -
    -    /**
    -     * Audio input device is ready.
    -     *
    -     * @param {LocalMediaStream} stream: the microphone's media stream.
    -     */
    -    gotStream: function(stream) {
    -        this.stream = stream;
    -        this.active = true;
    -
    -        // start visualization
    -        this.play();
    -
    -        // notify listeners
    -        this.fireEvent('deviceReady', stream);
    -    },
    -
    -    /**
    -     * Destroy the microphone plugin.
    -     */
    -    destroy: function(event) {
    -        // make sure the buffer is not redrawn during
    -        // cleanup and demolition of this plugin.
    -        this.paused = true;
    -
    -        this.stop();
    -    },
    -
    -    /**
    -     * Device error callback.
    -     */
    -    deviceError: function(code) {
    -        // notify listeners
    -        this.fireEvent('deviceError', code);
    -    },
    -
    -    /**
    -     * Extract browser version out of the provided user agent string.
    -     * @param {!string} uastring userAgent string.
    -     * @param {!string} expr Regular expression used as match criteria.
    -     * @param {!number} pos position in the version string to be returned.
    -     * @return {!number} browser version.
    -     */
    -    extractVersion: function(uastring, expr, pos) {
    -        var match = uastring.match(expr);
    -        return match && match.length >= pos && parseInt(match[pos], 10);
    -    },
    -
    -    /**
    -     * Browser detector.
    -     * @return {object} result containing browser, version and minVersion
    -     *     properties.
    -     */
    -    detectBrowser: function() {
    -        // Returned result object.
    -        var result = {};
    -        result.browser = null;
    -        result.version = null;
    -        result.minVersion = null;
    -
    -        // Non supported browser.
    -        if (typeof window === 'undefined' || !window.navigator) {
    -            result.browser = 'Not a supported browser.';
    -            return result;
    -        }
    -
    -        // Firefox.
    -        if (navigator.mozGetUserMedia) {
    -            result.browser = 'firefox';
    -            result.version = this.extractVersion(navigator.userAgent,
    -                /Firefox\/([0-9]+)\./, 1);
    -            result.minVersion = 31;
    -            return result;
    -        }
    -
    -        // Chrome/Chromium/Webview.
    -        if (navigator.webkitGetUserMedia && window.webkitRTCPeerConnection) {
    -            result.browser = 'chrome';
    -            result.version = this.extractVersion(navigator.userAgent,
    -                /Chrom(e|ium)\/([0-9]+)\./, 2);
    -            result.minVersion = 38;
    -            return result;
    -        }
    -
    -        // Edge.
    -        if (navigator.mediaDevices &&
    -            navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) {
    -            result.browser = 'edge';
    -            result.version = this.extractVersion(navigator.userAgent,
    -                /Edge\/(\d+).(\d+)$/, 2);
    -            result.minVersion = 10547;
    -            return result;
    -        }
    -
    -        // Non supported browser default.
    -        result.browser = 'Not a supported browser.';
    -        return result;
    -    }
    -
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Microphone, WaveSurfer.Observer);
    diff --git a/plugin/wavesurfer.minimap.js b/plugin/wavesurfer.minimap.js
    deleted file mode 100644
    index 17993df83..000000000
    --- a/plugin/wavesurfer.minimap.js
    +++ /dev/null
    @@ -1,213 +0,0 @@
    -'use strict';
    -
    -/* Minimap */
    -WaveSurfer.Minimap = WaveSurfer.util.extend({}, WaveSurfer.Drawer, WaveSurfer.Drawer.Canvas, {
    -    init: function (wavesurfer, params) {
    -        this.wavesurfer = wavesurfer;
    -        this.container = this.wavesurfer.drawer.container;
    -        this.lastPos = this.wavesurfer.drawer.lastPos;
    -        this.params = wavesurfer.util.extend(
    -            {}, this.wavesurfer.drawer.params, {
    -                showRegions: false,
    -                showOverview: false,
    -                overviewBorderColor: 'green',
    -                overviewBorderSize: 2
    -            }, params, {
    -                scrollParent: false,
    -                fillParent: true
    -            }
    -        );
    -
    -        this.width = 0;
    -        this.height = this.params.height * this.params.pixelRatio;
    -
    -        this.createWrapper();
    -        this.createElements();
    -
    -        if (WaveSurfer.Regions && this.params.showRegions) {
    -            this.regions();
    -        }
    -
    -        this.bindWaveSurferEvents();
    -        this.bindMinimapEvents();
    -    },
    -    regions: function() {
    -        var my = this;
    -        this.regions = {};
    -
    -        this.wavesurfer.on('region-created', function(region) {
    -            my.regions[region.id] = region;
    -            my.renderRegions();
    -        });
    -
    -        this.wavesurfer.on('region-updated', function(region) {
    -            my.regions[region.id] = region;
    -            my.renderRegions();
    -        });
    -
    -        this.wavesurfer.on('region-removed', function(region) {
    -            delete my.regions[region.id];
    -            my.renderRegions();
    -        });
    -    },
    -    renderRegions: function() {
    -        var my = this;
    -        var regionElements = this.wrapper.querySelectorAll('region');
    -        for (var i = 0; i < regionElements.length; ++i) {
    -          this.wrapper.removeChild(regionElements[i]);
    -        }
    -
    -        Object.keys(this.regions).forEach(function(id){
    -            var region = my.regions[id];
    -            var width = (my.width * ((region.end - region.start) / my.wavesurfer.getDuration()));
    -            var left = (my.width * (region.start / my.wavesurfer.getDuration()));
    -            var regionElement = my.style(document.createElement('region'), {
    -                height: 'inherit',
    -                backgroundColor: region.color,
    -                width: width + 'px',
    -                left: left + 'px',
    -                display: 'block',
    -                position: 'absolute'
    -            });
    -            regionElement.classList.add(id);
    -            my.wrapper.appendChild(regionElement);
    -        });
    -    },
    -    createElements: function() {
    -        WaveSurfer.Drawer.Canvas.createElements.call(this);
    -
    -        if (this.params.showOverview) {
    -            this.overviewRegion =  this.style(document.createElement('overview'), {
    -                height: (this.wrapper.offsetHeight - (this.params.overviewBorderSize * 2)) + 'px',
    -                width: '0px',
    -                display: 'block',
    -                position: 'absolute',
    -                cursor: 'move',
    -                border: this.params.overviewBorderSize + 'px solid ' + this.params.overviewBorderColor,
    -                zIndex: 2,
    -                opacity: this.params.overviewOpacity
    -            });
    -
    -            this.wrapper.appendChild(this.overviewRegion);
    -        }
    -    },
    -
    -    bindWaveSurferEvents: function () {
    -        var my = this;
    -        this.wavesurfer.on('ready', this.render.bind(this));
    -        this.wavesurfer.on('audioprocess', function (currentTime) {
    -            my.progress(my.wavesurfer.backend.getPlayedPercents());
    -        });
    -        this.wavesurfer.on('seek', function(progress) {
    -            my.progress(my.wavesurfer.backend.getPlayedPercents());
    -        });
    -
    -        if (this.params.showOverview) {
    -            this.wavesurfer.on('scroll', function(event) {
    -                if (!my.draggingOverview) {
    -                    my.moveOverviewRegion(event.target.scrollLeft / my.ratio);
    -                }
    -            });
    -
    -            this.wavesurfer.drawer.wrapper.addEventListener('mouseover', function(event) {
    -                if (my.draggingOverview)  {
    -                    my.draggingOverview = false;
    -                }
    -            });
    -        }
    -
    -        var prevWidth = 0;
    -        var onResize = function () {
    -            if (prevWidth != my.wrapper.clientWidth) {
    -                prevWidth = my.wrapper.clientWidth;
    -                my.render();
    -                my.progress(my.wavesurfer.backend.getPlayedPercents());
    -            }
    -        };
    -        window.addEventListener('resize', onResize, true);
    -
    -        this.wavesurfer.on('destroy', function () {
    -            my.destroy.bind(this);
    -            window.removeEventListener('resize', onResize, true);
    -        });
    -    },
    -
    -    bindMinimapEvents: function () {
    -        var my = this;
    -        var relativePositionX = 0;
    -        var seek = true;
    -        var positionMouseDown = {
    -            clientX: 0,
    -            clientY: 0
    -        };
    -
    -        this.on('click', (function (e, position) {
    -            if (seek)  {
    -                this.progress(position);
    -                this.wavesurfer.seekAndCenter(position);
    -            } else {
    -                seek = true;
    -            }
    -        }).bind(this));
    -
    -        if (this.params.showOverview) {
    -            this.overviewRegion.addEventListener('mousedown', function(event) {
    -                my.draggingOverview = true;
    -                relativePositionX = event.layerX;
    -                positionMouseDown.clientX = event.clientX;
    -                positionMouseDown.clientY = event.clientY;
    -            });
    -
    -            this.wrapper.addEventListener('mousemove', function(event) {
    -                if(my.draggingOverview) {
    -                    my.moveOverviewRegion(event.clientX - my.container.getBoundingClientRect().left - relativePositionX);
    -                }
    -            });
    -
    -            this.wrapper.addEventListener('mouseup', function(event) {
    -                if (positionMouseDown.clientX - event.clientX === 0 && positionMouseDown.clientX - event.clientX === 0) {
    -                    seek = true;
    -                    my.draggingOverview = false;
    -                } else if (my.draggingOverview)  {
    -                    seek = false;
    -                    my.draggingOverview = false;
    -                }
    -            });
    -        }
    -    },
    -
    -    render: function () {
    -        var len = this.getWidth();
    -        var peaks = this.wavesurfer.backend.getPeaks(len);
    -        this.drawPeaks(peaks, len);
    -
    -        if (this.params.showOverview) {
    -            //get proportional width of overview region considering the respective
    -            //width of the drawers
    -            this.ratio = this.wavesurfer.drawer.width / this.width;
    -            this.waveShowedWidth = this.wavesurfer.drawer.width / this.ratio;
    -            this.waveWidth = this.wavesurfer.drawer.width;
    -            this.overviewWidth = (this.width / this.ratio);
    -            this.overviewPosition = 0;
    -            this.overviewRegion.style.width = (this.overviewWidth - (this.params.overviewBorderSize * 2)) + 'px';
    -        }
    -    },
    -    moveOverviewRegion: function(pixels) {
    -        if (pixels < 0) {
    -            this.overviewPosition = 0;
    -        } else if (pixels + this.overviewWidth < this.width) {
    -            this.overviewPosition = pixels;
    -        } else {
    -            this.overviewPosition = (this.width - this.overviewWidth);
    -        }
    -        this.overviewRegion.style.left = this.overviewPosition + 'px';
    -        this.wavesurfer.drawer.wrapper.scrollLeft = this.overviewPosition * this.ratio;
    -    }
    -});
    -
    -
    -WaveSurfer.initMinimap = function (params) {
    -    var map = Object.create(WaveSurfer.Minimap);
    -    map.init(this, params);
    -    return map;
    -};
    diff --git a/plugin/wavesurfer.spectrogram.js b/plugin/wavesurfer.spectrogram.js
    deleted file mode 100644
    index a9b6b7b60..000000000
    --- a/plugin/wavesurfer.spectrogram.js
    +++ /dev/null
    @@ -1,435 +0,0 @@
    -'use strict';
    -
    -WaveSurfer.Spectrogram = {
    -
    -    /**
    -     * List of params:
    -     *   wavesurfer: wavesurfer object
    -     *   pixelRatio: to control the size of the spectrogram in relation with its canvas. 1=Draw on the whole canvas. 2 = draw on a quarter (1/2 the lenght and 1/2 the width)
    -     *   fftSamples: number of samples to fetch to FFT. Must be a pwer of 2. Default = 512
    -     *   windowFunc: the window function to be used. Default is 'hann'. Choose from the following:
    -     *               + 'bartlett'
    -     *               + 'bartlettHann'
    -     *               + 'blackman'
    -     *               + 'cosine'
    -     *               + 'gauss'
    -     *               + 'hamming'
    -     *               + 'hann'
    -     *               + 'lanczoz'
    -     *               + 'rectangular'
    -     *               + 'triangular'
    -     *   alpha: some window functions have this extra value (0 0) {
    -                    for (var k = 0; k < oldMatrix[0].length; k++) {
    -                        if (column[k] == null) {
    -                            column[k] = 0;
    -                        }
    -                        column[k] += (overlap / newPiece) * oldMatrix[j][k];
    -                    }
    -                }
    -            }
    -
    -            var intColumn = new Uint8Array(oldMatrix[0].length);
    -
    -            for (var k = 0; k < oldMatrix[0].length; k++) {
    -                intColumn[k] = column[k];
    -            }
    -
    -            newMatrix.push(intColumn);
    -        }
    -
    -        return newMatrix;
    -    }
    -
    -};
    -
    -/**
    - * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js
    - */
    -WaveSurfer.FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
    -    this.bufferSize = bufferSize;
    -    this.sampleRate = sampleRate;
    -    this.bandwidth  = 2 / bufferSize * sampleRate / 2;
    -
    -    this.sinTable = new Float32Array(bufferSize);
    -    this.cosTable = new Float32Array(bufferSize);
    -    this.windowValues = new Float32Array(bufferSize);
    -    this.reverseTable = new Uint32Array(bufferSize);
    -
    -    this.peakBand   = 0;
    -    this.peak       = 0;
    -
    -    switch (windowFunc) {
    -        case 'bartlett' :
    -            for (var i = 0; i> 1;
    -
    -    var i;
    -
    -    while (limit < bufferSize) {
    -        for (i = 0; i < limit; i++) {
    -            this.reverseTable[i + limit] = this.reverseTable[i] + bit;
    -        }
    -
    -        limit = limit << 1;
    -        bit = bit >> 1;
    -    }
    -
    -    for (i = 0; i < bufferSize; i++) {
    -        this.sinTable[i] = Math.sin(-Math.PI/i);
    -        this.cosTable[i] = Math.cos(-Math.PI/i);
    -    }
    -
    -
    -    this.calculateSpectrum = function(buffer) {
    -        // Locally scope variables for speed up
    -        var bufferSize = this.bufferSize,
    -            cosTable = this.cosTable,
    -            sinTable = this.sinTable,
    -            reverseTable = this.reverseTable,
    -            real = new Float32Array(bufferSize),
    -            imag = new Float32Array(bufferSize),
    -            bSi = 2 / this.bufferSize,
    -            sqrt = Math.sqrt,
    -            rval,
    -            ival,
    -            mag,
    -            spectrum = new Float32Array(bufferSize / 2);
    -
    -        var k = Math.floor(Math.log(bufferSize) / Math.LN2);
    -
    -        if (Math.pow(2, k) !== bufferSize) {
    -            throw 'Invalid buffer size, must be a power of 2.';
    -        }
    -        if (bufferSize !== buffer.length) {
    -            throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' + bufferSize + ' Buffer Size: ' + buffer.length;
    -        }
    -
    -        var halfSize = 1,
    -            phaseShiftStepReal,
    -            phaseShiftStepImag,
    -            currentPhaseShiftReal,
    -            currentPhaseShiftImag,
    -            off,
    -            tr,
    -            ti,
    -            tmpReal;
    -
    -        for (var i = 0; i < bufferSize; i++) {
    -            real[i] = buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];
    -            imag[i] = 0;
    -        }
    -
    -        while (halfSize < bufferSize) {
    -            phaseShiftStepReal = cosTable[halfSize];
    -            phaseShiftStepImag = sinTable[halfSize];
    -
    -            currentPhaseShiftReal = 1;
    -            currentPhaseShiftImag = 0;
    -
    -            for (var fftStep = 0; fftStep < halfSize; fftStep++) {
    -                var i = fftStep;
    -
    -                while (i < bufferSize) {
    -                    off = i + halfSize;
    -                    tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
    -                    ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
    -
    -                    real[off] = real[i] - tr;
    -                    imag[off] = imag[i] - ti;
    -                    real[i] += tr;
    -                    imag[i] += ti;
    -
    -                    i += halfSize << 1;
    -                }
    -
    -                tmpReal = currentPhaseShiftReal;
    -                currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
    -                currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
    -            }
    -
    -            halfSize = halfSize << 1;
    -        }
    -
    -        for (var i = 0, N = bufferSize / 2; i < N; i++) {
    -            rval = real[i];
    -            ival = imag[i];
    -            mag = bSi * sqrt(rval * rval + ival * ival);
    -
    -            if (mag > this.peak) {
    -                this.peakBand = i;
    -                this.peak = mag;
    -            }
    -            spectrum[i] = mag;
    -        }
    -        return spectrum;
    -    };
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Spectrogram, WaveSurfer.Observer, WaveSurfer.FFT);
    diff --git a/plugin/wavesurfer.timeline.js b/plugin/wavesurfer.timeline.js
    deleted file mode 100644
    index 4a55892f3..000000000
    --- a/plugin/wavesurfer.timeline.js
    +++ /dev/null
    @@ -1,281 +0,0 @@
    -'use strict';
    -
    -WaveSurfer.Timeline = {
    -    init: function (params) {
    -        this.params = params;
    -        var wavesurfer = this.wavesurfer = params.wavesurfer;
    -
    -        if (!this.wavesurfer) {
    -            throw Error('No WaveSurfer intance provided');
    -        }
    -
    -        var drawer = this.drawer = this.wavesurfer.drawer;
    -
    -        this.container = 'string' == typeof params.container ?
    -            document.querySelector(params.container) : params.container;
    -
    -        if (!this.container) {
    -            throw Error('No container for WaveSurfer timeline');
    -        }
    -
    -        this.width = drawer.width;
    -        this.pixelRatio = this.drawer.params.pixelRatio;
    -        this.maxCanvasWidth = drawer.maxCanvasWidth || this.width;
    -        this.maxCanvasElementWidth = drawer.maxCanvasElementWidth || Math.round(this.maxCanvasWidth / this.pixelRatio);
    -        this.height = this.params.height || 20;
    -        this.notchPercentHeight = this.params.notchPercentHeight || 90;
    -        this.primaryColor = this.params.primaryColor || '#000';
    -        this.secondaryColor = this.params.secondaryColor || '#c0c0c0';
    -        this.primaryFontColor = this.params.primaryFontColor || '#000';
    -        this.secondaryFontColor = this.params.secondaryFontColor || '#000';
    -        this.fontFamily = this.params.fontFamily || 'Arial';
    -        this.fontSize = this.params.fontSize || 10;
    -        this.timeInterval = this.params.timeInterval;
    -        this.primaryLabelInterval = this.params.primaryLabelInterval;
    -        this.secondaryLabelInterval = this.params.secondaryLabelInterval;
    -        this.formatTimeCallback = this.params.formatTimeCallback;
    -        this.canvases = [];
    -
    -        this.createWrapper();
    -        this.render();
    -
    -        drawer.wrapper.addEventListener('scroll', function (e) {
    -            this.updateScroll(e);
    -        }.bind(this));
    -        wavesurfer.on('redraw', this.render.bind(this));
    -        wavesurfer.on('destroy', this.destroy.bind(this));
    -    },
    -
    -    destroy: function () {
    -        this.unAll();
    -        if (this.wrapper && this.wrapper.parentNode) {
    -            this.wrapper.parentNode.removeChild(this.wrapper);
    -            this.wrapper = null;
    -        }
    -    },
    -
    -    createWrapper: function () {
    -        var prevTimeline = this.container.querySelector('timeline');
    -        if (prevTimeline) {
    -            this.container.removeChild(prevTimeline);
    -        }
    -
    -        var wsParams = this.wavesurfer.params;
    -        this.wrapper = this.container.appendChild(
    -            document.createElement('timeline')
    -        );
    -        this.drawer.style(this.wrapper, {
    -            display: 'block',
    -            position: 'relative',
    -            userSelect: 'none',
    -            webkitUserSelect: 'none',
    -            height: this.height + 'px'
    -        });
    -
    -        if (wsParams.fillParent || wsParams.scrollParent) {
    -            this.drawer.style(this.wrapper, {
    -                width: '100%',
    -                overflowX: 'hidden',
    -                overflowY: 'hidden'
    -            });
    -        }
    -
    -        var my = this;
    -        this.wrapper.addEventListener('click', function (e) {
    -            e.preventDefault();
    -            var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    -            my.fireEvent('click', (relX / my.wrapper.scrollWidth) || 0);
    -        });
    -    },
    -
    -    removeOldCanvases: function () {
    -        while (this.canvases.length > 0) {
    -            var canvas = this.canvases.pop();
    -            canvas.parentElement.removeChild(canvas);
    -        }
    -    },
    -
    -    createCanvases: function () {
    -        this.removeOldCanvases();
    -
    -        var totalWidth = Math.round(this.drawer.wrapper.scrollWidth),
    -            requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth),
    -            canvas;
    -
    -        for (var i = 0; i < requiredCanvases; i++) {
    -            canvas = this.wrapper.appendChild(document.createElement('canvas'));
    -            this.canvases.push(canvas);
    -            this.drawer.style(canvas, {
    -                position: 'absolute',
    -                zIndex: 4
    -            });
    -        }
    -    },
    -
    -    render: function () {
    -        this.createCanvases();
    -        this.updateCanvasStyle();
    -        this.drawTimeCanvases();
    -    },
    -
    -    updateCanvasStyle: function () {
    -        var requiredCanvases = this.canvases.length;
    -        for (var i = 0; i < requiredCanvases; i++) {
    -            var canvas = this.canvases[i],
    -                canvasWidth = this.maxCanvasElementWidth;
    -
    -            if (i === requiredCanvases - 1) {
    -                canvasWidth = this.drawer.wrapper.scrollWidth - (this.maxCanvasElementWidth * (requiredCanvases - 1));
    -            }
    -
    -            canvas.width = canvasWidth * this.pixelRatio;
    -            canvas.height = this.height * this.pixelRatio;
    -            canvas.style.width = canvasWidth + 'px';
    -            canvas.style.height = this.height + 'px';
    -            canvas.style.left = i * this.maxCanvasElementWidth + 'px';
    -        }
    -    },
    -
    -    drawTimeCanvases: function() {
    -        var backend = this.wavesurfer.backend,
    -            wsParams = this.wavesurfer.params,
    -            duration = backend.getDuration(),
    -            self = this;
    -
    -        if (wsParams.fillParent && !wsParams.scrollParent) {
    -            var width = this.drawer.getWidth();
    -        } else {
    -            width = this.drawer.wrapper.scrollWidth * wsParams.pixelRatio;
    -        }
    -        var pixelsPerSecond = width/duration;
    -
    -        if (duration <= 0) { return; }
    -
    -        var curPixel = 0,
    -            curSeconds = 0,
    -            totalSeconds = parseInt(duration, 10) + 1,
    -            formatTime = function(seconds) {
    -                if (typeof self.formatTimeCallback === 'function') {
    -                    return self.formatTimeCallback(seconds);
    -                }
    -
    -                if (seconds/60 > 1) {
    -                    var minutes = parseInt(seconds / 60),
    -                        seconds = parseInt(seconds % 60);
    -                    seconds = (seconds < 10) ? '0' + seconds : seconds;
    -                    return '' + minutes + ':' + seconds;
    -                } else {
    -                    return seconds;
    -                }
    -            };
    -
    -        if (pixelsPerSecond * 1 >= 25) {
    -            var timeInterval = 1;
    -            var primaryLabelInterval = 10;
    -            var secondaryLabelInterval = 5;
    -        } else if (pixelsPerSecond * 5 >= 25) {
    -            var timeInterval = 5;
    -            var primaryLabelInterval = 6;
    -            var secondaryLabelInterval = 2;
    -        } else if (pixelsPerSecond * 15 >= 25) {
    -            var timeInterval = 15;
    -            var primaryLabelInterval = 4;
    -            var secondaryLabelInterval = 2;
    -        } else {
    -            var timeInterval = 60;
    -            var primaryLabelInterval = 4;
    -            var secondaryLabelInterval = 2;
    -        }
    -
    -        timeInterval = this.timeInterval || timeInterval;
    -        primaryLabelInterval = this.primaryLabelInterval || primaryLabelInterval;
    -        secondaryLabelInterval = this.secondaryLabelInterval || secondaryLabelInterval;
    -
    -        var height1 = this.height - 4,
    -            height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4,
    -            fontSize = this.fontSize * wsParams.pixelRatio;
    -
    -        for (var i = 0; i < totalSeconds/timeInterval; i++) {
    -            if (i % primaryLabelInterval == 0) {
    -                this.setFillStyles(this.primaryColor);
    -                this.fillRect(curPixel, 0, 1, height1);
    -                this.setFonts(fontSize + 'px ' + this.fontFamily);
    -                this.setFillStyles(this.primaryFontColor);
    -                this.fillText(formatTime(curSeconds), curPixel + 5, height1);
    -            } else if (i % secondaryLabelInterval == 0) {
    -                this.setFillStyles(this.secondaryColor);
    -                this.fillRect(curPixel, 0, 1, height1);
    -                this.setFonts(fontSize + 'px ' + this.fontFamily);
    -                this.setFillStyles(this.secondaryFontColor);
    -                this.fillText(formatTime(curSeconds), curPixel + 5, height1);
    -            } else {
    -                this.setFillStyles(this.secondaryColor);
    -                this.fillRect(curPixel, 0, 1, height2);
    -            }
    -
    -            curSeconds += timeInterval;
    -            curPixel += pixelsPerSecond * timeInterval;
    -        }
    -    },
    -
    -    setFillStyles: function (fillStyle) {
    -        for (var i in this.canvases) {
    -            this.canvases[i].getContext('2d').fillStyle = fillStyle;
    -        }
    -    },
    -
    -    setFonts: function (font) {
    -        for (var i in this.canvases) {
    -            this.canvases[i].getContext('2d').font = font;
    -        }
    -    },
    -
    -    fillRect: function (x, y, width, height) {
    -        for (var i in this.canvases) {
    -            var canvas = this.canvases[i],
    -                leftOffset = i * this.maxCanvasWidth;
    -
    -            var intersection = {
    -                x1: Math.max(x, i * this.maxCanvasWidth),
    -                y1: y,
    -                x2: Math.min(x + width, i * this.maxCanvasWidth + canvas.width),
    -                y2: y + height
    -            };
    -
    -            if (intersection.x1 < intersection.x2) {
    -                canvas.getContext('2d').fillRect(
    -                    intersection.x1 - leftOffset,
    -                    intersection.y1,
    -                    intersection.x2 - intersection.x1,
    -                    intersection.y2 - intersection.y1);
    -            }
    -        }
    -    },
    -
    -    fillText: function (text, x, y) {
    -        var textWidth,
    -            xOffset = 0;
    -
    -        for (var i in this.canvases) {
    -            var context = this.canvases[i].getContext('2d'),
    -                canvasWidth = context.canvas.width;
    -
    -            if (xOffset > x + textWidth) {
    -                break;
    -            }
    -
    -            if (xOffset + canvasWidth > x) {
    -                textWidth = context.measureText(text).width;
    -                context.fillText(text, x - xOffset, y);
    -            }
    -
    -            xOffset += canvasWidth;
    -        }
    -    },
    -
    -    updateScroll: function () {
    -        this.wrapper.scrollLeft = this.drawer.wrapper.scrollLeft;
    -    }
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Timeline, WaveSurfer.Observer);
    diff --git a/spec/plugin-api.spec.js b/spec/plugin-api.spec.js
    new file mode 100644
    index 000000000..bebc8c0a9
    --- /dev/null
    +++ b/spec/plugin-api.spec.js
    @@ -0,0 +1,102 @@
    +import WaveSurfer from '../src/wavesurfer.js';
    +
    +describe('Wavesurfer plugin API:', () => {
    +    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    +
    +    let waveformDiv;
    +    let dummyPlugin;
    +    let wavesurfer;
    +
    +    // clean up after each test
    +    afterEach(done => {
    +        wavesurfer.destroy();
    +        waveformDiv.parentNode.removeChild(waveformDiv);
    +        done();
    +    });
    +
    +    // utility function to generate a mock plugin object
    +    function mockPlugin(name, deferInit = false) {
    +        return {
    +            name,
    +            deferInit,
    +            static: {
    +                [`${name}Static`]: 'static property value'
    +            },
    +            instance: {
    +                init() {},
    +                destroy() {}
    +            }
    +        }
    +    }
    +
    +    // utility function to generate wavesurfer instances for testing
    +    function __createWaveform(options = {}) {
    +        waveformDiv = document.createElement('div');
    +        document.getElementsByTagName('body')[0].appendChild(waveformDiv);
    +
    +        wavesurfer =  WaveSurfer.create(Object.assign({
    +            container: waveformDiv
    +        }, options));
    +        wavesurfer.load('/base/spec/support/demo.wav');
    +
    +        return wavesurfer;
    +    }
    +
    +    it('adds and calls the plugins init function when adding it with configuration', () => {
    +        dummyPlugin = mockPlugin('dummy');
    +        spyOn(dummyPlugin.instance, 'init');
    +        // register the plugin (= add and initialise automatically)
    +        wavesurfer = __createWaveform({
    +            plugins: [
    +            dummyPlugin
    +            ]
    +        });
    +
    +        expect(Object.getPrototypeOf(wavesurfer.dummy)).toEqual(dummyPlugin.instance);
    +        expect(wavesurfer.dummyStatic).toEqual(dummyPlugin.static.dummyStatic);
    +        expect(wavesurfer.dummy.init).toHaveBeenCalledWith(wavesurfer);
    +    });
    +
    +    it('adds a plugin but does not call plugin init function it if the plugin property deferInit is truethy', () => {
    +        dummyPlugin = mockPlugin('dummy', true);
    +        spyOn(dummyPlugin.instance, 'init');
    +        // register the plugin (= add and initialise automatically)
    +        wavesurfer = __createWaveform({
    +            plugins: [
    +                dummyPlugin
    +            ]
    +        });
    +
    +        expect(Object.getPrototypeOf(wavesurfer.dummy)).toEqual(dummyPlugin.instance);
    +        expect(wavesurfer.dummyStatic).toEqual(dummyPlugin.static.dummyStatic);
    +        expect(wavesurfer.dummy.init).not.toHaveBeenCalled();
    +    });
    +
    +    it('adds the plugin when calling addPlugin, calls the plugin init function when calling initPlugin', () => {
    +        wavesurfer = __createWaveform();
    +        dummyPlugin = mockPlugin('dummy');
    +
    +        // add the plugin dynamically
    +        wavesurfer.addPlugin(dummyPlugin);
    +        expect(Object.getPrototypeOf(wavesurfer.dummy)).toEqual(dummyPlugin.instance);
    +        expect(wavesurfer.dummyStatic).toEqual(dummyPlugin.static.dummyStatic);
    +
    +        // initialise the plugin dynamically
    +        spyOn(wavesurfer.dummy, 'init');
    +        wavesurfer.initPlugin('dummy');
    +        expect(wavesurfer.dummy.init).toHaveBeenCalledWith(wavesurfer);
    +    });
    +
    +    it('calls the plugin destroy function when calling destroyPlugin', () => {
    +        dummyPlugin = mockPlugin('dummy');
    +        spyOn(dummyPlugin.instance, 'destroy');
    +        // register the plugin (= add and initialise automatically)
    +        wavesurfer = __createWaveform({
    +            plugins: [
    +            dummyPlugin
    +            ]
    +        });
    +        wavesurfer.destroyPlugin('dummy');
    +        expect(wavesurfer.dummy.destroy).toHaveBeenCalled();
    +    });
    +});
    \ No newline at end of file
    diff --git a/spec/util.spec.js b/spec/util.spec.js
    index e018ccbde..505bf5567 100755
    --- a/spec/util.spec.js
    +++ b/spec/util.spec.js
    @@ -1,3 +1,5 @@
    +import WaveSurfer from '../src/wavesurfer.js';
    +
     describe('util', function() {
     
         it('getId returns a random string', function() {
    diff --git a/spec/wavesurfer.spec.js b/spec/wavesurfer.spec.js
    index a11c3268b..f49679ab2 100755
    --- a/spec/wavesurfer.spec.js
    +++ b/spec/wavesurfer.spec.js
    @@ -1,3 +1,5 @@
    +import WaveSurfer from '../src/wavesurfer.js';
    +
     describe('wavesurfer', function () {
         var wavesurfer;
     
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index e4c2f55a3..7a90c2f65 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -1,8 +1,7 @@
    -'use strict';
    +import drawer from './drawer';
    +import * as util from './util';
     
    -WaveSurfer.Drawer.Canvas = Object.create(WaveSurfer.Drawer);
    -
    -WaveSurfer.util.extend(WaveSurfer.Drawer.Canvas, {
    +export default util.extend({}, drawer, {
         createElements: function () {
             var waveCanvas = this.wrapper.appendChild(
                 this.style(document.createElement('canvas'), {
    @@ -98,7 +97,7 @@ WaveSurfer.util.extend(WaveSurfer.Drawer.Canvas, {
     
             var absmax = 1;
             if (this.params.normalize) {
    -            absmax = WaveSurfer.util.max(peaks);
    +            absmax = util.max(peaks);
             }
     
             var scale = length / width;
    @@ -156,8 +155,8 @@ WaveSurfer.util.extend(WaveSurfer.Drawer.Canvas, {
     
             var absmax = 1;
             if (this.params.normalize) {
    -            var max = WaveSurfer.util.max(peaks);
    -            var min = WaveSurfer.util.min(peaks);
    +            var max = util.max(peaks);
    +            var min = util.min(peaks);
                 absmax = -min > max ? -min : max;
             }
     
    diff --git a/src/drawer.js b/src/drawer.js
    index 941af412f..8df62c1df 100644
    --- a/src/drawer.js
    +++ b/src/drawer.js
    @@ -1,6 +1,6 @@
    -'use strict';
    +import * as util from './util';
     
    -WaveSurfer.Drawer = {
    +export default util.extend({}, util.observer, {
         init: function (container, params) {
             this.container = container;
             this.params = params;
    @@ -96,14 +96,8 @@ WaveSurfer.Drawer = {
                 this.drawWave(peaks);
         },
     
    -    style: function (el, styles) {
    -        Object.keys(styles).forEach(function (prop) {
    -            if (el.style[prop] !== styles[prop]) {
    -                el.style[prop] = styles[prop];
    -            }
    -        });
    -        return el;
    -    },
    +    // Backward compatibility
    +    style: util.style,
     
         resetScroll: function () {
             if (this.wrapper !== null) {
    @@ -210,6 +204,4 @@ WaveSurfer.Drawer = {
         clearWave: function () {},
     
         updateProgress: function (position) {}
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Drawer, WaveSurfer.Observer);
    +});
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index ad2aa5fd4..eaea70502 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -1,8 +1,8 @@
    -'use strict';
    +import drawer from './drawer';
    +import * as util from './util';
     
    -WaveSurfer.Drawer.MultiCanvas = Object.create(WaveSurfer.Drawer);
    +export default util.extend({}, drawer, {
     
    -WaveSurfer.util.extend(WaveSurfer.Drawer.MultiCanvas, {
     
         initDrawer: function (params) {
             this.maxCanvasWidth = params.maxCanvasWidth != null ? params.maxCanvasWidth : 4000;
    @@ -169,7 +169,7 @@ WaveSurfer.util.extend(WaveSurfer.Drawer.MultiCanvas, {
     
             var absmax = 1;
             if (this.params.normalize) {
    -            absmax = WaveSurfer.util.max(peaks);
    +            absmax = util.max(peaks);
             }
     
             var scale = length / width;
    @@ -211,8 +211,8 @@ WaveSurfer.util.extend(WaveSurfer.Drawer.MultiCanvas, {
     
             var absmax = 1;
             if (this.params.normalize) {
    -            var max = WaveSurfer.util.max(peaks);
    -            var min = WaveSurfer.util.min(peaks);
    +            var max = util.max(peaks);
    +            var min = util.min(peaks);
                 absmax = -min > max ? -min : max;
             }
     
    diff --git a/src/mediaelement.js b/src/mediaelement.js
    index eed78a7c6..15caf6fbc 100755
    --- a/src/mediaelement.js
    +++ b/src/mediaelement.js
    @@ -1,8 +1,7 @@
    -'use strict';
    +import webaudio from './webaudio';
    +import * as util from './util';
     
    -WaveSurfer.MediaElement = Object.create(WaveSurfer.WebAudio);
    -
    -WaveSurfer.util.extend(WaveSurfer.MediaElement, {
    +export default util.extend({}, webaudio, {
         init: function (params) {
             this.params = params;
     
    @@ -197,7 +196,7 @@ WaveSurfer.util.extend(WaveSurfer.MediaElement, {
     
         getPeaks: function (length) {
             if (this.buffer) {
    -            return WaveSurfer.WebAudio.getPeaks.call(this, length);
    +            return webaudio.getPeaks.call(this, length);
             }
             return this.peaks || [];
         },
    @@ -217,6 +216,3 @@ WaveSurfer.util.extend(WaveSurfer.MediaElement, {
             this.media = null;
         }
     });
    -
    -//For backwards compatibility
    -WaveSurfer.AudioElement = WaveSurfer.MediaElement;
    diff --git a/src/plugin/cursor.js b/src/plugin/cursor.js
    new file mode 100644
    index 000000000..d5d6f3792
    --- /dev/null
    +++ b/src/plugin/cursor.js
    @@ -0,0 +1,82 @@
    +/**
    + * cursor plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params) {
    +    return {
    +        name: 'cursor',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        static: {
    +            enableCursor() {
    +                console.warn('Deprecated enableCursor! Use wavesurfer.initPlugins("cursor") instead!');
    +                this.initPlugins('cursor');
    +            }
    +        },
    +        extends: ['observer'],
    +        instance: {
    +            init: function (wavesurfer) {
    +                var my = this;
    +
    +                this.wavesurfer = wavesurfer;
    +                this._onDrawerCreated = () => {
    +                    this.drawer = this.wavesurfer.drawer;
    +                    this.wrapper = this.drawer.wrapper;
    +
    +                    this._handleMousemove = (e) => this.updateCursorPosition(this.drawer.handleEvent(e));
    +                    this.wrapper.addEventListener('mousemove', this._handleMousemove);
    +
    +                    this._handleMouseenter = () => this.showCursor();
    +                    this.wrapper.addEventListener('mouseenter', this._handleMouseenter);
    +
    +                    this._handleMouseLeave = () => this.hideCursor();
    +                    this.wrapper.addEventListener('mouseleave', this._handleMouseLeave);
    +
    +                    this.cursor = this.wrapper.appendChild(
    +                        this.drawer.style(document.createElement('wave'), {
    +                            position: 'absolute',
    +                            zIndex: 3,
    +                            left: 0,
    +                            top: 0,
    +                            bottom: 0,
    +                            width: '0',
    +                            display: 'block',
    +                            borderRightStyle: 'solid',
    +                            borderRightWidth: 1 + 'px',
    +                            borderRightColor: 'black',
    +                            opacity: '.25',
    +                            pointerEvents: 'none'
    +                        })
    +                    );
    +                };
    +
    +                if (this.wavesurfer.drawer) {
    +                    this._onDrawerCreated();
    +                }
    +                this.wavesurfer.on('drawer-created', this._onDrawerCreated);
    +            },
    +
    +            destroy() {
    +                this.wavesurfer.un('drawer-created', this._onDrawerCreated);
    +                this.cursor.parentNode.removeChild(this.cursor);
    +                this.wrapper.removeEventListener('mousemove', this._handleMousemove);
    +                this.wrapper.removeEventListener('mouseenter', this._handleMouseenter);
    +                this.wrapper.removeEventListener('mouseleave', this._handleMouseLeave);
    +            },
    +
    +            updateCursorPosition: function(progress) {
    +                var pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
    +                this.drawer.style(this.cursor, { left: pos + 'px' });
    +            },
    +
    +            showCursor: function() {
    +                this.drawer.style(this.cursor, { display: 'block' });
    +            },
    +
    +            hideCursor: function() {
    +                this.drawer.style(this.cursor, { display: 'none' });
    +            }
    +        }
    +    };
    +}
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    new file mode 100644
    index 000000000..47a605ee0
    --- /dev/null
    +++ b/src/plugin/elan.js
    @@ -0,0 +1,266 @@
    +/**
    + * elan plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params = {}) {
    +    return {
    +        name: 'elan',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        extends: ['observer'],
    +        instance: {
    +            Types: {
    +                ALIGNABLE_ANNOTATION: 'ALIGNABLE_ANNOTATION',
    +                REF_ANNOTATION: 'REF_ANNOTATION'
    +            },
    +
    +            init: function (wavesurfer) {
    +                this.data = null;
    +                this.params = params;
    +                this.container = 'string' == typeof params.container ?
    +                document.querySelector(params.container) : params.container;
    +
    +                if (!this.container) {
    +                    throw Error('No container for ELAN');
    +                }
    +
    +                this.bindClick();
    +
    +                if (params.url) {
    +                    this.load(params.url);
    +                }
    +            },
    +
    +            destroy: function() {
    +                this.container.removeEventListener('click', this._onClick);
    +                this.container.removeChild(this.table);
    +            },
    +
    +            load: function (url) {
    +                var my = this;
    +                this.loadXML(url, function (xml) {
    +                    my.data = my.parseElan(xml);
    +                    my.render();
    +                    my.fireEvent('ready', my.data);
    +                });
    +            },
    +
    +            loadXML: function (url, callback) {
    +                var xhr = new XMLHttpRequest();
    +                xhr.open('GET', url, true);
    +                xhr.responseType = 'document';
    +                xhr.send();
    +                xhr.addEventListener('load', function (e) {
    +                    callback && callback(e.target.responseXML);
    +                });
    +            },
    +
    +            parseElan: function (xml) {
    +                var _forEach = Array.prototype.forEach;
    +                var _map = Array.prototype.map;
    +
    +                var data = {
    +                    media: {},
    +                    timeOrder: {},
    +                    tiers: [],
    +                    annotations: {},
    +                    alignableAnnotations: []
    +                };
    +
    +                var header = xml.querySelector('HEADER');
    +                var inMilliseconds = header.getAttribute('TIME_UNITS') == 'milliseconds';
    +                var media = header.querySelector('MEDIA_DESCRIPTOR');
    +                data.media.url = media.getAttribute('MEDIA_URL');
    +                data.media.type = media.getAttribute('MIME_TYPE');
    +
    +                var timeSlots = xml.querySelectorAll('TIME_ORDER TIME_SLOT');
    +                var timeOrder = {};
    +                _forEach.call(timeSlots, function (slot) {
    +                    var value = parseFloat(slot.getAttribute('TIME_VALUE'));
    +                    // If in milliseconds, convert to seconds with rounding
    +                    if (inMilliseconds) {
    +                        value = Math.round(value * 1e2) / 1e5;
    +                    }
    +                    timeOrder[slot.getAttribute('TIME_SLOT_ID')] = value;
    +                });
    +
    +                data.tiers = _map.call(xml.querySelectorAll('TIER'), function (tier) {
    +                    return {
    +                        id: tier.getAttribute('TIER_ID'),
    +                        linguisticTypeRef: tier.getAttribute('LINGUISTIC_TYPE_REF'),
    +                        defaultLocale: tier.getAttribute('DEFAULT_LOCALE'),
    +                        annotations: _map.call(
    +                            tier.querySelectorAll('REF_ANNOTATION, ALIGNABLE_ANNOTATION'),
    +                            function (node) {
    +                                var annot = {
    +                                    type: node.nodeName,
    +                                    id: node.getAttribute('ANNOTATION_ID'),
    +                                    ref: node.getAttribute('ANNOTATION_REF'),
    +                                    value: node.querySelector('ANNOTATION_VALUE')
    +                                    .textContent.trim()
    +                                };
    +
    +                                if (this.Types.ALIGNABLE_ANNOTATION == annot.type) {
    +                                    // Add start & end to alignable annotation
    +                                    annot.start = timeOrder[node.getAttribute('TIME_SLOT_REF1')];
    +                                    annot.end = timeOrder[node.getAttribute('TIME_SLOT_REF2')];
    +
    +                                    // Add to the list of alignable annotations
    +                                    data.alignableAnnotations.push(annot);
    +                                }
    +
    +                                // Additionally, put into the flat map of all annotations
    +                                data.annotations[annot.id] = annot;
    +
    +                                return annot;
    +                            }, this
    +                        )
    +                    };
    +                }, this);
    +
    +                // Create JavaScript references between annotations
    +                data.tiers.forEach(function (tier) {
    +                    tier.annotations.forEach(function (annot) {
    +                        if (null != annot.ref) {
    +                            annot.reference = data.annotations[annot.ref];
    +                        }
    +                    }, this);
    +                }, this);
    +
    +                // Sort alignable annotations by start & end
    +                data.alignableAnnotations.sort(function (a, b) {
    +                    var d = a.start - b.start;
    +                    if (d == 0) {
    +                        d = b.end - a.end;
    +                    }
    +                    return d;
    +                });
    +
    +                data.length = data.alignableAnnotations.length;
    +
    +                return data;
    +            },
    +
    +            render: function () {
    +                // apply tiers filter
    +                var tiers = this.data.tiers;
    +                if (this.params.tiers) {
    +                    tiers = tiers.filter(function (tier) {
    +                        return tier.id in this.params.tiers;
    +                    }, this);
    +                }
    +
    +                // denormalize references to alignable annotations
    +                var backRefs = {};
    +                var indeces = {};
    +                tiers.forEach(function (tier, index) {
    +                    tier.annotations.forEach(function (annot) {
    +                        if (annot.reference && annot.reference.type == this.Types.ALIGNABLE_ANNOTATION) {
    +                            if (!(annot.reference.id in backRefs)) {
    +                                backRefs[annot.ref] = {};
    +                            }
    +                            backRefs[annot.ref][index] = annot;
    +                            indeces[index] = true;
    +                        }
    +                    }, this);
    +                }, this);
    +                indeces = Object.keys(indeces).sort();
    +
    +                this.renderedAlignable = this.data.alignableAnnotations.filter(
    +                    function (alignable) {
    +                        return backRefs[alignable.id];
    +                    }
    +                );
    +
    +                // table
    +                var table = this.table = document.createElement('table');
    +                table.className = 'wavesurfer-annotations';
    +
    +                // head
    +                var thead = document.createElement('thead');
    +                var headRow = document.createElement('tr');
    +                thead.appendChild(headRow);
    +                table.appendChild(thead);
    +                var th = document.createElement('th');
    +                th.textContent = 'Time';
    +                th.className = 'wavesurfer-time';
    +                headRow.appendChild(th);
    +                indeces.forEach(function (index) {
    +                    var tier = tiers[index];
    +                    var th = document.createElement('th');
    +                    th.className = 'wavesurfer-tier-' + tier.id;
    +                    th.textContent = tier.id;
    +                    th.style.width = this.params.tiers[tier.id];
    +                    headRow.appendChild(th);
    +                }, this);
    +
    +                // body
    +                var tbody = document.createElement('tbody');
    +                table.appendChild(tbody);
    +                this.renderedAlignable.forEach(function (alignable) {
    +                    var row = document.createElement('tr');
    +                    row.id = 'wavesurfer-alignable-' + alignable.id;
    +                    tbody.appendChild(row);
    +
    +                    var td = document.createElement('td');
    +                    td.className = 'wavesurfer-time';
    +                    td.textContent = alignable.start.toFixed(1) + '–' +
    +                    alignable.end.toFixed(1);
    +                    row.appendChild(td);
    +
    +                    var backRef = backRefs[alignable.id];
    +                    indeces.forEach(function (index) {
    +                        var tier = tiers[index];
    +                        var td = document.createElement('td');
    +                        var annotation = backRef[index];
    +                        if (annotation) {
    +                            td.id = 'wavesurfer-annotation-' + annotation.id;
    +                            td.dataset.ref = alignable.id;
    +                            td.dataset.start = alignable.start;
    +                            td.dataset.end = alignable.end;
    +                            td.textContent = annotation.value;
    +                        }
    +                        td.className = 'wavesurfer-tier-' + tier.id;
    +                        row.appendChild(td);
    +                    }, this);
    +                }, this);
    +
    +                this.container.innerHTML = '';
    +                this.container.appendChild(table);
    +            },
    +
    +            bindClick: function () {
    +                var my = this;
    +                this._onClick = e => {
    +                    var ref = e.target.dataset.ref;
    +                    if (null != ref) {
    +                        var annot = my.data.annotations[ref];
    +                        if (annot) {
    +                            my.fireEvent('select', annot.start, annot.end);
    +                        }
    +                    }
    +                };
    +                this.container.addEventListener('click', this._onClick);
    +            },
    +
    +            getRenderedAnnotation: function (time) {
    +                var result;
    +                this.renderedAlignable.some(function (annotation) {
    +                    if (annotation.start <= time && annotation.end >= time) {
    +                        result = annotation;
    +                        return true;
    +                    }
    +                    return false;
    +                });
    +                return result;
    +            },
    +
    +            getAnnotationNode: function (annotation) {
    +                return document.getElementById(
    +                    'wavesurfer-alignable-' + annotation.id
    +                );
    +            }
    +        }
    +    };
    +}
    diff --git a/src/plugin/microphone.js b/src/plugin/microphone.js
    new file mode 100644
    index 000000000..7594fb1ed
    --- /dev/null
    +++ b/src/plugin/microphone.js
    @@ -0,0 +1,321 @@
    +/**
    + * microphone plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params = {}) {
    +    return {
    +        name: 'microphone',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        extends: ['observer'],
    +        instance: {
    +            init: function (wavesurfer) {
    +                this.params = params;
    +                this.wavesurfer = wavesurfer;
    +
    +                this.active = false;
    +                this.paused = false;
    +                this.reloadBufferFunction = this.reloadBuffer.bind(this);
    +
    +                // cross-browser getUserMedia
    +                var promisifiedOldGUM = function(constraints, successCallback, errorCallback) {
    +                    // get ahold of getUserMedia, if present
    +                    var getUserMedia = (navigator.getUserMedia ||
    +                        navigator.webkitGetUserMedia ||
    +                        navigator.mozGetUserMedia ||
    +                        navigator.msGetUserMedia
    +                    );
    +                    // Some browsers just don't implement it - return a rejected
    +                    // promise with an error to keep a consistent interface
    +                    if (!getUserMedia) {
    +                        return Promise.reject(
    +                            new Error('getUserMedia is not implemented in this browser')
    +                        );
    +                    }
    +                    // otherwise, wrap the call to the old navigator.getUserMedia with
    +                    // a Promise
    +                    return new Promise(function(successCallback, errorCallback) {
    +                        getUserMedia.call(navigator, constraints, successCallback, errorCallback);
    +                    });
    +                };
    +                // Older browsers might not implement mediaDevices at all, so we set an
    +                // empty object first
    +                if (navigator.mediaDevices === undefined) {
    +                    navigator.mediaDevices = {};
    +                }
    +                // Some browsers partially implement mediaDevices. We can't just assign
    +                // an object with getUserMedia as it would overwrite existing
    +                // properties. Here, we will just add the getUserMedia property if it's
    +                // missing.
    +                if (navigator.mediaDevices.getUserMedia === undefined) {
    +                    navigator.mediaDevices.getUserMedia = promisifiedOldGUM;
    +                }
    +
    +                // The constraints parameter is a MediaStreamConstaints object with two
    +                // members: video and audio, describing the media types requested. Either
    +                // or both must be specified.
    +                this.constraints = this.params.constraints || {
    +                    video: false,
    +                    audio: true
    +                };
    +
    +                // The buffer size in units of sample-frames.
    +                // If specified, the bufferSize must be one of the following values:
    +                // 256, 512, 1024, 2048, 4096, 8192, 16384. Defaults to 4096.
    +                this.bufferSize = this.params.bufferSize || 4096;
    +
    +                // Integer specifying the number of channels for this node's input,
    +                // defaults to 1. Values of up to 32 are supported.
    +                this.numberOfInputChannels = this.params.numberOfInputChannels || 1;
    +
    +                // Integer specifying the number of channels for this node's output,
    +                // defaults to 1. Values of up to 32 are supported.
    +                this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;
    +
    +                this._onBackendCreated = () => {
    +                    // wavesurfer's AudioContext where we'll route the mic signal to
    +                    this.micContext = this.wavesurfer.backend.getAudioContext();
    +                };
    +                this.wavesurfer.on('backend-created', this._onBackendCreated);
    +                if (this.wavesurfer.backend) {
    +                    this._onBackendCreated();
    +                }
    +            },
    +
    +            /**
    +             * Destroy the microphone plugin.
    +             */
    +            destroy: function() {
    +                // make sure the buffer is not redrawn during
    +                // cleanup and demolition of this plugin.
    +                this.paused = true;
    +
    +                this.wavesurfer.un('backend-created', this._onBackendCreated);
    +                this.stop();
    +            },
    +
    +            /**
    +            * Allow user to select audio input device, eg. microphone, and
    +            * start the visualization.
    +            */
    +            start: function() {
    +                navigator.mediaDevices.getUserMedia(this.constraints).then(
    +                    this.gotStream.bind(this)
    +                ).catch(
    +                    this.deviceError.bind(this)
    +                );
    +            },
    +
    +            /**
    +            * Pause/resume visualization.
    +            */
    +            togglePlay: function() {
    +                if (!this.active) {
    +                    // start it first
    +                    this.start();
    +                } else {
    +                    // toggle paused
    +                    this.paused = !this.paused;
    +
    +                    if (this.paused) {
    +                        this.pause();
    +                    } else {
    +                        this.play();
    +                    }
    +                }
    +            },
    +
    +            /**
    +            * Play visualization.
    +            */
    +            play: function() {
    +                this.paused = false;
    +
    +                this.connect();
    +            },
    +
    +            /**
    +            * Pause visualization.
    +            */
    +            pause: function() {
    +                this.paused = true;
    +
    +                // disconnect sources so they can be used elsewhere
    +                // (eg. during audio playback)
    +                this.disconnect();
    +            },
    +
    +            /**
    +            * Stop the device stream and remove any remaining waveform drawing from
    +            * the wavesurfer canvas.
    +            */
    +            stop: function() {
    +                if (this.active) {
    +                    // stop visualization and device
    +                    this.stopDevice();
    +
    +                    // empty last frame
    +                    this.wavesurfer.empty();
    +                }
    +            },
    +
    +            /**
    +            * Stop the device and the visualization.
    +            */
    +            stopDevice: function() {
    +                this.active = false;
    +
    +                // stop visualization
    +                this.disconnect();
    +
    +                // stop stream from device
    +                if (this.stream) {
    +                    var result = this.detectBrowser();
    +                    // MediaStream.stop is deprecated since:
    +                    // - Firefox 44 (https://www.fxsitecompat.com/en-US/docs/2015/mediastream-stop-has-been-deprecated/)
    +                    // - Chrome 45 (https://developers.google.com/web/updates/2015/07/mediastream-deprecations)
    +                    if ((result.browser === 'chrome' && result.version >= 45) ||
    +                    (result.browser === 'firefox' && result.version >= 44) ||
    +                    (result.browser === 'edge')) {
    +                        if (this.stream.getTracks) { // note that this should not be a call
    +                            this.stream.getTracks().forEach(function (stream) {
    +                                stream.stop();
    +                            });
    +                            return;
    +                        }
    +                    }
    +
    +                    this.stream.stop();
    +                }
    +            },
    +
    +            /**
    +            * Connect the media sources that feed the visualization.
    +            */
    +            connect: function() {
    +                if (this.stream !== undefined) {
    +                    // Create an AudioNode from the stream.
    +                    this.mediaStreamSource = this.micContext.createMediaStreamSource(this.stream);
    +
    +                    this.levelChecker = this.micContext.createScriptProcessor(
    +                        this.bufferSize,
    +                        this.numberOfInputChannels,
    +                        this.numberOfOutputChannels
    +                    );
    +                    this.mediaStreamSource.connect(this.levelChecker);
    +
    +                    this.levelChecker.connect(this.micContext.destination);
    +                    this.levelChecker.onaudioprocess = this.reloadBufferFunction;
    +                }
    +            },
    +
    +            /**
    +            * Disconnect the media sources that feed the visualization.
    +            */
    +            disconnect: function() {
    +                if (this.mediaStreamSource !== undefined) {
    +                    this.mediaStreamSource.disconnect();
    +                }
    +
    +                if (this.levelChecker !== undefined) {
    +                    this.levelChecker.disconnect();
    +                    this.levelChecker.onaudioprocess = undefined;
    +                }
    +            },
    +
    +            /**
    +            * Redraw the waveform.
    +            */
    +            reloadBuffer: function(event) {
    +                if (!this.paused) {
    +                    this.wavesurfer.empty();
    +                    this.wavesurfer.loadDecodedBuffer(event.inputBuffer);
    +                }
    +            },
    +
    +            /**
    +            * Audio input device is ready.
    +            *
    +            * @param {LocalMediaStream} stream: the microphone's media stream.
    +            */
    +            gotStream: function(stream) {
    +                this.stream = stream;
    +                this.active = true;
    +
    +                // start visualization
    +                this.play();
    +
    +                // notify listeners
    +                this.fireEvent('deviceReady', stream);
    +            },
    +
    +            /**
    +            * Device error callback.
    +            */
    +            deviceError: function(code) {
    +                // notify listeners
    +                this.fireEvent('deviceError', code);
    +            },
    +
    +            /**
    +            * Extract browser version out of the provided user agent string.
    +            * @param {!string} uastring userAgent string.
    +            * @param {!string} expr Regular expression used as match criteria.
    +            * @param {!number} pos position in the version string to be returned.
    +            * @return {!number} browser version.
    +            */
    +            extractVersion: function(uastring, expr, pos) {
    +                var match = uastring.match(expr);
    +                return match && match.length >= pos && parseInt(match[pos], 10);
    +            },
    +
    +            /**
    +            * Browser detector.
    +            * @return {object} result containing browser, version and minVersion
    +            *     properties.
    +            */
    +            detectBrowser: function() {
    +                // Returned result object.
    +                var result = {};
    +                result.browser = null;
    +                result.version = null;
    +                result.minVersion = null;
    +
    +                // Non supported browser.
    +                if (typeof window === 'undefined' || !window.navigator) {
    +                    result.browser = 'Not a supported browser.';
    +                    return result;
    +                }
    +
    +                // Firefox.
    +                if (navigator.mozGetUserMedia) {
    +                    result.browser = 'firefox';
    +                    result.version = this.extractVersion(navigator.userAgent, /Firefox\/([0-9]+)\./, 1);
    +                    result.minVersion = 31;
    +                    return result;
    +                }
    +
    +                // Chrome/Chromium/Webview.
    +                if (navigator.webkitGetUserMedia && window.webkitRTCPeerConnection) {
    +                    result.browser = 'chrome';
    +                    result.version = this.extractVersion(navigator.userAgent, /Chrom(e|ium)\/([0-9]+)\./, 2);
    +                    result.minVersion = 38;
    +                    return result;
    +                }
    +
    +                // Edge.
    +                if (navigator.mediaDevices && navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) {
    +                    result.browser = 'edge';
    +                    result.version = this.extractVersion(navigator.userAgent, /Edge\/(\d+).(\d+)$/, 2);
    +                    result.minVersion = 10547;
    +                    return result;
    +                }
    +
    +                // Non supported browser default.
    +                result.browser = 'Not a supported browser.';
    +                return result;
    +            }
    +        }
    +    };
    +}
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    new file mode 100644
    index 000000000..dc37610d3
    --- /dev/null
    +++ b/src/plugin/minimap.js
    @@ -0,0 +1,239 @@
    +/**
    + * minimap plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params = {}) {
    +    return {
    +        name: 'minimap',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        static: {
    +            initMinimap(customConfig) {
    +                console.warn('Deprecated initMinimap! Use wavesurfer.initPlugins("minimap") instead!');
    +                params = customConfig;
    +                this.initPlugins('minimap');
    +            }
    +        },
    +        extends: ['observer', 'drawer'],
    +        instance: {
    +            init: function (wavesurfer) {
    +                this.wavesurfer = wavesurfer;
    +                this._onDrawerCreated = () => {
    +                    this.container = this.wavesurfer.drawer.container;
    +                    this.lastPos = this.wavesurfer.drawer.lastPos;
    +                    this.params = wavesurfer.util.extend(
    +                        {}, this.wavesurfer.drawer.params, {
    +                            showRegions: false,
    +                            showOverview: false,
    +                            overviewBorderColor: 'green',
    +                            overviewBorderSize: 2
    +                        }, params, {
    +                            scrollParent: false,
    +                            fillParent: true
    +                        }
    +                    );
    +
    +                    this.width = 0;
    +                    this.height = this.params.height * this.params.pixelRatio;
    +
    +                    this.createWrapper();
    +                    this.createElements();
    +
    +                    if (this.wavesurfer.regions && this.params.showRegions) {
    +                        this.regions();
    +                    }
    +
    +                    this.bindWaveSurferEvents();
    +                    this.bindMinimapEvents();
    +                };
    +                if (this.wavesurfer.drawer) {
    +                    this._onDrawerCreated();
    +                    // @TODO: This shouldn't be necessary
    +                    this._onResize();
    +                }
    +
    +                this.wavesurfer.on('drawer-created', this._onDrawerCreated);
    +            },
    +
    +            destroy: function () {
    +                window.removeEventListener('resize', this._onResize, true);
    +                this.wavesurfer.un('drawer-created', this._onDrawerCreated);
    +                this.wrapper.parentNode.removeChild(this.wrapper);
    +            },
    +
    +            regions: function() {
    +                var my = this;
    +                this.regions = {};
    +
    +                this.wavesurfer.on('region-created', function(region) {
    +                    my.regions[region.id] = region;
    +                    my.renderRegions();
    +                });
    +
    +                this.wavesurfer.on('region-updated', function(region) {
    +                    my.regions[region.id] = region;
    +                    my.renderRegions();
    +                });
    +
    +                this.wavesurfer.on('region-removed', function(region) {
    +                    delete my.regions[region.id];
    +                    my.renderRegions();
    +                });
    +            },
    +            renderRegions: function() {
    +                var my = this;
    +                var regionElements = this.wrapper.querySelectorAll('region');
    +                for (var i = 0; i < regionElements.length; ++i) {
    +                    this.wrapper.removeChild(regionElements[i]);
    +                }
    +
    +                Object.keys(this.regions).forEach(function(id){
    +                    var region = my.regions[id];
    +                    var width = (my.width * ((region.end - region.start) / my.wavesurfer.getDuration()));
    +                    var left = (my.width * (region.start / my.wavesurfer.getDuration()));
    +                    var regionElement = my.style(document.createElement('region'), {
    +                        height: 'inherit',
    +                        backgroundColor: region.color,
    +                        width: width + 'px',
    +                        left: left + 'px',
    +                        display: 'block',
    +                        position: 'absolute'
    +                    });
    +                    regionElement.classList.add(id);
    +                    my.wrapper.appendChild(regionElement);
    +                });
    +            },
    +            createElements: function() {
    +                this.wavesurfer.renderers.Canvas.createElements.call(this);
    +
    +                if (this.params.showOverview) {
    +                    this.overviewRegion =  this.style(document.createElement('overview'), {
    +                        height: (this.wrapper.offsetHeight - (this.params.overviewBorderSize * 2)) + 'px',
    +                        width: '0px',
    +                        display: 'block',
    +                        position: 'absolute',
    +                        cursor: 'move',
    +                        border: this.params.overviewBorderSize + 'px solid ' + this.params.overviewBorderColor,
    +                        zIndex: 2,
    +                        opacity: this.params.overviewOpacity
    +                    });
    +
    +                    this.wrapper.appendChild(this.overviewRegion);
    +                }
    +            },
    +
    +            bindWaveSurferEvents: function () {
    +                var my = this;
    +                var prevWidth = 0;
    +                this._onResize = () => {
    +                    if (prevWidth != my.wrapper.clientWidth) {
    +                        prevWidth = my.wrapper.clientWidth;
    +                        my.render();
    +                        my.progress(my.wavesurfer.backend.getPlayedPercents());
    +                    }
    +                };
    +                this._onReady = () => this.render();
    +                this.wavesurfer.on('ready', this._onReady);
    +
    +                this._onAudioprocess = (currentTime) => {
    +                    this.progress(this.wavesurfer.backend.getPlayedPercents());
    +                };
    +                this.wavesurfer.on('audioprocess', this._onAudioprocess);
    +
    +                this._onSeek = () => this.progress(this.wavesurfer.backend.getPlayedPercents());
    +                this.wavesurfer.on('seek', this._onSeek);
    +
    +                if (this.params.showOverview) {
    +                    this._onScroll = e => {
    +                        if (!my.draggingOverview) {
    +                            my.moveOverviewRegion(event.target.scrollLeft / my.ratio);
    +                        }
    +                    };
    +                    this.wavesurfer.on('scroll', this._onSeek);
    +
    +                    this.wavesurfer.drawer.wrapper.addEventListener('mouseover', function(event) {
    +                        if (my.draggingOverview)  {
    +                            my.draggingOverview = false;
    +                        }
    +                    });
    +                }
    +
    +                window.addEventListener('resize', this._onResize, true);
    +            },
    +
    +
    +            bindMinimapEvents: function () {
    +                var my = this;
    +                var relativePositionX = 0;
    +                var seek = true;
    +                var positionMouseDown = {
    +                    clientX: 0,
    +                    clientY: 0
    +                };
    +
    +                this.on('click', (function (e, position) {
    +                    if (seek)  {
    +                        this.progress(position);
    +                        this.wavesurfer.seekAndCenter(position);
    +                    } else {
    +                        seek = true;
    +                    }
    +                }).bind(this));
    +
    +                if (this.params.showOverview) {
    +                    this.overviewRegion.addEventListener('mousedown', function(event) {
    +                        my.draggingOverview = true;
    +                        relativePositionX = event.layerX;
    +                        positionMouseDown.clientX = event.clientX;
    +                        positionMouseDown.clientY = event.clientY;
    +                    });
    +
    +                    this.wrapper.addEventListener('mousemove', function(event) {
    +                        if(my.draggingOverview) {
    +                            my.moveOverviewRegion(event.clientX - my.container.getBoundingClientRect().left - relativePositionX);
    +                        }
    +                    });
    +
    +                    this.wrapper.addEventListener('mouseup', function(event) {
    +                        if (positionMouseDown.clientX - event.clientX === 0 && positionMouseDown.clientX - event.clientX === 0) {
    +                            seek = true;
    +                            my.draggingOverview = false;
    +                        } else if (my.draggingOverview)  {
    +                            seek = false;
    +                            my.draggingOverview = false;
    +                        }
    +                    });
    +                }
    +            },
    +
    +            render: function () {
    +                var len = this.getWidth();
    +                var peaks = this.wavesurfer.backend.getPeaks(len);
    +                this.drawPeaks(peaks, len);
    +
    +                if (this.params.showOverview) {
    +                    //get proportional width of overview region considering the respective
    +                    //width of the drawers
    +                    this.ratio = this.wavesurfer.drawer.width / this.width;
    +                    this.waveShowedWidth = this.wavesurfer.drawer.width / this.ratio;
    +                    this.waveWidth = this.wavesurfer.drawer.width;
    +                    this.overviewWidth = (this.width / this.ratio);
    +                    this.overviewPosition = 0;
    +                    this.overviewRegion.style.width = (this.overviewWidth - (this.params.overviewBorderSize * 2)) + 'px';
    +                }
    +            },
    +            moveOverviewRegion: function(pixels) {
    +                if (pixels < 0) {
    +                    this.overviewPosition = 0;
    +                } else if (pixels + this.overviewWidth < this.width) {
    +                    this.overviewPosition = pixels;
    +                } else {
    +                    this.overviewPosition = (this.width - this.overviewWidth);
    +                }
    +                this.overviewRegion.style.left = this.overviewPosition + 'px';
    +                this.wavesurfer.drawer.wrapper.scrollLeft = this.overviewPosition * this.ratio;
    +            }
    +        }
    +    };
    +}
    diff --git a/plugin/wavesurfer.regions.js b/src/plugin/regions.js
    old mode 100755
    new mode 100644
    similarity index 64%
    rename from plugin/wavesurfer.regions.js
    rename to src/plugin/regions.js
    index ffac135ad..ed841c35b
    --- a/plugin/wavesurfer.regions.js
    +++ b/src/plugin/regions.js
    @@ -1,128 +1,10 @@
    -'use strict';
    -
    -/* Regions manager */
    -WaveSurfer.Regions = {
    -    init: function (wavesurfer) {
    -        this.wavesurfer = wavesurfer;
    -        this.wrapper = this.wavesurfer.drawer.wrapper;
    -
    -        /* Id-based hash of regions. */
    -        this.list = {};
    -    },
    -
    -    /* Add a region. */
    -    add: function (params) {
    -        var region = Object.create(WaveSurfer.Region);
    -        region.init(params, this.wavesurfer);
    -
    -        this.list[region.id] = region;
    -
    -        region.on('remove', (function () {
    -            delete this.list[region.id];
    -        }).bind(this));
    -
    -        return region;
    -    },
    -
    -    /* Remove all regions. */
    -    clear: function () {
    -        Object.keys(this.list).forEach(function (id) {
    -            this.list[id].remove();
    -        }, this);
    -    },
    -
    -    enableDragSelection: function (params) {
    -        var my = this;
    -        var drag;
    -        var start;
    -        var region;
    -        var touchId;
    -        var slop = params.slop || 2;
    -        var pxMove = 0;
    -
    -        var eventDown = function (e) {
    -            if (e.touches && e.touches.length > 1) { return; }
    -
    -            // Check whether the click/tap is on the bottom-most DOM element
    -            // Effectively prevent clicks on the scrollbar from registering as
    -            // region creation.
    -            if (e.target.childElementCount > 0) { return; }
    -
    -            touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
    -
    -            drag = true;
    -            start = my.wavesurfer.drawer.handleEvent(e, true);
    -            region = null;
    -        };
    -        this.wrapper.addEventListener('mousedown', eventDown);
    -        this.wrapper.addEventListener('touchstart', eventDown);
    -        this.on('disable-drag-selection', function() {
    -            my.wrapper.removeEventListener('touchstart', eventDown);
    -            my.wrapper.removeEventListener('mousedown', eventDown);
    -        });
    -
    -        var eventUp = function (e) {
    -            if (e.touches && e.touches.length > 1) { return; }
    -
    -            drag = false;
    -            pxMove = 0;
    -
    -            if (region) {
    -                region.fireEvent('update-end', e);
    -                my.wavesurfer.fireEvent('region-update-end', region, e);
    -            }
    -
    -            region = null;
    -        };
    -        this.wrapper.addEventListener('mouseup', eventUp);
    -        this.wrapper.addEventListener('touchend', eventUp);
    -        this.on('disable-drag-selection', function() {
    -            my.wrapper.removeEventListener('touchend', eventUp);
    -            my.wrapper.removeEventListener('mouseup', eventUp);
    -        });
    -
    -        var eventMove = function (e) {
    -            if (!drag) { return; }
    -            if (++pxMove <= slop) { return; }
    -
    -            if (e.touches && e.touches.length > 1) { return; }
    -            if (e.targetTouches && e.targetTouches[0].identifier != touchId) { return; }
    -
    -            if (!region) {
    -                region = my.add(params || {});
    -            }
    -
    -            var duration = my.wavesurfer.getDuration();
    -            var end = my.wavesurfer.drawer.handleEvent(e);
    -            region.update({
    -                start: Math.min(end * duration, start * duration),
    -                end: Math.max(end * duration, start * duration)
    -            });
    -        };
    -        this.wrapper.addEventListener('mousemove', eventMove);
    -        this.wrapper.addEventListener('touchmove', eventMove);
    -        this.on('disable-drag-selection', function() {
    -            my.wrapper.removeEventListener('touchmove', eventMove);
    -            my.wrapper.removeEventListener('mousemove', eventMove);
    -        });
    -    },
    -
    -    disableDragSelection: function () {
    -        this.fireEvent('disable-drag-selection');
    -    }
    -};
    -
    -WaveSurfer.util.extend(WaveSurfer.Regions, WaveSurfer.Observer);
    -
    -WaveSurfer.Region = {
    -    /* Helper function to assign CSS styles. */
    -    style: WaveSurfer.Drawer.style,
    -
    +const Region = {
         init: function (params, wavesurfer) {
             this.wavesurfer = wavesurfer;
             this.wrapper = wavesurfer.drawer.wrapper;
    +        this.style = wavesurfer.util.style;
     
    -        this.id = params.id == null ? WaveSurfer.util.getId() : params.id;
    +        this.id = params.id == null ? wavesurfer.util.getId() : params.id;
             this.start = Number(params.start) || 0;
             this.end = params.end == null ?
                 // small marker-like region
    @@ -268,18 +150,17 @@ WaveSurfer.Region = {
             var width;
             if (pxPerSec) {
                 width = Math.round(this.wavesurfer.getDuration() * pxPerSec);
    -        }
    -        else {
    +        } else {
                 width = this.wrapper.scrollWidth;
             }
     
             if (this.start < 0) {
    -          this.start = 0;
    -          this.end = this.end - this.start;
    +            this.start = 0;
    +            this.end = this.end - this.start;
             }
             if (this.end > dur) {
    -          this.end = dur;
    -          this.start = dur - (this.end - this.start);
    +            this.end = dur;
    +            this.start = dur - (this.end - this.start);
             }
     
             if (this.minLength != null) {
    @@ -295,7 +176,7 @@ WaveSurfer.Region = {
                 // no gaps appear between regions.
                 var left = Math.round(this.start / dur * width);
                 var regionWidth =
    -                Math.round(this.end / dur * width) - left;
    +            Math.round(this.end / dur * width) - left;
     
                 this.style(this.element, {
                     left: left + 'px',
    @@ -483,31 +364,173 @@ WaveSurfer.Region = {
         }
     };
     
    -WaveSurfer.util.extend(WaveSurfer.Region, WaveSurfer.Observer);
    +/**
    + * regions plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params = {}) {
    +    return {
    +        name: 'regions',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        extends: ['observer'],
    +        static: {
    +            initRegions() {
    +                console.warn('Deprecated initRegions! Use wavesurfer.initPlugins("regions") instead!');
    +                this.initPlugin('regions');
    +            },
    +
    +            addRegion(options) {
    +                if (!this.initialisedPluginList.regions) {
    +                    this.initPlugin('regions');
    +                }
    +                this.regions.add(options);
    +            },
     
    +            clearRegions() {
    +                this.regions && this.regions.clear();
    +            },
     
    -/* Augment WaveSurfer with region methods. */
    -WaveSurfer.initRegions = function () {
    -    if (!this.regions) {
    -        this.regions = Object.create(WaveSurfer.Regions);
    -        this.regions.init(this);
    -    }
    -};
    +            enableDragSelection(options) {
    +                if (!this.initialisedPluginList.regions) {
    +                    this.initPlugin('regions');
    +                }
    +                this.regions.enableDragSelection(options);
    +            },
     
    -WaveSurfer.addRegion = function (options) {
    -    this.initRegions();
    -    return this.regions.add(options);
    -};
    +            disableDragSelection() {
    +                this.regions.disableDragSelection();
    +            }
    +        },
    +        instance: {
    +            init: function (wavesurfer) {
    +                this.params = params;
    +                this.wavesurfer = wavesurfer;
    +
    +                // cant put this into static since we need to extend
    +                // with the observer first
    +                this.wavesurfer.Region = this.wavesurfer.util.extend({}, this.wavesurfer.util.observer, Region);
    +
    +                // Id-based hash of regions.
    +                this.list = {};
    +                this._onReady = () => {
    +                    this.wrapper = this.wavesurfer.drawer.wrapper;
    +                    if (this.params.regions) {
    +                        this.params.regions.forEach(region => {
    +                            this.add(region);
    +                        });
    +                    }
    +                    if (this.params.dragSelection) {
    +                        this.enableDragSelection(this.params.dragSelection);
    +                    }
    +                };
    +                // Check if ws is ready
    +                if (this.wavesurfer.backend) {
    +                    this._onReady();
    +                }
    +                this.wavesurfer.on('ready', this._onReady);
    +            },
    +
    +            destroy() {
    +                this.wavesurfer.un('ready', this._onReady);
    +                this.disableDragSelection();
    +                this.clear();
    +            },
    +            /* Add a region. */
    +            add: function (params) {
    +                var region = Object.create(this.wavesurfer.Region);
    +                region.init(params, this.wavesurfer);
    +
    +                this.list[region.id] = region;
    +
    +                region.on('remove', (function () {
    +                    delete this.list[region.id];
    +                }).bind(this));
    +
    +                return region;
    +            },
    +
    +            /* Remove all regions. */
    +            clear: function () {
    +                Object.keys(this.list).forEach(function (id) {
    +                    this.list[id].remove();
    +                }, this);
    +            },
    +
    +            enableDragSelection: function (params) {
    +                var my = this;
    +                var drag;
    +                var start;
    +                var region;
    +                var touchId;
    +                var slop = params.slop || 2;
    +                var pxMove = 0;
    +
    +                var eventDown = function (e) {
    +                    if (e.touches && e.touches.length > 1) { return; }
    +                    touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
     
    -WaveSurfer.clearRegions = function () {
    -    this.regions && this.regions.clear();
    -};
    +                    drag = true;
    +                    start = my.wavesurfer.drawer.handleEvent(e, true);
    +                    region = null;
    +                };
    +                this.wrapper.addEventListener('mousedown', eventDown);
    +                this.wrapper.addEventListener('touchstart', eventDown);
    +                this.on('disable-drag-selection', function() {
    +                    my.wrapper.removeEventListener('touchstart', eventDown);
    +                    my.wrapper.removeEventListener('mousedown', eventDown);
    +                });
    +
    +                var eventUp = function (e) {
    +                    if (e.touches && e.touches.length > 1) { return; }
     
    -WaveSurfer.enableDragSelection = function (options) {
    -    this.initRegions();
    -    this.regions.enableDragSelection(options);
    -};
    +                    drag = false;
    +                    pxMove = 0;
     
    -WaveSurfer.disableDragSelection = function () {
    -    this.regions.disableDragSelection();
    -};
    +                    if (region) {
    +                        region.fireEvent('update-end', e);
    +                        my.wavesurfer.fireEvent('region-update-end', region, e);
    +                    }
    +
    +                    region = null;
    +                };
    +                this.wrapper.addEventListener('mouseup', eventUp);
    +                this.wrapper.addEventListener('touchend', eventUp);
    +                this.on('disable-drag-selection', function() {
    +                    my.wrapper.removeEventListener('touchend', eventUp);
    +                    my.wrapper.removeEventListener('mouseup', eventUp);
    +                });
    +
    +                var eventMove = function (e) {
    +                    if (!drag) { return; }
    +                    if (++pxMove <= slop) { return; }
    +
    +                    if (e.touches && e.touches.length > 1) { return; }
    +                    if (e.targetTouches && e.targetTouches[0].identifier != touchId) { return; }
    +
    +                    if (!region) {
    +                        region = my.add(params || {});
    +                    }
    +
    +                    var duration = my.wavesurfer.getDuration();
    +                    var end = my.wavesurfer.drawer.handleEvent(e);
    +                    region.update({
    +                        start: Math.min(end * duration, start * duration),
    +                        end: Math.max(end * duration, start * duration)
    +                    });
    +                };
    +                this.wrapper.addEventListener('mousemove', eventMove);
    +                this.wrapper.addEventListener('touchmove', eventMove);
    +                this.on('disable-drag-selection', function() {
    +                    my.wrapper.removeEventListener('touchmove', eventMove);
    +                    my.wrapper.removeEventListener('mousemove', eventMove);
    +                });
    +            },
    +
    +            disableDragSelection: function () {
    +                this.fireEvent('disable-drag-selection');
    +            }
    +        }
    +    };
    +}
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    new file mode 100644
    index 000000000..5af43793d
    --- /dev/null
    +++ b/src/plugin/spectrogram.js
    @@ -0,0 +1,452 @@
    +/**
    + * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js
    + */
    +/* eslint-disable complexity */
    +const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
    +    this.bufferSize = bufferSize;
    +    this.sampleRate = sampleRate;
    +    this.bandwidth  = 2 / bufferSize * sampleRate / 2;
    +
    +    this.sinTable = new Float32Array(bufferSize);
    +    this.cosTable = new Float32Array(bufferSize);
    +    this.windowValues = new Float32Array(bufferSize);
    +    this.reverseTable = new Uint32Array(bufferSize);
    +
    +    this.peakBand   = 0;
    +    this.peak       = 0;
    +
    +    switch (windowFunc) {
    +        case 'bartlett' :
    +            for (var i = 0; i> 1;
    +
    +    var i;
    +
    +    while (limit < bufferSize) {
    +        for (i = 0; i < limit; i++) {
    +            this.reverseTable[i + limit] = this.reverseTable[i] + bit;
    +        }
    +
    +        limit = limit << 1;
    +        bit = bit >> 1;
    +    }
    +
    +    for (i = 0; i < bufferSize; i++) {
    +        this.sinTable[i] = Math.sin(-Math.PI/i);
    +        this.cosTable[i] = Math.cos(-Math.PI/i);
    +    }
    +
    +
    +    this.calculateSpectrum = function(buffer) {
    +        // Locally scope variables for speed up
    +        var bufferSize = this.bufferSize,
    +            cosTable = this.cosTable,
    +            sinTable = this.sinTable,
    +            reverseTable = this.reverseTable,
    +            real = new Float32Array(bufferSize),
    +            imag = new Float32Array(bufferSize),
    +            bSi = 2 / this.bufferSize,
    +            sqrt = Math.sqrt,
    +            rval,
    +            ival,
    +            mag,
    +            spectrum = new Float32Array(bufferSize / 2);
    +
    +        var k = Math.floor(Math.log(bufferSize) / Math.LN2);
    +
    +        if (Math.pow(2, k) !== bufferSize) {
    +            throw 'Invalid buffer size, must be a power of 2.';
    +        }
    +        if (bufferSize !== buffer.length) {
    +            throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' + bufferSize + ' Buffer Size: ' + buffer.length;
    +        }
    +
    +        var halfSize = 1,
    +            phaseShiftStepReal,
    +            phaseShiftStepImag,
    +            currentPhaseShiftReal,
    +            currentPhaseShiftImag,
    +            off,
    +            tr,
    +            ti,
    +            tmpReal;
    +
    +        for (var i = 0; i < bufferSize; i++) {
    +            real[i] = buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];
    +            imag[i] = 0;
    +        }
    +
    +        while (halfSize < bufferSize) {
    +            phaseShiftStepReal = cosTable[halfSize];
    +            phaseShiftStepImag = sinTable[halfSize];
    +
    +            currentPhaseShiftReal = 1;
    +            currentPhaseShiftImag = 0;
    +
    +            for (var fftStep = 0; fftStep < halfSize; fftStep++) {
    +                var i = fftStep;
    +
    +                while (i < bufferSize) {
    +                    off = i + halfSize;
    +                    tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
    +                    ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
    +
    +                    real[off] = real[i] - tr;
    +                    imag[off] = imag[i] - ti;
    +                    real[i] += tr;
    +                    imag[i] += ti;
    +
    +                    i += halfSize << 1;
    +                }
    +
    +                tmpReal = currentPhaseShiftReal;
    +                currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
    +                currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
    +            }
    +
    +            halfSize = halfSize << 1;
    +        }
    +
    +        for (var i = 0, N = bufferSize / 2; i < N; i++) {
    +            rval = real[i];
    +            ival = imag[i];
    +            mag = bSi * sqrt(rval * rval + ival * ival);
    +
    +            if (mag > this.peak) {
    +                this.peakBand = i;
    +                this.peak = mag;
    +            }
    +            spectrum[i] = mag;
    +        }
    +        return spectrum;
    +    };
    +};
    +/* eslint-enable complexity */
    +
    +/**
    +* spectrogram plugin
    +*
    +* @param  {Object} params parameters use to initialise the plugin
    +* @return {Object} an object representing the plugin
    +*/
    +export default function(params = {}) {
    +    return {
    +        name: 'spectrogram',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        static: {
    +            FFT
    +        },
    +        extends: ['observer'],
    +        instance: {
    +
    +            /**
    +            * List of params:
    +            *   wavesurfer: wavesurfer object
    +            *   pixelRatio: to control the size of the spectrogram in relation with its canvas. 1=Draw on the whole canvas. 2 = draw on a quarter (1/2 the lenght and 1/2 the width)
    +            *   fftSamples: number of samples to fetch to FFT. Must be a pwer of 2. Default = 512
    +            *   windowFunc: the window function to be used. Default is 'hann'. Choose from the following:
    +            *               + 'bartlett'
    +            *               + 'bartlettHann'
    +            *               + 'blackman'
    +            *               + 'cosine'
    +            *               + 'gauss'
    +            *               + 'hamming'
    +            *               + 'hann'
    +            *               + 'lanczoz'
    +            *               + 'rectangular'
    +            *               + 'triangular'
    +            *   alpha: some window functions have this extra value (0 {
    +                    var drawer = this.drawer = this.wavesurfer.drawer;
    +
    +                    this.container = 'string' == typeof params.container ?
    +                    document.querySelector(params.container) : params.container;
    +
    +                    if (!this.container) {
    +                        throw Error('No container for WaveSurfer spectrogram');
    +                    }
    +
    +                    this.width = drawer.width;
    +                    this.pixelRatio = this.params.pixelRatio || wavesurfer.params.pixelRatio;
    +                    this.fftSamples = this.params.fftSamples || wavesurfer.params.fftSamples || 512;
    +                    this.height = this.fftSamples / 2;
    +                    this.noverlap = params.noverlap;
    +                    this.windowFunc = params.windowFunc;
    +                    this.alpha = params.alpha;
    +
    +                    this.createWrapper();
    +                    this.createCanvas();
    +                    this.render();
    +
    +                    drawer.wrapper.addEventListener('scroll', function (e) {
    +                        this.updateScroll(e);
    +                    }.bind(this));
    +                    wavesurfer.on('redraw', this.render.bind(this));
    +                };
    +
    +                // Check if ws is ready
    +                if (this.wavesurfer.backend) {
    +                    this._onReady();
    +                }
    +
    +                this.wavesurfer.on('ready', this._onReady);
    +            },
    +
    +            destroy: function () {
    +                this.unAll();
    +                this.wavesurfer.un('ready', this._onReady);
    +                if (this.wrapper) {
    +                    this.wrapper.parentNode.removeChild(this.wrapper);
    +                    this.wrapper = null;
    +                }
    +            },
    +
    +            createWrapper: function () {
    +                var prevSpectrogram = this.container.querySelector('spectrogram');
    +                if (prevSpectrogram) {
    +                    this.container.removeChild(prevSpectrogram);
    +                }
    +
    +                var wsParams = this.wavesurfer.params;
    +
    +                this.wrapper = this.container.appendChild(
    +                    document.createElement('spectrogram')
    +                );
    +                this.drawer.style(this.wrapper, {
    +                    display: 'block',
    +                    position: 'relative',
    +                    userSelect: 'none',
    +                    webkitUserSelect: 'none',
    +                    height: this.height + 'px'
    +                });
    +
    +                if (wsParams.fillParent || wsParams.scrollParent) {
    +                    this.drawer.style(this.wrapper, {
    +                        width: '100%',
    +                        overflowX: 'hidden',
    +                        overflowY: 'hidden'
    +                    });
    +                }
    +
    +                var my = this;
    +                this.wrapper.addEventListener('click', function (e) {
    +                    e.preventDefault();
    +                    var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    +                    my.fireEvent('click', (relX / my.scrollWidth) || 0);
    +                });
    +            },
    +
    +            createCanvas: function () {
    +                var canvas = this.canvas = this.wrapper.appendChild(
    +                    document.createElement('canvas')
    +                );
    +
    +                this.spectrCc = canvas.getContext('2d');
    +
    +                this.wavesurfer.drawer.style(canvas, {
    +                    position: 'absolute',
    +                    zIndex: 4
    +                });
    +            },
    +
    +            render: function () {
    +                this.updateCanvasStyle();
    +
    +                if (this.frequenciesDataUrl) {
    +                    this.loadFrequenciesData(this.frequenciesDataUrl);
    +                } else {
    +                    this.getFrequencies(this.drawSpectrogram);
    +                }
    +            },
    +
    +            updateCanvasStyle: function () {
    +                var width = Math.round(this.width / this.pixelRatio) + 'px';
    +                this.canvas.width = this.width;
    +                this.canvas.height = this.height;
    +                this.canvas.style.width = width;
    +            },
    +
    +            drawSpectrogram: function(frequenciesData, my) {
    +                var spectrCc = my.spectrCc;
    +
    +                var length = my.wavesurfer.backend.getDuration();
    +                var height = my.height;
    +
    +                var pixels = my.resample(frequenciesData);
    +
    +                var heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;
    +
    +                for (var i = 0; i < pixels.length; i++) {
    +                    for (var j = 0; j < pixels[i].length; j++) {
    +                        var colorValue = 255 - pixels[i][j];
    +                        my.spectrCc.fillStyle = 'rgb(' + colorValue + ', '  + colorValue + ', ' + colorValue + ')';
    +                        my.spectrCc.fillRect(i, height - j * heightFactor, 1, heightFactor);
    +                    }
    +                }
    +            },
    +
    +            getFrequencies: function(callback) {
    +                var fftSamples = this.fftSamples;
    +                var buffer = this.buffer = this.wavesurfer.backend.buffer;
    +                var channelOne = buffer.getChannelData(0);
    +                var bufferLength = buffer.length;
    +                var sampleRate = buffer.sampleRate;
    +                var frequencies = [];
    +
    +                if (! buffer) {
    +                    this.fireEvent('error', 'Web Audio buffer is not available');
    +                    return;
    +                }
    +
    +                var noverlap = this.noverlap;
    +                if (! noverlap) {
    +                    var uniqueSamplesPerPx = buffer.length / this.canvas.width;
    +                    noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));
    +                }
    +
    +                var fft = new FFT(fftSamples, sampleRate, this.windowFunc, this.alpha);
    +
    +                var maxSlicesCount = Math.floor(bufferLength/ (fftSamples - noverlap));
    +
    +                var currentOffset = 0;
    +
    +                while (currentOffset + fftSamples < channelOne.length) {
    +                    var segment = channelOne.slice(currentOffset, currentOffset + fftSamples);
    +                    var spectrum = fft.calculateSpectrum(segment);
    +                    var array = new Uint8Array(fftSamples/2);
    +                    for (var j = 0; j 0) {
    +                            for (var k = 0; k < oldMatrix[0].length; k++) {
    +                                if (column[k] == null) {
    +                                    column[k] = 0;
    +                                }
    +                                column[k] += (overlap / newPiece) * oldMatrix[j][k];
    +                            }
    +                        }
    +                        /* eslint-enable max-depth */
    +                    }
    +
    +                    var intColumn = new Uint8Array(oldMatrix[0].length);
    +
    +                    for (var k = 0; k < oldMatrix[0].length; k++) {
    +                        intColumn[k] = column[k];
    +                    }
    +
    +                    newMatrix.push(intColumn);
    +                }
    +
    +                return newMatrix;
    +            }
    +        }
    +    };
    +}
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    new file mode 100644
    index 000000000..c20d7b309
    --- /dev/null
    +++ b/src/plugin/timeline.js
    @@ -0,0 +1,297 @@
    +/**
    + * timeline plugin
    + *
    + * @param  {Object} params parameters use to initialise the plugin
    + * @return {Object} an object representing the plugin
    + */
    +export default function(params = {}) {
    +    return {
    +        name: 'timeline',
    +        deferInit: params && params.deferInit ? params.deferInit : false,
    +        extends: ['observer'],
    +        instance: {
    +            init: function (wavesurfer) {
    +                this.params = params;
    +                this.wavesurfer = wavesurfer;
    +
    +                if (!this.wavesurfer) {
    +                    throw Error('No WaveSurfer intance provided');
    +                }
    +
    +
    +                this.container = 'string' == typeof params.container ?
    +                document.querySelector(params.container) : params.container;
    +
    +                if (!this.container) {
    +                    throw Error('No container for WaveSurfer timeline');
    +                }
    +
    +                this.height = this.params.height || 20;
    +                this.notchPercentHeight = this.params.notchPercentHeight || 90;
    +                this.primaryColor = this.params.primaryColor || '#000';
    +                this.secondaryColor = this.params.secondaryColor || '#c0c0c0';
    +                this.primaryFontColor = this.params.primaryFontColor || '#000';
    +                this.secondaryFontColor = this.params.secondaryFontColor || '#000';
    +                this.fontFamily = this.params.fontFamily || 'Arial';
    +                this.fontSize = this.params.fontSize || 10;
    +                this.timeInterval = this.params.timeInterval;
    +                this.primaryLabelInterval = this.params.primaryLabelInterval;
    +                this.secondaryLabelInterval = this.params.secondaryLabelInterval;
    +                this.formatTimeCallback = this.params.formatTimeCallback;
    +                this.canvases = [];
    +
    +                this._onRedraw = () => {
    +                    this.render();
    +                };
    +
    +                this._onReady = () => {
    +                    this.drawer = this.wavesurfer.drawer;
    +                    this.width = this.wavesurfer.drawer.width;
    +                    this.pixelRatio = this.wavesurfer.drawer.params.pixelRatio;
    +                    this.maxCanvasWidth = this.wavesurfer.drawer.maxCanvasWidth || this.width;
    +                    this.maxCanvasElementWidth = this.wavesurfer.drawer.maxCanvasElementWidth || Math.round(this.maxCanvasWidth / this.pixelRatio);
    +
    +                    this.createWrapper();
    +                    this.render();
    +                    this.wavesurfer.drawer.wrapper.addEventListener('scroll', e => this.updateScroll(e));
    +                    this.wavesurfer.on('redraw', this._onRedraw);
    +                };
    +                this.wavesurfer.on('ready', this._onReady);
    +                // Check if ws is ready
    +                if (this.wavesurfer.backend) {
    +                    this._onReady();
    +                }
    +            },
    +
    +            destroy: function () {
    +                this.unAll();
    +                this.wavesurfer.un('redraw', this._onRedraw);
    +                this.wavesurfer.un('ready', this._onReady);
    +                if (this.wrapper && this.wrapper.parentNode) {
    +                    this.wrapper.parentNode.removeChild(this.wrapper);
    +                    this.wrapper = null;
    +                }
    +            },
    +
    +            createWrapper: function () {
    +
    +                var wsParams = this.wavesurfer.params;
    +                this.wrapper = this.container.appendChild(
    +                    document.createElement('timeline')
    +                );
    +                this.drawer.style(this.wrapper, {
    +                    display: 'block',
    +                    position: 'relative',
    +                    userSelect: 'none',
    +                    webkitUserSelect: 'none',
    +                    height: this.height + 'px'
    +                });
    +
    +                if (wsParams.fillParent || wsParams.scrollParent) {
    +                    this.drawer.style(this.wrapper, {
    +                        width: '100%',
    +                        overflowX: 'hidden',
    +                        overflowY: 'hidden'
    +                    });
    +                }
    +
    +                var my = this;
    +                this.wrapper.addEventListener('click', function (e) {
    +                    e.preventDefault();
    +                    var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    +                    my.fireEvent('click', (relX / my.wrapper.scrollWidth) || 0);
    +                });
    +            },
    +
    +            removeOldCanvases: function () {
    +                while (this.canvases.length > 0) {
    +                    var canvas = this.canvases.pop();
    +                    canvas.parentElement.removeChild(canvas);
    +                }
    +            },
    +
    +            createCanvases: function () {
    +                this.removeOldCanvases();
    +
    +                var totalWidth = Math.round(this.drawer.wrapper.scrollWidth),
    +                requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth),
    +                canvas;
    +
    +                for (var i = 0; i < requiredCanvases; i++) {
    +                    canvas = this.wrapper.appendChild(document.createElement('canvas'));
    +                    this.canvases.push(canvas);
    +                    this.drawer.style(canvas, {
    +                        position: 'absolute',
    +                        zIndex: 4
    +                    });
    +                }
    +            },
    +
    +            render: function () {
    +                this.createCanvases();
    +                this.updateCanvasStyle();
    +                this.drawTimeCanvases();
    +            },
    +
    +            updateCanvasStyle: function () {
    +                var requiredCanvases = this.canvases.length;
    +                for (var i = 0; i < requiredCanvases; i++) {
    +                    var canvas = this.canvases[i],
    +                    canvasWidth = this.maxCanvasElementWidth;
    +
    +                    if (i === requiredCanvases - 1) {
    +                        canvasWidth = this.drawer.wrapper.scrollWidth - (this.maxCanvasElementWidth * (requiredCanvases - 1));
    +                    }
    +
    +                    canvas.width = canvasWidth * this.pixelRatio;
    +                    canvas.height = this.height * this.pixelRatio;
    +                    canvas.style.width = canvasWidth + 'px';
    +                    canvas.style.height = this.height + 'px';
    +                    canvas.style.left = i * this.maxCanvasElementWidth + 'px';
    +                }
    +            },
    +
    +            drawTimeCanvases: function() {
    +                var backend = this.wavesurfer.backend,
    +                wsParams = this.wavesurfer.params,
    +                duration = backend.getDuration(),
    +                self = this;
    +
    +                if (wsParams.fillParent && !wsParams.scrollParent) {
    +                    var width = this.drawer.getWidth();
    +                } else {
    +                    width = this.drawer.wrapper.scrollWidth * wsParams.pixelRatio;
    +                }
    +                var pixelsPerSecond = width/duration;
    +
    +                if (duration <= 0) { return; }
    +
    +                var curPixel = 0,
    +                curSeconds = 0,
    +                totalSeconds = parseInt(duration, 10) + 1,
    +                formatTime = function(seconds) {
    +                    if (typeof self.formatTimeCallback === 'function') {
    +                        return self.formatTimeCallback(seconds);
    +                    }
    +
    +                    if (seconds/60 > 1) {
    +                        var minutes = parseInt(seconds / 60),
    +                        seconds = parseInt(seconds % 60);
    +                        seconds = (seconds < 10) ? '0' + seconds : seconds;
    +                        return '' + minutes + ':' + seconds;
    +                    } else {
    +                        return seconds;
    +                    }
    +                };
    +
    +                if (pixelsPerSecond * 1 >= 25) {
    +                    var timeInterval = 1;
    +                    var primaryLabelInterval = 10;
    +                    var secondaryLabelInterval = 5;
    +                } else if (pixelsPerSecond * 5 >= 25) {
    +                    var timeInterval = 5;
    +                    var primaryLabelInterval = 6;
    +                    var secondaryLabelInterval = 2;
    +                } else if (pixelsPerSecond * 15 >= 25) {
    +                    var timeInterval = 15;
    +                    var primaryLabelInterval = 4;
    +                    var secondaryLabelInterval = 2;
    +                } else {
    +                    var timeInterval = 60;
    +                    var primaryLabelInterval = 4;
    +                    var secondaryLabelInterval = 2;
    +                }
    +
    +                timeInterval = this.timeInterval || timeInterval;
    +                primaryLabelInterval = this.primaryLabelInterval || primaryLabelInterval;
    +                secondaryLabelInterval = this.secondaryLabelInterval || secondaryLabelInterval;
    +
    +                var height1 = this.height - 4,
    +                height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4,
    +                fontSize = this.fontSize * wsParams.pixelRatio;
    +
    +                for (var i = 0; i < totalSeconds/timeInterval; i++) {
    +                    if (i % primaryLabelInterval == 0) {
    +                        this.setFillStyles(this.primaryColor);
    +                        this.fillRect(curPixel, 0, 1, height1);
    +                        this.setFonts(fontSize + 'px ' + this.fontFamily);
    +                        this.setFillStyles(this.primaryFontColor);
    +                        this.fillText(formatTime(curSeconds), curPixel + 5, height1);
    +                    } else if (i % secondaryLabelInterval == 0) {
    +                        this.setFillStyles(this.secondaryColor);
    +                        this.fillRect(curPixel, 0, 1, height1);
    +                        this.setFonts(fontSize + 'px ' + this.fontFamily);
    +                        this.setFillStyles(this.secondaryFontColor);
    +                        this.fillText(formatTime(curSeconds), curPixel + 5, height1);
    +                    } else {
    +                        this.setFillStyles(this.secondaryColor);
    +                        this.fillRect(curPixel, 0, 1, height2);
    +                    }
    +
    +                    curSeconds += timeInterval;
    +                    curPixel += pixelsPerSecond * timeInterval;
    +                }
    +            },
    +
    +            setFillStyles: function (fillStyle) {
    +                for (var i in this.canvases) {
    +                    this.canvases[i].getContext('2d').fillStyle = fillStyle;
    +                }
    +            },
    +
    +            setFonts: function (font) {
    +                for (var i in this.canvases) {
    +                    this.canvases[i].getContext('2d').font = font;
    +                }
    +            },
    +
    +            fillRect: function (x, y, width, height) {
    +                for (var i in this.canvases) {
    +                    var canvas = this.canvases[i],
    +                    leftOffset = i * this.maxCanvasWidth;
    +
    +                    var intersection = {
    +                        x1: Math.max(x, i * this.maxCanvasWidth),
    +                        y1: y,
    +                        x2: Math.min(x + width, i * this.maxCanvasWidth + canvas.width),
    +                        y2: y + height
    +                    };
    +
    +                    if (intersection.x1 < intersection.x2) {
    +                        canvas.getContext('2d').fillRect(
    +                            intersection.x1 - leftOffset,
    +                            intersection.y1,
    +                            intersection.x2 - intersection.x1,
    +                            intersection.y2 - intersection.y1
    +                        );
    +                    }
    +                }
    +            },
    +
    +            fillText: function (text, x, y) {
    +                var textWidth,
    +                xOffset = 0;
    +
    +                for (var i in this.canvases) {
    +                    var context = this.canvases[i].getContext('2d'),
    +                    canvasWidth = context.canvas.width;
    +
    +                    if (xOffset > x + textWidth) {
    +                        break;
    +                    }
    +
    +                    if (xOffset + canvasWidth > x) {
    +                        textWidth = context.measureText(text).width;
    +                        context.fillText(text, x - xOffset, y);
    +                    }
    +
    +                    xOffset += canvasWidth;
    +                }
    +            },
    +
    +            updateScroll: function () {
    +                this.wrapper.scrollLeft = this.drawer.wrapper.scrollLeft;
    +            }
    +        }
    +    };
    +}
    diff --git a/src/util.js b/src/util.js
    deleted file mode 100644
    index 5689027d4..000000000
    --- a/src/util.js
    +++ /dev/null
    @@ -1,152 +0,0 @@
    -/* Common utilities */
    -WaveSurfer.util = {
    -    extend: function (dest) {
    -        var sources = Array.prototype.slice.call(arguments, 1);
    -        sources.forEach(function (source) {
    -            Object.keys(source).forEach(function (key) {
    -                dest[key] = source[key];
    -            });
    -        });
    -        return dest;
    -    },
    -
    -    min: function(values) {
    -        var min = +Infinity;
    -        for (var i in values) {
    -            if (values[i] < min) {
    -                min = values[i];
    -            }
    -        }
    -
    -        return min;
    -    },
    -
    -    max: function(values) {
    -        var max = -Infinity;
    -        for (var i in values) {
    -            if (values[i] > max) {
    -                max = values[i];
    -            }
    -        }
    -
    -        return max;
    -    },
    -
    -    getId: function () {
    -        return 'wavesurfer_' + Math.random().toString(32).substring(2);
    -    },
    -
    -    ajax: function (options) {
    -        var ajax = Object.create(WaveSurfer.Observer);
    -        var xhr = new XMLHttpRequest();
    -        var fired100 = false;
    -
    -        xhr.open(options.method || 'GET', options.url, true);
    -        xhr.responseType = options.responseType || 'json';
    -
    -        xhr.addEventListener('progress', function (e) {
    -            ajax.fireEvent('progress', e);
    -            if (e.lengthComputable && e.loaded == e.total) {
    -                fired100 = true;
    -            }
    -        });
    -
    -        xhr.addEventListener('load', function (e) {
    -            if (!fired100) {
    -                ajax.fireEvent('progress', e);
    -            }
    -            ajax.fireEvent('load', e);
    -
    -            if (200 == xhr.status || 206 == xhr.status) {
    -                ajax.fireEvent('success', xhr.response, e);
    -            } else {
    -                ajax.fireEvent('error', e);
    -            }
    -        });
    -
    -        xhr.addEventListener('error', function (e) {
    -            ajax.fireEvent('error', e);
    -        });
    -
    -        xhr.send();
    -        ajax.xhr = xhr;
    -        return ajax;
    -    }
    -};
    -
    -/* Observer */
    -WaveSurfer.Observer = {
    -    /**
    -     * Attach a handler function for an event.
    -     */
    -    on: function (event, fn) {
    -        if (!this.handlers) { this.handlers = {}; }
    -
    -        var handlers = this.handlers[event];
    -        if (!handlers) {
    -            handlers = this.handlers[event] = [];
    -        }
    -        handlers.push(fn);
    -
    -        // Return an event descriptor
    -        return {
    -            name: event,
    -            callback: fn,
    -            un: this.un.bind(this, event, fn)
    -        };
    -    },
    -
    -    /**
    -     * Remove an event handler.
    -     */
    -    un: function (event, fn) {
    -        if (!this.handlers) { return; }
    -
    -        var handlers = this.handlers[event];
    -        if (handlers) {
    -            if (fn) {
    -                for (var i = handlers.length - 1; i >= 0; i--) {
    -                    if (handlers[i] == fn) {
    -                        handlers.splice(i, 1);
    -                    }
    -                }
    -            } else {
    -                handlers.length = 0;
    -            }
    -        }
    -    },
    -
    -    /**
    -     * Remove all event handlers.
    -     */
    -    unAll: function () {
    -        this.handlers = null;
    -    },
    -
    -    /**
    -     * Attach a handler to an event. The handler is executed at most once per
    -     * event type.
    -     */
    -    once: function (event, handler) {
    -        var my = this;
    -        var fn = function () {
    -            handler.apply(this, arguments);
    -            setTimeout(function () {
    -                my.un(event, fn);
    -            }, 0);
    -        };
    -        return this.on(event, fn);
    -    },
    -
    -    fireEvent: function (event) {
    -        if (!this.handlers) { return; }
    -        var handlers = this.handlers[event];
    -        var args = Array.prototype.slice.call(arguments, 1);
    -        handlers && handlers.forEach(function (fn) {
    -            fn.apply(null, args);
    -        });
    -    }
    -};
    -
    -/* Make the main WaveSurfer object an observer */
    -WaveSurfer.util.extend(WaveSurfer, WaveSurfer.Observer);
    diff --git a/src/util/ajax.js b/src/util/ajax.js
    new file mode 100644
    index 000000000..b3dfb7fde
    --- /dev/null
    +++ b/src/util/ajax.js
    @@ -0,0 +1,39 @@
    +import observer from './observer';
    +
    +/**
    + * Perform an ajax request
    + *
    + * @param {Options} options Description
    + *
    + * @returns {Object} Observer instance
    + */
    +export default function ajax (options) {
    +    const instance = Object.create(observer);
    +    const xhr = new XMLHttpRequest();
    +    let fired100 = false;
    +    xhr.open(options.method || 'GET', options.url, true);
    +    xhr.responseType = options.responseType || 'json';
    +    xhr.addEventListener('progress', function (e) {
    +        instance.fireEvent('progress', e);
    +        if (e.lengthComputable && e.loaded == e.total) {
    +            fired100 = true;
    +        }
    +    });
    +    xhr.addEventListener('load', function (e) {
    +        if (!fired100) {
    +            instance.fireEvent('progress', e);
    +        }
    +        instance.fireEvent('load', e);
    +        if (200 == xhr.status || 206 == xhr.status) {
    +            instance.fireEvent('success', xhr.response, e);
    +        } else {
    +            instance.fireEvent('error', e);
    +        }
    +    });
    +    xhr.addEventListener('error', function (e) {
    +        instance.fireEvent('error', e);
    +    });
    +    xhr.send();
    +    instance.xhr = xhr;
    +    return instance;
    +}
    diff --git a/src/util/extend.js b/src/util/extend.js
    new file mode 100644
    index 000000000..9601cc2dc
    --- /dev/null
    +++ b/src/util/extend.js
    @@ -0,0 +1,16 @@
    + /**
    +  * extend - Extend an object shallowly with others
    +  *
    +  * @param {type}  dest    The target object
    +  * @param {array} sources The objects to use for extending
    +  *
    +  * @returns {type} Description
    +  */
    + export default function extend (dest, ...sources) {
    +    sources.forEach(source => {
    +        Object.keys(source).forEach(key => {
    +            dest[key] = source[key];
    +        });
    +    });
    +    return dest;
    +}
    diff --git a/src/util/get-id.js b/src/util/get-id.js
    new file mode 100644
    index 000000000..9d8203bf6
    --- /dev/null
    +++ b/src/util/get-id.js
    @@ -0,0 +1,8 @@
    +/**
    + * Get a random prefixed ID
    + *
    + * @returns {String} Random ID
    + */
    +export default function getId () {
    +    return 'wavesurfer_' + Math.random().toString(32).substring(2);
    +}
    diff --git a/src/util/index.js b/src/util/index.js
    new file mode 100644
    index 000000000..e7cdf2f75
    --- /dev/null
    +++ b/src/util/index.js
    @@ -0,0 +1,7 @@
    +export { default as ajax } from './ajax';
    +export { default as getId } from './get-id';
    +export { default as max } from './max';
    +export { default as min } from './min';
    +export { default as observer } from './observer';
    +export { default as extend } from './extend';
    +export { default as style } from './style';
    diff --git a/src/util/max.js b/src/util/max.js
    new file mode 100644
    index 000000000..df75e3cf8
    --- /dev/null
    +++ b/src/util/max.js
    @@ -0,0 +1,15 @@
    +/**
    + * Get the largest value
    + *
    + * @param   {Array} values Array of numbers
    + * @returns {Number} Largest number found
    + */
    +export default function max (values) {
    +    let largest = -Infinity;
    +    Object.keys(values).forEach(i => {
    +        if (values[i] > largest) {
    +            largest = values[i];
    +        }
    +    });
    +    return largest;
    +}
    diff --git a/src/util/min.js b/src/util/min.js
    new file mode 100644
    index 000000000..e127185e6
    --- /dev/null
    +++ b/src/util/min.js
    @@ -0,0 +1,15 @@
    +/**
    + * Get the smallest value
    + *
    + * @param   {Array} values Array of numbers
    + * @returns {Number}       Smallest number found
    + */
    +export default function min (values) {
    +    let smallest = Number(Infinity);
    +    Object.keys(values).forEach(i => {
    +        if (values[i] < smallest) {
    +            smallest = values[i];
    +        }
    +    });
    +    return smallest;
    +}
    diff --git a/src/util/observer.js b/src/util/observer.js
    new file mode 100644
    index 000000000..5efbce20d
    --- /dev/null
    +++ b/src/util/observer.js
    @@ -0,0 +1,73 @@
    +export default {
    +    /**
    +     * Attach a handler function for an event.
    +     */
    +    on: function (event, fn) {
    +        if (!this.handlers) { this.handlers = {}; }
    +
    +        let handlers = this.handlers[event];
    +        if (!handlers) {
    +            handlers = this.handlers[event] = [];
    +        }
    +        handlers.push(fn);
    +
    +        // Return an event descriptor
    +        return {
    +            name: event,
    +            callback: fn,
    +            un: this.un.bind(this, event, fn)
    +        };
    +    },
    +
    +    /**
    +     * Remove an event handler.
    +     */
    +    un: function (event, fn) {
    +        if (!this.handlers) { return; }
    +
    +        const handlers = this.handlers[event];
    +        if (handlers) {
    +            if (fn) {
    +                for (var i = handlers.length - 1; i >= 0; i--) {
    +                    if (handlers[i] == fn) {
    +                        handlers.splice(i, 1);
    +                    }
    +                }
    +            } else {
    +                handlers.length = 0;
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Remove all event handlers.
    +     */
    +    unAll: function () {
    +        this.handlers = null;
    +    },
    +
    +    /**
    +     * Attach a handler to an event. The handler is executed at most once per
    +     * event type.
    +     */
    +    once: function (event, handler) {
    +        const my = this;
    +        const fn = function () {
    +            /*  eslint-disable no-invalid-this, prefer-rest-params */
    +            handler.apply(this, arguments);
    +            /*  eslint-enable no-invalid-this, prefer-rest-params */
    +            setTimeout(function () {
    +                my.un(event, fn);
    +            }, 0);
    +        };
    +        return this.on(event, fn);
    +    },
    +
    +    fireEvent: function (event, ...args) {
    +        if (!this.handlers) { return; }
    +        const handlers = this.handlers[event];
    +        handlers && handlers.forEach(function (fn) {
    +            fn(...args);
    +        });
    +    }
    +};
    diff --git a/src/util/style.js b/src/util/style.js
    new file mode 100644
    index 000000000..9f281abf6
    --- /dev/null
    +++ b/src/util/style.js
    @@ -0,0 +1,16 @@
    +/**
    + * Apply a map of styles to an element
    + *
    + * @param {HTMLElement} el The element that the styles will be applied to
    + * @param {Object} styes The map of propName: attribute, both are used as-is
    + *
    + * @returns {HTMLElement} el
    + */
    +export default function style (el, styles) {
    +    Object.keys(styles).forEach(function (prop) {
    +        if (el.style[prop] !== styles[prop]) {
    +            el.style[prop] = styles[prop];
    +        }
    +    });
    +    return el;
    +}
    diff --git a/src/wavesurfer.js b/src/wavesurfer.js
    index d5dda3569..8a59ce96f 100755
    --- a/src/wavesurfer.js
    +++ b/src/wavesurfer.js
    @@ -1,14 +1,12 @@
    -/**
    - * wavesurfer.js
    - *
    - * https://github.com/katspaugh/wavesurfer.js
    - *
    - * This work is licensed under a Creative Commons Attribution 3.0 Unported License.
    - */
    + import * as util from './util';
     
    -'use strict';
    + import Canvas from './drawer.canvas';
    + import MultiCanvas from './drawer.multicanvas';
     
    -var WaveSurfer = {
    + import WebAudio from './webaudio';
    + import MediaElement from './mediaelement';
    +
    + const WaveSurfer = util.extend({}, util.observer, { util }, {
         defaultParams: {
             height        : 128,
             waveColor     : '#999',
    @@ -34,7 +32,17 @@ var WaveSurfer = {
             renderer      : 'Canvas',
             backend       : 'WebAudio',
             mediaType     : 'audio',
    -        autoCenter    : true
    +        autoCenter    : true,
    +        plugins       : []
    +    },
    +
    +    renderers: {
    +        Canvas,
    +        MultiCanvas
    +    },
    +    backends: {
    +        MediaElement,
    +        WebAudio
         },
     
         init: function (params) {
    @@ -75,17 +83,149 @@ var WaveSurfer = {
             // Holds any running audio downloads
             this.currentAjax = null;
     
    +        // cache constructor objects
    +        this.Drawer = this.renderers[this.params.renderer];
    +        this.Backend = this.backends[this.params.backend];
    +
    +        // plugins that are currently initialised
    +        this.initialisedPluginList = {};
    +
    +        this.registerPlugins(this.params.plugins);
             this.createDrawer();
             this.createBackend();
     
             this.isDestroyed = false;
    +        return this;
    +    },
    +
    +    /**
    +     * Add and initialise array of plugins (if plugin.deferInit is falsey)
    +     *
    +     * @param {Array} plugins
    +     */
    +    registerPlugins: function (plugins) {
    +        // first instantiate all the plugins
    +        plugins.forEach(plugin => this.addPlugin(plugin));
    +
    +        // now run the init functions
    +        plugins.forEach(plugin => {
    +            // call init function of the plugin if deferInit is falsey
    +            // in that case you would manually use initPlugins()
    +            if (!plugin.deferInit) {
    +                this.initPlugin(plugin.name);
    +            }
    +        });
    +        this.fireEvent('plugins-registered', plugins);
    +        return this;
    +    },
    +
    +    /**
    +     * Add a plugin object to wavesurfer
    +     *
    +     * @param {Object} plugin object
    +     */
    +    addPlugin: function (plugin) {
    +        if (!plugin.name) {
    +            throw new Error('Plugin does not have a name!');
    +        }
    +        if (!plugin.instance) {
    +            throw new Error(`Plugin ${plugin.name} does not have an instance object!`);
    +        }
    +
    +        // static properties are applied to wavesurfer instance
    +        if (plugin.static) {
    +            Object.keys(plugin.static).forEach(key => {
    +                this[key] = plugin.static[key];
    +            });
    +        }
    +
    +        // default for deferInit is false
    +        plugin.deferInit = plugin.deferInit || false;
    +
    +        // if there is an extends property on the plugin
    +        // iterate over them, try and match them in the
    +        // parentsMap and iteratively create a single parent
    +        let parent = {};
    +        const parentsMap = {
    +            'observer': util.observer,
    +            'drawer': this.Drawer
    +        };
    +        if (plugin.extends) {
    +            plugin.extends.forEach(key => {
    +                if (!parentsMap[key]) {
    +                    throw new Error(`Cannot extend plugin ${plugin.name} with ${key}, the object was not found!`);
    +                }
    +                parent = util.extend({}, parent, parentsMap[key]);
    +            });
    +        }
    +
    +        // create a new instance with the extended plugin instance property
    +        this[plugin.name] = Object.create(util.extend({}, parent, plugin.instance));
    +        this.fireEvent('plugin-added', plugin.name);
    +        return this;
    +    },
    +
    +    /**
    +     * Initialise a plugin
    +     *
    +     * @param {String} plugin name
    +     */
    +    initPlugin: function (name) {
    +        if (!this[name]) {
    +            throw new Error(`Plugin ${name} has not been added yet!`);
    +        }
    +        if (typeof this[name].init !== 'function') {
    +            throw new Error(`Plugin ${name} does not have an init function!`);
    +        }
    +        if (this.initialisedPluginList[name]) {
    +            // destroy any already initialised plugins
    +            this.destroyPlugin(name);
    +        }
    +        // call the init function
    +        this[name].init(this);
    +        // add the plugin name to the list of initialised plugins
    +        this.initialisedPluginList[name] = true;
    +        this.fireEvent('plugin-initialised', name);
    +        return this;
    +    },
    +
    +    /**
    +     * Destroy a plugin
    +     *
    +     * @param {String} plugin name
    +     */
    +    destroyPlugin: function (name) {
    +        if (!this[name]) {
    +            throw new Error(`Plugin ${name} has not been added yet and cannot be destroyed!`);
    +        }
    +        if (!this.initialisedPluginList[name]) {
    +            throw new Error(`Plugin ${name} is not active and cannot be destroyed!`);
    +        }
    +        if (typeof this[name].destroy !== 'function') {
    +            throw new Error(`Plugin ${name} does not have a destroy function!`);
    +        }
    +
    +        this[name].destroy();
    +        delete this.initialisedPluginList[name];
    +        this.fireEvent('plugin-destroyed', name);
    +        return this;
    +    },
    +
    +    /**
    +     * Destroy all initialised plugins
    +     *
    +     * Convenience function to use when wavesurfer is removed
    +     */
    +    destroyAllPlugins: function () {
    +        Object.keys(this.initialisedPluginList).forEach(name => this.destroyPlugin(name));
         },
     
         createDrawer: function () {
             var my = this;
     
    -        this.drawer = Object.create(WaveSurfer.Drawer[this.params.renderer]);
    +        this.drawer = Object.create(this.Drawer);
             this.drawer.init(this.container, this.params);
    +        this.fireEvent('drawer-created', this.drawer);
     
             this.drawer.on('redraw', function () {
                 my.drawBuffer();
    @@ -117,12 +257,13 @@ var WaveSurfer = {
                 this.params.backend = 'MediaElement';
             }
     
    -        if (this.params.backend == 'WebAudio' && !WaveSurfer.WebAudio.supportsWebAudio()) {
    +        if (this.params.backend == 'WebAudio' && !this.backends.WebAudio.supportsWebAudio()) {
                 this.params.backend = 'MediaElement';
             }
     
    -        this.backend = Object.create(WaveSurfer[this.params.backend]);
    +        this.backend = Object.create(this.Backend);
             this.backend.init(this.params);
    +        this.fireEvent('backend-created', this.backend);
     
             this.backend.on('finish', function () { my.fireEvent('finish'); });
             this.backend.on('play', function () { my.fireEvent('play'); });
    @@ -538,6 +679,7 @@ var WaveSurfer = {
          * Remove events, elements and disconnect WebAudio nodes.
          */
         destroy: function () {
    +        this.destroyAllPlugins();
             this.fireEvent('destroy');
             this.cancelAjax();
             this.clearTmpEvents();
    @@ -546,10 +688,11 @@ var WaveSurfer = {
             this.drawer.destroy();
             this.isDestroyed = true;
         }
    -};
    +});
     
     WaveSurfer.create = function (params) {
         var wavesurfer = Object.create(WaveSurfer);
         wavesurfer.init(params);
         return wavesurfer;
     };
    +export default WaveSurfer;
    diff --git a/src/webaudio.js b/src/webaudio.js
    index 1eb42d88d..5ba06775a 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -1,6 +1,6 @@
    -'use strict';
    +import * as util from './util';
     
    -WaveSurfer.WebAudio = {
    +const WebAudio = util.extend({}, util.observer, {
         scriptBufferSize: 256,
         PLAYING_STATE: 0,
         PAUSED_STATE: 1,
    @@ -11,21 +11,21 @@ WaveSurfer.WebAudio = {
         },
     
         getAudioContext: function () {
    -        if (!WaveSurfer.WebAudio.audioContext) {
    -            WaveSurfer.WebAudio.audioContext = new (
    +        if (!this.audioContext) {
    +            this.audioContext = new (
                     window.AudioContext || window.webkitAudioContext
                 );
             }
    -        return WaveSurfer.WebAudio.audioContext;
    +        return this.audioContext;
         },
     
         getOfflineAudioContext: function (sampleRate) {
    -        if (!WaveSurfer.WebAudio.offlineAudioContext) {
    -            WaveSurfer.WebAudio.offlineAudioContext = new (
    +        if (!this.offlineAudioContext) {
    +            this.offlineAudioContext = new (
                     window.OfflineAudioContext || window.webkitOfflineAudioContext
                 )(1, 2, sampleRate);
             }
    -        return WaveSurfer.WebAudio.offlineAudioContext;
    +        return this.offlineAudioContext;
         },
     
         init: function (params) {
    @@ -37,9 +37,9 @@ WaveSurfer.WebAudio = {
             this.scheduledPause = null;
     
             this.states = [
    -            Object.create(WaveSurfer.WebAudio.state.playing),
    -            Object.create(WaveSurfer.WebAudio.state.paused),
    -            Object.create(WaveSurfer.WebAudio.state.finished)
    +            Object.create(WebAudio.state.playing),
    +            Object.create(WebAudio.state.paused),
    +            Object.create(WebAudio.state.finished)
             ];
     
             this.createVolumeNode();
    @@ -382,11 +382,11 @@ WaveSurfer.WebAudio = {
                 this.play();
             }
         }
    -};
    +});
     
    -WaveSurfer.WebAudio.state = {};
    +WebAudio.state = {};
     
    -WaveSurfer.WebAudio.state.playing = {
    +WebAudio.state.playing = {
         init: function () {
             this.addOnAudioProcess();
         },
    @@ -399,7 +399,7 @@ WaveSurfer.WebAudio.state.playing = {
         }
     };
     
    -WaveSurfer.WebAudio.state.paused = {
    +WebAudio.state.paused = {
         init: function () {
             this.removeOnAudioProcess();
         },
    @@ -412,7 +412,7 @@ WaveSurfer.WebAudio.state.paused = {
         }
     };
     
    -WaveSurfer.WebAudio.state.finished = {
    +WebAudio.state.finished = {
         init: function () {
             this.removeOnAudioProcess();
             this.fireEvent('finish');
    @@ -425,4 +425,4 @@ WaveSurfer.WebAudio.state.finished = {
         }
     };
     
    -WaveSurfer.util.extend(WaveSurfer.WebAudio, WaveSurfer.Observer);
    +export default WebAudio;
    diff --git a/webpack.config.babel.js b/webpack.config.babel.js
    new file mode 100644
    index 000000000..af9532108
    --- /dev/null
    +++ b/webpack.config.babel.js
    @@ -0,0 +1,152 @@
    +import webpack from 'webpack';
    +import path from 'path';
    +
    +const pckg = require('./package.json');
    +const time = new Date();
    +const bannerPlugin = new webpack.BannerPlugin(
    +`${pckg.name} ${pckg.version} (${time})
    +${pckg.homepage}
    +@license ${pckg.license}`
    +);
    +
    +// from http://stackoverflow.com/a/34749873
    +/**
    +* Simple is object check.
    +* @param item
    +* @returns {boolean}
    +*/
    +export function isObject(item) {
    +    return (item && typeof item === 'object' && !Array.isArray(item));
    +}
    +
    +/**
    +* Deep merge two objects.
    +* @param target
    +* @param source
    +*/
    +export function mergeDeep(target, source) {
    +    if (isObject(target) && isObject(source)) {
    +        for (const key in source) {
    +            if (isObject(source[key])) {
    +                if (!target[key]) Object.assign(target, { [key]: {} });
    +                mergeDeep(target[key], source[key]);
    +            } else {
    +                Object.assign(target, { [key]: source[key] });
    +            }
    +        }
    +    }
    +    return target;
    +}
    +
    +const config = {
    +    context: __dirname,
    +    devtool: 'source-map',
    +    entry: {
    +        wavesurfer: path.join(__dirname, 'src', 'wavesurfer.js')
    +    },
    +    output: {
    +        path: path.join(__dirname, 'dist'),
    +        filename: '[name].js',
    +        library: 'WaveSurfer',
    +        libraryTarget: 'umd',
    +        umdNamedDefine: true
    +    },
    +    devServer: {
    +        contentBase: [
    +            path.join(__dirname, 'example'),
    +            path.join(__dirname, 'dist')
    +        ],
    +        watchContentBase: true
    +    },
    +    module: {
    +        rules: [
    +            {
    +                test: /\.js$/,
    +                enforce: 'pre',
    +                exclude: /node_modules/,
    +                use: [{
    +                    loader: 'eslint-loader'
    +                }]
    +            }, {
    +                test: /\.js$/,
    +                exclude: /node_modules/,
    +                use: [{
    +                    loader: 'babel-loader',
    +                    options: {
    +                        presets: [
    +                            ['es2015', { modules: false }]
    +                        ]
    +                    }
    +                }]
    +            }
    +        ]
    +    },
    +
    +    plugins: [
    +        bannerPlugin
    +    ],
    +};
    +
    +
    +/**
    +* buildPluginEntry - Description
    +*
    +* @param {Array} plugins Name of plugins in src/plugin
    +*
    +* @returns {object} Entry object { name: nameUrl }
    +*/
    +function buildPluginEntry(plugins) {
    +    const result = {};
    +    plugins.forEach(plugin => result[plugin] = path.join(__dirname, 'src', 'plugin', plugin));
    +    return result;
    +}
    +
    +export default function (options) {
    +
    +    if (options && options.plugins) {
    +        delete config.entry;
    +        mergeDeep(config, {
    +            entry: buildPluginEntry([
    +                'timeline',
    +                'minimap',
    +                'regions',
    +                'spectrogram',
    +                'cursor',
    +                'microphone',
    +                'elan'
    +            ]),
    +            output: {
    +                path: path.join(__dirname, 'dist', 'plugin'),
    +                filename: 'wavesurfer.[name].js',
    +                library: ['WaveSurfer', '[name]']
    +            }
    +        });
    +    }
    +    if (options && options.minify) {
    +        mergeDeep(config, {
    +            plugins: [
    +                new webpack.optimize.UglifyJsPlugin({
    +                    sourceMap: true
    +                }),
    +                bannerPlugin
    +            ]
    +        });
    +
    +        // rename outputs
    +        if (options.plugins) {
    +            mergeDeep(config, {
    +                output: {
    +                    filename: 'wavesurfer.[name].min.js'
    +                }
    +            });
    +        } else {
    +            mergeDeep(config, {
    +                output: {
    +                    filename: '[name].min.js'
    +                }
    +            })
    +        }
    +    }
    +
    +    return config
    +}
    
    From 86e0965820a0759fba402e23af40dc3b3eff79c4 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Thu, 24 Nov 2016 10:31:09 +0100
    Subject: [PATCH 002/573] Enabled eslint indent rule (#870)
    
    * added .editorconfig
    
    * babel and webpack configuration
    
    * updating dependencies for webpack and babel, removed grunt, updated scripts property
    
    * moved plugins file to src directory
    
    * refactored utils as es6 modules
    
    * removed use strict statement
    
    * import backends and drawers as es6 modules and cache them in the wavesurfer constructor object
    
    * es6 imports and exports
    
    * Removed AudioElement backward compatibility
    
    * updated karma to run with webpack
    
    * added plugin system to the core library
    
    * moved the style function to the util library, backward compatibility reference
    
    * updated references to assets in the example html
    
    * removed Gruntfile.js
    
    * plugin boilerplate for cursor, elan, microphone, minimap and timeline plugins
    
    * formatting for cursor, elan, microphone, minimap and timeline plugins
    
    * caching of even handlers in cursor plugin, added destroy method
    
    * added drawer-created and backend-created events to the core module
    
    * minimap destroy function, onCreatedDrawer callback for correct timing
    
    * replaced tabs with spaces in elan and minimap plugins
    
    * timeline _onReady and _onRedraw event callbacks for correct timing
    
    * cursor _onDrawerCreated for correct timing
    
    * microphone _onBackendCreated callback for correct timing
    
    * region plugin: moving Region definition above the Regions definition
    
    * region plugin: adding boilerplate code, moving static methods into the proper object
    
    * region plugin: updated variable references
    
    * region plugin: formatting and indentation
    
    * region plugin: _onCreatedBackend calllback for proper timing, updated variable references
    
    * spectrogram plugin: move FFT definition to the top
    
    * plugin methods in the core library return this so we can use chaining
    
    * minimap plugin: rename created-drawer event to drawer-created event
    
    * cursor plugin: fixed wrong reference to wavesurfer drawer
    
    * elan plugin: added extends observer property
    
    * spectrogram plugin: added plugin boilerplate
    
    * spectrogram plugin: indentation
    
    * wavesurfer init function returns this to support chaining
    
    * elan plugin: added destroy function
    
    * spectrogram plugin: added _onReady callback for proper timing, fixed linting issues, updated remaining wrong variable references
    
    * .eslint config
    
    * replaced initRegions with generic initPlugin('regions') in regions plugin
    
    * microphone extends observer
    
    * update public-facing (in html) example code with new api
    
    * update example code with new api
    
    * added cursor plugin example
    
    * update public-facing (in html) example code with new api
    
    * added plugin system example
    
    * region plugin: uses ready event as init event, wavesurfer.enableDragSelection does not reset region plugin
    
    * comments in core module
    
    * removed webpack-dev-server --env.plugins script
    
    * umdNamedDefine property in webpack babel, so amd modules are named
    
    * updated editorconfig for 4 spaces indentation
    
    * updated .travis.yml to use the new build system
    
    * annotation example, removed legacy js code
    
    * removed debugging statement and empty variable definition
    
    * microphone plugin: removed wrong static function
    
    * uniform indentation with 4 spaces
    
    * Updated download links on the example pages, added download attribute to link, fixed wrong download url on microphone page
    
    * tests for the plugin api
    
    * added jasmine core, missing dev dependency
    
    * test index now just calls all files with .spec.js in that dir
    
    * added node_js version in .travis.yml
    
    * tests files are queried from karma.config.js manually, not by requiring them dynamically from an index.js
    
    * downloading fresh chrome browser before travis testing
    
    * removed chrome installing in travis config, only node v 4.2
    
    * removed invalid outputPath option from webpack config
    
    * enabled eslint indent rule
    
    * fixed code for eslint indent rule
    ---
     .eslintrc.js              |  2 +-
     src/drawer.multicanvas.js |  2 +-
     src/plugin/timeline.js    | 30 +++++++++++++++---------------
     src/util/extend.js        |  2 +-
     src/wavesurfer.js         | 14 ++++++--------
     5 files changed, 24 insertions(+), 26 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index fec02b541..e50bf4a75 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -75,7 +75,7 @@ module.exports = {
             "id-blacklist": "error",
             "id-length": "off",
             "id-match": "error",
    -        "indent": "off",
    +        "indent": [2, 4, { "SwitchCase": 1 }],
             "init-declarations": "off",
             "jsx-quotes": "error",
             "key-spacing": "off",
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index eaea70502..986f2de5d 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -65,7 +65,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -     addCanvas: function () {
    +    addCanvas: function () {
             var entry = {},
                 leftOffset = this.maxCanvasElementWidth * this.canvases.length;
     
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index c20d7b309..9666e9753 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -114,8 +114,8 @@ export default function(params = {}) {
                     this.removeOldCanvases();
     
                     var totalWidth = Math.round(this.drawer.wrapper.scrollWidth),
    -                requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth),
    -                canvas;
    +                    requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth),
    +                    canvas;
     
                     for (var i = 0; i < requiredCanvases; i++) {
                         canvas = this.wrapper.appendChild(document.createElement('canvas'));
    @@ -137,7 +137,7 @@ export default function(params = {}) {
                     var requiredCanvases = this.canvases.length;
                     for (var i = 0; i < requiredCanvases; i++) {
                         var canvas = this.canvases[i],
    -                    canvasWidth = this.maxCanvasElementWidth;
    +                        canvasWidth = this.maxCanvasElementWidth;
     
                         if (i === requiredCanvases - 1) {
                             canvasWidth = this.drawer.wrapper.scrollWidth - (this.maxCanvasElementWidth * (requiredCanvases - 1));
    @@ -153,9 +153,9 @@ export default function(params = {}) {
     
                 drawTimeCanvases: function() {
                     var backend = this.wavesurfer.backend,
    -                wsParams = this.wavesurfer.params,
    -                duration = backend.getDuration(),
    -                self = this;
    +                    wsParams = this.wavesurfer.params,
    +                    duration = backend.getDuration(),
    +                    self = this;
     
                     if (wsParams.fillParent && !wsParams.scrollParent) {
                         var width = this.drawer.getWidth();
    @@ -167,16 +167,16 @@ export default function(params = {}) {
                     if (duration <= 0) { return; }
     
                     var curPixel = 0,
    -                curSeconds = 0,
    -                totalSeconds = parseInt(duration, 10) + 1,
    -                formatTime = function(seconds) {
    +                    curSeconds = 0,
    +                    totalSeconds = parseInt(duration, 10) + 1;
    +                var formatTime = function(seconds) {
                         if (typeof self.formatTimeCallback === 'function') {
                             return self.formatTimeCallback(seconds);
                         }
     
                         if (seconds/60 > 1) {
                             var minutes = parseInt(seconds / 60),
    -                        seconds = parseInt(seconds % 60);
    +                            seconds = parseInt(seconds % 60);
                             seconds = (seconds < 10) ? '0' + seconds : seconds;
                             return '' + minutes + ':' + seconds;
                         } else {
    @@ -207,8 +207,8 @@ export default function(params = {}) {
                     secondaryLabelInterval = this.secondaryLabelInterval || secondaryLabelInterval;
     
                     var height1 = this.height - 4,
    -                height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4,
    -                fontSize = this.fontSize * wsParams.pixelRatio;
    +                    height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4,
    +                    fontSize = this.fontSize * wsParams.pixelRatio;
     
                     for (var i = 0; i < totalSeconds/timeInterval; i++) {
                         if (i % primaryLabelInterval == 0) {
    @@ -248,7 +248,7 @@ export default function(params = {}) {
                 fillRect: function (x, y, width, height) {
                     for (var i in this.canvases) {
                         var canvas = this.canvases[i],
    -                    leftOffset = i * this.maxCanvasWidth;
    +                        leftOffset = i * this.maxCanvasWidth;
     
                         var intersection = {
                             x1: Math.max(x, i * this.maxCanvasWidth),
    @@ -270,11 +270,11 @@ export default function(params = {}) {
     
                 fillText: function (text, x, y) {
                     var textWidth,
    -                xOffset = 0;
    +                    xOffset = 0;
     
                     for (var i in this.canvases) {
                         var context = this.canvases[i].getContext('2d'),
    -                    canvasWidth = context.canvas.width;
    +                        canvasWidth = context.canvas.width;
     
                         if (xOffset > x + textWidth) {
                             break;
    diff --git a/src/util/extend.js b/src/util/extend.js
    index 9601cc2dc..5cfb17585 100644
    --- a/src/util/extend.js
    +++ b/src/util/extend.js
    @@ -6,7 +6,7 @@
       *
       * @returns {type} Description
       */
    - export default function extend (dest, ...sources) {
    +export default function extend (dest, ...sources) {
         sources.forEach(source => {
             Object.keys(source).forEach(key => {
                 dest[key] = source[key];
    diff --git a/src/wavesurfer.js b/src/wavesurfer.js
    index 8a59ce96f..78f5edf1e 100755
    --- a/src/wavesurfer.js
    +++ b/src/wavesurfer.js
    @@ -1,12 +1,10 @@
    - import * as util from './util';
    +import * as util from './util';
    +import Canvas from './drawer.canvas';
    +import MultiCanvas from './drawer.multicanvas';
    +import WebAudio from './webaudio';
    +import MediaElement from './mediaelement';
     
    - import Canvas from './drawer.canvas';
    - import MultiCanvas from './drawer.multicanvas';
    -
    - import WebAudio from './webaudio';
    - import MediaElement from './mediaelement';
    -
    - const WaveSurfer = util.extend({}, util.observer, { util }, {
    +const WaveSurfer = util.extend({}, util.observer, { util }, {
         defaultParams: {
             height        : 128,
             waveColor     : '#999',
    
    From 6a3756c2f909a79414b929d26bf11dfc7e8a3372 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 6 Dec 2016 19:48:39 +0100
    Subject: [PATCH 003/573] enabled eslint no-redeclare rule and fixed code
     (#881)
    
    ---
     .eslintrc.js              |  2 +-
     src/drawer.canvas.js      |  6 +++---
     src/drawer.multicanvas.js |  6 +++---
     src/plugin/spectrogram.js | 10 +++++-----
     src/plugin/timeline.js    | 29 ++++++++++++++---------------
     5 files changed, 26 insertions(+), 27 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index e50bf4a75..79fff0f8e 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -106,7 +106,7 @@ module.exports = {
             "newline-after-var": "off",
             "newline-before-return": "off",
             "newline-per-chained-call": "off",
    -        "no-redeclare": "off",
    +        "no-redeclare": "error",
             "no-unused-vars": "off",
             "no-console": "off",
             "no-alert": "error",
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 7a90c2f65..d39fd7282 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -178,9 +178,9 @@ export default util.extend({}, drawer, {
     
                 // Draw the bottom edge going backwards, to make a single
                 // closed hull to fill.
    -            for (var i = length - 1; i >= 0; i--) {
    -                var h = Math.round(peaks[2 * i + 1] / absmax * halfH);
    -                cc.lineTo(i * scale + $, halfH - h + offsetY);
    +            for (var j = length - 1; j >= 0; j--) {
    +                var k = Math.round(peaks[2 * j + 1] / absmax * halfH);
    +                cc.lineTo(j * scale + $, halfH - k + offsetY);
                 }
     
                 cc.closePath();
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 986f2de5d..52d354c30 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -256,9 +256,9 @@ export default util.extend({}, drawer, {
     
             // Draw the bottom edge going backwards, to make a single
             // closed hull to fill.
    -        for (var i = last - 1; i >= first; i--) {
    -            var h = Math.round(peaks[2 * i + 1] / absmax * halfH);
    -            ctx.lineTo((i - first) * scale + this.halfPixel, halfH - h + offsetY);
    +        for (var j = last - 1; j >= first; j--) {
    +            var k = Math.round(peaks[2 * j + 1] / absmax * halfH);
    +            ctx.lineTo((j - first) * scale + this.halfPixel, halfH - k + offsetY);
             }
     
             ctx.closePath();
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    index 5af43793d..15c25b488 100644
    --- a/src/plugin/spectrogram.js
    +++ b/src/plugin/spectrogram.js
    @@ -1,7 +1,7 @@
     /**
      * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js
      */
    -/* eslint-disable complexity */
    +/* eslint-disable complexity, no-redeclare */
     const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
         this.bufferSize = bufferSize;
         this.sampleRate = sampleRate;
    @@ -177,7 +177,7 @@ const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
             return spectrum;
         };
     };
    -/* eslint-enable complexity */
    +/* eslint-enable complexity, no-redeclare */
     
     /**
     * spectrogram plugin
    @@ -404,7 +404,7 @@ export default function(params = {}) {
                     this.wrapper.scrollLeft = e.target.scrollLeft;
                 },
     
    -            resample: function(oldMatrix, columnsNumber) {
    +            resample: function(oldMatrix) {
                     var columnsNumber = this.width;
                     var newMatrix = [];
     
    @@ -438,8 +438,8 @@ export default function(params = {}) {
     
                         var intColumn = new Uint8Array(oldMatrix[0].length);
     
    -                    for (var k = 0; k < oldMatrix[0].length; k++) {
    -                        intColumn[k] = column[k];
    +                    for (var m = 0; m < oldMatrix[0].length; m++) {
    +                        intColumn[m] = column[m];
                         }
     
                         newMatrix.push(intColumn);
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index 9666e9753..78702ca71 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -175,8 +175,8 @@ export default function(params = {}) {
                         }
     
                         if (seconds/60 > 1) {
    -                        var minutes = parseInt(seconds / 60),
    -                            seconds = parseInt(seconds % 60);
    +                        var minutes = parseInt(seconds / 60);
    +                        seconds = parseInt(seconds % 60);
                             seconds = (seconds < 10) ? '0' + seconds : seconds;
                             return '' + minutes + ':' + seconds;
                         } else {
    @@ -184,22 +184,21 @@ export default function(params = {}) {
                         }
                     };
     
    +                var timeInterval = 60;
    +                var primaryLabelInterval = 4;
    +                var secondaryLabelInterval = 2;
                     if (pixelsPerSecond * 1 >= 25) {
    -                    var timeInterval = 1;
    -                    var primaryLabelInterval = 10;
    -                    var secondaryLabelInterval = 5;
    +                    timeInterval = 1;
    +                    primaryLabelInterval = 10;
    +                    secondaryLabelInterval = 5;
                     } else if (pixelsPerSecond * 5 >= 25) {
    -                    var timeInterval = 5;
    -                    var primaryLabelInterval = 6;
    -                    var secondaryLabelInterval = 2;
    +                    timeInterval = 5;
    +                    primaryLabelInterval = 6;
    +                    secondaryLabelInterval = 2;
                     } else if (pixelsPerSecond * 15 >= 25) {
    -                    var timeInterval = 15;
    -                    var primaryLabelInterval = 4;
    -                    var secondaryLabelInterval = 2;
    -                } else {
    -                    var timeInterval = 60;
    -                    var primaryLabelInterval = 4;
    -                    var secondaryLabelInterval = 2;
    +                    timeInterval = 15;
    +                    primaryLabelInterval = 4;
    +                    secondaryLabelInterval = 2;
                     }
     
                     timeInterval = this.timeInterval || timeInterval;
    
    From 6c0bbe92892693d9c29a443d0560c7a891a955fd Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 6 Dec 2016 19:49:26 +0100
    Subject: [PATCH 004/573] enabled eslint no-multi-spaces rule and fixed code
     (#880)
    
    ---
     .eslintrc.js              | 2 +-
     src/plugin/minimap.js     | 8 ++++----
     src/plugin/spectrogram.js | 8 ++++----
     3 files changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 79fff0f8e..59f05a4bd 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -145,7 +145,7 @@ module.exports = {
             "no-magic-numbers": "off",
             "no-mixed-operators": "off",
             "no-mixed-requires": "error",
    -        "no-multi-spaces": "off",
    +        "no-multi-spaces": "error",
             "no-multi-str": "error",
             "no-multiple-empty-lines": "off",
             "no-native-reassign": "error",
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    index dc37610d3..8dc7954bb 100644
    --- a/src/plugin/minimap.js
    +++ b/src/plugin/minimap.js
    @@ -108,7 +108,7 @@ export default function(params = {}) {
                     this.wavesurfer.renderers.Canvas.createElements.call(this);
     
                     if (this.params.showOverview) {
    -                    this.overviewRegion =  this.style(document.createElement('overview'), {
    +                    this.overviewRegion = this.style(document.createElement('overview'), {
                             height: (this.wrapper.offsetHeight - (this.params.overviewBorderSize * 2)) + 'px',
                             width: '0px',
                             display: 'block',
    @@ -153,7 +153,7 @@ export default function(params = {}) {
                         this.wavesurfer.on('scroll', this._onSeek);
     
                         this.wavesurfer.drawer.wrapper.addEventListener('mouseover', function(event) {
    -                        if (my.draggingOverview)  {
    +                        if (my.draggingOverview) {
                                 my.draggingOverview = false;
                             }
                         });
    @@ -173,7 +173,7 @@ export default function(params = {}) {
                     };
     
                     this.on('click', (function (e, position) {
    -                    if (seek)  {
    +                    if (seek) {
                             this.progress(position);
                             this.wavesurfer.seekAndCenter(position);
                         } else {
    @@ -199,7 +199,7 @@ export default function(params = {}) {
                             if (positionMouseDown.clientX - event.clientX === 0 && positionMouseDown.clientX - event.clientX === 0) {
                                 seek = true;
                                 my.draggingOverview = false;
    -                        } else if (my.draggingOverview)  {
    +                        } else if (my.draggingOverview) {
                                 seek = false;
                                 my.draggingOverview = false;
                             }
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    index 15c25b488..e4e7fea4f 100644
    --- a/src/plugin/spectrogram.js
    +++ b/src/plugin/spectrogram.js
    @@ -5,15 +5,15 @@
     const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
         this.bufferSize = bufferSize;
         this.sampleRate = sampleRate;
    -    this.bandwidth  = 2 / bufferSize * sampleRate / 2;
    +    this.bandwidth = 2 / bufferSize * sampleRate / 2;
     
         this.sinTable = new Float32Array(bufferSize);
         this.cosTable = new Float32Array(bufferSize);
         this.windowValues = new Float32Array(bufferSize);
         this.reverseTable = new Uint32Array(bufferSize);
     
    -    this.peakBand   = 0;
    -    this.peak       = 0;
    +    this.peakBand = 0;
    +    this.peak = 0;
     
         switch (windowFunc) {
             case 'bartlett' :
    @@ -342,7 +342,7 @@ export default function(params = {}) {
                     for (var i = 0; i < pixels.length; i++) {
                         for (var j = 0; j < pixels[i].length; j++) {
                             var colorValue = 255 - pixels[i][j];
    -                        my.spectrCc.fillStyle = 'rgb(' + colorValue + ', '  + colorValue + ', ' + colorValue + ')';
    +                        my.spectrCc.fillStyle = 'rgb(' + colorValue + ', ' + colorValue + ', ' + colorValue + ')';
                             my.spectrCc.fillRect(i, height - j * heightFactor, 1, heightFactor);
                         }
                     }
    
    From 54de87a8c55bd08485421d7548da7d91aaeb24cf Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 6 Dec 2016 19:51:42 +0100
    Subject: [PATCH 005/573] enabled eslint no-invalid-this rule and fixed code
     (#879)
    
    ---
     .eslintrc.js       |  2 +-
     src/plugin/elan.js | 59 ++++++++++++++++++++--------------------------
     2 files changed, 27 insertions(+), 34 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 59f05a4bd..58ba91890 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -135,7 +135,7 @@ module.exports = {
                 "error",
                 "functions"
             ],
    -        "no-invalid-this": "off",
    +        "no-invalid-this": "error",
             "no-iterator": "error",
             "no-label-var": "error",
             "no-labels": "error",
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    index 47a605ee0..4b68fec1c 100644
    --- a/src/plugin/elan.js
    +++ b/src/plugin/elan.js
    @@ -85,39 +85,32 @@ export default function(params = {}) {
                         timeOrder[slot.getAttribute('TIME_SLOT_ID')] = value;
                     });
     
    -                data.tiers = _map.call(xml.querySelectorAll('TIER'), function (tier) {
    -                    return {
    -                        id: tier.getAttribute('TIER_ID'),
    -                        linguisticTypeRef: tier.getAttribute('LINGUISTIC_TYPE_REF'),
    -                        defaultLocale: tier.getAttribute('DEFAULT_LOCALE'),
    -                        annotations: _map.call(
    -                            tier.querySelectorAll('REF_ANNOTATION, ALIGNABLE_ANNOTATION'),
    -                            function (node) {
    -                                var annot = {
    -                                    type: node.nodeName,
    -                                    id: node.getAttribute('ANNOTATION_ID'),
    -                                    ref: node.getAttribute('ANNOTATION_REF'),
    -                                    value: node.querySelector('ANNOTATION_VALUE')
    -                                    .textContent.trim()
    -                                };
    -
    -                                if (this.Types.ALIGNABLE_ANNOTATION == annot.type) {
    -                                    // Add start & end to alignable annotation
    -                                    annot.start = timeOrder[node.getAttribute('TIME_SLOT_REF1')];
    -                                    annot.end = timeOrder[node.getAttribute('TIME_SLOT_REF2')];
    -
    -                                    // Add to the list of alignable annotations
    -                                    data.alignableAnnotations.push(annot);
    -                                }
    -
    -                                // Additionally, put into the flat map of all annotations
    -                                data.annotations[annot.id] = annot;
    -
    -                                return annot;
    -                            }, this
    -                        )
    -                    };
    -                }, this);
    +                data.tiers = _map.call(xml.querySelectorAll('TIER'), tier => ({
    +                    id: tier.getAttribute('TIER_ID'),
    +                    linguisticTypeRef: tier.getAttribute('LINGUISTIC_TYPE_REF'),
    +                    defaultLocale: tier.getAttribute('DEFAULT_LOCALE'),
    +                    annotations: _map.call(
    +                        tier.querySelectorAll('REF_ANNOTATION, ALIGNABLE_ANNOTATION'), node => {
    +                            var annot = {
    +                                type: node.nodeName,
    +                                id: node.getAttribute('ANNOTATION_ID'),
    +                                ref: node.getAttribute('ANNOTATION_REF'),
    +                                value: node.querySelector('ANNOTATION_VALUE')
    +                                .textContent.trim()
    +                            };
    +                            if (this.Types.ALIGNABLE_ANNOTATION == annot.type) {
    +                                // Add start & end to alignable annotation
    +                                annot.start = timeOrder[node.getAttribute('TIME_SLOT_REF1')];
    +                                annot.end = timeOrder[node.getAttribute('TIME_SLOT_REF2')];
    +                                // Add to the list of alignable annotations
    +                                data.alignableAnnotations.push(annot);
    +                            }
    +                            // Additionally, put into the flat map of all annotations
    +                            data.annotations[annot.id] = annot;
    +                            return annot;
    +                        }
    +                    )
    +                }));
     
                     // Create JavaScript references between annotations
                     data.tiers.forEach(function (tier) {
    
    From 676bb3170e0164d02ce15ff4b63b5ec32775d1ca Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 6 Dec 2016 19:52:37 +0100
    Subject: [PATCH 006/573] enabled eslint no-else-return rule and fixed code
     (#877)
    
    ---
     .eslintrc.js              | 2 +-
     src/drawer.canvas.js      | 6 ++----
     src/drawer.multicanvas.js | 6 ++----
     src/plugin/timeline.js    | 3 +--
     4 files changed, 6 insertions(+), 11 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 58ba91890..7ec4b86d0 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -118,7 +118,7 @@ module.exports = {
             "no-continue": "error",
             "no-div-regex": "error",
             "no-duplicate-imports": "error",
    -        "no-else-return": "off",
    +        "no-else-return": "error",
             "no-empty-function": "off",
             "no-eq-null": "off",
             "no-eval": "error",
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index d39fd7282..1dc3bd2a5 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -72,9 +72,8 @@ export default util.extend({}, drawer, {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawBars, this);
                     return;
    -            } else {
    -                peaks = channels[0];
                 }
    +            peaks = channels[0];
             }
     
             // Bar wave draws the bottom only as a reflection of the top,
    @@ -125,9 +124,8 @@ export default util.extend({}, drawer, {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawWave, this);
                     return;
    -            } else {
    -                peaks = channels[0];
                 }
    +            peaks = channels[0];
             }
     
             // Support arrays without negative peaks
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 52d354c30..81fe290b7 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -145,9 +145,8 @@ export default util.extend({}, drawer, {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawBars, this);
                     return;
    -            } else {
    -                peaks = channels[0];
                 }
    +            peaks = channels[0];
             }
     
             // Bar wave draws the bottom only as a reflection of the top,
    @@ -188,9 +187,8 @@ export default util.extend({}, drawer, {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawWave, this);
                     return;
    -            } else {
    -                peaks = channels[0];
                 }
    +            peaks = channels[0];
             }
     
             // Support arrays without negative peaks
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index 78702ca71..daf703835 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -179,9 +179,8 @@ export default function(params = {}) {
                             seconds = parseInt(seconds % 60);
                             seconds = (seconds < 10) ? '0' + seconds : seconds;
                             return '' + minutes + ':' + seconds;
    -                    } else {
    -                        return seconds;
                         }
    +                    return seconds;
                     };
     
                     var timeInterval = 60;
    
    From 9a397d02e0c22c70827909c05a1a345facb2fe77 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 6 Dec 2016 20:39:55 +0100
    Subject: [PATCH 007/573] enabled eslint key-word-spacing rule and fixed code
     (#876)
    
    ---
     .eslintrc.js          | 2 +-
     src/plugin/minimap.js | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 7ec4b86d0..75c5d2152 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -80,7 +80,7 @@ module.exports = {
             "jsx-quotes": "error",
             "key-spacing": "off",
             "keyword-spacing": [
    -            "off",
    +            "error",
                 {
                     "after": true,
                     "before": true
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    index 8dc7954bb..85722c5f4 100644
    --- a/src/plugin/minimap.js
    +++ b/src/plugin/minimap.js
    @@ -190,7 +190,7 @@ export default function(params = {}) {
                         });
     
                         this.wrapper.addEventListener('mousemove', function(event) {
    -                        if(my.draggingOverview) {
    +                        if (my.draggingOverview) {
                                 my.moveOverviewRegion(event.clientX - my.container.getBoundingClientRect().left - relativePositionX);
                             }
                         });
    
    From 4d2c240aec39836d4e61942942e63893f360e764 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Fri, 9 Dec 2016 17:51:58 +0100
    Subject: [PATCH 008/573] enabled eslint no-extra-bind rule and fixed code
     (#878)
    
    ---
     .eslintrc.js    | 2 +-
     src/webaudio.js | 4 +---
     2 files changed, 2 insertions(+), 4 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 75c5d2152..80b42fa5f 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -123,7 +123,7 @@ module.exports = {
             "no-eq-null": "off",
             "no-eval": "error",
             "no-extend-native": "error",
    -        "no-extra-bind": "off",
    +        "no-extra-bind": "error",
             "no-extra-label": "error",
             "no-extra-parens": "off",
             "no-floating-decimal": "error",
    diff --git a/src/webaudio.js b/src/webaudio.js
    index 5ba06775a..a6589cfda 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -170,9 +170,7 @@ const WebAudio = util.extend({}, util.observer, {
             if (!this.offlineAc) {
                 this.offlineAc = this.getOfflineAudioContext(this.ac ? this.ac.sampleRate : 44100);
             }
    -        this.offlineAc.decodeAudioData(arraybuffer, (function (data) {
    -            callback(data);
    -        }).bind(this), errback);
    +        this.offlineAc.decodeAudioData(arraybuffer, data => callback(data), errback);
         },
     
         /**
    
    From 1ac4b4582200c1e132045643966462ec22c4c1b1 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Sun, 11 Dec 2016 10:11:19 +0100
    Subject: [PATCH 009/573] Next: Use ES6 arrow functions where possible and
     enable eslint prefer-arrow-callback option (#885)
    
    * enabled eslint prefer-arrow-callback, fixed code and generally tried to use arrow function for simpler code where possible, replaced manual aliases to this and bind(this)
    
    * removed legacy this aliases and other remaining old code
    ---
     .eslintrc.js              |   2 +-
     src/drawer.canvas.js      |  14 ++--
     src/drawer.js             |  16 ++--
     src/drawer.multicanvas.js |   6 +-
     src/mediaelement.js       |  32 +++-----
     src/plugin/cursor.js      |   2 -
     src/plugin/elan.js        |  63 +++++++-------
     src/plugin/microphone.js  |  18 ++--
     src/plugin/minimap.js     |  78 +++++++++---------
     src/plugin/regions.js     | 169 ++++++++++++++++++--------------------
     src/plugin/spectrogram.js |  19 ++---
     src/plugin/timeline.js    |   7 +-
     src/util/ajax.js          |   8 +-
     src/util/observer.js      |  11 ++-
     src/util/style.js         |   2 +-
     src/wavesurfer.js         | 105 ++++++++++-------------
     src/webaudio.js           |  26 +++---
     17 files changed, 258 insertions(+), 320 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 80b42fa5f..68e602049 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -210,7 +210,7 @@ module.exports = {
             "operator-assignment": "off",
             "operator-linebreak": "off",
             "padded-blocks": "off",
    -        "prefer-arrow-callback": "off",
    +        "prefer-arrow-callback": "error",
             "prefer-const": "error",
             "prefer-numeric-literals": "error",
             "prefer-reflect": "off",
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 1dc3bd2a5..39ad61c7b 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -78,9 +78,9 @@ export default util.extend({}, drawer, {
     
             // Bar wave draws the bottom only as a reflection of the top,
             // so we don't need negative values
    -        var hasMinVals = [].some.call(peaks, function (val) { return val < 0; });
    +        var hasMinVals = [].some.call(peaks, val => val < 0);
             if (hasMinVals) {
    -            peaks = [].filter.call(peaks, function (_, index) { return index % 2 == 0; });
    +            peaks = [].filter.call(peaks, (_, index) => index % 2 == 0);
             }
     
             // A half-pixel offset makes lines crisp
    @@ -106,14 +106,14 @@ export default util.extend({}, drawer, {
                 this.progressCc.fillStyle = this.params.progressColor;
             }
     
    -        [ this.waveCc, this.progressCc ].forEach(function (cc) {
    +        [ this.waveCc, this.progressCc ].forEach(cc => {
                 if (!cc) { return; }
     
                 for (var i = 0; i < width; i += step) {
                     var h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH);
                     cc.fillRect(i + $, halfH - h + offsetY, bar + $, h * 2);
                 }
    -        }, this);
    +        });
         },
     
         drawWave: function (peaks, channelIndex) {
    @@ -129,7 +129,7 @@ export default util.extend({}, drawer, {
             }
     
             // Support arrays without negative peaks
    -        var hasMinValues = [].some.call(peaks, function (val) { return val < 0; });
    +        var hasMinValues = [].some.call(peaks, val => val < 0);
             if (!hasMinValues) {
                 var reflectedPeaks = [];
                 for (var i = 0, len = peaks.length; i < len; i++) {
    @@ -163,7 +163,7 @@ export default util.extend({}, drawer, {
                 this.progressCc.fillStyle = this.params.progressColor;
             }
     
    -        [ this.waveCc, this.progressCc ].forEach(function (cc) {
    +        [ this.waveCc, this.progressCc ].forEach(cc => {
                 if (!cc) { return; }
     
                 cc.beginPath();
    @@ -186,7 +186,7 @@ export default util.extend({}, drawer, {
     
                 // Always draw a median line
                 cc.fillRect(0, halfH + offsetY - $, this.width, $);
    -        }, this);
    +        });
         },
     
         updateProgress: function (progress) {
    diff --git a/src/drawer.js b/src/drawer.js
    index 8df62c1df..e486c2ca4 100644
    --- a/src/drawer.js
    +++ b/src/drawer.js
    @@ -64,27 +64,23 @@ export default util.extend({}, util.observer, {
         },
     
         setupWrapperEvents: function () {
    -        var my = this;
    -
    -        this.wrapper.addEventListener('click', function (e) {
    -            var scrollbarHeight = my.wrapper.offsetHeight - my.wrapper.clientHeight;
    +        this.wrapper.addEventListener('click', e => {
    +            var scrollbarHeight = this.wrapper.offsetHeight - this.wrapper.clientHeight;
                 if (scrollbarHeight != 0) {
                     // scrollbar is visible.  Check if click was on it
    -                var bbox = my.wrapper.getBoundingClientRect();
    +                var bbox = this.wrapper.getBoundingClientRect();
                     if (e.clientY >= bbox.bottom - scrollbarHeight) {
                         // ignore mousedown as it was on the scrollbar
                         return;
                     }
                 }
     
    -            if (my.params.interact) {
    -                my.fireEvent('click', e, my.handleEvent(e));
    +            if (this.params.interact) {
    +                this.fireEvent('click', e, this.handleEvent(e));
                 }
             });
     
    -        this.wrapper.addEventListener('scroll', function (e) {
    -            my.fireEvent('scroll', e);
    -        });
    +        this.wrapper.addEventListener('scroll', e => this.fireEvent('scroll', e));
         },
     
         drawPeaks: function (peaks, length) {
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 81fe290b7..0e362c09f 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -151,9 +151,9 @@ export default util.extend({}, drawer, {
     
             // Bar wave draws the bottom only as a reflection of the top,
             // so we don't need negative values
    -        var hasMinVals = [].some.call(peaks, function (val) { return val < 0; });
    +        var hasMinVals = [].some.call(peaks, val => val < 0);
             if (hasMinVals) {
    -            peaks = [].filter.call(peaks, function (_, index) { return index % 2 == 0; });
    +            peaks = [].filter.call(peaks, (_, index) => index % 2 == 0);
             }
     
             // A half-pixel offset makes lines crisp
    @@ -192,7 +192,7 @@ export default util.extend({}, drawer, {
             }
     
             // Support arrays without negative peaks
    -        var hasMinValues = [].some.call(peaks, function (val) { return val < 0; });
    +        var hasMinValues = [].some.call(peaks, val => val < 0);
             if (!hasMinValues) {
                 var reflectedPeaks = [];
                 for (var i = 0, len = peaks.length; i < len; i++) {
    diff --git a/src/mediaelement.js b/src/mediaelement.js
    index 15caf6fbc..9941f6b45 100755
    --- a/src/mediaelement.js
    +++ b/src/mediaelement.js
    @@ -26,13 +26,12 @@ export default util.extend({}, webaudio, {
          * Create a timer to provide a more precise `audioprocess' event.
          */
         createTimer: function () {
    -        var my = this;
             var playing = false;
     
    -        var onAudioProcess = function () {
    -            if (my.isPaused()) { return; }
    +        var onAudioProcess = () => {
    +            if (this.isPaused()) { return; }
     
    -            my.fireEvent('audioprocess', my.getCurrentTime());
    +            this.fireEvent('audioprocess', this.getCurrentTime());
     
                 // Call again in the next frame
                 var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
    @@ -51,8 +50,6 @@ export default util.extend({}, webaudio, {
          *  @param  {String}        preload     HTML 5 preload attribute value
          */
         load: function (url, container, peaks, preload) {
    -        var my = this;
    -
             var media = document.createElement(this.mediaType);
             media.controls = this.params.mediaControls;
             media.autoplay = this.params.autoplay || false;
    @@ -75,8 +72,6 @@ export default util.extend({}, webaudio, {
          *  @param  {Array}         peaks   array of peak data
          */
         loadElt: function (elt, peaks) {
    -        var my = this;
    -
             var media = elt;
             media.controls = this.params.mediaControls;
             media.autoplay = this.params.autoplay || false;
    @@ -92,22 +87,20 @@ export default util.extend({}, webaudio, {
          *  @private
          */
         _load: function (media, peaks) {
    -        var my = this;
    -
             // load must be called manually on iOS, otherwise peaks won't draw
             // until a user interaction triggers load --> 'ready' event
             media.load();
     
    -        media.addEventListener('error', function () {
    -            my.fireEvent('error', 'Error loading media element');
    +        media.addEventListener('error', () => {
    +            this.fireEvent('error', 'Error loading media element');
             });
     
    -        media.addEventListener('canplay', function () {
    -            my.fireEvent('canplay');
    +        media.addEventListener('canplay', () => {
    +            this.fireEvent('canplay');
             });
     
    -        media.addEventListener('ended', function () {
    -            my.fireEvent('finish');
    +        media.addEventListener('ended', () => {
    +            this.fireEvent('finish');
             });
     
             this.media = media;
    @@ -177,11 +170,10 @@ export default util.extend({}, webaudio, {
         },
     
         setPlayEnd: function (end) {
    -        var my = this;
    -        this.onPlayEnd = function (time) {
    +        this.onPlayEnd = time => {
                 if (time >= end) {
    -                my.pause();
    -                my.seekTo(end);
    +                this.pause();
    +                this.seekTo(end);
                 }
             };
             this.on('audioprocess', this.onPlayEnd);
    diff --git a/src/plugin/cursor.js b/src/plugin/cursor.js
    index d5d6f3792..905a953e2 100644
    --- a/src/plugin/cursor.js
    +++ b/src/plugin/cursor.js
    @@ -17,8 +17,6 @@ export default function(params) {
             extends: ['observer'],
             instance: {
                 init: function (wavesurfer) {
    -                var my = this;
    -
                     this.wavesurfer = wavesurfer;
                     this._onDrawerCreated = () => {
                         this.drawer = this.wavesurfer.drawer;
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    index 4b68fec1c..97d734ef9 100644
    --- a/src/plugin/elan.js
    +++ b/src/plugin/elan.js
    @@ -38,11 +38,10 @@ export default function(params = {}) {
                 },
     
                 load: function (url) {
    -                var my = this;
    -                this.loadXML(url, function (xml) {
    -                    my.data = my.parseElan(xml);
    -                    my.render();
    -                    my.fireEvent('ready', my.data);
    +                this.loadXML(url, xml => {
    +                    this.data = this.parseElan(xml);
    +                    this.render();
    +                    this.fireEvent('ready', this.data);
                     });
                 },
     
    @@ -51,7 +50,7 @@ export default function(params = {}) {
                     xhr.open('GET', url, true);
                     xhr.responseType = 'document';
                     xhr.send();
    -                xhr.addEventListener('load', function (e) {
    +                xhr.addEventListener('load', e => {
                         callback && callback(e.target.responseXML);
                     });
                 },
    @@ -76,7 +75,7 @@ export default function(params = {}) {
     
                     var timeSlots = xml.querySelectorAll('TIME_ORDER TIME_SLOT');
                     var timeOrder = {};
    -                _forEach.call(timeSlots, function (slot) {
    +                _forEach.call(timeSlots, slot => {
                         var value = parseFloat(slot.getAttribute('TIME_VALUE'));
                         // If in milliseconds, convert to seconds with rounding
                         if (inMilliseconds) {
    @@ -98,6 +97,7 @@ export default function(params = {}) {
                                     value: node.querySelector('ANNOTATION_VALUE')
                                     .textContent.trim()
                                 };
    +
                                 if (this.Types.ALIGNABLE_ANNOTATION == annot.type) {
                                     // Add start & end to alignable annotation
                                     annot.start = timeOrder[node.getAttribute('TIME_SLOT_REF1')];
    @@ -105,24 +105,26 @@ export default function(params = {}) {
                                     // Add to the list of alignable annotations
                                     data.alignableAnnotations.push(annot);
                                 }
    +
                                 // Additionally, put into the flat map of all annotations
                                 data.annotations[annot.id] = annot;
    +
                                 return annot;
                             }
                         )
                     }));
     
                     // Create JavaScript references between annotations
    -                data.tiers.forEach(function (tier) {
    -                    tier.annotations.forEach(function (annot) {
    +                data.tiers.forEach(tier => {
    +                    tier.annotations.forEach(annot => {
                             if (null != annot.ref) {
                                 annot.reference = data.annotations[annot.ref];
                             }
    -                    }, this);
    -                }, this);
    +                    });
    +                });
     
                     // Sort alignable annotations by start & end
    -                data.alignableAnnotations.sort(function (a, b) {
    +                data.alignableAnnotations.sort((a, b) => {
                         var d = a.start - b.start;
                         if (d == 0) {
                             d = b.end - a.end;
    @@ -139,16 +141,14 @@ export default function(params = {}) {
                     // apply tiers filter
                     var tiers = this.data.tiers;
                     if (this.params.tiers) {
    -                    tiers = tiers.filter(function (tier) {
    -                        return tier.id in this.params.tiers;
    -                    }, this);
    +                    tiers = tiers.filter(tier => tier.id in this.params.tiers);
                     }
     
                     // denormalize references to alignable annotations
                     var backRefs = {};
                     var indeces = {};
    -                tiers.forEach(function (tier, index) {
    -                    tier.annotations.forEach(function (annot) {
    +                tiers.forEach((tier, index) => {
    +                    tier.annotations.forEach(annot => {
                             if (annot.reference && annot.reference.type == this.Types.ALIGNABLE_ANNOTATION) {
                                 if (!(annot.reference.id in backRefs)) {
                                     backRefs[annot.ref] = {};
    @@ -156,15 +156,11 @@ export default function(params = {}) {
                                 backRefs[annot.ref][index] = annot;
                                 indeces[index] = true;
                             }
    -                    }, this);
    -                }, this);
    +                    });
    +                });
                     indeces = Object.keys(indeces).sort();
     
    -                this.renderedAlignable = this.data.alignableAnnotations.filter(
    -                    function (alignable) {
    -                        return backRefs[alignable.id];
    -                    }
    -                );
    +                this.renderedAlignable = this.data.alignableAnnotations.filter(alignable => backRefs[alignable.id]);
     
                     // table
                     var table = this.table = document.createElement('table');
    @@ -179,19 +175,19 @@ export default function(params = {}) {
                     th.textContent = 'Time';
                     th.className = 'wavesurfer-time';
                     headRow.appendChild(th);
    -                indeces.forEach(function (index) {
    +                indeces.forEach(index => {
                         var tier = tiers[index];
                         var th = document.createElement('th');
                         th.className = 'wavesurfer-tier-' + tier.id;
                         th.textContent = tier.id;
                         th.style.width = this.params.tiers[tier.id];
                         headRow.appendChild(th);
    -                }, this);
    +                });
     
                     // body
                     var tbody = document.createElement('tbody');
                     table.appendChild(tbody);
    -                this.renderedAlignable.forEach(function (alignable) {
    +                this.renderedAlignable.forEach(alignable => {
                         var row = document.createElement('tr');
                         row.id = 'wavesurfer-alignable-' + alignable.id;
                         tbody.appendChild(row);
    @@ -203,7 +199,7 @@ export default function(params = {}) {
                         row.appendChild(td);
     
                         var backRef = backRefs[alignable.id];
    -                    indeces.forEach(function (index) {
    +                    indeces.forEach(index => {
                             var tier = tiers[index];
                             var td = document.createElement('td');
                             var annotation = backRef[index];
    @@ -216,21 +212,20 @@ export default function(params = {}) {
                             }
                             td.className = 'wavesurfer-tier-' + tier.id;
                             row.appendChild(td);
    -                    }, this);
    -                }, this);
    +                    });
    +                });
     
                     this.container.innerHTML = '';
                     this.container.appendChild(table);
                 },
     
                 bindClick: function () {
    -                var my = this;
                     this._onClick = e => {
                         var ref = e.target.dataset.ref;
                         if (null != ref) {
    -                        var annot = my.data.annotations[ref];
    +                        var annot = this.data.annotations[ref];
                             if (annot) {
    -                            my.fireEvent('select', annot.start, annot.end);
    +                            this.fireEvent('select', annot.start, annot.end);
                             }
                         }
                     };
    @@ -239,7 +234,7 @@ export default function(params = {}) {
     
                 getRenderedAnnotation: function (time) {
                     var result;
    -                this.renderedAlignable.some(function (annotation) {
    +                this.renderedAlignable.some(annotation => {
                         if (annotation.start <= time && annotation.end >= time) {
                             result = annotation;
                             return true;
    diff --git a/src/plugin/microphone.js b/src/plugin/microphone.js
    index 7594fb1ed..ef45a9293 100644
    --- a/src/plugin/microphone.js
    +++ b/src/plugin/microphone.js
    @@ -16,10 +16,10 @@ export default function(params = {}) {
     
                     this.active = false;
                     this.paused = false;
    -                this.reloadBufferFunction = this.reloadBuffer.bind(this);
    +                this.reloadBufferFunction = e => this.reloadBuffer(e);
     
                     // cross-browser getUserMedia
    -                var promisifiedOldGUM = function(constraints, successCallback, errorCallback) {
    +                var promisifiedOldGUM = (constraints, successCallback, errorCallback) => {
                         // get ahold of getUserMedia, if present
                         var getUserMedia = (navigator.getUserMedia ||
                             navigator.webkitGetUserMedia ||
    @@ -35,7 +35,7 @@ export default function(params = {}) {
                         }
                         // otherwise, wrap the call to the old navigator.getUserMedia with
                         // a Promise
    -                    return new Promise(function(successCallback, errorCallback) {
    +                    return new Promise((successCallback, errorCallback) => {
                             getUserMedia.call(navigator, constraints, successCallback, errorCallback);
                         });
                     };
    @@ -100,11 +100,9 @@ export default function(params = {}) {
                 * start the visualization.
                 */
                 start: function() {
    -                navigator.mediaDevices.getUserMedia(this.constraints).then(
    -                    this.gotStream.bind(this)
    -                ).catch(
    -                    this.deviceError.bind(this)
    -                );
    +                navigator.mediaDevices.getUserMedia(this.constraints)
    +                    .then((data) => this.gotStream(data))
    +                    .catch((data) => this.deviceError(data));
                 },
     
                 /**
    @@ -179,9 +177,7 @@ export default function(params = {}) {
                         (result.browser === 'firefox' && result.version >= 44) ||
                         (result.browser === 'edge')) {
                             if (this.stream.getTracks) { // note that this should not be a call
    -                            this.stream.getTracks().forEach(function (stream) {
    -                                stream.stop();
    -                            });
    +                            this.stream.getTracks().forEach(stream => stream.stop());
                                 return;
                             }
                         }
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    index 85722c5f4..d2aeb999a 100644
    --- a/src/plugin/minimap.js
    +++ b/src/plugin/minimap.js
    @@ -63,36 +63,34 @@ export default function(params = {}) {
                 },
     
                 regions: function() {
    -                var my = this;
                     this.regions = {};
     
    -                this.wavesurfer.on('region-created', function(region) {
    -                    my.regions[region.id] = region;
    -                    my.renderRegions();
    +                this.wavesurfer.on('region-created', region => {
    +                    this.regions[region.id] = region;
    +                    this.renderRegions();
                     });
     
    -                this.wavesurfer.on('region-updated', function(region) {
    -                    my.regions[region.id] = region;
    -                    my.renderRegions();
    +                this.wavesurfer.on('region-updated', region => {
    +                    this.regions[region.id] = region;
    +                    this.renderRegions();
                     });
     
    -                this.wavesurfer.on('region-removed', function(region) {
    -                    delete my.regions[region.id];
    -                    my.renderRegions();
    +                this.wavesurfer.on('region-removed', region => {
    +                    delete this.regions[region.id];
    +                    this.renderRegions();
                     });
                 },
                 renderRegions: function() {
    -                var my = this;
                     var regionElements = this.wrapper.querySelectorAll('region');
                     for (var i = 0; i < regionElements.length; ++i) {
                         this.wrapper.removeChild(regionElements[i]);
                     }
     
    -                Object.keys(this.regions).forEach(function(id){
    -                    var region = my.regions[id];
    -                    var width = (my.width * ((region.end - region.start) / my.wavesurfer.getDuration()));
    -                    var left = (my.width * (region.start / my.wavesurfer.getDuration()));
    -                    var regionElement = my.style(document.createElement('region'), {
    +                Object.keys(this.regions).forEach(id => {
    +                    var region = this.regions[id];
    +                    var width = (this.width * ((region.end - region.start) / this.wavesurfer.getDuration()));
    +                    var left = (this.width * (region.start / this.wavesurfer.getDuration()));
    +                    var regionElement = this.style(document.createElement('region'), {
                             height: 'inherit',
                             backgroundColor: region.color,
                             width: width + 'px',
    @@ -101,7 +99,7 @@ export default function(params = {}) {
                             position: 'absolute'
                         });
                         regionElement.classList.add(id);
    -                    my.wrapper.appendChild(regionElement);
    +                    this.wrapper.appendChild(regionElement);
                     });
                 },
                 createElements: function() {
    @@ -124,19 +122,18 @@ export default function(params = {}) {
                 },
     
                 bindWaveSurferEvents: function () {
    -                var my = this;
                     var prevWidth = 0;
                     this._onResize = () => {
    -                    if (prevWidth != my.wrapper.clientWidth) {
    -                        prevWidth = my.wrapper.clientWidth;
    -                        my.render();
    -                        my.progress(my.wavesurfer.backend.getPlayedPercents());
    +                    if (prevWidth != this.wrapper.clientWidth) {
    +                        prevWidth = this.wrapper.clientWidth;
    +                        this.render();
    +                        this.progress(this.wavesurfer.backend.getPlayedPercents());
                         }
                     };
                     this._onReady = () => this.render();
                     this.wavesurfer.on('ready', this._onReady);
     
    -                this._onAudioprocess = (currentTime) => {
    +                this._onAudioprocess = currentTime => {
                         this.progress(this.wavesurfer.backend.getPlayedPercents());
                     };
                     this.wavesurfer.on('audioprocess', this._onAudioprocess);
    @@ -145,16 +142,16 @@ export default function(params = {}) {
                     this.wavesurfer.on('seek', this._onSeek);
     
                     if (this.params.showOverview) {
    -                    this._onScroll = e => {
    -                        if (!my.draggingOverview) {
    -                            my.moveOverviewRegion(event.target.scrollLeft / my.ratio);
    +                    this._onScroll = event => {
    +                        if (!this.draggingOverview) {
    +                            this.moveOverviewRegion(event.target.scrollLeft / this.ratio);
                             }
                         };
                         this.wavesurfer.on('scroll', this._onSeek);
     
    -                    this.wavesurfer.drawer.wrapper.addEventListener('mouseover', function(event) {
    -                        if (my.draggingOverview) {
    -                            my.draggingOverview = false;
    +                    this.wavesurfer.drawer.wrapper.addEventListener('mouseover', event => {
    +                        if (this.draggingOverview) {
    +                            this.draggingOverview = false;
                             }
                         });
                     }
    @@ -164,7 +161,6 @@ export default function(params = {}) {
     
     
                 bindMinimapEvents: function () {
    -                var my = this;
                     var relativePositionX = 0;
                     var seek = true;
                     var positionMouseDown = {
    @@ -172,36 +168,36 @@ export default function(params = {}) {
                         clientY: 0
                     };
     
    -                this.on('click', (function (e, position) {
    +                this.on('click', (e, position) => {
                         if (seek) {
                             this.progress(position);
                             this.wavesurfer.seekAndCenter(position);
                         } else {
                             seek = true;
                         }
    -                }).bind(this));
    +                });
     
                     if (this.params.showOverview) {
    -                    this.overviewRegion.addEventListener('mousedown', function(event) {
    -                        my.draggingOverview = true;
    +                    this.overviewRegion.addEventListener('mousedown', event => {
    +                        this.draggingOverview = true;
                             relativePositionX = event.layerX;
                             positionMouseDown.clientX = event.clientX;
                             positionMouseDown.clientY = event.clientY;
                         });
     
    -                    this.wrapper.addEventListener('mousemove', function(event) {
    -                        if (my.draggingOverview) {
    -                            my.moveOverviewRegion(event.clientX - my.container.getBoundingClientRect().left - relativePositionX);
    +                    this.wrapper.addEventListener('mousemove', event => {
    +                        if (this.draggingOverview) {
    +                            this.moveOverviewRegion(event.clientX - this.container.getBoundingClientRect().left - relativePositionX);
                             }
                         });
     
    -                    this.wrapper.addEventListener('mouseup', function(event) {
    +                    this.wrapper.addEventListener('mouseup', event => {
                             if (positionMouseDown.clientX - event.clientX === 0 && positionMouseDown.clientX - event.clientX === 0) {
                                 seek = true;
    -                            my.draggingOverview = false;
    -                        } else if (my.draggingOverview) {
    +                            this.draggingOverview = false;
    +                        } else if (this.draggingOverview) {
                                 seek = false;
    -                            my.draggingOverview = false;
    +                            this.draggingOverview = false;
                             }
                         });
                     }
    diff --git a/src/plugin/regions.js b/src/plugin/regions.js
    index ed841c35b..00b474053 100644
    --- a/src/plugin/regions.js
    +++ b/src/plugin/regions.js
    @@ -22,7 +22,7 @@ const Region = {
     
             this.bindInOut();
             this.render();
    -        this.wavesurfer.on('zoom', this.updateRender.bind(this));
    +        this.wavesurfer.on('zoom', () => this.updateRender());
             this.wavesurfer.fireEvent('region-created', this);
     
         },
    @@ -71,7 +71,7 @@ const Region = {
                 this.wrapper.removeChild(this.element);
                 this.element = null;
                 this.fireEvent('remove');
    -            this.wavesurfer.un('zoom', this.updateRender.bind(this));
    +            this.wavesurfer.un('zoom', pxPerSec => this.updateRender(pxPerSec));
                 this.wavesurfer.fireEvent('region-removed', this);
             }
         },
    @@ -86,7 +86,7 @@ const Region = {
         /* Play the region in loop. */
         playLoop: function () {
             this.play();
    -        this.once('out', this.playLoop.bind(this));
    +        this.once('out', () => this.playLoop());
         },
     
         /* Render a region as a DOM element. */
    @@ -136,12 +136,10 @@ const Region = {
         },
     
         formatTime: function (start, end) {
    -        return (start == end ? [ start ] : [ start, end ]).map(function (time) {
    -            return [
    -                Math.floor((time % 3600) / 60), // minutes
    -                ('00' + Math.floor(time % 60)).slice(-2) // seconds
    -            ].join(':');
    -        }).join('-');
    +        return (start == end ? [ start ] : [ start, end ]).map(time => [
    +            Math.floor((time % 3600) / 60), // minutes
    +            ('00' + Math.floor(time % 60)).slice(-2) // seconds
    +        ].join(':')).join('-');
         },
     
         /* Update element's position, width, color. */
    @@ -195,81 +193,77 @@ const Region = {
     
         /* Bind audio events. */
         bindInOut: function () {
    -        var my = this;
    -
    -        my.firedIn = false;
    -        my.firedOut = false;
    -
    -        var onProcess = function (time) {
    -            if (!my.firedOut && my.firedIn && (my.start >= Math.round(time * 100) / 100 || my.end <= Math.round(time * 100) / 100)) {
    -                my.firedOut = true;
    -                my.firedIn = false;
    -                my.fireEvent('out');
    -                my.wavesurfer.fireEvent('region-out', my);
    +        this.firedIn = false;
    +        this.firedOut = false;
    +
    +        var onProcess = time => {
    +            if (!this.firedOut && this.firedIn && (this.start >= Math.round(time * 100) / 100 || this.end <= Math.round(time * 100) / 100)) {
    +                this.firedOut = true;
    +                this.firedIn = false;
    +                this.fireEvent('out');
    +                this.wavesurfer.fireEvent('region-out', this);
                 }
    -            if (!my.firedIn && my.start <= time && my.end > time) {
    -                my.firedIn = true;
    -                my.firedOut = false;
    -                my.fireEvent('in');
    -                my.wavesurfer.fireEvent('region-in', my);
    +            if (!this.firedIn && this.start <= time && this.end > time) {
    +                this.firedIn = true;
    +                this.firedOut = false;
    +                this.fireEvent('in');
    +                this.wavesurfer.fireEvent('region-in', this);
                 }
             };
     
             this.wavesurfer.backend.on('audioprocess', onProcess);
     
    -        this.on('remove', function () {
    -            my.wavesurfer.backend.un('audioprocess', onProcess);
    +        this.on('remove', () => {
    +            this.wavesurfer.backend.un('audioprocess', onProcess);
             });
     
             /* Loop playback. */
    -        this.on('out', function () {
    -            if (my.loop) {
    -                my.wavesurfer.play(my.start);
    +        this.on('out', () => {
    +            if (this.loop) {
    +                this.wavesurfer.play(this.start);
                 }
             });
         },
     
         /* Bind DOM events. */
         bindEvents: function () {
    -        var my = this;
    -
    -        this.element.addEventListener('mouseenter', function (e) {
    -            my.fireEvent('mouseenter', e);
    -            my.wavesurfer.fireEvent('region-mouseenter', my, e);
    +        this.element.addEventListener('mouseenter', e => {
    +            this.fireEvent('mouseenter', e);
    +            this.wavesurfer.fireEvent('region-mouseenter', this, e);
             });
     
    -        this.element.addEventListener('mouseleave', function (e) {
    -            my.fireEvent('mouseleave', e);
    -            my.wavesurfer.fireEvent('region-mouseleave', my, e);
    +        this.element.addEventListener('mouseleave', e => {
    +            this.fireEvent('mouseleave', e);
    +            this.wavesurfer.fireEvent('region-mouseleave', this, e);
             });
     
    -        this.element.addEventListener('click', function (e) {
    +        this.element.addEventListener('click', e => {
                 e.preventDefault();
    -            my.fireEvent('click', e);
    -            my.wavesurfer.fireEvent('region-click', my, e);
    +            this.fireEvent('click', e);
    +            this.wavesurfer.fireEvent('region-click', this, e);
             });
     
    -        this.element.addEventListener('dblclick', function (e) {
    +        this.element.addEventListener('dblclick', e => {
                 e.stopPropagation();
                 e.preventDefault();
    -            my.fireEvent('dblclick', e);
    -            my.wavesurfer.fireEvent('region-dblclick', my, e);
    +            this.fireEvent('dblclick', e);
    +            this.wavesurfer.fireEvent('region-dblclick', this, e);
             });
     
             /* Drag or resize on mousemove. */
    -        (this.drag || this.resize) && (function () {
    -            var duration = my.wavesurfer.getDuration();
    +        (this.drag || this.resize) && (() => {
    +            var duration = this.wavesurfer.getDuration();
                 var drag;
                 var resize;
                 var startTime;
                 var touchId;
     
    -            var onDown = function (e) {
    +            var onDown = e => {
                     if (e.touches && e.touches.length > 1) { return; }
                     touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
     
                     e.stopPropagation();
    -                startTime = my.wavesurfer.drawer.handleEvent(e, true) * duration;
    +                startTime = this.wavesurfer.drawer.handleEvent(e, true) * duration;
     
                     if (e.target.tagName.toLowerCase() == 'handle') {
                         if (e.target.classList.contains('wavesurfer-handle-start')) {
    @@ -282,59 +276,59 @@ const Region = {
                         resize = false;
                     }
                 };
    -            var onUp = function (e) {
    +            var onUp = e => {
                     if (e.touches && e.touches.length > 1) { return; }
     
                     if (drag || resize) {
                         drag = false;
                         resize = false;
     
    -                    my.fireEvent('update-end', e);
    -                    my.wavesurfer.fireEvent('region-update-end', my, e);
    +                    this.fireEvent('update-end', e);
    +                    this.wavesurfer.fireEvent('region-update-end', this, e);
                     }
                 };
    -            var onMove = function (e) {
    +            var onMove = (e) => {
                     if (e.touches && e.touches.length > 1) { return; }
                     if (e.targetTouches && e.targetTouches[0].identifier != touchId) { return; }
     
                     if (drag || resize) {
    -                    var time = my.wavesurfer.drawer.handleEvent(e) * duration;
    +                    var time = this.wavesurfer.drawer.handleEvent(e) * duration;
                         var delta = time - startTime;
                         startTime = time;
     
                         // Drag
    -                    if (my.drag && drag) {
    -                        my.onDrag(delta);
    +                    if (this.drag && drag) {
    +                        this.onDrag(delta);
                         }
     
                         // Resize
    -                    if (my.resize && resize) {
    -                        my.onResize(delta, resize);
    +                    if (this.resize && resize) {
    +                        this.onResize(delta, resize);
                         }
                     }
                 };
     
    -            my.element.addEventListener('mousedown', onDown);
    -            my.element.addEventListener('touchstart', onDown);
    +            this.element.addEventListener('mousedown', onDown);
    +            this.element.addEventListener('touchstart', onDown);
     
    -            my.wrapper.addEventListener('mousemove', onMove);
    -            my.wrapper.addEventListener('touchmove', onMove);
    +            this.wrapper.addEventListener('mousemove', onMove);
    +            this.wrapper.addEventListener('touchmove', onMove);
     
                 document.body.addEventListener('mouseup', onUp);
                 document.body.addEventListener('touchend', onUp);
     
    -            my.on('remove', function () {
    +            this.on('remove', () => {
                     document.body.removeEventListener('mouseup', onUp);
                     document.body.removeEventListener('touchend', onUp);
    -                my.wrapper.removeEventListener('mousemove', onMove);
    -                my.wrapper.removeEventListener('touchmove', onMove);
    +                this.wrapper.removeEventListener('mousemove', onMove);
    +                this.wrapper.removeEventListener('touchmove', onMove);
                 });
     
    -            my.wavesurfer.on('destroy', function () {
    +            this.wavesurfer.on('destroy', () => {
                     document.body.removeEventListener('mouseup', onUp);
                     document.body.removeEventListener('touchend', onUp);
                 });
    -        }());
    +        })();
         },
     
         onDrag: function (delta) {
    @@ -444,22 +438,21 @@ export default function(params = {}) {
     
                     this.list[region.id] = region;
     
    -                region.on('remove', (function () {
    +                region.on('remove', () => {
                         delete this.list[region.id];
    -                }).bind(this));
    +                });
     
                     return region;
                 },
     
                 /* Remove all regions. */
                 clear: function () {
    -                Object.keys(this.list).forEach(function (id) {
    +                Object.keys(this.list).forEach(id => {
                         this.list[id].remove();
    -                }, this);
    +                });
                 },
     
                 enableDragSelection: function (params) {
    -                var my = this;
                     var drag;
                     var start;
                     var region;
    @@ -467,22 +460,22 @@ export default function(params = {}) {
                     var slop = params.slop || 2;
                     var pxMove = 0;
     
    -                var eventDown = function (e) {
    +                var eventDown = e => {
                         if (e.touches && e.touches.length > 1) { return; }
                         touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
     
                         drag = true;
    -                    start = my.wavesurfer.drawer.handleEvent(e, true);
    +                    start = this.wavesurfer.drawer.handleEvent(e, true);
                         region = null;
                     };
                     this.wrapper.addEventListener('mousedown', eventDown);
                     this.wrapper.addEventListener('touchstart', eventDown);
    -                this.on('disable-drag-selection', function() {
    -                    my.wrapper.removeEventListener('touchstart', eventDown);
    -                    my.wrapper.removeEventListener('mousedown', eventDown);
    +                this.on('disable-drag-selection', () => {
    +                    this.wrapper.removeEventListener('touchstart', eventDown);
    +                    this.wrapper.removeEventListener('mousedown', eventDown);
                     });
     
    -                var eventUp = function (e) {
    +                var eventUp = e => {
                         if (e.touches && e.touches.length > 1) { return; }
     
                         drag = false;
    @@ -490,19 +483,19 @@ export default function(params = {}) {
     
                         if (region) {
                             region.fireEvent('update-end', e);
    -                        my.wavesurfer.fireEvent('region-update-end', region, e);
    +                        this.wavesurfer.fireEvent('region-update-end', region, e);
                         }
     
                         region = null;
                     };
                     this.wrapper.addEventListener('mouseup', eventUp);
                     this.wrapper.addEventListener('touchend', eventUp);
    -                this.on('disable-drag-selection', function() {
    -                    my.wrapper.removeEventListener('touchend', eventUp);
    -                    my.wrapper.removeEventListener('mouseup', eventUp);
    +                this.on('disable-drag-selection', () => {
    +                    this.wrapper.removeEventListener('touchend', eventUp);
    +                    this.wrapper.removeEventListener('mouseup', eventUp);
                     });
     
    -                var eventMove = function (e) {
    +                var eventMove = e => {
                         if (!drag) { return; }
                         if (++pxMove <= slop) { return; }
     
    @@ -510,11 +503,11 @@ export default function(params = {}) {
                         if (e.targetTouches && e.targetTouches[0].identifier != touchId) { return; }
     
                         if (!region) {
    -                        region = my.add(params || {});
    +                        region = this.add(params || {});
                         }
     
    -                    var duration = my.wavesurfer.getDuration();
    -                    var end = my.wavesurfer.drawer.handleEvent(e);
    +                    var duration = this.wavesurfer.getDuration();
    +                    var end = this.wavesurfer.drawer.handleEvent(e);
                         region.update({
                             start: Math.min(end * duration, start * duration),
                             end: Math.max(end * duration, start * duration)
    @@ -522,9 +515,9 @@ export default function(params = {}) {
                     };
                     this.wrapper.addEventListener('mousemove', eventMove);
                     this.wrapper.addEventListener('touchmove', eventMove);
    -                this.on('disable-drag-selection', function() {
    -                    my.wrapper.removeEventListener('touchmove', eventMove);
    -                    my.wrapper.removeEventListener('mousemove', eventMove);
    +                this.on('disable-drag-selection', () => {
    +                    this.wrapper.removeEventListener('touchmove', eventMove);
    +                    this.wrapper.removeEventListener('mousemove', eventMove);
                     });
                 },
     
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    index e4e7fea4f..5c1492119 100644
    --- a/src/plugin/spectrogram.js
    +++ b/src/plugin/spectrogram.js
    @@ -241,10 +241,10 @@ export default function(params = {}) {
                         this.createCanvas();
                         this.render();
     
    -                    drawer.wrapper.addEventListener('scroll', function (e) {
    +                    drawer.wrapper.addEventListener('scroll', e => {
                             this.updateScroll(e);
    -                    }.bind(this));
    -                    wavesurfer.on('redraw', this.render.bind(this));
    +                    });
    +                    wavesurfer.on('redraw', () => this.render());
                     };
     
                     // Check if ws is ready
    @@ -291,11 +291,10 @@ export default function(params = {}) {
                         });
                     }
     
    -                var my = this;
    -                this.wrapper.addEventListener('click', function (e) {
    +                this.wrapper.addEventListener('click', e => {
                         e.preventDefault();
                         var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    -                    my.fireEvent('click', (relX / my.scrollWidth) || 0);
    +                    this.fireEvent('click', (relX / this.scrollWidth) || 0);
                     });
                 },
     
    @@ -388,14 +387,10 @@ export default function(params = {}) {
     
     
                 loadFrequenciesData: function (url) {
    -                var my = this;
    -
                     var ajax = this.wavesurfer.util.ajax({ url: url });
     
    -                ajax.on('success', function(data) { my.drawSpectrogram(JSON.parse(data), my); });
    -                ajax.on('error', function (e) {
    -                    my.fireEvent('error', 'XHR error: ' + e.target.statusText);
    -                });
    +                ajax.on('success', data => this.drawSpectrogram(JSON.parse(data), this));
    +                ajax.on('error', e => this.fireEvent('error', 'XHR error: ' + e.target.statusText));
     
                     return ajax;
                 },
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index daf703835..887ac5a73 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -95,11 +95,10 @@ export default function(params = {}) {
                         });
                     }
     
    -                var my = this;
    -                this.wrapper.addEventListener('click', function (e) {
    +                this.wrapper.addEventListener('click', e => {
                         e.preventDefault();
                         var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    -                    my.fireEvent('click', (relX / my.wrapper.scrollWidth) || 0);
    +                    this.fireEvent('click', (relX / this.wrapper.scrollWidth) || 0);
                     });
                 },
     
    @@ -169,7 +168,7 @@ export default function(params = {}) {
                     var curPixel = 0,
                         curSeconds = 0,
                         totalSeconds = parseInt(duration, 10) + 1;
    -                var formatTime = function(seconds) {
    +                var formatTime = seconds => {
                         if (typeof self.formatTimeCallback === 'function') {
                             return self.formatTimeCallback(seconds);
                         }
    diff --git a/src/util/ajax.js b/src/util/ajax.js
    index b3dfb7fde..634c169a9 100644
    --- a/src/util/ajax.js
    +++ b/src/util/ajax.js
    @@ -13,13 +13,13 @@ export default function ajax (options) {
         let fired100 = false;
         xhr.open(options.method || 'GET', options.url, true);
         xhr.responseType = options.responseType || 'json';
    -    xhr.addEventListener('progress', function (e) {
    +    xhr.addEventListener('progress', e => {
             instance.fireEvent('progress', e);
             if (e.lengthComputable && e.loaded == e.total) {
                 fired100 = true;
             }
         });
    -    xhr.addEventListener('load', function (e) {
    +    xhr.addEventListener('load', e => {
             if (!fired100) {
                 instance.fireEvent('progress', e);
             }
    @@ -30,9 +30,7 @@ export default function ajax (options) {
                 instance.fireEvent('error', e);
             }
         });
    -    xhr.addEventListener('error', function (e) {
    -        instance.fireEvent('error', e);
    -    });
    +    xhr.addEventListener('error', e => instance.fireEvent('error', e));
         xhr.send();
         instance.xhr = xhr;
         return instance;
    diff --git a/src/util/observer.js b/src/util/observer.js
    index 5efbce20d..29239a6c3 100644
    --- a/src/util/observer.js
    +++ b/src/util/observer.js
    @@ -15,7 +15,7 @@ export default {
             return {
                 name: event,
                 callback: fn,
    -            un: this.un.bind(this, event, fn)
    +            un: (e, fn) => this.un(e, fn)
             };
         },
     
    @@ -51,13 +51,12 @@ export default {
          * event type.
          */
         once: function (event, handler) {
    -        const my = this;
    -        const fn = function () {
    +        const fn = () => {
                 /*  eslint-disable no-invalid-this, prefer-rest-params */
                 handler.apply(this, arguments);
                 /*  eslint-enable no-invalid-this, prefer-rest-params */
    -            setTimeout(function () {
    -                my.un(event, fn);
    +            setTimeout(() => {
    +                this.un(event, fn);
                 }, 0);
             };
             return this.on(event, fn);
    @@ -66,7 +65,7 @@ export default {
         fireEvent: function (event, ...args) {
             if (!this.handlers) { return; }
             const handlers = this.handlers[event];
    -        handlers && handlers.forEach(function (fn) {
    +        handlers && handlers.forEach(fn => {
                 fn(...args);
             });
         }
    diff --git a/src/util/style.js b/src/util/style.js
    index 9f281abf6..c35769777 100644
    --- a/src/util/style.js
    +++ b/src/util/style.js
    @@ -7,7 +7,7 @@
      * @returns {HTMLElement} el
      */
     export default function style (el, styles) {
    -    Object.keys(styles).forEach(function (prop) {
    +    Object.keys(styles).forEach(prop => {
             if (el.style[prop] !== styles[prop]) {
                 el.style[prop] = styles[prop];
             }
    diff --git a/src/wavesurfer.js b/src/wavesurfer.js
    index 78f5edf1e..47985b88f 100755
    --- a/src/wavesurfer.js
    +++ b/src/wavesurfer.js
    @@ -219,33 +219,27 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         createDrawer: function () {
    -        var my = this;
    -
             this.drawer = Object.create(this.Drawer);
             this.drawer.init(this.container, this.params);
             this.fireEvent('drawer-created', this.drawer);
     
    -        this.drawer.on('redraw', function () {
    -            my.drawBuffer();
    -            my.drawer.progress(my.backend.getPlayedPercents());
    +        this.drawer.on('redraw', () => {
    +            this.drawBuffer();
    +            this.drawer.progress(this.backend.getPlayedPercents());
             });
     
             // Click-to-seek
    -        this.drawer.on('click', function (e, progress) {
    -            setTimeout(function () {
    -                my.seekTo(progress);
    -            }, 0);
    +        this.drawer.on('click', (e, progress) => {
    +            setTimeout(() => this.seekTo(progress), 0);
             });
     
             // Relay the scroll event from the drawer
    -        this.drawer.on('scroll', function (e) {
    -            my.fireEvent('scroll', e);
    +        this.drawer.on('scroll', e => {
    +            this.fireEvent('scroll', e);
             });
         },
     
         createBackend: function () {
    -        var my = this;
    -
             if (this.backend) {
                 this.backend.destroy();
             }
    @@ -263,13 +257,13 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             this.backend.init(this.params);
             this.fireEvent('backend-created', this.backend);
     
    -        this.backend.on('finish', function () { my.fireEvent('finish'); });
    -        this.backend.on('play', function () { my.fireEvent('play'); });
    -        this.backend.on('pause', function () { my.fireEvent('pause'); });
    +        this.backend.on('finish', () => this.fireEvent('finish'));
    +        this.backend.on('play', () => this.fireEvent('play'));
    +        this.backend.on('pause', () => this.fireEvent('pause'));
     
    -        this.backend.on('audioprocess', function (time) {
    -            my.drawer.progress(my.backend.getPlayedPercents());
    -            my.fireEvent('audioprocess', time);
    +        this.backend.on('audioprocess', time => {
    +            this.drawer.progress(this.backend.getPlayedPercents());
    +            this.fireEvent('audioprocess', time);
             });
         },
     
    @@ -282,7 +276,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         play: function (start, end) {
    -        this.fireEvent('interaction', this.play.bind(this, start, end));
    +        this.fireEvent('interaction', () => this.play(start, end));
             this.backend.play(start, end);
         },
     
    @@ -319,7 +313,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         seekTo: function (progress) {
    -        this.fireEvent('interaction', this.seekTo.bind(this, progress));
    +        this.fireEvent('interaction', () => this.seekTo(progress));
     
             var paused = this.backend.isPaused();
             // avoid small scrolls while paused seeking
    @@ -438,11 +432,11 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * Internal method.
          */
         loadArrayBuffer: function (arraybuffer) {
    -        this.decodeArrayBuffer(arraybuffer, function (data) {
    +        this.decodeArrayBuffer(arraybuffer, data => {
                 if (!this.isDestroyed) {
                     this.loadDecodedBuffer(data);
                 }
    -        }.bind(this));
    +        });
         },
     
         /**
    @@ -460,18 +454,14 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * @param {Blob|File} blob Audio data.
          */
         loadBlob: function (blob) {
    -        var my = this;
             // Create file reader
             var reader = new FileReader();
    -        reader.addEventListener('progress', function (e) {
    -            my.onProgress(e);
    -        });
    -        reader.addEventListener('load', function (e) {
    -            my.loadArrayBuffer(e.target.result);
    -        });
    -        reader.addEventListener('error', function () {
    -            my.fireEvent('error', 'Error reading file');
    +        reader.addEventListener('progress', e => this.onProgress(e));
    +        reader.addEventListener('load', e => {
    +            console.log(e);
    +            this.loadArrayBuffer(e.target.result);
             });
    +        reader.addEventListener('error', () => this.fireEvent('error', 'Error reading file'));
             reader.readAsArrayBuffer(blob);
             this.empty();
         },
    @@ -492,12 +482,12 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * Loads audio using Web Audio buffer backend.
          */
         loadBuffer: function (url, peaks) {
    -        var load = (function (action) {
    +        var load = action => {
                 if (action) {
                     this.tmpEvents.push(this.once('ready', action));
                 }
    -            return this.getArrayBuffer(url, this.loadArrayBuffer.bind(this));
    -        }).bind(this);
    +            return this.getArrayBuffer(url, (data) => this.loadArrayBuffer(data));
    +        };
     
             if (peaks) {
                 this.backend.setPeaks(peaks);
    @@ -532,14 +522,11 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             }
     
             this.tmpEvents.push(
    -            this.backend.once('canplay', (function () {
    +            this.backend.once('canplay', () => {
                     this.drawBuffer();
                     this.fireEvent('ready');
    -            }).bind(this)),
    -
    -            this.backend.once('error', (function (err) {
    -                this.fireEvent('error', err);
    -            }).bind(this))
    +            }),
    +            this.backend.once('error', err => this.fireEvent('error', err))
             );
     
             // If no pre-decoded peaks provided, attempt to download the
    @@ -547,13 +534,13 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             if (peaks) {
                 this.backend.setPeaks(peaks);
             } else if (this.backend.supportsWebAudio()) {
    -            this.getArrayBuffer(url, (function (arraybuffer) {
    -                this.decodeArrayBuffer(arraybuffer, (function (buffer) {
    +            this.getArrayBuffer(url, arraybuffer => {
    +                this.decodeArrayBuffer(arraybuffer, buffer => {
                         this.backend.buffer = buffer;
                         this.drawBuffer();
                         this.fireEvent('waveform-ready');
    -                }).bind(this));
    -            }).bind(this));
    +                });
    +            });
             }
         },
     
    @@ -562,20 +549,18 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
     
             this.backend.decodeArrayBuffer(
                 arraybuffer,
    -            (function (data) {
    +            data => {
                     // Only use the decoded data if we haven't been destroyed or another decode started in the meantime
                     if (!this.isDestroyed && this.arraybuffer == arraybuffer) {
                         callback(data);
                         this.arraybuffer = null;
                     }
    -            }).bind(this),
    -            this.fireEvent.bind(this, 'error', 'Error decoding audiobuffer')
    +            },
    +            () => this.fireEvent('error', 'Error decoding audiobuffer')
             );
         },
     
         getArrayBuffer: function (url, callback) {
    -        var my = this;
    -
             var ajax = WaveSurfer.util.ajax({
                 url: url,
                 responseType: 'arraybuffer'
    @@ -584,16 +569,16 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             this.currentAjax = ajax;
     
             this.tmpEvents.push(
    -            ajax.on('progress', function (e) {
    -                my.onProgress(e);
    +            ajax.on('progress', e => {
    +                this.onProgress(e);
                 }),
    -            ajax.on('success', function (data, e) {
    +            ajax.on('success', (data, e) => {
                     callback(data);
    -                my.currentAjax = null;
    +                this.currentAjax = null;
                 }),
    -            ajax.on('error', function (e) {
    -                my.fireEvent('error', 'XHR error: ' + e.target.statusText);
    -                my.currentAjax = null;
    +            ajax.on('error', e => {
    +                this.fireEvent('error', 'XHR error: ' + e.target.statusText);
    +                this.currentAjax = null;
                 })
             );
     
    @@ -619,9 +604,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             accuracy = accuracy || 10000;
             noWindow = noWindow || false;
             var peaks = this.backend.getPeaks(length, accuracy);
    -        var arr = [].map.call(peaks, function (val) {
    -            return Math.round(val * accuracy) / accuracy;
    -        });
    +        var arr = [].map.call(peaks, val => Math.round(val * accuracy) / accuracy);
             var json = JSON.stringify(arr);
             if (!noWindow) {
                 window.open('data:application/json;charset=utf-8,' +
    @@ -655,7 +638,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         clearTmpEvents: function () {
    -        this.tmpEvents.forEach(function (e) { e.un(); });
    +        this.tmpEvents.forEach(e => e.un());
         },
     
         /**
    diff --git a/src/webaudio.js b/src/webaudio.js
    index a6589cfda..86d1c4eb2 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -52,7 +52,7 @@ const WebAudio = util.extend({}, util.observer, {
     
         disconnectFilters: function () {
             if (this.filters) {
    -            this.filters.forEach(function (filter) {
    +            this.filters.forEach(filter => {
                     filter && filter.disconnect();
                 });
                 this.filters = null;
    @@ -88,7 +88,7 @@ const WebAudio = util.extend({}, util.observer, {
                 this.analyser.disconnect();
     
                 // Connect each filter in turn
    -            filters.reduce(function (prev, curr) {
    +            filters.reduce((prev, curr) => {
                     prev.connect(curr);
                     return curr;
                 }, this.analyser).connect(this.gainNode);
    @@ -107,18 +107,16 @@ const WebAudio = util.extend({}, util.observer, {
         },
     
         addOnAudioProcess: function () {
    -        var my = this;
    -
    -        this.scriptNode.onaudioprocess = function () {
    -            var time = my.getCurrentTime();
    -
    -            if (time >= my.getDuration()) {
    -                my.setState(my.FINISHED_STATE);
    -                my.fireEvent('pause');
    -            } else if (time >= my.scheduledPause) {
    -                my.pause();
    -            } else if (my.state === my.states[my.PLAYING_STATE]) {
    -                my.fireEvent('audioprocess', time);
    +        this.scriptNode.onaudioprocess = () => {
    +            var time = this.getCurrentTime();
    +
    +            if (time >= this.getDuration()) {
    +                this.setState(this.FINISHED_STATE);
    +                this.fireEvent('pause');
    +            } else if (time >= this.scheduledPause) {
    +                this.pause();
    +            } else if (this.state === this.states[this.PLAYING_STATE]) {
    +                this.fireEvent('audioprocess', time);
                 }
             };
         },
    
    From 643b14d345d63ea27b0b86412c68dac87e2927af Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Sun, 11 Dec 2016 10:23:02 +0100
    Subject: [PATCH 010/573] Next: Replace var with const and let, enable eslint
     assignment formatting rules (#886)
    
    * enabled eslint prefer-arrow-callback, fixed code and generally tried to use arrow function for simpler code where possible, replaced manual aliases to this and bind(this)
    
    * replaced var definitions with let and const, assignment formatting, enabled eslint no-var and one-var (set to "never") rule and fixed code
    ---
     .eslintrc.js              |  11 +++-
     src/drawer.canvas.js      |  79 +++++++++++++-------------
     src/drawer.js             |  34 ++++++------
     src/drawer.multicanvas.js | 110 +++++++++++++++++++-----------------
     src/mediaelement.js       |  20 +++----
     src/plugin/cursor.js      |   2 +-
     src/plugin/elan.js        |  64 ++++++++++-----------
     src/plugin/microphone.js  |  10 ++--
     src/plugin/minimap.js     |  25 +++++----
     src/plugin/regions.js     |  72 ++++++++++++------------
     src/plugin/spectrogram.js | 114 +++++++++++++++++++-------------------
     src/plugin/timeline.js    |  91 ++++++++++++++++--------------
     src/util/observer.js      |   3 +-
     src/wavesurfer.js         |  37 +++++++------
     src/webaudio.js           |  41 +++++++-------
     15 files changed, 371 insertions(+), 342 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 68e602049..2939e6f09 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -196,7 +196,7 @@ module.exports = {
             "no-useless-escape": "error",
             "no-useless-rename": "error",
             "no-useless-return": "error",
    -        "no-var": "off",
    +        "no-var": "error",
             "no-void": "error",
             "no-warning-comments": "off",
             "no-whitespace-before-property": "error",
    @@ -205,7 +205,14 @@ module.exports = {
             "object-curly-spacing": "off",
             "object-property-newline": "off",
             "object-shorthand": "off",
    -        "one-var": "off",
    +        "one-var": [
    +            "error",
    +            {
    +                var: "never",
    +                let: "never",
    +                const: "never"
    +            }
    +        ],
             "one-var-declaration-per-line": "error",
             "operator-assignment": "off",
             "operator-linebreak": "off",
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 39ad61c7b..41359770c 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -3,7 +3,7 @@ import * as util from './util';
     
     export default util.extend({}, drawer, {
         createElements: function () {
    -        var waveCanvas = this.wrapper.appendChild(
    +        const waveCanvas = this.wrapper.appendChild(
                 this.style(document.createElement('canvas'), {
                     position: 'absolute',
                     zIndex: 1,
    @@ -32,7 +32,7 @@ export default util.extend({}, drawer, {
             );
     
             if (this.params.waveColor != this.params.progressColor) {
    -            var progressCanvas = this.progressWave.appendChild(
    +            const progressCanvas = this.progressWave.appendChild(
                     document.createElement('canvas')
                 );
                 this.progressCc = progressCanvas.getContext('2d');
    @@ -40,7 +40,7 @@ export default util.extend({}, drawer, {
         },
     
         updateSize: function () {
    -        var width = Math.round(this.width / this.params.pixelRatio);
    +        const width = Math.round(this.width / this.params.pixelRatio);
     
             this.waveCc.canvas.width = this.width;
             this.waveCc.canvas.height = this.height;
    @@ -67,7 +67,7 @@ export default util.extend({}, drawer, {
         drawBars: function (peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
    -            var channels = peaks;
    +            const channels = peaks;
                 if (this.params.splitChannels) {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawBars, this);
    @@ -78,28 +78,28 @@ export default util.extend({}, drawer, {
     
             // Bar wave draws the bottom only as a reflection of the top,
             // so we don't need negative values
    -        var hasMinVals = [].some.call(peaks, val => val < 0);
    +        const hasMinVals = [].some.call(peaks, val => val < 0);
             if (hasMinVals) {
                 peaks = [].filter.call(peaks, (_, index) => index % 2 == 0);
             }
     
             // A half-pixel offset makes lines crisp
    -        var $ = 0.5 / this.params.pixelRatio;
    -        var width = this.width;
    -        var height = this.params.height * this.params.pixelRatio;
    -        var offsetY = height * channelIndex || 0;
    -        var halfH = height / 2;
    -        var length = peaks.length;
    -        var bar = this.params.barWidth * this.params.pixelRatio;
    -        var gap = Math.max(this.params.pixelRatio, ~~(bar / 2));
    -        var step = bar + gap;
    -
    -        var absmax = 1;
    +        const $ = 0.5 / this.params.pixelRatio;
    +        const width = this.width;
    +        const height = this.params.height * this.params.pixelRatio;
    +        const offsetY = height * channelIndex || 0;
    +        const halfH = height / 2;
    +        const length = peaks.length;
    +        const bar = this.params.barWidth * this.params.pixelRatio;
    +        const gap = Math.max(this.params.pixelRatio, ~~(bar / 2));
    +        const step = bar + gap;
    +
    +        let absmax = 1;
             if (this.params.normalize) {
                 absmax = util.max(peaks);
             }
     
    -        var scale = length / width;
    +        const scale = length / width;
     
             this.waveCc.fillStyle = this.params.waveColor;
             if (this.progressCc) {
    @@ -108,9 +108,10 @@ export default util.extend({}, drawer, {
     
             [ this.waveCc, this.progressCc ].forEach(cc => {
                 if (!cc) { return; }
    +            let i;
     
    -            for (var i = 0; i < width; i += step) {
    -                var h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH);
    +            for (i = 0; i < width; i += step) {
    +                const h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH);
                     cc.fillRect(i + $, halfH - h + offsetY, bar + $, h * 2);
                 }
             });
    @@ -119,7 +120,7 @@ export default util.extend({}, drawer, {
         drawWave: function (peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
    -            var channels = peaks;
    +            const channels = peaks;
                 if (this.params.splitChannels) {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawWave, this);
    @@ -129,10 +130,12 @@ export default util.extend({}, drawer, {
             }
     
             // Support arrays without negative peaks
    -        var hasMinValues = [].some.call(peaks, val => val < 0);
    +        const hasMinValues = [].some.call(peaks, val => val < 0);
             if (!hasMinValues) {
    -            var reflectedPeaks = [];
    -            for (var i = 0, len = peaks.length; i < len; i++) {
    +            const reflectedPeaks = [];
    +            let i;
    +            let len;
    +            for (i = 0, len = peaks.length; i < len; i++) {
                     reflectedPeaks[2 * i] = peaks[i];
                     reflectedPeaks[2 * i + 1] = -peaks[i];
                 }
    @@ -140,21 +143,21 @@ export default util.extend({}, drawer, {
             }
     
             // A half-pixel offset makes lines crisp
    -        var $ = 0.5 / this.params.pixelRatio;
    -        var height = this.params.height * this.params.pixelRatio;
    -        var offsetY = height * channelIndex || 0;
    -        var halfH = height / 2;
    -        var length = ~~(peaks.length / 2);
    +        const $ = 0.5 / this.params.pixelRatio;
    +        const height = this.params.height * this.params.pixelRatio;
    +        const offsetY = height * channelIndex || 0;
    +        const halfH = height / 2;
    +        const length = ~~(peaks.length / 2);
     
    -        var scale = 1;
    +        let scale = 1;
             if (this.params.fillParent && this.width != length) {
                 scale = this.width / length;
             }
     
    -        var absmax = 1;
    +        let absmax = 1;
             if (this.params.normalize) {
    -            var max = util.max(peaks);
    -            var min = util.min(peaks);
    +            const max = util.max(peaks);
    +            const min = util.min(peaks);
                 absmax = -min > max ? -min : max;
             }
     
    @@ -165,19 +168,21 @@ export default util.extend({}, drawer, {
     
             [ this.waveCc, this.progressCc ].forEach(cc => {
                 if (!cc) { return; }
    +            let i;
    +            let j;
     
                 cc.beginPath();
                 cc.moveTo($, halfH + offsetY);
     
    -            for (var i = 0; i < length; i++) {
    -                var h = Math.round(peaks[2 * i] / absmax * halfH);
    +            for (i = 0; i < length; i++) {
    +                const h = Math.round(peaks[2 * i] / absmax * halfH);
                     cc.lineTo(i * scale + $, halfH - h + offsetY);
                 }
     
                 // Draw the bottom edge going backwards, to make a single
                 // closed hull to fill.
    -            for (var j = length - 1; j >= 0; j--) {
    -                var k = Math.round(peaks[2 * j + 1] / absmax * halfH);
    +            for (j = length - 1; j >= 0; j--) {
    +                const k = Math.round(peaks[2 * j + 1] / absmax * halfH);
                     cc.lineTo(j * scale + $, halfH - k + offsetY);
                 }
     
    @@ -190,7 +195,7 @@ export default util.extend({}, drawer, {
         },
     
         updateProgress: function (progress) {
    -        var pos = Math.round(
    +        const pos = Math.round(
                 this.width * progress
             ) / this.params.pixelRatio;
             this.style(this.progressWave, { width: pos + 'px' });
    diff --git a/src/drawer.js b/src/drawer.js
    index e486c2ca4..3826a1861 100644
    --- a/src/drawer.js
    +++ b/src/drawer.js
    @@ -42,13 +42,13 @@ export default util.extend({}, util.observer, {
         handleEvent: function (e, noPrevent) {
             !noPrevent && e.preventDefault();
     
    -        var clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;
    -        var bbox = this.wrapper.getBoundingClientRect();
    +        const clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;
    +        const bbox = this.wrapper.getBoundingClientRect();
     
    -        var nominalWidth = this.width;
    -        var parentWidth = this.getWidth();
    +        const nominalWidth = this.width;
    +        const parentWidth = this.getWidth();
     
    -        var progress;
    +        let progress;
     
             if (!this.params.fillParent && nominalWidth < parentWidth) {
                 progress = ((clientX - bbox.left) * this.params.pixelRatio / nominalWidth) || 0;
    @@ -65,10 +65,10 @@ export default util.extend({}, util.observer, {
     
         setupWrapperEvents: function () {
             this.wrapper.addEventListener('click', e => {
    -            var scrollbarHeight = this.wrapper.offsetHeight - this.wrapper.clientHeight;
    +            const scrollbarHeight = this.wrapper.offsetHeight - this.wrapper.clientHeight;
                 if (scrollbarHeight != 0) {
                     // scrollbar is visible.  Check if click was on it
    -                var bbox = this.wrapper.getBoundingClientRect();
    +                const bbox = this.wrapper.getBoundingClientRect();
                     if (e.clientY >= bbox.bottom - scrollbarHeight) {
                         // ignore mousedown as it was on the scrollbar
                         return;
    @@ -102,16 +102,16 @@ export default util.extend({}, util.observer, {
         },
     
         recenter: function (percent) {
    -        var position = this.wrapper.scrollWidth * percent;
    +        const position = this.wrapper.scrollWidth * percent;
             this.recenterOnPosition(position, true);
         },
     
         recenterOnPosition: function (position, immediate) {
    -        var scrollLeft = this.wrapper.scrollLeft;
    -        var half = ~~(this.wrapper.clientWidth / 2);
    -        var target = position - half;
    -        var offset = target - scrollLeft;
    -        var maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;
    +        const scrollLeft = this.wrapper.scrollLeft;
    +        const half = ~~(this.wrapper.clientWidth / 2);
    +        const maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;
    +        let target = position - half;
    +        let offset = target - scrollLeft;
     
             if (maxScroll == 0) {
                 // no need to continue if scrollbar is not there
    @@ -121,7 +121,7 @@ export default util.extend({}, util.observer, {
             // if the cursor is currently visible...
             if (!immediate && -half <= offset && offset < half) {
                 // we'll limit the "re-center" rate.
    -            var rate = 5;
    +            const rate = 5;
                 offset = Math.max(-rate, Math.min(rate, offset));
                 target = scrollLeft + offset;
             }
    @@ -165,14 +165,14 @@ export default util.extend({}, util.observer, {
         },
     
         progress: function (progress) {
    -        var minPxDelta = 1 / this.params.pixelRatio;
    -        var pos = Math.round(progress * this.width) * minPxDelta;
    +        const minPxDelta = 1 / this.params.pixelRatio;
    +        const pos = Math.round(progress * this.width) * minPxDelta;
     
             if (pos < this.lastPos || pos - this.lastPos >= minPxDelta) {
                 this.lastPos = pos;
     
                 if (this.params.scrollParent && this.params.autoCenter) {
    -                var newPos = ~~(this.wrapper.scrollWidth * progress);
    +                const newPos = ~~(this.wrapper.scrollWidth * progress);
                     this.recenterOnPosition(newPos);
                 }
     
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 0e362c09f..5a12c1fe4 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -2,8 +2,6 @@ import drawer from './drawer';
     import * as util from './util';
     
     export default util.extend({}, drawer, {
    -
    -
         initDrawer: function (params) {
             this.maxCanvasWidth = params.maxCanvasWidth != null ? params.maxCanvasWidth : 4000;
             this.maxCanvasElementWidth = Math.round(this.maxCanvasWidth / this.params.pixelRatio);
    @@ -41,8 +39,9 @@ export default util.extend({}, drawer, {
         },
     
         updateSize: function () {
    -        var totalWidth = Math.round(this.width / this.params.pixelRatio),
    -            requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth);
    +        const totalWidth = Math.round(this.width / this.params.pixelRatio);
    +        const requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth);
    +        let i;
     
             while (this.canvases.length < requiredCanvases) {
                 this.addCanvas();
    @@ -52,9 +51,9 @@ export default util.extend({}, drawer, {
                 this.removeCanvas();
             }
     
    -        for (var i in this.canvases) {
    +        for (i in this.canvases) {
                 // Add some overlap to prevent vertical white stripes, keep the width even for simplicity.
    -            var canvasWidth = this.maxCanvasWidth + 2 * Math.ceil(this.params.pixelRatio / 2);
    +            let canvasWidth = this.maxCanvasWidth + 2 * Math.ceil(this.params.pixelRatio / 2);
     
                 if (i == this.canvases.length - 1) {
                     canvasWidth = this.width - (this.maxCanvasWidth * (this.canvases.length - 1));
    @@ -66,8 +65,8 @@ export default util.extend({}, drawer, {
         },
     
         addCanvas: function () {
    -        var entry = {},
    -            leftOffset = this.maxCanvasElementWidth * this.canvases.length;
    +        const entry = {};
    +        const leftOffset = this.maxCanvasElementWidth * this.canvases.length;
     
             entry.wave = this.wrapper.appendChild(
                 this.style(document.createElement('canvas'), {
    @@ -96,7 +95,7 @@ export default util.extend({}, drawer, {
         },
     
         removeCanvas: function () {
    -        var lastEntry = this.canvases.pop();
    +        const lastEntry = this.canvases.pop();
             lastEntry.wave.parentElement.removeChild(lastEntry.wave);
             if (this.hasProgressCanvas) {
                 lastEntry.progress.parentElement.removeChild(lastEntry.progress);
    @@ -104,8 +103,8 @@ export default util.extend({}, drawer, {
         },
     
         updateDimensions: function (entry, width, height) {
    -        var elementWidth = Math.round(width / this.params.pixelRatio),
    -            totalWidth = Math.round(this.width / this.params.pixelRatio);
    +        const elementWidth = Math.round(width / this.params.pixelRatio);
    +        const totalWidth = Math.round(this.width / this.params.pixelRatio);
     
             // Where the canvas starts and ends in the waveform, represented as a decimal between 0 and 1.
             entry.start = (entry.waveCtx.canvas.offsetLeft / totalWidth) || 0;
    @@ -125,7 +124,8 @@ export default util.extend({}, drawer, {
         },
     
         clearWave: function () {
    -        for (var i in this.canvases) {
    +        let i;
    +        for (i in this.canvases) {
                 this.clearWaveForEntry(this.canvases[i]);
             }
         },
    @@ -140,7 +140,7 @@ export default util.extend({}, drawer, {
         drawBars: function (peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
    -            var channels = peaks;
    +            const channels = peaks;
                 if (this.params.splitChannels) {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawBars, this);
    @@ -151,30 +151,31 @@ export default util.extend({}, drawer, {
     
             // Bar wave draws the bottom only as a reflection of the top,
             // so we don't need negative values
    -        var hasMinVals = [].some.call(peaks, val => val < 0);
    +        const hasMinVals = [].some.call(peaks, val => val < 0);
             if (hasMinVals) {
                 peaks = [].filter.call(peaks, (_, index) => index % 2 == 0);
             }
     
             // A half-pixel offset makes lines crisp
    -        var width = this.width;
    -        var height = this.params.height * this.params.pixelRatio;
    -        var offsetY = height * channelIndex || 0;
    -        var halfH = height / 2;
    -        var length = peaks.length;
    -        var bar = this.params.barWidth * this.params.pixelRatio;
    -        var gap = Math.max(this.params.pixelRatio, ~~(bar / 2));
    -        var step = bar + gap;
    -
    -        var absmax = 1;
    +        const width = this.width;
    +        const height = this.params.height * this.params.pixelRatio;
    +        const offsetY = height * channelIndex || 0;
    +        const halfH = height / 2;
    +        const length = peaks.length;
    +        const bar = this.params.barWidth * this.params.pixelRatio;
    +        const gap = Math.max(this.params.pixelRatio, ~~(bar / 2));
    +        const step = bar + gap;
    +
    +        let absmax = 1;
             if (this.params.normalize) {
                 absmax = util.max(peaks);
             }
     
    -        var scale = length / width;
    +        const scale = length / width;
    +        let i;
     
    -        for (var i = 0; i < width; i += step) {
    -            var h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH);
    +        for (i = 0; i < width; i += step) {
    +            const h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH);
                 this.fillRect(i + this.halfPixel, halfH - h + offsetY, bar + this.halfPixel, h * 2);
             }
         },
    @@ -182,7 +183,7 @@ export default util.extend({}, drawer, {
         drawWave: function (peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
    -            var channels = peaks;
    +            const channels = peaks;
                 if (this.params.splitChannels) {
                     this.setHeight(channels.length * this.params.height * this.params.pixelRatio);
                     channels.forEach(this.drawWave, this);
    @@ -192,10 +193,12 @@ export default util.extend({}, drawer, {
             }
     
             // Support arrays without negative peaks
    -        var hasMinValues = [].some.call(peaks, val => val < 0);
    +        const hasMinValues = [].some.call(peaks, val => val < 0);
             if (!hasMinValues) {
    -            var reflectedPeaks = [];
    -            for (var i = 0, len = peaks.length; i < len; i++) {
    +            const reflectedPeaks = [];
    +            let i;
    +            let len;
    +            for (i = 0, len = peaks.length; i < len; i++) {
                     reflectedPeaks[2 * i] = peaks[i];
                     reflectedPeaks[2 * i + 1] = -peaks[i];
                 }
    @@ -203,14 +206,14 @@ export default util.extend({}, drawer, {
             }
     
             // A half-pixel offset makes lines crisp
    -        var height = this.params.height * this.params.pixelRatio;
    -        var offsetY = height * channelIndex || 0;
    -        var halfH = height / 2;
    +        const height = this.params.height * this.params.pixelRatio;
    +        const offsetY = height * channelIndex || 0;
    +        const halfH = height / 2;
     
    -        var absmax = 1;
    +        let absmax = 1;
             if (this.params.normalize) {
    -            var max = util.max(peaks);
    -            var min = util.min(peaks);
    +            const max = util.max(peaks);
    +            const min = util.min(peaks);
                 absmax = -min > max ? -min : max;
             }
     
    @@ -221,8 +224,8 @@ export default util.extend({}, drawer, {
         },
     
         drawLine: function (peaks, absmax, halfH, offsetY) {
    -        for (var index in this.canvases) {
    -            var entry = this.canvases[index];
    +        for (const index in this.canvases) {
    +            const entry = this.canvases[index];
     
                 this.setFillStyles(entry);
     
    @@ -234,28 +237,30 @@ export default util.extend({}, drawer, {
         drawLineToContext: function (entry, ctx, peaks, absmax, halfH, offsetY) {
             if (!ctx) { return; }
     
    -        var length = peaks.length / 2;
    +        const length = peaks.length / 2;
     
    -        var scale = 1;
    +        let scale = 1;
             if (this.params.fillParent && this.width != length) {
                 scale = this.width / length;
             }
     
    -        var first = Math.round(length * entry.start),
    -            last = Math.round(length * entry.end);
    +        const first = Math.round(length * entry.start);
    +        const last = Math.round(length * entry.end);
    +        let i;
    +        let j;
     
             ctx.beginPath();
             ctx.moveTo(this.halfPixel, halfH + offsetY);
     
    -        for (var i = first; i < last; i++) {
    -            var h = Math.round(peaks[2 * i] / absmax * halfH);
    +        for (i = first; i < last; i++) {
    +            const h = Math.round(peaks[2 * i] / absmax * halfH);
                 ctx.lineTo((i - first) * scale + this.halfPixel, halfH - h + offsetY);
             }
     
             // Draw the bottom edge going backwards, to make a single
             // closed hull to fill.
    -        for (var j = last - 1; j >= first; j--) {
    -            var k = Math.round(peaks[2 * j + 1] / absmax * halfH);
    +        for (j = last - 1; j >= first; j--) {
    +            const k = Math.round(peaks[2 * j + 1] / absmax * halfH);
                 ctx.lineTo((j - first) * scale + this.halfPixel, halfH - k + offsetY);
             }
     
    @@ -264,11 +269,12 @@ export default util.extend({}, drawer, {
         },
     
         fillRect: function (x, y, width, height) {
    -        for (var i in this.canvases) {
    -            var entry = this.canvases[i],
    -                leftOffset = i * this.maxCanvasWidth;
    +        let i;
    +        for (i in this.canvases) {
    +            const entry = this.canvases[i];
    +            const leftOffset = i * this.maxCanvasWidth;
     
    -            var intersection = {
    +            const intersection = {
                     x1: Math.max(x, i * this.maxCanvasWidth),
                     y1: y,
                     x2: Math.min(x + width, i * this.maxCanvasWidth + entry.waveCtx.canvas.width),
    @@ -306,7 +312,7 @@ export default util.extend({}, drawer, {
         },
     
         updateProgress: function (progress) {
    -        var pos = Math.round(
    +        const pos = Math.round(
                 this.width * progress
             ) / this.params.pixelRatio;
             this.style(this.progressWave, { width: pos + 'px' });
    diff --git a/src/mediaelement.js b/src/mediaelement.js
    index 9941f6b45..5089923d5 100755
    --- a/src/mediaelement.js
    +++ b/src/mediaelement.js
    @@ -26,15 +26,12 @@ export default util.extend({}, webaudio, {
          * Create a timer to provide a more precise `audioprocess' event.
          */
         createTimer: function () {
    -        var playing = false;
    -
    -        var onAudioProcess = () => {
    +        const onAudioProcess = () => {
                 if (this.isPaused()) { return; }
    -
                 this.fireEvent('audioprocess', this.getCurrentTime());
     
                 // Call again in the next frame
    -            var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
    +            const requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
                 requestAnimationFrame(onAudioProcess);
             };
     
    @@ -50,14 +47,14 @@ export default util.extend({}, webaudio, {
          *  @param  {String}        preload     HTML 5 preload attribute value
          */
         load: function (url, container, peaks, preload) {
    -        var media = document.createElement(this.mediaType);
    +        const media = document.createElement(this.mediaType);
             media.controls = this.params.mediaControls;
             media.autoplay = this.params.autoplay || false;
             media.preload = preload == null ? 'auto' : preload;
             media.src = url;
             media.style.width = '100%';
     
    -        var prevMedia = container.querySelector(this.mediaType);
    +        const prevMedia = container.querySelector(this.mediaType);
             if (prevMedia) {
                 container.removeChild(prevMedia);
             }
    @@ -72,11 +69,10 @@ export default util.extend({}, webaudio, {
          *  @param  {Array}         peaks   array of peak data
          */
         loadElt: function (elt, peaks) {
    -        var media = elt;
    -        media.controls = this.params.mediaControls;
    -        media.autoplay = this.params.autoplay || false;
    +        elt.controls = this.params.mediaControls;
    +        elt.autoplay = this.params.autoplay || false;
     
    -        this._load(media, peaks);
    +        this._load(elt, peaks);
         },
     
         /**
    @@ -115,7 +111,7 @@ export default util.extend({}, webaudio, {
         },
     
         getDuration: function () {
    -        var duration = this.media.duration;
    +        let duration = this.media.duration;
             if (duration >= Infinity) { // streaming audio
                 duration = this.media.seekable.end(0);
             }
    diff --git a/src/plugin/cursor.js b/src/plugin/cursor.js
    index 905a953e2..e6ccee115 100644
    --- a/src/plugin/cursor.js
    +++ b/src/plugin/cursor.js
    @@ -64,7 +64,7 @@ export default function(params) {
                 },
     
                 updateCursorPosition: function(progress) {
    -                var pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
    +                const pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
                     this.drawer.style(this.cursor, { left: pos + 'px' });
                 },
     
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    index 97d734ef9..8fe416495 100644
    --- a/src/plugin/elan.js
    +++ b/src/plugin/elan.js
    @@ -46,7 +46,7 @@ export default function(params = {}) {
                 },
     
                 loadXML: function (url, callback) {
    -                var xhr = new XMLHttpRequest();
    +                const xhr = new XMLHttpRequest();
                     xhr.open('GET', url, true);
                     xhr.responseType = 'document';
                     xhr.send();
    @@ -56,10 +56,10 @@ export default function(params = {}) {
                 },
     
                 parseElan: function (xml) {
    -                var _forEach = Array.prototype.forEach;
    -                var _map = Array.prototype.map;
    +                const _forEach = Array.prototype.forEach;
    +                const _map = Array.prototype.map;
     
    -                var data = {
    +                const data = {
                         media: {},
                         timeOrder: {},
                         tiers: [],
    @@ -67,16 +67,16 @@ export default function(params = {}) {
                         alignableAnnotations: []
                     };
     
    -                var header = xml.querySelector('HEADER');
    -                var inMilliseconds = header.getAttribute('TIME_UNITS') == 'milliseconds';
    -                var media = header.querySelector('MEDIA_DESCRIPTOR');
    +                const header = xml.querySelector('HEADER');
    +                const inMilliseconds = header.getAttribute('TIME_UNITS') == 'milliseconds';
    +                const media = header.querySelector('MEDIA_DESCRIPTOR');
                     data.media.url = media.getAttribute('MEDIA_URL');
                     data.media.type = media.getAttribute('MIME_TYPE');
     
    -                var timeSlots = xml.querySelectorAll('TIME_ORDER TIME_SLOT');
    -                var timeOrder = {};
    +                const timeSlots = xml.querySelectorAll('TIME_ORDER TIME_SLOT');
    +                const timeOrder = {};
                     _forEach.call(timeSlots, slot => {
    -                    var value = parseFloat(slot.getAttribute('TIME_VALUE'));
    +                    let value = parseFloat(slot.getAttribute('TIME_VALUE'));
                         // If in milliseconds, convert to seconds with rounding
                         if (inMilliseconds) {
                             value = Math.round(value * 1e2) / 1e5;
    @@ -90,7 +90,7 @@ export default function(params = {}) {
                         defaultLocale: tier.getAttribute('DEFAULT_LOCALE'),
                         annotations: _map.call(
                             tier.querySelectorAll('REF_ANNOTATION, ALIGNABLE_ANNOTATION'), node => {
    -                            var annot = {
    +                            const annot = {
                                     type: node.nodeName,
                                     id: node.getAttribute('ANNOTATION_ID'),
                                     ref: node.getAttribute('ANNOTATION_REF'),
    @@ -125,7 +125,7 @@ export default function(params = {}) {
     
                     // Sort alignable annotations by start & end
                     data.alignableAnnotations.sort((a, b) => {
    -                    var d = a.start - b.start;
    +                    let d = a.start - b.start;
                         if (d == 0) {
                             d = b.end - a.end;
                         }
    @@ -139,14 +139,14 @@ export default function(params = {}) {
     
                 render: function () {
                     // apply tiers filter
    -                var tiers = this.data.tiers;
    +                let tiers = this.data.tiers;
                     if (this.params.tiers) {
                         tiers = tiers.filter(tier => tier.id in this.params.tiers);
                     }
     
                     // denormalize references to alignable annotations
    -                var backRefs = {};
    -                var indeces = {};
    +                const backRefs = {};
    +                let indeces = {};
                     tiers.forEach((tier, index) => {
                         tier.annotations.forEach(annot => {
                             if (annot.reference && annot.reference.type == this.Types.ALIGNABLE_ANNOTATION) {
    @@ -163,21 +163,21 @@ export default function(params = {}) {
                     this.renderedAlignable = this.data.alignableAnnotations.filter(alignable => backRefs[alignable.id]);
     
                     // table
    -                var table = this.table = document.createElement('table');
    +                const table = this.table = document.createElement('table');
                     table.className = 'wavesurfer-annotations';
     
                     // head
    -                var thead = document.createElement('thead');
    -                var headRow = document.createElement('tr');
    +                const thead = document.createElement('thead');
    +                const headRow = document.createElement('tr');
                     thead.appendChild(headRow);
                     table.appendChild(thead);
    -                var th = document.createElement('th');
    +                const th = document.createElement('th');
                     th.textContent = 'Time';
                     th.className = 'wavesurfer-time';
                     headRow.appendChild(th);
    -                indeces.forEach(index => {
    -                    var tier = tiers[index];
    -                    var th = document.createElement('th');
    +                indeces.forEach(function (index) {
    +                    const tier = tiers[index];
    +                    const th = document.createElement('th');
                         th.className = 'wavesurfer-tier-' + tier.id;
                         th.textContent = tier.id;
                         th.style.width = this.params.tiers[tier.id];
    @@ -185,24 +185,24 @@ export default function(params = {}) {
                     });
     
                     // body
    -                var tbody = document.createElement('tbody');
    +                const tbody = document.createElement('tbody');
                     table.appendChild(tbody);
                     this.renderedAlignable.forEach(alignable => {
    -                    var row = document.createElement('tr');
    +                    const row = document.createElement('tr');
                         row.id = 'wavesurfer-alignable-' + alignable.id;
                         tbody.appendChild(row);
     
    -                    var td = document.createElement('td');
    +                    const td = document.createElement('td');
                         td.className = 'wavesurfer-time';
                         td.textContent = alignable.start.toFixed(1) + '–' +
                         alignable.end.toFixed(1);
                         row.appendChild(td);
     
    -                    var backRef = backRefs[alignable.id];
    +                    const backRef = backRefs[alignable.id];
                         indeces.forEach(index => {
    -                        var tier = tiers[index];
    -                        var td = document.createElement('td');
    -                        var annotation = backRef[index];
    +                        const tier = tiers[index];
    +                        const td = document.createElement('td');
    +                        const annotation = backRef[index];
                             if (annotation) {
                                 td.id = 'wavesurfer-annotation-' + annotation.id;
                                 td.dataset.ref = alignable.id;
    @@ -221,9 +221,9 @@ export default function(params = {}) {
     
                 bindClick: function () {
                     this._onClick = e => {
    -                    var ref = e.target.dataset.ref;
    +                    const ref = e.target.dataset.ref;
                         if (null != ref) {
    -                        var annot = this.data.annotations[ref];
    +                        const annot = this.data.annotations[ref];
                             if (annot) {
                                 this.fireEvent('select', annot.start, annot.end);
                             }
    @@ -233,7 +233,7 @@ export default function(params = {}) {
                 },
     
                 getRenderedAnnotation: function (time) {
    -                var result;
    +                let result;
                     this.renderedAlignable.some(annotation => {
                         if (annotation.start <= time && annotation.end >= time) {
                             result = annotation;
    diff --git a/src/plugin/microphone.js b/src/plugin/microphone.js
    index ef45a9293..ea6e41cba 100644
    --- a/src/plugin/microphone.js
    +++ b/src/plugin/microphone.js
    @@ -19,9 +19,9 @@ export default function(params = {}) {
                     this.reloadBufferFunction = e => this.reloadBuffer(e);
     
                     // cross-browser getUserMedia
    -                var promisifiedOldGUM = (constraints, successCallback, errorCallback) => {
    +                const promisifiedOldGUM = (constraints, successCallback, errorCallback) => {
                         // get ahold of getUserMedia, if present
    -                    var getUserMedia = (navigator.getUserMedia ||
    +                    const getUserMedia = (navigator.getUserMedia ||
                             navigator.webkitGetUserMedia ||
                             navigator.mozGetUserMedia ||
                             navigator.msGetUserMedia
    @@ -169,7 +169,7 @@ export default function(params = {}) {
     
                     // stop stream from device
                     if (this.stream) {
    -                    var result = this.detectBrowser();
    +                    const result = this.detectBrowser();
                         // MediaStream.stop is deprecated since:
                         // - Firefox 44 (https://www.fxsitecompat.com/en-US/docs/2015/mediastream-stop-has-been-deprecated/)
                         // - Chrome 45 (https://developers.google.com/web/updates/2015/07/mediastream-deprecations)
    @@ -262,7 +262,7 @@ export default function(params = {}) {
                 * @return {!number} browser version.
                 */
                 extractVersion: function(uastring, expr, pos) {
    -                var match = uastring.match(expr);
    +                const match = uastring.match(expr);
                     return match && match.length >= pos && parseInt(match[pos], 10);
                 },
     
    @@ -273,7 +273,7 @@ export default function(params = {}) {
                 */
                 detectBrowser: function() {
                     // Returned result object.
    -                var result = {};
    +                const result = {};
                     result.browser = null;
                     result.version = null;
                     result.minVersion = null;
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    index d2aeb999a..853ae0fde 100644
    --- a/src/plugin/minimap.js
    +++ b/src/plugin/minimap.js
    @@ -81,16 +81,17 @@ export default function(params = {}) {
                     });
                 },
                 renderRegions: function() {
    -                var regionElements = this.wrapper.querySelectorAll('region');
    -                for (var i = 0; i < regionElements.length; ++i) {
    +                const regionElements = this.wrapper.querySelectorAll('region');
    +                let i;
    +                for (i = 0; i < regionElements.length; ++i) {
                         this.wrapper.removeChild(regionElements[i]);
                     }
     
                     Object.keys(this.regions).forEach(id => {
    -                    var region = this.regions[id];
    -                    var width = (this.width * ((region.end - region.start) / this.wavesurfer.getDuration()));
    -                    var left = (this.width * (region.start / this.wavesurfer.getDuration()));
    -                    var regionElement = this.style(document.createElement('region'), {
    +                    const region = this.regions[id];
    +                    const width = (this.width * ((region.end - region.start) / this.wavesurfer.getDuration()));
    +                    const left = (this.width * (region.start / this.wavesurfer.getDuration()));
    +                    const regionElement = this.style(document.createElement('region'), {
                             height: 'inherit',
                             backgroundColor: region.color,
                             width: width + 'px',
    @@ -122,7 +123,7 @@ export default function(params = {}) {
                 },
     
                 bindWaveSurferEvents: function () {
    -                var prevWidth = 0;
    +                let prevWidth = 0;
                     this._onResize = () => {
                         if (prevWidth != this.wrapper.clientWidth) {
                             prevWidth = this.wrapper.clientWidth;
    @@ -161,12 +162,12 @@ export default function(params = {}) {
     
     
                 bindMinimapEvents: function () {
    -                var relativePositionX = 0;
    -                var seek = true;
    -                var positionMouseDown = {
    +                const positionMouseDown = {
                         clientX: 0,
                         clientY: 0
                     };
    +                let relativePositionX = 0;
    +                let seek = true;
     
                     this.on('click', (e, position) => {
                         if (seek) {
    @@ -204,8 +205,8 @@ export default function(params = {}) {
                 },
     
                 render: function () {
    -                var len = this.getWidth();
    -                var peaks = this.wavesurfer.backend.getPeaks(len);
    +                const len = this.getWidth();
    +                const peaks = this.wavesurfer.backend.getPeaks(len);
                     this.drawPeaks(peaks, len);
     
                     if (this.params.showOverview) {
    diff --git a/src/plugin/regions.js b/src/plugin/regions.js
    index 00b474053..928276b8a 100644
    --- a/src/plugin/regions.js
    +++ b/src/plugin/regions.js
    @@ -91,16 +91,16 @@ const Region = {
     
         /* Render a region as a DOM element. */
         render: function () {
    -        var regionEl = document.createElement('region');
    +        const regionEl = document.createElement('region');
             regionEl.className = 'wavesurfer-region';
             regionEl.title = this.formatTime(this.start, this.end);
             regionEl.setAttribute('data-id', this.id);
     
    -        for (var attrname in this.attributes) {
    +        for (const attrname in this.attributes) {
                 regionEl.setAttribute('data-region-' + attrname, this.attributes[attrname]);
             }
     
    -        var width = this.wrapper.scrollWidth;
    +        const width = this.wrapper.scrollWidth;
             this.style(regionEl, {
                 position: 'absolute',
                 zIndex: 2,
    @@ -110,11 +110,11 @@ const Region = {
     
             /* Resize handles */
             if (this.resize) {
    -            var handleLeft = regionEl.appendChild(document.createElement('handle'));
    -            var handleRight = regionEl.appendChild(document.createElement('handle'));
    +            const handleLeft = regionEl.appendChild(document.createElement('handle'));
    +            const handleRight = regionEl.appendChild(document.createElement('handle'));
                 handleLeft.className = 'wavesurfer-handle wavesurfer-handle-start';
                 handleRight.className = 'wavesurfer-handle wavesurfer-handle-end';
    -            var css = {
    +            const css = {
                     cursor: 'col-resize',
                     position: 'absolute',
                     left: '0px',
    @@ -144,8 +144,8 @@ const Region = {
     
         /* Update element's position, width, color. */
         updateRender: function (pxPerSec) {
    -        var dur = this.wavesurfer.getDuration();
    -        var width;
    +        const dur = this.wavesurfer.getDuration();
    +        let width;
             if (pxPerSec) {
                 width = Math.round(this.wavesurfer.getDuration() * pxPerSec);
             } else {
    @@ -172,8 +172,8 @@ const Region = {
             if (this.element != null) {
                 // Calculate the left and width values of the region such that
                 // no gaps appear between regions.
    -            var left = Math.round(this.start / dur * width);
    -            var regionWidth =
    +            const left = Math.round(this.start / dur * width);
    +            const regionWidth =
                 Math.round(this.end / dur * width) - left;
     
                 this.style(this.element, {
    @@ -183,7 +183,7 @@ const Region = {
                     cursor: this.drag ? 'move' : 'default'
                 });
     
    -            for (var attrname in this.attributes) {
    +            for (const attrname in this.attributes) {
                     this.element.setAttribute('data-region-' + attrname, this.attributes[attrname]);
                 }
     
    @@ -196,7 +196,7 @@ const Region = {
             this.firedIn = false;
             this.firedOut = false;
     
    -        var onProcess = time => {
    +        const onProcess = time => {
                 if (!this.firedOut && this.firedIn && (this.start >= Math.round(time * 100) / 100 || this.end <= Math.round(time * 100) / 100)) {
                     this.firedOut = true;
                     this.firedIn = false;
    @@ -252,13 +252,13 @@ const Region = {
     
             /* Drag or resize on mousemove. */
             (this.drag || this.resize) && (() => {
    -            var duration = this.wavesurfer.getDuration();
    -            var drag;
    -            var resize;
    -            var startTime;
    -            var touchId;
    +            const duration = this.wavesurfer.getDuration();
    +            let startTime;
    +            let touchId;
    +            let drag;
    +            let resize;
     
    -            var onDown = e => {
    +            const onDown = e => {
                     if (e.touches && e.touches.length > 1) { return; }
                     touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
     
    @@ -276,7 +276,7 @@ const Region = {
                         resize = false;
                     }
                 };
    -            var onUp = e => {
    +            const onUp = e => {
                     if (e.touches && e.touches.length > 1) { return; }
     
                     if (drag || resize) {
    @@ -287,13 +287,13 @@ const Region = {
                         this.wavesurfer.fireEvent('region-update-end', this, e);
                     }
                 };
    -            var onMove = (e) => {
    +            const onMove = e => {
                     if (e.touches && e.touches.length > 1) { return; }
                     if (e.targetTouches && e.targetTouches[0].identifier != touchId) { return; }
     
                     if (drag || resize) {
    -                    var time = this.wavesurfer.drawer.handleEvent(e) * duration;
    -                    var delta = time - startTime;
    +                    const time = this.wavesurfer.drawer.handleEvent(e) * duration;
    +                    const delta = time - startTime;
                         startTime = time;
     
                         // Drag
    @@ -332,7 +332,7 @@ const Region = {
         },
     
         onDrag: function (delta) {
    -        var maxEnd = this.wavesurfer.getDuration();
    +        const maxEnd = this.wavesurfer.getDuration();
             if ((this.end + delta) > maxEnd || (this.start + delta) < 0) {
                 return;
             }
    @@ -433,7 +433,7 @@ export default function(params = {}) {
                 },
                 /* Add a region. */
                 add: function (params) {
    -                var region = Object.create(this.wavesurfer.Region);
    +                const region = Object.create(this.wavesurfer.Region);
                     region.init(params, this.wavesurfer);
     
                     this.list[region.id] = region;
    @@ -453,14 +453,14 @@ export default function(params = {}) {
                 },
     
                 enableDragSelection: function (params) {
    -                var drag;
    -                var start;
    -                var region;
    -                var touchId;
    -                var slop = params.slop || 2;
    -                var pxMove = 0;
    -
    -                var eventDown = e => {
    +                const slop = params.slop || 2;
    +                let drag;
    +                let start;
    +                let region;
    +                let touchId;
    +                let pxMove = 0;
    +
    +                const eventDown = e => {
                         if (e.touches && e.touches.length > 1) { return; }
                         touchId = e.targetTouches ? e.targetTouches[0].identifier : null;
     
    @@ -475,7 +475,7 @@ export default function(params = {}) {
                         this.wrapper.removeEventListener('mousedown', eventDown);
                     });
     
    -                var eventUp = e => {
    +                const eventUp = e => {
                         if (e.touches && e.touches.length > 1) { return; }
     
                         drag = false;
    @@ -495,7 +495,7 @@ export default function(params = {}) {
                         this.wrapper.removeEventListener('mouseup', eventUp);
                     });
     
    -                var eventMove = e => {
    +                const eventMove = e => {
                         if (!drag) { return; }
                         if (++pxMove <= slop) { return; }
     
    @@ -506,8 +506,8 @@ export default function(params = {}) {
                             region = this.add(params || {});
                         }
     
    -                    var duration = this.wavesurfer.getDuration();
    -                    var end = this.wavesurfer.drawer.handleEvent(e);
    +                    const duration = this.wavesurfer.getDuration();
    +                    const end = this.wavesurfer.drawer.handleEvent(e);
                         region.update({
                             start: Math.min(end * duration, start * duration),
                             end: Math.max(end * duration, start * duration)
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    index 5c1492119..1a1bce7e5 100644
    --- a/src/plugin/spectrogram.js
    +++ b/src/plugin/spectrogram.js
    @@ -1,7 +1,7 @@
     /**
      * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js
      */
    -/* eslint-disable complexity, no-redeclare */
    +/* eslint-disable complexity, no-redeclare, no-var, one-var */
     const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
         this.bufferSize = bufferSize;
         this.sampleRate = sampleRate;
    @@ -177,7 +177,7 @@ const FFT = function(bufferSize, sampleRate, windowFunc, alpha) {
             return spectrum;
         };
     };
    -/* eslint-enable complexity, no-redeclare */
    +/* eslint-enable complexity, no-redeclare, no-var, one-var */
     
     /**
     * spectrogram plugin
    @@ -220,7 +220,7 @@ export default function(params = {}) {
     
                     this.frequenciesDataUrl = params.frequenciesDataUrl;
                     this._onReady = () => {
    -                    var drawer = this.drawer = this.wavesurfer.drawer;
    +                    const drawer = this.drawer = this.wavesurfer.drawer;
     
                         this.container = 'string' == typeof params.container ?
                         document.querySelector(params.container) : params.container;
    @@ -265,12 +265,12 @@ export default function(params = {}) {
                 },
     
                 createWrapper: function () {
    -                var prevSpectrogram = this.container.querySelector('spectrogram');
    +                const prevSpectrogram = this.container.querySelector('spectrogram');
                     if (prevSpectrogram) {
                         this.container.removeChild(prevSpectrogram);
                     }
     
    -                var wsParams = this.wavesurfer.params;
    +                const wsParams = this.wavesurfer.params;
     
                     this.wrapper = this.container.appendChild(
                         document.createElement('spectrogram')
    @@ -293,13 +293,13 @@ export default function(params = {}) {
     
                     this.wrapper.addEventListener('click', e => {
                         e.preventDefault();
    -                    var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    +                    const relX = 'offsetX' in e ? e.offsetX : e.layerX;
                         this.fireEvent('click', (relX / this.scrollWidth) || 0);
                     });
                 },
     
                 createCanvas: function () {
    -                var canvas = this.canvas = this.wrapper.appendChild(
    +                const canvas = this.canvas = this.wrapper.appendChild(
                         document.createElement('canvas')
                     );
     
    @@ -322,25 +322,24 @@ export default function(params = {}) {
                 },
     
                 updateCanvasStyle: function () {
    -                var width = Math.round(this.width / this.pixelRatio) + 'px';
    +                const width = Math.round(this.width / this.pixelRatio) + 'px';
                     this.canvas.width = this.width;
                     this.canvas.height = this.height;
                     this.canvas.style.width = width;
                 },
     
                 drawSpectrogram: function(frequenciesData, my) {
    -                var spectrCc = my.spectrCc;
    -
    -                var length = my.wavesurfer.backend.getDuration();
    -                var height = my.height;
    -
    -                var pixels = my.resample(frequenciesData);
    -
    -                var heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;
    -
    -                for (var i = 0; i < pixels.length; i++) {
    -                    for (var j = 0; j < pixels[i].length; j++) {
    -                        var colorValue = 255 - pixels[i][j];
    +                const spectrCc = my.spectrCc;
    +                const length = my.wavesurfer.backend.getDuration();
    +                const height = my.height;
    +                const pixels = my.resample(frequenciesData);
    +                const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;
    +                let i;
    +                let j;
    +
    +                for (i = 0; i < pixels.length; i++) {
    +                    for (j = 0; j < pixels[i].length; j++) {
    +                        const colorValue = 255 - pixels[i][j];
                             my.spectrCc.fillStyle = 'rgb(' + colorValue + ', ' + colorValue + ', ' + colorValue + ')';
                             my.spectrCc.fillRect(i, height - j * heightFactor, 1, heightFactor);
                         }
    @@ -348,35 +347,34 @@ export default function(params = {}) {
                 },
     
                 getFrequencies: function(callback) {
    -                var fftSamples = this.fftSamples;
    -                var buffer = this.buffer = this.wavesurfer.backend.buffer;
    -                var channelOne = buffer.getChannelData(0);
    -                var bufferLength = buffer.length;
    -                var sampleRate = buffer.sampleRate;
    -                var frequencies = [];
    -
    -                if (! buffer) {
    +                const fftSamples = this.fftSamples;
    +                const buffer = this.buffer = this.wavesurfer.backend.buffer;
    +                const channelOne = buffer.getChannelData(0);
    +                const bufferLength = buffer.length;
    +                const sampleRate = buffer.sampleRate;
    +                const frequencies = [];
    +
    +                if (!buffer) {
                         this.fireEvent('error', 'Web Audio buffer is not available');
                         return;
                     }
     
    -                var noverlap = this.noverlap;
    -                if (! noverlap) {
    -                    var uniqueSamplesPerPx = buffer.length / this.canvas.width;
    +                let noverlap = this.noverlap;
    +                if (!noverlap) {
    +                    const uniqueSamplesPerPx = buffer.length / this.canvas.width;
                         noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));
                     }
     
    -                var fft = new FFT(fftSamples, sampleRate, this.windowFunc, this.alpha);
    -
    -                var maxSlicesCount = Math.floor(bufferLength/ (fftSamples - noverlap));
    -
    -                var currentOffset = 0;
    +                const fft = new FFT(fftSamples, sampleRate, this.windowFunc, this.alpha);
    +                const maxSlicesCount = Math.floor(bufferLength/ (fftSamples - noverlap));
    +                let currentOffset = 0;
     
                     while (currentOffset + fftSamples < channelOne.length) {
    -                    var segment = channelOne.slice(currentOffset, currentOffset + fftSamples);
    -                    var spectrum = fft.calculateSpectrum(segment);
    -                    var array = new Uint8Array(fftSamples/2);
    -                    for (var j = 0; j this.drawSpectrogram(JSON.parse(data), this));
                     ajax.on('error', e => this.fireEvent('error', 'XHR error: ' + e.target.statusText));
    @@ -400,28 +398,31 @@ export default function(params = {}) {
                 },
     
                 resample: function(oldMatrix) {
    -                var columnsNumber = this.width;
    -                var newMatrix = [];
    +                const columnsNumber = this.width;
    +                const newMatrix = [];
     
    -                var oldPiece = 1 / oldMatrix.length;
    -                var newPiece = 1 / columnsNumber;
    +                const oldPiece = 1 / oldMatrix.length;
    +                const newPiece = 1 / columnsNumber;
    +                let i;
     
    -                for (var i = 0; i < columnsNumber; i++) {
    -                    var column = new Array(oldMatrix[0].length);
    +                for (i = 0; i < columnsNumber; i++) {
    +                    const column = new Array(oldMatrix[0].length);
    +                    let j;
     
    -                    for (var j = 0; j < oldMatrix.length; j++) {
    -                        var oldStart = j * oldPiece;
    -                        var oldEnd = oldStart + oldPiece;
    -                        var newStart = i * newPiece;
    -                        var newEnd = newStart + newPiece;
    +                    for (j = 0; j < oldMatrix.length; j++) {
    +                        const oldStart = j * oldPiece;
    +                        const oldEnd = oldStart + oldPiece;
    +                        const newStart = i * newPiece;
    +                        const newEnd = newStart + newPiece;
     
    -                        var overlap = (oldEnd <= newStart || newEnd <= oldStart) ?
    +                        const overlap = (oldEnd <= newStart || newEnd <= oldStart) ?
                             0 :
                             Math.min(Math.max(oldEnd, newStart), Math.max(newEnd, oldStart)) -
                             Math.max(Math.min(oldEnd, newStart), Math.min(newEnd, oldStart));
    +                        let k;
                             /* eslint-disable max-depth */
                             if (overlap > 0) {
    -                            for (var k = 0; k < oldMatrix[0].length; k++) {
    +                            for (k = 0; k < oldMatrix[0].length; k++) {
                                     if (column[k] == null) {
                                         column[k] = 0;
                                     }
    @@ -431,9 +432,10 @@ export default function(params = {}) {
                             /* eslint-enable max-depth */
                         }
     
    -                    var intColumn = new Uint8Array(oldMatrix[0].length);
    +                    const intColumn = new Uint8Array(oldMatrix[0].length);
    +                    let m;
     
    -                    for (var m = 0; m < oldMatrix[0].length; m++) {
    +                    for (m = 0; m < oldMatrix[0].length; m++) {
                             intColumn[m] = column[m];
                         }
     
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index 887ac5a73..2f96b9b31 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -75,7 +75,7 @@ export default function(params = {}) {
     
                 createWrapper: function () {
     
    -                var wsParams = this.wavesurfer.params;
    +                const wsParams = this.wavesurfer.params;
                     this.wrapper = this.container.appendChild(
                         document.createElement('timeline')
                     );
    @@ -97,14 +97,14 @@ export default function(params = {}) {
     
                     this.wrapper.addEventListener('click', e => {
                         e.preventDefault();
    -                    var relX = 'offsetX' in e ? e.offsetX : e.layerX;
    +                    const relX = 'offsetX' in e ? e.offsetX : e.layerX;
                         this.fireEvent('click', (relX / this.wrapper.scrollWidth) || 0);
                     });
                 },
     
                 removeOldCanvases: function () {
                     while (this.canvases.length > 0) {
    -                    var canvas = this.canvases.pop();
    +                    const canvas = this.canvases.pop();
                         canvas.parentElement.removeChild(canvas);
                     }
                 },
    @@ -112,11 +112,12 @@ export default function(params = {}) {
                 createCanvases: function () {
                     this.removeOldCanvases();
     
    -                var totalWidth = Math.round(this.drawer.wrapper.scrollWidth),
    -                    requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth),
    -                    canvas;
    +                const totalWidth = Math.round(this.drawer.wrapper.scrollWidth);
    +                const requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth);
    +                let canvas;
    +                let i;
     
    -                for (var i = 0; i < requiredCanvases; i++) {
    +                for (i = 0; i < requiredCanvases; i++) {
                         canvas = this.wrapper.appendChild(document.createElement('canvas'));
                         this.canvases.push(canvas);
                         this.drawer.style(canvas, {
    @@ -133,10 +134,11 @@ export default function(params = {}) {
                 },
     
                 updateCanvasStyle: function () {
    -                var requiredCanvases = this.canvases.length;
    -                for (var i = 0; i < requiredCanvases; i++) {
    -                    var canvas = this.canvases[i],
    -                        canvasWidth = this.maxCanvasElementWidth;
    +                const requiredCanvases = this.canvases.length;
    +                let i;
    +                for (i = 0; i < requiredCanvases; i++) {
    +                    const canvas = this.canvases[i];
    +                    let canvasWidth = this.maxCanvasElementWidth;
     
                         if (i === requiredCanvases - 1) {
                             canvasWidth = this.drawer.wrapper.scrollWidth - (this.maxCanvasElementWidth * (requiredCanvases - 1));
    @@ -151,30 +153,30 @@ export default function(params = {}) {
                 },
     
                 drawTimeCanvases: function() {
    -                var backend = this.wavesurfer.backend,
    -                    wsParams = this.wavesurfer.params,
    -                    duration = backend.getDuration(),
    -                    self = this;
    +                const backend = this.wavesurfer.backend;
    +                const wsParams = this.wavesurfer.params;
    +                const duration = backend.getDuration();
    +                const totalSeconds = parseInt(duration, 10) + 1;
    +                let width;
    +                let curPixel = 0;
    +                let curSeconds = 0;
     
                     if (wsParams.fillParent && !wsParams.scrollParent) {
    -                    var width = this.drawer.getWidth();
    +                    width = this.drawer.getWidth();
                     } else {
                         width = this.drawer.wrapper.scrollWidth * wsParams.pixelRatio;
                     }
    -                var pixelsPerSecond = width/duration;
    +                const pixelsPerSecond = width/duration;
     
                     if (duration <= 0) { return; }
     
    -                var curPixel = 0,
    -                    curSeconds = 0,
    -                    totalSeconds = parseInt(duration, 10) + 1;
    -                var formatTime = seconds => {
    -                    if (typeof self.formatTimeCallback === 'function') {
    -                        return self.formatTimeCallback(seconds);
    +                const formatTime = seconds => {
    +                    if (typeof this.formatTimeCallback === 'function') {
    +                        return this.formatTimeCallback(seconds);
                         }
     
                         if (seconds/60 > 1) {
    -                        var minutes = parseInt(seconds / 60);
    +                        const minutes = parseInt(seconds / 60);
                             seconds = parseInt(seconds % 60);
                             seconds = (seconds < 10) ? '0' + seconds : seconds;
                             return '' + minutes + ':' + seconds;
    @@ -182,9 +184,9 @@ export default function(params = {}) {
                         return seconds;
                     };
     
    -                var timeInterval = 60;
    -                var primaryLabelInterval = 4;
    -                var secondaryLabelInterval = 2;
    +                let timeInterval = 60;
    +                let primaryLabelInterval = 4;
    +                let secondaryLabelInterval = 2;
                     if (pixelsPerSecond * 1 >= 25) {
                         timeInterval = 1;
                         primaryLabelInterval = 10;
    @@ -203,11 +205,12 @@ export default function(params = {}) {
                     primaryLabelInterval = this.primaryLabelInterval || primaryLabelInterval;
                     secondaryLabelInterval = this.secondaryLabelInterval || secondaryLabelInterval;
     
    -                var height1 = this.height - 4,
    -                    height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4,
    -                    fontSize = this.fontSize * wsParams.pixelRatio;
    +                const height1 = this.height - 4;
    +                const height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4;
    +                const fontSize = this.fontSize * wsParams.pixelRatio;
    +                let i;
     
    -                for (var i = 0; i < totalSeconds/timeInterval; i++) {
    +                for (i = 0; i < totalSeconds/timeInterval; i++) {
                         if (i % primaryLabelInterval == 0) {
                             this.setFillStyles(this.primaryColor);
                             this.fillRect(curPixel, 0, 1, height1);
    @@ -231,23 +234,26 @@ export default function(params = {}) {
                 },
     
                 setFillStyles: function (fillStyle) {
    -                for (var i in this.canvases) {
    +                let i;
    +                for (i in this.canvases) {
                         this.canvases[i].getContext('2d').fillStyle = fillStyle;
                     }
                 },
     
                 setFonts: function (font) {
    -                for (var i in this.canvases) {
    +                let i;
    +                for (i in this.canvases) {
                         this.canvases[i].getContext('2d').font = font;
                     }
                 },
     
                 fillRect: function (x, y, width, height) {
    -                for (var i in this.canvases) {
    -                    var canvas = this.canvases[i],
    -                        leftOffset = i * this.maxCanvasWidth;
    +                let i;
    +                for (i in this.canvases) {
    +                    const canvas = this.canvases[i];
    +                    const leftOffset = i * this.maxCanvasWidth;
     
    -                    var intersection = {
    +                    const intersection = {
                             x1: Math.max(x, i * this.maxCanvasWidth),
                             y1: y,
                             x2: Math.min(x + width, i * this.maxCanvasWidth + canvas.width),
    @@ -266,12 +272,13 @@ export default function(params = {}) {
                 },
     
                 fillText: function (text, x, y) {
    -                var textWidth,
    -                    xOffset = 0;
    +                let textWidth;
    +                let xOffset = 0;
    +                let i;
     
    -                for (var i in this.canvases) {
    -                    var context = this.canvases[i].getContext('2d'),
    -                        canvasWidth = context.canvas.width;
    +                for (i in this.canvases) {
    +                    const context = this.canvases[i].getContext('2d');
    +                    const canvasWidth = context.canvas.width;
     
                         if (xOffset > x + textWidth) {
                             break;
    diff --git a/src/util/observer.js b/src/util/observer.js
    index 29239a6c3..1ad68f251 100644
    --- a/src/util/observer.js
    +++ b/src/util/observer.js
    @@ -26,9 +26,10 @@ export default {
             if (!this.handlers) { return; }
     
             const handlers = this.handlers[event];
    +        let i;
             if (handlers) {
                 if (fn) {
    -                for (var i = handlers.length - 1; i >= 0; i--) {
    +                for (i = handlers.length - 1; i >= 0; i--) {
                         if (handlers[i] == fn) {
                             handlers.splice(i, 1);
                         }
    diff --git a/src/wavesurfer.js b/src/wavesurfer.js
    index 47985b88f..246536052 100755
    --- a/src/wavesurfer.js
    +++ b/src/wavesurfer.js
    @@ -301,8 +301,8 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         skip: function (offset) {
    -        var position = this.getCurrentTime() || 0;
    -        var duration = this.getDuration() || 1;
    +        const duration = this.getDuration() || 1;
    +        let position = this.getCurrentTime() || 0;
             position = Math.max(0, Math.min(duration, position + (offset || 0)));
             this.seekAndCenter(position / duration);
         },
    @@ -315,9 +315,9 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         seekTo: function (progress) {
             this.fireEvent('interaction', () => this.seekTo(progress));
     
    -        var paused = this.backend.isPaused();
    +        const paused = this.backend.isPaused();
             // avoid small scrolls while paused seeking
    -        var oldScrollParent = this.params.scrollParent;
    +        const oldScrollParent = this.params.scrollParent;
             if (paused) {
                 this.params.scrollParent = false;
             }
    @@ -398,18 +398,18 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         drawBuffer: function () {
    -        var nominalWidth = Math.round(
    +        const nominalWidth = Math.round(
                 this.getDuration() * this.params.minPxPerSec * this.params.pixelRatio
             );
    -        var parentWidth = this.drawer.getWidth();
    -        var width = nominalWidth;
    +        const parentWidth = this.drawer.getWidth();
    +        let width = nominalWidth;
     
             // Fill container
             if (this.params.fillParent && (!this.params.scrollParent || nominalWidth < parentWidth)) {
                 width = parentWidth;
             }
     
    -        var peaks = this.backend.getPeaks(width);
    +        const peaks = this.backend.getPeaks(width);
             this.drawer.drawPeaks(peaks, width);
             this.fireEvent('redraw', peaks, width);
         },
    @@ -455,7 +455,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          */
         loadBlob: function (blob) {
             // Create file reader
    -        var reader = new FileReader();
    +        const reader = new FileReader();
             reader.addEventListener('progress', e => this.onProgress(e));
             reader.addEventListener('load', e => {
                 console.log(e);
    @@ -482,7 +482,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * Loads audio using Web Audio buffer backend.
          */
         loadBuffer: function (url, peaks) {
    -        var load = action => {
    +        const load = action => {
                 if (action) {
                     this.tmpEvents.push(this.once('ready', action));
                 }
    @@ -508,12 +508,12 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *                                          web audio dependency
          */
         loadMediaElement: function (urlOrElt, peaks, preload) {
    -        var url = urlOrElt;
    +        let url = urlOrElt;
     
             if (typeof urlOrElt === 'string') {
                 this.backend.load(url, this.mediaContainer, peaks, preload);
             } else {
    -            var elt = urlOrElt;
    +            const elt = urlOrElt;
                 this.backend.loadElt(elt, peaks);
     
                 // If peaks are not provided,
    @@ -561,7 +561,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         getArrayBuffer: function (url, callback) {
    -        var ajax = WaveSurfer.util.ajax({
    +        const ajax = WaveSurfer.util.ajax({
                 url: url,
                 responseType: 'arraybuffer'
             });
    @@ -586,8 +586,9 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         },
     
         onProgress: function (e) {
    +        let percentComplete;
             if (e.lengthComputable) {
    -            var percentComplete = e.loaded / e.total;
    +            percentComplete = e.loaded / e.total;
             } else {
                 // Approximate progress with an asymptotic
                 // function, and assume downloads in the 1-3 MB range.
    @@ -603,9 +604,9 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             length = length || 1024;
             accuracy = accuracy || 10000;
             noWindow = noWindow || false;
    -        var peaks = this.backend.getPeaks(length, accuracy);
    -        var arr = [].map.call(peaks, val => Math.round(val * accuracy) / accuracy);
    -        var json = JSON.stringify(arr);
    +        const peaks = this.backend.getPeaks(length, accuracy);
    +        const arr = [].map.call(peaks, val => Math.round(val * accuracy) / accuracy);
    +        const json = JSON.stringify(arr);
             if (!noWindow) {
                 window.open('data:application/json;charset=utf-8,' +
                     encodeURIComponent(json));
    @@ -672,7 +673,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
     });
     
     WaveSurfer.create = function (params) {
    -    var wavesurfer = Object.create(WaveSurfer);
    +    const wavesurfer = Object.create(WaveSurfer);
         wavesurfer.init(params);
         return wavesurfer;
     };
    diff --git a/src/webaudio.js b/src/webaudio.js
    index 86d1c4eb2..fb7f58ccc 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -108,7 +108,7 @@ const WebAudio = util.extend({}, util.observer, {
     
         addOnAudioProcess: function () {
             this.scriptNode.onaudioprocess = () => {
    -            var time = this.getCurrentTime();
    +            const time = this.getCurrentTime();
     
                 if (time >= this.getDuration()) {
                     this.setState(this.FINISHED_STATE);
    @@ -188,24 +188,27 @@ const WebAudio = util.extend({}, util.observer, {
         getPeaks: function (length) {
             if (this.peaks) { return this.peaks; }
     
    -        var sampleSize = this.buffer.length / length;
    -        var sampleStep = ~~(sampleSize / 10) || 1;
    -        var channels = this.buffer.numberOfChannels;
    -        var splitPeaks = [];
    -        var mergedPeaks = [];
    +        const sampleSize = this.buffer.length / length;
    +        const sampleStep = ~~(sampleSize / 10) || 1;
    +        const channels = this.buffer.numberOfChannels;
    +        const splitPeaks = [];
    +        const mergedPeaks = [];
    +        let c;
     
    -        for (var c = 0; c < channels; c++) {
    -            var peaks = splitPeaks[c] = [];
    -            var chan = this.buffer.getChannelData(c);
    +        for (c = 0; c < channels; c++) {
    +            const peaks = splitPeaks[c] = [];
    +            const chan = this.buffer.getChannelData(c);
    +            let i;
     
    -            for (var i = 0; i < length; i++) {
    -                var start = ~~(i * sampleSize);
    -                var end = ~~(start + sampleSize);
    -                var min = 0;
    -                var max = 0;
    +            for (i = 0; i < length; i++) {
    +                const start = ~~(i * sampleSize);
    +                const end = ~~(start + sampleSize);
    +                let min = 0;
    +                let max = 0;
    +                let j;
     
    -                for (var j = start; j < end; j += sampleStep) {
    -                    var value = chan[j];
    +                for (j = start; j < end; j += sampleStep) {
    +                    const value = chan[j];
     
                         if (value > max) {
                             max = value;
    @@ -329,7 +332,7 @@ const WebAudio = util.extend({}, util.observer, {
             // need to re-create source on each playback
             this.createSource();
     
    -        var adjustedTime = this.seekTo(start, end);
    +        const adjustedTime = this.seekTo(start, end);
     
             start = adjustedTime.start;
             end = adjustedTime.end;
    @@ -387,7 +390,7 @@ WebAudio.state.playing = {
             this.addOnAudioProcess();
         },
         getPlayedPercents: function () {
    -        var duration = this.getDuration();
    +        const duration = this.getDuration();
             return (this.getCurrentTime() / duration) || 0;
         },
         getCurrentTime: function () {
    @@ -400,7 +403,7 @@ WebAudio.state.paused = {
             this.removeOnAudioProcess();
         },
         getPlayedPercents: function () {
    -        var duration = this.getDuration();
    +        const duration = this.getDuration();
             return (this.getCurrentTime() / duration) || 0;
         },
         getCurrentTime: function () {
    
    From e798fb153f7a2e1f213a18507aab8b73b0dc74db Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Sun, 11 Dec 2016 10:24:45 +0100
    Subject: [PATCH 011/573] enabled eslint array-bracket-spacing rule and fixed
     code (#887)
    
    ---
     .eslintrc.js          | 2 +-
     src/drawer.canvas.js  | 4 ++--
     src/plugin/regions.js | 2 +-
     3 files changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 2939e6f09..66e09e807 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -10,7 +10,7 @@ module.exports = {
         },
         "rules": {
             "accessor-pairs": "error",
    -        "array-bracket-spacing": "off",
    +        "array-bracket-spacing": "error",
             "array-callback-return": "error",
             "arrow-body-style": "error",
             "arrow-parens": "off",
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 41359770c..8e4b48409 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -106,7 +106,7 @@ export default util.extend({}, drawer, {
                 this.progressCc.fillStyle = this.params.progressColor;
             }
     
    -        [ this.waveCc, this.progressCc ].forEach(cc => {
    +        [this.waveCc, this.progressCc].forEach(cc => {
                 if (!cc) { return; }
                 let i;
     
    @@ -166,7 +166,7 @@ export default util.extend({}, drawer, {
                 this.progressCc.fillStyle = this.params.progressColor;
             }
     
    -        [ this.waveCc, this.progressCc ].forEach(cc => {
    +        [this.waveCc, this.progressCc].forEach(cc => {
                 if (!cc) { return; }
                 let i;
                 let j;
    diff --git a/src/plugin/regions.js b/src/plugin/regions.js
    index 928276b8a..7d778b58f 100644
    --- a/src/plugin/regions.js
    +++ b/src/plugin/regions.js
    @@ -136,7 +136,7 @@ const Region = {
         },
     
         formatTime: function (start, end) {
    -        return (start == end ? [ start ] : [ start, end ]).map(time => [
    +        return (start == end ? [start] : [start, end]).map(time => [
                 Math.floor((time % 3600) / 60), // minutes
                 ('00' + Math.floor(time % 60)).slice(-2) // seconds
             ].join(':')).join('-');
    
    From 2f07e71dcad2519e7a84be63b24a844c5e178aff Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Sun, 11 Dec 2016 10:26:00 +0100
    Subject: [PATCH 012/573] enabled eslint prefer-rest-params rule and fixed code
     (#888)
    
    ---
     .eslintrc.js         | 2 +-
     src/util/observer.js | 4 ++--
     src/webaudio.js      | 4 ++--
     3 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 66e09e807..e9a4a9fd6 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -221,7 +221,7 @@ module.exports = {
             "prefer-const": "error",
             "prefer-numeric-literals": "error",
             "prefer-reflect": "off",
    -        "prefer-rest-params": "off",
    +        "prefer-rest-params": "error",
             "prefer-spread": "error",
             "prefer-template": "off",
             "quote-props": "off",
    diff --git a/src/util/observer.js b/src/util/observer.js
    index 1ad68f251..30a877dd0 100644
    --- a/src/util/observer.js
    +++ b/src/util/observer.js
    @@ -52,9 +52,9 @@ export default {
          * event type.
          */
         once: function (event, handler) {
    -        const fn = () => {
    +        const fn = (...args) => {
                 /*  eslint-disable no-invalid-this, prefer-rest-params */
    -            handler.apply(this, arguments);
    +            handler.apply(this, args);
                 /*  eslint-enable no-invalid-this, prefer-rest-params */
                 setTimeout(() => {
                     this.un(event, fn);
    diff --git a/src/webaudio.js b/src/webaudio.js
    index fb7f58ccc..bea5e514b 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -69,8 +69,8 @@ const WebAudio = util.extend({}, util.observer, {
         },
     
         // Unpacked filters
    -    setFilter: function () {
    -        this.setFilters([].slice.call(arguments));
    +    setFilter: function (...filters) {
    +        this.setFilters(filters);
         },
     
         /**
    
    From b7c37eb3a11656579c893513a610d3d19997f542 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Tue, 20 Dec 2016 23:49:07 +0100
    Subject: [PATCH 013/573] fixes invalid this error in elan plugin by using
     arrow function (#891)
    
    ---
     src/plugin/elan.js | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    index 8fe416495..5df50b855 100644
    --- a/src/plugin/elan.js
    +++ b/src/plugin/elan.js
    @@ -175,7 +175,7 @@ export default function(params = {}) {
                     th.textContent = 'Time';
                     th.className = 'wavesurfer-time';
                     headRow.appendChild(th);
    -                indeces.forEach(function (index) {
    +                indeces.forEach(index => {
                         const tier = tiers[index];
                         const th = document.createElement('th');
                         th.className = 'wavesurfer-tier-' + tier.id;
    
    From 878d2cb4b47833136bedf767fa3d5ef6941a1cf5 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Thu, 19 Jan 2017 20:11:39 +0100
    Subject: [PATCH 014/573] Next: refactor cursor plugin (#892)
    
    * caching style util function locally for smaller builds
    
    * more consistently named event listeners, cached drawer and wrappers from wavesurfer parameter directly for smaller minified builds, only remove event listeners in destroy function when they were previously attached
    
    * use wavesurfer parameter in init function for smaller minified builds, added comments
    
    * only remove cursor html element in destroy function if it was already added, added comments
    ---
     src/plugin/cursor.js | 55 +++++++++++++++++++++++++++++---------------
     1 file changed, 37 insertions(+), 18 deletions(-)
    
    diff --git a/src/plugin/cursor.js b/src/plugin/cursor.js
    index e6ccee115..efa1e261a 100644
    --- a/src/plugin/cursor.js
    +++ b/src/plugin/cursor.js
    @@ -18,21 +18,22 @@ export default function(params) {
             instance: {
                 init: function (wavesurfer) {
                     this.wavesurfer = wavesurfer;
    +                this.style = wavesurfer.util.style;
                     this._onDrawerCreated = () => {
    -                    this.drawer = this.wavesurfer.drawer;
    -                    this.wrapper = this.drawer.wrapper;
    +                    this.drawer = wavesurfer.drawer;
    +                    this.wrapper = wavesurfer.drawer.wrapper;
     
    -                    this._handleMousemove = (e) => this.updateCursorPosition(this.drawer.handleEvent(e));
    -                    this.wrapper.addEventListener('mousemove', this._handleMousemove);
    +                    this._onMousemove = e => this.updateCursorPosition(this.drawer.handleEvent(e));
    +                    this.wrapper.addEventListener('mousemove', this._onMousemove);
     
    -                    this._handleMouseenter = () => this.showCursor();
    -                    this.wrapper.addEventListener('mouseenter', this._handleMouseenter);
    +                    this._onMouseenter = () => this.showCursor();
    +                    this.wrapper.addEventListener('mouseenter', this._onMouseenter);
     
    -                    this._handleMouseLeave = () => this.hideCursor();
    -                    this.wrapper.addEventListener('mouseleave', this._handleMouseLeave);
    +                    this._onMouseleave = () => this.hideCursor();
    +                    this.wrapper.addEventListener('mouseleave', this._onMouseleave);
     
                         this.cursor = this.wrapper.appendChild(
    -                        this.drawer.style(document.createElement('wave'), {
    +                        this.style(document.createElement('wave'), {
                                 position: 'absolute',
                                 zIndex: 3,
                                 left: 0,
    @@ -49,31 +50,49 @@ export default function(params) {
                         );
                     };
     
    -                if (this.wavesurfer.drawer) {
    +                // drawer already existed, just call initialisation code
    +                if (wavesurfer.drawer) {
                         this._onDrawerCreated();
                     }
    -                this.wavesurfer.on('drawer-created', this._onDrawerCreated);
    +
    +                // the drawer was initialised, call the initialisation code
    +                wavesurfer.on('drawer-created', this._onDrawerCreated);
                 },
     
                 destroy() {
                     this.wavesurfer.un('drawer-created', this._onDrawerCreated);
    -                this.cursor.parentNode.removeChild(this.cursor);
    -                this.wrapper.removeEventListener('mousemove', this._handleMousemove);
    -                this.wrapper.removeEventListener('mouseenter', this._handleMouseenter);
    -                this.wrapper.removeEventListener('mouseleave', this._handleMouseLeave);
    +
    +                // if cursor was appended, remove it
    +                if (this.cursor) {
    +                    this.cursor.parentNode.removeChild(this.cursor);
    +                }
    +
    +                // if the drawer existed (the cached version referenced in the init code),
    +                // remove the event listeners attached to it
    +                if (this.drawer) {
    +                    this.wrapper.removeEventListener('mousemove', this._onMousemove);
    +                    this.wrapper.removeEventListener('mouseenter', this._onMouseenter);
    +                    this.wrapper.removeEventListener('mouseleave', this._onMouseleave);
    +                }
                 },
     
                 updateCursorPosition: function(progress) {
                     const pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
    -                this.drawer.style(this.cursor, { left: pos + 'px' });
    +                this.style(this.cursor, {
    +                    left: `${pos}px`
    +                });
                 },
     
                 showCursor: function() {
    -                this.drawer.style(this.cursor, { display: 'block' });
    +                this.style(this.cursor, {
    +                    display: 'block'
    +                });
                 },
     
                 hideCursor: function() {
    -                this.drawer.style(this.cursor, { display: 'none' });
    +                this.style(this.cursor, {
    +                    display: 'none'
    +                });
                 }
             }
         };
    
    From e5ad0979c37f8604a0eddf604638a85d0650152f Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Thu, 19 Jan 2017 20:11:58 +0100
    Subject: [PATCH 015/573] resume ac only if suspended and has the resume method
     (#894)
    
    ---
     spec/wavesurfer.spec.js | 17 ++++++-----------
     src/webaudio.js         |  5 ++++-
     2 files changed, 10 insertions(+), 12 deletions(-)
    
    diff --git a/spec/wavesurfer.spec.js b/spec/wavesurfer.spec.js
    index f49679ab2..f2c08b5dc 100755
    --- a/spec/wavesurfer.spec.js
    +++ b/spec/wavesurfer.spec.js
    @@ -13,11 +13,6 @@ describe('wavesurfer', function () {
             waveformDiv.id = 'waveform';
             document.getElementsByTagName('body')[0].appendChild(waveformDiv);
     
    -        var ctx = document.createElement('canvas').getContext('2d');
    -        var linGrad = ctx.createLinearGradient(0, 64, 0, 200);
    -        linGrad.addColorStop(0.5, 'rgba(225, 225, 225, 1.000)');
    -        linGrad.addColorStop(0.5, 'rgba(183, 183, 183, 1.000)');
    -
             return WaveSurfer.create({
                 container: '#waveform',
                 waveColor: 'violet',
    @@ -42,13 +37,13 @@ describe('wavesurfer', function () {
             wavesurfer.destroy();
         });
     
    -    it('play', function () {
    +    it('should play', function () {
             wavesurfer.play();
     
             expect(wavesurfer.isPlaying()).toBeTrue();
         });
     
    -    it('pause', function () {
    +    it('should pause', function () {
             wavesurfer.play();
             expect(wavesurfer.isPlaying()).toBeTrue();
     
    @@ -56,7 +51,7 @@ describe('wavesurfer', function () {
             expect(wavesurfer.isPlaying()).toBeFalse();
         });
     
    -    it('playPause', function () {
    +    it('should play or pause', function () {
             wavesurfer.playPause();
             expect(wavesurfer.isPlaying()).toBeTrue();
     
    @@ -64,12 +59,12 @@ describe('wavesurfer', function () {
             expect(wavesurfer.isPlaying()).toBeFalse();
         });
     
    -    it('getDuration', function () {
    +    it('should get duration', function () {
             var duration = parseInt(wavesurfer.getDuration(), 10);
             expect(duration).toBeNumber();
         });
     
    -    it('toggleMute', function () {
    +    it('should toggle mute', function () {
             wavesurfer.toggleMute();
             expect(wavesurfer.isMuted).toBeTrue();
     
    @@ -77,7 +72,7 @@ describe('wavesurfer', function () {
             expect(wavesurfer.isMuted).toBeFalse();
         });
     
    -    it('setMute', function () {
    +    it('should set mute', function () {
             wavesurfer.setMute(true);
             expect(wavesurfer.isMuted).toBeTrue();
     
    diff --git a/src/webaudio.js b/src/webaudio.js
    index bea5e514b..d156e540c 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -340,7 +340,10 @@ const WebAudio = util.extend({}, util.observer, {
             this.scheduledPause = end;
     
             this.source.start(0, start, end - start);
    -        this.ac.resume();
    +
    +        if (this.ac.state == 'suspended') {
    +          this.ac.resume && this.ac.resume();
    +        }
     
             this.setState(this.PLAYING_STATE);
     
    
    From 8ca468946a2463b5b4290d45492dbb89591eb473 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Thu, 19 Jan 2017 20:13:25 +0100
    Subject: [PATCH 016/573] Next: enabled eslint object-shorthand rule and fixed
     code (#889)
    
    * enabled eslint object-shorthand rule and fixed code
    
    * eslint object-shorthand rule only applies to methods, not to property shorthand
    ---
     .eslintrc.js              |  8 +++-
     src/drawer.canvas.js      | 14 +++---
     src/drawer.js             | 38 ++++++++--------
     src/drawer.multicanvas.js | 37 ++++++++--------
     src/mediaelement.js       | 42 +++++++++---------
     src/plugin/cursor.js      |  8 ++--
     src/plugin/elan.js        | 18 ++++----
     src/plugin/microphone.js  | 30 ++++++-------
     src/plugin/minimap.js     | 22 +++++-----
     src/plugin/regions.js     | 34 +++++++--------
     src/plugin/spectrogram.js | 23 +++++-----
     src/plugin/timeline.js    | 26 +++++------
     src/util/observer.js      | 14 +++---
     src/wavesurfer.js         | 91 +++++++++++++++++++--------------------
     src/webaudio.js           | 85 ++++++++++++++++++------------------
     15 files changed, 249 insertions(+), 241 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index e9a4a9fd6..3bf558396 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -204,7 +204,13 @@ module.exports = {
             "object-curly-newline": "off",
             "object-curly-spacing": "off",
             "object-property-newline": "off",
    -        "object-shorthand": "off",
    +        "object-shorthand": [
    +            "error",
    +            "methods",
    +            {
    +                avoidQuotes: true
    +            }
    +        ],
             "one-var": [
                 "error",
                 {
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 8e4b48409..2a5fa76ba 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -2,7 +2,7 @@ import drawer from './drawer';
     import * as util from './util';
     
     export default util.extend({}, drawer, {
    -    createElements: function () {
    +    createElements() {
             const waveCanvas = this.wrapper.appendChild(
                 this.style(document.createElement('canvas'), {
                     position: 'absolute',
    @@ -39,7 +39,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    updateSize: function () {
    +    updateSize() {
             const width = Math.round(this.width / this.params.pixelRatio);
     
             this.waveCc.canvas.width = this.width;
    @@ -57,14 +57,14 @@ export default util.extend({}, drawer, {
             this.clearWave();
         },
     
    -    clearWave: function () {
    +    clearWave() {
             this.waveCc.clearRect(0, 0, this.width, this.height);
             if (this.progressCc) {
                 this.progressCc.clearRect(0, 0, this.width, this.height);
             }
         },
     
    -    drawBars: function (peaks, channelIndex) {
    +    drawBars(peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
                 const channels = peaks;
    @@ -117,7 +117,7 @@ export default util.extend({}, drawer, {
             });
         },
     
    -    drawWave: function (peaks, channelIndex) {
    +    drawWave(peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
                 const channels = peaks;
    @@ -194,14 +194,14 @@ export default util.extend({}, drawer, {
             });
         },
     
    -    updateProgress: function (progress) {
    +    updateProgress(progress) {
             const pos = Math.round(
                 this.width * progress
             ) / this.params.pixelRatio;
             this.style(this.progressWave, { width: pos + 'px' });
         },
     
    -    getImage: function(type, quality) {
    +    getImage(type, quality) {
             return this.waveCc.canvas.toDataURL(type, quality);
         }
     });
    diff --git a/src/drawer.js b/src/drawer.js
    index 3826a1861..829470dcd 100644
    --- a/src/drawer.js
    +++ b/src/drawer.js
    @@ -1,7 +1,7 @@
     import * as util from './util';
     
     export default util.extend({}, util.observer, {
    -    init: function (container, params) {
    +    init(container, params) {
             this.container = container;
             this.params = params;
     
    @@ -15,7 +15,7 @@ export default util.extend({}, util.observer, {
             this.createElements();
         },
     
    -    createWrapper: function () {
    +    createWrapper() {
             this.wrapper = this.container.appendChild(
                 document.createElement('wave')
             );
    @@ -39,7 +39,7 @@ export default util.extend({}, util.observer, {
             this.setupWrapperEvents();
         },
     
    -    handleEvent: function (e, noPrevent) {
    +    handleEvent(e, noPrevent) {
             !noPrevent && e.preventDefault();
     
             const clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;
    @@ -63,7 +63,7 @@ export default util.extend({}, util.observer, {
             return progress;
         },
     
    -    setupWrapperEvents: function () {
    +    setupWrapperEvents() {
             this.wrapper.addEventListener('click', e => {
                 const scrollbarHeight = this.wrapper.offsetHeight - this.wrapper.clientHeight;
                 if (scrollbarHeight != 0) {
    @@ -83,7 +83,7 @@ export default util.extend({}, util.observer, {
             this.wrapper.addEventListener('scroll', e => this.fireEvent('scroll', e));
         },
     
    -    drawPeaks: function (peaks, length) {
    +    drawPeaks(peaks, length) {
             this.resetScroll();
             this.setWidth(length);
     
    @@ -95,18 +95,18 @@ export default util.extend({}, util.observer, {
         // Backward compatibility
         style: util.style,
     
    -    resetScroll: function () {
    +    resetScroll() {
             if (this.wrapper !== null) {
                 this.wrapper.scrollLeft = 0;
             }
         },
     
    -    recenter: function (percent) {
    +    recenter(percent) {
             const position = this.wrapper.scrollWidth * percent;
             this.recenterOnPosition(position, true);
         },
     
    -    recenterOnPosition: function (position, immediate) {
    +    recenterOnPosition(position, immediate) {
             const scrollLeft = this.wrapper.scrollLeft;
             const half = ~~(this.wrapper.clientWidth / 2);
             const maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;
    @@ -135,11 +135,11 @@ export default util.extend({}, util.observer, {
     
         },
     
    -    getWidth: function () {
    +    getWidth() {
             return Math.round(this.container.clientWidth * this.params.pixelRatio);
         },
     
    -    setWidth: function (width) {
    +    setWidth(width) {
             this.width = width;
     
             if (this.params.fillParent || this.params.scrollParent) {
    @@ -155,7 +155,7 @@ export default util.extend({}, util.observer, {
             this.updateSize();
         },
     
    -    setHeight: function (height) {
    +    setHeight(height) {
             if (height == this.height) { return; }
             this.height = height;
             this.style(this.wrapper, {
    @@ -164,7 +164,7 @@ export default util.extend({}, util.observer, {
             this.updateSize();
         },
     
    -    progress: function (progress) {
    +    progress(progress) {
             const minPxDelta = 1 / this.params.pixelRatio;
             const pos = Math.round(progress * this.width) * minPxDelta;
     
    @@ -180,7 +180,7 @@ export default util.extend({}, util.observer, {
             }
         },
     
    -    destroy: function () {
    +    destroy() {
             this.unAll();
             if (this.wrapper) {
                 this.container.removeChild(this.wrapper);
    @@ -189,15 +189,15 @@ export default util.extend({}, util.observer, {
         },
     
         /* Renderer-specific methods */
    -    initDrawer: function () {},
    +    initDrawer() {},
     
    -    createElements: function () {},
    +    createElements() {},
     
    -    updateSize: function () {},
    +    updateSize() {},
     
    -    drawWave: function (peaks, max) {},
    +    drawWave(peaks, max) {},
     
    -    clearWave: function () {},
    +    clearWave() {},
     
    -    updateProgress: function (position) {}
    +    updateProgress(position) {}
     });
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 5a12c1fe4..78c73f833 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -2,7 +2,7 @@ import drawer from './drawer';
     import * as util from './util';
     
     export default util.extend({}, drawer, {
    -    initDrawer: function (params) {
    +    initDrawer(params) {
             this.maxCanvasWidth = params.maxCanvasWidth != null ? params.maxCanvasWidth : 4000;
             this.maxCanvasElementWidth = Math.round(this.maxCanvasWidth / this.params.pixelRatio);
     
    @@ -17,7 +17,7 @@ export default util.extend({}, drawer, {
             this.canvases = [];
         },
     
    -    createElements: function () {
    +    createElements() {
             this.progressWave = this.wrapper.appendChild(
                 this.style(document.createElement('wave'), {
                     position: 'absolute',
    @@ -38,7 +38,7 @@ export default util.extend({}, drawer, {
             this.addCanvas();
         },
     
    -    updateSize: function () {
    +    updateSize() {
             const totalWidth = Math.round(this.width / this.params.pixelRatio);
             const requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth);
             let i;
    @@ -64,7 +64,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    addCanvas: function () {
    +    addCanvas() {
             const entry = {};
             const leftOffset = this.maxCanvasElementWidth * this.canvases.length;
     
    @@ -94,7 +94,7 @@ export default util.extend({}, drawer, {
             this.canvases.push(entry);
         },
     
    -    removeCanvas: function () {
    +    removeCanvas() {
             const lastEntry = this.canvases.pop();
             lastEntry.wave.parentElement.removeChild(lastEntry.wave);
             if (this.hasProgressCanvas) {
    @@ -102,7 +102,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    updateDimensions: function (entry, width, height) {
    +    updateDimensions(entry, width, height) {
             const elementWidth = Math.round(width / this.params.pixelRatio);
             const totalWidth = Math.round(this.width / this.params.pixelRatio);
     
    @@ -123,21 +123,21 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    clearWave: function () {
    +    clearWave() {
             let i;
             for (i in this.canvases) {
                 this.clearWaveForEntry(this.canvases[i]);
             }
         },
     
    -    clearWaveForEntry: function (entry) {
    +    clearWaveForEntry(entry) {
             entry.waveCtx.clearRect(0, 0, entry.waveCtx.canvas.width, entry.waveCtx.canvas.height);
             if (this.hasProgressCanvas) {
                 entry.progressCtx.clearRect(0, 0, entry.progressCtx.canvas.width, entry.progressCtx.canvas.height);
             }
         },
     
    -    drawBars: function (peaks, channelIndex) {
    +    drawBars(peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
                 const channels = peaks;
    @@ -180,7 +180,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    drawWave: function (peaks, channelIndex) {
    +    drawWave(peaks, channelIndex) {
             // Split channels
             if (peaks[0] instanceof Array) {
                 const channels = peaks;
    @@ -223,9 +223,10 @@ export default util.extend({}, drawer, {
             this.fillRect(0, halfH + offsetY - this.halfPixel, this.width, this.halfPixel);
         },
     
    -    drawLine: function (peaks, absmax, halfH, offsetY) {
    -        for (const index in this.canvases) {
    -            const entry = this.canvases[index];
    +    drawLine(peaks, absmax, halfH, offsetY) {
    +        let i;
    +        for (i in this.canvases) {
    +            const entry = this.canvases[i];
     
                 this.setFillStyles(entry);
     
    @@ -234,7 +235,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    drawLineToContext: function (entry, ctx, peaks, absmax, halfH, offsetY) {
    +    drawLineToContext(entry, ctx, peaks, absmax, halfH, offsetY) {
             if (!ctx) { return; }
     
             const length = peaks.length / 2;
    @@ -268,7 +269,7 @@ export default util.extend({}, drawer, {
             ctx.fill();
         },
     
    -    fillRect: function (x, y, width, height) {
    +    fillRect(x, y, width, height) {
             let i;
             for (i in this.canvases) {
                 const entry = this.canvases[i];
    @@ -299,19 +300,19 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    fillRectToContext: function (ctx, x, y, width, height) {
    +    fillRectToContext(ctx, x, y, width, height) {
             if (!ctx) { return; }
             ctx.fillRect(x, y, width, height);
         },
     
    -    setFillStyles: function (entry) {
    +    setFillStyles(entry) {
             entry.waveCtx.fillStyle = this.params.waveColor;
             if (this.hasProgressCanvas) {
                 entry.progressCtx.fillStyle = this.params.progressColor;
             }
         },
     
    -    updateProgress: function (progress) {
    +    updateProgress(progress) {
             const pos = Math.round(
                 this.width * progress
             ) / this.params.pixelRatio;
    diff --git a/src/mediaelement.js b/src/mediaelement.js
    index 5089923d5..96ef154b7 100755
    --- a/src/mediaelement.js
    +++ b/src/mediaelement.js
    @@ -2,7 +2,7 @@ import webaudio from './webaudio';
     import * as util from './util';
     
     export default util.extend({}, webaudio, {
    -    init: function (params) {
    +    init(params) {
             this.params = params;
     
             // Dummy media to catch errors
    @@ -11,8 +11,8 @@ export default util.extend({}, webaudio, {
                 duration: 0,
                 paused: true,
                 playbackRate: 1,
    -            play: function () {},
    -            pause: function () {}
    +            play() {},
    +            pause() {}
             };
     
             this.mediaType = params.mediaType.toLowerCase();
    @@ -25,7 +25,7 @@ export default util.extend({}, webaudio, {
         /**
          * Create a timer to provide a more precise `audioprocess' event.
          */
    -    createTimer: function () {
    +    createTimer() {
             const onAudioProcess = () => {
                 if (this.isPaused()) { return; }
                 this.fireEvent('audioprocess', this.getCurrentTime());
    @@ -46,7 +46,7 @@ export default util.extend({}, webaudio, {
          *  @param  {Array}         peaks       array of peak data
          *  @param  {String}        preload     HTML 5 preload attribute value
          */
    -    load: function (url, container, peaks, preload) {
    +    load(url, container, peaks, preload) {
             const media = document.createElement(this.mediaType);
             media.controls = this.params.mediaControls;
             media.autoplay = this.params.autoplay || false;
    @@ -68,7 +68,7 @@ export default util.extend({}, webaudio, {
          *  @param  {MediaElement}  elt     HTML5 Audio or Video element
          *  @param  {Array}         peaks   array of peak data
          */
    -    loadElt: function (elt, peaks) {
    +    loadElt(elt, peaks) {
             elt.controls = this.params.mediaControls;
             elt.autoplay = this.params.autoplay || false;
     
    @@ -82,7 +82,7 @@ export default util.extend({}, webaudio, {
          *  @param  {Array}         peaks   array of peak data
          *  @private
          */
    -    _load: function (media, peaks) {
    +    _load(media, peaks) {
             // load must be called manually on iOS, otherwise peaks won't draw
             // until a user interaction triggers load --> 'ready' event
             media.load();
    @@ -106,11 +106,11 @@ export default util.extend({}, webaudio, {
             this.setPlaybackRate(this.playbackRate);
         },
     
    -    isPaused: function () {
    +    isPaused() {
             return !this.media || this.media.paused;
         },
     
    -    getDuration: function () {
    +    getDuration() {
             let duration = this.media.duration;
             if (duration >= Infinity) { // streaming audio
                 duration = this.media.seekable.end(0);
    @@ -118,23 +118,23 @@ export default util.extend({}, webaudio, {
             return duration;
         },
     
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.media && this.media.currentTime;
         },
     
    -    getPlayedPercents: function () {
    +    getPlayedPercents() {
             return (this.getCurrentTime() / this.getDuration()) || 0;
         },
     
         /**
          * Set the audio source playback rate.
          */
    -    setPlaybackRate: function (value) {
    +    setPlaybackRate(value) {
             this.playbackRate = value || 1;
             this.media.playbackRate = this.playbackRate;
         },
     
    -    seekTo: function (start) {
    +    seekTo(start) {
             if (start != null) {
                 this.media.currentTime = start;
             }
    @@ -149,7 +149,7 @@ export default util.extend({}, webaudio, {
          * @param {Number} end End offset in seconds,
          * relative to the beginning of a clip.
          */
    -    play: function (start, end) {
    +    play(start, end) {
             this.seekTo(start);
             this.media.play();
             end && this.setPlayEnd(end);
    @@ -159,13 +159,13 @@ export default util.extend({}, webaudio, {
         /**
          * Pauses the loaded audio.
          */
    -    pause: function () {
    +    pause() {
             this.media && this.media.pause();
             this.clearPlayEnd();
             this.fireEvent('pause');
         },
     
    -    setPlayEnd: function (end) {
    +    setPlayEnd(end) {
             this.onPlayEnd = time => {
                 if (time >= end) {
                     this.pause();
    @@ -175,29 +175,29 @@ export default util.extend({}, webaudio, {
             this.on('audioprocess', this.onPlayEnd);
         },
     
    -    clearPlayEnd: function () {
    +    clearPlayEnd() {
             if (this.onPlayEnd) {
                 this.un('audioprocess', this.onPlayEnd);
                 this.onPlayEnd = null;
             }
         },
     
    -    getPeaks: function (length) {
    +    getPeaks(length) {
             if (this.buffer) {
                 return webaudio.getPeaks.call(this, length);
             }
             return this.peaks || [];
         },
     
    -    getVolume: function () {
    +    getVolume() {
             return this.media.volume;
         },
     
    -    setVolume: function (val) {
    +    setVolume(val) {
             this.media.volume = val;
         },
     
    -    destroy: function () {
    +    destroy() {
             this.pause();
             this.unAll();
             this.media && this.media.parentNode && this.media.parentNode.removeChild(this.media);
    diff --git a/src/plugin/cursor.js b/src/plugin/cursor.js
    index efa1e261a..8a7d73a51 100644
    --- a/src/plugin/cursor.js
    +++ b/src/plugin/cursor.js
    @@ -16,7 +16,7 @@ export default function(params) {
             },
             extends: ['observer'],
             instance: {
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.wavesurfer = wavesurfer;
                     this.style = wavesurfer.util.style;
                     this._onDrawerCreated = () => {
    @@ -76,20 +76,20 @@ export default function(params) {
                     }
                 },
     
    -            updateCursorPosition: function(progress) {
    +            updateCursorPosition(progress) {
                     const pos = Math.round(this.drawer.width * progress) / this.drawer.params.pixelRatio - 1;
                     this.style(this.cursor, {
                         left: `${pos}px`
                     });
                 },
     
    -            showCursor: function() {
    +            showCursor() {
                     this.style(this.cursor, {
                         display: 'block'
                     });
                 },
     
    -            hideCursor: function() {
    +            hideCursor() {
                     this.style(this.cursor, {
                         display: 'none'
                     });
    diff --git a/src/plugin/elan.js b/src/plugin/elan.js
    index 5df50b855..2ec44a8ba 100644
    --- a/src/plugin/elan.js
    +++ b/src/plugin/elan.js
    @@ -15,7 +15,7 @@ export default function(params = {}) {
                     REF_ANNOTATION: 'REF_ANNOTATION'
                 },
     
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.data = null;
                     this.params = params;
                     this.container = 'string' == typeof params.container ?
    @@ -32,12 +32,12 @@ export default function(params = {}) {
                     }
                 },
     
    -            destroy: function() {
    +            destroy() {
                     this.container.removeEventListener('click', this._onClick);
                     this.container.removeChild(this.table);
                 },
     
    -            load: function (url) {
    +            load(url) {
                     this.loadXML(url, xml => {
                         this.data = this.parseElan(xml);
                         this.render();
    @@ -45,7 +45,7 @@ export default function(params = {}) {
                     });
                 },
     
    -            loadXML: function (url, callback) {
    +            loadXML(url, callback) {
                     const xhr = new XMLHttpRequest();
                     xhr.open('GET', url, true);
                     xhr.responseType = 'document';
    @@ -55,7 +55,7 @@ export default function(params = {}) {
                     });
                 },
     
    -            parseElan: function (xml) {
    +            parseElan(xml) {
                     const _forEach = Array.prototype.forEach;
                     const _map = Array.prototype.map;
     
    @@ -137,7 +137,7 @@ export default function(params = {}) {
                     return data;
                 },
     
    -            render: function () {
    +            render() {
                     // apply tiers filter
                     let tiers = this.data.tiers;
                     if (this.params.tiers) {
    @@ -219,7 +219,7 @@ export default function(params = {}) {
                     this.container.appendChild(table);
                 },
     
    -            bindClick: function () {
    +            bindClick() {
                     this._onClick = e => {
                         const ref = e.target.dataset.ref;
                         if (null != ref) {
    @@ -232,7 +232,7 @@ export default function(params = {}) {
                     this.container.addEventListener('click', this._onClick);
                 },
     
    -            getRenderedAnnotation: function (time) {
    +            getRenderedAnnotation(time) {
                     let result;
                     this.renderedAlignable.some(annotation => {
                         if (annotation.start <= time && annotation.end >= time) {
    @@ -244,7 +244,7 @@ export default function(params = {}) {
                     return result;
                 },
     
    -            getAnnotationNode: function (annotation) {
    +            getAnnotationNode(annotation) {
                     return document.getElementById(
                         'wavesurfer-alignable-' + annotation.id
                     );
    diff --git a/src/plugin/microphone.js b/src/plugin/microphone.js
    index ea6e41cba..3f0d0b986 100644
    --- a/src/plugin/microphone.js
    +++ b/src/plugin/microphone.js
    @@ -10,7 +10,7 @@ export default function(params = {}) {
             deferInit: params && params.deferInit ? params.deferInit : false,
             extends: ['observer'],
             instance: {
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.params = params;
                     this.wavesurfer = wavesurfer;
     
    @@ -86,7 +86,7 @@ export default function(params = {}) {
                 /**
                  * Destroy the microphone plugin.
                  */
    -            destroy: function() {
    +            destroy() {
                     // make sure the buffer is not redrawn during
                     // cleanup and demolition of this plugin.
                     this.paused = true;
    @@ -99,7 +99,7 @@ export default function(params = {}) {
                 * Allow user to select audio input device, eg. microphone, and
                 * start the visualization.
                 */
    -            start: function() {
    +            start() {
                     navigator.mediaDevices.getUserMedia(this.constraints)
                         .then((data) => this.gotStream(data))
                         .catch((data) => this.deviceError(data));
    @@ -108,7 +108,7 @@ export default function(params = {}) {
                 /**
                 * Pause/resume visualization.
                 */
    -            togglePlay: function() {
    +            togglePlay() {
                     if (!this.active) {
                         // start it first
                         this.start();
    @@ -127,7 +127,7 @@ export default function(params = {}) {
                 /**
                 * Play visualization.
                 */
    -            play: function() {
    +            play() {
                     this.paused = false;
     
                     this.connect();
    @@ -136,7 +136,7 @@ export default function(params = {}) {
                 /**
                 * Pause visualization.
                 */
    -            pause: function() {
    +            pause() {
                     this.paused = true;
     
                     // disconnect sources so they can be used elsewhere
    @@ -148,7 +148,7 @@ export default function(params = {}) {
                 * Stop the device stream and remove any remaining waveform drawing from
                 * the wavesurfer canvas.
                 */
    -            stop: function() {
    +            stop() {
                     if (this.active) {
                         // stop visualization and device
                         this.stopDevice();
    @@ -161,7 +161,7 @@ export default function(params = {}) {
                 /**
                 * Stop the device and the visualization.
                 */
    -            stopDevice: function() {
    +            stopDevice() {
                     this.active = false;
     
                     // stop visualization
    @@ -189,7 +189,7 @@ export default function(params = {}) {
                 /**
                 * Connect the media sources that feed the visualization.
                 */
    -            connect: function() {
    +            connect() {
                     if (this.stream !== undefined) {
                         // Create an AudioNode from the stream.
                         this.mediaStreamSource = this.micContext.createMediaStreamSource(this.stream);
    @@ -209,7 +209,7 @@ export default function(params = {}) {
                 /**
                 * Disconnect the media sources that feed the visualization.
                 */
    -            disconnect: function() {
    +            disconnect() {
                     if (this.mediaStreamSource !== undefined) {
                         this.mediaStreamSource.disconnect();
                     }
    @@ -223,7 +223,7 @@ export default function(params = {}) {
                 /**
                 * Redraw the waveform.
                 */
    -            reloadBuffer: function(event) {
    +            reloadBuffer(event) {
                     if (!this.paused) {
                         this.wavesurfer.empty();
                         this.wavesurfer.loadDecodedBuffer(event.inputBuffer);
    @@ -235,7 +235,7 @@ export default function(params = {}) {
                 *
                 * @param {LocalMediaStream} stream: the microphone's media stream.
                 */
    -            gotStream: function(stream) {
    +            gotStream(stream) {
                     this.stream = stream;
                     this.active = true;
     
    @@ -249,7 +249,7 @@ export default function(params = {}) {
                 /**
                 * Device error callback.
                 */
    -            deviceError: function(code) {
    +            deviceError(code) {
                     // notify listeners
                     this.fireEvent('deviceError', code);
                 },
    @@ -261,7 +261,7 @@ export default function(params = {}) {
                 * @param {!number} pos position in the version string to be returned.
                 * @return {!number} browser version.
                 */
    -            extractVersion: function(uastring, expr, pos) {
    +            extractVersion(uastring, expr, pos) {
                     const match = uastring.match(expr);
                     return match && match.length >= pos && parseInt(match[pos], 10);
                 },
    @@ -271,7 +271,7 @@ export default function(params = {}) {
                 * @return {object} result containing browser, version and minVersion
                 *     properties.
                 */
    -            detectBrowser: function() {
    +            detectBrowser() {
                     // Returned result object.
                     const result = {};
                     result.browser = null;
    diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js
    index 853ae0fde..7920d425e 100644
    --- a/src/plugin/minimap.js
    +++ b/src/plugin/minimap.js
    @@ -17,7 +17,7 @@ export default function(params = {}) {
             },
             extends: ['observer', 'drawer'],
             instance: {
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.wavesurfer = wavesurfer;
                     this._onDrawerCreated = () => {
                         this.container = this.wavesurfer.drawer.container;
    @@ -56,13 +56,13 @@ export default function(params = {}) {
                     this.wavesurfer.on('drawer-created', this._onDrawerCreated);
                 },
     
    -            destroy: function () {
    +            destroy() {
                     window.removeEventListener('resize', this._onResize, true);
                     this.wavesurfer.un('drawer-created', this._onDrawerCreated);
                     this.wrapper.parentNode.removeChild(this.wrapper);
                 },
     
    -            regions: function() {
    +            regions() {
                     this.regions = {};
     
                     this.wavesurfer.on('region-created', region => {
    @@ -80,7 +80,8 @@ export default function(params = {}) {
                         this.renderRegions();
                     });
                 },
    -            renderRegions: function() {
    +
    +            renderRegions() {
                     const regionElements = this.wrapper.querySelectorAll('region');
                     let i;
                     for (i = 0; i < regionElements.length; ++i) {
    @@ -103,7 +104,8 @@ export default function(params = {}) {
                         this.wrapper.appendChild(regionElement);
                     });
                 },
    -            createElements: function() {
    +
    +            createElements() {
                     this.wavesurfer.renderers.Canvas.createElements.call(this);
     
                     if (this.params.showOverview) {
    @@ -122,7 +124,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            bindWaveSurferEvents: function () {
    +            bindWaveSurferEvents() {
                     let prevWidth = 0;
                     this._onResize = () => {
                         if (prevWidth != this.wrapper.clientWidth) {
    @@ -160,8 +162,7 @@ export default function(params = {}) {
                     window.addEventListener('resize', this._onResize, true);
                 },
     
    -
    -            bindMinimapEvents: function () {
    +            bindMinimapEvents() {
                     const positionMouseDown = {
                         clientX: 0,
                         clientY: 0
    @@ -204,7 +205,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            render: function () {
    +            render() {
                     const len = this.getWidth();
                     const peaks = this.wavesurfer.backend.getPeaks(len);
                     this.drawPeaks(peaks, len);
    @@ -220,7 +221,8 @@ export default function(params = {}) {
                         this.overviewRegion.style.width = (this.overviewWidth - (this.params.overviewBorderSize * 2)) + 'px';
                     }
                 },
    -            moveOverviewRegion: function(pixels) {
    +
    +            moveOverviewRegion(pixels) {
                     if (pixels < 0) {
                         this.overviewPosition = 0;
                     } else if (pixels + this.overviewWidth < this.width) {
    diff --git a/src/plugin/regions.js b/src/plugin/regions.js
    index 7d778b58f..1feb4f277 100644
    --- a/src/plugin/regions.js
    +++ b/src/plugin/regions.js
    @@ -1,5 +1,5 @@
     const Region = {
    -    init: function (params, wavesurfer) {
    +    init(params, wavesurfer) {
             this.wavesurfer = wavesurfer;
             this.wrapper = wavesurfer.drawer.wrapper;
             this.style = wavesurfer.util.style;
    @@ -28,7 +28,7 @@ const Region = {
         },
     
         /* Update region params. */
    -    update: function (params) {
    +    update(params) {
             if (null != params.start) {
                 this.start = Number(params.start);
             }
    @@ -66,7 +66,7 @@ const Region = {
         },
     
         /* Remove a single region. */
    -    remove: function () {
    +    remove() {
             if (this.element) {
                 this.wrapper.removeChild(this.element);
                 this.element = null;
    @@ -77,20 +77,20 @@ const Region = {
         },
     
         /* Play the audio region. */
    -    play: function () {
    +    play() {
             this.wavesurfer.play(this.start, this.end);
             this.fireEvent('play');
             this.wavesurfer.fireEvent('region-play', this);
         },
     
         /* Play the region in loop. */
    -    playLoop: function () {
    +    playLoop() {
             this.play();
             this.once('out', () => this.playLoop());
         },
     
         /* Render a region as a DOM element. */
    -    render: function () {
    +    render() {
             const regionEl = document.createElement('region');
             regionEl.className = 'wavesurfer-region';
             regionEl.title = this.formatTime(this.start, this.end);
    @@ -135,7 +135,7 @@ const Region = {
             this.bindEvents(regionEl);
         },
     
    -    formatTime: function (start, end) {
    +    formatTime(start, end) {
             return (start == end ? [start] : [start, end]).map(time => [
                 Math.floor((time % 3600) / 60), // minutes
                 ('00' + Math.floor(time % 60)).slice(-2) // seconds
    @@ -143,7 +143,7 @@ const Region = {
         },
     
         /* Update element's position, width, color. */
    -    updateRender: function (pxPerSec) {
    +    updateRender(pxPerSec) {
             const dur = this.wavesurfer.getDuration();
             let width;
             if (pxPerSec) {
    @@ -192,7 +192,7 @@ const Region = {
         },
     
         /* Bind audio events. */
    -    bindInOut: function () {
    +    bindInOut() {
             this.firedIn = false;
             this.firedOut = false;
     
    @@ -226,7 +226,7 @@ const Region = {
         },
     
         /* Bind DOM events. */
    -    bindEvents: function () {
    +    bindEvents() {
             this.element.addEventListener('mouseenter', e => {
                 this.fireEvent('mouseenter', e);
                 this.wavesurfer.fireEvent('region-mouseenter', this, e);
    @@ -331,7 +331,7 @@ const Region = {
             })();
         },
     
    -    onDrag: function (delta) {
    +    onDrag(delta) {
             const maxEnd = this.wavesurfer.getDuration();
             if ((this.end + delta) > maxEnd || (this.start + delta) < 0) {
                 return;
    @@ -343,7 +343,7 @@ const Region = {
             });
         },
     
    -    onResize: function (delta, direction) {
    +    onResize(delta, direction) {
             if (direction == 'start') {
                 this.update({
                     start: Math.min(this.start + delta, this.end),
    @@ -398,7 +398,7 @@ export default function(params = {}) {
                 }
             },
             instance: {
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.params = params;
                     this.wavesurfer = wavesurfer;
     
    @@ -432,7 +432,7 @@ export default function(params = {}) {
                     this.clear();
                 },
                 /* Add a region. */
    -            add: function (params) {
    +            add(params) {
                     const region = Object.create(this.wavesurfer.Region);
                     region.init(params, this.wavesurfer);
     
    @@ -446,13 +446,13 @@ export default function(params = {}) {
                 },
     
                 /* Remove all regions. */
    -            clear: function () {
    +            clear() {
                     Object.keys(this.list).forEach(id => {
                         this.list[id].remove();
                     });
                 },
     
    -            enableDragSelection: function (params) {
    +            enableDragSelection(params) {
                     const slop = params.slop || 2;
                     let drag;
                     let start;
    @@ -521,7 +521,7 @@ export default function(params = {}) {
                     });
                 },
     
    -            disableDragSelection: function () {
    +            disableDragSelection() {
                     this.fireEvent('disable-drag-selection');
                 }
             }
    diff --git a/src/plugin/spectrogram.js b/src/plugin/spectrogram.js
    index 1a1bce7e5..90100291c 100644
    --- a/src/plugin/spectrogram.js
    +++ b/src/plugin/spectrogram.js
    @@ -214,7 +214,7 @@ export default function(params = {}) {
                 *   alpha: some window functions have this extra value (0 this.drawSpectrogram(JSON.parse(data), this));
    @@ -393,11 +392,11 @@ export default function(params = {}) {
                     return ajax;
                 },
     
    -            updateScroll: function(e) {
    +            updateScroll(e) {
                     this.wrapper.scrollLeft = e.target.scrollLeft;
                 },
     
    -            resample: function(oldMatrix) {
    +            resample(oldMatrix) {
                     const columnsNumber = this.width;
                     const newMatrix = [];
     
    diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js
    index 2f96b9b31..02ff8e6bb 100644
    --- a/src/plugin/timeline.js
    +++ b/src/plugin/timeline.js
    @@ -10,7 +10,7 @@ export default function(params = {}) {
             deferInit: params && params.deferInit ? params.deferInit : false,
             extends: ['observer'],
             instance: {
    -            init: function (wavesurfer) {
    +            init(wavesurfer) {
                     this.params = params;
                     this.wavesurfer = wavesurfer;
     
    @@ -63,7 +63,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            destroy: function () {
    +            destroy() {
                     this.unAll();
                     this.wavesurfer.un('redraw', this._onRedraw);
                     this.wavesurfer.un('ready', this._onReady);
    @@ -73,7 +73,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            createWrapper: function () {
    +            createWrapper() {
     
                     const wsParams = this.wavesurfer.params;
                     this.wrapper = this.container.appendChild(
    @@ -102,14 +102,14 @@ export default function(params = {}) {
                     });
                 },
     
    -            removeOldCanvases: function () {
    +            removeOldCanvases() {
                     while (this.canvases.length > 0) {
                         const canvas = this.canvases.pop();
                         canvas.parentElement.removeChild(canvas);
                     }
                 },
     
    -            createCanvases: function () {
    +            createCanvases() {
                     this.removeOldCanvases();
     
                     const totalWidth = Math.round(this.drawer.wrapper.scrollWidth);
    @@ -127,13 +127,13 @@ export default function(params = {}) {
                     }
                 },
     
    -            render: function () {
    +            render() {
                     this.createCanvases();
                     this.updateCanvasStyle();
                     this.drawTimeCanvases();
                 },
     
    -            updateCanvasStyle: function () {
    +            updateCanvasStyle() {
                     const requiredCanvases = this.canvases.length;
                     let i;
                     for (i = 0; i < requiredCanvases; i++) {
    @@ -152,7 +152,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            drawTimeCanvases: function() {
    +            drawTimeCanvases() {
                     const backend = this.wavesurfer.backend;
                     const wsParams = this.wavesurfer.params;
                     const duration = backend.getDuration();
    @@ -233,21 +233,21 @@ export default function(params = {}) {
                     }
                 },
     
    -            setFillStyles: function (fillStyle) {
    +            setFillStyles(fillStyle) {
                     let i;
                     for (i in this.canvases) {
                         this.canvases[i].getContext('2d').fillStyle = fillStyle;
                     }
                 },
     
    -            setFonts: function (font) {
    +            setFonts(font) {
                     let i;
                     for (i in this.canvases) {
                         this.canvases[i].getContext('2d').font = font;
                     }
                 },
     
    -            fillRect: function (x, y, width, height) {
    +            fillRect(x, y, width, height) {
                     let i;
                     for (i in this.canvases) {
                         const canvas = this.canvases[i];
    @@ -271,7 +271,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            fillText: function (text, x, y) {
    +            fillText(text, x, y) {
                     let textWidth;
                     let xOffset = 0;
                     let i;
    @@ -293,7 +293,7 @@ export default function(params = {}) {
                     }
                 },
     
    -            updateScroll: function () {
    +            updateScroll() {
                     this.wrapper.scrollLeft = this.drawer.wrapper.scrollLeft;
                 }
             }
    diff --git a/src/util/observer.js b/src/util/observer.js
    index 30a877dd0..1c2afaa30 100644
    --- a/src/util/observer.js
    +++ b/src/util/observer.js
    @@ -2,7 +2,7 @@ export default {
         /**
          * Attach a handler function for an event.
          */
    -    on: function (event, fn) {
    +    on(event, fn) {
             if (!this.handlers) { this.handlers = {}; }
     
             let handlers = this.handlers[event];
    @@ -22,7 +22,7 @@ export default {
         /**
          * Remove an event handler.
          */
    -    un: function (event, fn) {
    +    un(event, fn) {
             if (!this.handlers) { return; }
     
             const handlers = this.handlers[event];
    @@ -43,7 +43,7 @@ export default {
         /**
          * Remove all event handlers.
          */
    -    unAll: function () {
    +    unAll() {
             this.handlers = null;
         },
     
    @@ -51,11 +51,11 @@ export default {
          * Attach a handler to an event. The handler is executed at most once per
          * event type.
          */
    -    once: function (event, handler) {
    +    once(event, handler) {
             const fn = (...args) => {
    -            /*  eslint-disable no-invalid-this, prefer-rest-params */
    +            /*  eslint-disable no-invalid-this */
                 handler.apply(this, args);
    -            /*  eslint-enable no-invalid-this, prefer-rest-params */
    +            /*  eslint-enable no-invalid-this */
                 setTimeout(() => {
                     this.un(event, fn);
                 }, 0);
    @@ -63,7 +63,7 @@ export default {
             return this.on(event, fn);
         },
     
    -    fireEvent: function (event, ...args) {
    +    fireEvent(event, ...args) {
             if (!this.handlers) { return; }
             const handlers = this.handlers[event];
             handlers && handlers.forEach(fn => {
    diff --git a/src/wavesurfer.js b/src/wavesurfer.js
    index 246536052..89c55ea14 100755
    --- a/src/wavesurfer.js
    +++ b/src/wavesurfer.js
    @@ -43,7 +43,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             WebAudio
         },
     
    -    init: function (params) {
    +    init(params) {
             // Extract relevant parameters (or defaults)
             this.params = WaveSurfer.util.extend({}, this.defaultParams, params);
     
    @@ -101,7 +101,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * @param {Array} plugins
          */
    -    registerPlugins: function (plugins) {
    +    registerPlugins(plugins) {
             // first instantiate all the plugins
             plugins.forEach(plugin => this.addPlugin(plugin));
     
    @@ -122,7 +122,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * @param {Object} plugin object
          */
    -    addPlugin: function (plugin) {
    +    addPlugin(plugin) {
             if (!plugin.name) {
                 throw new Error('Plugin does not have a name!');
             }
    @@ -168,7 +168,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * @param {String} plugin name
          */
    -    initPlugin: function (name) {
    +    initPlugin(name) {
             if (!this[name]) {
                 throw new Error(`Plugin ${name} has not been added yet!`);
             }
    @@ -192,7 +192,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * @param {String} plugin name
          */
    -    destroyPlugin: function (name) {
    +    destroyPlugin(name) {
             if (!this[name]) {
                 throw new Error(`Plugin ${name} has not been added yet and cannot be destroyed!`);
             }
    @@ -214,11 +214,11 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * Convenience function to use when wavesurfer is removed
          */
    -    destroyAllPlugins: function () {
    +    destroyAllPlugins() {
             Object.keys(this.initialisedPluginList).forEach(name => this.destroyPlugin(name));
         },
     
    -    createDrawer: function () {
    +    createDrawer() {
             this.drawer = Object.create(this.Drawer);
             this.drawer.init(this.container, this.params);
             this.fireEvent('drawer-created', this.drawer);
    @@ -239,7 +239,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             });
         },
     
    -    createBackend: function () {
    +    createBackend() {
             if (this.backend) {
                 this.backend.destroy();
             }
    @@ -267,52 +267,52 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             });
         },
     
    -    getDuration: function () {
    +    getDuration() {
             return this.backend.getDuration();
         },
     
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.backend.getCurrentTime();
         },
     
    -    play: function (start, end) {
    +    play(start, end) {
             this.fireEvent('interaction', () => this.play(start, end));
             this.backend.play(start, end);
         },
     
    -    pause: function () {
    +    pause() {
             this.backend.pause();
         },
     
    -    playPause: function () {
    +    playPause() {
             this.backend.isPaused() ? this.play() : this.pause();
         },
     
    -    isPlaying: function () {
    +    isPlaying() {
             return !this.backend.isPaused();
         },
     
    -    skipBackward: function (seconds) {
    +    skipBackward(seconds) {
             this.skip(-seconds || -this.params.skipLength);
         },
     
    -    skipForward: function (seconds) {
    +    skipForward(seconds) {
             this.skip(seconds || this.params.skipLength);
         },
     
    -    skip: function (offset) {
    +    skip(offset) {
             const duration = this.getDuration() || 1;
             let position = this.getCurrentTime() || 0;
             position = Math.max(0, Math.min(duration, position + (offset || 0)));
             this.seekAndCenter(position / duration);
         },
     
    -    seekAndCenter: function (progress) {
    +    seekAndCenter(progress) {
             this.seekTo(progress);
             this.drawer.recenter(progress);
         },
     
    -    seekTo: function (progress) {
    +    seekTo(progress) {
             this.fireEvent('interaction', () => this.seekTo(progress));
     
             const paused = this.backend.isPaused();
    @@ -332,7 +332,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             this.fireEvent('seek', progress);
         },
     
    -    stop: function () {
    +    stop() {
             this.pause();
             this.seekTo(0);
             this.drawer.progress(0);
    @@ -344,7 +344,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * @param {Number} newVolume A value between 0 and 1, 0 being no
          * volume and 1 being full volume.
          */
    -    setVolume: function (newVolume) {
    +    setVolume(newVolume) {
             this.backend.setVolume(newVolume);
         },
     
    @@ -354,7 +354,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * @param {Number} rate A positive number. E.g. 0.5 means half the
          * normal speed, 2 means double speed and so on.
          */
    -    setPlaybackRate: function (rate) {
    +    setPlaybackRate(rate) {
             this.backend.setPlaybackRate(rate);
         },
     
    @@ -364,11 +364,11 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * If currently muted then it will restore the volume to the saved
          * value, and then rest the saved value.
          */
    -    toggleMute: function () {
    +    toggleMute() {
             this.setMute(!this.isMuted);
         },
     
    -    setMute: function (mute) {
    +    setMute(mute) {
             // ignore all muting requests if the audio is already in that state
             if (mute === this.isMuted) {
                 return;
    @@ -388,16 +388,16 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             }
         },
     
    -    toggleScroll: function () {
    +    toggleScroll() {
             this.params.scrollParent = !this.params.scrollParent;
             this.drawBuffer();
         },
     
    -    toggleInteraction: function () {
    +    toggleInteraction() {
             this.params.interact = !this.params.interact;
         },
     
    -    drawBuffer: function () {
    +    drawBuffer() {
             const nominalWidth = Math.round(
                 this.getDuration() * this.params.minPxPerSec * this.params.pixelRatio
             );
    @@ -414,7 +414,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             this.fireEvent('redraw', peaks, width);
         },
     
    -    zoom: function (pxPerSec) {
    +    zoom(pxPerSec) {
             this.params.minPxPerSec = pxPerSec;
     
             this.params.scrollParent = true;
    @@ -431,7 +431,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Internal method.
          */
    -    loadArrayBuffer: function (arraybuffer) {
    +    loadArrayBuffer(arraybuffer) {
             this.decodeArrayBuffer(arraybuffer, data => {
                 if (!this.isDestroyed) {
                     this.loadDecodedBuffer(data);
    @@ -442,7 +442,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Directly load an externally decoded AudioBuffer.
          */
    -    loadDecodedBuffer: function (buffer) {
    +    loadDecodedBuffer(buffer) {
             this.backend.load(buffer);
             this.drawBuffer();
             this.fireEvent('ready');
    @@ -453,14 +453,11 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *
          * @param {Blob|File} blob Audio data.
          */
    -    loadBlob: function (blob) {
    +    loadBlob(blob) {
             // Create file reader
             const reader = new FileReader();
             reader.addEventListener('progress', e => this.onProgress(e));
    -        reader.addEventListener('load', e => {
    -            console.log(e);
    -            this.loadArrayBuffer(e.target.result);
    -        });
    +        reader.addEventListener('load', e => this.loadArrayBuffer(e.target.result));
             reader.addEventListener('error', () => this.fireEvent('error', 'Error reading file'));
             reader.readAsArrayBuffer(blob);
             this.empty();
    @@ -469,7 +466,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Loads audio and re-renders the waveform.
          */
    -    load: function (url, peaks, preload) {
    +    load(url, peaks, preload) {
             this.empty();
     
             switch (this.params.backend) {
    @@ -481,7 +478,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Loads audio using Web Audio buffer backend.
          */
    -    loadBuffer: function (url, peaks) {
    +    loadBuffer(url, peaks) {
             const load = action => {
                 if (action) {
                     this.tmpEvents.push(this.once('ready', action));
    @@ -507,7 +504,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          *  @param  {Array}            [peaks]     Array of peaks. Required to bypass
          *                                          web audio dependency
          */
    -    loadMediaElement: function (urlOrElt, peaks, preload) {
    +    loadMediaElement(urlOrElt, peaks, preload) {
             let url = urlOrElt;
     
             if (typeof urlOrElt === 'string') {
    @@ -544,7 +541,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             }
         },
     
    -    decodeArrayBuffer: function (arraybuffer, callback) {
    +    decodeArrayBuffer(arraybuffer, callback) {
             this.arraybuffer = arraybuffer;
     
             this.backend.decodeArrayBuffer(
    @@ -560,7 +557,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             );
         },
     
    -    getArrayBuffer: function (url, callback) {
    +    getArrayBuffer(url, callback) {
             const ajax = WaveSurfer.util.ajax({
                 url: url,
                 responseType: 'arraybuffer'
    @@ -585,7 +582,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             return ajax;
         },
     
    -    onProgress: function (e) {
    +    onProgress(e) {
             let percentComplete;
             if (e.lengthComputable) {
                 percentComplete = e.loaded / e.total;
    @@ -600,7 +597,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Exports PCM data into a JSON array and opens in a new window.
          */
    -    exportPCM: function (length, accuracy, noWindow) {
    +    exportPCM(length, accuracy, noWindow) {
             length = length || 1024;
             accuracy = accuracy || 10000;
             noWindow = noWindow || false;
    @@ -620,7 +617,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
          * The default format is 'image/png'. Other supported types are
          * 'image/jpeg' and 'image/webp'.
          */
    -    exportImage: function(format, quality) {
    +    exportImage(format, quality) {
             if (!format) {
                 format = 'image/png';
             }
    @@ -631,21 +628,21 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
             return this.drawer.getImage(format, quality);
         },
     
    -    cancelAjax: function () {
    +    cancelAjax() {
             if (this.currentAjax) {
                 this.currentAjax.xhr.abort();
                 this.currentAjax = null;
             }
         },
     
    -    clearTmpEvents: function () {
    +    clearTmpEvents() {
             this.tmpEvents.forEach(e => e.un());
         },
     
         /**
          * Display empty waveform.
          */
    -    empty: function () {
    +    empty() {
             if (!this.backend.isPaused()) {
                 this.stop();
                 this.backend.disconnectSource();
    @@ -660,7 +657,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, {
         /**
          * Remove events, elements and disconnect WebAudio nodes.
          */
    -    destroy: function () {
    +    destroy() {
             this.destroyAllPlugins();
             this.fireEvent('destroy');
             this.cancelAjax();
    diff --git a/src/webaudio.js b/src/webaudio.js
    index d156e540c..d8dc4a482 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -6,11 +6,11 @@ const WebAudio = util.extend({}, util.observer, {
         PAUSED_STATE: 1,
         FINISHED_STATE: 2,
     
    -    supportsWebAudio: function () {
    +    supportsWebAudio() {
             return !!(window.AudioContext || window.webkitAudioContext);
         },
     
    -    getAudioContext: function () {
    +    getAudioContext() {
             if (!this.audioContext) {
                 this.audioContext = new (
                     window.AudioContext || window.webkitAudioContext
    @@ -19,7 +19,7 @@ const WebAudio = util.extend({}, util.observer, {
             return this.audioContext;
         },
     
    -    getOfflineAudioContext: function (sampleRate) {
    +    getOfflineAudioContext(sampleRate) {
             if (!this.offlineAudioContext) {
                 this.offlineAudioContext = new (
                     window.OfflineAudioContext || window.webkitOfflineAudioContext
    @@ -28,7 +28,7 @@ const WebAudio = util.extend({}, util.observer, {
             return this.offlineAudioContext;
         },
     
    -    init: function (params) {
    +    init(params) {
             this.params = params;
             this.ac = params.audioContext || this.getAudioContext();
     
    @@ -50,7 +50,7 @@ const WebAudio = util.extend({}, util.observer, {
             this.setPlaybackRate(this.params.audioRate);
         },
     
    -    disconnectFilters: function () {
    +    disconnectFilters() {
             if (this.filters) {
                 this.filters.forEach(filter => {
                     filter && filter.disconnect();
    @@ -61,7 +61,7 @@ const WebAudio = util.extend({}, util.observer, {
             }
         },
     
    -    setState: function (state) {
    +    setState(state) {
             if (this.state !== this.states[state]) {
                 this.state = this.states[state];
                 this.state.init.call(this);
    @@ -69,14 +69,14 @@ const WebAudio = util.extend({}, util.observer, {
         },
     
         // Unpacked filters
    -    setFilter: function (...filters) {
    +    setFilter(...filters) {
             this.setFilters(filters);
         },
     
         /**
          * @param {Array} filters Packed ilters array
          */
    -    setFilters: function (filters) {
    +    setFilters(filters) {
             // Remove existing filters
             this.disconnectFilters();
     
    @@ -96,7 +96,7 @@ const WebAudio = util.extend({}, util.observer, {
     
         },
     
    -    createScriptNode: function () {
    +    createScriptNode() {
             if (this.ac.createScriptProcessor) {
                 this.scriptNode = this.ac.createScriptProcessor(this.scriptBufferSize);
             } else {
    @@ -106,7 +106,7 @@ const WebAudio = util.extend({}, util.observer, {
             this.scriptNode.connect(this.ac.destination);
         },
     
    -    addOnAudioProcess: function () {
    +    addOnAudioProcess() {
             this.scriptNode.onaudioprocess = () => {
                 const time = this.getCurrentTime();
     
    @@ -121,11 +121,11 @@ const WebAudio = util.extend({}, util.observer, {
             };
         },
     
    -    removeOnAudioProcess: function () {
    +    removeOnAudioProcess() {
             this.scriptNode.onaudioprocess = null;
         },
     
    -    createAnalyserNode: function () {
    +    createAnalyserNode() {
             this.analyser = this.ac.createAnalyser();
             this.analyser.connect(this.gainNode);
         },
    @@ -133,7 +133,7 @@ const WebAudio = util.extend({}, util.observer, {
         /**
          * Create the gain node needed to control the playback volume.
          */
    -    createVolumeNode: function () {
    +    createVolumeNode() {
             // Create gain node using the AudioContext
             if (this.ac.createGain) {
                 this.gainNode = this.ac.createGain();
    @@ -150,7 +150,7 @@ const WebAudio = util.extend({}, util.observer, {
          * @param {Number} newGain The new gain, a floating point value
          * between 0 and 1. 0 being no gain and 1 being maximum gain.
          */
    -    setVolume: function (newGain) {
    +    setVolume(newGain) {
             this.gainNode.gain.value = newGain;
         },
     
    @@ -160,11 +160,11 @@ const WebAudio = util.extend({}, util.observer, {
          * @returns {Number} The current gain, a floating point value
          * between 0 and 1. 0 being no gain and 1 being maximum gain.
          */
    -    getVolume: function () {
    +    getVolume() {
             return this.gainNode.gain.value;
         },
     
    -    decodeArrayBuffer: function (arraybuffer, callback, errback) {
    +    decodeArrayBuffer(arraybuffer, callback, errback) {
             if (!this.offlineAc) {
                 this.offlineAc = this.getOfflineAudioContext(this.ac ? this.ac.sampleRate : 44100);
             }
    @@ -174,7 +174,7 @@ const WebAudio = util.extend({}, util.observer, {
         /**
          * Set pre-decoded peaks.
          */
    -    setPeaks: function (peaks) {
    +    setPeaks(peaks) {
             this.peaks = peaks;
         },
     
    @@ -185,7 +185,7 @@ const WebAudio = util.extend({}, util.observer, {
          * @returns {Array} Array of 2* peaks or array of arrays
          * of peaks consisting of (max, min) values for each subrange.
          */
    -    getPeaks: function (length) {
    +    getPeaks(length) {
             if (this.peaks) { return this.peaks; }
     
             const sampleSize = this.buffer.length / length;
    @@ -235,17 +235,17 @@ const WebAudio = util.extend({}, util.observer, {
             return this.params.splitChannels ? splitPeaks : mergedPeaks;
         },
     
    -    getPlayedPercents: function () {
    +    getPlayedPercents() {
             return this.state.getPlayedPercents.call(this);
         },
     
    -    disconnectSource: function () {
    +    disconnectSource() {
             if (this.source) {
                 this.source.disconnect();
             }
         },
     
    -    destroy: function () {
    +    destroy() {
             if (!this.isPaused()) {
                 this.pause();
             }
    @@ -258,14 +258,14 @@ const WebAudio = util.extend({}, util.observer, {
             this.analyser.disconnect();
         },
     
    -    load: function (buffer) {
    +    load(buffer) {
             this.startPosition = 0;
             this.lastPlay = this.ac.currentTime;
             this.buffer = buffer;
             this.createSource();
         },
     
    -    createSource: function () {
    +    createSource() {
             this.disconnectSource();
             this.source = this.ac.createBufferSource();
     
    @@ -278,18 +278,18 @@ const WebAudio = util.extend({}, util.observer, {
             this.source.connect(this.analyser);
         },
     
    -    isPaused: function () {
    +    isPaused() {
             return this.state !== this.states[this.PLAYING_STATE];
         },
     
    -    getDuration: function () {
    +    getDuration() {
             if (!this.buffer) {
                 return 0;
             }
             return this.buffer.duration;
         },
     
    -    seekTo: function (start, end) {
    +    seekTo(start, end) {
             if (!this.buffer) { return; }
     
             this.scheduledPause = null;
    @@ -311,10 +311,13 @@ const WebAudio = util.extend({}, util.observer, {
                 this.setState(this.PAUSED_STATE);
             }
     
    -        return { start: start, end: end };
    +        return {
    +            start: start,
    +            end: end
    +        };
         },
     
    -    getPlayedTime: function () {
    +    getPlayedTime() {
             return (this.ac.currentTime - this.lastPlay) * this.playbackRate;
         },
     
    @@ -326,7 +329,7 @@ const WebAudio = util.extend({}, util.observer, {
          * @param {Number} end When to stop
          * relative to the beginning of a clip.
          */
    -    play: function (start, end) {
    +    play(start, end) {
             if (!this.buffer) { return; }
     
             // need to re-create source on each playback
    @@ -353,7 +356,7 @@ const WebAudio = util.extend({}, util.observer, {
         /**
          * Pauses the loaded audio.
          */
    -    pause: function () {
    +    pause() {
             this.scheduledPause = null;
     
             this.startPosition += this.getPlayedTime();
    @@ -367,14 +370,14 @@ const WebAudio = util.extend({}, util.observer, {
         /**
         *   Returns the current time in seconds relative to the audioclip's duration.
         */
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.state.getCurrentTime.call(this);
         },
     
         /**
          * Set the audio source playback rate.
          */
    -    setPlaybackRate: function (value) {
    +    setPlaybackRate(value) {
             value = value || 1;
             if (this.isPaused()) {
                 this.playbackRate = value;
    @@ -389,40 +392,40 @@ const WebAudio = util.extend({}, util.observer, {
     WebAudio.state = {};
     
     WebAudio.state.playing = {
    -    init: function () {
    +    init() {
             this.addOnAudioProcess();
         },
    -    getPlayedPercents: function () {
    +    getPlayedPercents() {
             const duration = this.getDuration();
             return (this.getCurrentTime() / duration) || 0;
         },
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.startPosition + this.getPlayedTime();
         }
     };
     
     WebAudio.state.paused = {
    -    init: function () {
    +    init() {
             this.removeOnAudioProcess();
         },
    -    getPlayedPercents: function () {
    +    getPlayedPercents() {
             const duration = this.getDuration();
             return (this.getCurrentTime() / duration) || 0;
         },
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.startPosition;
         }
     };
     
     WebAudio.state.finished = {
    -    init: function () {
    +    init() {
             this.removeOnAudioProcess();
             this.fireEvent('finish');
         },
    -    getPlayedPercents: function () {
    +    getPlayedPercents() {
             return 1;
         },
    -    getCurrentTime: function () {
    +    getCurrentTime() {
             return this.getDuration();
         }
     };
    
    From b90ce6b5fcd3c00437732858eab989e61a2369c4 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Sun, 22 Jan 2017 12:11:05 +0100
    Subject: [PATCH 017/573] linter complains because of indentation. (#921)
    
    ---
     src/webaudio.js | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/src/webaudio.js b/src/webaudio.js
    index d8dc4a482..9390da2cb 100755
    --- a/src/webaudio.js
    +++ b/src/webaudio.js
    @@ -345,7 +345,7 @@ const WebAudio = util.extend({}, util.observer, {
             this.source.start(0, start, end - start);
     
             if (this.ac.state == 'suspended') {
    -          this.ac.resume && this.ac.resume();
    +            this.ac.resume && this.ac.resume();
             }
     
             this.setState(this.PLAYING_STATE);
    
    From 42850ff5b0b449b9eeb2df17e661617151216d42 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Mon, 23 Jan 2017 05:59:30 +0100
    Subject: [PATCH 018/573] removed unnecessary re-calculation (#901) (#922)
    
    ---
     src/drawer.canvas.js      | 5 +----
     src/drawer.js             | 2 +-
     src/drawer.multicanvas.js | 5 +----
     3 files changed, 3 insertions(+), 9 deletions(-)
    
    diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js
    index 2a5fa76ba..460b32efa 100644
    --- a/src/drawer.canvas.js
    +++ b/src/drawer.canvas.js
    @@ -194,10 +194,7 @@ export default util.extend({}, drawer, {
             });
         },
     
    -    updateProgress(progress) {
    -        const pos = Math.round(
    -            this.width * progress
    -        ) / this.params.pixelRatio;
    +    updateProgress(pos) {
             this.style(this.progressWave, { width: pos + 'px' });
         },
     
    diff --git a/src/drawer.js b/src/drawer.js
    index 829470dcd..bc7a358e4 100644
    --- a/src/drawer.js
    +++ b/src/drawer.js
    @@ -176,7 +176,7 @@ export default util.extend({}, util.observer, {
                     this.recenterOnPosition(newPos);
                 }
     
    -            this.updateProgress(progress);
    +            this.updateProgress(pos);
             }
         },
     
    diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js
    index 78c73f833..a37fe4a3c 100644
    --- a/src/drawer.multicanvas.js
    +++ b/src/drawer.multicanvas.js
    @@ -312,10 +312,7 @@ export default util.extend({}, drawer, {
             }
         },
     
    -    updateProgress(progress) {
    -        const pos = Math.round(
    -            this.width * progress
    -        ) / this.params.pixelRatio;
    +    updateProgress(pos) {
             this.style(this.progressWave, { width: pos + 'px' });
         }
     });
    
    From e83da0ac5c6e71baa6f6ac607077ed32b8230d78 Mon Sep 17 00:00:00 2001
    From: Martin Spencer 
    Date: Fri, 27 Jan 2017 20:04:43 +0100
    Subject: [PATCH 019/573] Next: Refactor timeline plugin (#893)
    
    * throwing error with new keyword
    
    * removed unnecessary check for ws, this is part of the plugin API
    
    * formatting of ternary to get the container element
    
    * plugin options now extend defaults and are cached in this.opts. formatTime(Callback) is now provided as default. Intervals can be defined as raw values or callbacks which receive pxPerSec as parameter.
    
    * eslint no-confusing-arrow rule allows parens as solution
    
    * style util function is cached in this.style and used more extensively
    
    * _onClick and _onScroll handler caching added, removing them in destroy method, removed unnecessary updateScroll method
    
    * using local wavesurfer var in init function for better minification file sizes, added comments
    
    * better checks before removing stuff in destroy method
    
    * locally scoped canvas variable in createCanvas for loop
    
    * arranging of variables in drawTimeCanvas method for code which is more readable
    
    * Updated timeline example documentation of callback options
    
    * removed unnecessary removing of event listener on destroy function
    
    * renamted this.opts to this.params for consistency
    
    * updated karma-webpack to work with webpack 2
    
    * travis with prune for more accurate dependency resolution
    
    * linter complains because of indentation.
    ---
     .eslintrc.js                |   7 +-
     .travis.yml                 |   7 +-
     example/timeline/index.html |   8 +-
     package.json                |   6 +-
     src/plugin/timeline.js      | 220 +++++++++++++++++++-----------------
     5 files changed, 133 insertions(+), 115 deletions(-)
    
    diff --git a/.eslintrc.js b/.eslintrc.js
    index 3bf558396..40f04af71 100644
    --- a/.eslintrc.js
    +++ b/.eslintrc.js
    @@ -114,7 +114,12 @@ module.exports = {
             "no-bitwise": "off",
             "no-caller": "error",
             "no-catch-shadow": "error",
    -        "no-confusing-arrow": "error",
    +        "no-confusing-arrow": [
    +            "error",
    +            {
    +                "allowParens": true
    +            }
    +        ],
             "no-continue": "error",
             "no-div-regex": "error",
             "no-duplicate-imports": "error",
    diff --git a/.travis.yml b/.travis.yml
    index 4c0e42d22..ac520c98f 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -2,12 +2,15 @@ sudo: required
     dist: trusty
     language: node_js
     node_js:
    -  - "4.2"
    +  - "4"
     before_install:
       - export CHROME_BIN=chromium-browser
       - export DISPLAY=:99.0
       - sh -e /etc/init.d/xvfb start
    -install: npm install
    +install:
    +  - npm prune
    +  - npm install
    +  - npm update
     script:
       - npm run test
       - npm run build
    diff --git a/example/timeline/index.html b/example/timeline/index.html
    index fd86639b2..bcfa8bbc5 100644
    --- a/example/timeline/index.html
    +++ b/example/timeline/index.html
    @@ -98,10 +98,10 @@ 

    Options

  • secondaryColor - the color of the non-modulo-ten notch lines. The default is '#c0c0c0'.
  • primaryFontColor - the color of the non-modulo-ten time labels (e.g. 10sec, 20sec). The default is '#000'.
  • primaryFontColor - the color of the non-modulo-ten time labels (e.g. 5sec, 15sec). The default is '#c0c0c0'.
  • -
  • timeInterval - number of intervals that records consists of. Usually it is equal to the duration in minutes.
  • -
  • primaryLabelInterval - number of primary time labels.
  • -
  • secondaryLabelInterval - number of secondary time labels (Time labels between primary labels).
  • -
  • formatTimeCallback - custom time format callback.
  • +
  • timeInterval - number of intervals that records consists of. Usually it is equal to the duration in minutes. (Integer or function which receives pxPerSec value and reurns value)
  • +
  • primaryLabelInterval - number of primary time labels. (Integer or function which receives pxPerSec value and reurns value)
  • +
  • secondaryLabelInterval - number of secondary time labels (Time labels between primary labels, integer or function which receives pxPerSec value and reurns value).
  • +
  • formatTimeCallback - custom time format callback. (Function which receives number of seconds and returns formatted string)
diff --git a/package.json b/package.json index d1d902cc7..c1cc17c56 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,9 @@ "karma-coverage": "^1.1.1", "karma-jasmine": "1.0.2", "karma-jasmine-matchers": "3.0.1", - "karma-webpack": "^1.8.0", - "webpack": "^2.1.0-beta.25", - "webpack-dev-server": "^2.1.0-beta.9" + "karma-webpack": "^2.0.2", + "webpack": "2", + "webpack-dev-server": "2" }, "homepage": "https://github.com/katspaugh/wavesurfer.js" } diff --git a/src/plugin/timeline.js b/src/plugin/timeline.js index 02ff8e6bb..390548094 100644 --- a/src/plugin/timeline.js +++ b/src/plugin/timeline.js @@ -13,60 +13,100 @@ export default function(params = {}) { init(wavesurfer) { this.params = params; this.wavesurfer = wavesurfer; + this.style = wavesurfer.util.style; - if (!this.wavesurfer) { - throw Error('No WaveSurfer intance provided'); - } - - - this.container = 'string' == typeof params.container ? - document.querySelector(params.container) : params.container; + this.container = 'string' == typeof params.container + ? document.querySelector(params.container) + : params.container; if (!this.container) { - throw Error('No container for WaveSurfer timeline'); + throw new Error('No container for WaveSurfer timeline'); } - this.height = this.params.height || 20; - this.notchPercentHeight = this.params.notchPercentHeight || 90; - this.primaryColor = this.params.primaryColor || '#000'; - this.secondaryColor = this.params.secondaryColor || '#c0c0c0'; - this.primaryFontColor = this.params.primaryFontColor || '#000'; - this.secondaryFontColor = this.params.secondaryFontColor || '#000'; - this.fontFamily = this.params.fontFamily || 'Arial'; - this.fontSize = this.params.fontSize || 10; - this.timeInterval = this.params.timeInterval; - this.primaryLabelInterval = this.params.primaryLabelInterval; - this.secondaryLabelInterval = this.params.secondaryLabelInterval; - this.formatTimeCallback = this.params.formatTimeCallback; + this.params = wavesurfer.util.extend({}, { + height: 20, + notchPercentHeight: 90, + primaryColor: '#000', + secondaryColor: '#c0c0c0', + primaryFontColor: '#000', + secondaryFontColor: '#000', + fontFamily: 'Arial', + fontSize: 10, + formatTimeCallback(seconds) { + if (seconds / 60 > 1) { + // calculate minutes and seconds from seconds count + const minutes = parseInt(seconds / 60, 10); + seconds = parseInt(seconds % 60, 10); + // fill up seconds with zeroes + seconds = (seconds < 10) ? '0' + seconds : seconds; + return `${minutes}:${seconds}`; + } + return seconds; + }, + timeInterval(pxPerSec) { + if (pxPerSec >= 25) { + return 1; + } else if (pxPerSec * 5 >= 25) { + return 5; + } else if (pxPerSec * 15 >= 25) { + return 15; + } + return 60; + }, + primaryLabelInterval(pxPerSec) { + if (pxPerSec >= 25) { + return 10; + } else if (pxPerSec * 5 >= 25) { + return 6; + } else if (pxPerSec * 15 >= 25) { + return 4; + } + return 4; + }, + secondaryLabelInterval(pxPerSec) { + if (pxPerSec >= 25) { + return 5; + } else if (pxPerSec * 5 >= 25) { + return 2; + } else if (pxPerSec * 15 >= 25) { + return 2; + } + return 2; + } + }, params); + this.canvases = []; - this._onRedraw = () => { - this.render(); + this._onScroll = () => { + this.wrapper.scrollLeft = this.drawer.wrapper.scrollLeft; }; - + this._onRedraw = () => this.render(); this._onReady = () => { - this.drawer = this.wavesurfer.drawer; - this.width = this.wavesurfer.drawer.width; - this.pixelRatio = this.wavesurfer.drawer.params.pixelRatio; - this.maxCanvasWidth = this.wavesurfer.drawer.maxCanvasWidth || this.width; - this.maxCanvasElementWidth = this.wavesurfer.drawer.maxCanvasElementWidth || Math.round(this.maxCanvasWidth / this.pixelRatio); + this.drawer = wavesurfer.drawer; + this.pixelRatio = wavesurfer.drawer.params.pixelRatio; + this.maxCanvasWidth = wavesurfer.drawer.maxCanvasWidth || wavesurfer.drawer.width; + this.maxCanvasElementWidth = wavesurfer.drawer.maxCanvasElementWidth || Math.round(this.maxCanvasWidth / this.pixelRatio); this.createWrapper(); this.render(); - this.wavesurfer.drawer.wrapper.addEventListener('scroll', e => this.updateScroll(e)); - this.wavesurfer.on('redraw', this._onRedraw); + wavesurfer.drawer.wrapper.addEventListener('scroll', this._onScroll); + wavesurfer.on('redraw', this._onRedraw); }; - this.wavesurfer.on('ready', this._onReady); - // Check if ws is ready - if (this.wavesurfer.backend) { + + // backend (and drawer) already existed, just call + // initialisation code + if (wavesurfer.backend) { this._onReady(); } + // ws is ready, call the initialisation code + wavesurfer.on('ready', this._onReady); }, destroy() { this.unAll(); this.wavesurfer.un('redraw', this._onRedraw); this.wavesurfer.un('ready', this._onReady); + this.wavesurfer.drawer.wrapper.removeEventListener('scroll', this._onScroll); if (this.wrapper && this.wrapper.parentNode) { this.wrapper.parentNode.removeChild(this.wrapper); this.wrapper = null; @@ -74,32 +114,33 @@ export default function(params = {}) { }, createWrapper() { - const wsParams = this.wavesurfer.params; this.wrapper = this.container.appendChild( document.createElement('timeline') ); - this.drawer.style(this.wrapper, { + this.style(this.wrapper, { display: 'block', position: 'relative', userSelect: 'none', webkitUserSelect: 'none', - height: this.height + 'px' + height: `${this.params.height}px` }); if (wsParams.fillParent || wsParams.scrollParent) { - this.drawer.style(this.wrapper, { + this.style(this.wrapper, { width: '100%', overflowX: 'hidden', overflowY: 'hidden' }); } - this.wrapper.addEventListener('click', e => { + this._onClick = e => { e.preventDefault(); const relX = 'offsetX' in e ? e.offsetX : e.layerX; this.fireEvent('click', (relX / this.wrapper.scrollWidth) || 0); - }); + }; + + this.wrapper.addEventListener('click', this._onClick); }, removeOldCanvases() { @@ -114,13 +155,12 @@ export default function(params = {}) { const totalWidth = Math.round(this.drawer.wrapper.scrollWidth); const requiredCanvases = Math.ceil(totalWidth / this.maxCanvasElementWidth); - let canvas; let i; for (i = 0; i < requiredCanvases; i++) { - canvas = this.wrapper.appendChild(document.createElement('canvas')); + const canvas = this.wrapper.appendChild(document.createElement('canvas')); this.canvases.push(canvas); - this.drawer.style(canvas, { + this.style(canvas, { position: 'absolute', zIndex: 4 }); @@ -145,86 +185,60 @@ export default function(params = {}) { } canvas.width = canvasWidth * this.pixelRatio; - canvas.height = this.height * this.pixelRatio; - canvas.style.width = canvasWidth + 'px'; - canvas.style.height = this.height + 'px'; - canvas.style.left = i * this.maxCanvasElementWidth + 'px'; + canvas.height = this.params.height * this.pixelRatio; + this.style(canvas, { + width: `${canvasWidth}px`, + height: `${this.params.height}px`, + left: `${i * this.maxCanvasElementWidth}px` + }); } }, drawTimeCanvases() { const backend = this.wavesurfer.backend; const wsParams = this.wavesurfer.params; - const duration = backend.getDuration(); + const duration = this.wavesurfer.backend.getDuration(); const totalSeconds = parseInt(duration, 10) + 1; - let width; + const width = wsParams.fillParent && !wsParams.scrollParent + ? this.drawer.getWidth() + : this.drawer.wrapper.scrollWidth * wsParams.pixelRatio; + const pixelsPerSecond = width / duration; + + const formatTime = this.params.formatTimeCallback; + // if parameter is function, call the function with + // pixelsPerSecond, otherwise simply take the value as-is + const intervalFnOrVal = option => (typeof option === 'function' ? option(pixelsPerSecond) : option); + const timeInterval = intervalFnOrVal(this.params.timeInterval); + const primaryLabelInterval = intervalFnOrVal(this.params.primaryLabelInterval); + const secondaryLabelInterval = intervalFnOrVal(this.params.secondaryLabelInterval); + let curPixel = 0; let curSeconds = 0; - if (wsParams.fillParent && !wsParams.scrollParent) { - width = this.drawer.getWidth(); - } else { - width = this.drawer.wrapper.scrollWidth * wsParams.pixelRatio; - } - const pixelsPerSecond = width/duration; - - if (duration <= 0) { return; } - - const formatTime = seconds => { - if (typeof this.formatTimeCallback === 'function') { - return this.formatTimeCallback(seconds); - } - - if (seconds/60 > 1) { - const minutes = parseInt(seconds / 60); - seconds = parseInt(seconds % 60); - seconds = (seconds < 10) ? '0' + seconds : seconds; - return '' + minutes + ':' + seconds; - } - return seconds; - }; - - let timeInterval = 60; - let primaryLabelInterval = 4; - let secondaryLabelInterval = 2; - if (pixelsPerSecond * 1 >= 25) { - timeInterval = 1; - primaryLabelInterval = 10; - secondaryLabelInterval = 5; - } else if (pixelsPerSecond * 5 >= 25) { - timeInterval = 5; - primaryLabelInterval = 6; - secondaryLabelInterval = 2; - } else if (pixelsPerSecond * 15 >= 25) { - timeInterval = 15; - primaryLabelInterval = 4; - secondaryLabelInterval = 2; + if (duration <= 0) { + return; } - timeInterval = this.timeInterval || timeInterval; - primaryLabelInterval = this.primaryLabelInterval || primaryLabelInterval; - secondaryLabelInterval = this.secondaryLabelInterval || secondaryLabelInterval; - - const height1 = this.height - 4; - const height2 = (this.height * (this.notchPercentHeight / 100.0)) - 4; - const fontSize = this.fontSize * wsParams.pixelRatio; + const height1 = this.params.height - 4; + const height2 = (this.params.height * (this.params.notchPercentHeight / 100)) - 4; + const fontSize = this.params.fontSize * wsParams.pixelRatio; let i; - for (i = 0; i < totalSeconds/timeInterval; i++) { + for (i = 0; i < totalSeconds / timeInterval; i++) { if (i % primaryLabelInterval == 0) { - this.setFillStyles(this.primaryColor); + this.setFillStyles(this.params.primaryColor); this.fillRect(curPixel, 0, 1, height1); - this.setFonts(fontSize + 'px ' + this.fontFamily); - this.setFillStyles(this.primaryFontColor); + this.setFonts(`${fontSize}px ${this.params.fontFamily}`); + this.setFillStyles(this.params.primaryFontColor); this.fillText(formatTime(curSeconds), curPixel + 5, height1); } else if (i % secondaryLabelInterval == 0) { - this.setFillStyles(this.secondaryColor); + this.setFillStyles(this.params.secondaryColor); this.fillRect(curPixel, 0, 1, height1); - this.setFonts(fontSize + 'px ' + this.fontFamily); - this.setFillStyles(this.secondaryFontColor); + this.setFonts(`${fontSize}px ${this.params.fontFamily}`); + this.setFillStyles(this.params.secondaryFontColor); this.fillText(formatTime(curSeconds), curPixel + 5, height1); } else { - this.setFillStyles(this.secondaryColor); + this.setFillStyles(this.params.secondaryColor); this.fillRect(curPixel, 0, 1, height2); } @@ -291,10 +305,6 @@ export default function(params = {}) { xOffset += canvasWidth; } - }, - - updateScroll() { - this.wrapper.scrollLeft = this.drawer.wrapper.scrollLeft; } } }; From 258cfbafec5a47965f34e2f59ef8cd4eb82dd4ff Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Fri, 27 Jan 2017 20:07:53 +0100 Subject: [PATCH 020/573] Next: Merge from master: Improve rendering performance when pxPerSec is high (#909) (#924) * Improve rendering performance when pxPerSec is high (#909) * Adds an optional 'partialRender' parameter to enable * Calculates and renders peaks only for current visible waveform * Keeps track of currently calculated/rendered peaks to avoid duplicate calculation and only incremental scroll changes are rendered * Tested all combinations of Canvas/MultiCanvas and Wave/Bars rendering at various zoom levels. * travis with prune for more accurate dependency resolution * updated karma-webpack to work with webpack 2 --- karma.conf.js | 10 ++-- spec/peakcache.spec.js | 99 +++++++++++++++++++++++++++++++++++++++ src/drawer.canvas.js | 22 ++++----- src/drawer.js | 15 ++++-- src/drawer.multicanvas.js | 50 ++++++++++++-------- src/mediaelement.js | 4 +- src/peakcache.js | 87 ++++++++++++++++++++++++++++++++++ src/wavesurfer.js | 35 +++++++++++++- src/webaudio.js | 49 ++++++++++++++----- 9 files changed, 317 insertions(+), 54 deletions(-) create mode 100755 spec/peakcache.spec.js create mode 100644 src/peakcache.js diff --git a/karma.conf.js b/karma.conf.js index 4ef09ac1d..ac16c0d4c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -6,7 +6,7 @@ module.exports = function (config) { 'jasmine-matchers' ], hostname: 'localhost', - post: 9876, + port: 9876, singleRun: true, autoWatch: false, files: [ @@ -20,12 +20,14 @@ module.exports = function (config) { // specs 'spec/plugin-api.spec.js', 'spec/util.spec.js', - 'spec/wavesurfer.spec.js' + 'spec/wavesurfer.spec.js', + 'spec/peakcache.spec.js' ], preprocessors: { 'spec/plugin-api.spec.js': ['webpack'], 'spec/util.spec.js': ['webpack'], - 'spec/wavesurfer.spec.js': ['webpack'] + 'spec/wavesurfer.spec.js': ['webpack'], + 'spec/peakcache.spec.js': ['webpack'] }, webpackMiddleware: { stats: 'errors-only' @@ -57,4 +59,4 @@ module.exports = function (config) { } config.set(configuration); -}; \ No newline at end of file +}; diff --git a/spec/peakcache.spec.js b/spec/peakcache.spec.js new file mode 100755 index 000000000..dfa240990 --- /dev/null +++ b/spec/peakcache.spec.js @@ -0,0 +1,99 @@ +import PeakCache from '../src/peakcache'; + +describe('peakcache', function() { + var peakcache; + var test_length = 200; + var test_length2 = 300; + var test_start = 50; + var test_end = 100; + var test_start2 = 100; + var test_end2 = 120; + var test_start3 = 120; + var test_end3 = 150; + + var window_size = 20; + + function __createPeakCache() { + peakcache = Object.create(PeakCache); + peakcache.init(); + } + + beforeEach(function (done) { + __createPeakCache(); + done(); + }); + + it('empty cache returns full range', function() { + var newranges = peakcache.addRangeToPeakCache(test_length, test_start, test_end); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_start); + expect(newranges[0][1]).toEqual(test_end); + }); + + it('different length clears cache', function() { + peakcache.addRangeToPeakCache(test_length, test_start, test_end); + var newranges = peakcache.addRangeToPeakCache(test_length2, test_start, test_end); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_start); + expect(newranges[0][1]).toEqual(test_end); + }); + + it('consecutive calls return no ranges', function() { + peakcache.addRangeToPeakCache(test_length, test_start, test_end); + var newranges = peakcache.addRangeToPeakCache(test_length, test_start, test_end); + expect(newranges.length).toEqual(0); + }); + + it('sliding window returns window sized range', function() { + var newranges = peakcache.addRangeToPeakCache(test_length, test_start, test_end); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_start); + expect(newranges[0][1]).toEqual(test_end); + var newranges = peakcache.addRangeToPeakCache(test_length, test_start + window_size, test_end + window_size); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_end); + expect(newranges[0][1]).toEqual(test_end + window_size); + var newranges = peakcache.addRangeToPeakCache(test_length, test_start + window_size * 2, test_end + window_size * 2); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_end + window_size); + expect(newranges[0][1]).toEqual(test_end + window_size * 2); + }); + + it('disjoint set creates two ranges', function() { + peakcache.addRangeToPeakCache(test_length, test_start, test_end); + peakcache.addRangeToPeakCache(test_length, test_start3, test_end3); + var ranges = peakcache.getCacheRanges(); + expect(ranges.length).toEqual(2); + expect(ranges[0][0]).toEqual(test_start); + expect(ranges[0][1]).toEqual(test_end); + expect(ranges[1][0]).toEqual(test_start3); + expect(ranges[1][1]).toEqual(test_end3); + }); + + it('filling in disjoint sets coalesces', function() { + peakcache.addRangeToPeakCache(test_length, test_start, test_end); + peakcache.addRangeToPeakCache(test_length, test_start3, test_end3); + var newranges = peakcache.addRangeToPeakCache(test_length, test_start, test_end3); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_end); + expect(newranges[0][1]).toEqual(test_start3); + var ranges = peakcache.getCacheRanges(); + expect(ranges.length).toEqual(1); + expect(ranges[0][0]).toEqual(test_start); + expect(ranges[0][1]).toEqual(test_end3); + }); + + it('filling in disjoint sets coalesces / edge cases', function() { + peakcache.addRangeToPeakCache(test_length, test_start, test_end); + peakcache.addRangeToPeakCache(test_length, test_start3, test_end3); + var newranges = peakcache.addRangeToPeakCache(test_length, test_start2, test_end2); + expect(newranges.length).toEqual(1); + expect(newranges[0][0]).toEqual(test_end); + expect(newranges[0][1]).toEqual(test_start3); + var ranges = peakcache.getCacheRanges(); + expect(ranges.length).toEqual(1); + expect(ranges[0][0]).toEqual(test_start); + expect(ranges[0][1]).toEqual(test_end3); + }); + +}); diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js index 460b32efa..611adcfc2 100644 --- a/src/drawer.canvas.js +++ b/src/drawer.canvas.js @@ -64,7 +64,7 @@ export default util.extend({}, drawer, { } }, - drawBars(peaks, channelIndex) { + drawBars(peaks, channelIndex, start, end) { // Split channels if (peaks[0] instanceof Array) { const channels = peaks; @@ -79,9 +79,8 @@ export default util.extend({}, drawer, { // Bar wave draws the bottom only as a reflection of the top, // so we don't need negative values const hasMinVals = [].some.call(peaks, val => val < 0); - if (hasMinVals) { - peaks = [].filter.call(peaks, (_, index) => index % 2 == 0); - } + // Skip every other value if there are negatives. + const peakIndexScale = hasMinVals ? 2 : 1; // A half-pixel offset makes lines crisp const $ = 0.5 / this.params.pixelRatio; @@ -89,7 +88,7 @@ export default util.extend({}, drawer, { const height = this.params.height * this.params.pixelRatio; const offsetY = height * channelIndex || 0; const halfH = height / 2; - const length = peaks.length; + const length = peaks.length / peakIndexScale; const bar = this.params.barWidth * this.params.pixelRatio; const gap = Math.max(this.params.pixelRatio, ~~(bar / 2)); const step = bar + gap; @@ -110,14 +109,15 @@ export default util.extend({}, drawer, { if (!cc) { return; } let i; - for (i = 0; i < width; i += step) { - const h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH); + for (i = (start / scale); i < (end / scale); i += step) { + const peak = peaks[Math.floor(i * scale * peakIndexScale)] || 0; + const h = Math.round(peak / absmax * halfH); cc.fillRect(i + $, halfH - h + offsetY, bar + $, h * 2); } }); }, - drawWave(peaks, channelIndex) { + drawWave(peaks, channelIndex, start, end) { // Split channels if (peaks[0] instanceof Array) { const channels = peaks; @@ -172,16 +172,16 @@ export default util.extend({}, drawer, { let j; cc.beginPath(); - cc.moveTo($, halfH + offsetY); + cc.moveTo(start * scale + $, halfH + offsetY); - for (i = 0; i < length; i++) { + for (i = start; i < end; i++) { const h = Math.round(peaks[2 * i] / absmax * halfH); cc.lineTo(i * scale + $, halfH - h + offsetY); } // Draw the bottom edge going backwards, to make a single // closed hull to fill. - for (j = length - 1; j >= 0; j--) { + for (j = end - 1; j >= start; j--) { const k = Math.round(peaks[2 * j + 1] / absmax * halfH); cc.lineTo(j * scale + $, halfH - k + offsetY); } diff --git a/src/drawer.js b/src/drawer.js index bc7a358e4..e6ccebf37 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -83,13 +83,12 @@ export default util.extend({}, util.observer, { this.wrapper.addEventListener('scroll', e => this.fireEvent('scroll', e)); }, - drawPeaks(peaks, length) { - this.resetScroll(); + drawPeaks(peaks, length, start, end) { this.setWidth(length); this.params.barWidth ? - this.drawBars(peaks) : - this.drawWave(peaks); + this.drawBars(peaks, 0, start, end) : + this.drawWave(peaks, 0, start, end); }, // Backward compatibility @@ -135,11 +134,19 @@ export default util.extend({}, util.observer, { }, + getScrollX() { + return Math.round(this.wrapper.scrollLeft * this.params.pixelRatio); + }, + getWidth() { return Math.round(this.container.clientWidth * this.params.pixelRatio); }, setWidth(width) { + if (this.width == width) { + return; + } + this.width = width; if (this.params.fillParent || this.params.scrollParent) { diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js index a37fe4a3c..05ae6990e 100644 --- a/src/drawer.multicanvas.js +++ b/src/drawer.multicanvas.js @@ -137,7 +137,7 @@ export default util.extend({}, drawer, { } }, - drawBars(peaks, channelIndex) { + drawBars(peaks, channelIndex, start, end) { // Split channels if (peaks[0] instanceof Array) { const channels = peaks; @@ -152,16 +152,15 @@ export default util.extend({}, drawer, { // Bar wave draws the bottom only as a reflection of the top, // so we don't need negative values const hasMinVals = [].some.call(peaks, val => val < 0); - if (hasMinVals) { - peaks = [].filter.call(peaks, (_, index) => index % 2 == 0); - } + // Skip every other value if there are negatives. + const peakIndexScale = hasMinVals ? 2 : 1; // A half-pixel offset makes lines crisp const width = this.width; const height = this.params.height * this.params.pixelRatio; const offsetY = height * channelIndex || 0; const halfH = height / 2; - const length = peaks.length; + const length = peaks.length / peakIndexScale; const bar = this.params.barWidth * this.params.pixelRatio; const gap = Math.max(this.params.pixelRatio, ~~(bar / 2)); const step = bar + gap; @@ -174,13 +173,14 @@ export default util.extend({}, drawer, { const scale = length / width; let i; - for (i = 0; i < width; i += step) { - const h = Math.round(peaks[Math.floor(i * scale)] / absmax * halfH); + for (i = (start / scale); i < (end / scale); i += step) { + const peak = peaks[Math.floor(i * scale * peakIndexScale)] || 0; + const h = Math.round(peak / absmax * halfH); this.fillRect(i + this.halfPixel, halfH - h + offsetY, bar + this.halfPixel, h * 2); } }, - drawWave(peaks, channelIndex) { + drawWave(peaks, channelIndex, start, end) { // Split channels if (peaks[0] instanceof Array) { const channels = peaks; @@ -217,25 +217,25 @@ export default util.extend({}, drawer, { absmax = -min > max ? -min : max; } - this.drawLine(peaks, absmax, halfH, offsetY); + this.drawLine(peaks, absmax, halfH, offsetY, start, end); // Always draw a median line this.fillRect(0, halfH + offsetY - this.halfPixel, this.width, this.halfPixel); }, - drawLine(peaks, absmax, halfH, offsetY) { + drawLine(peaks, absmax, halfH, offsetY, start, end) { let i; for (i in this.canvases) { const entry = this.canvases[i]; this.setFillStyles(entry); - this.drawLineToContext(entry, entry.waveCtx, peaks, absmax, halfH, offsetY); - this.drawLineToContext(entry, entry.progressCtx, peaks, absmax, halfH, offsetY); + this.drawLineToContext(entry, entry.waveCtx, peaks, absmax, halfH, offsetY, start, end); + this.drawLineToContext(entry, entry.progressCtx, peaks, absmax, halfH, offsetY, start, end); } }, - drawLineToContext(entry, ctx, peaks, absmax, halfH, offsetY) { + drawLineToContext(entry, ctx, peaks, absmax, halfH, offsetY, start, end) { if (!ctx) { return; } const length = peaks.length / 2; @@ -247,22 +247,27 @@ export default util.extend({}, drawer, { const first = Math.round(length * entry.start); const last = Math.round(length * entry.end); + if (first > end || last < start) { return; } + const canvasStart = Math.max(first, start); + const canvasEnd = Math.min(last, end); let i; let j; ctx.beginPath(); - ctx.moveTo(this.halfPixel, halfH + offsetY); + ctx.moveTo((canvasStart - first) * scale + this.halfPixel, halfH + offsetY); - for (i = first; i < last; i++) { - const h = Math.round(peaks[2 * i] / absmax * halfH); + for (i = canvasStart; i < canvasEnd; i++) { + const peak = peaks[2 * i] || 0; + const h = Math.round(peak / absmax * halfH); ctx.lineTo((i - first) * scale + this.halfPixel, halfH - h + offsetY); } // Draw the bottom edge going backwards, to make a single // closed hull to fill. - for (j = last - 1; j >= first; j--) { - const k = Math.round(peaks[2 * j + 1] / absmax * halfH); - ctx.lineTo((j - first) * scale + this.halfPixel, halfH - k + offsetY); + for (j = canvasEnd - 1; j >= canvasStart; j--) { + const peak = peaks[2 * j + 1] || 0; + const h = Math.round(peak / absmax * halfH); + ctx.lineTo((i - first) * scale + this.halfPixel, halfH - h + offsetY); } ctx.closePath(); @@ -270,8 +275,13 @@ export default util.extend({}, drawer, { }, fillRect(x, y, width, height) { + const startCanvas = Math.floor(x / this.maxCanvasWidth); + const endCanvas = Math.min( + Math.ceil((x + width) / this.maxCanvasWidth) + 1, + this.canvases.length + ); let i; - for (i in this.canvases) { + for (i = startCanvas; i < endCanvas; i++) { const entry = this.canvases[i]; const leftOffset = i * this.maxCanvasWidth; diff --git a/src/mediaelement.js b/src/mediaelement.js index 96ef154b7..d7febbced 100755 --- a/src/mediaelement.js +++ b/src/mediaelement.js @@ -182,9 +182,9 @@ export default util.extend({}, webaudio, { } }, - getPeaks(length) { + getPeaks(length, start, end) { if (this.buffer) { - return webaudio.getPeaks.call(this, length); + return webaudio.getPeaks.call(this, length, start, end); } return this.peaks || []; }, diff --git a/src/peakcache.js b/src/peakcache.js new file mode 100644 index 000000000..98a5321e8 --- /dev/null +++ b/src/peakcache.js @@ -0,0 +1,87 @@ +export default { + init() { + this.clearPeakCache(); + }, + + clearPeakCache() { + // Flat array with entries that are always in pairs to mark the + // beginning and end of each subrange. This is a convenience so we can + // iterate over the pairs for easy set difference operations. + this.peakCacheRanges = []; + // Length of the entire cachable region, used for resetting the cache + // when this changes (zoom events, for instance). + this.peakCacheLength = -1; + }, + + addRangeToPeakCache(length, start, end) { + if (length != this.peakCacheLength) { + this.clearPeakCache(); + this.peakCacheLength = length; + } + + // Return ranges that weren't in the cache before the call. + let uncachedRanges = []; + let i = 0; + // Skip ranges before the current start. + while (i < this.peakCacheRanges.length && this.peakCacheRanges[i] < start) { + i++; + } + // If |i| is even, |start| falls after an existing range. Otherwise, + // |start| falls between an existing range, and the uncached region + // starts when we encounter the next node in |peakCacheRanges| or + // |end|, whichever comes first. + if (i % 2 == 0) { + uncachedRanges.push(start); + } + while (i < this.peakCacheRanges.length && this.peakCacheRanges[i] <= end) { + uncachedRanges.push(this.peakCacheRanges[i]); + i++; + } + // If |i| is even, |end| is after all existing ranges. + if (i % 2 == 0) { + uncachedRanges.push(end); + } + + // Filter out the 0-length ranges. + uncachedRanges = uncachedRanges.filter((item, pos, arr) => { + if (pos == 0) { + return item != arr[pos + 1]; + } else if (pos == arr.length - 1) { + return item != arr[pos - 1]; + } + return item != arr[pos - 1] && item != arr[pos + 1]; + }); + + // Merge the two ranges together, uncachedRanges will either contain + // wholly new points, or duplicates of points in peakCacheRanges. If + // duplicates are detected, remove both and extend the range. + this.peakCacheRanges = this.peakCacheRanges.concat(uncachedRanges); + this.peakCacheRanges = this.peakCacheRanges.sort((a, b) => a - b).filter((item, pos, arr) => { + if (pos == 0) { + return item != arr[pos + 1]; + } else if (pos == arr.length - 1) { + return item != arr[pos - 1]; + } + return item != arr[pos - 1] && item != arr[pos + 1]; + }); + + // Push the uncached ranges into an array of arrays for ease of + // iteration in the functions that call this. + const uncachedRangePairs = []; + for (i = 0; i < uncachedRanges.length; i += 2) { + uncachedRangePairs.push([uncachedRanges[i], uncachedRanges[i+1]]); + } + + return uncachedRangePairs; + }, + + // For testing + getCacheRanges() { + const peakCacheRangePairs = []; + let i; + for (i = 0; i < this.peakCacheRanges.length; i += 2) { + peakCacheRangePairs.push([this.peakCacheRanges[i], this.peakCacheRanges[i+1]]); + } + return peakCacheRangePairs; + } +}; diff --git a/src/wavesurfer.js b/src/wavesurfer.js index 89c55ea14..b42a47d4e 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -3,6 +3,7 @@ import Canvas from './drawer.canvas'; import MultiCanvas from './drawer.multicanvas'; import WebAudio from './webaudio'; import MediaElement from './mediaelement'; +import PeakCache from './peakcache'; const WaveSurfer = util.extend({}, util.observer, { util }, { defaultParams: { @@ -31,6 +32,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { backend : 'WebAudio', mediaType : 'audio', autoCenter : true, + partialRender : false, plugins : [] }, @@ -43,6 +45,8 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { WebAudio }, + PeakCache: PeakCache, + init(params) { // Extract relevant parameters (or defaults) this.params = WaveSurfer.util.extend({}, this.defaultParams, params); @@ -91,6 +95,7 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { this.registerPlugins(this.params.plugins); this.createDrawer(); this.createBackend(); + this.createPeakCache(); this.isDestroyed = false; return this; @@ -235,6 +240,9 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { // Relay the scroll event from the drawer this.drawer.on('scroll', e => { + if (this.params.partialRender) { + this.drawBuffer(); + } this.fireEvent('scroll', e); }); }, @@ -267,6 +275,13 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { }); }, + createPeakCache() { + if (this.params.partialRender) { + this.peakCache = Object.create(PeakCache); + this.peakCache.init(); + } + }, + getDuration() { return this.backend.getDuration(); }, @@ -403,14 +418,30 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { ); const parentWidth = this.drawer.getWidth(); let width = nominalWidth; + let start = this.drawer.getScrollX(); + let end = Math.min(start + parentWidth, width); // Fill container if (this.params.fillParent && (!this.params.scrollParent || nominalWidth < parentWidth)) { width = parentWidth; + start = 0; + end = width; } - const peaks = this.backend.getPeaks(width); - this.drawer.drawPeaks(peaks, width); + let peaks; + if (this.params.partialRender) { + const newRanges = this.peakCache.addRangeToPeakCache(width, start, end); + let i; + for (i = 0; i < newRanges.length; i++) { + peaks = this.backend.getPeaks(width, newRanges[i][0], newRanges[i][1]); + this.drawer.drawPeaks(peaks, width, newRanges[i][0], newRanges[i][1]); + } + } else { + start = 0; + end = width; + peaks = this.backend.getPeaks(width, start, end); + this.drawer.drawPeaks(peaks, width, start, end); + } this.fireEvent('redraw', peaks, width); }, diff --git a/src/webaudio.js b/src/webaudio.js index 9390da2cb..23a081a1d 100755 --- a/src/webaudio.js +++ b/src/webaudio.js @@ -48,6 +48,7 @@ const WebAudio = util.extend({}, util.observer, { this.setState(this.PAUSED_STATE); this.setPlaybackRate(this.params.audioRate); + this.setLength(0); }, disconnectFilters() { @@ -178,29 +179,55 @@ const WebAudio = util.extend({}, util.observer, { this.peaks = peaks; }, + /** + * Set the rendered length (different from the length of the audio). + */ + setLength(length) { + // No resize, we can preserve the cached peaks. + if (this.mergedPeaks && length == ((2 * this.mergedPeaks.length - 1) + 2)) { + return; + } + + this.splitPeaks = []; + this.mergedPeaks = []; + // Set the last element of the sparse array so the peak arrays are + // appropriately sized for other calculations. + const channels = this.buffer ? this.buffer.numberOfChannels : 1; + let c; + for (c = 0; c < channels; c++) { + this.splitPeaks[c] = []; + this.splitPeaks[c][2 * (length - 1)] = 0; + this.splitPeaks[c][2 * (length - 1) + 1] = 0; + } + this.mergedPeaks[2 * (length - 1)] = 0; + this.mergedPeaks[2 * (length - 1) + 1] = 0; + }, + /** * Compute the max and min value of the waveform when broken into * subranges. - * @param {Number} How many subranges to break the waveform into. + * @param {Number} length How many subranges to break the waveform into. + * @param {Number} first First sample in the required range. + * @param {Number} last Last sample in the required range. * @returns {Array} Array of 2* peaks or array of arrays * of peaks consisting of (max, min) values for each subrange. */ - getPeaks(length) { + getPeaks(length, first, last) { if (this.peaks) { return this.peaks; } + this.setLength(length); + const sampleSize = this.buffer.length / length; const sampleStep = ~~(sampleSize / 10) || 1; const channels = this.buffer.numberOfChannels; - const splitPeaks = []; - const mergedPeaks = []; let c; for (c = 0; c < channels; c++) { - const peaks = splitPeaks[c] = []; + const peaks = this.splitPeaks[c]; const chan = this.buffer.getChannelData(c); let i; - for (i = 0; i < length; i++) { + for (i = first; i <= last; i++) { const start = ~~(i * sampleSize); const end = ~~(start + sampleSize); let min = 0; @@ -222,17 +249,17 @@ const WebAudio = util.extend({}, util.observer, { peaks[2 * i] = max; peaks[2 * i + 1] = min; - if (c == 0 || max > mergedPeaks[2 * i]) { - mergedPeaks[2 * i] = max; + if (c == 0 || max > this.mergedPeaks[2 * i]) { + this.mergedPeaks[2 * i] = max; } - if (c == 0 || min < mergedPeaks[2 * i + 1]) { - mergedPeaks[2 * i + 1] = min; + if (c == 0 || min < this.mergedPeaks[2 * i + 1]) { + this.mergedPeaks[2 * i + 1] = min; } } } - return this.params.splitChannels ? splitPeaks : mergedPeaks; + return this.params.splitChannels ? this.splitPeaks : this.mergedPeaks; }, getPlayedPercents() { From 0fc23fc5a9e759108f988dc98a0e97f027858c2d Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Fri, 27 Jan 2017 20:12:08 +0100 Subject: [PATCH 021/573] Add plugin dev server task + updated README.md with dev tasks (#927) * updated webpack dependencies to version 2 release * added npm run start:plugins task * updated webpack config to 1) use path.resolve instead of path.join 2) use hot reloading 3) use the root directory as contentBase * changed urls to built code in example directory to relative * removed transcript example data duplicate in plugin system example * fixed typo in plugin system example * updated readme with new dev tasks * travis with prune for more accurate dependency resolution * updated karma-webpack to work with webpack 2 --- README.md | 26 +- example/angular-material/index.html | 2 +- example/angular/index.html | 2 +- example/annotation/index.html | 8 +- example/audio-element/index.html | 4 +- example/cursor/index.html | 4 +- example/elan/index.html | 6 +- example/equalizer/index.html | 2 +- example/microphone/index.html | 6 +- example/mute/index.html | 2 +- example/panner/index.html | 2 +- example/playlist/index.html | 2 +- example/plugin-system/app.js | 6 +- example/plugin-system/index.html | 18 +- example/plugin-system/transcripts/001z.mp3 | Bin 352154 -> 0 bytes example/plugin-system/transcripts/001z.xml | 2866 -------------------- example/regions/index.html | 8 +- example/spectrogram/index.html | 4 +- example/split-channels/index.html | 4 +- example/timeline/app.js | 2 +- example/timeline/index.html | 4 +- example/video-element/index.html | 4 +- example/zoom/index.html | 2 +- package.json | 1 + webpack.config.babel.js | 23 +- 25 files changed, 72 insertions(+), 2936 deletions(-) delete mode 100644 example/plugin-system/transcripts/001z.mp3 delete mode 100644 example/plugin-system/transcripts/001z.xml diff --git a/README.md b/README.md index 4373b23d5..10e74a8a0 100644 --- a/README.md +++ b/README.md @@ -66,41 +66,37 @@ For a list of projects using wavesurfer.js, check out [![npm](https://img.shields.io/npm/dm/wavesurfer.js.svg)]() [![Build Status](https://travis-ci.org/katspaugh/wavesurfer.js.svg?branch=master)](https://travis-ci.org/katspaugh/wavesurfer.js) -Install `grunt-cli` using npm: +Install development dependencies: ``` -npm install -g grunt-cli +npm install ``` +Development tasks automatically rebuild certain parts of the library when files are changed (`start` – wavesurfer, `start:plugins` – plugins). Start a dev task and go to `localhost:8080/example/` to test the current build. -Install development dependencies: +Start development server for core library: ``` -npm install +npm run start ``` -Build a minified version of the library and plugins. This command also checks -for code-style mistakes and runs the tests: +Start development server for plugins: ``` -grunt +npm run start:plugins ``` -Generated files are placed in the `dist` directory. - -Running tests only: +Build all the files. (generated files are placed in the `dist` directory.) ``` -grunt test +npm run build ``` -Creating a coverage report: +Running tests only: ``` -grunt coverage +npm run test ``` -The HTML report can be found in `coverage/html/index.html`. - ## Editing documentation The homepage and the documentation are in the [`gh-pages` branch](https://github.com/katspaugh/wavesurfer.js/tree/gh-pages). Contributions to the documentation are especially welcome. diff --git a/example/angular-material/index.html b/example/angular-material/index.html index bd7962463..6863237d9 100644 --- a/example/angular-material/index.html +++ b/example/angular-material/index.html @@ -15,7 +15,7 @@ - + diff --git a/example/angular/index.html b/example/angular/index.html index 045acc781..baa1fbb0d 100644 --- a/example/angular/index.html +++ b/example/angular/index.html @@ -17,7 +17,7 @@ - + diff --git a/example/annotation/index.html b/example/annotation/index.html index fdc8c9095..dfd7497ce 100644 --- a/example/annotation/index.html +++ b/example/annotation/index.html @@ -15,12 +15,12 @@ - + - - - + + + diff --git a/example/audio-element/index.html b/example/audio-element/index.html index 7f92c66df..7ab368335 100644 --- a/example/audio-element/index.html +++ b/example/audio-element/index.html @@ -14,9 +14,9 @@ - + - + diff --git a/example/cursor/index.html b/example/cursor/index.html index d8681e8f6..670b7850b 100644 --- a/example/cursor/index.html +++ b/example/cursor/index.html @@ -14,9 +14,9 @@ - + - + diff --git a/example/elan/index.html b/example/elan/index.html index b8b724334..5abb44f8b 100644 --- a/example/elan/index.html +++ b/example/elan/index.html @@ -15,13 +15,13 @@ - + - + - + diff --git a/example/equalizer/index.html b/example/equalizer/index.html index 7033af936..cbb1ba8b0 100644 --- a/example/equalizer/index.html +++ b/example/equalizer/index.html @@ -14,7 +14,7 @@ - + diff --git a/example/microphone/index.html b/example/microphone/index.html index da6f4e94c..54ea94b28 100644 --- a/example/microphone/index.html +++ b/example/microphone/index.html @@ -13,10 +13,10 @@ - + - + @@ -59,7 +59,7 @@

Installation

- Download the plugin + Download the plugin

diff --git a/example/mute/index.html b/example/mute/index.html index 662321626..839cba711 100644 --- a/example/mute/index.html +++ b/example/mute/index.html @@ -13,7 +13,7 @@ - + diff --git a/example/panner/index.html b/example/panner/index.html index b8234e659..a70da5834 100644 --- a/example/panner/index.html +++ b/example/panner/index.html @@ -15,7 +15,7 @@ - + diff --git a/example/playlist/index.html b/example/playlist/index.html index affc5eeb6..a442d378f 100644 --- a/example/playlist/index.html +++ b/example/playlist/index.html @@ -14,7 +14,7 @@ - + diff --git a/example/plugin-system/app.js b/example/plugin-system/app.js index b2f4effe4..10c359672 100644 --- a/example/plugin-system/app.js +++ b/example/plugin-system/app.js @@ -34,7 +34,7 @@ document.addEventListener('DOMContentLoaded', function () { ] }, elan: { - url: 'transcripts/001z.xml', + url: '../elan/transcripts/001z.xml', container: '#annotations', tiers: { Text: true, @@ -110,7 +110,5 @@ document.addEventListener('DOMContentLoaded', function () { wavesurfer.on('error', hideProgress); }()); - - - wavesurfer.load('../../media/demo.wav'); + wavesurfer.load('../media/demo.wav'); }); diff --git a/example/plugin-system/index.html b/example/plugin-system/index.html index 5e835464e..30eb523a5 100644 --- a/example/plugin-system/index.html +++ b/example/plugin-system/index.html @@ -15,16 +15,16 @@ - + - - - - - - - + + + + + + + @@ -119,7 +119,7 @@

Disable and enable plugins on the fly:

Initialising wavesurfer with plugins


-

The wavesurfer plugins is an array of plugin definitions. Calling a plugin with the parameter deferInit: true will stop it from automatically initialising – you can do that at a later time with wavesurfer.initPlugin('mypluginname').

+

The plugins option is an array of plugin definitions. Calling a plugin with the parameter deferInit: true will stop it from automatically initialising – you can do that at a later time with wavesurfer.initPlugin('mypluginname').

var wavesurfer = WaveSurfer.create({
         container: '#waveform',
diff --git a/example/plugin-system/transcripts/001z.mp3 b/example/plugin-system/transcripts/001z.mp3
deleted file mode 100644
index bd43bfae3c5b6a5680a7808bc28c9f05213e256c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 352154
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
z
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
z
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
-
-  
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 17 - - - - - 18 - - - - - 19 - - - - - 20 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - 25 - - - - - 26 - - - - - 27 - - - - - 28 - - - - - 29 - - - - - 30 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 34 - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - 40 - - - - - 41 - - - - - 42 - - - - - 43 - - - - - 44 - - - - - 45 - - - - - 46 - - - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A+ - - - - - +{sm}+ - - - - - +A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A+ - - - - - +{sm}+ - - - - - +A - - - - - A - - - - - A - - - - - A+ - - - - - +{sm}+ - - - - - +A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A+ - - - - - +{sm}+ - - - - - +A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A+ - - - - - +{sm}+ - - - - - +A+ - - - - - +{lg} - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - A - - - - - - - Пото= == - - - - - А потом ∙∙ про зайчика сон. - - - - - ∙∙ А зайчик вот, - - - - - ∙∙∙ он был в лесу. - - - - - ∙∙∙∙ А я была у р-речки. - - - - - ∙∙ {ЧМОКАНЬЕ} ∙∙ А потом ∙∙ ког= ‖ ∙∙ вот я пошла, - - - - - ∙∙ к ‖ домой, - - - - - ∙∙ а зайчик за мной, - - - - - бежал-бежал. - - - - - ∙∙∙∙ А потом ∙∙∙ он прибежал, - - - - - ∙∙∙ ко мне опять, - - - - - ∙∙ когда я ушла уже, - - - - - ∙∙ {ЧМОКАНЬЕ} ∙∙ я вышла, - - - - - ∙∙ к себе, - - - - - во двор. - - - - - ∙∙ И онь= == - - - - - ∙∙ {ЧМОКАНЬЕ} ∙∙ А зайчик как-то ∙∙ сюда прискакал, - - - - - ∙∙ а потом он ∙∙ н-не знал, - - - - - где я. - - - - - ∙∙∙∙ А я была ∙∙ у себя дома. - - - - - ∙∙∙∙ А потом этот зайчик прискакал ко мне домой. - - - - - ∙∙∙ {ЧМОКАНЬЕ} ∙∙ Он скакал-скакал, - - - - - и прискакал. - - - - - ∙∙∙ А потом он ск= ‖ ∙∙∙ этот зайчик ∙∙ встретил й-ёжика. - - - - - ∙∙∙ У меня! - - - - - ∙∙ Который был ∙∙ у меня дома, - - - - - ∙∙∙∙ и они были — - - - - - ∙∙ {ЧМОКАНЬЕ} ∙∙∙ {СМЕХ} этот зайчик, - - - - - ∙∙ и ёжик, - - - - - — у меня, - - - - - ∙∙∙ и они прям бегали ∙∙ тут прям-м по моему полу. - - - - - ∙∙∙ И по коврику, - - - - - ∙∙ а я им сделала ∙∙ пала’= ‖ ∙∙ к= ‖ ∙∙ по= ‖ ∙∙ постельку, - - - - - ∙∙ и они спали там. - - - - - ∙∙∙ На коврике. - - - - - ∙∙∙∙ А потом ∙∙ как-то неожиданно зайчик захотел морковку кушать. - - - - - ∙∙ А морковка ∙∙ стояла ‖ ∙∙ у меня там ∙∙ лежала в тарелочке. - - - - - ∙∙ Он взял эту морковку и скуш-шал. - - - - - ∙∙∙ С капусткой. - - - - - ∙∙ С капустой тоже, - - - - - капустку ∙∙ съел, - - - - - ∙∙∙ а я потом встала, - - - - - ∙∙ и увидела: - - - - - а где морковь?, - - - - - а где капуста? - - - - - ∙∙∙∙ Всё. - - - - - - - FLST - - - - - PERIOD - - - - - COMMA - - - - - PERIOD - - - - - PERIOD - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - PERIOD - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - PERIOD - - - - - FLST - - - - - COMMA - - - - - COMMA - - - - - PERIOD - - - - - PERIOD - - - - - PERIOD - - - - - COMMA - - - - - PERIOD - - - - - PERIOD - - - - - EXCLAM - - - - - COMMA - - - - - SPLIT - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - PERIOD - - - - - COMMA - - - - - COMMA - - - - - PERIOD - - - - - PERIOD - - - - - PERIOD - - - - - PERIOD - - - - - PERIOD - - - - - PERIOD - - - - - COMMA - - - - - COMMA - - - - - COMMA - - - - - COLON - - - - - QUEST+COMMA - - - - - QUEST - - - - - PERIOD - - - - - - - В начальной паузе шумный вдох. Слово вот — скрипучим голосом. - - - - - В начальной паузе шумный вдох. - - - - - Начальный союз — скрипучим голосом. Слово как-то произносит скандированно. - - - - - Падение на \мне почти на октаву. - - - - - Первый слог слова который произносит со смехом. - - - - - Смех частично накладывается на слово этот. - - - - - Слова тут прям-м произносит с улыбкой. Первые два слова и последнее слово — скрипучим голосом. - - - - - Тихо. С улыбкой. - - - - - Тихо. - - - - - Очень тихо. - - - - - - - Пото= - - - - - А - - - - - потом - - - - - про - - - - - зайчика - - - - - сон - - - - - А - - - - - зайчик - - - - - вот - - - - - он - - - - - был - - - - - в - - - - - лесу - - - - - А - - - - - я - - - - - была - - - - - у - - - - - речки - - - - - А - - - - - потом - - - - - ког= - - - - - вот - - - - - я - - - - - пошла - - - - - к - - - - - домой - - - - - а - - - - - зайчик - - - - - за - - - - - мной - - - - - бежал-бежал - - - - - А - - - - - потом - - - - - он - - - - - прибежал - - - - - ко - - - - - мне - - - - - опять - - - - - когда - - - - - я - - - - - ушла - - - - - уже - - - - - я - - - - - вышла - - - - - к - - - - - себе - - - - - во - - - - - двор - - - - - И - - - - - онь= - - - - - А - - - - - зайчик - - - - - как-то - - - - - сюда - - - - - прискакал - - - - - а - - - - - потом - - - - - он - - - - - не - - - - - знал - - - - - где - - - - - я - - - - - А - - - - - я - - - - - была - - - - - у - - - - - себя - - - - - дома - - - - - А - - - - - потом - - - - - этот - - - - - зайчик - - - - - прискакал - - - - - ко - - - - - мне - - - - - домой - - - - - Он - - - - - скакал-скакал - - - - - и - - - - - прискакал - - - - - А - - - - - потом - - - - - он - - - - - ск= - - - - - этот - - - - - зайчик - - - - - встретил - - - - - ёжика - - - - - У - - - - - меня - - - - - Который - - - - - был - - - - - у - - - - - меня - - - - - дома - - - - - и - - - - - они - - - - - были - - - - - этот - - - - - зайчик - - - - - и - - - - - ёжик - - - - - у - - - - - меня - - - - - и - - - - - они - - - - - прям - - - - - бегали - - - - - тут - - - - - прям - - - - - по - - - - - моему - - - - - полу - - - - - И - - - - - по - - - - - коврику - - - - - а - - - - - я - - - - - им - - - - - сделала - - - - - пала’= - - - - - к= - - - - - по= - - - - - постельку - - - - - и - - - - - они - - - - - спали - - - - - там - - - - - На - - - - - коврике - - - - - А - - - - - потом - - - - - как-то - - - - - неожиданно - - - - - зайчик - - - - - захотел - - - - - морковку - - - - - кушать - - - - - А - - - - - морковка - - - - - стояла - - - - - у - - - - - меня - - - - - там - - - - - лежала - - - - - в - - - - - тарелочке - - - - - Он - - - - - взял - - - - - эту - - - - - морковку - - - - - и - - - - - скушал - - - - - С - - - - - капусткой - - - - - С - - - - - капустой - - - - - тоже - - - - - капустку - - - - - съел - - - - - а - - - - - я - - - - - потом - - - - - встала - - - - - и - - - - - увидела - - - - - а - - - - - где - - - - - морковь - - - - - а - - - - - где - - - - - капуста - - - - - Всё - - - - - - - R - - - - - F - - - - - R - - - - - F - - - - - R - - - - - F - - - - - R - - - - - R - - - - - F - - - - - R - - - - - F - - - - - R - - - - - R - - - - - R - - - - - F - - - - - F - - - - - R-F - - - - - F - - - - - F - - - - - R - - - - - R - - - - - R - - - - - R - - - - - F - - - - - R - - - - - R - - - - - F - - - - - R - - - - - R - - - - - F - - - - - R - - - - - R - - - - - R - - - - - R-F - - - - - F - - - - - R - - - - - R - - - - - R - - - - - R-P - - - - - F - - - - - R - - - - - R - - - - - F - - - - - P - - - - - R - - - - - R - - - - - F - - - - - F - - - - - R - - - - - R - - - - - F - - - - - R - - - - - R - - - - - R - - - - - R - - - - - F - - - - - R - - - - - F - - - - - F - - - - - F - - - - - R - - - - - R-F - - - - - R - - - - - F - - - - - R-F - - - - - F - - - - - R-F - - - - - F - - - - - P - - - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - Main - - - - - - - Len - - - - - Len - - - - - Len - - - - - Len - - - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - Red - - - - - - - Asp-E - - - - - Lab-E - - - - - Asp-E - - - - - Gl-E - - - - - Asp-E - - - - - - - Emph - - - - - Emph - - - - - Emph - - - - - - - YES - - - - - YES - - - - - YES - - - - - YES - - - - - YES - - - - - YES - - - - - YES - - - - - - - - -
diff --git a/example/regions/index.html b/example/regions/index.html index 17926f37b..ea852dd72 100644 --- a/example/regions/index.html +++ b/example/regions/index.html @@ -14,12 +14,12 @@ - + - - - + + + diff --git a/example/spectrogram/index.html b/example/spectrogram/index.html index e1d59019b..913bda55c 100644 --- a/example/spectrogram/index.html +++ b/example/spectrogram/index.html @@ -13,10 +13,10 @@ - + - + diff --git a/example/split-channels/index.html b/example/split-channels/index.html index 70b9684e1..091a81bcd 100644 --- a/example/split-channels/index.html +++ b/example/split-channels/index.html @@ -14,9 +14,9 @@ - + - + diff --git a/example/timeline/app.js b/example/timeline/app.js index dbae1cf69..1e4629075 100644 --- a/example/timeline/app.js +++ b/example/timeline/app.js @@ -51,5 +51,5 @@ document.addEventListener('DOMContentLoaded', function () { - wavesurfer.load('../../media/demo.wav'); + wavesurfer.load('../media/demo.wav'); }); diff --git a/example/timeline/index.html b/example/timeline/index.html index bcfa8bbc5..38e3e0a27 100644 --- a/example/timeline/index.html +++ b/example/timeline/index.html @@ -15,10 +15,10 @@ - + - + diff --git a/example/video-element/index.html b/example/video-element/index.html index e96ad2196..595c32069 100644 --- a/example/video-element/index.html +++ b/example/video-element/index.html @@ -14,9 +14,9 @@ - + - + diff --git a/example/zoom/index.html b/example/zoom/index.html index d9e573da8..876e156e3 100644 --- a/example/zoom/index.html +++ b/example/zoom/index.html @@ -14,7 +14,7 @@ - + diff --git a/package.json b/package.json index c1cc17c56..ff73d552e 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ }, "scripts": { "start": "webpack --env.plugins && webpack-dev-server", + "start:plugins": "webpack && webpack-dev-server --env.plugins", "build": "npm run build:normal & npm run build:minified", "build:normal": "webpack & webpack --env.plugins", "build:minified": "webpack --env.minify & webpack --env.plugins --env.minify", diff --git a/webpack.config.babel.js b/webpack.config.babel.js index af9532108..b0cecb565 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -42,20 +42,22 @@ const config = { context: __dirname, devtool: 'source-map', entry: { - wavesurfer: path.join(__dirname, 'src', 'wavesurfer.js') + wavesurfer: path.resolve(__dirname, 'src', 'wavesurfer.js') }, output: { - path: path.join(__dirname, 'dist'), + path: path.resolve(__dirname, 'dist'), + publicPath: 'localhost:8080/dist/', filename: '[name].js', library: 'WaveSurfer', libraryTarget: 'umd', umdNamedDefine: true }, devServer: { + hot: true, contentBase: [ - path.join(__dirname, 'example'), - path.join(__dirname, 'dist') + path.join(__dirname) ], + publicPath: 'localhost:8080/dist/', watchContentBase: true }, module: { @@ -83,7 +85,8 @@ const config = { }, plugins: [ - bannerPlugin + bannerPlugin, + new webpack.HotModuleReplacementPlugin() ], }; @@ -97,7 +100,7 @@ const config = { */ function buildPluginEntry(plugins) { const result = {}; - plugins.forEach(plugin => result[plugin] = path.join(__dirname, 'src', 'plugin', plugin)); + plugins.forEach(plugin => result[plugin] = path.resolve(__dirname, 'src', 'plugin', plugin)); return result; } @@ -116,9 +119,13 @@ export default function (options) { 'elan' ]), output: { - path: path.join(__dirname, 'dist', 'plugin'), + path: path.resolve(__dirname, 'dist', 'plugin'), filename: 'wavesurfer.[name].js', - library: ['WaveSurfer', '[name]'] + library: ['WaveSurfer', '[name]'], + publicPath: 'localhost:8080/dist/plugin/' + }, + devServer: { + publicPath: 'localhost:8080/dist/plugin/' } }); } From 6a30640a5041fd8ffa3be813bf9dc2976932ba12 Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Fri, 27 Jan 2017 21:51:22 +0100 Subject: [PATCH 022/573] Next: multicanvas by default (#926) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed drawer.canvas, drawer.multicanvas is default. Drawer is being defined in renderer param property directly, not as a string. This enables injecting directly. Added informative error message in case somebody does use a string as the renderer property. * Updated minimap plugin to use multicanvas renderer (needs a few values set at initialisation time) – also using ws function param instead of this.ws to reduce minified file size * correct check for renderer parameter, check if it is an object and has an init function * updated karma-webpack to work with webpack 2 * travis with prune for more accurate dependency resolution * linter complains because of indentation. --- src/drawer.canvas.js | 204 -------------------------------------- src/drawer.multicanvas.js | 14 +-- src/plugin/minimap.js | 44 ++++---- src/wavesurfer.js | 19 ++-- 4 files changed, 43 insertions(+), 238 deletions(-) delete mode 100644 src/drawer.canvas.js diff --git a/src/drawer.canvas.js b/src/drawer.canvas.js deleted file mode 100644 index 611adcfc2..000000000 --- a/src/drawer.canvas.js +++ /dev/null @@ -1,204 +0,0 @@ -import drawer from './drawer'; -import * as util from './util'; - -export default util.extend({}, drawer, { - createElements() { - const waveCanvas = this.wrapper.appendChild( - this.style(document.createElement('canvas'), { - position: 'absolute', - zIndex: 1, - left: 0, - top: 0, - bottom: 0 - }) - ); - this.waveCc = waveCanvas.getContext('2d'); - - this.progressWave = this.wrapper.appendChild( - this.style(document.createElement('wave'), { - position: 'absolute', - zIndex: 2, - left: 0, - top: 0, - bottom: 0, - overflow: 'hidden', - width: '0', - display: 'none', - boxSizing: 'border-box', - borderRightStyle: 'solid', - borderRightWidth: this.params.cursorWidth + 'px', - borderRightColor: this.params.cursorColor - }) - ); - - if (this.params.waveColor != this.params.progressColor) { - const progressCanvas = this.progressWave.appendChild( - document.createElement('canvas') - ); - this.progressCc = progressCanvas.getContext('2d'); - } - }, - - updateSize() { - const width = Math.round(this.width / this.params.pixelRatio); - - this.waveCc.canvas.width = this.width; - this.waveCc.canvas.height = this.height; - this.style(this.waveCc.canvas, { width: width + 'px'}); - - this.style(this.progressWave, { display: 'block'}); - - if (this.progressCc) { - this.progressCc.canvas.width = this.width; - this.progressCc.canvas.height = this.height; - this.style(this.progressCc.canvas, { width: width + 'px'}); - } - - this.clearWave(); - }, - - clearWave() { - this.waveCc.clearRect(0, 0, this.width, this.height); - if (this.progressCc) { - this.progressCc.clearRect(0, 0, this.width, this.height); - } - }, - - drawBars(peaks, channelIndex, start, end) { - // Split channels - if (peaks[0] instanceof Array) { - const channels = peaks; - if (this.params.splitChannels) { - this.setHeight(channels.length * this.params.height * this.params.pixelRatio); - channels.forEach(this.drawBars, this); - return; - } - peaks = channels[0]; - } - - // Bar wave draws the bottom only as a reflection of the top, - // so we don't need negative values - const hasMinVals = [].some.call(peaks, val => val < 0); - // Skip every other value if there are negatives. - const peakIndexScale = hasMinVals ? 2 : 1; - - // A half-pixel offset makes lines crisp - const $ = 0.5 / this.params.pixelRatio; - const width = this.width; - const height = this.params.height * this.params.pixelRatio; - const offsetY = height * channelIndex || 0; - const halfH = height / 2; - const length = peaks.length / peakIndexScale; - const bar = this.params.barWidth * this.params.pixelRatio; - const gap = Math.max(this.params.pixelRatio, ~~(bar / 2)); - const step = bar + gap; - - let absmax = 1; - if (this.params.normalize) { - absmax = util.max(peaks); - } - - const scale = length / width; - - this.waveCc.fillStyle = this.params.waveColor; - if (this.progressCc) { - this.progressCc.fillStyle = this.params.progressColor; - } - - [this.waveCc, this.progressCc].forEach(cc => { - if (!cc) { return; } - let i; - - for (i = (start / scale); i < (end / scale); i += step) { - const peak = peaks[Math.floor(i * scale * peakIndexScale)] || 0; - const h = Math.round(peak / absmax * halfH); - cc.fillRect(i + $, halfH - h + offsetY, bar + $, h * 2); - } - }); - }, - - drawWave(peaks, channelIndex, start, end) { - // Split channels - if (peaks[0] instanceof Array) { - const channels = peaks; - if (this.params.splitChannels) { - this.setHeight(channels.length * this.params.height * this.params.pixelRatio); - channels.forEach(this.drawWave, this); - return; - } - peaks = channels[0]; - } - - // Support arrays without negative peaks - const hasMinValues = [].some.call(peaks, val => val < 0); - if (!hasMinValues) { - const reflectedPeaks = []; - let i; - let len; - for (i = 0, len = peaks.length; i < len; i++) { - reflectedPeaks[2 * i] = peaks[i]; - reflectedPeaks[2 * i + 1] = -peaks[i]; - } - peaks = reflectedPeaks; - } - - // A half-pixel offset makes lines crisp - const $ = 0.5 / this.params.pixelRatio; - const height = this.params.height * this.params.pixelRatio; - const offsetY = height * channelIndex || 0; - const halfH = height / 2; - const length = ~~(peaks.length / 2); - - let scale = 1; - if (this.params.fillParent && this.width != length) { - scale = this.width / length; - } - - let absmax = 1; - if (this.params.normalize) { - const max = util.max(peaks); - const min = util.min(peaks); - absmax = -min > max ? -min : max; - } - - this.waveCc.fillStyle = this.params.waveColor; - if (this.progressCc) { - this.progressCc.fillStyle = this.params.progressColor; - } - - [this.waveCc, this.progressCc].forEach(cc => { - if (!cc) { return; } - let i; - let j; - - cc.beginPath(); - cc.moveTo(start * scale + $, halfH + offsetY); - - for (i = start; i < end; i++) { - const h = Math.round(peaks[2 * i] / absmax * halfH); - cc.lineTo(i * scale + $, halfH - h + offsetY); - } - - // Draw the bottom edge going backwards, to make a single - // closed hull to fill. - for (j = end - 1; j >= start; j--) { - const k = Math.round(peaks[2 * j + 1] / absmax * halfH); - cc.lineTo(j * scale + $, halfH - k + offsetY); - } - - cc.closePath(); - cc.fill(); - - // Always draw a median line - cc.fillRect(0, halfH + offsetY - $, this.width, $); - }); - }, - - updateProgress(pos) { - this.style(this.progressWave, { width: pos + 'px' }); - }, - - getImage(type, quality) { - return this.waveCc.canvas.toDataURL(type, quality); - } -}); diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js index 05ae6990e..9335be0d7 100644 --- a/src/drawer.multicanvas.js +++ b/src/drawer.multicanvas.js @@ -3,17 +3,11 @@ import * as util from './util'; export default util.extend({}, drawer, { initDrawer(params) { - this.maxCanvasWidth = params.maxCanvasWidth != null ? params.maxCanvasWidth : 4000; - this.maxCanvasElementWidth = Math.round(this.maxCanvasWidth / this.params.pixelRatio); + this.maxCanvasWidth = params.maxCanvasWidth; + this.maxCanvasElementWidth = Math.round(params.maxCanvasWidth / params.pixelRatio); - if (this.maxCanvasWidth <= 1) { - throw 'maxCanvasWidth must be greater than 1.'; - } else if (this.maxCanvasWidth % 2 == 1) { - throw 'maxCanvasWidth must be an even number.'; - } - - this.hasProgressCanvas = this.params.waveColor != this.params.progressColor; - this.halfPixel = 0.5 / this.params.pixelRatio; + this.hasProgressCanvas = params.waveColor != params.progressColor; + this.halfPixel = 0.5 / params.pixelRatio; this.canvases = []; }, diff --git a/src/plugin/minimap.js b/src/plugin/minimap.js index 7920d425e..ce3eac3d1 100644 --- a/src/plugin/minimap.js +++ b/src/plugin/minimap.js @@ -19,20 +19,30 @@ export default function(params = {}) { instance: { init(wavesurfer) { this.wavesurfer = wavesurfer; + + this.params = wavesurfer.util.extend( + {}, wavesurfer.params, { + showRegions: false, + showOverview: false, + overviewBorderColor: 'green', + overviewBorderSize: 2 + }, params, { + scrollParent: false, + fillParent: true + } + ); + + // add required multicanvas drawer values + this.maxCanvasWidth = this.params.maxCanvasWidth; + this.maxCanvasElementWidth = Math.round(this.params.maxCanvasWidth / this.params.pixelRatio); + this.hasProgressCanvas = this.params.waveColor != this.params.progressColor; + this.halfPixel = 0.5 / this.params.pixelRatio; + this.canvases = []; + + // when the root drawer was created, add minimap this._onDrawerCreated = () => { - this.container = this.wavesurfer.drawer.container; - this.lastPos = this.wavesurfer.drawer.lastPos; - this.params = wavesurfer.util.extend( - {}, this.wavesurfer.drawer.params, { - showRegions: false, - showOverview: false, - overviewBorderColor: 'green', - overviewBorderSize: 2 - }, params, { - scrollParent: false, - fillParent: true - } - ); + this.container = wavesurfer.drawer.container; + this.lastPos = wavesurfer.drawer.lastPos; this.width = 0; this.height = this.params.height * this.params.pixelRatio; @@ -40,20 +50,20 @@ export default function(params = {}) { this.createWrapper(); this.createElements(); - if (this.wavesurfer.regions && this.params.showRegions) { + if (wavesurfer.regions && this.params.showRegions) { this.regions(); } this.bindWaveSurferEvents(); this.bindMinimapEvents(); }; - if (this.wavesurfer.drawer) { + if (wavesurfer.drawer) { this._onDrawerCreated(); // @TODO: This shouldn't be necessary this._onResize(); } - this.wavesurfer.on('drawer-created', this._onDrawerCreated); + wavesurfer.on('drawer-created', this._onDrawerCreated); }, destroy() { @@ -106,7 +116,7 @@ export default function(params = {}) { }, createElements() { - this.wavesurfer.renderers.Canvas.createElements.call(this); + this.wavesurfer.drawer.createElements.call(this); if (this.params.showOverview) { this.overviewRegion = this.style(document.createElement('overview'), { diff --git a/src/wavesurfer.js b/src/wavesurfer.js index b42a47d4e..24260b438 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -1,5 +1,4 @@ import * as util from './util'; -import Canvas from './drawer.canvas'; import MultiCanvas from './drawer.multicanvas'; import WebAudio from './webaudio'; import MediaElement from './mediaelement'; @@ -28,7 +27,8 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { splitChannels : false, mediaContainer: null, mediaControls : false, - renderer : 'Canvas', + renderer : MultiCanvas, + maxCanvasWidth: 4000, backend : 'WebAudio', mediaType : 'audio', autoCenter : true, @@ -36,10 +36,6 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { plugins : [] }, - renderers: { - Canvas, - MultiCanvas - }, backends: { MediaElement, WebAudio @@ -71,6 +67,12 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { throw new Error('Media Container element not found'); } + if (this.params.maxCanvasWidth <= 1) { + throw new Error('maxCanvasWidth must be greater than 1'); + } else if (this.params.maxCanvasWidth % 2 == 1) { + throw new Error('maxCanvasWidth must be an even number'); + } + // Used to save the current volume when muting so we can // restore once unmuted this.savedVolume = 0; @@ -86,7 +88,10 @@ const WaveSurfer = util.extend({}, util.observer, { util }, { this.currentAjax = null; // cache constructor objects - this.Drawer = this.renderers[this.params.renderer]; + if (typeof this.params.renderer !== 'object' || typeof this.params.renderer.init !== 'function') { + throw new Error('Renderer parameter is invalid'); + } + this.Drawer = this.params.renderer; this.Backend = this.backends[this.params.backend]; // plugins that are currently initialised From aef2c58e7c3bd2f057e125fc7107239dfc03227b Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Fri, 3 Feb 2017 18:44:18 +0100 Subject: [PATCH 023/573] improved html init script (#946) --- example/html-init/index.html | 114 +++++++++++++++++++++++++ package.json | 10 ++- src/html-init.js | 159 +++++++++++++++++++++++++++++++---- webpack.config.babel.js | 105 ++++++++++++++--------- 4 files changed, 326 insertions(+), 62 deletions(-) create mode 100644 example/html-init/index.html diff --git a/example/html-init/index.html b/example/html-init/index.html new file mode 100644 index 000000000..ad4326bb9 --- /dev/null +++ b/example/html-init/index.html @@ -0,0 +1,114 @@ + + + + + wavesurfer.js | HTML initialisation API example + + + + + + + + + + + + + + + + +
+ + + + + + diff --git a/package.json b/package.json index ff73d552e..2848443a8 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,12 @@ "example": "example" }, "scripts": { - "start": "webpack --env.plugins && webpack-dev-server", - "start:plugins": "webpack && webpack-dev-server --env.plugins", + "start": "webpack --env.plugins && webpack --env.htmlinit && webpack-dev-server", + "start:htmlinit": "webpack && webpack --env.plugins && webpack-dev-server --env.htmlinit", + "start:plugins": "webpack && webpack --env.htmlinit && webpack-dev-server --env.plugins", "build": "npm run build:normal & npm run build:minified", - "build:normal": "webpack & webpack --env.plugins", - "build:minified": "webpack --env.minify & webpack --env.plugins --env.minify", + "build:normal": "webpack & webpack --env.plugins & webpack --env.htmlinit", + "build:minified": "webpack --env.minify & webpack --env.plugins --env.minify & webpack --env.htmlinit --env.minify", "test": "BABEL_ENV=test karma start karma.conf.js" }, "repository": { @@ -39,6 +40,7 @@ "karma-coverage": "^1.1.1", "karma-jasmine": "1.0.2", "karma-jasmine-matchers": "3.0.1", + "load-script": "^1.0.0", "karma-webpack": "^2.0.2", "webpack": "2", "webpack-dev-server": "2" diff --git a/src/html-init.js b/src/html-init.js index 313c4130d..ad0a7f270 100644 --- a/src/html-init.js +++ b/src/html-init.js @@ -1,32 +1,155 @@ -'use strict'; +import loadScript from 'load-script'; -/* Init from HTML */ -(function () { - var init = function () { - var containers = document.querySelectorAll('wavesurfer'); +class Init { + /** + * Construct Init class + * + * @param {Object} WaveSurfer {The WaveSurfer library object} + * @param {Object} params {initialisation options} + */ + constructor(WaveSurfer, params = {}) { + if (!WaveSurfer) { + throw new Error('WaveSurfer is not available!'); + } - Array.prototype.forEach.call(containers, function (el) { - var params = WaveSurfer.util.extend({ - container: el, + // cache WaveSurfer + this.WaveSurfer = WaveSurfer; + + // build parameters, cache them in _params so minified builds are smaller + const _params = this.params = WaveSurfer.util.extend({}, { + // wavesurfer parameter defaults so by default the audio player is + // usable with native media element controls + defaults: { backend: 'MediaElement', mediaControls: true - }, el.dataset); + }, + // containers to instantiate on, can be selector string or HTMLElement + containers: 'wavesurfer', + // @TODO insert plugin CDN URIs + pluginCdnTemplate: '//localhost:8080/dist/plugin/wavesurfer.[name].js', + // loadPlugin function can be overriden to inject plugin definition + // objects, this default function uses load-script to load a plugin + // and pass it to a callback + loadPlugin(name, cb) { + const src = _params.pluginCdnTemplate.replace('[name]', name); + loadScript(src, { async: false }, (err, plugin) => { + if (err) { + return console.error(`WaveSurfer plugin ${name} not found at ${src}`); + } + cb(window.WaveSurfer[name]); + }); + } + }, params); + this.containers = typeof _params.containers == 'string' + ? document.querySelectorAll(_params.containers) + : _params.containers; + this.pluginCache = {}; + this.instances = []; - el.style.display = 'block'; + this.initAllEls(); + } - var wavesurfer = WaveSurfer.create(params); + /** + * Initialise all container elements + */ + initAllEls() { + // iterate over all the container elements + Array.prototype.forEach.call(this.containers, el => { + // load the plugins as an array of plugin names + const plugins = el.dataset.plugins + ? el.dataset.plugins.split(',') + : []; - if (el.dataset.peaks) { - var peaks = JSON.parse(el.dataset.peaks); + // no plugins to be loaded, just render + if (!plugins.length) { + return this.initEl(el); } + // … or: iterate over all the plugins + plugins.forEach((name, i) => { + // plugin is not cached already, load it + if (!this.pluginCache[name]) { + this.params.loadPlugin(name, lib => { + this.pluginCache[name] = lib; + // plugins were all loaded, render the element + if (i + 1 === plugins.length) { + this.initEl(el, plugins); + } + }); + } else if (i === plugins.length) { + // plugin was cached and this plugin was the last + this.initEl(el, plugins); + } + }); + }); + } - wavesurfer.load(el.dataset.url, peaks); + /** + * Initialise a single container element and add to this.instances + * + * @param {HTMLElement} el - The Container to instantiate wavesurfer to + * @param {plugin[]} plugins - An Array of plugin names to initialise with + * @return {WaveSurferInstance} + */ + initEl(el, plugins = []) { + const jsonRegex = /^[[|{]/; + // initialise plugins with the correct options + const initialisedPlugins = plugins.map(plugin => { + const options = {}; + // the regex to find this plugin attributes + const attrNameRegex = new RegExp('^' + plugin); + let attrName; + // iterate over all the data attributes and find ones for this + // plugin + for (attrName in el.dataset) { + const regexResult = attrNameRegex.exec(attrName); + if (regexResult) { + const attr = el.dataset[attrName]; + // if the string begins with a [ or a { parse it as JSON + const prop = jsonRegex.test(attr) ? JSON.parse(attr) : attr; + // this removes the plugin prefix and changes the first letter + // of the resulting string to lower case to follow the naming + // convention of ws params + const unprefixedOptionName = attrName.slice(plugin.length, plugin.length + 1).toLowerCase() + + attrName.slice(plugin.length + 1); + options[unprefixedOptionName] = prop; + } + } + return this.pluginCache[plugin](options); }); - }; + // build parameter object for this container + const params = this.WaveSurfer.util.extend( + { container: el }, + this.params.defaults, + el.dataset, + { plugins: initialisedPlugins } + ); + // @TODO make nicer + el.style.display = 'block'; + + // initialise wavesurfer, load audio (with peaks if provided) + const instance = this.WaveSurfer.create(params); + const peaks = params.peaks ? JSON.parse(params.peaks) : undefined; + instance.load(params.url, peaks); + + // push this instance into the instances cache + this.instances.push(instance); + return instance; + } +} + +// if window object exists and window.WS_StopAutoInit is not true +if (typeof window === 'object' && !window.WS_StopAutoInit) { + // call init when document is ready, apply any custom default settings + // in window.WS_InitOptions if (document.readyState === 'complete') { - init(); + window.WaveSurferInit = new Init(window.WaveSurfer, window.WS_InitOptions); } else { - window.addEventListener('load', init); + window.addEventListener('load', () => { + window.WaveSurferInit = new Init(window.WaveSurfer, window.WS_InitOptions); + }); } -}()); +} + +// export init for manual usage +export default Init; diff --git a/webpack.config.babel.js b/webpack.config.babel.js index b0cecb565..88b85da72 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -60,6 +60,9 @@ const config = { publicPath: 'localhost:8080/dist/', watchContentBase: true }, + performance: { + hints: false + }, module: { rules: [ { @@ -105,53 +108,75 @@ function buildPluginEntry(plugins) { } export default function (options) { - - if (options && options.plugins) { - delete config.entry; - mergeDeep(config, { - entry: buildPluginEntry([ - 'timeline', - 'minimap', - 'regions', - 'spectrogram', - 'cursor', - 'microphone', - 'elan' - ]), - output: { - path: path.resolve(__dirname, 'dist', 'plugin'), - filename: 'wavesurfer.[name].js', - library: ['WaveSurfer', '[name]'], - publicPath: 'localhost:8080/dist/plugin/' - }, - devServer: { - publicPath: 'localhost:8080/dist/plugin/' - } - }); - } - if (options && options.minify) { - mergeDeep(config, { - plugins: [ - new webpack.optimize.UglifyJsPlugin({ - sourceMap: true - }), - bannerPlugin - ] - }); - - // rename outputs - if (options.plugins) { + if (options) { + // html init code + if (options.htmlinit) { + delete config.entry; mergeDeep(config, { + entry: { + 'html-init': path.join(__dirname, 'src', 'html-init.js') + }, output: { - filename: 'wavesurfer.[name].min.js' + filename: 'wavesurfer-[name].js', + library: ['WaveSurfer', '[name]'] } }); - } else { + } + // plugins + if (options.plugins) { + delete config.entry; mergeDeep(config, { + entry: buildPluginEntry([ + 'timeline', + 'minimap', + 'regions', + 'spectrogram', + 'cursor', + 'microphone', + 'elan' + ]), output: { - filename: '[name].min.js' + path: path.resolve(__dirname, 'dist', 'plugin'), + filename: 'wavesurfer.[name].js', + library: ['WaveSurfer', '[name]'], + publicPath: 'localhost:8080/dist/plugin/' + }, + devServer: { + publicPath: 'localhost:8080/dist/plugin/' } - }) + }); + } + // minified builds + if (options.minify) { + mergeDeep(config, { + plugins: [ + new webpack.optimize.UglifyJsPlugin({ + sourceMap: true + }), + bannerPlugin + ] + }); + + // rename outputs + if (options.plugins) { + mergeDeep(config, { + output: { + filename: 'wavesurfer.[name].min.js' + } + }); + } else if (options.htmlinit) { + mergeDeep(config, { + output: { + filename: 'wavesurfer-[name].min.js' + } + }); + } else { + mergeDeep(config, { + output: { + filename: '[name].min.js' + } + }) + } } } From bb04a603e88c04da1c6e993f742c123072baca2c Mon Sep 17 00:00:00 2001 From: Martin Spencer Date: Mon, 6 Feb 2017 18:03:28 +0100 Subject: [PATCH 024/573] Next: Minor bugfixes and ports of changes from master (#966) * fixed wrong var reference causing the bottom half of the waves to not draw * replaced loops of this.canvases with correct for loop or forEach where possible * turned unnecessary let into const in multicanvas * Only call media.load() if it exists (#875) * When running code that uses Wavesurfer under PhantomJS (even if not explicitly testing the Wavesurfer code), the JS interpreter crashes because PhantomJS DOM `
+
+ + +

HTML initialisation API

+
+ +

+ Using the HTML initialisation script and the HTML attribute API is a quick way of creating wavesurfer instances. +

+ +
+
+ + +
<wavesurfer
+    data-url="../media/demo.wav"
+    data-plugins="regions"
+    data-regions-regions='[{"start": 1,"end": 3,"color": "hsla(400, 100%, 30%, 0.5)"}, {"start": 5,"end": 7,"color": "hsla(200, 50%, 70%, 0.4)"}]'
+>
+</wavesurfer>
+
+
+
+
+ + +
+
<wavesurfer
+    data-url="../media/demo.wav"
+    data-plugins="minimap,timeline"
+    data-minimap-height="30"
+    data-minimap-wave-color="#ddd"
+    data-minimap-progress-color="#999"
+    data-timeline-font-size="13px"
+    data-timeline-container="#timeline"
+>
+</wavesurfer>
+<div id="timeline"></div>
+
+
+
+ + +
@@ -61,7 +61,7 @@

Fork me on GitHub - + + + + + + + + + +
+
+ + +

Split Wave / Point Plot

+
+
+

+ The Split Wave Point Plot drawer splits the graphic in two, with the upper half being a plot of + points defined by time and a range of values. The following example shows the calculated pitch + at each point in time. +

+
+ +
+
+ +
+ +
+ +
+
+ + +
+

How to Enable Split Wave/Point Plot

+ +

+ Set the renderer option to SplitWavePointPlot and the plotFileUrl to the file containing the time aligned data. +

+ +

+

var wavesurfer = WaveSurfer.create({
+    container: document.querySelector('#wave'),
+    renderer: 'SplitWavePointPlot',
+    plotFileUrl: 'data.txt'
+});
+
+

+ +

Providing Point Data

+

The data to be graphed can be provided by either providing a file defined in the plotFileUrl or by passing in an array of data in the plotArray option. The time data does not need to be continous and can have gaps.

+ Note: if the timing of your data does not span the duration of the sound file you should set plotTimeEnd to the total duration of the sound file or the points may not be aligned correctly +

Data File Format

+

If providing data by loading a file, each line of the file must contain two elements: the time and the value of the point separated by a delimiter (defaults to tab). E.g.

+
0.01 123
+0.02 121
+0.03 127
+0.22 120
+0.23 119
+ +

Data Array Format

+

If providing data by a javascript array via the plotArray option the array should have the following form:

+
[
+{time: 0.02, value: 121},
+{time: 0.03, value: 127},
+{time: 0.22, value: 120},
+{time: 0.03, value: 119}
+]
+ +

Options

+

The following additional options can be set when initializing wavesurfer to control the waveform

+
    +
  • plotArray: array of objects with time and plot (required unless plotFileUrl is set)
  • +
  • plotFileUrl: url of the file that contains the plot information (required unless plotArray is set)
  • +
  • plotNormalizeTo: [whole/segment/none/values] - what value to normalize the plot to (defaults to "whole")
  • +
  • plotMin: the minimum value to normalize points to. Any value below this will be ignored (defaults to 0)
  • +
  • plotMax: the maximum value to normalize points to. Any value above this will be ignored (defaults to 1)
  • +
  • plotTimeStart: the time included in the plot file which corresponds with the start of the displayed wave (defaults to 0)
  • +
  • plotTimeEnd: the time included in the plot file which corresponds with the end of the displayed wave (defaults maximum plot time)
  • +
  • plotColor: the color of the plot (defaults to #f63)
  • +
  • plotProgressColor: the color of the progress plot (defaults to '#F00')
  • +
  • plotFileDelimiter: the delimiter which separates the time from the value in the plot file (defaults to tab characater = "\t")
  • +
  • plotPointHeight: the canvas height of each plot point (defaults to 2)
  • +
  • plotPointWidth: the canvas width of each plot point (defaults to 2)
  • +
  • plotSeparator: boolean indicating a separator should be included between the wave and point plot
  • +
  • plotRangeDisplay: boolean indicating if the min and max range should be displayed (defaults to false)
  • +
  • plotRangePrecision: integer determining the precision of the displayed plot range
  • +
  • plotRangeUnits: units appended to the range
  • +
  • plotRangeFontSize: the font for displaying the range - defaults to 20
  • +
  • plotRangeFontType: the font type for displaying range - defaults to Ariel
  • +
  • plotRangeIgnoreOutliers: boolean indicating if values outside of range should be ignored or plotted at min/max
  • +
+
+ + + +
+ + + + + + diff --git a/example/timeline/index.html b/example/timeline/index.html index 3fd8d56cd..5804e27c1 100644 --- a/example/timeline/index.html +++ b/example/timeline/index.html @@ -108,11 +108,11 @@

Options

diff --git a/example/video-element/index.html b/example/video-element/index.html index 595c32069..57c6abaa7 100644 --- a/example/video-element/index.html +++ b/example/video-element/index.html @@ -109,11 +109,11 @@

Pre-rendered Peaks

@@ -135,7 +135,7 @@

Why use MediaElementWebAudio backend

diff --git a/example/microphone/index.html b/example/microphone/index.html index 916497974..c37907405 100644 --- a/example/microphone/index.html +++ b/example/microphone/index.html @@ -185,14 +185,14 @@

Events

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/minimap-vertical/index.html b/example/minimap-vertical/index.html index 39f8150fd..d0a09a6c2 100644 --- a/example/minimap-vertical/index.html +++ b/example/minimap-vertical/index.html @@ -115,7 +115,7 @@

How to use minimap in vertical mode

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -130,7 +130,7 @@

How to use minimap in vertical mode

diff --git a/example/minimap/index.html b/example/minimap/index.html index 6de4ad26e..fb7472825 100644 --- a/example/minimap/index.html +++ b/example/minimap/index.html @@ -86,14 +86,14 @@

Quick Start

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/mute/index.html b/example/mute/index.html index 9d21cb749..5ad6219b7 100644 --- a/example/mute/index.html +++ b/example/mute/index.html @@ -49,14 +49,14 @@

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/panner/index.html b/example/panner/index.html index b595d1ce1..eb690cdac 100644 --- a/example/panner/index.html +++ b/example/panner/index.html @@ -139,7 +139,7 @@

4. Bind the Range Slider

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -154,7 +154,7 @@

4. Bind the Range Slider

diff --git a/example/playhead/index.html b/example/playhead/index.html index fc9c6f6dc..2d7d2be5b 100644 --- a/example/playhead/index.html +++ b/example/playhead/index.html @@ -88,7 +88,7 @@

wavesurfer.js Playhead plugin

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -101,7 +101,7 @@

wavesurfer.js Playhead plugin

diff --git a/example/playlist/index.html b/example/playlist/index.html index b069e2711..9a7445c97 100644 --- a/example/playlist/index.html +++ b/example/playlist/index.html @@ -81,7 +81,7 @@

wavesurfer.js Playlist Demo

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -96,7 +96,7 @@

wavesurfer.js Playlist Demo

diff --git a/example/plugin-system/index.html b/example/plugin-system/index.html index 9e55819aa..ded6af5b0 100644 --- a/example/plugin-system/index.html +++ b/example/plugin-system/index.html @@ -205,7 +205,7 @@

Create a plugin that extends an existing plugin

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -213,7 +213,7 @@

Create a plugin that extends an existing plugin

diff --git a/example/regions/index.html b/example/regions/index.html index b0b22f216..f69dcf194 100644 --- a/example/regions/index.html +++ b/example/regions/index.html @@ -107,7 +107,7 @@

wavesurfer.js Regions

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -120,7 +120,7 @@

wavesurfer.js Regions

diff --git a/example/rounded-bars/index.html b/example/rounded-bars/index.html index 5a5036f75..e691e8ffc 100644 --- a/example/rounded-bars/index.html +++ b/example/rounded-bars/index.html @@ -82,7 +82,7 @@

Rounded bars example

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -98,7 +98,7 @@

Rounded bars example

diff --git a/example/rtl/index.html b/example/rtl/index.html index 97cfb1804..330422493 100644 --- a/example/rtl/index.html +++ b/example/rtl/index.html @@ -79,7 +79,7 @@

How to enable right-to-left

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -94,7 +94,7 @@

How to enable right-to-left

diff --git a/example/spectrogram/index.html b/example/spectrogram/index.html index 501c69bbe..8a18bbf9c 100644 --- a/example/spectrogram/index.html +++ b/example/spectrogram/index.html @@ -131,14 +131,14 @@

Generating a colorMap

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/split-channels/index.html b/example/split-channels/index.html index 9d311e5bd..0ff9a2537 100644 --- a/example/split-channels/index.html +++ b/example/split-channels/index.html @@ -145,7 +145,7 @@

splitChannelOptions

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -159,7 +159,7 @@

splitChannelOptions

diff --git a/example/split-wave-point-plot/index.html b/example/split-wave-point-plot/index.html index 402250f61..15ac76df9 100644 --- a/example/split-wave-point-plot/index.html +++ b/example/split-wave-point-plot/index.html @@ -124,7 +124,7 @@

Options

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -138,7 +138,7 @@

Options

diff --git a/example/stretcher/index.html b/example/stretcher/index.html index cb95689cb..e00a5104b 100644 --- a/example/stretcher/index.html +++ b/example/stretcher/index.html @@ -74,14 +74,14 @@

wavesurfer.js Soundtouch Example

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/timeline-notches/index.html b/example/timeline-notches/index.html index f15e6f7a2..3ee93df75 100644 --- a/example/timeline-notches/index.html +++ b/example/timeline-notches/index.html @@ -228,7 +228,7 @@

How to Override Timeline Formatting

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -243,7 +243,7 @@

How to Override Timeline Formatting

diff --git a/example/timeline/index.html b/example/timeline/index.html index 406e42788..2a8864ae2 100644 --- a/example/timeline/index.html +++ b/example/timeline/index.html @@ -118,14 +118,14 @@

Options

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
diff --git a/example/vertical/index.html b/example/vertical/index.html index ec3a8367b..8af0572fb 100644 --- a/example/vertical/index.html +++ b/example/vertical/index.html @@ -92,7 +92,7 @@

How to enable vertical rendering

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -107,7 +107,7 @@

How to enable vertical rendering

diff --git a/example/video-element/index.html b/example/video-element/index.html index c46795e6e..d69cfb891 100644 --- a/example/video-element/index.html +++ b/example/video-element/index.html @@ -117,7 +117,7 @@

Pre-rendered Peaks

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -132,7 +132,7 @@

Pre-rendered Peaks

diff --git a/example/zoom/index.html b/example/zoom/index.html index 51180cb3b..f4f18ad03 100644 --- a/example/zoom/index.html +++ b/example/zoom/index.html @@ -95,7 +95,7 @@

How to Zoom

- wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License. + wavesurfer.js by katspaugh is licensed under a BSD-3-Clause License.
@@ -110,7 +110,7 @@

How to Zoom

diff --git a/package.json b/package.json index c5341839a..006863db4 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/katspaugh/wavesurfer.js.git" + "url": "git://github.com/wavesurfer-js/wavesurfer.js.git" }, "publishConfig": { "registry": "https://registry.npmjs.org" @@ -43,7 +43,7 @@ "author": "", "license": "BSD-3-Clause", "bugs": { - "url": "https://github.com/katspaugh/wavesurfer.js/issues" + "url": "https://github.com/wavesurfer-js/wavesurfer.js/issues" }, "keywords": [ "waveform", From 4a84fc3679bae06c0302640989b25d9032f8c1e7 Mon Sep 17 00:00:00 2001 From: Anri Asaturov Date: Wed, 1 Mar 2023 06:30:20 +0200 Subject: [PATCH 544/573] Proxy HTMLMediaElement's 'waiting' event through MediaElement backend. (#2691) * Proxy HTMLMediaElement's 'waiting' event * fix --- src/mediaelement.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mediaelement.js b/src/mediaelement.js index c821e3f54..f79c6329a 100755 --- a/src/mediaelement.js +++ b/src/mediaelement.js @@ -65,6 +65,9 @@ export default class MediaElement extends WebAudio { this.mediaListeners.error = () => { this.fireEvent('error', 'Error loading media element'); }; + this.mediaListeners.waiting = () => { + this.fireEvent('waiting'); + }; this.mediaListeners.canplay = () => { this.fireEvent('canplay'); }; From 320f1140386abac3efa0b8ca5ea65a1be63765c1 Mon Sep 17 00:00:00 2001 From: Enton Biba Date: Wed, 1 Mar 2023 09:51:19 -0500 Subject: [PATCH 545/573] Fix iphone silent switch webaudio mute (#2686) fix iphone silent switch mode when using webaudio so it continues playing audio * Update CHANGES.md --- CHANGES.md | 1 + src/util/silence-mode.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 835e8ae55..7b4f587bb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ wavesurfer.js changelog ------------------ - Regions plugin: - Improved delta calculation (resize end) (#2641) +- Fix iphone silent switch webaudio mute (#2667) 6.4.0 (05.11.2022) ------------------ diff --git a/src/util/silence-mode.js b/src/util/silence-mode.js index 829974e27..94ce7e354 100644 --- a/src/util/silence-mode.js +++ b/src/util/silence-mode.js @@ -10,6 +10,13 @@ * @since 5.2.0 */ export default function ignoreSilenceMode() { + // Set webaudio context with 1 second silent audio 44100 bit rate buffer to allow playing audio even if silent switch is on the device + const silentAC = new AudioContext(); + const silentBS = silentAC.createBufferSource(); + silentBS.buffer = silentAC.createBuffer(1, 1, 44100); + silentBS.connect(silentAC.destination); + silentBS.start(); + // Set the src to a short bit of url encoded as a silent mp3 // NOTE The silence MP3 must be high quality, when web audio sounds are played // in parallel the web audio sound is mixed to match the bitrate of the html sound From 1ae22fd1c6d2fdae35e06f20f71e4f661729bfe0 Mon Sep 17 00:00:00 2001 From: Stefan de Konink Date: Wed, 1 Mar 2023 17:57:29 +0100 Subject: [PATCH 546/573] Fix typo (#2695) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5772e60eb..5a428bfed 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ wavesurfer.load('example/media/demo.wav'); See the documentation on all available [methods](https://wavesurfer-js.org/docs/methods.html), [options](https://wavesurfer-js.org/docs/options.html) and [events](https://wavesurfer-js.org/docs/events.html) on the [homepage](https://wavesurfer-js.org/docs/). -## Pojects using wavesurfer.js +## Projects using wavesurfer.js For the list of projects using wavesurfer.js, check out [the projects page](https://wavesurfer-js.org/projects/). From 1ffb823ce6eb96f4d341fa6e7143209c08c19c91 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Fri, 3 Mar 2023 13:01:05 +0100 Subject: [PATCH 547/573] Docs: add an import snippet (#2700) --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5a428bfed..69103ef18 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ See a [tutorial](https://wavesurfer-js.org/docs) and [examples](https://wavesurf Have a question about integrating wavesurfer.js on your website? Feel free to ask in our forum: https://github.com/wavesurfer-js/wavesurfer.js/discussions/categories/q-a ## Quick start +Install the package: ``` npm install wavesurfer.js --save @@ -21,10 +22,16 @@ npm install wavesurfer.js --save # or yarn add wavesurfer.js +``` -# or +And import it like so: +``` +import WaveSurfer from 'wavesurfer.js' +``` - +If you're not using a package manager, simply insert the script from a CDN: +``` + ``` Create a container in your HTML: From 957655c9b28b6f99fc1c66e9b982eed7a8be4df2 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sat, 11 Mar 2023 06:30:18 +0100 Subject: [PATCH 548/573] Update FUNDING.yml (#2704) Change the sponsorship account to wavesurfer-js --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 8ca6d7bca..1b228c556 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -github: [thijstriemstra, katspaugh] +github: [wavesurfer-js] From 9d90f1bd1859b9e6d5dbbc98138b7e75e4ad97dc Mon Sep 17 00:00:00 2001 From: Sishaar Rao Date: Sat, 11 Mar 2023 02:04:53 -0800 Subject: [PATCH 549/573] inherit font family rather than setting monospace (#2664) Co-authored-by: Sishaar Rao --- src/plugin/markers/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugin/markers/index.js b/src/plugin/markers/index.js index 5e47f46a5..281dd694a 100644 --- a/src/plugin/markers/index.js +++ b/src/plugin/markers/index.js @@ -274,7 +274,7 @@ export default class MarkersPlugin { labelEl.innerText = label; labelEl.setAttribute('title', tooltip); this.style(labelEl, { - "font-family": "monospace", + "font-family": "inherit", "font-size": "90%" }); labelDiv.appendChild(labelEl); From 3b9d58ca59603b6160ecaacc1fd9bdca2ee40b88 Mon Sep 17 00:00:00 2001 From: Rustam Apay Date: Sat, 11 Mar 2023 14:11:19 +0400 Subject: [PATCH 550/573] regions plugin: add editableContent and removeButton options (#2521) * regions new features: editableContent, removeButton with example how it works * fix #2521 request changes * add removeEventListener to each addEventListener --------- Co-authored-by: Thijs Triemstra --- CHANGES.md | 7 +- .../index.html | 152 ++++++++++++++++ .../main.js | 172 ++++++++++++++++++ src/plugin/regions/index.js | 4 + src/plugin/regions/region.js | 69 +++++++ 5 files changed, 403 insertions(+), 1 deletion(-) create mode 100755 example/video-annotation-contentEditable-regions/index.html create mode 100755 example/video-annotation-contentEditable-regions/main.js diff --git a/CHANGES.md b/CHANGES.md index 7b4f587bb..68092f0a8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,7 +18,12 @@ wavesurfer.js changelog 6.3.0 (03.10.2022) ------------------ - Fix `barMinHeight` option not setting the minimum bar height properly (#2522) -- Regions plugin: restore support for one drag selection for all channels (#2529) +- Regions plugin: + - Restore support for one drag selection for all channels (#2529) + - 2 new params (#2521): + - `{contentEditable: true}` allows to display/add/edit text in regions upon the waveform + - `{removeButton: true}` displays remove button in regions + - New example -- video annotation using `{contentEditable: true}` and `{removeButton: true}` - Markers plugin: - Add support for a context menu event on a marker (#2546) - Spectrogram plugin: Make labels have position: absolute instead of fixed (#2542) diff --git a/example/video-annotation-contentEditable-regions/index.html b/example/video-annotation-contentEditable-regions/index.html new file mode 100755 index 000000000..e01223c98 --- /dev/null +++ b/example/video-annotation-contentEditable-regions/index.html @@ -0,0 +1,152 @@ + + + + + Video Annotation System + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Editable and removable regions

+
+

+ This example is based on Video Annotation System. + Instead of additional forms and buttons we do everything right in the wavefor + by using region plugin params: {contentEditable: true} and {removeButton: true}. +

+

+ Region plugin param {contentEditable: true} adds an editable div on top of each region. +

+

+ When editing is finished (onBlur) it fires event: +

{action: 'contentEdited', oldText, text}
+

+

You can handle it with: +

wavesurfer.on('region-updated', (region, event) => callback)

+

+ New text will be saved in region.data.text. +

+

+ To fill regions with text on initialization, provide them with a property data.text. +

+

+ The whole region will be looking like: +

{
+    start: 1, 
+    end: 2, 
+    data: {
+        text: 'some text'
+        }
+}
+

+

+ Region plugin param removeButton adds a little x to right bottom corner of each region. +

+

Demo

+
+ + + + + +
+ +
+ +
+ +
+
+ +
+ +
+
+

Output: text representation of regions

+
+ +
+
// Init
+var wavesurfer = WaveSurfer.create({
+    container: document.querySelector('#waveform'),
+    height: 100,
+    pixelRatio: 1,
+    minPxPerSec: 100,
+    scrollParent: true,
+    normalize: true,
+    splitChannels: false,
+    backend: 'MediaElement',
+    plugins: [
+        WaveSurfer.regions.create({
+            contentEditable: true,
+            dragSelection: true,
+            regions: [
+                {
+                    "start": 2.51,
+                    "end": 3.62,
+                    "data": {
+                        "text": "Hello down there " }
+                },
+                {
+                    "start": 3.67,
+                    "end": 4.72,
+                    "data": {
+                        "text": "on the good Earth"
+                    }
+                }
+            ]
+        }),
+        WaveSurfer.minimap.create({
+            height: 30,
+            waveColor: '#ddd',
+            progressColor: '#999'
+        }),
+        WaveSurfer.timeline.create({
+            container: '#wave-timeline'
+        }),
+        WaveSurfer.cursor.create()
+    ]
+});
+                    
+
+
+ + + + diff --git a/example/video-annotation-contentEditable-regions/main.js b/example/video-annotation-contentEditable-regions/main.js new file mode 100755 index 000000000..61a6cd187 --- /dev/null +++ b/example/video-annotation-contentEditable-regions/main.js @@ -0,0 +1,172 @@ +// Create an instance +var wavesurfer; + +const regionsInit = [ + { + "start": 2.509953716438861, + "end": 4.689913517967433, + "data": { + "text": "Hello down there on the good Earth" + } + }, + { + "start": 4.979908170464354, + "end": 7.339864652853083, + "data": { + "text": "and all the best from the International space station. " + } + }, + { + "start": 7.499907432877723, + "end": 10.659999631206684, + "data": { + "text": "I am expedition 57th commander Alexander Guest, " + } + }, + { + "start": 10.94, + "end": 12.250061772880404, + "data": { + "text": "and next to me we have " + } + }, + { + "start": 12.28977337650741, + "end": 13.67974774537196, + "data": { + "text": "Serena Auñón-Chancellor " + } + }, + { + "start": 13.709747192181986, + "end": 14.539731887259379, + "data": { + "text": "flight engineer" + } + }, + { + "start": 14.77972746173959, + "end": 15.69971049724706, + "data": { + "text": "from NASA" + } + } +]; + +async function getRegions(){ + const regionsSavedString = await localStorage.getItem('regions'); + const regionsSaved = JSON.parse(regionsSavedString); + const regions = regionsSaved || regionsInit; + return regions; +} + +async function initWavesurfer() { + const regions = await getRegions(); + + // Init + wavesurfer = WaveSurfer.create({ + container: document.querySelector('#waveform'), + height: 100, + pixelRatio: 1, + minPxPerSec: 100, + scrollParent: true, + normalize: true, + splitChannels: false, + backend: 'MediaElement', + plugins: [ + WaveSurfer.regions.create({ + contentEditable: true, + dragSelection: true, + removeButton: true, + regions + }), + WaveSurfer.minimap.create({ + height: 30, + waveColor: '#ddd', + progressColor: '#999' + }), + WaveSurfer.timeline.create({ + container: '#wave-timeline' + }), + WaveSurfer.cursor.create() + ] + }); + + // Load audio from existing media element + let mediaElt = document.querySelector('video'); + + wavesurfer.on('error', function(e) { + console.warn(e); + }); + + wavesurfer.load(mediaElt); + + wavesurfer.on('region-click', function(region, e) { + e.stopPropagation(); + // Play on click, loop on shift click + e.shiftKey ? region.playLoop() : region.play(); + }); + wavesurfer.on('region-update-end', saveRegions); + wavesurfer.on('region-updated', saveRegions); + wavesurfer.on('region-removed', saveRegions); + + /* Toggle play/pause buttons. */ + let playButton = document.querySelector('#play'); + let pauseButton = document.querySelector('#pause'); + + wavesurfer.on('play', function() { + playButton.style.display = 'none'; + pauseButton.style.display = 'block'; + }); + wavesurfer.on('pause', function() { + playButton.style.display = 'block'; + pauseButton.style.display = 'none'; + }); + + return {regions, wavesurfer}; +} + +// Init & load audio file +document.addEventListener('DOMContentLoaded', async function() { + const {regions} = await initWavesurfer(); + updateOutput(JSON.stringify(regions, null, 2)); +}); + +/** + * Save annotations to localStorage. + */ +function saveRegions() { + const regionsArray = Object.keys(wavesurfer.regions.list).map(id => { + const region = wavesurfer.regions.list[id]; + const {start, end, data} = region; + return {start, end, data}; + }).sort((a, b)=> (a.start - b.start)); + + localStorage.regions = JSON.stringify(regionsArray); + updateOutput(JSON.stringify(regionsArray, null, 2)); +} + +const outputEl = document.querySelector('#output'); + +/** + * Visible text representation of regions + */ +function updateOutput(text){ + outputEl.innerText = text; +} + +/** + * Random RGBA color. + */ +function randomColor(alpha) { + return ( + 'rgba(' + + [ + ~~(Math.random() * 255), + ~~(Math.random() * 255), + ~~(Math.random() * 255), + alpha || 1 + ] + + ')' + ); +} diff --git a/src/plugin/regions/index.js b/src/plugin/regions/index.js index 368cd5e76..b7331b323 100644 --- a/src/plugin/regions/index.js +++ b/src/plugin/regions/index.js @@ -4,6 +4,8 @@ * @typedef {Object} RegionsPluginParams * @property {?boolean} dragSelection Enable creating regions by dragging with * the mouse + * @property {?boolean} contentEditable=false Allow/disallow editing content of the region + * @property {?boolean} removeButton=false adds remove region button * @property {?RegionParams[]} regions Regions that should be added upon * initialisation * @property {number} slop=2 The sensitivity of the mouse dragging @@ -203,6 +205,8 @@ export default class RegionsPlugin { params = { edgeScrollWidth: this.params.edgeScrollWidth || this.defaultEdgeScrollWidth, + contentEditable: this.params.contentEditable, + removeButton: this.params.removeButton, ...params }; diff --git a/src/plugin/regions/region.js b/src/plugin/regions/region.js index 30a7ab2ac..b41bf3ee3 100644 --- a/src/plugin/regions/region.js +++ b/src/plugin/regions/region.js @@ -28,6 +28,8 @@ export class Region { this.resize = params.resize === undefined ? true : Boolean(params.resize); this.drag = params.drag === undefined ? true : Boolean(params.drag); + this.contentEditable = Boolean(params.contentEditable); + this.removeButton = Boolean(params.removeButton); // reflect resize and drag state of region for region-updated listener this.isResizing = false; this.isDragging = false; @@ -196,6 +198,40 @@ export class Region { top: this.marginTop }); + /* Button Remove Region */ + if (this.removeButton){ + const removeButtonEl = document.createElement('div'); + removeButtonEl.className = 'remove-region-button'; + removeButtonEl.innerText = 'x'; + this.removeButtonEl = this.element.appendChild(removeButtonEl); + const css = { + zIndex: 4, + position: 'absolute', + bottom: 0, + right: 0, + cursor:'pointer', + marginRight: '3px', + fontSize: '80%', + color: 'grey', + height: '14px' + }; + this.style(this.removeButtonEl, css); + } + + /* Edit content */ + if (this.contentEditable){ + const contentEl = document.createElement('div'); + contentEl.className = 'region-content'; + contentEl.contentEditable = true; + contentEl.innerText = this.data.text || ''; + this.contentEl = this.element.appendChild(contentEl); + const css = { + zIndex: 4, + padding: '2px 5px', + cursor:'text'}; + this.style(this.contentEl, css); + } + /* Resize handles */ if (this.resize) { this.handleLeftEl = this.util.withOrientation( @@ -404,6 +440,22 @@ export class Region { if (this.drag || this.resize) { this.bindDragEvents(); } + + /* Edit content */ + if (this.contentEditable){ + this.contentEl.addEventListener('blur', this.onContentBlur.bind(this)); + this.contentEl.addEventListener('click', this.onContentClick.bind(this)); + } + /* Remove button */ + if (this.removeButton){ + this.removeButtonEl.addEventListener('click', this.onRemove.bind(this)); + } + + this.on('remove', () => { + this.contentEl.removeEventListener('blur', this.onContentBlur.bind(this)); + this.contentEl.removeEventListener('click', this.onContentClick.bind(this)); + this.removeButtonEl.removeEventListener('click', this.onRemove.bind(this)); + }); } bindDragEvents() { @@ -800,6 +852,23 @@ export class Region { } } + onContentBlur(event){ + const {text: oldText} = this.data || {}; + const text = event.target.innerText; + const data = {...this.data, text }; + const eventParams = {action: 'contentEdited', oldText, text}; + this.update({data}, eventParams); + } + + onContentClick(event){ + event.stopPropagation(); + } + + onRemove(event){ + event.stopPropagation(); + this.remove(); + } + updateHandlesResize(resize) { let cursorStyle; if (resize) { From 9c61fc4471b2118d7a1f08000e5b1ec3f37ed315 Mon Sep 17 00:00:00 2001 From: othmar52 Date: Sat, 11 Mar 2023 11:22:30 +0100 Subject: [PATCH 551/573] [FIX] respect mute state when changing volume during mute (#2503) * [FIX] respect mute state when changing volume during mute @see https://github.com/katspaugh/wavesurfer.js/issues/2502 * change unreleased version from to 6.2.0 --------- Co-authored-by: Thijs Triemstra Co-authored-by: katspaugh <381895+katspaugh@users.noreply.github.com> --- CHANGES.md | 1 + src/wavesurfer.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 68092f0a8..87336026c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ wavesurfer.js changelog - Regions plugin: - Improved delta calculation (resize end) (#2641) - Fix iphone silent switch webaudio mute (#2667) +- Respect mute state when changing volume during mute (#2502) 6.4.0 (05.11.2022) ------------------ diff --git a/src/wavesurfer.js b/src/wavesurfer.js index d2bbf69e5..94c69e932 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -1004,6 +1004,10 @@ export default class WaveSurfer extends util.Observer { * @emits WaveSurfer#volume */ setVolume(newVolume) { + if (this.isMuted === true) { + this.savedVolume = newVolume; + return; + } this.backend.setVolume(newVolume); this.fireEvent('volume', newVolume); } From c9bb3866b407a85f821771a42449576583c48469 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sat, 11 Mar 2023 14:07:26 +0100 Subject: [PATCH 552/573] release: 6.5.0 (#2705) * release: 6.5.0 * Rm duplicates in the changelog * Add a better description for funding.yml * Spelling --- CHANGES.md | 11 ++++++++--- bower.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 87336026c..16a11cb1e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,17 @@ wavesurfer.js changelog ======================= -6.5.0 (unreleased) +6.5.0 (11.03.2023) ------------------ - Regions plugin: - Improved delta calculation (resize end) (#2641) - Fix iphone silent switch webaudio mute (#2667) - Respect mute state when changing volume during mute (#2502) +- Proxy HTMLMediaElement's 'waiting' event through MediaElement backend. (#2691) +- Chores: + - Docs: update the issue template and wavesurfer links (#2671) + - Add FUNDING.yml to enable GitHub Sponsors (#2668) + - Update development dependencies 6.4.0 (05.11.2022) ------------------ @@ -25,7 +30,7 @@ wavesurfer.js changelog - `{contentEditable: true}` allows to display/add/edit text in regions upon the waveform - `{removeButton: true}` displays remove button in regions - New example -- video annotation using `{contentEditable: true}` and `{removeButton: true}` -- Markers plugin: +- Markers plugin: - Add support for a context menu event on a marker (#2546) - Spectrogram plugin: Make labels have position: absolute instead of fixed (#2542) @@ -52,7 +57,7 @@ wavesurfer.js changelog 6.0.4 (09.03.2022) ------------------ - Spectrogram plugin: - - Add `frequencyMin`, `frequencyMax` option to scale frequency axis. + - Add `frequencyMin`, `frequencyMax` option to scale frequency axis. And set default 12kHz range to draw spectrogram like 5.x (#2455) - Timeline plugin: - Fix rendering issue for negative `offset` values (#2463) diff --git a/bower.json b/bower.json index 7e4306ae7..a35c9ebf1 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.4.0", + "version": "6.5.0", "homepage": "https://wavesurfer-js.org", "authors": [ "katspaugh " diff --git a/package.json b/package.json index 006863db4..76c3d648c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.4.0", + "version": "6.5.0", "description": "Interactive navigable audio visualization using Web Audio and Canvas", "main": "dist/wavesurfer.js", "directories": { From c2cd745a56d15a4f3039e27a659a540f4caabdbe Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sat, 11 Mar 2023 16:35:08 +0100 Subject: [PATCH 553/573] Fix: release workflow permissions (#2709) * Fix: github repo URL * Restore branch name --- .github/workflows/publish.yml | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c81c22b45..f030fa759 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,6 +4,9 @@ on: push: branches: [ master ] +permissions: + contents: write + jobs: publish-npm: runs-on: ubuntu-latest diff --git a/package.json b/package.json index 76c3d648c..2940a8f1d 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/wavesurfer-js/wavesurfer.js.git" + "url": "git@github.com:wavesurfer-js/wavesurfer.js.git" }, "publishConfig": { "registry": "https://registry.npmjs.org" From 7c1458a5b92821965a5d7e2f7ab8643ab8d3043b Mon Sep 17 00:00:00 2001 From: luke-harrison-personal <84890777+luke-harrison-personal@users.noreply.github.com> Date: Sun, 12 Mar 2023 05:38:38 +1000 Subject: [PATCH 554/573] Zoom optimisation for Waves and matching implementation for Spectrograms (#2646) * Used setTimeout() method to require a minimum time period passes before redrawing/recalculating to reduce CPU requirements while zooming in on waveforms. Currently displaying a waveform image in example/zoom which will be used to hide the lack of wave drawing while zooming. * Implemented a backimage mimicking the wave to display zoom level faster TO DO: Hide the real wave while zooming Hide the backimage after zooming Zoom in on current timestamp while zooming on backimage FUTURE: Split or crop backimage for longer waves Re-render backimage to match the colour style of the wave with selected timestamp * Added hiding/showing of elements while zooming Since the coloured section of the wave is also handled by canvas objects within a wave I am going to move the backimage functionality into the canvasentry.js file so that each canvas handles it's own image, which should resolve the issue as well as segment the image into sections. * backimages are stored and drawn for each canvas entry. Current issue is the left offsets of each backimage are not being calculated correctly and images are overlapping. * Zooming now correctly handles progress positions. Creates backimages for progress wave Left offset of canvas elements are handled correctly. * Zooming out now works without any issues Zooming in needs a viewable region boundary implemented so that canvases don't become too large. Progress tracking and regions plugin work without any issues now. * Zoom optimisations have been made Canvases not in frame are cleared and not rendered Canvases that become too large are clipped Progress location is maintained * Added priority drawing for canvases in view Currently, changing zoom level before all canvases have been loaded causes issues, my next goal is to fix this by either improving the handling of missing canvases or preventing zoom change until all canvases have loaded. * Zoom slider locks up if rendering isn't finished I'll use and hopefully instead of locking up I can return to a backup render of the wave. * Allows zooming immediately after release This is done by cancelling loading and showing only loaded sections * Improved backup image that can handle large waves Zooming out on partially loaded waves loads a backup image, this features works regardless of wave size. * Optimisation checks if there is a wrapper With this change the branch now passes the included tests * Fixed issues with back image generation Low zoom level previously caused issue with back image generation, the issue has been resolved. * Added zooming to spectrogram example This will allow testing of the intended multicanvas implementation * Spectrogram successfully split into two canvases Canvases are equally sized Calculation is on the whole spectrogram and then converted to seperate canvases This is a starting point for scaling up to an adaptive number of canvases, similar to the multicanvas drawer used for the main wave. Ideally calculation can be moved such that it is done for each canvas, this would mean speed could be improved by calcuating visible spectrogram canvases. Right now this offers no noticeable speed improvement, but could improve the ability to display zoomable spectrograms without creating images too large for browsers. * Working for arbitrary number of canvases Image still generated first then split, limiting max size Committing a working version before attempting fix * spectrogram sections are generated per-canvas Currently trying to draw all canvases at once causes failure Next I'm going to implement staggering of the canvases to hopefully allowing further zooming even without performance improvements * Spectrogram can now display at unlimited width Fixed an issue where resample() was creating full-size arrays instead of limiting to the canvas size Fixed an issue where render() was being called twice as a result of an incorrect event fire in wavesurfer.js Removed placeholder text in zoom example * Spectrogram only draws viewable canvases After this I will implement delays rendering of low-priority canvases * Rearranged variables to allow for setting delays * Canvases stretch to zoom * Zoom now scales correctly against waveform Fixed issue where progress wasn't accurate during zoom * Improved zooming functionality for wavesurfer Removed functions that were no longer necessary backimages are no longer required, existing canvases are stretched during zoom. backup image is no longer required, canvases can continue rendering during the zooming process. * Implemented priority rendering for spectrogram Removed/changed comments referring to the removed backimage/backupimage * Added timeout clearing to prevent drawing old canvases after zoom level changes * Removed unecessary class variables * Patched in a fix so that original zooming behaviour is preserved Upon first call of the stretchCanvases() function the drawer will switch over to the optimised zoom functionality * Removed unecessary changes to formatting * Removed more unecessary changes --------- Co-authored-by: Luke Harrison --- example/spectrogram/app.js | 32 +++++-- example/spectrogram/index.html | 18 ++-- example/zoom/index.html | 10 ++- example/zoom/main.js | 3 + src/drawer.canvasentry.js | 43 +++++++++ src/drawer.js | 4 - src/drawer.multicanvas.js | 72 ++++++++++++++- src/plugin/spectrogram/index.js | 151 +++++++++++++++++++++++++------- src/wavesurfer.js | 33 +++++++ 9 files changed, 312 insertions(+), 54 deletions(-) diff --git a/example/spectrogram/app.js b/example/spectrogram/app.js index 0b6a58ed0..68037e8bc 100644 --- a/example/spectrogram/app.js +++ b/example/spectrogram/app.js @@ -22,15 +22,6 @@ function initAndLoadSpectrogram(colorMap) { ] }; - if (location.search.match('scroll')) { - options.minPxPerSec = 100; - options.scrollParent = true; - } - - if (location.search.match('normalize')) { - options.normalize = true; - } - wavesurfer = WaveSurfer.create(options); /* Progress bar */ @@ -54,6 +45,29 @@ function initAndLoadSpectrogram(colorMap) { })(); wavesurfer.load('../media/demo.wav'); + + // Zoom slider + let slider = document.querySelector('[data-action="zoom"]'); + + slider.value = wavesurfer.params.minPxPerSec; + slider.min = wavesurfer.params.minPxPerSec; + slider.max = 250; + + + slider.addEventListener('input', function() { + wavesurfer.zooming(slider.value); + }); + slider.addEventListener('mouseup', function() { + wavesurfer.zoom(slider.value); + + let desiredWidth = Math.max(parseInt(wavesurfer.container.offsetWidth * window.devicePixelRatio), + parseInt(wavesurfer.getDuration() * slider.value * window.devicePixelRatio)); + wavesurfer.spectrogram.width = desiredWidth; + wavesurfer.spectrogram.render(); + }); + + // set initial zoom to match slider value + wavesurfer.zoom(slider.value); } document.addEventListener('DOMContentLoaded', function() { diff --git a/example/spectrogram/index.html b/example/spectrogram/index.html index 8a18bbf9c..ec99b89c9 100644 --- a/example/spectrogram/index.html +++ b/example/spectrogram/index.html @@ -31,13 +31,6 @@
- - - -

wavesurfer.js + Spectrogram

@@ -59,6 +52,17 @@

wavesurfer.js Pause +
+ +
+ +
+ +
+ +
+ +

diff --git a/example/zoom/index.html b/example/zoom/index.html index f4f18ad03..f4ab9fc38 100644 --- a/example/zoom/index.html +++ b/example/zoom/index.html @@ -82,9 +82,13 @@

How to Zoom

backend: 'MediaElement' }); -document.querySelector('#slider').oninput = function () { - wavesurfer.zoom(Number(this.value)); -}; +let slider = document.querySelector('[data-action="zoom"]'); +slider.addEventListener('input', function() { + wavesurfer.zooming(slider.value); +}); +slider.addEventListener('mouseup', function() { + wavesurfer.zoom(slider.value); +});

diff --git a/example/zoom/main.js b/example/zoom/main.js index c3163beed..f63a8681c 100644 --- a/example/zoom/main.js +++ b/example/zoom/main.js @@ -49,6 +49,9 @@ document.addEventListener('DOMContentLoaded', function() { slider.max = 1000; slider.addEventListener('input', function() { + wavesurfer.zooming(Number(this.value)); + }); + slider.addEventListener('mouseup', function() { wavesurfer.zoom(Number(this.value)); }); diff --git a/src/drawer.canvasentry.js b/src/drawer.canvasentry.js index 7f1da3884..3866345b2 100644 --- a/src/drawer.canvasentry.js +++ b/src/drawer.canvasentry.js @@ -66,6 +66,11 @@ export default class CanvasEntry { * @type {object} */ this.canvasContextAttributes = {}; + /** + * The Timeout id used to track this canvas entry. + */ + this.drawTimeout = null; + } /** @@ -125,21 +130,27 @@ export default class CanvasEntry { */ clearWave() { // wave + this.waveCtx.save(); + this.waveCtx.setTransform(1, 0, 0, 1, 0, 0); this.waveCtx.clearRect( 0, 0, this.waveCtx.canvas.width, this.waveCtx.canvas.height ); + this.waveCtx.restore(); // progress if (this.hasProgressCanvas) { + this.progressCtx.save(); + this.progressCtx.setTransform(1, 0, 0, 1, 0, 0); this.progressCtx.clearRect( 0, 0, this.progressCtx.canvas.width, this.progressCtx.canvas.height ); + this.progressCtx.restore(); } } @@ -424,4 +435,36 @@ export default class CanvasEntry { return this.wave.toDataURL(format, quality); } } + + /** + * Stretches existing canvas + * @param {Number} newTotalWidth total width of wave in pixels + */ + stretchCanvas(newTotalWidth) { + //Calculate the start and width of this canvas + let start = Math.round(this.start * newTotalWidth); + let width = Math.round(this.end * newTotalWidth - start); + + //Stretch canvas + let elementSize = { width: width + 'px' }; + let elementStart = {left: start + 'px'}; + style(this.wave, elementSize); + style(this.wave, elementStart); + if (this.hasProgressCanvas) { + style(this.progress, elementSize); + style(this.progress, elementStart); + } + } + + /** + * Set the left offset of the canvas + * @param {Number} position in px for the canvas to start + */ + setLeft(position) { + let elementStart = {left: position + 'px'}; + style(this.wave, elementStart); + if (this.hasProgressCanvas) { + style(this.progress, elementStart); + } + } } diff --git a/src/drawer.js b/src/drawer.js index 8e3962b11..491c976d5 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -272,10 +272,6 @@ export default class Drawer extends util.Observer { * @return {boolean} Whether the width of the container was updated or not */ setWidth(width) { - if (this.width == width) { - return false; - } - this.width = width; if (this.params.fillParent || this.params.scrollParent) { diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js index 74899338a..ef4cbd014 100644 --- a/src/drawer.multicanvas.js +++ b/src/drawer.multicanvas.js @@ -89,6 +89,14 @@ export default class MultiCanvas extends Drawer { * @type {boolean} */ this.vertical = params.vertical; + + /** + * Whether to use the optimsized zoom rendering + * Automatically toggles to true if stretchCanvases() function is called + * + * @type {boolean} + */ + this.optimiseZoom = false; } /** @@ -157,10 +165,16 @@ export default class MultiCanvas extends Drawer { let canvasWidth = this.maxCanvasWidth + this.overlap; const lastCanvas = this.canvases.length - 1; + let leftOffset = 0; this.canvases.forEach((entry, i) => { if (i == lastCanvas) { canvasWidth = this.width - this.maxCanvasWidth * lastCanvas; } + + //Set left offset and add to next entry + entry.setLeft(leftOffset); + leftOffset += canvasWidth / this.params.pixelRatio; + this.updateDimensions(entry, canvasWidth, this.height); entry.clearWave(); @@ -410,7 +424,39 @@ export default class MultiCanvas extends Drawer { this.canvases.forEach((entry, i) => { this.setFillStyles(entry, waveColor, progressColor); this.applyCanvasTransforms(entry, this.params.vertical); - entry.drawLines(peaks, absmax, halfH, offsetY, start, end); + + if (this.optimiseZoom) { + //Optimising zoom functionality + //If there's a wrapper, optimise for the view + let priority = 0; + if (this.wrapper) { + let canvasRect = entry.wave.getBoundingClientRect(); + let wrapperRect = this.wrapper.getBoundingClientRect(); + + //Determine whether canvas is in viewframe or not and assign priority + if (Math.floor(canvasRect['left']) > Math.ceil(wrapperRect['right'])) { + //Canvas is to the right of view window + let distance = canvasRect['left'] - wrapperRect['right']; + priority = Math.ceil(distance / wrapperRect['width']); + } else if (Math.ceil(canvasRect['right']) < Math.floor(wrapperRect['left'])) { + //Canvas is to the left of the view window + let distance = wrapperRect['left'] - canvasRect['right']; + priority = Math.ceil(distance / wrapperRect['width']); + } + } else { + //Everything is equal priority + } + + //This staggers the drawing of canvases so they don't all draw at once + entry.clearWave(); + clearTimeout(entry.drawTimeout); + entry.drawTimeout = setTimeout(function(){ + entry.drawLines(peaks, absmax, halfH, offsetY, start, end); + entry.drawTimeout = null; + }, 25 * priority); + } else { + entry.drawLines(peaks, absmax, halfH, offsetY, start, end); + } }); } @@ -606,6 +652,30 @@ export default class MultiCanvas extends Drawer { } } + /** + * Stretches the canvases to mimic zoom without recalculation + * + * @param {Number} desiredWidth new width of the wave display + * @param {Number} progress Value between 0 and 1 for wave progress + */ + stretchCanvases(desiredWidth, progress) { + if (!this.optimiseZoom) { + //Enable optimsed zooming + this.optimiseZoom = true; + } + let totalCanvasWidth = Math.round(desiredWidth / this.params.pixelRatio); + this.width = desiredWidth; + + for (let i = 0; i < this.canvases.length; i++) { + this.canvases[i].stretchCanvas(totalCanvasWidth); + } + + //Update progress + let progressPos = progress * totalCanvasWidth; + this.updateProgress(progressPos); + this.recenterOnPosition(progressPos, true); + } + /** * Render the new progress * diff --git a/src/plugin/spectrogram/index.js b/src/plugin/spectrogram/index.js index 75f8bfb1c..686735d93 100644 --- a/src/plugin/spectrogram/index.js +++ b/src/plugin/spectrogram/index.js @@ -92,6 +92,9 @@ export default class SpectrogramPlugin { this._onRender = () => { this.render(); }; + this._onZoom = () => { + this.stretchCanvases(); + }; this._onWrapperClick = e => { this._wrapperClickHandler(e); }; @@ -136,6 +139,9 @@ export default class SpectrogramPlugin { this.alpha = params.alpha; this.splitChannels = params.splitChannels; this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1; + this.canvases = []; + this.canvasesTimeouts = []; + this.scrollLeftTracker = 0; //Tracks the desired scrollLeft value // Getting file's original samplerate is difficult(#1248). // So set 12kHz default to render like wavesurfer.js 5.x. @@ -143,10 +149,11 @@ export default class SpectrogramPlugin { this.frequencyMax = params.frequencyMax || 12000; this.createWrapper(); - this.createCanvas(); + this.addCanvas(); this.render(); drawer.wrapper.addEventListener('scroll', this._onScroll); + ws.on('zoom', this._onZoom); ws.on('redraw', this._onRender); }; } @@ -231,17 +238,49 @@ export default class SpectrogramPlugin { this.fireEvent('click', relX / this.width || 0); } - createCanvas() { - const canvas = (this.canvas = this.wrapper.appendChild( + /** + * Add a canvas to this.canvases + */ + addCanvas() { + const canvas = (this.wrapper.appendChild( document.createElement('canvas') )); - this.spectrCc = canvas.getContext('2d'); - this.util.style(canvas, { position: 'absolute', zIndex: 4 }); + + this.canvases.push(canvas); + this.canvasesTimeouts.push(null); + } + + /** + * Remove a canvas from this.canvases + */ + removeCanvas() { + //Stop drawing (if drawing) + clearTimeout(this.canvasesTimeouts[this.canvasesTimeouts.length - 1]); + + let lastEntry = this.canvases[this.canvases.length - 1]; + lastEntry.parentElement.removeChild(lastEntry); + + this.canvases.pop(); + this.canvasesTimeouts.pop(); + } + + /** + * Ensure the correct number of canvases for the size of the spectrogram + */ + updateCanvases() { + let canvasesRequired = Math.ceil(this.width / 4000); + + while (this.canvases.length < canvasesRequired) { + this.addCanvas(); + } + while (this.canvases.length > canvasesRequired) { + this.removeCanvas(); + } } render() { @@ -255,11 +294,14 @@ export default class SpectrogramPlugin { } updateCanvasStyle() { - const width = Math.round(this.width / this.pixelRatio) + 'px'; - this.canvas.width = this.width; - this.canvas.height = this.fftSamples / 2 * this.channels; - this.canvas.style.width = width; - this.canvas.style.height = this.height + 'px'; + this.updateCanvases(); + //width per canvas + for (let i = 0; i < this.canvases.length; i++) { + this.canvases[i].width = Math.round(this.width / this.canvases.length); + this.canvases[i].height = this.fftSamples / 2 * this.channels; + this.canvases[i].style.width = Math.round(this.canvases[i].width / this.pixelRatio) + 'px'; + this.canvases[i].style.height = this.height + 'px'; + } } drawSpectrogram(frequenciesData, my) { @@ -268,25 +310,61 @@ export default class SpectrogramPlugin { frequenciesData = [frequenciesData]; } - const spectrCc = my.spectrCc; + my.updateCanvasStyle(); + + //Stop canvases still being drawn + for (let i = 0; i < my.canvasesTimeouts.length; i++) { + clearTimeout(my.canvasesTimeouts[i]); + } + + const view = [my.scrollLeftTracker, my.scrollLeftTracker + my.wrapper.clientWidth]; + + for (let canvasNum = 0; canvasNum < my.canvases.length; canvasNum++) { + const canvasLeft = canvasNum * Math.floor(my.width / my.canvases.length / my.pixelRatio); + const canvasRight = (canvasNum + 1) * Math.floor(my.width / my.canvases.length / my.pixelRatio); + const canvasBound = [canvasLeft, canvasRight]; + my.canvases[canvasNum].style['left'] = canvasLeft + 'px'; + + //Optimise drawing for the view + let priority = 0; + if (canvasBound[0] > view[1]) { + //Canvas is to the right of view window + let distance = canvasBound[0] - view[1]; + priority = Math.ceil(distance / (view[1] - view[0])); + } else if (canvasBound[1] < view[0]) { + //Canvas is to the left of the view window + let distance = view[0] - canvasBound[1]; + priority = Math.ceil(distance / (view[1] - view[0])); + } + + //delay = 25ms * number of viewport widths away the canvas is + my.canvasesTimeouts[canvasNum] = setTimeout(my.drawToCanvas, 25 * priority, frequenciesData, my, canvasNum); + } + } + + /** + * Draw spectrogram channel to a specific canvas + * @param {[Number, Number, Number]} frequenciesData spectrogram data in [channel, sample, freq] format + * @param {SpectrogramPlugin} my variable with 'this' in it + * @param {Number} canvasNum Canvas to draw to + */ + drawToCanvas(frequenciesData, my, canvasNum) { const height = my.fftSamples / 2; - const width = my.width; const freqFrom = my.buffer.sampleRate / 2; const freqMin = my.frequencyMin; const freqMax = my.frequencyMax; - if (!spectrCc) { - return; - } + for (let channel = 0; channel < frequenciesData.length; channel++) { - for (let c = 0; c < frequenciesData.length; c++) { // for each channel - const pixels = my.resample(frequenciesData[c]); - const imageData = new ImageData(width, height); + //Get pixels from frequency data and apply to image + const relevantFreqs = frequenciesData[channel].slice(canvasNum * Math.round(frequenciesData[channel].length / my.canvases.length), (canvasNum + 1) * Math.round(frequenciesData[channel].length / my.canvases.length)); + const pixels = my.resample(relevantFreqs); + const imageData = new ImageData(pixels.length, height); for (let i = 0; i < pixels.length; i++) { for (let j = 0; j < pixels[i].length; j++) { const colorMap = my.colorMap[pixels[i][j]]; - const redIndex = ((height - j) * width + i) * 4; + const redIndex = ((height - j) * imageData.width + i) * 4; imageData.data[redIndex] = colorMap[0] * 255; imageData.data[redIndex + 1] = colorMap[1] * 255; imageData.data[redIndex + 2] = colorMap[2] * 255; @@ -294,16 +372,20 @@ export default class SpectrogramPlugin { } } - // scale and stack spectrograms - createImageBitmap(imageData).then(renderer => - spectrCc.drawImage(renderer, - 0, height * (1 - freqMax / freqFrom), // source x, y - width, height * (freqMax - freqMin) / freqFrom, // source width, height - 0, height * c, // destination x, y - width, height // destination width, height - ) - ); + //Draw image to canvas + createImageBitmap(imageData).then(renderer => { + if (my.canvases[canvasNum]) { //Check canvas still exists after creating image + my.canvases[canvasNum].getContext('2d').drawImage(renderer, + 0, height * (1 - freqMax / freqFrom), // source x, y + imageData.width, height * (freqMax - freqMin) / freqFrom, // source width, height + 0, height * channel, // destination x, y + my.canvases[canvasNum].width, height // destination width, height + ); + } + }); } + //Drawing is finished + my.canvasesTimeouts[canvasNum] = null; } getFrequencies(callback) { @@ -322,7 +404,7 @@ export default class SpectrogramPlugin { let noverlap = this.noverlap; if (!noverlap) { - const uniqueSamplesPerPx = buffer.length / this.canvas.width; + const uniqueSamplesPerPx = buffer.length / this.width; noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx)); } @@ -461,12 +543,13 @@ export default class SpectrogramPlugin { updateScroll(e) { if (this.wrapper) { + this.scrollLeftTracker = e.target.scrollLeft; this.wrapper.scrollLeft = e.target.scrollLeft; } } resample(oldMatrix) { - const columnsNumber = this.width; + const columnsNumber = oldMatrix.length; const newMatrix = []; const oldPiece = 1 / oldMatrix.length; @@ -519,4 +602,12 @@ export default class SpectrogramPlugin { return newMatrix; } + + stretchCanvases() { + for (let i = 0; i < this.canvases.length; i++) { + this.canvases[i].style.width = Math.round(this.drawer.width / this.canvases.length / this.pixelRatio) + 'px'; + const canvasLeft = i * Math.floor(this.drawer.width / this.canvases.length / this.pixelRatio); + this.canvases[i].style['left'] = canvasLeft + 'px'; + } + } } diff --git a/src/wavesurfer.js b/src/wavesurfer.js index 94c69e932..a6c238ff0 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -1275,6 +1275,21 @@ export default class WaveSurfer extends util.Observer { this.drawBuffer(); } + /** + * Calls getPeaks() and drawPeaks() + * @param {WaveSurfer} wavesurfer the Wavesurfer to get/draw peaks from/to + * @param {number} width The width of the area that should be drawn + * @param {number} start The x-offset of the beginning of the area that + * should be rendered + * @param {number} end The x-offset of the end of the area that should be + * rendered + */ + getAndDrawPeaks(wavesurfer, width, start, end) { + let peaks; + peaks = wavesurfer.backend.getPeaks(width, start, end); + wavesurfer.drawer.drawPeaks(peaks, width, start, end); + } + /** * Get the correct peaks for current wave view-port and render wave * @@ -1356,6 +1371,24 @@ export default class WaveSurfer extends util.Observer { this.fireEvent('zoom', pxPerSec); } + /** + * Call this function while moving the zoom slider to stretch the canvases + * of the wave without recalculating + * + * @param {Number} pxPerSec value returned from the zoom slider + */ + zooming(pxPerSec) { + //Calculate the new width, this cannot be smaller than the parent container width + let desiredWidth = Math.round(this.getDuration() * pxPerSec * this.params.pixelRatio); + let parentWidth = this.drawer.getWidth(); + desiredWidth = Math.max(parentWidth, desiredWidth); + + //Stretch canvases + this.drawer.stretchCanvases(desiredWidth, this.backend.getPlayedPercents()); + + this.fireEvent('zoom', pxPerSec); + } + /** * Decode buffer and load * From 742860f3ea81e5ca4f211e490490e9fc06082f4c Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sun, 12 Mar 2023 09:51:05 +0100 Subject: [PATCH 555/573] [Regions] Fix undefined content element on remove (#2713) Co-authored-by: GitHub Actions --- src/plugin/regions/region.js | 22 +- yarn.lock | 5822 ++++++++++++++++++++++++++++++++++ 2 files changed, 5829 insertions(+), 15 deletions(-) create mode 100644 yarn.lock diff --git a/src/plugin/regions/region.js b/src/plugin/regions/region.js index b41bf3ee3..2867d0d3f 100644 --- a/src/plugin/regions/region.js +++ b/src/plugin/regions/region.js @@ -134,7 +134,7 @@ export class Region { /* Remove a single region. */ remove() { if (this.element) { - this.wrapper.removeChild(this.element.domElement); + this.element.remove(); this.element = null; this.fireEvent('remove'); this.wavesurfer.un('zoom', this._onRedraw); @@ -202,18 +202,17 @@ export class Region { if (this.removeButton){ const removeButtonEl = document.createElement('div'); removeButtonEl.className = 'remove-region-button'; - removeButtonEl.innerText = 'x'; + removeButtonEl.textContent = '⨯'; this.removeButtonEl = this.element.appendChild(removeButtonEl); const css = { zIndex: 4, position: 'absolute', bottom: 0, - right: 0, + right: '4px', cursor:'pointer', - marginRight: '3px', - fontSize: '80%', - color: 'grey', - height: '14px' + fontSize: '20px', + lineHeight: '21px', + color: 'grey' }; this.style(this.removeButtonEl, css); } @@ -222,7 +221,7 @@ export class Region { if (this.contentEditable){ const contentEl = document.createElement('div'); contentEl.className = 'region-content'; - contentEl.contentEditable = true; + contentEl.contentEditable = 'true'; contentEl.innerText = this.data.text || ''; this.contentEl = this.element.appendChild(contentEl); const css = { @@ -450,18 +449,11 @@ export class Region { if (this.removeButton){ this.removeButtonEl.addEventListener('click', this.onRemove.bind(this)); } - - this.on('remove', () => { - this.contentEl.removeEventListener('blur', this.onContentBlur.bind(this)); - this.contentEl.removeEventListener('click', this.onContentClick.bind(this)); - this.removeButtonEl.removeEventListener('click', this.onRemove.bind(this)); - }); } bindDragEvents() { const container = this.wavesurfer.drawer.container; const scrollSpeed = this.scrollSpeed; - const scrollThreshold = this.scrollThreshold; let startTime; let touchId; let drag; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..628649e7b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5822 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.12.3", "@babel/core@^7.20.12": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/eslint-parser@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" + integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" + integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== + dependencies: + "@babel/types" "^7.21.0" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/register@^7.18.9": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.21.0.tgz#c97bf56c2472e063774f31d344c592ebdcefa132" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.8.4": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@chiragrupani/karma-chromium-edge-launcher@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@chiragrupani/karma-chromium-edge-launcher/-/karma-chromium-edge-launcher-2.2.2.tgz#63d1e2017953d7a5717727328473e237ef94f699" + integrity sha512-qbe3skHFAANtF/cQdMGVkdq1lZlVXsVuetx7p+RXhSrNiJ6UxRoB/rY0bbvChqSXTSJrWJ2tOjy+wvym+iYHHg== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" + integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" + integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== + +"@eslint/eslintrc@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" + integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.36.0": + version "8.36.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" + integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.13" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.21.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" + integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*", "@types/node@>=10.0.0": + version "18.15.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" + integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f" + integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== + +"@webpack-cli/info@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0" + integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== + +"@webpack-cli/serve@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8" + integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + integrity sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g== + dependencies: + acorn "^2.1.0" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + integrity sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg== + +acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +add-matchers@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/add-matchers/-/add-matchers-0.6.2.tgz#faeb2fa9380228c1b0da5f21a655c69304dd2011" + integrity sha512-hVO2wodMei9RF00qe+506MoeJ/NEOdCMEkSJ12+fC3hx/5Z4zmhNiP92nJEF6XhmXokeB0hOtuQrjHCx2vmXrQ== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-generator@6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" + integrity sha512-JFBWXdE89s4V3E8kZroEEsnQF2A4/+55IzciGjnAATXj7HTMSum3SrW7QRYGSDLWTTQF+hhD3BmC2UFGgtM0Yw== + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.10.2" + detect-indent "^3.0.1" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-generator@6.26.1: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-loader@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== + dependencies: + find-cache-dir "^3.3.2" + schema-utils "^4.0.0" + +babel-messages@^6.23.0, babel-messages@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-add-module-exports@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz#6caa4ddbe1f578c6a5264d4d3e6c8a2720a7ca2b" + integrity sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg== + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-traverse@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.10.2, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@6.18.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.0.tgz#424170268d68af26ff83a5c640b95def01803a13" + integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001449: + version "1.0.30001464" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" + integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + integrity sha512-e5jCTzJc28MWkrLLjB1mu3ks7rDQJLC5y/JMdQkOAEX/dmJk62rC6Xae1yvOO4xyCxLpzcth3jIZ7nypmjQ/0w== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha512-9LDHQy1jHc/eXMzPN6/oah9Qba4CjdKECC7YYEE/2zge/tsGwt19NQp5NFdfd5Lx6TZlyC5SXNQkG41P9r6XDg== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +chokidar@^3.5.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + integrity sha512-s4oriek7VTdSmDbS5chJhNui3uUzlk/mU39V4HnOUv0KphRXpIj73lq4wY5f8l/x+WtHUhiV+FCzsrNO1w6REA== + +color-logger@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.6.tgz#e56245ef29822657110c7cb75a9cd786cb69ed1b" + integrity sha512-0iBj3eHRYnor8EJi3oQ1kixbr7B2Sbw1InxjsYZxS+q2H+Ii69m3ARYSJeYIqmf/QRtFhWnR1v97wp8N7ABubw== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^9.1.0, commander@^9.4.1: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.4.7: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-js-compat@^3.25.1: + version "3.29.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" + integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== + dependencies: + browserslist "^4.21.5" + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA== + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +"cssstyle@>= 0.2.29 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA== + dependencies: + cssom "0.3.x" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + integrity sha512-xo3WP66SNbr1Eim85s/qyH0ZL8PQUwp86HWm0S1l8WnJ/zjT6T3w1nwNA0yOZeuvOemupEYvpvF6BIdYRuERJQ== + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== + dependencies: + repeating "^2.0.0" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ== + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.328" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz#b4565ffa502542b561cea16086d6d9b916c7095a" + integrity sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.0.3: + version "5.0.6" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== + +engine.io@~6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.1.tgz#8056b4526a88e779f9c280d820422d4e3eeaaae5" + integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.11.0" + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ== + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.6.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esdoc-accessor-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" + integrity sha512-s9mNmdHGOyQOaOUXNHPz38Y8clm6dR8/fa9DPGzuRYmIN+Lv0NVnpPAcHb5XrfC23/Mz3IUwD8h798f5Ai4rbA== + +esdoc-brand-plugin@^1.0.0, esdoc-brand-plugin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esdoc-brand-plugin/-/esdoc-brand-plugin-1.0.1.tgz#7c0e1ae90e84c30b2d3369d3a6449f9dc9f8d511" + integrity sha512-Yv9j3M7qk5PSLmSeD6MbPsfIsEf8K43EdH8qZpE/GZwnJCRVmDPrZJ1cLDj/fPu6P35YqgcEaJK4E2NL/CKA7g== + dependencies: + cheerio "0.22.0" + +esdoc-coverage-plugin@^1.0.0, esdoc-coverage-plugin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc-coverage-plugin/-/esdoc-coverage-plugin-1.1.0.tgz#3869869cd7f87891f972625787695a299aece45c" + integrity sha512-M+94/Y+eoM08V3teiJIYpJ5HF13jH4cC9LQZrjmA91mlAqCHtNzelHF9ZdWofoOFYFRNpllFsXTFsJgwVa000A== + +esdoc-ecmascript-proposal-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" + integrity sha512-PuaU/O8d+Sb0J6qQdyhmy74h/2cp/2kqsvPuoCiK+50Rw54nlGqXxvWNaaNikS5qntE0FfssnwZtUPa6q4RiXg== + +esdoc-external-ecmascript-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-external-ecmascript-plugin/-/esdoc-external-ecmascript-plugin-1.0.0.tgz#78f565d4a0c5185ac63152614dce1fe1a86688db" + integrity sha512-ASj7lhfZpzI01xd4XqB4HN+zNKwnhdaN/OIp/CTnUiLIErMOeUqzV9z/dcnUUeDY3NSwPCH1pUNATVwznspmHw== + dependencies: + fs-extra "1.0.0" + +esdoc-integrate-manual-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-manual-plugin/-/esdoc-integrate-manual-plugin-1.0.0.tgz#1854a6aa1c081035d7c8c51e3bdd4fb65aa4711c" + integrity sha512-+XcW8xRtuFVFadoVLIOj6kzX4uqtAEB5UoR7AA5g46StxLghZZ6RLrRQSERUTIc3VX9v47lOMKEaQvQfanv3+A== + +esdoc-integrate-test-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-test-plugin/-/esdoc-integrate-test-plugin-1.0.0.tgz#e2d0d00090f7f0c35e5d2f2c033327a79e53e409" + integrity sha512-WRbkbnbWnzF4RdmcoJLYZvhod7jLVUYWU2ZAojYjK+GiqSgy2yjGi7PxckeGF0LtpCuqqKat3PRdUNEMo6Nf3A== + +esdoc-lint-plugin@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/esdoc-lint-plugin/-/esdoc-lint-plugin-1.0.2.tgz#4962930c6dc5b25d80cf6eff1b0f3c24609077f7" + integrity sha512-24AYqD2WbZI9We02I7/6dzAa7yUliRTFUaJCZAcYJMQicJT5gUrNFVaI8XmWEN/mhF3szIn1uZBNWeLul4CmNw== + +esdoc-publish-html-plugin@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/esdoc-publish-html-plugin/-/esdoc-publish-html-plugin-1.1.2.tgz#bdece7bc7a0a3e419933503252db7a6772879dab" + integrity sha512-hG1fZmTcEp3P/Hv/qKiMdG1qSp8MjnVZMMkxL5P5ry7I2sX0HQ4P9lt2lms+90Lt0r340HHhSuVx107UL7dphg== + dependencies: + babel-generator "6.11.4" + cheerio "0.22.0" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.19" + taffydb "2.7.2" + +esdoc-standard-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-standard-plugin/-/esdoc-standard-plugin-1.0.0.tgz#661201cac7ef868924902446fdac1527253c5d4d" + integrity sha512-IDEG9NV/MF5Bi2TdKPqQ3GHfDkgqYhk2iyvBNX+XcNKYmXm9zxtXVS459WAmiTZuYpDLtDGbulQdJ1t4ud57mw== + dependencies: + esdoc-accessor-plugin "^1.0.0" + esdoc-brand-plugin "^1.0.0" + esdoc-coverage-plugin "^1.0.0" + esdoc-external-ecmascript-plugin "^1.0.0" + esdoc-integrate-manual-plugin "^1.0.0" + esdoc-integrate-test-plugin "^1.0.0" + esdoc-lint-plugin "^1.0.0" + esdoc-publish-html-plugin "^1.0.0" + esdoc-type-inference-plugin "^1.0.0" + esdoc-undocumented-identifier-plugin "^1.0.0" + esdoc-unexported-identifier-plugin "^1.0.0" + +esdoc-type-inference-plugin@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/esdoc-type-inference-plugin/-/esdoc-type-inference-plugin-1.0.2.tgz#916e3f756de1d81d9c0dbe1c008e8dafd322cfaf" + integrity sha512-tMIcEHNe1uhUGA7lT1UTWc9hs2dzthnTgmqXpmeUhurk7fL2tinvoH+IVvG/sLROzwOGZQS9zW/F9KWnpMzLIQ== + +esdoc-undocumented-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-undocumented-identifier-plugin/-/esdoc-undocumented-identifier-plugin-1.0.0.tgz#82e05d371c32d12871140f1d5c81ec99fd9cc2c8" + integrity sha512-T0hQc0ec1+pUJPDBoJ2SxEv7uX9VD7Q9+7UAGnDZ5R2l2JYa3WY7cawyqfbMHVtLgvqH0eMBpxdfRsQvAWzj4Q== + +esdoc-unexported-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-unexported-identifier-plugin/-/esdoc-unexported-identifier-plugin-1.0.0.tgz#1f9874c6a7c2bebf9ad397c3ceb75c9c69dabab1" + integrity sha512-PRdMLWHWdy9PwxzYDG2clhta9H7yHDpGCBIHxSw9R7TFK6ZYuPK1fUbURIzIxcdQhzt1PX9Cn6Cak2824K0+Ng== + +esdoc@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.1.0.tgz#07d40ebf791764cd537929c29111e20a857624f3" + integrity sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA== + dependencies: + babel-generator "6.26.1" + babel-traverse "6.26.0" + babylon "6.18.0" + cheerio "1.0.0-rc.2" + color-logger "0.0.6" + escape-html "1.0.3" + fs-extra "5.0.0" + ice-cap "0.0.4" + marked "0.3.19" + minimist "1.2.0" + taffydb "2.7.3" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.26.0: + version "8.36.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf" + integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.1" + "@eslint/js" "8.36.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.5.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" + integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.0.tgz#50c6f39438b7ce407e8c7a6829c72b074778238d" + integrity sha512-T6nIJO3LHxUZ6ahVRaxXz9WLEruXLqdcluA+UuTptXmLM7nDAn9lx9IfkxPyzEL21583qSt4RmL44pO71EHaJQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0, flatted@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +htmlhint@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/htmlhint/-/htmlhint-1.1.4.tgz#cd1dac2d7e1c00da87a8fb24a80422d7734b866e" + integrity sha512-tSKPefhIaaWDk/vKxAOQbN+QwZmDeJCq3bZZGbJMoMQAfTjepudC+MkuT9MOBbuQI3dLLzDWbmU7fLV3JASC7Q== + dependencies: + async "3.2.3" + chalk "^4.1.2" + commander "^9.1.0" + glob "^7.2.0" + is-glob "^4.0.3" + node-fetch "^2.6.2" + strip-json-comments "3.1.0" + xml "1.0.1" + +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q== + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.0.tgz#2095c3cd5afae40049403d4b811235b03879db50" + integrity sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ== + +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + integrity sha512-39ZblYEKlqj7LHgLkUcVk7zcJp772lOVQAUhN6QyY88w8/4bn5SgDeU2020yzHosf+uKPuCFK1UQ36gyBNiraw== + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +in-publish@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@^4.1.0, jasmine-core@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.5.0.tgz#1a6bd0bde3f60996164311c88a0995d67ceda7c3" + integrity sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw== + +jasmine-expect@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/jasmine-expect/-/jasmine-expect-5.0.0.tgz#6ca173b17795f58a71a929f29712426e086a14c5" + integrity sha512-byn1zq0EQBA9UKs5A+H6gk5TRcanV+TqQMRxrjurGuqKkclaqgjw/vV6aT/jtf5tabXGonTH6VDZJ33Z1pxSxw== + dependencies: + add-matchers "0.6.2" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + integrity sha512-kYeYuos/pYp0V/V8VAoGnUc0va0UZjTjwCsldBFZNBrOi9Q5kUXrvsw6W5/lQllB7hKXBARC4HRk1Sfk4dPFtA== + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +karma-chrome-launcher@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" + integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== + dependencies: + which "^1.2.1" + +karma-coverage@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-2.2.0.tgz#64f838b66b71327802e7f6f6c39d569b7024e40c" + integrity sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA== + dependencies: + istanbul-lib-coverage "^3.2.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.1" + istanbul-reports "^3.0.5" + minimatch "^3.0.4" + +karma-firefox-launcher@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz#9a38cc783c579a50f3ed2a82b7386186385cfc2d" + integrity sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA== + dependencies: + is-wsl "^2.2.0" + which "^2.0.1" + +karma-jasmine-matchers@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-jasmine-matchers/-/karma-jasmine-matchers-5.0.0.tgz#c4dbc6c82076b7b7006634b2f31a9f686488f99b" + integrity sha512-XnwKFbeQ8vqCkL/6bLiCFsHR4+TWTIVByuUYFrPM38JBD1hb7TNLP7cPRkQs4QBNWQ1o8z/u4EOetQC2ZFMb8A== + dependencies: + jasmine-expect "5.0.0" + +karma-jasmine@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-5.1.0.tgz#3af4558a6502fa16856a0f346ec2193d4b884b2f" + integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== + dependencies: + jasmine-core "^4.1.0" + +karma-verbose-reporter@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/karma-verbose-reporter/-/karma-verbose-reporter-0.0.8.tgz#472d1062af5402d8f2d38d534a8614a5b77b84e8" + integrity sha512-wHgevIcEpfgKwR3CnWd8t1ErzWeVlctO7ZtXkKFR1inb006ogz+7ZKg95eIVOnHCYWL3Gdy1dRMOGjVP0n4MlA== + dependencies: + colors "1.4.0" + +karma-webpack@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.1.tgz#f2253716dd3a41aaa813fa9f54b6ee047e1127d9" + integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.4.1" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lint-staged@^13.1.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a" + integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== + dependencies: + chalk "5.2.0" + cli-truncate "^3.1.0" + commander "^10.0.0" + debug "^4.3.4" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.3" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.2.1" + +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-script@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-script/-/load-script-2.0.0.tgz#40821aaa59e9bbe7be2e28b6ab053e6f44330fa1" + integrity sha512-km6cyoPW4rM22JMGb+SHUKPMZVDpUaMpMAKrv8UHWllIxc/qjgMGHD91nY+5hM+/NFs310OZ2pqQeJKs7HqWPA== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg== + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ== + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +lodash.merge@^4.4.0, lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw== + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ== + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ== + +lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +log4js@^6.4.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +marked@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw== + +minimist@^1.1.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-fetch@^2.6.2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA== + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pre-commit@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" + integrity sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA== + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha512-E98tWzqShvKDGpR2MbjsDkDQWLW2TfWUC15H4tNQhIJ5Lsta84l8nUGL9/ybltGwe+wZzWPpc1Kmd2wQP4bdCA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.1, readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + integrity sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg== + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + dependencies: + is-finite "^1.0.0" + +request@^2.55.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.1.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-parser@~4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" + integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.1.tgz#62ec117e5fce0692fa50498da9347cfb52c3bc70" + integrity sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.4.1" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.1" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw== + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" + +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +taffydb@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + integrity sha512-R6es6/C/m1xXZckrSam4j07YKbd74437mRJ/R944S1hLG7mIl2/EQW7tQPI4XiX7jTduFzz31g7466a2BcsglQ== + +taffydb@2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34" + integrity sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + +terser@^5.16.5: + version "5.16.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.6.tgz#f6c7a14a378ee0630fbe3ac8d1f41b4681109533" + integrity sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^2.2.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.1, tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + +tslib@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +ua-parser-js@^0.7.30: + version "0.7.34" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" + integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + integrity sha512-OZ7I/f0sM+T28T2/OXinNGfmvjm3KKptdyQy8NPRZyLfYBn+9vt72Bfr+uQaE9OvWyxJjQ5kHFygH2wOTUb76g== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-cli@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a" + integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.0.1" + "@webpack-cli/info" "^2.0.1" + "@webpack-cli/serve" "^2.0.1" + colorette "^2.0.14" + commander "^9.4.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3, webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.75.0: + version "5.76.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" + integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + integrity sha512-vbg5+JVNwGtHRI3GheZGWrcUlxF9BXHbA80dLa+2XqJjlV/BK6upoi2j8dIRW9FGPUUyaMm7Hf1pTexHnsk85g== + dependencies: + tr46 "~0.0.1" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@1.2.x: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + integrity sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw== + dependencies: + isexe "^2.0.0" + +which@^1.2.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.4.2: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA== + +xml@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From bf0dc53bbf4c42777442ef436b9e7145855fb228 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Mon, 13 Mar 2023 14:52:00 +0100 Subject: [PATCH 556/573] Chore: improve the release and changelog automation (#2710) * Chore: automate changelog * Update the readme wrt releasing * Fix changelog * Readme * Rm production, use master * Fix commit message * Fix sed * List syntax: * -> - * Exit on error --------- Co-authored-by: GitHub Actions --- .github/workflows/main.yml | 3 +- .github/workflows/publish.yml | 73 +++++++++++++++-------------------- CHANGES.md | 9 +++-- README.md | 18 ++++++++- package.json | 3 +- scripts/release.sh | 43 +++++++++++++++++++++ 6 files changed, 98 insertions(+), 51 deletions(-) create mode 100755 scripts/release.sh diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b6e32e3da..1af02fc0e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: wavesurfer.js +name: Lint & tests on: push: @@ -8,7 +8,6 @@ on: jobs: build: - runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f030fa759..1a739a24b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,8 +1,9 @@ -name: NPM Package +name: Release on: push: - branches: [ master ] + branches: + - master permissions: contents: write @@ -11,57 +12,45 @@ jobs: publish-npm: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - name: Checkout + uses: actions/checkout@v3 with: - node-version: 16 - registry-url: https://registry.npmjs.org/ - - name: Cache Node.js modules - uses: actions/cache@v3 - with: - # npm cache files are stored in `~/.npm` on Linux/macOS - path: ~/.npm - key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.OS }}-node- - ${{ runner.OS }}- - - run: npm install + fetch-depth: 0 + - name: Extract version + id: version run: | OLD_VERSION=$(npm show wavesurfer.js version) NEW_VERSION=$(node -p 'require("./package.json").version') if [ $NEW_VERSION != $OLD_VERSION ]; then - echo $NEW_VERSION > version.txt echo "New version $NEW_VERSION detected" + echo "::set-output name=version::$NEW_VERSION" + git log "$OLD_VERSION"..HEAD --pretty=format:"* %s" > TEMP_CHANGELOG.md else echo "Version $OLD_VERSION hasn't changed, skipping the release" + exit 1 fi + - name: Create a git tag - run: | - if [ -f version.txt ]; then - echo "Creating a git tag" - git tag $(cat version.txt) - git push --tags - fi + if: success() + run: git tag $NEW_VERSION && git push --tags + env: + NEW_VERSION: ${{ steps.version.outputs.version }} + + - name: GitHub release + if: success() + uses: actions/create-release@v1 + id: create_release + with: + draft: false + prerelease: false + release_name: ${{ steps.version.outputs.version }} + tag_name: ${{ steps.version.outputs.version }} + body_path: TEMP_CHANGELOG.md + env: + GITHUB_TOKEN: ${{ github.token }} + - name: Publish to NPM env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} - run: | - if [ -f version.txt ]; then - echo "Publishing to NPM" - npm publish - fi - - name: Release on GitHub - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - if [ -f version.txt ]; then - NEW_VERSION=$(cat version.txt) - echo "Releasing $NEW_VERSION on GitHub" - curl \ - -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token $GITHUB_TOKEN" \ - 'https://api.github.com/repos/wavesurfer-js/wavesurfer.js/releases' \ - -d "{\"tag_name\":\"$NEW_VERSION\", \"name\": \"$NEW_VERSION\"}" - fi + run: npm publish diff --git a/CHANGES.md b/CHANGES.md index 16a11cb1e..2b017a772 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,11 @@ wavesurfer.js changelog ------------------ - Regions plugin: - Improved delta calculation (resize end) (#2641) + - Editable text in regions (#2521): + - 2 new params: + - `{contentEditable: true}` allows to display/add/edit text in regions upon the waveform + - `{removeButton: true}` displays remove button in regions + - New example -- video annotation using `{contentEditable: true}` and `{removeButton: true}` - Fix iphone silent switch webaudio mute (#2667) - Respect mute state when changing volume during mute (#2502) - Proxy HTMLMediaElement's 'waiting' event through MediaElement backend. (#2691) @@ -26,10 +31,6 @@ wavesurfer.js changelog - Fix `barMinHeight` option not setting the minimum bar height properly (#2522) - Regions plugin: - Restore support for one drag selection for all channels (#2529) - - 2 new params (#2521): - - `{contentEditable: true}` allows to display/add/edit text in regions upon the waveform - - `{removeButton: true}` displays remove button in regions - - New example -- video annotation using `{contentEditable: true}` and `{removeButton: true}` - Markers plugin: - Add support for a context menu event on a marker (#2546) - Spectrogram plugin: Make labels have position: absolute instead of fixed (#2542) diff --git a/README.md b/README.md index 69103ef18..e627349dd 100644 --- a/README.md +++ b/README.md @@ -124,8 +124,22 @@ If you want to use [the VS Code - Debugger for Chrome](https://github.com/Micros ## Editing documentation The homepage and documentation files are maintained in the [`gh-pages` branch](https://github.com/wavesurfer-js/wavesurfer.js/tree/gh-pages). Contributions to the documentation are especially welcome. -## Updating the NPM package -When preparing a new release, update the version in the `package.json` and have it merged to master. The new version of the package will be published to NPM automatically via GitHub Actions. +## Releasing a new version +To release a new version and publish it to NPM, follow the steps below. + + Switch to the master branch and make sure it's up-to-date + ``` + git checkout master + git fetch --all; git reset --hard origin/master +``` + +Run the release script: +``` +yarn release +``` +This will update the version, generate a changelog, and push everything to a new branch called `release/X.X.X`. + +A browser window will open to create a PR from this new branch to the master branch. Once the PR is approved and merged, an automated workflow will kick in and publish a release both on GitHub and NPM. ## Credits diff --git a/package.json b/package.json index 2940a8f1d..69f570132 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "test": "karma start karma.conf.js", "test:chrome": "karma start karma.conf.js --browsers=Chrome --single-run=false", "prepublishOnly": "not-in-install && npm run build || in-install", - "prepare": "npm run build" + "prepare": "npm run build", + "release": "./scripts/release.sh" }, "repository": { "type": "git", diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 000000000..e41bcbf65 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# exit when any command fails +set -e + +echo "Before proceeding, please make sure you're on a clean branch with the commits you want to release (typically the master branch)." +echo '' + +# Get the last released version from NPM +OLD_VERSION=$(npm show wavesurfer.js version) + +# Get the new version from the user +echo "The last version was $OLD_VERSION" +echo "Please type the new version:" +read NEW_VERSION + +# Update the CHANGES.md file +echo 'Updating CHANGES.md...' +head -n 3 CHANGES.md > tmp +echo "$NEW_VERSION ($(date '+%d.%m.%Y'))" >> tmp +echo "------------------" >> tmp +git log "$OLD_VERSION"..HEAD --pretty=format:"- %s" >> tmp +echo '' >> tmp +tail -n +3 CHANGES.md >> tmp +cat tmp > CHANGES.md +rm tmp + +# Update the version in the package.json file +echo 'Updating package.json...' +sed -i '' -e "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" package.json +sed -i '' -e "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" bower.json + +# Commit the changes +echo "Pushing the changes to release/$NEW_VERSION" +git add CHANGES.md package.json bower.json +git commit -m "Release $NEW_VERSION" +git push origin $(git branch --show-current):release/$NEW_VERSION -f + +# Open a pull request via the browser +echo "Opening a pull request for release/$NEW_VERSION" +open "https://github.com/wavesurfer-js/wavesurfer.js/compare/master...release/$NEW_VERSION?expand=1" + + From 8821b0b819154a53c0dba845c60cfa6a3de4156f Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Tue, 14 Mar 2023 20:56:16 +0100 Subject: [PATCH 557/573] Release 6.6.0 (#2715) * Release 6.6.0 * Update CHANGES.md --- CHANGES.md | 10 ++++++++++ bower.json | 2 +- package.json | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2b017a772..684d9aa6f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,16 @@ wavesurfer.js changelog ======================= +6.6.0 (14.03.2023) +------------------ +- Zoom optimisation for Waves and matching implementation for Spectrograms (#2646) +- Fix: release workflow permissions (#2709) + +6.5.2 (12.03.2023) +------------------ +- Regions plugin: + - Fix undefined content element on remove (#2713) + 6.5.0 (11.03.2023) ------------------ - Regions plugin: diff --git a/bower.json b/bower.json index a35c9ebf1..c8755ecc0 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.5.0", + "version": "6.6.0", "homepage": "https://wavesurfer-js.org", "authors": [ "katspaugh " diff --git a/package.json b/package.json index 69f570132..a0617a221 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.5.0", + "version": "6.6.0", "description": "Interactive navigable audio visualization using Web Audio and Canvas", "main": "dist/wavesurfer.js", "directories": { From 55a01c48e1b23d6b21ec4d942ee6f89ccb3c9033 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Thu, 16 Mar 2023 09:25:30 +0100 Subject: [PATCH 558/573] Docs: add a video tutorial link to the readme (#2724) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e627349dd..865221654 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ Interactive navigable audio visualization using Web Audio and Canvas. [![Screenshot](https://raw.githubusercontent.com/wavesurfer-js/wavesurfer.js/gh-pages/example/screenshot.png "Screenshot")](https://wavesurfer-js.org) -See a [tutorial](https://wavesurfer-js.org/docs) and [examples](https://wavesurfer-js.org/examples) on [wavesurfer-js.org](https://wavesurfer-js.org). +See [docs](https://wavesurfer-js.org/docs) and [examples](https://wavesurfer-js.org/examples) on [wavesurfer-js.org](https://wavesurfer-js.org). + +For a video tutorial, watch this [series by Live Blogger on YouTube](https://www.youtube.com/watch?v=yCmnDWCF8m0). 📺 ## Questions Have a question about integrating wavesurfer.js on your website? Feel free to ask in our forum: https://github.com/wavesurfer-js/wavesurfer.js/discussions/categories/q-a From 250a0f08a1528757958659e33219412981de8aa9 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sat, 18 Mar 2023 09:50:58 +0100 Subject: [PATCH 559/573] Fix: NPM publish in the CI job (#2727) * Fix: NPM publish in the CI job * Test on this branch * Dependencies * Revert "Test on this branch" This reverts commit 5d9f92fe9208fd711631b076c8ee98ac2d59d673. * if success() --- .github/workflows/publish.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1a739a24b..4436e59ee 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -50,7 +50,12 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} + - name: Install dependencies + if: success() + run: npm install + - name: Publish to NPM + if: success() env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} run: npm publish From dce42879468c3908a23998add201bfd1ac4cd343 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sat, 18 Mar 2023 17:13:38 +0100 Subject: [PATCH 560/573] Fix: avoid exit 1 in CI script (#2734) * Fix: avoid exit 1 in CI script * Temp: test on this branch * Release 6.6.1 * Test release * Rm temp test --- .github/workflows/publish.yml | 17 +++++++++++------ CHANGES.md | 6 ++++++ bower.json | 2 +- package.json | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4436e59ee..6553e0e3e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -24,21 +24,20 @@ jobs: NEW_VERSION=$(node -p 'require("./package.json").version') if [ $NEW_VERSION != $OLD_VERSION ]; then echo "New version $NEW_VERSION detected" - echo "::set-output name=version::$NEW_VERSION" + echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT git log "$OLD_VERSION"..HEAD --pretty=format:"* %s" > TEMP_CHANGELOG.md else echo "Version $OLD_VERSION hasn't changed, skipping the release" - exit 1 fi - name: Create a git tag - if: success() + if: ${{ steps.version.outputs.version }} run: git tag $NEW_VERSION && git push --tags env: NEW_VERSION: ${{ steps.version.outputs.version }} - name: GitHub release - if: success() + if: ${{ steps.version.outputs.version }} uses: actions/create-release@v1 id: create_release with: @@ -50,12 +49,18 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} + - uses: actions/setup-node@v3 + if: ${{ steps.version.outputs.version }} + with: + node-version: '16.x' + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies - if: success() + if: ${{ steps.version.outputs.version }} run: npm install - name: Publish to NPM - if: success() + if: ${{ steps.version.outputs.version }} env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} run: npm publish diff --git a/CHANGES.md b/CHANGES.md index 684d9aa6f..d10d1c5d0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,12 @@ wavesurfer.js changelog ======================= +6.6.1 (18.03.2023) +------------------ +- Fix: NPM publish in the CI job (#2727) + - Fix: avoid exit 1 in CI script (#2734) +- Docs: add a video tutorial link to the readme (#2724) + 6.6.0 (14.03.2023) ------------------ - Zoom optimisation for Waves and matching implementation for Spectrograms (#2646) diff --git a/bower.json b/bower.json index c8755ecc0..de825eebf 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.0", + "version": "6.6.1", "homepage": "https://wavesurfer-js.org", "authors": [ "katspaugh " diff --git a/package.json b/package.json index a0617a221..033e81644 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.0", + "version": "6.6.1", "description": "Interactive navigable audio visualization using Web Audio and Canvas", "main": "dist/wavesurfer.js", "directories": { From 6f3c193eaaccd3ade9e6cec4712261a621a2c3b6 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Thu, 23 Mar 2023 07:46:02 +0100 Subject: [PATCH 561/573] Refactor: remove scriptNode (#2706) --- src/webaudio.js | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/webaudio.js b/src/webaudio.js index 7d2f93336..aec016375 100755 --- a/src/webaudio.js +++ b/src/webaudio.js @@ -8,16 +8,12 @@ const FINISHED = 'finished'; /** * WebAudio backend * - * @extends {Observer} + * @extends {util.Observer} */ export default class WebAudio extends util.Observer { - /** scriptBufferSize: size of the processing buffer */ - static scriptBufferSize = 256; /** audioContext: allows to process audio with WebAudio API */ audioContext = null; /** @private */ - offlineAudioContext = null; - /** @private */ stateBehaviors = { [PLAYING]: { init() { @@ -33,7 +29,6 @@ export default class WebAudio extends util.Observer { }, [PAUSED]: { init() { - this.removeOnAudioProcess(); }, getPlayedPercents() { const duration = this.getDuration(); @@ -45,7 +40,6 @@ export default class WebAudio extends util.Observer { }, [FINISHED]: { init() { - this.removeOnAudioProcess(); this.fireEvent('finish'); }, getPlayedPercents() { @@ -233,40 +227,29 @@ export default class WebAudio extends util.Observer { createScriptNode() { if (this.params.audioScriptProcessor) { this.scriptNode = this.params.audioScriptProcessor; - } else { - if (this.ac.createScriptProcessor) { - this.scriptNode = this.ac.createScriptProcessor( - WebAudio.scriptBufferSize - ); - } else { - this.scriptNode = this.ac.createJavaScriptNode( - WebAudio.scriptBufferSize - ); - } + this.scriptNode.connect(this.ac.destination); } - this.scriptNode.connect(this.ac.destination); } /** @private */ addOnAudioProcess() { - this.scriptNode.onaudioprocess = () => { + const loop = () => { const time = this.getCurrentTime(); - if (time >= this.getDuration()) { + if (time >= this.getDuration() && this.state !== this.states[FINISHED]) { this.setState(FINISHED); this.fireEvent('pause'); - } else if (time >= this.scheduledPause) { + } else if (time >= this.scheduledPause && this.state !== this.states[PAUSED]) { this.pause(); } else if (this.state === this.states[PLAYING]) { this.fireEvent('audioprocess', time); + util.frame(loop)(); } }; - } - /** @private */ - removeOnAudioProcess() { - this.scriptNode.onaudioprocess = null; + loop(); } + /** Create analyser node to perform audio analysis */ createAnalyserNode() { this.analyser = this.ac.createAnalyser(); @@ -526,7 +509,7 @@ export default class WebAudio extends util.Observer { this.disconnectFilters(); this.disconnectSource(); this.gainNode.disconnect(); - this.scriptNode.disconnect(); + this.scriptNode && this.scriptNode.disconnect(); this.analyser.disconnect(); // close the audioContext if closeAudioContext option is set to true From eb1a9dd18401a9943cf4f952e5648f74993c1421 Mon Sep 17 00:00:00 2001 From: Fabian Obermaier Date: Sun, 26 Mar 2023 09:34:24 +0200 Subject: [PATCH 562/573] feat(MarkersPlugin): add getMarkers function (#2743) --- src/plugin/markers/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugin/markers/index.js b/src/plugin/markers/index.js index 281dd694a..4770fed06 100644 --- a/src/plugin/markers/index.js +++ b/src/plugin/markers/index.js @@ -70,6 +70,9 @@ export default class MarkersPlugin { } return this.markers.add(options); }, + getMarkers() { + return this.markers; + }, clearMarkers() { this.markers && this.markers.clear(); } From e27d5b89a51ba26ded5573eaef1b8fb92d6a6867 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Mon, 27 Mar 2023 07:58:21 +0200 Subject: [PATCH 563/573] Revert "Zoom optimisation for Waves and matching implementation for Spectrograms (#2646)" (#2744) This reverts commit 7c1458a5b92821965a5d7e2f7ab8643ab8d3043b. --- example/spectrogram/app.js | 32 ++----- example/spectrogram/index.html | 18 ++-- example/zoom/index.html | 10 +-- example/zoom/main.js | 3 - src/drawer.canvasentry.js | 43 --------- src/drawer.js | 4 + src/drawer.multicanvas.js | 72 +-------------- src/plugin/spectrogram/index.js | 151 +++++++------------------------- src/wavesurfer.js | 33 ------- 9 files changed, 54 insertions(+), 312 deletions(-) diff --git a/example/spectrogram/app.js b/example/spectrogram/app.js index 68037e8bc..0b6a58ed0 100644 --- a/example/spectrogram/app.js +++ b/example/spectrogram/app.js @@ -22,6 +22,15 @@ function initAndLoadSpectrogram(colorMap) { ] }; + if (location.search.match('scroll')) { + options.minPxPerSec = 100; + options.scrollParent = true; + } + + if (location.search.match('normalize')) { + options.normalize = true; + } + wavesurfer = WaveSurfer.create(options); /* Progress bar */ @@ -45,29 +54,6 @@ function initAndLoadSpectrogram(colorMap) { })(); wavesurfer.load('../media/demo.wav'); - - // Zoom slider - let slider = document.querySelector('[data-action="zoom"]'); - - slider.value = wavesurfer.params.minPxPerSec; - slider.min = wavesurfer.params.minPxPerSec; - slider.max = 250; - - - slider.addEventListener('input', function() { - wavesurfer.zooming(slider.value); - }); - slider.addEventListener('mouseup', function() { - wavesurfer.zoom(slider.value); - - let desiredWidth = Math.max(parseInt(wavesurfer.container.offsetWidth * window.devicePixelRatio), - parseInt(wavesurfer.getDuration() * slider.value * window.devicePixelRatio)); - wavesurfer.spectrogram.width = desiredWidth; - wavesurfer.spectrogram.render(); - }); - - // set initial zoom to match slider value - wavesurfer.zoom(slider.value); } document.addEventListener('DOMContentLoaded', function() { diff --git a/example/spectrogram/index.html b/example/spectrogram/index.html index ec99b89c9..8a18bbf9c 100644 --- a/example/spectrogram/index.html +++ b/example/spectrogram/index.html @@ -31,6 +31,13 @@ diff --git a/example/zoom/index.html b/example/zoom/index.html index f4ab9fc38..f4f18ad03 100644 --- a/example/zoom/index.html +++ b/example/zoom/index.html @@ -82,13 +82,9 @@

How to Zoom

backend: 'MediaElement' }); -let slider = document.querySelector('[data-action="zoom"]'); -slider.addEventListener('input', function() { - wavesurfer.zooming(slider.value); -}); -slider.addEventListener('mouseup', function() { - wavesurfer.zoom(slider.value); -}); +document.querySelector('#slider').oninput = function () { + wavesurfer.zoom(Number(this.value)); +};
+ + + +

wavesurfer.js + Spectrogram

@@ -52,17 +59,6 @@

wavesurfer.js Pause -
- -
- -
- -
- -
- -

diff --git a/example/zoom/main.js b/example/zoom/main.js index f63a8681c..c3163beed 100644 --- a/example/zoom/main.js +++ b/example/zoom/main.js @@ -49,9 +49,6 @@ document.addEventListener('DOMContentLoaded', function() { slider.max = 1000; slider.addEventListener('input', function() { - wavesurfer.zooming(Number(this.value)); - }); - slider.addEventListener('mouseup', function() { wavesurfer.zoom(Number(this.value)); }); diff --git a/src/drawer.canvasentry.js b/src/drawer.canvasentry.js index 3866345b2..7f1da3884 100644 --- a/src/drawer.canvasentry.js +++ b/src/drawer.canvasentry.js @@ -66,11 +66,6 @@ export default class CanvasEntry { * @type {object} */ this.canvasContextAttributes = {}; - /** - * The Timeout id used to track this canvas entry. - */ - this.drawTimeout = null; - } /** @@ -130,27 +125,21 @@ export default class CanvasEntry { */ clearWave() { // wave - this.waveCtx.save(); - this.waveCtx.setTransform(1, 0, 0, 1, 0, 0); this.waveCtx.clearRect( 0, 0, this.waveCtx.canvas.width, this.waveCtx.canvas.height ); - this.waveCtx.restore(); // progress if (this.hasProgressCanvas) { - this.progressCtx.save(); - this.progressCtx.setTransform(1, 0, 0, 1, 0, 0); this.progressCtx.clearRect( 0, 0, this.progressCtx.canvas.width, this.progressCtx.canvas.height ); - this.progressCtx.restore(); } } @@ -435,36 +424,4 @@ export default class CanvasEntry { return this.wave.toDataURL(format, quality); } } - - /** - * Stretches existing canvas - * @param {Number} newTotalWidth total width of wave in pixels - */ - stretchCanvas(newTotalWidth) { - //Calculate the start and width of this canvas - let start = Math.round(this.start * newTotalWidth); - let width = Math.round(this.end * newTotalWidth - start); - - //Stretch canvas - let elementSize = { width: width + 'px' }; - let elementStart = {left: start + 'px'}; - style(this.wave, elementSize); - style(this.wave, elementStart); - if (this.hasProgressCanvas) { - style(this.progress, elementSize); - style(this.progress, elementStart); - } - } - - /** - * Set the left offset of the canvas - * @param {Number} position in px for the canvas to start - */ - setLeft(position) { - let elementStart = {left: position + 'px'}; - style(this.wave, elementStart); - if (this.hasProgressCanvas) { - style(this.progress, elementStart); - } - } } diff --git a/src/drawer.js b/src/drawer.js index 491c976d5..8e3962b11 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -272,6 +272,10 @@ export default class Drawer extends util.Observer { * @return {boolean} Whether the width of the container was updated or not */ setWidth(width) { + if (this.width == width) { + return false; + } + this.width = width; if (this.params.fillParent || this.params.scrollParent) { diff --git a/src/drawer.multicanvas.js b/src/drawer.multicanvas.js index ef4cbd014..74899338a 100644 --- a/src/drawer.multicanvas.js +++ b/src/drawer.multicanvas.js @@ -89,14 +89,6 @@ export default class MultiCanvas extends Drawer { * @type {boolean} */ this.vertical = params.vertical; - - /** - * Whether to use the optimsized zoom rendering - * Automatically toggles to true if stretchCanvases() function is called - * - * @type {boolean} - */ - this.optimiseZoom = false; } /** @@ -165,16 +157,10 @@ export default class MultiCanvas extends Drawer { let canvasWidth = this.maxCanvasWidth + this.overlap; const lastCanvas = this.canvases.length - 1; - let leftOffset = 0; this.canvases.forEach((entry, i) => { if (i == lastCanvas) { canvasWidth = this.width - this.maxCanvasWidth * lastCanvas; } - - //Set left offset and add to next entry - entry.setLeft(leftOffset); - leftOffset += canvasWidth / this.params.pixelRatio; - this.updateDimensions(entry, canvasWidth, this.height); entry.clearWave(); @@ -424,39 +410,7 @@ export default class MultiCanvas extends Drawer { this.canvases.forEach((entry, i) => { this.setFillStyles(entry, waveColor, progressColor); this.applyCanvasTransforms(entry, this.params.vertical); - - if (this.optimiseZoom) { - //Optimising zoom functionality - //If there's a wrapper, optimise for the view - let priority = 0; - if (this.wrapper) { - let canvasRect = entry.wave.getBoundingClientRect(); - let wrapperRect = this.wrapper.getBoundingClientRect(); - - //Determine whether canvas is in viewframe or not and assign priority - if (Math.floor(canvasRect['left']) > Math.ceil(wrapperRect['right'])) { - //Canvas is to the right of view window - let distance = canvasRect['left'] - wrapperRect['right']; - priority = Math.ceil(distance / wrapperRect['width']); - } else if (Math.ceil(canvasRect['right']) < Math.floor(wrapperRect['left'])) { - //Canvas is to the left of the view window - let distance = wrapperRect['left'] - canvasRect['right']; - priority = Math.ceil(distance / wrapperRect['width']); - } - } else { - //Everything is equal priority - } - - //This staggers the drawing of canvases so they don't all draw at once - entry.clearWave(); - clearTimeout(entry.drawTimeout); - entry.drawTimeout = setTimeout(function(){ - entry.drawLines(peaks, absmax, halfH, offsetY, start, end); - entry.drawTimeout = null; - }, 25 * priority); - } else { - entry.drawLines(peaks, absmax, halfH, offsetY, start, end); - } + entry.drawLines(peaks, absmax, halfH, offsetY, start, end); }); } @@ -652,30 +606,6 @@ export default class MultiCanvas extends Drawer { } } - /** - * Stretches the canvases to mimic zoom without recalculation - * - * @param {Number} desiredWidth new width of the wave display - * @param {Number} progress Value between 0 and 1 for wave progress - */ - stretchCanvases(desiredWidth, progress) { - if (!this.optimiseZoom) { - //Enable optimsed zooming - this.optimiseZoom = true; - } - let totalCanvasWidth = Math.round(desiredWidth / this.params.pixelRatio); - this.width = desiredWidth; - - for (let i = 0; i < this.canvases.length; i++) { - this.canvases[i].stretchCanvas(totalCanvasWidth); - } - - //Update progress - let progressPos = progress * totalCanvasWidth; - this.updateProgress(progressPos); - this.recenterOnPosition(progressPos, true); - } - /** * Render the new progress * diff --git a/src/plugin/spectrogram/index.js b/src/plugin/spectrogram/index.js index 686735d93..75f8bfb1c 100644 --- a/src/plugin/spectrogram/index.js +++ b/src/plugin/spectrogram/index.js @@ -92,9 +92,6 @@ export default class SpectrogramPlugin { this._onRender = () => { this.render(); }; - this._onZoom = () => { - this.stretchCanvases(); - }; this._onWrapperClick = e => { this._wrapperClickHandler(e); }; @@ -139,9 +136,6 @@ export default class SpectrogramPlugin { this.alpha = params.alpha; this.splitChannels = params.splitChannels; this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1; - this.canvases = []; - this.canvasesTimeouts = []; - this.scrollLeftTracker = 0; //Tracks the desired scrollLeft value // Getting file's original samplerate is difficult(#1248). // So set 12kHz default to render like wavesurfer.js 5.x. @@ -149,11 +143,10 @@ export default class SpectrogramPlugin { this.frequencyMax = params.frequencyMax || 12000; this.createWrapper(); - this.addCanvas(); + this.createCanvas(); this.render(); drawer.wrapper.addEventListener('scroll', this._onScroll); - ws.on('zoom', this._onZoom); ws.on('redraw', this._onRender); }; } @@ -238,49 +231,17 @@ export default class SpectrogramPlugin { this.fireEvent('click', relX / this.width || 0); } - /** - * Add a canvas to this.canvases - */ - addCanvas() { - const canvas = (this.wrapper.appendChild( + createCanvas() { + const canvas = (this.canvas = this.wrapper.appendChild( document.createElement('canvas') )); + this.spectrCc = canvas.getContext('2d'); + this.util.style(canvas, { position: 'absolute', zIndex: 4 }); - - this.canvases.push(canvas); - this.canvasesTimeouts.push(null); - } - - /** - * Remove a canvas from this.canvases - */ - removeCanvas() { - //Stop drawing (if drawing) - clearTimeout(this.canvasesTimeouts[this.canvasesTimeouts.length - 1]); - - let lastEntry = this.canvases[this.canvases.length - 1]; - lastEntry.parentElement.removeChild(lastEntry); - - this.canvases.pop(); - this.canvasesTimeouts.pop(); - } - - /** - * Ensure the correct number of canvases for the size of the spectrogram - */ - updateCanvases() { - let canvasesRequired = Math.ceil(this.width / 4000); - - while (this.canvases.length < canvasesRequired) { - this.addCanvas(); - } - while (this.canvases.length > canvasesRequired) { - this.removeCanvas(); - } } render() { @@ -294,14 +255,11 @@ export default class SpectrogramPlugin { } updateCanvasStyle() { - this.updateCanvases(); - //width per canvas - for (let i = 0; i < this.canvases.length; i++) { - this.canvases[i].width = Math.round(this.width / this.canvases.length); - this.canvases[i].height = this.fftSamples / 2 * this.channels; - this.canvases[i].style.width = Math.round(this.canvases[i].width / this.pixelRatio) + 'px'; - this.canvases[i].style.height = this.height + 'px'; - } + const width = Math.round(this.width / this.pixelRatio) + 'px'; + this.canvas.width = this.width; + this.canvas.height = this.fftSamples / 2 * this.channels; + this.canvas.style.width = width; + this.canvas.style.height = this.height + 'px'; } drawSpectrogram(frequenciesData, my) { @@ -310,61 +268,25 @@ export default class SpectrogramPlugin { frequenciesData = [frequenciesData]; } - my.updateCanvasStyle(); - - //Stop canvases still being drawn - for (let i = 0; i < my.canvasesTimeouts.length; i++) { - clearTimeout(my.canvasesTimeouts[i]); - } - - const view = [my.scrollLeftTracker, my.scrollLeftTracker + my.wrapper.clientWidth]; - - for (let canvasNum = 0; canvasNum < my.canvases.length; canvasNum++) { - const canvasLeft = canvasNum * Math.floor(my.width / my.canvases.length / my.pixelRatio); - const canvasRight = (canvasNum + 1) * Math.floor(my.width / my.canvases.length / my.pixelRatio); - const canvasBound = [canvasLeft, canvasRight]; - my.canvases[canvasNum].style['left'] = canvasLeft + 'px'; - - //Optimise drawing for the view - let priority = 0; - if (canvasBound[0] > view[1]) { - //Canvas is to the right of view window - let distance = canvasBound[0] - view[1]; - priority = Math.ceil(distance / (view[1] - view[0])); - } else if (canvasBound[1] < view[0]) { - //Canvas is to the left of the view window - let distance = view[0] - canvasBound[1]; - priority = Math.ceil(distance / (view[1] - view[0])); - } - - //delay = 25ms * number of viewport widths away the canvas is - my.canvasesTimeouts[canvasNum] = setTimeout(my.drawToCanvas, 25 * priority, frequenciesData, my, canvasNum); - } - } - - /** - * Draw spectrogram channel to a specific canvas - * @param {[Number, Number, Number]} frequenciesData spectrogram data in [channel, sample, freq] format - * @param {SpectrogramPlugin} my variable with 'this' in it - * @param {Number} canvasNum Canvas to draw to - */ - drawToCanvas(frequenciesData, my, canvasNum) { + const spectrCc = my.spectrCc; const height = my.fftSamples / 2; + const width = my.width; const freqFrom = my.buffer.sampleRate / 2; const freqMin = my.frequencyMin; const freqMax = my.frequencyMax; - for (let channel = 0; channel < frequenciesData.length; channel++) { + if (!spectrCc) { + return; + } - //Get pixels from frequency data and apply to image - const relevantFreqs = frequenciesData[channel].slice(canvasNum * Math.round(frequenciesData[channel].length / my.canvases.length), (canvasNum + 1) * Math.round(frequenciesData[channel].length / my.canvases.length)); - const pixels = my.resample(relevantFreqs); - const imageData = new ImageData(pixels.length, height); + for (let c = 0; c < frequenciesData.length; c++) { // for each channel + const pixels = my.resample(frequenciesData[c]); + const imageData = new ImageData(width, height); for (let i = 0; i < pixels.length; i++) { for (let j = 0; j < pixels[i].length; j++) { const colorMap = my.colorMap[pixels[i][j]]; - const redIndex = ((height - j) * imageData.width + i) * 4; + const redIndex = ((height - j) * width + i) * 4; imageData.data[redIndex] = colorMap[0] * 255; imageData.data[redIndex + 1] = colorMap[1] * 255; imageData.data[redIndex + 2] = colorMap[2] * 255; @@ -372,20 +294,16 @@ export default class SpectrogramPlugin { } } - //Draw image to canvas - createImageBitmap(imageData).then(renderer => { - if (my.canvases[canvasNum]) { //Check canvas still exists after creating image - my.canvases[canvasNum].getContext('2d').drawImage(renderer, - 0, height * (1 - freqMax / freqFrom), // source x, y - imageData.width, height * (freqMax - freqMin) / freqFrom, // source width, height - 0, height * channel, // destination x, y - my.canvases[canvasNum].width, height // destination width, height - ); - } - }); + // scale and stack spectrograms + createImageBitmap(imageData).then(renderer => + spectrCc.drawImage(renderer, + 0, height * (1 - freqMax / freqFrom), // source x, y + width, height * (freqMax - freqMin) / freqFrom, // source width, height + 0, height * c, // destination x, y + width, height // destination width, height + ) + ); } - //Drawing is finished - my.canvasesTimeouts[canvasNum] = null; } getFrequencies(callback) { @@ -404,7 +322,7 @@ export default class SpectrogramPlugin { let noverlap = this.noverlap; if (!noverlap) { - const uniqueSamplesPerPx = buffer.length / this.width; + const uniqueSamplesPerPx = buffer.length / this.canvas.width; noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx)); } @@ -543,13 +461,12 @@ export default class SpectrogramPlugin { updateScroll(e) { if (this.wrapper) { - this.scrollLeftTracker = e.target.scrollLeft; this.wrapper.scrollLeft = e.target.scrollLeft; } } resample(oldMatrix) { - const columnsNumber = oldMatrix.length; + const columnsNumber = this.width; const newMatrix = []; const oldPiece = 1 / oldMatrix.length; @@ -602,12 +519,4 @@ export default class SpectrogramPlugin { return newMatrix; } - - stretchCanvases() { - for (let i = 0; i < this.canvases.length; i++) { - this.canvases[i].style.width = Math.round(this.drawer.width / this.canvases.length / this.pixelRatio) + 'px'; - const canvasLeft = i * Math.floor(this.drawer.width / this.canvases.length / this.pixelRatio); - this.canvases[i].style['left'] = canvasLeft + 'px'; - } - } } diff --git a/src/wavesurfer.js b/src/wavesurfer.js index a6c238ff0..94c69e932 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -1275,21 +1275,6 @@ export default class WaveSurfer extends util.Observer { this.drawBuffer(); } - /** - * Calls getPeaks() and drawPeaks() - * @param {WaveSurfer} wavesurfer the Wavesurfer to get/draw peaks from/to - * @param {number} width The width of the area that should be drawn - * @param {number} start The x-offset of the beginning of the area that - * should be rendered - * @param {number} end The x-offset of the end of the area that should be - * rendered - */ - getAndDrawPeaks(wavesurfer, width, start, end) { - let peaks; - peaks = wavesurfer.backend.getPeaks(width, start, end); - wavesurfer.drawer.drawPeaks(peaks, width, start, end); - } - /** * Get the correct peaks for current wave view-port and render wave * @@ -1371,24 +1356,6 @@ export default class WaveSurfer extends util.Observer { this.fireEvent('zoom', pxPerSec); } - /** - * Call this function while moving the zoom slider to stretch the canvases - * of the wave without recalculating - * - * @param {Number} pxPerSec value returned from the zoom slider - */ - zooming(pxPerSec) { - //Calculate the new width, this cannot be smaller than the parent container width - let desiredWidth = Math.round(this.getDuration() * pxPerSec * this.params.pixelRatio); - let parentWidth = this.drawer.getWidth(); - desiredWidth = Math.max(parentWidth, desiredWidth); - - //Stretch canvases - this.drawer.stretchCanvases(desiredWidth, this.backend.getPlayedPercents()); - - this.fireEvent('zoom', pxPerSec); - } - /** * Decode buffer and load * From 9e15161300dae37515339a9ce40a9c2e5706bb71 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Mon, 27 Mar 2023 07:58:43 +0200 Subject: [PATCH 564/573] Release 6.6.2 (#2745) --- CHANGES.md | 5 +++++ bower.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d10d1c5d0..caca35214 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,11 @@ wavesurfer.js changelog ======================= +6.6.2 (24.03.2023) +------------------ +- Revert "Zoom optimisation for Waves and matching implementation for Spectrograms (#2646)" +- Fix: avoid exit 1 in CI script (#2734) + 6.6.1 (18.03.2023) ------------------ - Fix: NPM publish in the CI job (#2727) diff --git a/bower.json b/bower.json index de825eebf..103fc2324 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.1", + "version": "6.6.2", "homepage": "https://wavesurfer-js.org", "authors": [ "katspaugh " diff --git a/package.json b/package.json index 033e81644..ba8015f3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.1", + "version": "6.6.2", "description": "Interactive navigable audio visualization using Web Audio and Canvas", "main": "dist/wavesurfer.js", "directories": { From f9d56415c0debdf6b4c9882d132235b14dff1fab Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Mon, 27 Mar 2023 08:29:45 +0200 Subject: [PATCH 565/573] Docs: version the unpkg script in readme (#2746) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 865221654..0a252839f 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ import WaveSurfer from 'wavesurfer.js' If you're not using a package manager, simply insert the script from a CDN: ``` - + ``` Create a container in your HTML: From a4dbddba1facf5b97e1c4deacff8426eedf9d774 Mon Sep 17 00:00:00 2001 From: prakharpbuf <54688220+prakharpbuf@users.noreply.github.com> Date: Mon, 3 Apr 2023 17:13:37 -0400 Subject: [PATCH 566/573] Remove marker by id (#2749) * remove marker by id * better implementation * remove extra whitespace --- src/plugin/markers/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugin/markers/index.js b/src/plugin/markers/index.js index 4770fed06..608ffb01f 100644 --- a/src/plugin/markers/index.js +++ b/src/plugin/markers/index.js @@ -184,9 +184,13 @@ export default class MarkersPlugin { /** * Remove a marker * - * @param {number} index Index of the marker to remove + * @param {number|Object} indexOrMarker Index of the marker to remove or the marker object itself */ - remove(index) { + remove(indexOrMarker) { + let index = indexOrMarker; + if (isNaN(index)) { + index = this.markers.findIndex(marker => marker === indexOrMarker); + } let marker = this.markers[index]; if (!marker) { return; From df4d48fd556186fffdbc69d97aede650fc6f06dc Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:50:23 +0200 Subject: [PATCH 567/573] Release 6.6.3 (#2753) --- CHANGES.md | 8 ++++++++ bower.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index caca35214..cc40315b2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,14 @@ wavesurfer.js changelog ======================= +6.6.3 (04.04.2023) +------------------ +- Markers plugin: + - allow removing markers by passing a marker object (#2749) + - add getMarkers function (#2743) +- Docs: version the unpkg script in readme (#2746) +- Refactor: remove scriptNode (#2706) + 6.6.2 (24.03.2023) ------------------ - Revert "Zoom optimisation for Waves and matching implementation for Spectrograms (#2646)" diff --git a/bower.json b/bower.json index 103fc2324..166bc9d09 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.2", + "version": "6.6.3", "homepage": "https://wavesurfer-js.org", "authors": [ "katspaugh " diff --git a/package.json b/package.json index ba8015f3b..0d1758b13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavesurfer.js", - "version": "6.6.2", + "version": "6.6.3", "description": "Interactive navigable audio visualization using Web Audio and Canvas", "main": "dist/wavesurfer.js", "directories": { From d6f63bd64df81582d700a4bdb4d72bc6a4f61dd1 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Thu, 13 Apr 2023 22:49:49 +0300 Subject: [PATCH 568/573] Docs: add a note about wavesurfer.ts (#2760) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 0a252839f..3a544717e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # [wavesurfer.js](https://wavesurfer-js.org) +--- + +✨ We're excited to introduce version 7.0.0-alpha codenamed **wavesurfer.ts**, a TypeScript rewrite of wavesurfer.js with better performance and new plugins. Give the alpha version a spin and let us know what you think! Check out the [wavesurfer.ts README](https://github.com/katspaugh/wavesurfer.ts) to get started. Happy coding! ✨ + +--- + [![npm version](https://img.shields.io/npm/v/wavesurfer.js.svg?style=flat)](https://www.npmjs.com/package/wavesurfer.js) ![npm](https://img.shields.io/npm/dm/wavesurfer.js.svg) [![Join the chat at https://gitter.im/wavesurfer-js/wavesurfer.js](https://badges.gitter.im/wavesurfer-js/wavesurfer.js.svg)](https://gitter.im/wavesurfer-js/wavesurfer.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitPOAP Badge](https://public-api.gitpoap.io/v1/repo/wavesurfer-js/wavesurfer.js/badge)](https://www.gitpoap.io/gh/wavesurfer-js/wavesurfer.js) From 220661e91d8e105cb9ac595c039620f85f631233 Mon Sep 17 00:00:00 2001 From: prakharpbuf <54688220+prakharpbuf@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:44:42 -0400 Subject: [PATCH 569/573] fix: relay dblclick event (#2761) --- src/wavesurfer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/wavesurfer.js b/src/wavesurfer.js index 94c69e932..d702f935d 100755 --- a/src/wavesurfer.js +++ b/src/wavesurfer.js @@ -718,6 +718,12 @@ export default class WaveSurfer extends util.Observer { } this.fireEvent('scroll', e); }); + + // Relay the dblclick event from the drawer + this.drawer.on('dblclick', (e, progress) => { + this.fireEvent('dblclick', e, progress); + }); + } /** From 4d36715a1094efed6ce82aef44924815164d005c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 07:06:36 +0300 Subject: [PATCH 570/573] Bump yaml from 2.2.1 to 2.2.2 (#2766) Bumps [yaml](https://github.com/eemeli/yaml) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/eemeli/yaml/releases) - [Commits](https://github.com/eemeli/yaml/compare/v2.2.1...v2.2.2) --- updated-dependencies: - dependency-name: yaml dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 628649e7b..98fa220d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5794,9 +5794,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" - integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" + integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== yargs-parser@^20.2.2: version "20.2.9" From 2ae31ce9ade32c07392c593186a82e3669686864 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 May 2023 06:55:08 +0200 Subject: [PATCH 571/573] Bump engine.io from 6.4.1 to 6.4.2 (#2771) Bumps [engine.io](https://github.com/socketio/engine.io) from 6.4.1 to 6.4.2. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.4.1...6.4.2) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 98fa220d7..a9d945663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2488,9 +2488,9 @@ engine.io-parser@~5.0.3: integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== engine.io@~6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.1.tgz#8056b4526a88e779f9c280d820422d4e3eeaaae5" - integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== + version "6.4.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.2.tgz#ffeaf68f69b1364b0286badddf15ff633476473f" + integrity sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" From 26ceb09832ed20b232f4ff06920e8696f0baf564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:43:20 +0200 Subject: [PATCH 572/573] Bump socket.io-parser from 4.2.2 to 4.2.3 (#2786) Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3. - [Release notes](https://github.com/socketio/socket.io-parser/releases) - [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3) --- updated-dependencies: - dependency-name: socket.io-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a9d945663..9d867fc7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5047,9 +5047,9 @@ socket.io-adapter@~2.5.2: ws "~8.11.0" socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== + version "4.2.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.3.tgz#926bcc6658e2ae0883dc9dee69acbdc76e4e3667" + integrity sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" From 8e8c93077359cacef40a2e569ddb13d3a764c879 Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Sun, 28 May 2023 09:16:13 +0200 Subject: [PATCH 573/573] Update README.md about 7.0.0-beta (#2788) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a544717e..62a332d20 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ --- -✨ We're excited to introduce version 7.0.0-alpha codenamed **wavesurfer.ts**, a TypeScript rewrite of wavesurfer.js with better performance and new plugins. Give the alpha version a spin and let us know what you think! Check out the [wavesurfer.ts README](https://github.com/katspaugh/wavesurfer.ts) to get started. Happy coding! ✨ +✨ We're excited to introduce version 7.0.0-beta, a TypeScript rewrite of wavesurfer.js with better performance and new plugins. Give the beta version a spin and let us know what you think! Check out the [wavesurfer.ts README](https://github.com/katspaugh/wavesurfer.ts) to get started. Happy coding! ✨ ---